]> rtime.felk.cvut.cz Git - can-usb1.git/commitdiff
Initializing repo
authorJan Kriz <krizj1@fel.cvut.cz>
Sat, 5 Jul 2008 08:52:28 +0000 (10:52 +0200)
committerJan Kriz <krizj1@fel.cvut.cz>
Sat, 5 Jul 2008 08:52:28 +0000 (10:52 +0200)
1192 files changed:
lincan-0.3.3/CREDITS [new file with mode: 0644]
lincan-0.3.3/Changes.LinCAN [new file with mode: 0644]
lincan-0.3.3/Makefile [new file with mode: 0644]
lincan-0.3.3/Makefile.omk [new file with mode: 0644]
lincan-0.3.3/Makefile.rules [new file with mode: 0644]
lincan-0.3.3/Makefile.std [new file with mode: 0644]
lincan-0.3.3/README [new file with mode: 0644]
lincan-0.3.3/README.makerules [new file with mode: 0644]
lincan-0.3.3/TODO [new file with mode: 0644]
lincan-0.3.3/Unsupported-hardware [new file with mode: 0644]
lincan-0.3.3/config.omk-default [new file with mode: 0644]
lincan-0.3.3/doc/Makefile [new file with mode: 0644]
lincan-0.3.3/doc/book.ent [new file with mode: 0644]
lincan-0.3.3/doc/lincanbook.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc-0.3.pdf [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/Makefile [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_arch1.eps [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_arch1.fig [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_arch1.pdf [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canends1.eps [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canends1.fig [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canends1.pdf [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.eps [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.fig [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.pdf [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.eps [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.fig [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.pdf [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/can_arch.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/can_driver.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/can_lincan.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_api.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_arch.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_history.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.empty [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.tmpl [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_intro.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_summary.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/lincan_usage.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/readburst.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan/sendburst.xml [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincan_incl.ent [new file with mode: 0644]
lincan-0.3.3/doc/lincandoc/lincandoc.xml [new file with mode: 0644]
lincan-0.3.3/include/aim104.h [new file with mode: 0644]
lincan-0.3.3/include/c_can.h [new file with mode: 0644]
lincan-0.3.3/include/can.h [new file with mode: 0644]
lincan-0.3.3/include/can_iortl.h [new file with mode: 0644]
lincan-0.3.3/include/can_queue.h [new file with mode: 0644]
lincan-0.3.3/include/can_sysdep.h [new file with mode: 0644]
lincan-0.3.3/include/canmsg.h [new file with mode: 0644]
lincan-0.3.3/include/cc_can104.h [new file with mode: 0644]
lincan-0.3.3/include/close.h [new file with mode: 0644]
lincan-0.3.3/include/constants.h [new file with mode: 0644]
lincan-0.3.3/include/devcommon.h [new file with mode: 0644]
lincan-0.3.3/include/eb8245.h [new file with mode: 0644]
lincan-0.3.3/include/fasync.h [new file with mode: 0644]
lincan-0.3.3/include/finish.h [new file with mode: 0644]
lincan-0.3.3/include/hms30c7202_can.h [new file with mode: 0644]
lincan-0.3.3/include/i82527.h [new file with mode: 0644]
lincan-0.3.3/include/ioctl.h [new file with mode: 0644]
lincan-0.3.3/include/ipci165.h [new file with mode: 0644]
lincan-0.3.3/include/ipci165_fw.h [new file with mode: 0644]
lincan-0.3.3/include/irq.h [new file with mode: 0644]
lincan-0.3.3/include/kthread.h [new file with mode: 0644]
lincan-0.3.3/include/m437.h [new file with mode: 0644]
lincan-0.3.3/include/main.h [new file with mode: 0644]
lincan-0.3.3/include/modparms.h [new file with mode: 0644]
lincan-0.3.3/include/msmcan.h [new file with mode: 0644]
lincan-0.3.3/include/ns_dev_can.h [new file with mode: 0644]
lincan-0.3.3/include/nsi.h [new file with mode: 0644]
lincan-0.3.3/include/nsi_canpci.h [new file with mode: 0644]
lincan-0.3.3/include/open.h [new file with mode: 0644]
lincan-0.3.3/include/oscar.h [new file with mode: 0644]
lincan-0.3.3/include/pc-i03.h [new file with mode: 0644]
lincan-0.3.3/include/pcan_dongle.h [new file with mode: 0644]
lincan-0.3.3/include/pccan.h [new file with mode: 0644]
lincan-0.3.3/include/pcccan.h [new file with mode: 0644]
lincan-0.3.3/include/pcm3680.h [new file with mode: 0644]
lincan-0.3.3/include/pikronisa.h [new file with mode: 0644]
lincan-0.3.3/include/pip.h [new file with mode: 0644]
lincan-0.3.3/include/proc.h [new file with mode: 0644]
lincan-0.3.3/include/read.h [new file with mode: 0644]
lincan-0.3.3/include/select.h [new file with mode: 0644]
lincan-0.3.3/include/setup.h [new file with mode: 0644]
lincan-0.3.3/include/sja1000.h [new file with mode: 0644]
lincan-0.3.3/include/sja1000p.h [new file with mode: 0644]
lincan-0.3.3/include/smartcan.h [new file with mode: 0644]
lincan-0.3.3/include/ssv.h [new file with mode: 0644]
lincan-0.3.3/include/template.h [new file with mode: 0644]
lincan-0.3.3/include/tscan1.h [new file with mode: 0644]
lincan-0.3.3/include/unican_cl2.h [new file with mode: 0644]
lincan-0.3.3/include/unican_types.h [new file with mode: 0644]
lincan-0.3.3/include/write.h [new file with mode: 0644]
lincan-0.3.3/kernelcfg2mk [new file with mode: 0755]
lincan-0.3.3/lincan.xml [new file with mode: 0644]
lincan-0.3.3/scripts/kernel-doc [new file with mode: 0755]
lincan-0.3.3/scripts/tmpl2sgml [new file with mode: 0755]
lincan-0.3.3/src/Makefile [new file with mode: 0644]
lincan-0.3.3/src/Makefile.omk [new file with mode: 0644]
lincan-0.3.3/src/Makefile.std [new file with mode: 0644]
lincan-0.3.3/src/adlink7841.c [new file with mode: 0644]
lincan-0.3.3/src/aim104.c [new file with mode: 0644]
lincan-0.3.3/src/bfadcan.c [new file with mode: 0644]
lincan-0.3.3/src/boardlist.c [new file with mode: 0644]
lincan-0.3.3/src/c_can.c [new file with mode: 0644]
lincan-0.3.3/src/c_can_irq.c [new file with mode: 0644]
lincan-0.3.3/src/can_devrtl.c [new file with mode: 0644]
lincan-0.3.3/src/can_quekern.c [new file with mode: 0644]
lincan-0.3.3/src/can_quertl.c [new file with mode: 0644]
lincan-0.3.3/src/can_queue.c [new file with mode: 0644]
lincan-0.3.3/src/cc_can104.c [new file with mode: 0644]
lincan-0.3.3/src/close.c [new file with mode: 0644]
lincan-0.3.3/src/close_rtl.c [new file with mode: 0644]
lincan-0.3.3/src/devcommon.c [new file with mode: 0644]
lincan-0.3.3/src/eb8245.c [new file with mode: 0644]
lincan-0.3.3/src/ems_cpcpci.c [new file with mode: 0644]
lincan-0.3.3/src/fasync.c [new file with mode: 0644]
lincan-0.3.3/src/finish.c [new file with mode: 0644]
lincan-0.3.3/src/hms30c7202_can.c [new file with mode: 0644]
lincan-0.3.3/src/i82527.c [new file with mode: 0644]
lincan-0.3.3/src/ioctl.c [new file with mode: 0644]
lincan-0.3.3/src/ioctl_query.c [new file with mode: 0644]
lincan-0.3.3/src/ioctl_remote.c [new file with mode: 0644]
lincan-0.3.3/src/ioctl_rtl.c [new file with mode: 0644]
lincan-0.3.3/src/ipci165.c [new file with mode: 0644]
lincan-0.3.3/src/ipci165_fw.c [new file with mode: 0644]
lincan-0.3.3/src/irq.c [new file with mode: 0644]
lincan-0.3.3/src/kthread.c [new file with mode: 0644]
lincan-0.3.3/src/kv_pcican.c [new file with mode: 0644]
lincan-0.3.3/src/m437.c [new file with mode: 0644]
lincan-0.3.3/src/main.c [new file with mode: 0644]
lincan-0.3.3/src/modparms.c [new file with mode: 0644]
lincan-0.3.3/src/msmcan.c [new file with mode: 0644]
lincan-0.3.3/src/ns_dev_can.c [new file with mode: 0644]
lincan-0.3.3/src/nsi.c [new file with mode: 0644]
lincan-0.3.3/src/nsi_canpci.c [new file with mode: 0644]
lincan-0.3.3/src/open.c [new file with mode: 0644]
lincan-0.3.3/src/open_rtl.c [new file with mode: 0644]
lincan-0.3.3/src/oscar.c [new file with mode: 0644]
lincan-0.3.3/src/pc_i03.c [new file with mode: 0644]
lincan-0.3.3/src/pcan_dongle.c [new file with mode: 0644]
lincan-0.3.3/src/pccan.c [new file with mode: 0644]
lincan-0.3.3/src/pcccan.c [new file with mode: 0644]
lincan-0.3.3/src/pcm3680.c [new file with mode: 0644]
lincan-0.3.3/src/pikronisa.c [new file with mode: 0644]
lincan-0.3.3/src/pimx1.c [new file with mode: 0644]
lincan-0.3.3/src/pip.c [new file with mode: 0644]
lincan-0.3.3/src/proc.c [new file with mode: 0644]
lincan-0.3.3/src/read.c [new file with mode: 0644]
lincan-0.3.3/src/read_rtl.c [new file with mode: 0644]
lincan-0.3.3/src/select.c [new file with mode: 0644]
lincan-0.3.3/src/setup.c [new file with mode: 0644]
lincan-0.3.3/src/sja1000.c [new file with mode: 0644]
lincan-0.3.3/src/sja1000p.c [new file with mode: 0644]
lincan-0.3.3/src/smartcan.c [new file with mode: 0644]
lincan-0.3.3/src/ssv.c [new file with mode: 0644]
lincan-0.3.3/src/sysdep_lnx.c [new file with mode: 0644]
lincan-0.3.3/src/template.c [new file with mode: 0644]
lincan-0.3.3/src/tscan1.c [new file with mode: 0644]
lincan-0.3.3/src/unican.c [new file with mode: 0644]
lincan-0.3.3/src/unican_cl2.c [new file with mode: 0644]
lincan-0.3.3/src/unican_vme.c [new file with mode: 0644]
lincan-0.3.3/src/virtual.c [new file with mode: 0644]
lincan-0.3.3/src/write.c [new file with mode: 0644]
lincan-0.3.3/src/write_rtl.c [new file with mode: 0644]
lincan-0.3.3/switch-omk2std [new file with mode: 0644]
lincan-0.3.3/utils/Makefile [new file with mode: 0644]
lincan-0.3.3/utils/Makefile.omk [new file with mode: 0644]
lincan-0.3.3/utils/Makefile.std [new file with mode: 0644]
lincan-0.3.3/utils/README [new file with mode: 0644]
lincan-0.3.3/utils/can-proxy.c [new file with mode: 0644]
lincan-0.3.3/utils/readburst.c [new file with mode: 0644]
lincan-0.3.3/utils/readburst_rtl.c [new file with mode: 0644]
lincan-0.3.3/utils/rxtx.c [new file with mode: 0644]
lincan-0.3.3/utils/send.c [new file with mode: 0644]
lincan-0.3.3/utils/sendburst.c [new file with mode: 0644]
lincan-0.3.3/utils/sendburst_rtl.c [new file with mode: 0644]
ulan/CVS/Entries [new file with mode: 0644]
ulan/CVS/Repository [new file with mode: 0644]
ulan/CVS/Root [new file with mode: 0644]
ulan/embedded/.cvsignore [new file with mode: 0644]
ulan/embedded/CVS/Entries [new file with mode: 0644]
ulan/embedded/CVS/Repository [new file with mode: 0644]
ulan/embedded/CVS/Root [new file with mode: 0644]
ulan/embedded/Makefile [new file with mode: 0644]
ulan/embedded/Makefile.gcc [new file with mode: 0644]
ulan/embedded/Makefile.keil [new file with mode: 0644]
ulan/embedded/Makefile.omk [new file with mode: 0644]
ulan/embedded/Makefile.sdcc [new file with mode: 0644]
ulan/embedded/README.txt [new file with mode: 0644]
ulan/embedded/a51dep.sh [new file with mode: 0755]
ulan/embedded/a51toasx.sh [new file with mode: 0755]
ulan/embedded/app/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/CVS/Root [new file with mode: 0644]
ulan/embedded/app/Makefile [new file with mode: 0644]
ulan/embedded/app/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/ha/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/ha/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/ha/CVS/Root [new file with mode: 0644]
ulan/embedded/app/ha/Makefile [new file with mode: 0644]
ulan/embedded/app/ha/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/CVS/Root [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/Makefile [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/light_switch.c [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/light_switch.h [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/light_switchoi.c [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/ha/light_switch/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/hisc/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/bell/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/bell/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/bell/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/bell/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/bell/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/homebell.c [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/homebell.h [new file with mode: 0644]
ulan/embedded/app/hisc/bell/home/homebelloi.c [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/keypad.c [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/keypad.h [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/keypadoi.c [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/hisc/bell/keypad/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/blinder.c [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/blinder.h [new file with mode: 0644]
ulan/embedded/app/hisc/blinder/blinderoi.c [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/garage_gate.c [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/garage_gate.h [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/garage_gateoi.c [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/hisc/garage_gate/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/hisc/heating/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/heating/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/heating/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/heating/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/heating/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/kswtimer.c [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/kswtimer.h [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/kswtimeroi.c [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/msc_adc.c [new file with mode: 0644]
ulan/embedded/app/hisc/thermometer/thermometer.c [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/CVS/Root [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/Makefile [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/kty.c [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/kty.h [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/weather_station.c [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/weather_station.h [new file with mode: 0644]
ulan/embedded/app/hisc/weather_station/weather_stationoi.c [new file with mode: 0644]
ulan/embedded/app/template/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/template/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/template/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/u2u/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/u2u/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/Makefile [new file with mode: 0644]
ulan/embedded/app/u2u/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/Makefile [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/u2u.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/u2u_vend.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/u2u_vend.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/ul_dcnv.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/ul_dcnv.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/usb/usb_defs.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver1/usb_srq.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/Makefile [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/u2u.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/u2u_vend.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/u2u_vend.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/ul_dcnv.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/ul_dcnv.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/usb/usb_defs.h [new file with mode: 0644]
ulan/embedded/app/u2u/ver2/usb_srq.c [new file with mode: 0644]
ulan/embedded/app/ulboot/CVS/Entries [new file with mode: 0644]
ulan/embedded/app/ulboot/CVS/Repository [new file with mode: 0644]
ulan/embedded/app/ulboot/CVS/Root [new file with mode: 0644]
ulan/embedded/app/ulboot/Makefile [new file with mode: 0644]
ulan/embedded/app/ulboot/Makefile.omk [new file with mode: 0644]
ulan/embedded/app/ulboot/msc_hcr-hisc.asm [new file with mode: 0644]
ulan/embedded/app/ulboot/msc_hcr-ulad21.asm [new file with mode: 0644]
ulan/embedded/app/ulboot/ul_idstr.c [new file with mode: 0644]
ulan/embedded/app/ulboot/ul_idstr.h [new file with mode: 0644]
ulan/embedded/app/ulboot/ulboot.c [new file with mode: 0644]
ulan/embedded/arch/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/Makefile [new file with mode: 0644]
ulan/embedded/arch/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/generic/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/generic/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/generic/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/generic/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/generic/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/cpu_def.h [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/hal_intr.h [new file with mode: 0644]
ulan/embedded/arch/arm/generic/defines/types.h [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/system_stub.c [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/system_stub.h [new file with mode: 0644]
ulan/embedded/arch/arm/generic/libs/misc/undef_support.c [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC210x.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC214x.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC21xx.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC22xx.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/armVIC.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC-214x.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcEMC.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcGPIO.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcI2C.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcPIN.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcRTC.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSCB.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSPI.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcTMR.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUART.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUSB.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcVIC.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcWD.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal.c [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_ints.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.c [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/ivt.S [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/startup.S [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap.c [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_asm.S [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_kvpb.c [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap.h [new file with mode: 0644]
ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap_kvpb.h [new file with mode: 0644]
ulan/embedded/arch/generic/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/generic/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/generic/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/generic/Makefile [new file with mode: 0644]
ulan/embedded/arch/generic/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/generic/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/generic/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/generic/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/generic/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/generic/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/generic/defines/byteswap.h [new file with mode: 0644]
ulan/embedded/arch/generic/defines/endian.h [new file with mode: 0644]
ulan/embedded/arch/generic/defines/lt_timer.h [new file with mode: 0644]
ulan/embedded/arch/generic/defines/lt_timer_types.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/cpu_def.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/defines/types.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/boot.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-hisc.asm [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-ulad21.asm [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/vect.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/vect_a2c.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/misc/vect_fnc.asm [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/config-generic.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/pl_l_c2a.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/plan.asm [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/plan.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/plan/ul_idstr.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-ps1.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-boot.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-u2u.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/reg1210.inc [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ul_idstr.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ul_l_c2a.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.asm [new file with mode: 0644]
ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/mcu_regs.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/mcu_regs.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hke [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hsd [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Entries [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Repository [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Root [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile.omk [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.c [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.h [new file with mode: 0644]
ulan/embedded/arch/mcs51/mach-msc1210/libs/msc_loader.c [new file with mode: 0644]
ulan/embedded/board/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/CVS/Root [new file with mode: 0644]
ulan/embedded/board/Makefile [new file with mode: 0644]
ulan/embedded/board/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.bell-keypad [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.garage-gate [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.ha-switch [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.ha-switch-ulboot [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.u2uv2 [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.ul_usb1 [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/config/config.ulboot [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/system_def-ha-switch.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-garage-gate.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-keypad.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/defines/system_def.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/bsp0hwinit.c [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/bspbase.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/kbd_io_hisc.c [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.c [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Root [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/keyval_loc.h [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-cfg [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-flash [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-app [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-boot [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-cfg [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-app [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-boot [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-cfg [new file with mode: 0644]
ulan/embedded/board/arm/ul_usb1/libs/ldscripts/mem_loc.h [new file with mode: 0644]
ulan/embedded/board/mcs51/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.bell-home [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.blinder [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.boot [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.heating-kswtimer [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.thermometer [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.ulboot [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/config/config.weather_station [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/keyval_id_his.h [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/bsp0hwinit.c [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/bspbase.h [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.c [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.h [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/hisc.ld-app [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/hisc.ld-boot [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/libs/hisc.ld-flash [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/system_def.h [new file with mode: 0644]
ulan/embedded/board/mcs51/hisc/ulan_his.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/config/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/config/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/config/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/config/config.u2u [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/bsp0hwinit.c [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/bspbase.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/bspbase/i2c.c [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/libs/ps1.ld-flash [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/periph/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/periph/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/periph/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/periph/i2c.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ps1/system_def.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/config.boot [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/config.u2u [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/config/config.ulboot [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile.omk [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/bsp0hwinit.c [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/bspbase.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/bspbase/i2c.c [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-boot [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-flash [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/periph/CVS/Entries [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/periph/CVS/Repository [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/periph/CVS/Root [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/periph/i2c.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/system_def.h [new file with mode: 0644]
ulan/embedded/board/mcs51/ulad21/system_def_msc51_uc1.h [new file with mode: 0644]
ulan/embedded/libs4c/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/i2c/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/i2c/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/i2c/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/i2c/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/i2c/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/i2c/i2c_c552.c [new file with mode: 0644]
ulan/embedded/libs4c/i2c/i2c_drv.c [new file with mode: 0644]
ulan/embedded/libs4c/i2c/i2c_drv.h [new file with mode: 0644]
ulan/embedded/libs4c/kbd/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/kbd/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/kbd/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/kbd/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/kbd/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/kbd/kbd.h [new file with mode: 0644]
ulan/embedded/libs4c/kbd/kbd_base.c [new file with mode: 0644]
ulan/embedded/libs4c/kbd/kbd_dev_ops.c [new file with mode: 0644]
ulan/embedded/libs4c/keyval/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/keyval/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/keyval/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/keyval/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/keyval/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/keyval/keyval_id.h [new file with mode: 0644]
ulan/embedded/libs4c/keyval/keyvalpb.c [new file with mode: 0644]
ulan/embedded/libs4c/keyval/keyvalpb.h [new file with mode: 0644]
ulan/embedded/libs4c/ulan/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/ulan/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/ulan/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/ulan/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/ulan/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/uldy_base.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uldy/uldy_base.h [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.h [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_fchar.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_fint.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_flong.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_ioulan.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/uloi_lt/uloi_testlt.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/ulsup/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/ulan/ulsup/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/ulan/ulsup/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/ulan/ulsup/ul_util.c [new file with mode: 0644]
ulan/embedded/libs4c/ulan/ulsup/ul_util.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/usb/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/usb.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/usb_spec.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/usb_srq.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usb/usbdebug.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/base/usbdebug.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/lpc.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/lpcusb.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/usb/lpc.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/lpcusb/usb/lpcusb.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/msc_loader.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/usb_com.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb/usb_loader.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb_com.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/more/usb_srq.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/Makefile [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/Makefile.omk [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/pdi.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/pdiusb.c [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Entries [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Repository [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Root [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/usb/pdi.h [new file with mode: 0644]
ulan/embedded/libs4c/usb/pdiusb/usb/pdiusb.h [new file with mode: 0644]
ulan/host/.cvsignore [new file with mode: 0644]
ulan/host/CVS/Entries [new file with mode: 0644]
ulan/host/CVS/Repository [new file with mode: 0644]
ulan/host/CVS/Root [new file with mode: 0644]
ulan/host/Makefile.omk [new file with mode: 0644]
ulan/host/Makefile.rules [new file with mode: 0644]
ulan/host/Makefile.std [new file with mode: 0644]
ulan/host/Makefile4omk [new file with mode: 0644]
ulan/host/README.makerules [new file with mode: 0644]
ulan/host/apps/.cvsignore [new file with mode: 0644]
ulan/host/apps/CVS/Entries [new file with mode: 0644]
ulan/host/apps/CVS/Repository [new file with mode: 0644]
ulan/host/apps/CVS/Root [new file with mode: 0644]
ulan/host/apps/Makefile.omk [new file with mode: 0644]
ulan/host/apps/ul_asd/.cvsignore [new file with mode: 0644]
ulan/host/apps/ul_asd/CVS/Entries [new file with mode: 0644]
ulan/host/apps/ul_asd/CVS/Repository [new file with mode: 0644]
ulan/host/apps/ul_asd/CVS/Root [new file with mode: 0644]
ulan/host/apps/ul_asd/Makefile.omk [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asc.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd.h [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd.xml [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd_conf.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd_net.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_asd_server.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_corba_toolkit.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ul_corba_toolkit.h [new file with mode: 0644]
ulan/host/apps/ul_asd/ulci_as-skelimpl.c [new file with mode: 0644]
ulan/host/apps/ul_asd/ulci_as.idl [new file with mode: 0644]
ulan/host/apps/ul_ethd/CVS/Entries [new file with mode: 0644]
ulan/host/apps/ul_ethd/CVS/Repository [new file with mode: 0644]
ulan/host/apps/ul_ethd/CVS/Root [new file with mode: 0644]
ulan/host/apps/ul_ethd/Makefile [new file with mode: 0644]
ulan/host/apps/ul_ethd/Makefile.omk [new file with mode: 0644]
ulan/host/apps/ul_ethd/log_domains.inc [new file with mode: 0644]
ulan/host/apps/ul_ethd/service.c [new file with mode: 0644]
ulan/host/apps/ul_ethd/ul_eth_server_commands.c [new file with mode: 0644]
ulan/host/apps/ul_ethd/ul_ethd.c [new file with mode: 0644]
ulan/host/apps/ul_ethd/ul_ethd.h [new file with mode: 0644]
ulan/host/apps/uloi_browser/CVS/Entries [new file with mode: 0644]
ulan/host/apps/uloi_browser/CVS/Repository [new file with mode: 0644]
ulan/host/apps/uloi_browser/CVS/Root [new file with mode: 0644]
ulan/host/apps/uloi_browser/SortList.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/autodetection.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/autodetection.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/autodetection.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/fAbout.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/fAbout.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/fAbout.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/mainform.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/mainform.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/mainform.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/manifest.rc [new file with mode: 0644]
ulan/host/apps/uloi_browser/manifest.res [new file with mode: 0644]
ulan/host/apps/uloi_browser/preferences.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/preferences.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/preferences.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_set_new_address.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_set_new_address.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_set_new_address.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_settings.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_settings.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/prop_settings.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_confirm.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_confirm.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_confirm.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_confirm.rc [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_error.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_error.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_error.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_info_process.lfm [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_info_process.lrs [new file with mode: 0644]
ulan/host/apps/uloi_browser/sd_info_process.pas [new file with mode: 0644]
ulan/host/apps/uloi_browser/uloi_browser.lpi [new file with mode: 0644]
ulan/host/apps/uloi_browser/uloi_browser.lpr [new file with mode: 0644]
ulan/host/apps/uloi_browser/uloi_browser.rc [new file with mode: 0644]
ulan/host/apps/uloi_browser/uloi_browser.res [new file with mode: 0644]
ulan/host/apps/uloi_browser/uloi_browser_ico.res [new file with mode: 0644]
ulan/host/config.omk-default [new file with mode: 0644]
ulan/host/contrib/CVS/Entries [new file with mode: 0644]
ulan/host/contrib/CVS/Repository [new file with mode: 0644]
ulan/host/contrib/CVS/Root [new file with mode: 0644]
ulan/host/kernelcfg2mk [new file with mode: 0755]
ulan/host/libs4c/.cvsignore [new file with mode: 0644]
ulan/host/libs4c/CVS/Entries [new file with mode: 0644]
ulan/host/libs4c/CVS/Repository [new file with mode: 0644]
ulan/host/libs4c/CVS/Root [new file with mode: 0644]
ulan/host/libs4c/Makefile.omk [new file with mode: 0644]
ulan/host/libs4c/ulcintf/.cvsignore [new file with mode: 0644]
ulan/host/libs4c/ulcintf/CVS/Entries [new file with mode: 0644]
ulan/host/libs4c/ulcintf/CVS/Repository [new file with mode: 0644]
ulan/host/libs4c/ulcintf/CVS/Root [new file with mode: 0644]
ulan/host/libs4c/ulcintf/Makefile.omk [new file with mode: 0644]
ulan/host/libs4c/ulcintf/ul_netbase.c [new file with mode: 0644]
ulan/host/libs4c/ulcintf/ul_netbase.h [new file with mode: 0644]
ulan/host/libs4c/ulevloop/CVS/Entries [new file with mode: 0644]
ulan/host/libs4c/ulevloop/CVS/Repository [new file with mode: 0644]
ulan/host/libs4c/ulevloop/CVS/Root [new file with mode: 0644]
ulan/host/libs4c/ulevloop/Makefile [new file with mode: 0644]
ulan/host/libs4c/ulevloop/Makefile.omk [new file with mode: 0644]
ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.c [new file with mode: 0644]
ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.h [new file with mode: 0644]
ulan/host/libs4c/ulevloop/ul_evpchk.c [new file with mode: 0644]
ulan/host/libs4c/ulevloop/ul_evpoll.c [new file with mode: 0644]
ulan/host/libs4c/ulevloop/ul_evpoll.h [new file with mode: 0644]
ulan/host/libs4c/ulut/.cvsignore [new file with mode: 0644]
ulan/host/libs4c/ulut/CVS/Entries [new file with mode: 0644]
ulan/host/libs4c/ulut/CVS/Repository [new file with mode: 0644]
ulan/host/libs4c/ulut/CVS/Root [new file with mode: 0644]
ulan/host/libs4c/ulut/Makefile.omk [new file with mode: 0644]
ulan/host/libs4c/ulut/Makefile.std [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_cbuff.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_cbuff.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_dbufbase.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_dbuff.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_dbufflog.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_dbufflog.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_dbufmore.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_evcbase.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_evcbase.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavl.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavl.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavlchk.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavlcust.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavlflesint.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavlprim.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gavlrepcust.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gsa.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gsa.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gsachk.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gsacust.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_gsacust.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_hptree.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_hptree.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimbase.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimchk.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimdefs.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimer.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimer.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_htimmstime.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_itbase.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_list.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_listbase.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_log.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_logbase.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_logbase.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_logbuf.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_logreg.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_logreg.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_uniqid.c [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_uniqid.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_utdefs.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_utexport.h [new file with mode: 0644]
ulan/host/libs4c/ulut/ul_utmalloc.h [new file with mode: 0644]
ulan/host/switch2omk [new file with mode: 0755]
ulan/host/switch2std [new file with mode: 0755]
ulan/host/ul_drv/.cvsignore [new file with mode: 0644]
ulan/host/ul_drv/COPYING [new file with mode: 0644]
ulan/host/ul_drv/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/Makefile.omk [new file with mode: 0644]
ulan/host/ul_drv/Makefile.std [new file with mode: 0644]
ulan/host/ul_drv/README [new file with mode: 0644]
ulan/host/ul_drv/config/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/config/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/config/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/config/djgpp/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/config/djgpp/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/config/djgpp/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/config/djgpp/getopt.h [new file with mode: 0644]
ulan/host/ul_drv/config/linux/10-ulan.rules [new file with mode: 0644]
ulan/host/ul_drv/config/linux/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/config/linux/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/config/linux/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/config/linux/ulan [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/drvenv.bat [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/drvenv2k.bat [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/getopt.h [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/isa98_com4_9600.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/pnp98_com2_9600.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/smingw32.bat [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_w98_1.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_w98_2.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_w98_3.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_w98_4.reg [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_wdm.ine [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_wdm.inf [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_wdm.sys [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ul_wdm9600.ine [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ulanclass.dll [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/ulanpp.dll [new file with mode: 0644]
ulan/host/ul_drv/config/winnt/wdfenv.bat [new file with mode: 0644]
ulan/host/ul_drv/lazarus/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/lazarus/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/lazarus/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/lazarus/libulan.dll [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLan.lrs [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLan.pas [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLan.res [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLan.xpm [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLanlaz.lpk [new file with mode: 0644]
ulan/host/ul_drv/lazarus/uLanlaz.pas [new file with mode: 0644]
ulan/host/ul_drv/lazarus/ul_drvdef.pas [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/makefile [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/resource.h [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/sources [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/uLan.ico [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/ulanclass.aps [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/ulanclass.c [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/ulanclass.def [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/class/ulanclass.rc [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/makefile [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/proppage.aps [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/proppage.c [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/proppage.h [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/proppage.rc [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/resource.h [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/sources [new file with mode: 0644]
ulan/host/ul_drv/ul_dll/pp/ulanpp.def [new file with mode: 0644]
ulan/host/ul_drv/ul_drv.lsm [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/.cvsignore [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/Makefile.omk [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/Makefile.std [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/Makefile.wdf [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/README [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/emu_irq.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/emu_irq.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/k_compat.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/serial_reg.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/sources [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_82510.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_base.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_c450.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_c510.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_c950pci.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_cps1.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_debug.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_devtab.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_di.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_djgpp.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.dsp [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.dsw [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.lnd [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.lnr [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv.mak [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv_iac.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_drv_init.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_frame.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_hdep.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_iac.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_inlib.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_kdmnt.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_linpci.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_linusb.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_linux.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_mem.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_sysless.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_tors.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_tst.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_ufsm.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdbase.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdbase.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdent.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdinc.h [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdm.dsp [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdm.lnr [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdm.mak [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdpnp.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdpwr.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdusb.c [new file with mode: 0644]
ulan/host/ul_drv/ul_drv/ul_wdusb.h [new file with mode: 0644]
ulan/host/ul_drv/ul_iss/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_iss/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_iss/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_iss/readme.txt [new file with mode: 0644]
ulan/host/ul_drv/ul_iss/ul_drvnt.iss [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/.cvsignore [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/Makefile.omk [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/Makefile.std [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_drv.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_drv_eth.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_drv_eth.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_indir.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_log.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_msg.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_oi.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_l_oil.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib.dsp [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ul_drvdef.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4dir.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4indir.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ul_fddir.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ul_l_log.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_lib/ulan.h [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_msg_buf.c [new file with mode: 0644]
ulan/host/ul_drv/ul_lib/ul_msg_buf.h [new file with mode: 0644]
ulan/host/ul_drv/utils/.cvsignore [new file with mode: 0644]
ulan/host/ul_drv/utils/CVS/Entries [new file with mode: 0644]
ulan/host/ul_drv/utils/CVS/Repository [new file with mode: 0644]
ulan/host/ul_drv/utils/CVS/Root [new file with mode: 0644]
ulan/host/ul_drv/utils/Makefile.omk [new file with mode: 0644]
ulan/host/ul_drv/utils/Makefile.std [new file with mode: 0644]
ulan/host/ul_drv/utils/README [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_buftst.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_dynewsn.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_dysn.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_lcabsp.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_lcscan.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_sendhex.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_sendmsg.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ul_spy.c [new file with mode: 0644]
ulan/host/ul_drv/utils/ulc_tst.c [new file with mode: 0644]
verinfo.txt [new file with mode: 0644]

diff --git a/lincan-0.3.3/CREDITS b/lincan-0.3.3/CREDITS
new file mode 100644 (file)
index 0000000..e16a913
--- /dev/null
@@ -0,0 +1,70 @@
+========================================
+List of developers and code contributors
+========================================
+
+
+Arnaud Westenberg, arnaud@wanadoo.nl
+Original can-0.7.1 author, http://home.wanadoo.nl/arnaud/
+       Rewrite of LDDK based CAN driver to the simpler infrastructure
+       supporting 2.2.x and 2.4.x kernels
+
+Tomasz Motylewski, T.Motylewski@bfad.de
+BFAD GmbH http://www.bfad.de/, http://www.getembedded.de/
+       Tester, bugfixes, hints and PeliCAN mode!
+       He provided ETHERNET CAN-PROXY as well.
+
+Pavel Pisa, pisa@cmp.felk.cvut.cz
+http://cmp.felk.cvut.cz/~pisa, http://www.pikron.com/
+       Bugfixes in SJA1000 code. 
+       Total rewrite of message handling infrastructure.
+       Addition of the support for more cards and chips.
+       And many other changes.
+       Most of new bugs belong to me.
+       
+Michal Sojka, sojkam1@control.felk.cvut.cz
+       Work on VME support for Unicontrols V-CAN board
+       on the PowerPC PEP VMP1 board
+
+Jose Pascual  josepascual@almudi.com
+       contributed printer port dongle SJA1000 support
+
+Michael Moedt xemc@yahoo.com
+       added support for OSCAR SJA1000 based card connected
+       to ARM LH7A400 SoC
+
+Radim Kalas, Unicontrols.cz
+http://www.unicontrols.cz/
+       contributed support for series of IXXAT iPC-I 165 (PCI) 
+       boards
+
+Ronald Gomes, Technologic Systems
+http://www.embeddedarm.com/
+       contributed support for TS-CAN1 and TS-7KV
+
+========================================
+List of companies and subjects
+who donated hardware to LinCAN project
+========================================
+
+BFAD GmbH & Co.KG
+http://www.bfad.de/
+       donated BfaD DIMM module CAN card
+
+PiKRON Ltd.
+       provided more ISA based cards
+
+Unicontrols a.s.
+http://www.unicontrols.cz/
+       provided PC-104, PCI and VME CAN boards
+       and VMP1 PowerPC based system
+
+Kvaser AB
+http://www.kvaser.com/
+       donated PCIcan 4xHS card
+
+Artificial Vision and Intelligent Vision Lab
+Dipartimento di Ingegneria dell'Informazione
+Universita' degli Studi di Parma
+http://vislab.ce.unipr.it/
+       donated EMS CPC-PCI card
+
diff --git a/lincan-0.3.3/Changes.LinCAN b/lincan-0.3.3/Changes.LinCAN
new file mode 100644 (file)
index 0000000..801b521
--- /dev/null
@@ -0,0 +1,3063 @@
+---------------------
+PatchSet 1 
+Date: 2003/02/24 16:56:52
+Author: adrianm
+Branch: HEAD
+Tag: (none) 
+Log:
+First Release.
+
+Members: 
+       README:INITIAL->1.1 
+
+---------------------
+PatchSet 2 
+Date: 2003/04/29 21:56:59
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The original version of Arnaud Westenberg Linux CAN-bus driver
+can-0.7.1 (http://home.wanadoo.nl/arnaud/)
+
+Members: 
+       CREDITS:INITIAL->1.2 
+       Makefile:INITIAL->1.2 
+       README:1.1->1.2 
+       TODO:INITIAL->1.2 
+       Unsupported-hardware:INITIAL->1.2 
+       include/aim104.h:INITIAL->1.2 
+       include/can.h:INITIAL->1.2 
+       include/cc_can104.h:INITIAL->1.2 
+       include/close.h:INITIAL->1.2 
+       include/constants.h:INITIAL->1.2 
+       include/i82527.h:INITIAL->1.2 
+       include/ioctl.h:INITIAL->1.2 
+       include/irq.h:INITIAL->1.2 
+       include/m437.h:INITIAL->1.2 
+       include/main.h:INITIAL->1.2 
+       include/modparms.h:INITIAL->1.2 
+       include/nsi.h:INITIAL->1.2 
+       include/open.h:INITIAL->1.2 
+       include/pc-i03.h:INITIAL->1.2 
+       include/pccan.h:INITIAL->1.2 
+       include/pcccan.h:INITIAL->1.2 
+       include/pcm3680.h:INITIAL->1.2 
+       include/pip.h:INITIAL->1.2 
+       include/proc.h:INITIAL->1.2 
+       include/read.h:INITIAL->1.2 
+       include/setup.h:INITIAL->1.2 
+       include/sja1000.h:INITIAL->1.2 
+       include/sja1000p.h:INITIAL->1.2 
+       include/smartcan.h:INITIAL->1.2 
+       include/ssv.h:INITIAL->1.2 
+       include/template.h:INITIAL->1.2 
+       include/write.h:INITIAL->1.2 
+       src/aim104.c:INITIAL->1.2 
+       src/cc_can104.c:INITIAL->1.2 
+       src/close.c:INITIAL->1.2 
+       src/i82527.c:INITIAL->1.2 
+       src/ioctl.c:INITIAL->1.2 
+       src/irq.c:INITIAL->1.2 
+       src/m437.c:INITIAL->1.2 
+       src/main.c:INITIAL->1.2 
+       src/modparms.c:INITIAL->1.2 
+       src/nsi.c:INITIAL->1.2 
+       src/open.c:INITIAL->1.2 
+       src/pc-i03.c:INITIAL->1.2 
+       src/pccan.c:INITIAL->1.2 
+       src/pcccan.c:INITIAL->1.2 
+       src/pcm3680.c:INITIAL->1.2 
+       src/pip.c:INITIAL->1.2 
+       src/proc.c:INITIAL->1.2 
+       src/read.c:INITIAL->1.2 
+       src/setup.c:INITIAL->1.2 
+       src/sja1000.c:INITIAL->1.2 
+       src/sja1000p.c:INITIAL->1.2 
+       src/smartcan.c:INITIAL->1.2 
+       src/ssv.c:INITIAL->1.2 
+       src/temp.c:INITIAL->1.2 
+       src/template.c:INITIAL->1.2 
+       src/write.c:INITIAL->1.2 
+       utils/README:INITIAL->1.2 
+       utils/readburst.c:INITIAL->1.2 
+       utils/rxtx.c:INITIAL->1.2 
+       utils/sendburst.c:INITIAL->1.2 
+
+---------------------
+PatchSet 3 
+Date: 2003/04/29 22:40:59
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The first enhanced version of Linux CAN-bus driver for OCERA project
+can-0.7.1-pi3.5 (pisa@cmp.felk.cvut.cz)
+
+Members: 
+       CREDITS:1.2->1.3 
+       Makefile:1.2->1.3 
+       README:1.2->1.3 
+       TODO:1.2->1.3 
+       Unsupported-hardware:1.2->1.3 
+       include/aim104.h:1.2->1.3 
+       include/can.h:1.2->1.3 
+       include/cc_can104.h:1.2->1.3 
+       include/close.h:1.2->1.3 
+       include/constants.h:1.2->1.3 
+       include/i82527.h:1.2->1.3 
+       include/ioctl.h:1.2->1.3 
+       include/irq.h:1.2->1.3 
+       include/m437.h:1.2->1.3 
+       include/main.h:1.2->1.3 
+       include/modparms.h:1.2->1.3 
+       include/nsi.h:1.2->1.3 
+       include/open.h:1.2->1.3 
+       include/pc-i03.h:1.2->1.3 
+       include/pccan.h:1.2->1.3 
+       include/pcccan.h:1.2->1.3 
+       include/pcm3680.h:1.2->1.3 
+       include/pikronisa.h:INITIAL->1.3 
+       include/pip.h:1.2->1.3 
+       include/proc.h:1.2->1.3 
+       include/read.h:1.2->1.3 
+       include/select.h:INITIAL->1.3 
+       include/setup.h:1.2->1.3 
+       include/sja1000.h:1.2->1.3 
+       include/sja1000p.h:1.2->1.3 
+       include/smartcan.h:1.2->1.3 
+       include/ssv.h:1.2->1.3 
+       include/template.h:1.2->1.3 
+       include/write.h:1.2->1.3 
+       src/Makefile:INITIAL->1.3 
+       src/aim104.c:1.2->1.3 
+       src/bfadcan.c:INITIAL->1.3 
+       src/cc_can104.c:1.2->1.3 
+       src/close.c:1.2->1.3 
+       src/i82527.c:1.2->1.3 
+       src/ioctl.c:1.2->1.3 
+       src/irq.c:1.2->1.3 
+       src/m437.c:1.2->1.3 
+       src/main.c:1.2->1.3 
+       src/modparms.c:1.2->1.3 
+       src/nsi.c:1.2->1.3 
+       src/open.c:1.2->1.3 
+       src/pc_i03.c:INITIAL->1.3 
+       src/pccan.c:1.2->1.3 
+       src/pcccan.c:1.2->1.3 
+       src/pcm3680.c:1.2->1.3 
+       src/pikronisa.c:INITIAL->1.3 
+       src/pip.c:1.2->1.3 
+       src/proc.c:1.2->1.3 
+       src/read.c:1.2->1.3 
+       src/select.c:INITIAL->1.3 
+       src/setup.c:1.2->1.3 
+       src/sja1000.c:1.2->1.3 
+       src/sja1000p.c:1.2->1.3 
+       src/smartcan.c:1.2->1.3 
+       src/ssv.c:1.2->1.3 
+       src/temp.c:1.2->1.3 
+       src/template.c:1.2->1.3 
+       src/write.c:1.2->1.3 
+       utils/Makefile:INITIAL->1.3 
+       utils/README:1.2->1.3 
+       utils/can-proxy.c:INITIAL->1.3 
+       utils/readburst.c:1.2->1.3 
+       utils/rxtx.c:1.2->1.3 
+       utils/send.c:INITIAL->1.3 
+       utils/sendburst.c:1.2->1.3 
+
+---------------------
+PatchSet 4 
+Date: 2003/04/30 00:22:28
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+*** empty log message ***
+
+Members: 
+       src/pc-i03.c:1.2->1.3(DEAD) 
+
+---------------------
+PatchSet 5 
+Date: 2003/08/22 13:21:03
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated BFAD contributed can-proxy from latest changes by T.Motylewski
+
+Members: 
+       utils/can-proxy.c:1.3->1.4 
+
+---------------------
+PatchSet 6 
+Date: 2003/08/25 03:52:35
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+CAN driver infrastructure redesign to LinCAN-0.2 version
+
+Members: 
+       CREDITS:1.3->1.5 
+       Makefile:1.3->1.5 
+       README:1.3->1.5 
+       TODO:1.3->1.5 
+       Unsupported-hardware:1.3->1.5 
+       include/aim104.h:1.3->1.5 
+       include/can.h:1.3->1.5 
+       include/can_queue.h:INITIAL->1.5 
+       include/cc_can104.h:1.3->1.5 
+       include/close.h:1.3->1.5 
+       include/constants.h:1.3->1.5 
+       include/devcommon.h:INITIAL->1.5 
+       include/i82527.h:1.3->1.5 
+       include/ioctl.h:1.3->1.5 
+       include/irq.h:1.3->1.5 
+       include/m437.h:1.3->1.5 
+       include/main.h:1.3->1.5 
+       include/modparms.h:1.3->1.5 
+       include/nsi.h:1.3->1.5 
+       include/open.h:1.3->1.5 
+       include/pc-i03.h:1.3->1.5 
+       include/pccan.h:1.3->1.5 
+       include/pcccan.h:1.3->1.5 
+       include/pcm3680.h:1.3->1.5 
+       include/pikronisa.h:1.3->1.5 
+       include/pip.h:1.3->1.5 
+       include/proc.h:1.3->1.5 
+       include/read.h:1.3->1.5 
+       include/select.h:1.3->1.5 
+       include/setup.h:1.3->1.5 
+       include/sja1000.h:1.3->1.5 
+       include/sja1000p.h:1.3->1.5 
+       include/smartcan.h:1.3->1.5 
+       include/ssv.h:1.3->1.5 
+       include/template.h:1.3->1.5 
+       include/write.h:1.3->1.5 
+       src/Makefile:1.3->1.5 
+       src/aim104.c:1.3->1.5 
+       src/bfadcan.c:1.3->1.5 
+       src/can_queue.c:INITIAL->1.5 
+       src/cc_can104.c:1.3->1.5 
+       src/close.c:1.3->1.5 
+       src/devcommon.c:INITIAL->1.5 
+       src/i82527.c:1.3->1.5 
+       src/ioctl.c:1.3->1.5 
+       src/irq.c:1.3->1.5 
+       src/m437.c:1.3->1.5 
+       src/main.c:1.3->1.5 
+       src/modparms.c:1.3->1.5 
+       src/nsi.c:1.3->1.5 
+       src/open.c:1.3->1.5 
+       src/pc_i03.c:1.3->1.5 
+       src/pccan.c:1.3->1.5 
+       src/pcccan.c:1.3->1.5 
+       src/pcm3680.c:1.3->1.5 
+       src/pikronisa.c:1.3->1.5 
+       src/pip.c:1.3->1.5 
+       src/proc.c:1.3->1.5 
+       src/read.c:1.3->1.5 
+       src/select.c:1.3->1.5 
+       src/setup.c:1.3->1.5 
+       src/sja1000.c:1.3->1.5 
+       src/sja1000p.c:1.3->1.5 
+       src/smartcan.c:1.3->1.5 
+       src/ssv.c:1.3->1.5 
+       src/template.c:1.3->1.5 
+       src/write.c:1.3->1.5 
+       utils/Makefile:1.3->1.5 
+       utils/README:1.3->1.5 
+       utils/can-proxy.c:1.4->1.5 
+       utils/readburst.c:1.3->1.5 
+       utils/rxtx.c:1.3->1.5 
+       utils/send.c:1.3->1.5 
+       utils/sendburst.c:1.3->1.5 
+
+---------------------
+PatchSet 7 
+Date: 2003/08/25 03:56:03
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+*** empty log message ***
+
+Members: 
+       src/temp.c:1.3->1.4(DEAD) 
+
+---------------------
+PatchSet 8 
+Date: 2003/08/28 21:50:24
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Fixes for SMP kernels and build for 2.2.xx and 2.6.xx kernels
+
+Members: 
+       include/main.h:1.5->1.6 
+       src/Makefile:1.5->1.6 
+       src/can_queue.c:1.5->1.6 
+       src/m437.c:1.5->1.6 
+       src/main.c:1.5->1.6 
+       src/pcm3680.c:1.5->1.6 
+       src/pikronisa.c:1.5->1.6 
+       src/setup.c:1.5->1.6 
+
+---------------------
+PatchSet 9 
+Date: 2003/08/29 01:32:38
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added initial support for "virtual" CAN interface
+and rewrite of board type parsing
+
+Members: 
+       include/main.h:1.6->1.7 
+       src/Makefile:1.6->1.7 
+       src/boardlist.c:INITIAL->1.1 
+       src/main.c:1.6->1.7 
+       src/modparms.c:1.5->1.6 
+       src/setup.c:1.6->1.7 
+       src/virtual.c:INITIAL->1.1 
+
+---------------------
+PatchSet 10 
+Date: 2003/09/01 01:16:16
+Author: ppisa
+Branch: HEAD
+Tag: pre-integration 
+Log:
+LinCAN driver major structured comments and documentation update
+
+Members: 
+       include/can.h:1.5->1.6 
+       include/can_queue.h:1.5->1.6 
+       include/main.h:1.7->1.8 
+       src/aim104.c:1.5->1.6 
+       src/bfadcan.c:1.5->1.6 
+       src/can_queue.c:1.6->1.7 
+       src/cc_can104.c:1.5->1.6 
+       src/m437.c:1.6->1.7 
+       src/pc_i03.c:1.5->1.6 
+       src/pcccan.c:1.5->1.6 
+       src/pcm3680.c:1.6->1.7 
+       src/pikronisa.c:1.6->1.7 
+       src/read.c:1.5->1.6 
+       src/sja1000p.c:1.5->1.6 
+       src/template.c:1.5->1.6 
+       src/virtual.c:1.1->1.2 
+
+---------------------
+PatchSet 11 
+Date: 2003/09/15 11:18:39
+Author: pagnin
+Branch: HEAD
+Tag: (none) 
+Log:
+First integration step:
+Included in linux kernel tree hrt, gensched and rtlinux patches.
+Included in rtlinux tree dynmem,psignals,ptimers,ptrace,pmqueue,pbarriers
+and rtlcbs patches
+
+Many fixes to the linux kernel build process.
+Many fixes to the rtlinux module build process.
+
+Even more fixes to the makefiles and tree structure of the components tree.
+
+This is the first step on integration path, please, report standing problems.
+
+Members: 
+       Makefile:1.5->1.6 
+       src/Makefile:1.7->1.8 
+       utils/Makefile:1.5->1.6 
+
+---------------------
+PatchSet 12 
+Date: 2003/09/19 19:44:31
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Update of Makefiles to support "Standalone" compilation.
+If file "lincan/Standalone.mk" is found, the driver does not
+require OCERA framework. The compile for 2.2.19, 2.4.19,
+2.6.0-t4 and OCERA target tested.
+
+Members: 
+       Makefile:1.6->1.7 
+       TODO:1.5->1.6 
+       src/Makefile:1.8->1.9 
+
+---------------------
+PatchSet 13 
+Date: 2003/09/23 12:40:14
+Author: pagnin
+Branch: HEAD
+Tag: (none) 
+Log:
+Added Fixes to the CAN and ORTE Components Tree.
+Now It should compile and NOT compile if deselected.
+
+Members: 
+       Makefile:1.7->1.8 
+
+---------------------
+PatchSet 14 
+Date: 2003/10/26 17:46:22
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for local message processing and some cleanups.
+The local messages processing feature suggested by Unicontrols.
+Driver can be directed by "processlocal" parameter to
+distribute sent messages back to the local clients.
+Values 0 .. disabled, 1 .. can be enabled by CANQUE_FILT IOCTL,
+2 .. enabled by default, but can be specified on per queue as well.
+
+Members: 
+       include/can.h:1.6->1.7 
+       include/can_queue.h:1.6->1.7 
+       include/main.h:1.8->1.9 
+       src/can_queue.c:1.7->1.8 
+       src/i82527.c:1.5->1.6 
+       src/ioctl.c:1.5->1.6 
+       src/main.c:1.7->1.8 
+       src/read.c:1.6->1.7 
+       src/sja1000.c:1.5->1.6 
+       src/sja1000p.c:1.6->1.7 
+       src/write.c:1.5->1.6 
+       utils/readburst.c:1.5->1.6 
+
+---------------------
+PatchSet 15 
+Date: 2003/10/26 22:38:14
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated "sendburst" utility to reflect enhancements in in "readburst".
+
+Members: 
+       utils/sendburst.c:1.5->1.6 
+
+---------------------
+PatchSet 16 
+Date: 2003/10/26 22:55:32
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Comment corrected for documentation generation.
+
+Members: 
+       include/can_queue.h:1.7->1.8 
+
+---------------------
+PatchSet 17 
+Date: 2003/11/05 02:44:22
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Header-files cleanup and CAN queue edges and ends locking reimplemented.
+The code has been updated and tested with 2.6.0-test9 as well.
+Default asynchronous close does not wait for transmission of the
+messages left in the Tx FIFOs. ENDS dispose is delayed in such case.
+Virtual chip driver can model bus latency if nonzero baudrate is selected.
+
+Members: 
+       include/can_queue.h:1.8->1.9 
+       include/can_sysdep.h:INITIAL->1.1 
+       include/constants.h:1.5->1.6 
+       include/devcommon.h:1.5->1.6 
+       include/finish.h:INITIAL->1.1 
+       include/main.h:1.9->1.10 
+       include/setup.h:1.5->1.6 
+       src/Makefile:1.9->1.10 
+       src/aim104.c:1.6->1.7 
+       src/bfadcan.c:1.6->1.7 
+       src/boardlist.c:1.1->1.2 
+       src/can_quekern.c:INITIAL->1.1 
+       src/can_queue.c:1.8->1.9 
+       src/cc_can104.c:1.6->1.7 
+       src/close.c:1.5->1.6 
+       src/devcommon.c:1.5->1.6 
+       src/finish.c:INITIAL->1.1 
+       src/i82527.c:1.6->1.7 
+       src/ioctl.c:1.6->1.7 
+       src/irq.c:1.5->1.6 
+       src/m437.c:1.7->1.8 
+       src/main.c:1.8->1.9 
+       src/modparms.c:1.6->1.7 
+       src/nsi.c:1.5->1.6 
+       src/open.c:1.5->1.6 
+       src/pc_i03.c:1.6->1.7 
+       src/pccan.c:1.5->1.6 
+       src/pcccan.c:1.6->1.7 
+       src/pcm3680.c:1.7->1.8 
+       src/pikronisa.c:1.7->1.8 
+       src/pip.c:1.5->1.6 
+       src/proc.c:1.5->1.6 
+       src/read.c:1.7->1.8 
+       src/select.c:1.5->1.6 
+       src/setup.c:1.7->1.8 
+       src/sja1000.c:1.6->1.7 
+       src/sja1000p.c:1.7->1.8 
+       src/smartcan.c:1.5->1.6 
+       src/ssv.c:1.5->1.6 
+       src/template.c:1.6->1.7 
+       src/virtual.c:1.2->1.3 
+       src/write.c:1.6->1.7 
+       utils/Makefile:1.6->1.7 
+       utils/sendburst.c:1.6->1.7 
+
+---------------------
+PatchSet 18 
+Date: 2003/11/18 13:47:17
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Edge and ends structures equipped with single purpose outlist.
+This additional list enlarges structures about 8 bytes, but
+it is big help for asynchronous dispose of the ends.
+This breaks last spinlock_irqsave holding loops and simplifies
+edge handling logic.
+
+Members: 
+       include/can_queue.h:1.9->1.10 
+       src/can_quekern.c:1.1->1.2 
+       src/can_queue.c:1.9->1.10 
+
+---------------------
+PatchSet 19 
+Date: 2003/11/19 00:31:18
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for fasync system call and replacement of spinXXX by can_spinXXX
+
+Members: 
+       include/can_queue.h:1.10->1.11 
+       include/can_sysdep.h:1.1->1.2 
+       include/fasync.h:INITIAL->1.1 
+       include/main.h:1.10->1.11 
+       src/Makefile:1.10->1.11 
+       src/bfadcan.c:1.7->1.8 
+       src/can_quekern.c:1.2->1.3 
+       src/can_queue.c:1.10->1.11 
+       src/close.c:1.6->1.7 
+       src/devcommon.c:1.6->1.7 
+       src/fasync.c:INITIAL->1.1 
+       src/finish.c:1.1->1.2 
+       src/i82527.c:1.7->1.8 
+       src/main.c:1.9->1.10 
+       src/read.c:1.8->1.9 
+       src/select.c:1.6->1.7 
+       src/sja1000.c:1.7->1.8 
+       src/sja1000p.c:1.8->1.9 
+       src/virtual.c:1.3->1.4 
+
+---------------------
+PatchSet 20 
+Date: 2003/11/27 01:11:03
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN_pre_omake_inclusion 
+Log:
+Correction for GCC-2.95.3
+
+Members: 
+       src/fasync.c:1.1->1.2 
+
+---------------------
+PatchSet 21 
+Date: 2003/12/23 00:50:14
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added missing spin-lock initialization and minor Makefiles update.
+
+Members: 
+       Makefile:1.8->1.9 
+       src/Makefile:1.11->1.12 
+       src/can_quekern.c:1.3->1.4 
+       utils/Makefile:1.7->1.8 
+
+---------------------
+PatchSet 22 
+Date: 2003/12/29 01:08:01
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Non-OMK Makefiles for LINCAN preserved and renamed to Makefile.std.
+
+Members: 
+       Makefile.std:INITIAL->1.1 
+       src/Makefile.std:INITIAL->1.1 
+       utils/Makefile.std:INITIAL->1.1 
+
+---------------------
+PatchSet 23 
+Date: 2003/12/29 01:42:50
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Main OMK conversion step for CAN components. Recent MAKE program is required !!!
+The updated and new CAN components are committed into OCERA CVS now.
+The integration is not fully finished yet.
+New OMK make-system build all object code out of sources directory
+(in the OCERA top-level "build" directory).
+Compiled libraries, headers, programs and modules are stored into
+OCERA top-level directory "compiled".
+
+Please: excuse probable problems caused by massive changes.
+        Critique and constructive suggestions are welcome.
+
+Members: 
+       Makefile:1.9->1.10 
+       Makefile.omk:INITIAL->1.1 
+       src/Makefile:1.12->1.13 
+       src/Makefile.omk:INITIAL->1.1 
+       src/boardlist.c:1.2->1.3 
+       src/supported_cards.h:INITIAL->1.1 
+       utils/Makefile:1.8->1.9 
+       utils/Makefile.omk:INITIAL->1.1 
+
+---------------------
+PatchSet 24 
+Date: 2004/01/01 22:54:26
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+LinCAN can be compiled in mode with RT-Linux chip worker threads now.
+Setup tested to work with Virtual and PCM3680 boards now.
+
+Members: 
+       include/can_queue.h:1.11->1.12 
+       include/can_sysdep.h:1.2->1.3 
+       include/constants.h:1.6->1.7 
+       include/i82527.h:1.5->1.6 
+       include/irq.h:1.5->1.6 
+       include/main.h:1.11->1.12 
+       include/setup.h:1.6->1.7 
+       include/sja1000.h:1.5->1.6 
+       src/Makefile.omk:1.1->1.2 
+       src/aim104.c:1.7->1.8 
+       src/bfadcan.c:1.8->1.9 
+       src/can_devrtl.c:INITIAL->1.1 
+       src/can_quekern.c:1.4->1.5 
+       src/can_quertl.c:INITIAL->1.1 
+       src/can_queue.c:1.11->1.12 
+       src/cc_can104.c:1.7->1.8 
+       src/close.c:1.7->1.8 
+       src/devcommon.c:1.7->1.8 
+       src/finish.c:1.2->1.3 
+       src/i82527.c:1.8->1.9 
+       src/irq.c:1.6->1.7 
+       src/m437.c:1.8->1.9 
+       src/main.c:1.10->1.11 
+       src/nsi.c:1.6->1.7 
+       src/open.c:1.6->1.7 
+       src/pc_i03.c:1.7->1.8 
+       src/pccan.c:1.6->1.7 
+       src/pcccan.c:1.7->1.8 
+       src/pcm3680.c:1.8->1.9 
+       src/pikronisa.c:1.8->1.9 
+       src/pip.c:1.6->1.7 
+       src/setup.c:1.8->1.9 
+       src/sja1000.c:1.8->1.9 
+       src/sja1000p.c:1.9->1.10 
+       src/smartcan.c:1.6->1.7 
+       src/ssv.c:1.6->1.7 
+       src/template.c:1.7->1.8 
+       src/virtual.c:1.4->1.5 
+
+---------------------
+PatchSet 25 
+Date: 2004/01/04 00:09:32
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added full RT-Linux POSIX interface to LinCAN driver, needs preparation of RT tests.
+Linux-only and RT-Linux chip thread based version passed Linux users-pace
+tests on PCM3680 and PiKRON ISA cards.
+Fundamental design flaws found in rtl_posixio.c concerning concurrent open
+and/or close processing. There is even bug if open fails reaction.
+The fiels private_data should be added to structure rtl_file.
+
+Members: 
+       include/can_iortl.h:INITIAL->1.1 
+       include/can_queue.h:1.12->1.13 
+       include/can_sysdep.h:1.3->1.4 
+       include/constants.h:1.7->1.8 
+       include/main.h:1.12->1.13 
+       src/Makefile.omk:1.2->1.3 
+       src/can_quekern.c:1.5->1.6 
+       src/can_quertl.c:1.1->1.2 
+       src/close.c:1.8->1.9 
+       src/close_rtl.c:INITIAL->1.1 
+       src/ioctl.c:1.7->1.8 
+       src/ioctl_rtl.c:INITIAL->1.1 
+       src/main.c:1.11->1.12 
+       src/open.c:1.7->1.8 
+       src/open_rtl.c:INITIAL->1.1 
+       src/read.c:1.9->1.10 
+       src/read_rtl.c:INITIAL->1.1 
+       src/write.c:1.7->1.8 
+       src/write_rtl.c:INITIAL->1.1 
+
+---------------------
+PatchSet 26 
+Date: 2004/01/04 15:53:14
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added RT-Linux version of sendburst and readburst utilities.
+It worked on the first try with previously committed LinCAN RTL changes :-).
+Corrected one forgotten line in ioctl_rtl.c => filters work from RT-linux
+same way as from Linux user-space applications.
+
+Members: 
+       src/Makefile.omk:1.3->1.4 
+       src/ioctl_rtl.c:1.1->1.2 
+       src/main.c:1.12->1.13 
+       utils/Makefile.omk:1.1->1.2 
+       utils/readburst_rtl.c:INITIAL->1.1 
+       utils/sendburst_rtl.c:INITIAL->1.1 
+
+---------------------
+PatchSet 27 
+Date: 2004/01/16 01:53:19
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for KVASER PCICAN-S/D/Q cards.
+
+Members: 
+       include/can_sysdep.h:1.4->1.5 
+       include/main.h:1.13->1.14 
+       src/Makefile.omk:1.4->1.5 
+       src/Makefile.std:1.1->1.2 
+       src/boardlist.c:1.3->1.4 
+       src/kv_pcican.c:INITIAL->1.1 
+       src/main.c:1.13->1.14 
+
+---------------------
+PatchSet 28 
+Date: 2004/01/18 22:40:32
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Rearranged setup to better support cards with irq count differing from chip count.
+Checked compilation with 2.2.19 kernel. Functionality with 2.2.x not checked.
+
+Members: 
+       include/can_sysdep.h:1.5->1.6 
+       include/constants.h:1.8->1.9 
+       include/main.h:1.14->1.15 
+       src/can_devrtl.c:1.1->1.2 
+       src/kv_pcican.c:1.1->1.2 
+       src/main.c:1.14->1.15 
+       src/setup.c:1.9->1.10 
+       src/virtual.c:1.5->1.6 
+
+---------------------
+PatchSet 29 
+Date: 2004/01/19 22:34:42
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+ORTE added into path of toplevel make.
+
+Members: 
+       src/supported_cards.h:1.1->1.2 
+
+---------------------
+PatchSet 30 
+Date: 2004/01/23 04:10:51
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added missing indication CAN_ENDSF_MEM_RTL for RTL pool malloc.
+This fixes serious bug in RTL LinCAN mode.
+Some more small updates added.
+The call canque_notify_bothends(edge,CANQUEUE_NOTIFY_NOUSR)
+invoked without locks hold now.
+
+Members: 
+       README:1.5->1.6 
+
+---------------------
+PatchSet 31 
+Date: 2004/01/23 04:18:30
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added missing indication CAN_ENDSF_MEM_RTL for RTL pool malloc.
+This fixes serious bug in RTL LinCAN mode.
+Some more small updates added.
+The call canque_notify_bothends(edge,CANQUEUE_NOTIFY_NOUSR)
+invoked without locks hold now.
+
+Members: 
+       include/can_queue.h:1.13->1.14 
+       src/can_quekern.c:1.6->1.7 
+       src/can_quertl.c:1.2->1.3 
+       src/can_queue.c:1.12->1.13 
+       src/open_rtl.c:1.1->1.2 
+       utils/readburst_rtl.c:1.1->1.2 
+       utils/sendburst_rtl.c:1.1->1.2 
+
+---------------------
+PatchSet 32 
+Date: 2004/02/08 14:56:15
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+LinCAN driver structured comments updated.
+
+Members: 
+       include/can_queue.h:1.14->1.15 
+       include/can_sysdep.h:1.6->1.7 
+       include/main.h:1.15->1.16 
+       src/can_devrtl.c:1.2->1.3 
+       src/can_quekern.c:1.7->1.8 
+       src/can_quertl.c:1.3->1.4 
+       src/devcommon.c:1.8->1.9 
+       src/finish.c:1.3->1.4 
+       src/main.c:1.15->1.16 
+       src/setup.c:1.10->1.11 
+
+---------------------
+PatchSet 33 
+Date: 2004/02/17 23:38:17
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Small changes to fix GCC-2.95.3 compilation and strict headers separation.
+The GCC option -nostdinc is used to ensure that default user-space includes
+are not mistakenly read by RT-Linux or Linux kernel targets compilation.
+The standard headers as "string.h" are allowed by addition of
+$(LINUX_DIR)/include/linux path.
+
+Members: 
+       utils/send.c:1.5->1.6 
+
+---------------------
+PatchSet 34 
+Date: 2004/02/20 03:49:01
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN_pre_canmsg_change 
+Log:
+OMK makefiles updated to support OCERA Qconf tool.
+The new rule (default-config) added to generate
+"config.omk-default" file. This file can be used as is
+or can be edited and saved into "config.omk" file.
+If "config.omk" exists, it is preferred over "config.omk-default"
+file.
+
+Members: 
+       src/Makefile.omk:1.5->1.6 
+       src/main.c:1.16->1.17 
+       utils/Makefile.omk:1.2->1.3 
+
+---------------------
+PatchSet 35 
+Date: 2004/02/21 21:24:47
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN_post_canmsg_change 
+Log:
+Change to CAN_MSG_VERSION_2 and elimination of linux/*.h headers from user space apps.
+Layout of canmsg_t changed to CAN_MSG_VERSION_2, which is compatible
+with PORT GmbH <http://www.port.de/> can4linux-3.1 implementation.
+The driver and utilities can be compiled with old version,
+if definition of CAN_MSG_VERSION_2 is commented out in
+lincan/include/canmsg.h and canvca/libvca/canmsg.h headers.
+
+The change from __u8 .. __u32 types to standard compliant u_int8_t .. u_int32_t
+types has been required to eliminate linux/*.h files. This can make
+problems to ancient Linux distributions and some workaround could
+be necessary.
+
+Members: 
+       include/can.h:1.7->1.8 
+       include/can_queue.h:1.15->1.16 
+       include/canmsg.h:INITIAL->1.1 
+       include/constants.h:1.9->1.10 
+       include/devcommon.h:1.6->1.7 
+       src/main.c:1.17->1.18 
+       src/sja1000.c:1.9->1.10 
+       utils/can-proxy.c:1.5->1.6 
+       utils/readburst.c:1.6->1.7 
+       utils/readburst_rtl.c:1.2->1.3 
+       utils/rxtx.c:1.5->1.6 
+       utils/send.c:1.6->1.7 
+       utils/sendburst.c:1.7->1.8 
+       utils/sendburst_rtl.c:1.2->1.3 
+
+---------------------
+PatchSet 36 
+Date: 2004/03/03 00:38:01
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added individual Kconfig for CAN and ORTE components.
+Work is based on the proposal and initial version done by Pierre.
+The option names has been preserved from the previous Kconfig version.
+This means, that compilation should work correctly with actual Kconfig
+and with new one after upper level Kconfig changes.
+
+IRQ manipulation changed to spin-locks for rest of boards
+to support better RT-Linux.
+
+Members: 
+       src/bfadcan.c:1.9->1.10 
+       src/nsi.c:1.7->1.8 
+       src/pcccan.c:1.8->1.9 
+       src/smartcan.c:1.7->1.8 
+       src/ssv.c:1.7->1.8 
+
+---------------------
+PatchSet 37 
+Date: 2004/03/04 18:02:41
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added QUERY ioctl command for checking of driver version and message formats.
+
+Members: 
+       include/can.h:1.8->1.9 
+       include/constants.h:1.10->1.11 
+       include/ioctl.h:1.5->1.6 
+       src/Makefile.omk:1.6->1.7 
+       src/Makefile.std:1.2->1.3 
+       src/ioctl.c:1.8->1.9 
+       src/ioctl_rtl.c:1.2->1.3 
+       utils/readburst.c:1.7->1.8 
+
+---------------------
+PatchSet 38 
+Date: 2004/03/04 18:38:59
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_2-040304 
+Log:
+Missing file added.
+
+Members: 
+       src/ioctl_query.c:INITIAL->1.1 
+
+---------------------
+PatchSet 39 
+Date: 2004/03/09 18:16:23
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added initial version of MSMCAN card support into LinCAN driver.
+Code has not been tested with real hardware yet.
+
+Members: 
+       include/msmcan.h:INITIAL->1.1 
+       src/Makefile.omk:1.7->1.8 
+       src/Makefile.std:1.3->1.4 
+       src/boardlist.c:1.4->1.5 
+       src/msmcan.c:INITIAL->1.1 
+       src/supported_cards.h:1.2->1.3 
+
+---------------------
+PatchSet 40 
+Date: 2004/03/14 00:13:31
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Interconnected OCERA configuration options with LinCAN boardlist.c compilation.
+
+Members: 
+       include/unican_cl2.h:INITIAL->1.1 
+       src/Makefile.omk:1.8->1.9 
+       src/Makefile.std:1.4->1.5 
+       src/boardlist.c:1.5->1.6 
+       src/supported_cards.h:1.3->1.4(DEAD) 
+       src/unican_cl2.c:INITIAL->1.1 
+       utils/Makefile.omk:1.3->1.4 
+
+---------------------
+PatchSet 41 
+Date: 2004/03/14 00:58:31
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Implemented selection of simplified IO access methods (port or mem only).
+
+Members: 
+       include/main.h:1.16->1.17 
+       src/Makefile.std:1.5->1.6 
+
+---------------------
+PatchSet 42 
+Date: 2004/03/16 16:14:52
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Cleaned-up PROC handling and checked on 2.4, 2.4-RT, 2.6 and compilation for 2.2 kernels.
+
+Members: 
+       src/Makefile.std:1.6->1.7 
+       src/proc.c:1.6->1.7 
+
+---------------------
+PatchSet 43 
+Date: 2004/03/18 02:27:02
+Author: ppisa
+Branch: HEAD
+Tag: ocera-1_0_0-release 
+Log:
+Corrected typo in Kconfig (OC_LINCAN_CARD_bfad -> OC_LINCAN_CARD_bfadcan)
+and leaved out LinCAN sources "can_quertl.c" and "can_devrtl.c"
+from standard Linux compilation mode without RT-Linux support.
+
+Members: 
+       src/Makefile.omk:1.9->1.10 
+
+---------------------
+PatchSet 44 
+Date: 2004/03/21 15:04:41
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated Intel 82527 support and added feeding of MSMCAN secret and hidden watchdog.
+
+Members: 
+       src/i82527.c:1.9->1.10 
+       src/msmcan.c:1.1->1.2 
+
+---------------------
+PatchSet 45 
+Date: 2004/03/21 18:07:51
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Intel 82527 chip now configures acceptance identifiers and mask 15 according to edges.
+
+Members: 
+       include/can_queue.h:1.16->1.17 
+       include/constants.h:1.11->1.12 
+       include/main.h:1.17->1.18 
+       src/can_queue.c:1.13->1.14 
+       src/devcommon.c:1.9->1.10 
+       src/i82527.c:1.10->1.11 
+       src/setup.c:1.11->1.12 
+
+---------------------
+PatchSet 46 
+Date: 2004/03/21 18:48:04
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added glue required for RTL hardware filters updates.
+
+Members: 
+       src/can_devrtl.c:1.3->1.4 
+       src/devcommon.c:1.10->1.11 
+       src/i82527.c:1.11->1.12 
+       src/sja1000p.c:1.10->1.11 
+       src/virtual.c:1.6->1.7 
+
+---------------------
+PatchSet 47 
+Date: 2004/03/21 19:43:30
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Structured comments updated.
+
+Members: 
+       include/main.h:1.18->1.19 
+       src/can_queue.c:1.14->1.15 
+
+---------------------
+PatchSet 48 
+Date: 2004/03/21 21:58:34
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated for MSMCAN.
+
+Members: 
+       README:1.6->1.7 
+
+---------------------
+PatchSet 49 
+Date: 2004/03/28 14:36:53
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+One of many steps to support Unicontrols CAN cards.
+
+Members: 
+       include/unican_cl2.h:1.1->1.2 
+       include/unican_types.h:INITIAL->1.1 
+       src/Makefile.omk:1.10->1.11 
+       src/boardlist.c:1.6->1.7 
+       src/unican.c:INITIAL->1.1 
+       src/unican_cl2.c:1.1->1.2 
+
+---------------------
+PatchSet 50 
+Date: 2004/04/05 00:43:27
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for Unicontrols PCAN cards series and baudrate setting.
+PCAN support has been tested on PCAN104 card for Linux only
+and Linux/RT-Linux driver compilation mode. There are many
+unimplemented features still.
+
+Members: 
+       include/can.h:1.9->1.10 
+       include/main.h:1.19->1.20 
+       src/ioctl.c:1.9->1.10 
+       src/unican.c:1.1->1.2 
+
+---------------------
+PatchSet 51 
+Date: 2004/04/06 10:16:30
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for Unicontrols PCI CAN card.
+Will be tested, when I get to the hardware at school.
+
+Members: 
+       include/can_sysdep.h:1.7->1.8 
+       include/main.h:1.20->1.21 
+       src/boardlist.c:1.7->1.8 
+       src/kv_pcican.c:1.2->1.3 
+       src/setup.c:1.12->1.13 
+       src/unican.c:1.2->1.3 
+       src/write.c:1.8->1.9 
+       src/write_rtl.c:1.1->1.2 
+
+---------------------
+PatchSet 52 
+Date: 2004/04/19 00:50:39
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Rearranged tests in canque_test_outslot for faster and more optimal behavior.
+Some tests required additional loop for EMPTY and DEAD edge states.
+
+Members: 
+       src/can_queue.c:1.15->1.16 
+
+---------------------
+PatchSet 53 
+Date: 2004/04/26 19:37:55
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+unican specific readw and writew
+
+Members: 
+       include/unican_types.h:1.1->1.2 
+       src/unican.c:1.3->1.4 
+
+---------------------
+PatchSet 54 
+Date: 2004/04/27 16:28:59
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+VME support is in a separate file
+
+Members: 
+       src/unican_vme.c:INITIAL->1.1 
+
+---------------------
+PatchSet 55 
+Date: 2004/04/27 16:34:15
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Added skeleton of IRQ support on VME bus
+
+Members: 
+       include/constants.h:1.12->1.13 
+       src/setup.c:1.13->1.14 
+
+---------------------
+PatchSet 56 
+Date: 2004/04/27 16:54:09
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Added definition of unican_readw and unican_writew for PowerPC
+
+Members: 
+       include/unican_types.h:1.2->1.3 
+
+---------------------
+PatchSet 57 
+Date: 2004/04/27 16:55:49
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+VME support moved to a separate file
+
+Members: 
+       src/unican.c:1.4->1.5 
+
+---------------------
+PatchSet 58 
+Date: 2004/04/27 16:56:55
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Added option for VME bus support
+
+Members: 
+       include/can_sysdep.h:1.8->1.9 
+       src/Makefile.omk:1.11->1.12 
+
+---------------------
+PatchSet 59 
+Date: 2004/04/27 17:01:29
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Removed debugging options commited by a mistake.
+
+Members: 
+       src/Makefile.omk:1.12->1.13 
+
+---------------------
+PatchSet 60 
+Date: 2004/04/27 17:31:05
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Definition of VME support symbol was moved to main.h where lincan_config.h is available
+
+Members: 
+       include/can_sysdep.h:1.9->1.10 
+
+---------------------
+PatchSet 61 
+Date: 2004/04/27 17:34:39
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Definition of VME support symbol was moved here from can_sysdep.h
+
+Members: 
+       include/main.h:1.21->1.22 
+
+---------------------
+PatchSet 62 
+Date: 2004/04/28 01:18:11
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Moved inclussion of lincan_config.h to can_sysdep.h
+
+Members: 
+       include/can_sysdep.h:1.10->1.11 
+       include/main.h:1.22->1.23 
+       src/boardlist.c:1.8->1.9 
+
+---------------------
+PatchSet 63 
+Date: 2004/04/28 16:39:05
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Fixed order of enabling IRQ. It must be done after board reset.
+
+Members: 
+       src/unican_vme.c:1.1->1.2 
+
+---------------------
+PatchSet 64 
+Date: 2004/04/30 09:42:08
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Added unican card to default config.
+
+Members: 
+       src/Makefile.std:1.7->1.8 
+
+---------------------
+PatchSet 65 
+Date: 2004/04/30 10:00:34
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+*** empty log message ***
+
+Members: 
+       src/Makefile.std:1.8->1.9 
+
+---------------------
+PatchSet 66 
+Date: 2004/05/01 09:41:17
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_2_2 
+Log:
+Preparation to the new LinCAN 0.2.2 release
+
+Members: 
+       include/constants.h:1.13->1.14 
+
+---------------------
+PatchSet 67 
+Date: 2004/05/08 01:06:34
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+New file for EMS CPC-PCI card added. This card requires more changes
+and documentation to get work.
+
+Members: 
+       src/Makefile.omk:1.13->1.14 
+       src/boardlist.c:1.9->1.10 
+       src/ems_cpcpci.c:INITIAL->1.1 
+
+---------------------
+PatchSet 68 
+Date: 2004/06/01 00:54:48
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added switch-omk2std script to simple switch from OMK to standard Makefiles
+
+Members: 
+       switch-omk2std:INITIAL->1.1 
+       src/Makefile.std:1.9->1.10 
+
+---------------------
+PatchSet 69 
+Date: 2004/06/05 15:41:17
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added functions to flush all messages in edges connected to one ends structure
+
+Members: 
+       include/can_queue.h:1.17->1.18 
+       src/can_queue.c:1.16->1.17 
+
+---------------------
+PatchSet 70 
+Date: 2004/06/06 03:23:21
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The first phase of integration of Hynix HMS30c7202 C_CAN support
+
+Members: 
+       include/c_can.h:INITIAL->1.1 
+       include/constants.h:1.14->1.15 
+       include/hms30c7202_can.h:INITIAL->1.1 
+       include/main.h:1.23->1.24 
+       src/c_can.c:INITIAL->1.1 
+       src/c_can_irq.c:INITIAL->1.1 
+       src/hms30c7202_can.c:INITIAL->1.1 
+       src/i82527.c:1.12->1.13 
+       src/pcm3680.c:1.9->1.10 
+       src/unican.c:1.5->1.6 
+
+---------------------
+PatchSet 71 
+Date: 2004/06/06 10:17:11
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changed data size from byte to unsigned for write_register indirect call
+This is required for the support of the cards connected to the wider
+bus architecture. This should not have negative impact, because
+char has been propagated to int by C call convention anyway.
+The global inline canobj_write_reg function has been left intact
+(byte only), because it could better optimize for static call case.
+
+Members: 
+       include/aim104.h:1.5->1.6 
+       include/c_can.h:1.1->1.2 
+       include/cc_can104.h:1.5->1.6 
+       include/hms30c7202_can.h:1.1->1.2 
+       include/m437.h:1.5->1.6 
+       include/main.h:1.24->1.25 
+       include/msmcan.h:1.1->1.2 
+       include/nsi.h:1.5->1.6 
+       include/pc-i03.h:1.5->1.6 
+       include/pccan.h:1.5->1.6 
+       include/pcccan.h:1.5->1.6 
+       include/pcm3680.h:1.5->1.6 
+       include/pikronisa.h:1.5->1.6 
+       include/pip.h:1.5->1.6 
+       include/smartcan.h:1.5->1.6 
+       include/ssv.h:1.5->1.6 
+       include/template.h:1.5->1.6 
+       src/aim104.c:1.8->1.9 
+       src/bfadcan.c:1.10->1.11 
+       src/cc_can104.c:1.8->1.9 
+       src/ems_cpcpci.c:1.1->1.2 
+       src/hms30c7202_can.c:1.1->1.2 
+       src/kv_pcican.c:1.3->1.4 
+       src/m437.c:1.9->1.10 
+       src/msmcan.c:1.2->1.3 
+       src/nsi.c:1.8->1.9 
+       src/pc_i03.c:1.8->1.9 
+       src/pccan.c:1.7->1.8 
+       src/pcccan.c:1.9->1.10 
+       src/pcm3680.c:1.10->1.11 
+       src/pikronisa.c:1.9->1.10 
+       src/pip.c:1.7->1.8 
+       src/smartcan.c:1.8->1.9 
+       src/ssv.c:1.8->1.9 
+       src/template.c:1.8->1.9 
+
+---------------------
+PatchSet 72 
+Date: 2004/06/08 11:30:54
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Comment updated.
+
+Members: 
+       src/ems_cpcpci.c:1.2->1.3 
+
+---------------------
+PatchSet 73 
+Date: 2004/06/14 15:23:25
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Finished PCI Unicontrols card memory range initialization.
+There are still problems with CL2 cl2_test_card timing.
+
+Members: 
+       src/unican.c:1.6->1.7 
+
+---------------------
+PatchSet 74 
+Date: 2004/06/16 17:52:49
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added delay required by Unican PCI cards detection code.
+This is clumsy workaround for hardware misfeature.
+
+Members: 
+       src/unican_cl2.c:1.2->1.3 
+
+---------------------
+PatchSet 75 
+Date: 2004/06/16 19:53:56
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added prefix sja to all sjaXX_YY register bit-fields definitions.
+Changed to solve ARM-linux kernel and LinCAN name collision.
+
+Members: 
+       include/sja1000.h:1.6->1.7 
+       include/sja1000p.h:1.5->1.6 
+       src/Makefile.std:1.10->1.11 
+       src/aim104.c:1.9->1.10 
+       src/bfadcan.c:1.11->1.12 
+       src/c_can.c:1.1->1.2 
+       src/c_can_irq.c:1.1->1.2 
+       src/cc_can104.c:1.9->1.10 
+       src/ems_cpcpci.c:1.3->1.4 
+       src/hms30c7202_can.c:1.2->1.3 
+       src/kv_pcican.c:1.4->1.5 
+       src/m437.c:1.10->1.11 
+       src/pc_i03.c:1.9->1.10 
+       src/pccan.c:1.8->1.9 
+       src/pcccan.c:1.10->1.11 
+       src/pcm3680.c:1.11->1.12 
+       src/pikronisa.c:1.10->1.11 
+       src/sja1000.c:1.10->1.11 
+       src/sja1000p.c:1.11->1.12 
+       src/template.c:1.9->1.10 
+
+---------------------
+PatchSet 76 
+Date: 2004/06/17 16:09:43
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+LinCAN version updated to 0.3
+
+Members: 
+       CREDITS:1.5->1.6 
+       include/aim104.h:1.6->1.7 
+       include/c_can.h:1.2->1.3 
+       include/can.h:1.10->1.11 
+       include/can_iortl.h:1.1->1.2 
+       include/can_queue.h:1.18->1.19 
+       include/can_sysdep.h:1.11->1.12 
+       include/canmsg.h:1.1->1.2 
+       include/cc_can104.h:1.6->1.7 
+       include/close.h:1.5->1.6 
+       include/constants.h:1.15->1.16 
+       include/devcommon.h:1.7->1.8 
+       include/fasync.h:1.1->1.2 
+       include/finish.h:1.1->1.2 
+       include/hms30c7202_can.h:1.2->1.3 
+       include/i82527.h:1.6->1.7 
+       include/ioctl.h:1.6->1.7 
+       include/irq.h:1.6->1.7 
+       include/m437.h:1.6->1.7 
+       include/main.h:1.25->1.26 
+       include/modparms.h:1.5->1.6 
+       include/msmcan.h:1.2->1.3 
+       include/nsi.h:1.6->1.7 
+       include/open.h:1.5->1.6 
+       include/pc-i03.h:1.6->1.7 
+       include/pccan.h:1.6->1.7 
+       include/pcccan.h:1.6->1.7 
+       include/pcm3680.h:1.6->1.7 
+       include/pikronisa.h:1.6->1.7 
+       include/pip.h:1.6->1.7 
+       include/proc.h:1.5->1.6 
+       include/read.h:1.5->1.6 
+       include/select.h:1.5->1.6 
+       include/setup.h:1.7->1.8 
+       include/sja1000.h:1.7->1.8 
+       include/sja1000p.h:1.6->1.7 
+       include/smartcan.h:1.6->1.7 
+       include/ssv.h:1.6->1.7 
+       include/template.h:1.6->1.7 
+       include/write.h:1.5->1.6 
+       src/Makefile.std:1.11->1.12 
+       src/aim104.c:1.10->1.11 
+       src/bfadcan.c:1.12->1.13 
+       src/boardlist.c:1.10->1.11 
+       src/c_can.c:1.2->1.3 
+       src/c_can_irq.c:1.2->1.3 
+       src/can_devrtl.c:1.4->1.5 
+       src/can_quekern.c:1.8->1.9 
+       src/can_quertl.c:1.4->1.5 
+       src/can_queue.c:1.17->1.18 
+       src/cc_can104.c:1.10->1.11 
+       src/close.c:1.9->1.10 
+       src/close_rtl.c:1.1->1.2 
+       src/devcommon.c:1.11->1.12 
+       src/ems_cpcpci.c:1.4->1.5 
+       src/fasync.c:1.2->1.3 
+       src/finish.c:1.4->1.5 
+       src/hms30c7202_can.c:1.3->1.4 
+       src/i82527.c:1.13->1.14 
+       src/ioctl.c:1.10->1.11 
+       src/ioctl_query.c:1.1->1.2 
+       src/ioctl_rtl.c:1.3->1.4 
+       src/irq.c:1.7->1.8 
+       src/kv_pcican.c:1.5->1.6 
+       src/m437.c:1.11->1.12 
+       src/main.c:1.18->1.19 
+       src/modparms.c:1.7->1.8 
+       src/msmcan.c:1.3->1.4 
+       src/nsi.c:1.9->1.10 
+       src/open.c:1.8->1.9 
+       src/open_rtl.c:1.2->1.3 
+       src/pc_i03.c:1.10->1.11 
+       src/pccan.c:1.9->1.10 
+       src/pcccan.c:1.11->1.12 
+       src/pcm3680.c:1.12->1.13 
+       src/pikronisa.c:1.11->1.12 
+       src/pip.c:1.8->1.9 
+       src/proc.c:1.7->1.8 
+       src/read.c:1.10->1.11 
+       src/read_rtl.c:1.1->1.2 
+       src/select.c:1.7->1.8 
+       src/setup.c:1.14->1.15 
+       src/sja1000.c:1.11->1.12 
+       src/sja1000p.c:1.12->1.13 
+       src/smartcan.c:1.9->1.10 
+       src/ssv.c:1.9->1.10 
+       src/template.c:1.10->1.11 
+       src/unican.c:1.7->1.8 
+       src/unican_vme.c:1.2->1.3 
+       src/virtual.c:1.7->1.8 
+       src/write.c:1.9->1.10 
+       src/write_rtl.c:1.2->1.3 
+
+---------------------
+PatchSet 77 
+Date: 2004/06/17 17:28:24
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changed filling of the chip specific operations.
+This enables simpler fine tuning for specific boards
+which needs modified functions.
+ENS CPC-PCI requires special interrupt handling for example.
+
+Members: 
+       include/c_can.h:1.3->1.4 
+       include/constants.h:1.16->1.17 
+       include/i82527.h:1.7->1.8 
+       include/sja1000.h:1.8->1.9 
+       include/sja1000p.h:1.7->1.8 
+       src/aim104.c:1.11->1.12 
+       src/bfadcan.c:1.13->1.14 
+       src/c_can.c:1.3->1.4 
+       src/cc_can104.c:1.11->1.12 
+       src/ems_cpcpci.c:1.5->1.6 
+       src/hms30c7202_can.c:1.4->1.5 
+       src/i82527.c:1.14->1.15 
+       src/kv_pcican.c:1.6->1.7 
+       src/m437.c:1.12->1.13 
+       src/msmcan.c:1.4->1.5 
+       src/nsi.c:1.10->1.11 
+       src/pc_i03.c:1.11->1.12 
+       src/pccan.c:1.10->1.11 
+       src/pcccan.c:1.12->1.13 
+       src/pcm3680.c:1.13->1.14 
+       src/pikronisa.c:1.12->1.13 
+       src/pip.c:1.9->1.10 
+       src/setup.c:1.15->1.16 
+       src/sja1000.c:1.12->1.13 
+       src/sja1000p.c:1.13->1.14 
+       src/smartcan.c:1.10->1.11 
+       src/ssv.c:1.10->1.11 
+       src/template.c:1.11->1.12 
+       src/unican.c:1.8->1.9 
+
+---------------------
+PatchSet 78 
+Date: 2004/06/18 01:45:23
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+EMS CPC-PCI card support finished.
+Requires testing, some bugs and mistakes are very probable, because I have
+no access to the hardware..
+
+Members: 
+       src/ems_cpcpci.c:1.6->1.7 
+
+---------------------
+PatchSet 79 
+Date: 2004/06/18 01:57:39
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+CPC-PCI added to Makefile.std
+
+Members: 
+       src/Makefile.std:1.12->1.13 
+
+---------------------
+PatchSet 80 
+Date: 2004/06/18 22:07:09
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-pre_locking_udate 
+Log:
+Deleted unintentionally forgotten lines in CPC-PCI support causing kernel Oops.
+
+Members: 
+       src/ems_cpcpci.c:1.7->1.8 
+
+---------------------
+PatchSet 81 
+Date: 2004/06/24 13:10:44
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Correction of spinlock acquire order.
+BUGFIX of possible deadlock on real SMP systems in the
+canqueue functions. Significantly faster implementation
+of canque_edge_decref() implemented for systems
+defining CAN_HAVE_ARCH_CMPXCHG.
+
+Members: 
+       include/can_queue.h:1.19->1.20 
+       include/can_sysdep.h:1.12->1.13 
+       src/can_quekern.c:1.9->1.10 
+       src/can_queue.c:1.18->1.19 
+
+---------------------
+PatchSet 82 
+Date: 2004/06/24 14:15:18
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+More canqueue locking changes.
+
+Members: 
+       include/can_queue.h:1.20->1.21 
+       src/can_queue.c:1.19->1.20 
+
+---------------------
+PatchSet 83 
+Date: 2004/06/25 17:15:18
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Corrected CPC-PCI magic number check to not consider ID value.
+The ID value seems to be different between cards.
+
+Members: 
+       src/ems_cpcpci.c:1.8->1.9 
+
+---------------------
+PatchSet 84 
+Date: 2004/07/01 01:45:42
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Some problems fixup in RTR read mode in read system-call.
+This mode is there for compatibility reasons with old driver
+version and should be moved to its own IOCTL.
+
+Members: 
+       src/read.c:1.11->1.12 
+
+---------------------
+PatchSet 85 
+Date: 2004/07/02 00:26:41
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+CPC-PCI second chip IRQ corrected. Message timestamp code added.
+The timestamp code has some time overhead. If it is problem,
+it can be disabled in the main.h file.
+
+Members: 
+       include/can_sysdep.h:1.13->1.14 
+       include/main.h:1.26->1.27 
+       src/c_can_irq.c:1.3->1.4 
+       src/ems_cpcpci.c:1.9->1.10 
+       src/i82527.c:1.15->1.16 
+       src/sja1000.c:1.13->1.14 
+       src/sja1000p.c:1.14->1.15 
+       src/virtual.c:1.8->1.9 
+
+---------------------
+PatchSet 86 
+Date: 2004/07/06 23:15:34
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+README and TODO updated
+
+Members: 
+       README:1.7->1.8 
+       TODO:1.6->1.7 
+       include/canmsg.h:1.2->1.3 
+       src/ems_cpcpci.c:1.10->1.11 
+
+---------------------
+PatchSet 87 
+Date: 2004/07/16 15:44:20
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+EMS CPC-PCI fix correcting poorly undocumented PITA2 IRQ behavior.
+This workaround compiles only for 2.6.x kernels now and correct
+fix compatible with 2.4 requires driver wide changes.
+That is why CPC-PCI is not enabled by default.
+
+Members: 
+       src/Makefile.std:1.13->1.14 
+       src/ems_cpcpci.c:1.11->1.12 
+
+---------------------
+PatchSet 88 
+Date: 2004/07/16 15:57:38
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_2_8 
+Log:
+README CVS pointer corrected
+
+Members: 
+       README:1.8->1.9 
+
+---------------------
+PatchSet 89 
+Date: 2004/08/04 22:39:43
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+README updated
+
+Members: 
+       README:1.9->1.10 
+
+---------------------
+PatchSet 90 
+Date: 2004/08/23 15:40:30
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Adapted for modified version of VME bridge driver (ca91c042).
+
+Members: 
+       src/setup.c:1.16->1.17 
+       src/unican_vme.c:1.3->1.4 
+
+---------------------
+PatchSet 91 
+Date: 2004/08/25 02:59:51
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The first chunk to support for PEAK's LPT dongle adapter
+Code has been ported to LinCAN by Jose Pascual Ramirez
+(josepascual _AT_ almudi _DOT_ com).
+
+Members: 
+       include/pcan_dongle.h:INITIAL->1.1 
+       src/Makefile.std:1.14->1.15 
+       src/boardlist.c:1.11->1.12 
+       src/pcan_dongle.c:INITIAL->1.1 
+
+---------------------
+PatchSet 92 
+Date: 2004/08/30 03:06:43
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+First part of IRQ handling changes
+
+Members: 
+       include/c_can.h:1.4->1.5 
+       include/constants.h:1.17->1.18 
+       include/i82527.h:1.8->1.9 
+       include/irq.h:1.7->1.8 
+       include/main.h:1.27->1.28 
+       include/sja1000.h:1.9->1.10 
+       include/sja1000p.h:1.8->1.9 
+       src/c_can_irq.c:1.4->1.5 
+       src/ems_cpcpci.c:1.12->1.13 
+       src/i82527.c:1.16->1.17 
+       src/irq.c:1.8->1.9 
+       src/setup.c:1.17->1.18 
+       src/sja1000.c:1.14->1.15 
+       src/sja1000p.c:1.15->1.16 
+       src/unican.c:1.9->1.10 
+       src/virtual.c:1.9->1.10 
+
+---------------------
+PatchSet 93 
+Date: 2004/08/30 03:13:39
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Correction for RTL build
+
+Members: 
+       src/can_devrtl.c:1.5->1.6 
+
+---------------------
+PatchSet 94 
+Date: 2004/08/30 19:19:11
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+VME support modified to new interrupt handling scheme.
+
+Members: 
+       src/setup.c:1.18->1.19 
+
+---------------------
+PatchSet 95 
+Date: 2004/08/30 19:43:19
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for VME bus under RT Linux.
+
+Members: 
+       src/can_devrtl.c:1.6->1.7 
+
+---------------------
+PatchSet 96 
+Date: 2004/09/01 13:34:01
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+VME interrupts should be reenabled in VME driver, not here.
+
+Members: 
+       src/can_devrtl.c:1.7->1.8 
+
+---------------------
+PatchSet 97 
+Date: 2004/09/01 15:14:50
+Author: wentasah
+Branch: HEAD
+Tag: CLT_COMM_CAN-pre_update-040903 
+Log:
+Temporary fixes from RTL enabled lincan testing on VME hardware.
+
+Members: 
+       src/can_devrtl.c:1.8->1.9 
+
+---------------------
+PatchSet 98 
+Date: 2004/09/03 22:29:54
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-post_update-040903 
+Log:
+Committed Fanda Vacek work on major upgrade of CANopen framework
+CanMonitor updated and communication protocol changed
+to binary version. Automatic serialization and deserialization
+code generation added.
+CAN monitor daemon updated to support new binary protocol as well.
+Enhanced CANopen device to connect with hardware through
+hardware supporting shared libraries. Mapping is done
+according to HDS (Handle Description) files.
+
+Members: 
+       src/can_devrtl.c:1.9->1.10 
+
+---------------------
+PatchSet 99 
+Date: 2004/09/16 00:04:36
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+To prevent future name collisions "chip_t" changed to "canchip_t"
+
+Members: 
+       include/aim104.h:1.7->1.8 
+       include/c_can.h:1.5->1.6 
+       include/can_queue.h:1.21->1.22 
+       include/cc_can104.h:1.7->1.8 
+       include/constants.h:1.18->1.19 
+       include/devcommon.h:1.8->1.9 
+       include/finish.h:1.2->1.3 
+       include/hms30c7202_can.h:1.3->1.4 
+       include/i82527.h:1.9->1.10 
+       include/irq.h:1.8->1.9 
+       include/m437.h:1.7->1.8 
+       include/main.h:1.28->1.29 
+       include/msmcan.h:1.3->1.4 
+       include/nsi.h:1.7->1.8 
+       include/pc-i03.h:1.7->1.8 
+       include/pcan_dongle.h:1.1->1.2 
+       include/pccan.h:1.7->1.8 
+       include/pcccan.h:1.7->1.8 
+       include/pcm3680.h:1.7->1.8 
+       include/pikronisa.h:1.7->1.8 
+       include/pip.h:1.7->1.8 
+       include/setup.h:1.8->1.9 
+       include/sja1000.h:1.10->1.11 
+       include/sja1000p.h:1.9->1.10 
+       include/smartcan.h:1.7->1.8 
+       include/ssv.h:1.7->1.8 
+       include/template.h:1.7->1.8 
+       src/Makefile.std:1.15->1.16 
+       src/aim104.c:1.12->1.13 
+       src/bfadcan.c:1.14->1.15 
+       src/c_can.c:1.4->1.5 
+       src/c_can_irq.c:1.5->1.6 
+       src/can_devrtl.c:1.10->1.11 
+       src/cc_can104.c:1.12->1.13 
+       src/devcommon.c:1.12->1.13 
+       src/ems_cpcpci.c:1.13->1.14 
+       src/finish.c:1.5->1.6 
+       src/hms30c7202_can.c:1.5->1.6 
+       src/i82527.c:1.17->1.18 
+       src/ioctl.c:1.11->1.12 
+       src/ioctl_rtl.c:1.4->1.5 
+       src/irq.c:1.9->1.10 
+       src/kv_pcican.c:1.7->1.8 
+       src/m437.c:1.13->1.14 
+       src/main.c:1.19->1.20 
+       src/msmcan.c:1.5->1.6 
+       src/nsi.c:1.11->1.12 
+       src/open.c:1.9->1.10 
+       src/open_rtl.c:1.3->1.4 
+       src/pc_i03.c:1.12->1.13 
+       src/pcan_dongle.c:1.1->1.2 
+       src/pccan.c:1.11->1.12 
+       src/pcccan.c:1.13->1.14 
+       src/pcm3680.c:1.14->1.15 
+       src/pikronisa.c:1.13->1.14 
+       src/pip.c:1.10->1.11 
+       src/read.c:1.12->1.13 
+       src/setup.c:1.19->1.20 
+       src/sja1000.c:1.15->1.16 
+       src/sja1000p.c:1.16->1.17 
+       src/smartcan.c:1.11->1.12 
+       src/ssv.c:1.11->1.12 
+       src/template.c:1.12->1.13 
+       src/unican.c:1.10->1.11 
+       src/unican_vme.c:1.4->1.5 
+       src/virtual.c:1.10->1.11 
+
+---------------------
+PatchSet 100 
+Date: 2004/09/23 23:06:51
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added support for oscar CAN interface.
+It is SJA1000 based card connected to ARM LH7A400 SoC.
+Support contributed by Michael Moedt  xemc _AT_ yahoo _DOT_ com
+
+Members: 
+       README:1.10->1.11 
+       include/oscar.h:INITIAL->1.1 
+       src/Makefile.omk:1.14->1.15 
+       src/Makefile.std:1.16->1.17 
+       src/boardlist.c:1.12->1.13 
+       src/oscar.c:INITIAL->1.1 
+
+---------------------
+PatchSet 101 
+Date: 2004/09/29 10:51:16
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changed SJA1000 chip IRQ handling to loop until all requests are served
+This is not proven to be required for Linux kernel,
+but it can be possible source of problems for ISA based cards
+under RT-Linux.
+
+Members: 
+       CREDITS:1.6->1.7 
+       README:1.11->1.12 
+       include/constants.h:1.19->1.20 
+       src/can_devrtl.c:1.11->1.12 
+       src/i82527.c:1.18->1.19 
+       src/pcan_dongle.c:1.2->1.3 
+       src/setup.c:1.20->1.21 
+       src/sja1000.c:1.16->1.17 
+       src/sja1000p.c:1.17->1.18 
+
+---------------------
+PatchSet 102 
+Date: 2004/10/01 01:23:43
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+OSCAR reset update
+
+Members: 
+       src/oscar.c:1.1->1.2 
+
+---------------------
+PatchSet 103 
+Date: 2004/10/04 10:39:44
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+RT-Linux timestamps has to be done different way
+
+Members: 
+       include/can_sysdep.h:1.14->1.15 
+
+---------------------
+PatchSet 104 
+Date: 2004/11/11 14:13:21
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_3 
+Log:
+LinCAN 0.3 released
+
+Members: 
+       README:1.12->1.13 
+
+---------------------
+PatchSet 105 
+Date: 2004/11/25 20:17:49
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Returned back filling of CAN messages timestamps for RT-Linux variant.
+Used clock_gettime per Ismael's suggestion, needs more testing.
+
+Members: 
+       include/can_sysdep.h:1.15->1.16 
+
+---------------------
+PatchSet 106 
+Date: 2004/11/25 21:45:00
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Separated normal read and RTR assisted read transfer.
+I have that long time on in my mind. RTR based transfer
+in in its own IOCTL, where it belongs. This simplified
+normal read and made ABI more POSIX compliant.
+RTR code should be rewritten to be really functional.
+We are starting new development period now.
+
+Members: 
+       include/can.h:1.11->1.12 
+       include/ioctl.h:1.7->1.8 
+       src/Makefile.omk:1.15->1.16 
+       src/Makefile.std:1.17->1.18 
+       src/ioctl.c:1.12->1.13 
+       src/ioctl_remote.c:INITIAL->1.1 
+       src/read.c:1.13->1.14 
+       src/write.c:1.10->1.11 
+
+---------------------
+PatchSet 107 
+Date: 2004/11/25 21:49:15
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Missing break statement added.
+
+Members: 
+       src/ioctl.c:1.13->1.14 
+
+---------------------
+PatchSet 108 
+Date: 2004/12/12 17:11:20
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated location of Paul D. Smith's make 3.81beta1 release
+
+Members: 
+       README:1.13->1.14 
+
+---------------------
+PatchSet 109 
+Date: 2005/01/14 13:11:34
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Petr Cvachoucek contributed support for Kontron EB8245 on-board CAN
+It is using memory mapped SJA1000 controller.
+
+Members: 
+       include/eb8245.h:INITIAL->1.1 
+       src/Makefile.omk:1.16->1.17 
+       src/boardlist.c:1.13->1.14 
+       src/eb8245.c:INITIAL->1.1 
+
+---------------------
+PatchSet 110 
+Date: 2005/01/19 19:45:32
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Committed updated support for MPL AG PIP5, PIP6, PIP7, PIP8
+Contributed by Stefan Peter from MPL AG
+
+Members: 
+       README:1.14->1.15 
+       include/pip.h:1.8->1.9 
+       src/boardlist.c:1.14->1.15 
+       src/i82527.c:1.19->1.20 
+       src/pip.c:1.11->1.12 
+
+---------------------
+PatchSet 111 
+Date: 2005/01/19 20:08:04
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Corrected i82527 IRQ handling loop.
+Bug found by Stefan Peter from MPL AG
+
+Members: 
+       src/i82527.c:1.20->1.21 
+
+---------------------
+PatchSet 112 
+Date: 2005/01/21 23:41:05
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changed baudrate calculation to consider DSC selection.
+This affects only PIPx cards, because only these use
+crystal <10MHz (8 MHz in the case) and i82527 chip.
+
+Members: 
+       src/i82527.c:1.21->1.22 
+       src/pip.c:1.12->1.13 
+
+---------------------
+PatchSet 113 
+Date: 2005/02/03 15:38:46
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added CAN chip specific irq_accept routine for fast interrupt acknowledge.
+Required to prepare space for solution of problem with multiple VME Unican
+cards used with RT-Linux enabled LinCAN driver.
+
+Members: 
+       include/can_queue.h:1.22->1.23 
+       include/main.h:1.29->1.30 
+       src/c_can.c:1.5->1.6 
+       src/i82527.c:1.22->1.23 
+       src/setup.c:1.21->1.22 
+       src/sja1000.c:1.17->1.18 
+       src/sja1000p.c:1.18->1.19 
+       src/unican.c:1.11->1.12 
+       src/unican_vme.c:1.5->1.6 
+       src/virtual.c:1.11->1.12 
+
+---------------------
+PatchSet 114 
+Date: 2005/02/03 16:18:55
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changes, which should enable to handle more VME Unican cards under RT-Linux.
+Solution is not fully clean and it is not consistent with RT-Linux
+way to handle regular ISA and PCI interrupts. The deeper analysis is
+required, how to use this approach with regular Linux. May it be, that Linux 2.6.x
+with latest IRQ threads and mutexes instead of spin-lock  patches from Ingo
+Molnar could profit from this in future too.
+
+Members: 
+       include/constants.h:1.20->1.21 
+       src/can_devrtl.c:1.12->1.13 
+       src/unican.c:1.12->1.13 
+
+---------------------
+PatchSet 115 
+Date: 2005/02/03 16:40:08
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added checking of values returned by copy_to/from_user
+to fulfill 2.6.x kernel rules.
+
+Members: 
+       src/ioctl.c:1.14->1.15 
+       src/read.c:1.14->1.15 
+       src/write.c:1.11->1.12 
+
+---------------------
+PatchSet 116 
+Date: 2005/02/10 03:13:36
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added initial version of ADLINK PCI-7841 dual SJA1000 based board support.
+Requires testing.
+
+Members: 
+       src/Makefile.omk:1.17->1.18 
+       src/adlink7841.c:INITIAL->1.1 
+       src/boardlist.c:1.15->1.16 
+
+---------------------
+PatchSet 117 
+Date: 2005/02/10 10:46:41
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+README and Kconfig updated to reflect added cards support.
+
+Members: 
+       README:1.15->1.16 
+
+---------------------
+PatchSet 118 
+Date: 2005/02/10 11:45:54
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated for adlink7841
+
+Members: 
+       src/Makefile.std:1.18->1.19 
+
+---------------------
+PatchSet 119 
+Date: 2005/02/14 12:46:43
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Updated to use readw and writew
+
+Members: 
+       src/unican_cl2.c:1.3->1.4 
+
+---------------------
+PatchSet 120 
+Date: 2005/02/16 19:18:58
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Next round of trying to allow handling VME interrupts of multiple
+cards by RT Linux.
+
+Members: 
+       src/can_devrtl.c:1.13->1.14 
+
+---------------------
+PatchSet 121 
+Date: 2005/03/14 10:38:16
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Worker thread wake test protected by rtl_no_interrupts.
+
+Members: 
+       src/can_devrtl.c:1.14->1.15 
+
+---------------------
+PatchSet 122 
+Date: 2005/05/14 21:24:49
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Message declaration updated to match VCA provided version.
+The in memory layout is not changed. It is preparation for
+changes required for future compatibility with 32 bit user
+space on 64 bit systems.
+
+Members: 
+       include/canmsg.h:1.3->1.4 
+
+---------------------
+PatchSet 123 
+Date: 2005/05/31 00:45:49
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The CR line ending characters removed.
+It seems, that Windows and OS9 version of the driver
+is frozen and there has not been provided intention
+or effort to do future synchronization of versions.
+
+Members: 
+       src/unican_cl2.c:1.4->1.5 
+
+---------------------
+PatchSet 124 
+Date: 2005/05/31 00:49:06
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The CR line ending characters removed.
+
+Members: 
+       include/unican_cl2.h:1.2->1.3 
+
+---------------------
+PatchSet 125 
+Date: 2005/06/01 03:58:45
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Changes to prepare work area for C_CAN testing and rethinking
+Neil Bryan from embebidos.com works on C_CAN support
+and he has contributed or initiated most of these changes.
+There seems to be more problems to solve proper locking yet.
+
+Members: 
+       include/c_can.h:1.6->1.7 
+       include/main.h:1.30->1.31 
+       src/Makefile.omk:1.18->1.19 
+       src/boardlist.c:1.16->1.17 
+       src/c_can.c:1.6->1.7 
+       src/c_can_irq.c:1.6->1.7 
+       src/close.c:1.10->1.11 
+       src/hms30c7202_can.c:1.6->1.7 
+       src/ioctl.c:1.15->1.16 
+       src/main.c:1.20->1.21 
+       src/open.c:1.10->1.11 
+
+---------------------
+PatchSet 126 
+Date: 2005/06/01 15:30:49
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Elimination of superfluous chips header files
+
+Members: 
+       src/bfadcan.c:1.15->1.16 
+       src/cc_can104.c:1.13->1.14 
+       src/eb8245.c:1.1->1.2 
+       src/oscar.c:1.2->1.3 
+       src/pcm3680.c:1.15->1.16 
+       src/pikronisa.c:1.14->1.15 
+
+---------------------
+PatchSet 127 
+Date: 2005/06/01 15:46:04
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The MAX_MSGOBJS limit increased to 32 due to requirements of C_CAN chip.
+This wastes 68-124 bytes for other chips. Some better solution should be
+considered.
+
+Members: 
+       include/constants.h:1.21->1.22 
+
+---------------------
+PatchSet 128 
+Date: 2005/06/01 18:22:12
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Some more C_CAN changes
+
+Members: 
+       src/c_can.c:1.7->1.8 
+
+---------------------
+PatchSet 129 
+Date: 2005/06/02 00:19:50
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Ensure free of checked alloc memory in the case that module_init fails
+and unused Unican function deleted.
+
+Members: 
+       src/main.c:1.21->1.22 
+       src/unican.c:1.13->1.14 
+
+---------------------
+PatchSet 130 
+Date: 2005/06/02 04:06:13
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added  attach_to_chip() and release_chip() functions for each chip.
+This enables correct stopping and IRQ disable before driver unload.
+This is required to get rid of problematic handling of shut down
+for C_CAN ARM in ns_dev_release_io().
+
+Members: 
+       include/constants.h:1.22->1.23 
+       include/main.h:1.31->1.32 
+       src/c_can.c:1.8->1.9 
+       src/finish.c:1.6->1.7 
+       src/i82527.c:1.23->1.24 
+       src/main.c:1.22->1.23 
+       src/sja1000.c:1.18->1.19 
+       src/sja1000p.c:1.19->1.20 
+       src/unican.c:1.14->1.15 
+
+---------------------
+PatchSet 131 
+Date: 2005/06/02 12:58:57
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+C_CAN changes
+removed spin_unlock(&c_can_sprlock), because it is not used
+in c_can_irq_read_handler(). Modified c_can_pre_read_config().
+
+Members: 
+       src/c_can.c:1.9->1.10 
+       src/c_can_irq.c:1.7->1.8 
+
+---------------------
+PatchSet 132 
+Date: 2005/06/02 13:08:34
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+C_CAN sources re-indented
+Linux indentation style used
+#!/bin/sh
+indent -kr -i8 -ts8 -sob -l80 -ss -ncs -cp6  "$@"
+
+Members: 
+       src/c_can.c:1.10->1.11 
+       src/c_can_irq.c:1.8->1.9 
+
+---------------------
+PatchSet 133 
+Date: 2005/06/02 13:14:46
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+ns_dev_can.c added for FPGA version of C_CAN ARM device
+Contribution of Neil Bryan from embebidos.com
+
+Members: 
+       include/ns_dev_can.h:INITIAL->1.1 
+       src/ns_dev_can.c:INITIAL->1.1 
+
+---------------------
+PatchSet 134 
+Date: 2005/06/07 01:43:14
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+More updates in the C_CAN support, but locking not reworked still.
+The filters setup should work this time. But separation of CCIF1
+only from IRQ and CCIF2 from other places and locking not redone yet.
+
+Members: 
+       include/c_can.h:1.7->1.8 
+       src/c_can.c:1.11->1.12 
+       src/c_can_irq.c:1.9->1.10 
+       src/i82527.c:1.24->1.25 
+
+---------------------
+PatchSet 135 
+Date: 2005/06/15 12:02:30
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Committed IXXAT iPC-I 165 (PCI) implemented by Radim Kalas from Unicontrols.cz.
+This is initial unmodified code prepared against 0.3 version of the driver.
+Small updates to mimic LinCAN core changes are required now.
+
+Members: 
+       include/ipci165.h:INITIAL->1.1 
+       include/ipci165_fw.h:INITIAL->1.1 
+       include/kthread.h:INITIAL->1.1 
+       include/main.h:1.32->1.33 
+       src/Makefile.omk:1.19->1.20 
+       src/boardlist.c:1.17->1.18 
+       src/ipci165.c:INITIAL->1.1 
+       src/ipci165_fw.c:INITIAL->1.1 
+       src/kthread.c:INITIAL->1.1 
+
+---------------------
+PatchSet 136 
+Date: 2005/06/15 13:45:28
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added ipci165_attach_to_chip and ipci165_release_chip, which are mandatory
+for the latest LinCAN base version.
+
+Members: 
+       src/ipci165.c:1.1->1.2 
+
+---------------------
+PatchSet 137 
+Date: 2005/07/01 17:25:04
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added missing chip attach and release to the virtual chip driver.
+
+Members: 
+       src/virtual.c:1.12->1.13 
+
+---------------------
+PatchSet 138 
+Date: 2005/07/13 14:09:57
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+./switch2std replaced by ./switch-omk2std
+
+Members: 
+       README:1.16->1.17 
+
+---------------------
+PatchSet 139 
+Date: 2005/07/13 14:11:48
+Author: wentasah
+Branch: HEAD
+Tag: (none) 
+Log:
+Fixed typo
+
+Members: 
+       README:1.17->1.18 
+
+---------------------
+PatchSet 140 
+Date: 2005/07/13 21:44:26
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_3_1 
+Log:
+Updated for 0.3.1 release
+
+Members: 
+       CREDITS:1.7->1.8 
+       README:1.18->1.19 
+       include/constants.h:1.23->1.24 
+
+---------------------
+PatchSet 141 
+Date: 2005/07/22 13:05:24
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+SJA1000 clockout divisors listed explicitly.
+
+Members: 
+       include/sja1000.h:1.11->1.12 
+       include/sja1000p.h:1.10->1.11 
+
+---------------------
+PatchSet 142 
+Date: 2005/08/30 22:42:33
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Fixed bug message objects indexing introduced by previous driver changes.
+This indicates, that i82527 requires more testing after 0.3.x driver
+changes.
+
+Members: 
+       src/i82527.c:1.25->1.26 
+
+---------------------
+PatchSet 143 
+Date: 2005/10/11 15:41:38
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+SJA1000 driver interrupts processing modified to not rely on interrupt register for Rx and Tx.
+The information about free chip ready condition for Tx message is now
+obtained from status register. This solution enables us to equip SJA1000
+driver by irq_accept method. Then only this part has to be run in real IRQ
+handler and rest of ISR can be done in other thread. This is required
+for possible porting to QNX as well. Change should helps to better
+recover form bus-off mode as well.
+
+Members: 
+       include/constants.h:1.24->1.25 
+       src/sja1000p.c:1.20->1.21 
+
+---------------------
+PatchSet 144 
+Date: 2005/10/25 17:59:09
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Included support for PiMX1 board with SJA1000 on MX_DIS1 expansion board.
+
+Members: 
+       src/Makefile.omk:1.20->1.21 
+       src/boardlist.c:1.18->1.19 
+       src/pimx1.c:INITIAL->1.1 
+
+---------------------
+PatchSet 145 
+Date: 2005/11/03 02:43:28
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Introduced basic support for registration of "can" class and call devices,
+which is required for UDEV support.
+
+Members: 
+       src/Makefile.omk:1.21->1.22 
+       src/Makefile.std:1.19->1.20 
+       src/main.c:1.23->1.24 
+       src/setup.c:1.22->1.23 
+
+---------------------
+PatchSet 146 
+Date: 2005/11/03 02:45:04
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The system dependent part moved from setup.c into separate file.
+
+Members: 
+       src/sysdep_lnx.c:INITIAL->1.1 
+
+---------------------
+PatchSet 147 
+Date: 2005/11/04 16:25:00
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The i82527 bus status status change interrupt is now reported and cleared.
+This should fix reported "i82527_irq_handler IRQ 29 stuck" message.
+
+Members: 
+       src/i82527.c:1.26->1.27 
+
+---------------------
+PatchSet 148 
+Date: 2005/11/06 00:20:47
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+LinCAN driver updated to work on Real-Time Preemption enabled kernel.
+Code tested on SJA1000 controller on the ARM based system
+with Linux kernel 2.6.14 and Ingo Molnar's 2.6.14-rt5 patch.
+
+Members: 
+       include/can_sysdep.h:1.16->1.17 
+       src/bfadcan.c:1.16->1.17 
+       src/c_can.c:1.12->1.13 
+       src/msmcan.c:1.6->1.7 
+       src/nsi.c:1.12->1.13 
+       src/pcan_dongle.c:1.3->1.4 
+       src/pcccan.c:1.14->1.15 
+       src/pimx1.c:1.1->1.2 
+       src/smartcan.c:1.12->1.13 
+       src/ssv.c:1.12->1.13 
+
+---------------------
+PatchSet 149 
+Date: 2005/11/17 15:36:37
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Ronald Gomes from Technologic Systemscontributed support for TS-CAN1 and TS-7KV cards.
+This is initial version and would require more cleanups and optimizations.
+
+Members: 
+       CREDITS:1.8->1.9 
+       include/tscan1.h:INITIAL->1.1 
+       src/Makefile.omk:1.22->1.23 
+       src/Makefile.std:1.20->1.21 
+       src/boardlist.c:1.19->1.20 
+       src/tscan1.c:INITIAL->1.1 
+
+---------------------
+PatchSet 150 
+Date: 2005/12/28 16:04:06
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added more detailed SJA1000 error reporting and primitive report rate limiting.
+The detailed SJA1000 error reporting is enabled by adding next line
+into config.omk file
+  CONFIG_OC_LINCAN_DETAILED_ERRORS=y
+
+Members: 
+       src/Makefile.omk:1.23->1.24 
+       src/sja1000p.c:1.21->1.22 
+
+---------------------
+PatchSet 151 
+Date: 2006/01/07 22:10:02
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Some minor updates to adapt sources for changes introduced in 2.6.15 kernel version.
+
+Members: 
+       src/main.c:1.24->1.25 
+       src/pimx1.c:1.2->1.3 
+
+---------------------
+PatchSet 152 
+Date: 2006/01/18 01:20:07
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Deep rewrite of TSCAN1 and TS7KV boards support.
+Result requires tests on real hardware and probability
+of breakage is very likely. The main aim of the rewrite
+is to simplify register access code. The LinCAN driver
+does not require more than first 32 byte ports to control
+SJA1000 in pelican mode. With this simplification, no windowing
+is required for TSCAN1 and only minimal support for access
+of SJACDR has been left for TS7KV. The boards lookup checks
+for IO range availability and TSCAN1 window can be placed
+automatically as well. The "canio" parameter changed to "tscanio".
+
+Members: 
+       include/tscan1.h:1.1->1.2 
+       src/boardlist.c:1.20->1.21 
+       src/tscan1.c:1.1->1.2 
+
+---------------------
+PatchSet 153 
+Date: 2006/01/19 12:25:59
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Corrected bad device_lock references by value found in IXXAT iPC-I 165 code
+to the pointer kind parameters for can_spin_xxx calls.
+
+Members: 
+       src/ipci165.c:1.2->1.3 
+
+---------------------
+PatchSet 154 
+Date: 2006/01/19 18:42:20
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Correction of the abnormal looping in SJA1000P ISR reported by Tomas Kupilik.
+
+Members: 
+       src/sja1000p.c:1.22->1.23 
+
+---------------------
+PatchSet 155 
+Date: 2006/02/09 03:23:33
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Corrected conditional for "virtual" board inclusion in the board list.
+
+Members: 
+       src/boardlist.c:1.21->1.22 
+
+---------------------
+PatchSet 156 
+Date: 2006/02/10 16:30:54
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_3_2 
+Log:
+Documentation update to prepare for LinCAN-0.3.2 release.
+
+Members: 
+       README:1.19->1.20 
+       include/constants.h:1.25->1.26 
+
+---------------------
+PatchSet 157 
+Date: 2006/02/18 01:29:12
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Corrected incorrect check of class_device_create() return code validity.
+Noticed by Sergei Sharonov.
+
+Members: 
+       src/main.c:1.25->1.26 
+
+---------------------
+PatchSet 158 
+Date: 2006/02/28 13:08:03
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Correction of message data entry in rxtx and send utilities.
+
+Members: 
+       utils/can-proxy.c:1.6->1.7 
+       utils/rxtx.c:1.6->1.7 
+       utils/send.c:1.7->1.8 
+
+---------------------
+PatchSet 159 
+Date: 2006/03/26 23:45:15
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Added "chip_info" entry to the /proc/can/channelX, contributed by Sergei Sharonov.
+Code is compatible with 2.6.x and 2.4.x Linux kernels.
+It would fail on 2.2.x version. If its functionality is required,
+can_remove_proc_entry() has to be used on pointer stored in
+the new field and code emulating create_proc_read_entry()
+has to be added.
+
+Members: 
+       src/proc.c:1.8->1.9 
+
+---------------------
+PatchSet 160 
+Date: 2006/04/29 12:47:50
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+New style module parameters specification added for 2.6.17-rc1+ kernels.
+
+Members: 
+       src/main.c:1.26->1.27 
+
+---------------------
+PatchSet 161 
+Date: 2006/05/03 02:36:13
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+The SJA1000 interrupt support modified to provide more robust error recovery handling.
+
+Members: 
+       src/sja1000p.c:1.23->1.24 
+
+---------------------
+PatchSet 162 
+Date: 2006/05/21 20:27:36
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Eric Pennamen contributed support for NSI CAN PCI.
+Some possible cleanups and modifications should be discussed in future.
+
+Members: 
+       include/nsi_canpci.h:INITIAL->1.1 
+       src/Makefile.omk:1.24->1.25 
+       src/boardlist.c:1.22->1.23 
+       src/nsi_canpci.c:INITIAL->1.1 
+
+---------------------
+PatchSet 163 
+Date: 2006/05/21 22:50:24
+Author: ppisa
+Branch: HEAD
+Tag: (none) 
+Log:
+Correction of false i82527 IRQ stuck problem reported by Terence Soh.
+The interrupt pending flag has to be clean even, if we cannot process
+synchronous activities. The flags ensures, that they are processed
+later in such case. The change requires testing, I have not get
+to testing yet.
+
+Members: 
+       src/i82527.c:1.27->1.28 
+
+---------------------
+PatchSet 164 
+Date: 2006/05/28 18:28:22
+Author: ppisa
+Branch: HEAD
+Tag: CLT_COMM_CAN-lincan-0_3_3 
+Log:
+Version and README updated to LinCAN version 3.3.
+
+Members: 
+       README:1.20->1.21 
+       include/constants.h:1.26->1.27 
+
diff --git a/lincan-0.3.3/Makefile b/lincan-0.3.3/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/lincan-0.3.3/Makefile.omk b/lincan-0.3.3/Makefile.omk
new file mode 100644 (file)
index 0000000..d43b19d
--- /dev/null
@@ -0,0 +1,2 @@
+SUBDIRS = src utils
+
diff --git a/lincan-0.3.3/Makefile.rules b/lincan-0.3.3/Makefile.rules
new file mode 100644 (file)
index 0000000..9f79b11
--- /dev/null
@@ -0,0 +1,918 @@
+#  Makefile.rules - OCERA make framework common project rules -*- makefile -*-
+#   
+#  (C) Copyright 2003 by Pavel Pisa - OCERA team member
+#
+#  The uLan driver is distributed under the Gnu General Public License. 
+#  See file COPYING for details.
+#
+#
+# input variables
+# V                .. if set to 1, full command text is shown else short form is used
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# lib_LIBRARIES    .. list of the user-space libraries
+# shared_LIBRARIES .. list of the user-space shared libraries
+# kernel_LIBRARIES .. list of the kernel-space libraries
+# rtlinux_LIBRARIES.. list of the RT-Linux kernel-space libraries
+# include_HEADERS  .. list of the user-space public header files
+# nobase_include_HEADERS .. public headers copied even with directory part
+# renamed_include_HEADERS .. public headers copied to the different target name
+# kernel_HEADERS   .. list of the kernel-space public header files
+# rtlinux_HEADERS  .. list of the RT-Linux kernel-space public header files
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# kernel_MODULES   .. list of the kernel side modules/applications
+# rtlinux_MODULES  .. list of RT-Linux the kernel side modules/applications
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# kernel_INCLUDES  .. additional include directories and defines for kernel-space
+# rtlinux_INCLUDES .. additional include directories and defines for RT-Linux
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+#
+# LINUX_DIR        .. location of Linux kernel sources
+# RTL_DIR          .. location of RT-Linux sources
+
+# Hack to check RT-Linux rules
+#LINUX_DIR := /home/cvs/ocera/ocera-build/kernel/linux
+#RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
+#CONFIG_RTLINUX = y
+#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
+-include $(MAKERULES_DIR)/OCERA_TOP_DIR
+
+BUILD_DIR_NAME = _build
+COMPILED_DIR_NAME = _compiled
+ifndef GROUP_DIR_NAME
+GROUP_DIR_NAME = nogroup
+endif
+
+# We need to ensure definition of sources directory first
+ifndef SOURCES_DIR
+SOURCES_DIR := $(shell ( pwd -L ) )
+endif
+
+all: default
+
+ifdef OCERA_DIR
+ifeq ($(wildcard $(OCERA_DIR)/ocera.mk),)
+$(warning "ocera.mk" file does not exist. Adapt Makefile.rules for standalone compilation)
+$(warning (comment out definition of OCERA_DIR line and optionally select RTL_DIR) )
+$(error or go to the ocera/ directory and do 'make' to generate the "ocera.mk" file first, please)
+endif
+include $(OCERA_DIR)/ocera.mk
+KERN_INCLUDE_DIR := $(OCERA_KERNEL_INCLUDES_DIR)
+KERN_LIB_DIR     := $(OCERA_KERNEL_LIBRARIES_DIR)
+KERN_MODULES_DIR := $(OCERA_MODULES_DIR)
+KERN_BUILD_DIR   := $(BUILD_DIR)/kern/$(GROUP_DIR_NAME)
+KERN_MODPOST_DIR := $(BUILD_DIR)/kern-modpost
+USER_INCLUDE_DIR := $(OCERA_USER_INCLUDES_DIR)
+USER_LIB_DIR     := $(OCERA_USER_LIBRARIES_DIR)
+USER_UTILS_DIR   := $(TARGET_DIR)/usr/bin
+USER_BIN_DIR     := $(TARGET_DIR)/usr/bin
+USER_BUILD_DIR   := $(BUILD_DIR)/user/$(GROUP_DIR_NAME)
+#LINUX_DIR        := $(OCERA_DIR)/kernel/linux
+#RTL_DIR          := $(OCERA_DIR)/kernel/rtlinux
+#CONFIG_FILE      := $(OCERA_DIR)/emdebsys/.config 
+ifneq ($(wildcard $(CONFIG_FILE)),)
+#include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+else # OCERA_DIR
+KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
+KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
+KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
+KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
+KERN_MODPOST_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern-modpost
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+ifndef CONFIG_FILE
+CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
+endif
+ifneq ($(wildcard $(CONFIG_FILE)-default),)
+-include $(CONFIG_FILE)-default
+else
+$(warning Please, run "make default-config" first)
+endif
+ifneq ($(wildcard $(CONFIG_FILE)),)
+include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+ifndef LINUX_VERSION
+LINUX_VERSION=$(shell uname -r)
+endif
+ifndef LINUX_DIR
+LINUX_DIR=/lib/modules/$(LINUX_VERSION)/build
+endif
+endif # OCERA_DIR
+
+# Check and include real OCERA style Makefile.omk now
+ifndef OMK_INCLUDED
+include $(SOURCES_DIR)/Makefile.omk
+OMK_INCLUDED := 1
+endif
+
+ifeq ($(TARGET_OS),)
+  # Check for target
+  ifeq ($(OS),Windows_NT)
+    TARGET_OS = win32
+  else
+    TARGET_OS = $(shell uname | tr '[A-Z]' '[a-z]' )
+    #$(warning TARGET_OS=$(TARGET_OS))
+  endif
+endif
+
+export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR LINUX_DIR LINUX_VERSION RTL_DIR
+export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
+export TARGET_OS NM
+
+ifeq ($(NM),)
+  NM = nm
+endif
+
+#CFLAGS += -ggdb
+CFLAGS += -O2 
+CFLAGS += -Wall
+#CXXFLAGS += -ggdb
+CXXFLAGS += -O2
+CXXFLAGS += -Wall
+
+
+CPPFLAGS  += -I $(USER_INCLUDE_DIR)
+
+LOADLIBES += -L$(USER_LIB_DIR) 
+
+LOADLIBES += $(lib_LOADLIBES:%=-l%)
+
+LIB_CPPFLAGS += $(CPPFLAGS)
+LIB_CFLAGS   += $(CFLAGS)
+
+ifeq ($(TARGET_OS),win32)
+  SOLIB_EXT = dll
+else
+  SOLIB_EXT = so
+  SOLIB_PICFLAGS += -fpic
+endif
+
+ifndef RELATIVE_DIR
+RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
+endif
+override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
+override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
+#$(warning  RELATIVE_DIR $(RELATIVE_DIR))
+override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g'  -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__')
+#$(warning  BACK2TOP_DIR $(BACK2TOP_DIR))
+
+#$(warning SOURCES_DIR = $(SOURCES_DIR))
+#$(warning MAKERULES_DIR = $(MAKERULES_DIR))
+#$(warning RELATIVE_DIR = $(RELATIVE_DIR))
+
+override RELATIVE_PREFIX := $(RELATIVE_DIR)/
+override RELATIVE_PREFIX := $(RELATIVE_PREFIX:/%=%)
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+#vpath %.cxx $(SOURCES_DIR)
+
+VPATH = $(SOURCES_DIR)
+srcdir = $(SOURCES_DIR)
+
+USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
+KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR)
+
+.PHONY: default dep subdirs clean clean-custom cleandepend default-config
+.PHONY: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
+.PHONY: kernel-lib-pass kernel-pass kernel-mod-pass kernel-modpost-pass default-config-pass
+.PHONY: check-dir-local include-pass-local library-pass-local binary-pass-local 
+.PHONY: utils-pass-local kernel-lib-pass-local kernel-mod-pass-local kernel-modpost-pass-local
+.PHONY: default-config-pass-local
+
+# Some support to serialize some targets for parallel make
+ifneq ($(OMK_SERIALIZE_INCLUDED),y)
+include-pass: check-dir
+library-pass: include-pass
+binary-pass utils-pass: library-pass
+kernel-lib-pass: include-pass
+kernel-mod-pass: kernel-lib-pass
+kernel-modpost-pass: kernel-mod-pass
+kernel-pass: kernel-mod-pass kernel-modpost-pass
+
+OMK_SERIALIZE_INCLUDED = y
+endif
+
+# Defines for quiet compilation
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    OMK_VERBOSE = $(V)
+  endif
+endif
+ifndef OMK_VERBOSE
+  OMK_VERBOSE = 0
+endif
+ifeq ($(OMK_VERBOSE),1)
+  Q =
+else
+  Q = @
+endif
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  QUIET_CMD_ECHO = true
+  OMK_SILENT = 1
+else
+  QUIET_CMD_ECHO = echo
+  CPHEADER_FLAGS += -v
+endif
+
+default: check-make-ver check-dir include-pass library-pass binary-pass utils-pass kernel-lib-pass kernel-pass
+
+#=====================================================================
+# Common utility rules
+
+define mkdir_def
+       [ -d $(1) ] || mkdir -p $(1) || exit 1
+endef
+
+# Syntax: $(call BUILD_CONFIG_H_template,<header_file_path>,<list_of_options_to_export>,<header_barrier>)
+define BUILD_CONFIG_H_template
+
+$(1) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
+       @$(QUIET_CMD_ECHO) "  CONFGEN $$@ in `pwd`"
+       @if [ ! -d `dirname $(1).tmp` ] ; then \
+               mkdir `dirname $(1).tmp` ; fi
+       @echo "/* Automatically generated from */" > "$(1).tmp"
+       @echo "/* config file: $$< */" >> "$(1).tmp"
+       @echo "#ifndef $(3)" >> "$(1).tmp"
+       @echo "#define $(3)" >> "$(1).tmp"
+       @( $(foreach x, $(shell echo '$($(2))' | sed -e 's/\<\([^ =]*\)\(=[^ ]\+\|\)\>/\1/g' ), \
+               echo '$(x).$($(x))' ; ) echo ; ) | \
+               sed -e '/^[^.]*\.n$$$$/d' -e '/^[^.]*\.$$$$/d' -e 's/^\([^.]*\)\.[ym]$$$$/\1.1/' | \
+               sed -n -e 's/^\([^.]*\)\.\(.*\)$$$$/#define \1 \2/p' \
+                 >> "$(1).tmp"
+       @echo "#endif /*$(3)*/" >> "$(1).tmp"
+       @if cmp --quiet "$(1).tmp" "$(1)" ; then \
+       echo rm "$(1).tmp" ; \
+       else mv "$(1).tmp" "$(1)" ; \
+       echo Updated configuration "$(1)" ; fi
+
+endef
+
+ifdef LOCAL_CONFIG_H
+
+$(eval $(call BUILD_CONFIG_H_template,$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+
+endif
+
+check-make-ver:
+       @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
+       if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
+               echo "Your make program version is too old and does not support OMK system." ; \
+               echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
+       fi
+
+#=====================================================================
+# User-space rules and templates to compile programs, libraries etc.
+
+ifdef USER_RULE_TEMPLATES
+
+USER_SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.o
+
+USER_SOURCES2OBJSLO = .lo/.c .lo/.cc .lo/.cxx .lo/.lo
+
+#%.lo: %.c
+#      $(CC) -o $@ $(LCFLAGS) -c $<
+
+c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
+
+cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
+
+idl_COMPILE = $(IDL_COMPILER)
+
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
+endif
+# Prepare suitable define for dependency building
+ifeq ($(CC_MAJOR_VERSION),2)
+CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
+else
+CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+endif
+
+
+# Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_c_o_template
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CC      $$@"
+       $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+# Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_cc_o_template
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CXX     $$@"
+       $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+# Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_S_o_template
+$(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
+        @$(QUIET_CMD_ECHO) "  AS      $$@"
+        $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+        then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
+        else rm -f "$$@.d.tmp" ; exit 1; \
+        fi
+endef
+
+
+# Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
+define CMETRIC_o_h_template
+$(2): $(1)
+       @$(QUIET_CMD_ECHO) "  CMETRIC $$@"
+       $(Q)if [ -n `dirname $$@` ] ; then \
+             if [ ! -e `dirname $$@` ] ; then \
+               mkdir -p `dirname $$@` ; fi ; fi
+       $(Q)echo >$$@ '/* Automatically generated from $$< */'
+       $(Q)echo >>$$@ '/* Conditionals to control compilation */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+       $(Q)echo >>$$@ '/* Defines from the values defined to symbols */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+endef
+
+
+
+define COMPILE_idl_template
+$(2).c $(2)-stubs.c $(2)-skels.c $(2)-common.c $(2).h: $(1)
+       @$(QUIET_CMD_ECHO) "  IDL     $$@"
+       $(Q) $$(idl_COMPILE) $(1)
+endef
+
+
+# Syntax: $(call PROGRAM_template,<dir>,<executable-name>,<executable-suffix>,<linker-sript>)
+define PROGRAM_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJS),
+$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+
+$(2)/$(1): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc))" ] ; then echo $$(CC) ; else echo $$(CXX) ; fi) \
+         $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $(2)/$(1)
+       @echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
+       @sed -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(USER_OBJS_DIR)/$(1).exe.map  >>$(USER_OBJS_DIR)/$(1).exe.d
+       @echo >>$(USER_OBJS_DIR)/$(1).exe.d
+endef
+
+
+# Syntax: $(call LIBRARY_template,<library-name>)
+define LIBRARY_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJS),
+$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+
+$(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR      $$@"
+       $(Q) $(AR) rcs $$@ $$^
+endef
+
+
+# Syntax: $(call SOLIB_template,<library-name>)
+define SOLIB_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+SOLIB_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJSLO),
+$(1)_OBJSLO += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO:%/=%))
+
+SOLIB_OBJS  += $$($(1)_OBJSLO)
+SOLIB_SOURCES += $$($(1)_SOURCES)
+
+$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_OBJSLO)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $(LD) --shared --soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^
+endef
+
+
+
+library-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \
+                   $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT))
+
+binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%)
+
+utils-pass-local: $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%)
+
+# Special rules for CMETRIC generated headers
+
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call COMPILE_c_o_template,\
+               $(SOURCES_DIR)/$($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES),\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),)))
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call CMETRIC_o_h_template,\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),\
+               $(addprefix $(USER_INCLUDE_DIR)/,$(cmetrh)))))
+
+GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
+
+GEN_HEADERS+=$(filter %.h,$(USER_IDLS:%.idl=%.h))
+
+# Generate rules for compilation of programs and libraries
+
+$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR))))
+
+$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR))))
+
+$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
+
+$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
+
+-include $(USER_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+# Kernel-space rules and templates to compile modules, libraries etc.
+
+ifdef KERN_RULE_TEMPLATES
+
+$(KERN_LIB_DIR)/kernel.mk: $(LINUX_DIR)/.config $(MAKERULES_DIR)/kernelcfg2mk
+       @$(QUIET_CMD_ECHO) "  KCFG2MK $$@"
+       $(Q) $(MAKERULES_DIR)/kernelcfg2mk $(LINUX_DIR) $(KERN_LIB_DIR)
+
+ifeq ($(CONFIG_RTLINUX),y)
+include $(RTL_DIR)/rtl.mk
+
+KERN_CC = $(CC)
+kern_GCCLIB_DIR=$(shell LANG=C LC_ALL=C LC_MESSAGES=C $(CC) -print-search-dirs | sed -n -e 's/^install: \(.*\)$$/\1/p' )
+INCLUDES := -I $(KERN_INCLUDE_DIR) $(INCLUDE) $(rtlinux_INCLUDES) $(kernel_INCLUDES)
+#-DEXPORT_NO_SYMBOLS
+c_o_kern_COMPILE = $(KERN_CC) -idirafter $(kern_GCCLIB_DIR)/include $(INCLUDES)  $(CFLAGS) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB -nostdinc
+cc_o_kern_COMPILE = $(CXX) $(INCLUDES) $(CXXFLAGS) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB
+KERN_EXE_SUFFIX := .o
+KERN_ARCH = $(ARCH)
+KERN_LD = $(LD)
+KERN_AR = $(AR)
+
+else # CONFIG_RTLINUX
+
+include $(KERN_LIB_DIR)/kernel.mk
+
+ifeq ($(LINUX_SRC),)
+LINUX_SRC = $(LINUX_DIR)
+endif
+kernel_INCLUDES += -I $(LINUX_DIR) -idirafter $(LINUX_SRC)/include/linux
+
+ifdef LINUX_CC
+KERN_CC = $(LINUX_CC)
+kern_GCCLIB_DIR=$(shell LANG=C LC_ALL=C LC_MESSAGES=C $(LINUX_CC) -print-search-dirs | sed -n -e 's/^install: \(.*\)$$/\1/p' )
+else
+KERN_CC = echo KERN_CC not defined - compilation skipped
+endif
+c_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB -nostdinc
+cc_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB
+KERN_EXE_SUFFIX := $(LINUX_MODULE_EXT)
+KERN_LDFLAGS = $(LINUX_LDFLAGS)
+ifdef LINUX_ARCH
+KERN_ARCH = $(LINUX_ARCH)
+else
+KERN_ARCH = echo KERN_ARCH not defined - skipped
+endif
+ifdef LINUX_LD
+KERN_LD = $(LINUX_LD)
+else
+KERN_LD = echo KERN_LD  not defined - skipped
+endif
+ifneq ($(LINUX_AR),)
+KERN_AR = $(LINUX_AR)
+else
+KERN_AR = $(AR)
+endif
+ifeq ($(LINUX_QUOTE_MODNAME),y)
+KERN_MQ=\"
+endif
+endif # CONFIG_RTLINUX
+
+KERN_LOADLIBES += -L$(KERN_LIB_DIR) 
+
+KERN_LOADLIBES += $(rtlinux_LOADLIBES:%=-l%)
+KERN_LOADLIBES += $(kernel_LOADLIBES:%=-l%)
+
+
+
+# Check GCC version for kernel part of build
+ifndef kern_CC_MAJOR_VERSION
+kern_CC_MAJOR_VERSION := $(shell $(KERN_CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
+endif
+# Prepare suitable define for dependency building
+ifeq ($(kern_CC_MAJOR_VERSION),2)
+kern_CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
+else
+kern_CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+endif
+
+ifeq ($(KERN_EXE_SUFFIX),.ko)
+ifeq ($(wildcard $(LINUX_DIR)/scripts/mod/modpost),)
+KERN_MODPOST = $(LINUX_DIR)/scripts/modpost
+else
+KERN_MODPOST = $(LINUX_DIR)/scripts/mod/modpost
+endif
+KERN_MODULES_LINK_DIR = $(KERN_MODPOST_DIR)
+KERN_LINK_SUFFIX = .o
+else
+KERN_MODULES_LINK_DIR = $(KERN_MODULES_DIR)
+KERN_LINK_SUFFIX = $(KERN_EXE_SUFFIX)
+endif
+
+define COMPILE_c_o_kern_template
+
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CC [K]  $$@"
+       $(Q) if $$(c_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \
+       -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+
+define COMPILE_cc_o_kern_template
+
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CXX [K] $$@"
+       $(Q) if $$(cc_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \
+       -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+
+define MODULE_kern_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+KERN_OBJS  += $$($(1)_OBJS)
+KERN_SOURCES += $$($(1)_SOURCES)
+
+# this is hack to build "__this_module" structure for 2.6.x kernels
+# modpost is used for that purpose now
+
+#$(1).mod.c:
+#      echo  "\
+#      #include <linux/version.h>@\
+#      #include <linux/module.h>@\
+#      #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5))@\
+#      #include <linux/vermagic.h>@\
+#      #include <linux/compiler.h>@\
+#      @\
+#      MODULE_INFO(vermagic, VERMAGIC_STRING);@\
+#      @\
+#      #undef unix@\
+#      struct module __this_module@\
+#      __attribute__((section(\".gnu.linkonce.this_module\"))) = {@\
+#       .name = __stringify(KBUILD_MODNAME),@\
+#       .init = init_module,@\
+#      #ifdef CONFIG_MODULE_UNLOAD@\
+#       .exit = cleanup_module,@\
+#      #endif@\
+#      };@\
+#      #endif@\
+#      " | tr @ \\n >$$@ 
+   
+
+#$(eval $(call COMPILE_c_o_kern_template,$(1).mod.c,$(1).mod.o,-DKBUILD_MODNAME=$(1)))
+
+$(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LD [K]  $$@"
+       $(Q) $$(KERN_LD) $$(KERN_LDFLAGS) -r $$($(1)_OBJS) -L$$(kern_GCCLIB_DIR) $$($(1)_LIBS:%=-l%) $$(KERN_LOADLIBES) -Map $(KERN_OBJS_DIR)/$(1).mod.map -o $$@
+       @echo "$(2)/$(1)$(KERN_LINK_SUFFIX): \\" >$(KERN_OBJS_DIR)/$(1).mod.d
+       @sed -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(KERN_OBJS_DIR)/$(1).mod.map  >>$(KERN_OBJS_DIR)/$(1).mod.d
+       @echo >>$(KERN_OBJS_DIR)/$(1).mod.d
+       @if [ "$(KERN_EXE_SUFFIX)" == ".ko" ] ; then \
+         echo $(1) >>$(KERN_MODPOST_DIR)/module-changes ; \
+         echo $(1) >>$(KERN_MODPOST_DIR)/$(1).mod.stamp ; \
+       fi
+
+endef
+
+
+
+define LIBRARY_kern_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+KERN_OBJS  += $$($(1)_OBJS)
+KERN_SOURCES += $$($(1)_SOURCES)
+
+$(KERN_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR [K]  $$@"
+       $(Q) $(KERN_AR) rcs $$@ $$^
+endef
+
+
+ifdef LINUX_DIR
+
+kernel-lib-pass-local: $(kernel_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.a)
+
+kernel-mod-pass-local: $(kernel_MODULES:%=$(KERN_MODULES_LINK_DIR)/%$(KERN_LINK_SUFFIX))
+
+$(foreach module,$(kernel_MODULES),$(eval $(call MODULE_kern_template,$(module),$(KERN_MODULES_LINK_DIR))))
+
+$(foreach lib,$(kernel_LIBRARIES),$(eval $(call LIBRARY_kern_template,$(lib))))
+
+endif
+
+
+ifeq ($(CONFIG_RTLINUX),y)
+
+kernel-mod-pass-local: $(rtlinux_MODULES:%=$(KERN_MODULES_LINK_DIR)/%$(KERN_LINK_SUFFIX))
+
+kernel-lib-pass-local: $(rtlinux_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.a)
+
+$(foreach module,$(rtlinux_MODULES),$(eval $(call MODULE_kern_template,$(module),$(KERN_MODULES_LINK_DIR))))
+
+$(foreach lib,$(rtlinux_LIBRARIES),$(eval $(call LIBRARY_kern_template,$(lib))))
+
+endif
+
+ifeq ($(KERN_MODPOST_PASS),y)
+
+MODULES_LIST :=        $(wildcard *.mod.stamp)
+MODULES_LIST := $(MODULES_LIST:%.mod.stamp=%)
+
+define MODPOST_kern_template
+$(2) : $(1)$(KERN_LINK_SUFFIX) $(1).mod.c
+       @$(QUIET_CMD_ECHO) "  LD [M]  $$@"
+       $(Q) $$(cc_o_kern_COMPILE) -D"KBUILD_BASENAME=$(KERN_MQ)$(1)$(KERN_MQ)" \
+               -D"KBUILD_MODNAME=$(KERN_MQ)$(1)$(KERN_MQ)" \
+               -o $(1).mod.o -c $(1).mod.c
+       $(Q) $$(KERN_LD) $$(KERN_LDFLAGS) $(1)$(KERN_LINK_SUFFIX) $(1).mod.o -r -o $$@
+endef
+
+kernel-modpost-versions: $(wildcard $(LINUX_DIR)/Module.symvers)
+       @$(QUIET_CMD_ECHO) "  MODPOST    $(KERN_MODPOST_DIR)"
+       @echo  >$(KERN_MODPOST_DIR)/modpost-running
+       @rm -f $(KERN_MODPOST_DIR)/module-changes
+       $(Q) $(KERN_MODPOST) $(MODULES_LIST:%=%$(KERN_LINK_SUFFIX)) $(^:%=-i %)
+
+$(MODULES_LIST:%=%.mod.c) : kernel-modpost-versions
+
+kernel-modpost-pass-local: $(MODULES_LIST:%=$(KERN_MODULES_DIR)/%$(KERN_EXE_SUFFIX))
+       @rm -f $(KERN_MODPOST_DIR)/modpost-running
+
+$(foreach module,$(MODULES_LIST),$(eval $(call MODPOST_kern_template,$(module),$(module:%=$(KERN_MODULES_DIR)/%$(KERN_EXE_SUFFIX)))))
+
+endif
+
+-include $(KERN_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+
+
+kernel-lib-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(KERN_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(KERN_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(KERN_OBJS_DIR))
+       +@if [ -n "$(kernel_LIBRARIES)$(rtlinux_LIBRARIES)" ] ; \
+       then \
+           $(MAKE) --no-print-directory -C $(KERN_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y $(@:%=%-local) ; \
+       fi
+
+kernel-mod-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(KERN_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(KERN_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(KERN_OBJS_DIR))
+       +@if [ -n "$(kernel_MODULES)$(rtlinux_MODULES)" ] ; \
+       then \
+           $(MAKE) --no-print-directory -C $(KERN_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y $(@:%=%-local) ; \
+       fi
+
+kernel-modpost-pass:
+       +@if [ -e "$(KERN_MODPOST_DIR)/module-changes" -o -e "$(KERN_MODPOST_DIR)/modpost-running" ] ; \
+       then \
+           $(MAKE) --no-print-directory -C $(KERN_MODPOST_DIR) \
+              -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y KERN_MODPOST_PASS=y $(@:%=%-local) ; \
+       fi
+
+library-pass binary-pass utils-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(foreach dir, $(QT_SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               if [ "$@" != "binary-pass" ] ; then exit 0 ; fi ; \
+               if [ ! -e $(SOURCES_DIR)/$(dir)/Makefile ] ; then  \
+               ( cd $(SOURCES_DIR)/$(dir) ; $$QTDIR/bin/qmake TOP_DIR=$(MAKERULES_DIR) \
+                    RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) QTDIR=$(QTDIR) CC=$(CC) \
+                    CXX=$(CXX) || exit 1 ;) ; fi ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(SOURCES_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile USER_RULE_TEMPLATES=y $(@:%=%-local)
+
+
+dep clean install check-dir include-pass default-config-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile $(@:%=%-local)
+
+
+dep-local:
+
+check-dir-local:
+       @$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(call mkdir_def,$(KERN_OBJS_DIR))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(call mkdir_def,$(KERN_INCLUDE_DIR))
+       @$(call mkdir_def,$(USER_LIB_DIR))
+       @$(call mkdir_def,$(KERN_LIB_DIR))
+       @$(call mkdir_def,$(USER_BIN_DIR))
+       @$(call mkdir_def,$(USER_UTILS_DIR))
+       @$(call mkdir_def,$(KERN_MODULES_DIR))
+       @$(call mkdir_def,$(KERN_MODPOST_DIR))
+
+install-local:
+
+default-config:
+       @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
+       @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
+       @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
+       @echo >> "$(CONFIG_FILE)-default"
+       @$(MAKE) --no-print-directory -C $(MAKERULES_DIR) \
+               RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
+               -f $(MAKERULES_DIR)/Makefile default-config-pass
+
+default-config-pass-local:
+       @echo Default config for $(RELATIVE_DIR)
+       @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
+       @$(foreach x, $(default_CONFIG), echo '$(x)' | \
+               sed -e 's/^[^=]*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
+
+include-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(foreach f, $(include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) \
+          || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; )
+       @$(foreach f, $(nobase_include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) \
+          || ( mkdir -p $(USER_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) ) || exit 1 ; )
+       @$(foreach f, $(renamed_include_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} \
+          || ( mkdir -p `dirname $(USER_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} ) || exit 1 ; )
+# Kernel and RT-Linux stuff
+       @$(call mkdir_def,$(KERN_INCLUDE_DIR))
+       @$(foreach f, $(kernel_HEADERS) $(rtlinux_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(notdir $(f)) \
+          || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; )
+       @$(foreach f, $(nobase_kernel_HEADERS) $(nobase_rtlinux_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(f) \
+          || ( mkdir -p $(KERN_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(KERN_INCLUDE_DIR)/$(f) ) || exit 1 ; )
+       @$(foreach f, $(renamed_kernel_HEADERS) $(renamed_rtlinux_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(KERN_INCLUDE_DIR)/$${destfname} \
+          || ( mkdir -p `dirname $(KERN_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(KERN_INCLUDE_DIR)/$${destfname} ) || exit 1 ; )
+
+ifdef USER_RULE_TEMPLATES
+
+# User-space static libraries and applications object files
+
+USER_SOURCES := $(sort $(USER_SOURCES))
+
+USER_GEN_SOURCES := $(sort $(USER_GEN_SOURCES))
+
+#$(warning USER_SOURCES = $(USER_SOURCES))
+
+$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),)))
+
+$(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.o),)))
+
+$(foreach src,$(filter %.cxx,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),)))
+
+$(foreach src,$(filter %.c,$(USER_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.o),)))
+
+# User-space shared libraries object files
+
+SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
+
+SOLIB_GEN_SOURCES := $(sort $(SOLIB_GEN_SOURCES))
+
+#$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
+#$(warning SOLIB_GEN_SOURCES = $(SOLIB_GEN_SOURCES))
+
+$(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cxx,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.c,$(SOLIB_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+# IDL compilation
+
+USER_IDLS := $(sort $(USER_IDLS))
+
+$(foreach src,$(filter %.idl,$(USER_IDLS)),$(eval $(call COMPILE_idl_template,$(SOURCES_DIR)/$(src),$(src:%.idl=%))))
+
+endif
+
+ifdef KERN_RULE_TEMPLATES
+
+KERN_SOURCES := $(sort $(KERN_SOURCES))
+
+#$(warning KERN_SOURCES = $(KERN_SOURCES))
+
+$(foreach src,$(filter %.c,$(KERN_SOURCES)),$(eval $(call COMPILE_c_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),)))
+
+$(foreach src,$(filter %.cc,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.o),)))
+
+$(foreach src,$(filter %.cxx,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),)))
+
+endif
+
+# Special rules for configuration exported headers
+
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(addprefix $(USER_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+
+clean-local: clean-custom
+       @echo Cleaning in $(KERN_OBJS_DIR) and $(USER_OBJS_DIR)
+       @rm -f $(KERN_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
+              $(KERN_OBJS_DIR)/*.d $(USER_OBJS_DIR)/*.d \
+              $(KERN_OBJS_DIR)/*.map $(USER_OBJS_DIR)/*.map \
+              $(KERN_OBJS_DIR)/*.mod.c \
+              $(kernel_MODULES:%=$(KERN_MODPOST_DIR)/%.*) \
+              $(LOCAL_CONFIG_H:%=$(KERN_OBJS_DIR)/%) \
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)
+       @if [ -e $(KERN_LIB_DIR)/kernel.mk ] ; then \
+           touch -t 200001010101 $(KERN_LIB_DIR)/kernel.mk ; \
+       fi
+       @$(foreach confh,$(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS)),\
+           if [ -e $(confh) ] ; then touch -t 200001010101 $(confh) ; fi ; \
+       )
+
diff --git a/lincan-0.3.3/Makefile.std b/lincan-0.3.3/Makefile.std
new file mode 100644 (file)
index 0000000..d643545
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# Makefile for the Linux CAN-bus driver.
+# Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+# This software is released under the GPL-License.
+# Version 0.7  6 Aug 2001
+#
+# Changes made by Pavel Pisa pisa@cmp.felk.cvut.cz as preliminary
+# study for OCERA Real Time CAN/CANOpen project ORTCAN
+#
+########## The following options can be changed ##########
+
+SUBDIRS = src utils
+
+ifndef SOURCES_DIR
+SOURCES_DIR := $(shell ( pwd -L ) )
+endif
+
+ifneq ($(wildcard $(SOURCES_DIR)/Standalone.mk),)
+# Standalone make outside of OCERA framework
+
+all: default
+
+.PHONY: dep default subdirs clean cleandepend
+.PHONY: check-dir include-pass library-pass binary-pass utils-pass kernel-lib-pass kernel-pass
+
+dirs = src utils
+
+default dep clean install utils-pass kernel-pass:
+       $(foreach dir, $(dirs), $(MAKE) -C $(SOURCES_DIR)/$(dir) \
+           SOURCES_DIR=$(SOURCES_DIR)/$(dir) $@ ; )
+
+else
+# Build in structure of OCERA framework
+
+TOPDIR = $(LINUX_DIR)
+
+ifneq ($(wildcard ../../../../ocera.mk),)
+include ../../../../ocera.mk
+else
+all: 
+       @echo -e "\nTo build LinCAN driver for OCERA framework, ocera.mk file have"
+       @echo -e "to be generated first. Go to ocera/ directory and do 'make', please."
+       @echo -e "If standalone build is required, mark lincan/ by 'touch ./Standalone.mk'.\n"
+endif
+endif
+
diff --git a/lincan-0.3.3/README b/lincan-0.3.3/README
new file mode 100644 (file)
index 0000000..00f8768
--- /dev/null
@@ -0,0 +1,293 @@
+
+               Linux CAN Driver (LinCAN) version 0.3.3
+               Pavel Pisa <pisa@cmp.felk.cvut.cz>
+                       OCERA team member <http://www.ocera.org>
+                       Real-time Systems Laboratory <http://rtlab.felk.cvut.cz/>
+                       Department of Control Engineering, FEE CTU
+
+
+INTRODUCTION
+============
+The LinCAN is an implementation of the Linux CAN-bus device driver supporting
+more CAN controller chips and many CAN interface boards. Its development
+has long history already. The OCERA version of the driver has new better
+designed internal structure, adds new features (as support for open by multiple
+applications, select system call) and other enhancements.
+  
+The driver consist of four main layers:
+  - chip level manipulation routines
+  - board specific support
+  - message queues
+  - user-space API and ABI character device interface
+
+
+DRIVER HISTORY
+==============
+
+The driver originates in The Linux Lab Project
+  http://www.llp.fu-berlin.de/
+then it has been first rewritten by Arnaud Westenberg
+  http://home.wanadoo.nl/arnaud/
+now it is developed and maintained as part of OCERA framework
+  http://www.ocera.org/
+
+I am unable to contact previous maintainer Arnaud Westenberg
+(arnaud@wanadoo.nl). If you know something about him, I like
+to hear it.
+
+Versions:
+
+can-0.7.1      latest driver version version published
+               by Arnaud Westenberg
+
+can-0.7.1-tm5  the enhanced version with better support of
+               SJA1000 PeliCAN mode and CAN Ethernet proxy
+               contributed by Tomasz Motylewski <T.Motylewski@bfad.de>
+
+can-0.7.1-pi1  the import and usage of previous version for
+(Dec 2002)     OCERA group purposes
+               
+can-0.7.1-pi3.4 enhanced version with select support and rewritten
+(Mar 2003)     make system for Linux kernels (2.2.x,2.4.x,2.5.x),
+               interrupts service cleanup and partial redesign
+               and DEVFS support
+
+lincan-0.2-pre heavily rewritten infrastructure of the driver based
+(Aug 2003)     on atomic slot management of queues
+
+lincan-0.2     version tested on many bords and 2.2, 2.4, 2.6 Linux
+(Mar 2004)     and RT-Linux enabled 2.4 Linux kernel
+
+lincan-0.2.8   possible SMP and HT deadlock fixed, driver can take
+(Jul 2004)     advantage of CMPXCHG instruction if present on CPU,
+               added support for CPC-PCI and PCAN-PCI cards,
+               messages timestamping implemented
+               partially implemented support for Bosch C_CAN module,
+               requires more work and real hardware
+
+lincan-0.3     Changed SJA1000 chip IRQ handling. Enhanced VME
+(Nov 2004)     and EMS CPC-PCI support and many other changes.
+
+lincan-0.3.1   Small improvements, RTR read moved into separate IOCTL,
+(Jul 2005)     initial support for some boards contributed by users
+
+lincan-0.3.2   Improvements in SJA1000 error handling and reporting,
+(Feb 2006)     i82527 support fixes, simple UDEV support,
+               updates for kernels up to 2.6.15 and fully preemptive
+               kernel compatibility. Support for MX1_DIS1 extension
+               board for PiMX1 ARM based BCC.
+
+lincan-0.3.3   Some more fixes of SJA1000 buss-of recovery,
+(May 2006)     i82527 IRQ stuck problem fixed (reported by Terence Soh),
+               tested up to 2.6.17 (rc4). Minimal chip info in /proc/can.
+               Support for NSI CAN PCI contributed by Eric Pennamen.
+
+               
+The actual version of driver have been latest tested it with
+  - PC104 Advantech PCM3680 dual channel board on 2.4 RT-Linux enabled kernel
+  - PiKRON ISA card on 2.4.and 2.6 Linux kernels
+  - PiKRON CAN extension board for PiMCX1 ARM BCC on 2.6 Linux kernels
+  - BfaD DIMM PC card on 2.4 RT-Linux enabled kernel
+  - KVASER pcican-q on 2.6 Linux kernel
+  - MICROSPACE msmcan on 2.4 Linux and RT-Linux enabled kernel
+  - Unicontrols PCAN ("unican"),PCAN-PCI ("unican-pci"), VCAN  ("unican-vme")
+  - EMS CPC-PCI cards ("ems_cpcpci")
+  - virtual board tested on all systems as wel
+It takes more time to test driver with more cards.
+Infrastructure and support for more than 20 boards with more
+variants is prepared in the sources.
+
+
+SOURCES AND URLs
+================
+
+The LinCAN driver component page at OCERA web site
+(not updated to the new version yet)
+
+  http://www.ocera.org/download/components/WP7/lincan-0.3.1.html
+  
+List of related communication components
+  
+  http://www.ocera.org/download/components/WP7/index.html
+
+The obtaining LinCAN and other CAN related components
+from OCERA CVS repository at SourceForge
+
+  EXTCVS=":pserver:anonymous@cvs.ocera.sourceforge.net:/cvsroot/ocera"
+  cvs -d$EXTCVS login
+  cvs -z3 -d$EXTCVS co ocera/components/comm/can
+  
+Web access into CVS
+
+  http://ocera.cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ocera/ocera/components/comm/can/lincan/
+
+Experimental directory at maintainer's (Pavel Pisa's) pages 
+
+  http://cmp.felk.cvut.cz/~pisa/can/
+  http://cmp.felk.cvut.cz/~pisa/can/lincan-YYMMDD.tar.gz
+  
+Please send comments, bug-fixes and enhancements directly to
+Pavel Pisa <pisa@cmp.felk.cvut.cz> or to OCERA discussion
+forum <https://sourceforge.net/forum/forum.php?forum_id=170893> 
+and lists <ocera-development@lists.sourceforge.net>
+
+Driver documentation can be found at
+
+  http://cmp.felk.cvut.cz/~pisa/can/doc/lincandoc-0.3.pdf
+
+The anouncements of new version are published at FreshMeat page
+
+  http://freshmeat.net/projects/lincan/
+
+
+COMPILATION of LinCAN releases
+==============================
+
+Just type 'make' at the command line and driver module should compile
+without errors for current running kernel. 
+
+More information can be found in driver documentation at
+  http://cmp.felk.cvut.cz/~pisa/can/
+  http://cmp.felk.cvut.cz/~pisa/can/lincandoc-X.Y.pdf
+  
+Some releases use experimental OMK make system, which requires
+recent GNU make program version 3.81beta1 and above.
+Makefiles can be switched to old ones by script
+
+  sh ./switch-omk2std
+  make
+
+If you have problem to obtain recent GNU make program,
+
+ ftp://alpha.gnu.org/gnu/make/make-3.81beta4.tar.bz2
+
+you can use our local copy
+
+  http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz
+
+
+COMPILATION from CVS sources without full OCERA tree
+====================================================
+  
+---------------------------------------------------------------------------
+Obtaining CVS sources of the CAN components only
+---------------------------------------------------------------------------
+  cvs -d:pserver:anonymous@ocera.cvs.sourceforge.net:/cvsroot/ocera login
+  cvs -z3 -d:pserver:anonymous@ocera.cvs.sourceforge.net:/cvsroot/ocera co
+         ocera/components/comm/can
+
+---------------------------------------------------------------------------
+Commands to build OCERA CVS CAN components outside OCERA tree
+---------------------------------------------------------------------------
+  cd ocera/components/comm/can
+  ./switch2standalone
+  make
+
+The selection of required features and options can be specified before make 
+command invocation. Lines containing required changes to config.omk-default 
+file should be stored in config.omk file. The config.omk is not altered by 
+OMK system and options defined there override values defined in 
+config.omk-default file. GNU make program version 3.81beta1 or newer is 
+required by OMK make-system. If this is problem, LinCAN driver can be 
+compiled with use of old style Makefiles as well.
+
+---------------------------------------------------------------------------
+Old style Makefiles compilation of the LinCAN driver only
+---------------------------------------------------------------------------
+  cd ocera/components/comm/can/lincan
+  ./switch-omk2std
+  make
+
+
+INSTALLATION
+============
+Type 'make install' for standard make system compilation.
+The driver should be copied into actual kernel version
+modules directory "/lib/modules/x.y.z/kernel/drivers/char".
+
+OMK system requires manual copy of files from "_compiled" tree
+to its final destinations.
+
+Create file "lincan.rules" with contents listed below in or linked
+into "/etc/udev/rules.d" directory to enable automatic device nodes
+creation for UDEV based system
+
+  # LinCAN driver
+  SUBSYSTEM=="can",GROUP="users",MODE="0660"
+
+The driver automatic loding can be requested by addition of "lincan"
+line into "/etc/modules" od Debian based systems.
+
+The target hardware/board specific options should be added into
+"/etc/modprobe.conf" file or file with similar functionality for your
+distribution. The options are discusses in the next paragraph.
+
+LOADING
+=======
+
+To load the driver type:
+# insmod can.o hw='your hardware' irq='irq number' io='io address' <options>
+Examples: # insmod can.o hw=pip5 irq=4 io=0x8000
+          # insmod can.o hw=virtual io=0
+
+The hw argument can be one of:
+- pip5, for the PIP5 computer by MPL
+- pip6, for the PIP6 computer by MPL
+- pip7, for the PIP7 computer by MPL
+- pip8, for the PIP8 computer by MPL
+- pccan-q, for the PCcan-Q ISA card by KVASER
+- pccan-f, for the PCcan-F ISA card by KVASER
+- pccan-s, for the PCcan-S ISA card by KVASER
+- pccan-d, for the PCcan-D ISA card by KVASER
+- pcican-q, for the PCIcan-Q PCI card by KVASER (4x SJA1000)
+- pcican-d, for the PCIcan-Q PCI card by KVASER (2x SJA1000)
+- pcican-s, for the PCIcan-Q PCI card by KVASER (1x SJA1000)
+- smartcan for i82527 based card with indexed access
+- nsican, for the CAN104 PC/104 card by NSI
+- nsicanpci, for NSI CAN PCI card (2xi82527)
+- cc104, for the CAN104 PC/104 card by Contemporary Controls
+- aim104, for the AIM104CAN PC/104 card by Arcom Control Systems
+- pc-i03, for the PC-I03 ISA card by IXXAT
+- pcm3680, for the PCM-3680 PC/104 card by Advantech
+- m437, for the M436 PC/104 card by SECO
+- bfadcan for sja1000 CAN embedded card made by BFAD GmbH
+- pikronisa for ISA memory mapped sja1000 CAN card made by PiKRON Ltd.
+- pimx1 for MX1_DIS1 extension board for PiMX1 ARM based BCC
+- msmcan for MICROSPACE IO space indexed i82527
+- unican for Unicontrols PCAN card
+- unican-pci for Unicontrols PCAN-PCI card
+- unican-vme for Unicontrols VCAN card
+- ipci165 for IXXAT iPC-I 165 (PCI), requires CONFIG_OC_LINCAN_CARD_ipci165=y
+- ems_cpcpci for EMS CPC-PCI card
+- pcan_dongle for PEAK's printer port dongle addapter
+- oscar for SJA1000 based card connected to ARM LH7A400 SoC
+- eb8245 for Kontron EB8245 onboard CAN with SJA1000 controller
+- adlink7841 for ADLINK PCI-7841 dual SJA1000 based card
+- tscan1 for Technologic Systems' TS-CAN1 single SJA1000 based board
+- ts7kv for Technologic Systems' TS-7KV Multi-function board with SJA1000
+   both these cards require CONFIG_OC_LINCAN_CARD_tscan1=y
+- template, for yet unsupported hardware (you need to edit src/template.c)
+- virtual, CAN channel for testing of software and driver without CAN hardware
+
+options can be one of:
+- major=<nr>, major specifies the major number of the driver.
+- minor=<nr>, you can specify which minor numbers the driver should use for your
+  hardware.
+- extended=[1|0], configures the driver to use extended message format.
+- pelican=[1|0], configures the driver to set the CAN chips into pelican mode.
+- baudrate=<nr>, sets the baudrate of the device(s)
+- clock_freq=<nr>, the frequency of the CAN quartz
+- stdmask=<nr>, sets the standard mask of the device
+- extmask=<nr>, sets the extended mask of the device
+- mo15mask=<nr>, sets the mask for message object 15 (i82527 only)
+- processlocal=<nr>, controls distribution of send messages to Rx FIFOs
+               0, no local outgoing messages delivery to Rx FIFOs
+               1, default off, but can be controlled by individual filter settings
+               2, all FIFOs receive local messages
+
+There's still a lot of work to do, have a look at the TODO file for more
+information.
+
+Some boards support is compiled in only, when it is enabled through
+config.omk file. It has to be stored in same directory as Makefile.rules
+and config.omk-default is located.
diff --git a/lincan-0.3.3/README.makerules b/lincan-0.3.3/README.makerules
new file mode 100644 (file)
index 0000000..3594ad9
--- /dev/null
@@ -0,0 +1,249 @@
+Description of OCERA Make System for CAN Components (OMK)
+=========================================================
+
+Important notice:
+This make system uses features found in recent versions of GNU Make
+program. If you encounter problems with package building,
+check, that you use correct version of Make program.
+The Make older than version 3.80, could not be used.
+Even Make version 3.80 has annoying bug which causes
+building fail with misleading message "virtual memory exhausted".
+Please, upgrade to last version of Make (3.81beta1).
+You can take it from GNU CVS, Paul D. Smith's site or from our local copy
+  http://paulandlesley.org/make/make-3.81beta1.tar.bz2
+  http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz
+
+
+There is list of features which we want to solve with our makesystem:
+ - central Makefile.rules for most of subcomponents and components
+  (our CAN framework includes more libraries common with our other projects,
+   we need to separate some utility libraries etc.)
+ - the rules in more spread Makefiles are way to the hell,
+  (update for different kernel, RT-Linux etc would be nightmare in other case)
+ - make system should allow to freely move with cross-dependant components
+   without need to update users of moved component
+  (I hate somethink like -I../../sched/rtlshwq/include in CAN makefiles
+   for example. Component could be renamed to different name or version
+   could be added to name and all Makefiles in CAN would require to
+   be updated)
+ - make system should be able to compile mutually cross-dependant libraries
+   and should ensure, that change in one component sources or headers
+   would result in relink or rebuild in components linked against that library
+   or including modified header file
+ - make system has to enable compilation out of OCERA full source tree
+  (we would lost many users of particular components in other case)
+ - compile should be able to do all above work without need to install
+   any files before successful finish of build.
+ - because we use some libraries for RT-Linux build and userspace
+   build, we need to solve how to compile from same sources to both targets.
+ - the build system should allow to call make for particular source
+   subdirectory. Time of recursive make through all subdirectories is
+   unacceptable.
+ - make system should enable to build out of sources tree
+  (else clean or working with CVS sandbox gets fussy and simultaneous
+   multiple targets gets problematic)
+ - it would be good, if there would be possibility to make from read-only
+   media sources
+ - make system should store results of build in some separate directory
+   structure to simple install and testing
+ - Makefiles in sources directories should be simple
+
+There is probably only one alternative fully supporting above requirements
+and it is GNU Autoheader...Automake...Autoconf... system.
+But it is complicated and requires big amount of support files.
+It would be acceptable if it could be easily used for OCERA framework.
+But there are important show stopper for that system:
+ - it would require deep revision of all OCERA CVS contents and agreement
+   on this would be problematic
+ - this system is not well prepared for dual compilation for Linux
+   and RT-Linux sub-targets. It would mean many changes in default
+   autoconf setup to support this. Probably simplest way would be
+   to rebuild GCC tool chain for something like i586-elf-rtlinux.
+   This would require even more space for OCERA development.
+
+The problem calls for same solution, which would have minimal impact
+on other components and would be elegant and would be maintainable
+and small, because our main goal is components development and not
+make systems development.
+
+There is result of our trial. It is OMK make system.
+The Makefile and Makefile.omk files should be in all source
+directories. Common Makefile.rules file is required in the toplevel
+sources directory. Alternatively this file could be moved
+to link tree pointing into readonly media or can be anywhere
+else if MAKERULES_DIR and SOURCES_DIR are specified.
+
+Syntax of Makefile.omk files is for usual cases compatible
+to Automake's Makefile.am descriptions. There are specific targets
+for RT-Linux and Linux kernel related stuff
+
+Makefile.omk user defined variables
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# lib_LIBRARIES    .. list of the user-space libraries
+# shared_LIBRARIES .. list of the user-space shared libraries
+# kernel_LIBRARIES .. list of the kernel-space libraries
+# rtlinux_LIBRARIES.. list of the RT-Linux kernel-space libraries
+# include_HEADERS  .. list of the user-space header files
+# nobase_include_HEADERS .. headers copied even with directory part
+# kernel_HEADERS   .. list of the kernel-space  header files
+# rtlinux_HEADERS  .. list of the RT-Linux kernel-space  header files
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# kernel_MODULES   .. list of the kernel side modules/applications
+# rtlinux_MODULES  .. list of RT-Linux the kernel side modules/applications
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# kernel_INCLUDES  .. additional include directories and defines for kernel-space
+# rtlinux_INCLUDES .. additional include directories and defines for RT-Linux
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+
+The Makefile is same for all sources directories and is only 14 lines long.
+It is there only for convenience reasons to enable call "make" from
+local directory. It contains code which locates Makefile.rules in actual
+or any parent directory. With standard BASH environment it works such way,
+that if you get into sources directory over symbolic links, it is able to
+unwind yours steps back => you can make links to readonly media component
+directories, copy Makefile.rules, Makefile and toplevel Makefile.omk,
+adjust Makefile.omk to contain only required components and then call
+make in top or even directories after crossing from your tree
+to readonly media.
+
+The system compiles all files out of source directories.
+The actual version of system is adapted even for OCERA tree mode
+if OCERA_DIR variable is defined in Makefile.rules
+
+There are next predefined directory name components,
+which can be adapted if required
+
+BUILD_DIR_NAME = _build
+       prefix of directory, where temporary build files are stored
+COMPILED_DIR_NAME = _compiled
+       prefix of directory, where final compilation results are stored
+GROUP_DIR_NAME = yyy
+       this is used for separation of build sub-trees in OCERA environment
+       where more Makefile.rules is spread in the tree
+
+Next directories are used:
+
+KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
+        directory to store intermediate files for kernel-space targets
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+        directory to store intermediate files for user-space targets
+
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+        directory to store exported include files which should be installed later
+        on user-space include path
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+        same for user-pace libraries
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+        utilities for testing, which would not probably be installed
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+        binaries, which should go into directory on standard system PATH
+        (/usr/local/bin, /usr/bin or $(prefix)/bin)
+
+KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
+        directory to store exported include files which should be installed later
+        on kernel-space include path
+KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
+        same for kernel-pace libraries
+KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
+        builded modules for Linux kernel or RT-Linux system
+
+There is more recursive passes through directories to enable
+mutual dependant libraries and binaries to compile.
+Next passes are defined
+
+default-config .. generates config.omk-default or xxx-default configuration file
+check-dir      .. checks and creates required build directories
+include-pass   .. copyes header files to USER_INCLUDE_DIR and KERN_INCLUDE_DIR
+library-pass   .. builds objects in USER_BUILD_DIR/<relative path> and creates
+                  libraries in USER_LIB_DIR
+binary-pass and utils-pass .. links respective binaries
+                in USER_{BIN,UTILS}_DIR directory. If some object file is missing
+                it compiles it in  USER_BUILD_DIR/<relative path>
+kernel-lib-pass .. builds libraries for kernel space targets
+kernel-pass    .. builds kernel modules
+
+The amount of passes is relatively high and consumes some time.
+But only other way to support all required features is to assemble
+one big toplevel Makefile, which would contain all components
+and targets cross-dependencies.
+
+Drawbacks of designed make system
+ - the system is not as fast as we would like
+ - it lacks Autoconf and configure extensive support for many systems
+   from UNIX to DOS and WINDOWS
+ - it does not contain support for checking existence of target libraries
+   and functionalities as GNU Autoconf
+ - it is heavily dependant on GNU MAKE program. But it would not be big
+   problem, because even many commercial applications distribute GNU
+   MAKE with them to be able to work in non-friendly systems
+ - the key drawback is dependence on recent MAKE version 3.80 and better
+   and even version 3.80 of MAKE has important bug, which has been
+   corrected in newer sources
+
+The last point is critical. I have not noticed it first, because
+I use Slackware-9.2 and it contains latest released version 
+of MAKE (version 3.80).
+The problem appears when I have tried to build bigger libraries.
+There is bug in version 3.80, which results in misleading
+error "Virtual memory exhausted". It is known bug with ID 1517
+
+    * long prerequisite inside eval(call()) => vm exhausted, Paul D. Smith
+
+I have optimized some rules to not push memory to the edge,
+but there could be still issues with 3.80 version.
+
+I have downloaded latest MAKE CVS sources. The compilation required
+separate lookup and download for .po files and full Autoheader... cycle.
+I have put together package similar to release. Only ./configure --prefix=...
+and make is required. CVS sources contains version 3.81beta1.
+You can download prepared sources archive from
+  http://paulandlesley.org/make/make-3.81beta1.tar.bz2
+Or you can get our local copy from
+  http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz
+
+The archive contains even "make" binary build by me, which should work
+on other Linux distributions as well. 
+Older version of MAKE (3.79.x released about year 2000) found
+on Mandrake and RedHat are not sufficient and do not support eval feature.
+I do not expect, that Debian would be more up-to-date or contain fixes
+to MAKE vm exhausted bug.
+
+The local CTU archive with our CAN components prepared for inclusion
+into OCERA SF CVS could be found in my "can" directory
+
+  http://cmp.felk.cvut.cz/~pisa/can/ocera-can-031212.tar.gz
+
+The code should build for user-space with new make on most of Linux distros
+when make is updated.
+
+If you want to test compile for RT-Linux targets, line
+
+#RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
+
+in "Makefile.rules" has to be activated and updated
+to point RT-Linux directory containing "rtl.mk".
+There is only one library ("ulutrtl") and test utility compiled for RT-Linux
+("can/utils/ulut/ul_rtlchk.c").
+
+The next line ,if enabled, controls compilation in OCERA project tree
+
+#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
+
+The LinCAN driver has been updated to compile out of source directories.
+
+Please, check, if you could compile CAN package and help us with integration
+into OCERA SF CVS. Send your comments and objections. 
+
+The OMK system has been adapted to support actual OCERA configuration process.
+I am not happy with ocera.mk mix of defines and poor two or three rules,
+but OMK is able to overcome that.
+
+The OMK system has integrated rules (default-config) to build default configuration
+file. The file is named "config.omk-default" for the stand-alone compilation.
+The name corresponds to OCERA config + "-default" if OCERA_DIR is defined.
+This file contains statements from all default_CONFIG lines in all Makefile.omk.
+The file should be used for building of own "config.omk" file, or as list
+for all options if Kconfig is used.
+
diff --git a/lincan-0.3.3/TODO b/lincan-0.3.3/TODO
new file mode 100644 (file)
index 0000000..a47a84f
--- /dev/null
@@ -0,0 +1,27 @@
+Things that still not finished in LinCAN version 0.3:
+
++ Add proper comment to the code (many comments added,
+  but this is never ending story)
+
+- Error handling/reporting and statistics
+  Probably take concept from Ake Hedman's driver
+  <http://sourceforge.net/projects/can/>
+
+- Proc directory
+  Expose statistics through proc files
+
+- Lot of ioctl's and API compatibility
+  This is Achilles heel of all Linux CAN project's,
+  because there is no standard for CAN drivers IOCTLs
+  and messages format.
+  LinCAN has aim to be long term high quality CAN driver for Linux
+  with support for most of existing hardware, which should
+  be usable instead of many card and vendor specific 
+  driver branches.
+  Actual LinCAN message format has been adjusted to be compatible
+  with Port.de standard. 
+  Long term goal of API convergence should be negotiated with other
+  drivers maintainers.
+  One possible way is to add both Port.de and Ake's IOCTLs
+  to LinCAN.
+
diff --git a/lincan-0.3.3/Unsupported-hardware b/lincan-0.3.3/Unsupported-hardware
new file mode 100644 (file)
index 0000000..a127595
--- /dev/null
@@ -0,0 +1,23 @@
+Unsupported-hardware 
+Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+This software is released under the GPL-License.
+Version 0.7  6 Aug 2001
+
+If your hardware is currently not supported there are two things you can do:
+1) Edit the file src/template.c
+2) Send an email to arnaud@wanadoo.nl
+
+If you choose to add the code yourself, all you have to do is edit the file
+template.c. This file contains hardware specific template functions wich you can
+edit to make the hardware work with the driver. When you have edited this file
+you can simply load the driver with the module parameter hw=template and all
+should work fine. IMO the functions in template.c are well commented and you 
+should have little trouble in adding/changing the correct code. If it still 
+doesn't work feel free to contact me at arnaud@wanadoo.nl. In case you've
+sucessfully changed the template.c file, please send this file (no patches 
+please) to me so I can extend the drivers supported hardware base.
+
+If you don't have the skills to add/change the code yourself, feel free to 
+contact me at arnaud@wanadoo.nl
+
+
diff --git a/lincan-0.3.3/config.omk-default b/lincan-0.3.3/config.omk-default
new file mode 100644 (file)
index 0000000..52a1c9b
--- /dev/null
@@ -0,0 +1,42 @@
+# Start of OMK config file
+# This file should not be altered manually
+# Overrides should be stored in file config.omk
+
+# Config for src
+CONFIG_OC_LINCAN=y
+CONFIG_OC_LINCANRTL=n
+CONFIG_OC_LINCANVME=n
+CONFIG_OC_LINCAN_PORTIO_ONLY=n
+CONFIG_OC_LINCAN_MEMIO_ONLY=n
+CONFIG_OC_LINCAN_DETAILED_ERRORS=y
+CONFIG_OC_LINCAN_CARD_pip=y
+CONFIG_OC_LINCAN_CARD_pccan=y
+CONFIG_OC_LINCAN_CARD_smartcan=y
+CONFIG_OC_LINCAN_CARD_nsi=y
+CONFIG_OC_LINCAN_CARD_cc_can104=y
+CONFIG_OC_LINCAN_CARD_ems_cpcpci=y
+CONFIG_OC_LINCAN_CARD_pc_i03=y
+CONFIG_OC_LINCAN_CARD_pcm3680=y
+CONFIG_OC_LINCAN_CARD_aim104=y
+CONFIG_OC_LINCAN_CARD_m437=y
+CONFIG_OC_LINCAN_CARD_pcccan=y
+CONFIG_OC_LINCAN_CARD_ssv=y
+CONFIG_OC_LINCAN_CARD_bfadcan=y
+CONFIG_OC_LINCAN_CARD_pikronisa=y
+CONFIG_OC_LINCAN_CARD_eb8245=y
+CONFIG_OC_LINCAN_CARD_kv_pcican=y
+CONFIG_OC_LINCAN_CARD_msmcan=y
+CONFIG_OC_LINCAN_CARD_oscar=y
+CONFIG_OC_LINCAN_CARD_adlink7841=y
+CONFIG_OC_LINCAN_CARD_unican=y
+CONFIG_OC_LINCAN_CARD_virtual=y
+CONFIG_OC_LINCAN_CARD_template=y
+CONFIG_OC_LINCAN_CARD_hms30c7202_can=n
+CONFIG_OC_LINCAN_CARD_ns_dev_can=n
+CONFIG_OC_LINCAN_CARD_ipci165=n
+CONFIG_OC_LINCAN_CARD_pimx1=n
+CONFIG_OC_LINCAN_CARD_tscan1=n
+# Config for utils
+#CONFIG_OC_LINCAN=x
+#CONFIG_OC_LINCANRTL=x
+# Config for 
diff --git a/lincan-0.3.3/doc/Makefile b/lincan-0.3.3/doc/Makefile
new file mode 100644 (file)
index 0000000..de627ad
--- /dev/null
@@ -0,0 +1,38 @@
+TOPDIR=$(CURDIR)/..
+#PATH:="$(PATH):$(PWD)/../scripts"
+#export PATH
+TMPL2XML=../scripts/tmpl2xml
+export TMPL2XML
+KERNELDOC=$(TOPDIR)/scripts/kernel-doc
+export KERNELDOC
+
+TMPLFILES=lincanbook.tmpl
+
+%.xml: %.tmpl
+       $(TMPL2XML) $< >$@
+
+%.pdf : %.xml
+       @(which docbook2pdf > /dev/null 2>&1) || \
+        (echo "*** You need to install DocBook stylesheets ***"; \
+         exit 1)
+       docbook2pdf $<
+
+%.html:        %.xml
+       @(which docbook2pdf > /dev/null 2>&1) || \
+        (echo "*** You need to install DocBook stylesheets ***"; \
+         exit 1)
+       docbook2html $<
+
+all: default lincandoc/lincan/lincan_internals.xml
+
+default: xmldocs htmldocs pdfdocs
+
+xmldocs: $(TMPLFILES:%.tmpl=%.xml)
+
+htmldocs: $(TMPLFILES:%.tmpl=%.html)
+
+pdfdocs: $(TMPLFILES:%.tmpl=%.pdf)
+
+clean:
+       rm -f *.xml *.html *.log *.aux \
+           $(TMPLFILES:%.tmpl=%.pdf) $(TMPLFILES:%.tmpl=%.out)
diff --git a/lincan-0.3.3/doc/book.ent b/lincan-0.3.3/doc/book.ent
new file mode 100644 (file)
index 0000000..7866242
--- /dev/null
@@ -0,0 +1,7 @@
+<!ENTITY % lincanpath "lincandoc">
+
+<!ENTITY % lincan_entities SYSTEM "lincandoc/lincan_incl.ent">
+
+%lincan_entities
+
+
diff --git a/lincan-0.3.3/doc/lincanbook.xml b/lincan-0.3.3/doc/lincanbook.xml
new file mode 100644 (file)
index 0000000..7b7ed68
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version='1.0'?>
+<!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V4.1.2//EN"
+               "/usr/lib/sgml/dtd/docbook-xml/docbookx.dtd"
+       [
+       <!ENTITY % entities SYSTEM "book.ent">
+       %entities;
+       <!-- Add other entries here     -->
+       ]
+>
+<book lang="en">
+<bookinfo>
+       <title>Linux/RT-Linux CAN Driver (LinCAN)</title>
+       <authorgroup>
+       <author>
+        <firstname>Pavel</firstname>
+        <surname>Pisa</surname>
+        <affiliation>
+         <orgname>CTU</orgname>
+        </affiliation>
+       </author>
+       </authorgroup>
+       <pubdate>June 2005</pubdate>
+       <copyright>
+               <year>2005</year>
+               <holder>Ocera</holder>
+       </copyright>
+       <legalnotice>
+        <para>
+         You can (in fact you must!) use, modify, copy and distribute
+         this document, of course free of charge, and think about the
+         appropriate license we will use for the documentation.
+        </para>         
+       </legalnotice>
+</bookinfo>
+
+<preface>
+       <title>Preface</title>
+       <para>LinCAN is a Linux kernel module that implements a CAN driver capable of
+       working with multiple cards, even with different chips and IO methods.
+       Each communication object can be accessed from multiple applications concurrently.
+       It supports RT-Linux, 2.2, 2.4, and 2.6 with fully implemented select, poll, fasync,
+       O_NONBLOCK, and O_SYNC semantics and multithreaded read/write capabilities.
+       It works with the common Intel i82527, Philips 82c200, and Philips SJA1000
+       (in standard and PeliCAN mode) CAN controllers. It is part of a set of CAN/CANopen
+       related components developed as part of OCERA framework.</para>
+</preface>
+
+&lincan;
+
+
+<!-- Add other entries here    -->
+</book>
diff --git a/lincan-0.3.3/doc/lincandoc-0.3.pdf b/lincan-0.3.3/doc/lincandoc-0.3.pdf
new file mode 100644 (file)
index 0000000..55ff21d
--- /dev/null
@@ -0,0 +1,40070 @@
+%PDF-1.4
+1 0 obj
+<< /S /GoTo /D (0.1.1) >>
+endobj
+4 0 obj
+()
+endobj
+5 0 obj
+<< /S /GoTo /D (1.0) >>
+endobj
+8 0 obj
+(Linux/RTLinux CAN Driver \(LinCAN\))
+endobj
+9 0 obj
+<< /S /GoTo /D (2.0) >>
+endobj
+12 0 obj
+(Table of Contents)
+endobj
+13 0 obj
+<< /S /GoTo /D (3.0) >>
+endobj
+16 0 obj
+(List of Figures)
+endobj
+17 0 obj
+<< /S /GoTo /D (4.0) >>
+endobj
+20 0 obj
+(Preface)
+endobj
+21 0 obj
+<< /S /GoTo /D (5.0) >>
+endobj
+24 0 obj
+(Chapter 1. Linux/RTLinux CAN Driver \(LinCAN\))
+endobj
+25 0 obj
+<< /S /GoTo /D (6.0) >>
+endobj
+28 0 obj
+(1.1. LinCAN Summary)
+endobj
+29 0 obj
+<< /S /GoTo /D (6.2.1) >>
+endobj
+32 0 obj
+(1.1.1. Summary)
+endobj
+33 0 obj
+<< /S /GoTo /D (7.0) >>
+endobj
+36 0 obj
+(1.2. LinCAN Driver Description)
+endobj
+37 0 obj
+<< /S /GoTo /D (7.3.1) >>
+endobj
+40 0 obj
+(1.2.1. Introduction)
+endobj
+41 0 obj
+<< /S /GoTo /D (8.0) >>
+endobj
+44 0 obj
+(1.3. LinCAN Driver System Level API)
+endobj
+45 0 obj
+<< /S /GoTo /D (8.4.1) >>
+endobj
+48 0 obj
+(1.3.1. Device Files and Message Structure)
+endobj
+49 0 obj
+<< /S /GoTo /D (8.5.1) >>
+endobj
+52 0 obj
+(1.3.2. CAN Driver File Operations)
+endobj
+53 0 obj
+<< /S /GoTo /D (8.6.1) >>
+endobj
+56 0 obj
+(open)
+endobj
+57 0 obj
+<< /S /GoTo /D (8.6.1.2) >>
+endobj
+60 0 obj
+(Name)
+endobj
+61 0 obj
+<< /S /GoTo /D (8.6.2.2) >>
+endobj
+64 0 obj
+(Synopsis)
+endobj
+65 0 obj
+<< /S /GoTo /D (8.6.3.2) >>
+endobj
+68 0 obj
+(Arguments)
+endobj
+69 0 obj
+<< /S /GoTo /D (8.6.4.2) >>
+endobj
+72 0 obj
+(Description)
+endobj
+73 0 obj
+<< /S /GoTo /D (8.7.1) >>
+endobj
+76 0 obj
+(close)
+endobj
+77 0 obj
+<< /S /GoTo /D (8.7.5.2) >>
+endobj
+80 0 obj
+(Name)
+endobj
+81 0 obj
+<< /S /GoTo /D (8.7.6.2) >>
+endobj
+84 0 obj
+(Synopsis)
+endobj
+85 0 obj
+<< /S /GoTo /D (8.7.7.2) >>
+endobj
+88 0 obj
+(Arguments)
+endobj
+89 0 obj
+<< /S /GoTo /D (8.7.8.2) >>
+endobj
+92 0 obj
+(Description)
+endobj
+93 0 obj
+<< /S /GoTo /D (8.8.1) >>
+endobj
+96 0 obj
+(read)
+endobj
+97 0 obj
+<< /S /GoTo /D (8.8.9.2) >>
+endobj
+100 0 obj
+(Name)
+endobj
+101 0 obj
+<< /S /GoTo /D (8.8.10.2) >>
+endobj
+104 0 obj
+(Synopsis)
+endobj
+105 0 obj
+<< /S /GoTo /D (8.8.11.2) >>
+endobj
+108 0 obj
+(Arguments)
+endobj
+109 0 obj
+<< /S /GoTo /D (8.8.12.2) >>
+endobj
+112 0 obj
+(Description)
+endobj
+113 0 obj
+<< /S /GoTo /D (8.9.1) >>
+endobj
+116 0 obj
+(write)
+endobj
+117 0 obj
+<< /S /GoTo /D (8.9.13.2) >>
+endobj
+120 0 obj
+(Name)
+endobj
+121 0 obj
+<< /S /GoTo /D (8.9.14.2) >>
+endobj
+124 0 obj
+(Synopsis)
+endobj
+125 0 obj
+<< /S /GoTo /D (8.9.15.2) >>
+endobj
+128 0 obj
+(Arguments)
+endobj
+129 0 obj
+<< /S /GoTo /D (8.9.16.2) >>
+endobj
+132 0 obj
+(Description)
+endobj
+133 0 obj
+<< /S /GoTo /D (8.10.1) >>
+endobj
+136 0 obj
+(struct canfiltt)
+endobj
+137 0 obj
+<< /S /GoTo /D (8.10.17.2) >>
+endobj
+140 0 obj
+(Name)
+endobj
+141 0 obj
+<< /S /GoTo /D (8.10.18.2) >>
+endobj
+144 0 obj
+(Synopsis)
+endobj
+145 0 obj
+<< /S /GoTo /D (8.10.19.2) >>
+endobj
+148 0 obj
+(Members)
+endobj
+149 0 obj
+<< /S /GoTo /D (8.11.1) >>
+endobj
+152 0 obj
+(IOCTL CANQUEFILTER)
+endobj
+153 0 obj
+<< /S /GoTo /D (8.11.20.2) >>
+endobj
+156 0 obj
+(Name)
+endobj
+157 0 obj
+<< /S /GoTo /D (8.11.21.2) >>
+endobj
+160 0 obj
+(Synopsis)
+endobj
+161 0 obj
+<< /S /GoTo /D (8.11.22.2) >>
+endobj
+164 0 obj
+(Arguments)
+endobj
+165 0 obj
+<< /S /GoTo /D (8.11.23.2) >>
+endobj
+168 0 obj
+(Description)
+endobj
+169 0 obj
+<< /S /GoTo /D (8.12.1) >>
+endobj
+172 0 obj
+(IOCTL CANQUEFLUSH)
+endobj
+173 0 obj
+<< /S /GoTo /D (8.12.24.2) >>
+endobj
+176 0 obj
+(Name)
+endobj
+177 0 obj
+<< /S /GoTo /D (8.12.25.2) >>
+endobj
+180 0 obj
+(Synopsis)
+endobj
+181 0 obj
+<< /S /GoTo /D (8.12.26.2) >>
+endobj
+184 0 obj
+(Arguments)
+endobj
+185 0 obj
+<< /S /GoTo /D (8.12.27.2) >>
+endobj
+188 0 obj
+(Description)
+endobj
+189 0 obj
+<< /S /GoTo /D (9.0) >>
+endobj
+192 0 obj
+(1.4. LinCAN Driver Architecture)
+endobj
+193 0 obj
+<< /S /GoTo /D (10.0) >>
+endobj
+196 0 obj
+(1.5. Driver History and Implementation Issues)
+endobj
+197 0 obj
+<< /S /GoTo /D (11.0) >>
+endobj
+200 0 obj
+(1.6. LinCAN Driver Internals)
+endobj
+201 0 obj
+<< /S /GoTo /D (11.13.1) >>
+endobj
+204 0 obj
+(1.6.1. Basic Driver Data Structures)
+endobj
+205 0 obj
+<< /S /GoTo /D (11.14.1) >>
+endobj
+208 0 obj
+(struct canhardwaret)
+endobj
+209 0 obj
+<< /S /GoTo /D (11.14.28.2) >>
+endobj
+212 0 obj
+(Name)
+endobj
+213 0 obj
+<< /S /GoTo /D (11.14.29.2) >>
+endobj
+216 0 obj
+(Synopsis)
+endobj
+217 0 obj
+<< /S /GoTo /D (11.14.30.2) >>
+endobj
+220 0 obj
+(Members)
+endobj
+221 0 obj
+<< /S /GoTo /D (11.15.1) >>
+endobj
+224 0 obj
+(struct candevicet)
+endobj
+225 0 obj
+<< /S /GoTo /D (11.15.31.2) >>
+endobj
+228 0 obj
+(Name)
+endobj
+229 0 obj
+<< /S /GoTo /D (11.15.32.2) >>
+endobj
+232 0 obj
+(Synopsis)
+endobj
+233 0 obj
+<< /S /GoTo /D (11.15.33.2) >>
+endobj
+236 0 obj
+(Members)
+endobj
+237 0 obj
+<< /S /GoTo /D (11.15.34.2) >>
+endobj
+240 0 obj
+(Description)
+endobj
+241 0 obj
+<< /S /GoTo /D (11.16.1) >>
+endobj
+244 0 obj
+(struct canchipt)
+endobj
+245 0 obj
+<< /S /GoTo /D (11.16.35.2) >>
+endobj
+248 0 obj
+(Name)
+endobj
+249 0 obj
+<< /S /GoTo /D (11.16.36.2) >>
+endobj
+252 0 obj
+(Synopsis)
+endobj
+253 0 obj
+<< /S /GoTo /D (11.16.37.2) >>
+endobj
+256 0 obj
+(Members)
+endobj
+257 0 obj
+<< /S /GoTo /D (11.16.38.2) >>
+endobj
+260 0 obj
+(Description)
+endobj
+261 0 obj
+<< /S /GoTo /D (11.17.1) >>
+endobj
+264 0 obj
+(struct msgobjt)
+endobj
+265 0 obj
+<< /S /GoTo /D (11.17.39.2) >>
+endobj
+268 0 obj
+(Name)
+endobj
+269 0 obj
+<< /S /GoTo /D (11.17.40.2) >>
+endobj
+272 0 obj
+(Synopsis)
+endobj
+273 0 obj
+<< /S /GoTo /D (11.17.41.2) >>
+endobj
+276 0 obj
+(Members)
+endobj
+277 0 obj
+<< /S /GoTo /D (11.18.1) >>
+endobj
+280 0 obj
+(struct canusert)
+endobj
+281 0 obj
+<< /S /GoTo /D (11.18.42.2) >>
+endobj
+284 0 obj
+(Name)
+endobj
+285 0 obj
+<< /S /GoTo /D (11.18.43.2) >>
+endobj
+288 0 obj
+(Synopsis)
+endobj
+289 0 obj
+<< /S /GoTo /D (11.18.44.2) >>
+endobj
+292 0 obj
+(Members)
+endobj
+293 0 obj
+<< /S /GoTo /D (11.19.1) >>
+endobj
+296 0 obj
+(struct hwspecopst)
+endobj
+297 0 obj
+<< /S /GoTo /D (11.19.45.2) >>
+endobj
+300 0 obj
+(Name)
+endobj
+301 0 obj
+<< /S /GoTo /D (11.19.46.2) >>
+endobj
+304 0 obj
+(Synopsis)
+endobj
+305 0 obj
+<< /S /GoTo /D (11.19.47.2) >>
+endobj
+308 0 obj
+(Members)
+endobj
+309 0 obj
+<< /S /GoTo /D (11.20.1) >>
+endobj
+312 0 obj
+(struct chipspecopst)
+endobj
+313 0 obj
+<< /S /GoTo /D (11.20.48.2) >>
+endobj
+316 0 obj
+(Name)
+endobj
+317 0 obj
+<< /S /GoTo /D (11.20.49.2) >>
+endobj
+320 0 obj
+(Synopsis)
+endobj
+321 0 obj
+<< /S /GoTo /D (11.20.50.2) >>
+endobj
+324 0 obj
+(Members)
+endobj
+325 0 obj
+<< /S /GoTo /D (11.21.1) >>
+endobj
+328 0 obj
+(1.6.2. Board Support Functions)
+endobj
+329 0 obj
+<< /S /GoTo /D (11.22.1) >>
+endobj
+332 0 obj
+(templaterequestio)
+endobj
+333 0 obj
+<< /S /GoTo /D (11.22.51.2) >>
+endobj
+336 0 obj
+(Name)
+endobj
+337 0 obj
+<< /S /GoTo /D (11.22.52.2) >>
+endobj
+340 0 obj
+(Synopsis)
+endobj
+341 0 obj
+<< /S /GoTo /D (11.22.53.2) >>
+endobj
+344 0 obj
+(Arguments)
+endobj
+345 0 obj
+<< /S /GoTo /D (11.22.54.2) >>
+endobj
+348 0 obj
+(Description)
+endobj
+349 0 obj
+<< /S /GoTo /D (11.22.55.2) >>
+endobj
+352 0 obj
+(Return Value)
+endobj
+353 0 obj
+<< /S /GoTo /D (11.22.56.2) >>
+endobj
+356 0 obj
+(File)
+endobj
+357 0 obj
+<< /S /GoTo /D (11.23.1) >>
+endobj
+360 0 obj
+(templatereleaseio)
+endobj
+361 0 obj
+<< /S /GoTo /D (11.23.57.2) >>
+endobj
+364 0 obj
+(Name)
+endobj
+365 0 obj
+<< /S /GoTo /D (11.23.58.2) >>
+endobj
+368 0 obj
+(Synopsis)
+endobj
+369 0 obj
+<< /S /GoTo /D (11.23.59.2) >>
+endobj
+372 0 obj
+(Arguments)
+endobj
+373 0 obj
+<< /S /GoTo /D (11.23.60.2) >>
+endobj
+376 0 obj
+(Description)
+endobj
+377 0 obj
+<< /S /GoTo /D (11.23.61.2) >>
+endobj
+380 0 obj
+(Return Value)
+endobj
+381 0 obj
+<< /S /GoTo /D (11.23.62.2) >>
+endobj
+384 0 obj
+(File)
+endobj
+385 0 obj
+<< /S /GoTo /D (11.24.1) >>
+endobj
+388 0 obj
+(templatereset)
+endobj
+389 0 obj
+<< /S /GoTo /D (11.24.63.2) >>
+endobj
+392 0 obj
+(Name)
+endobj
+393 0 obj
+<< /S /GoTo /D (11.24.64.2) >>
+endobj
+396 0 obj
+(Synopsis)
+endobj
+397 0 obj
+<< /S /GoTo /D (11.24.65.2) >>
+endobj
+400 0 obj
+(Arguments)
+endobj
+401 0 obj
+<< /S /GoTo /D (11.24.66.2) >>
+endobj
+404 0 obj
+(Description)
+endobj
+405 0 obj
+<< /S /GoTo /D (11.24.67.2) >>
+endobj
+408 0 obj
+(Return Value)
+endobj
+409 0 obj
+<< /S /GoTo /D (11.24.68.2) >>
+endobj
+412 0 obj
+(File)
+endobj
+413 0 obj
+<< /S /GoTo /D (11.25.1) >>
+endobj
+416 0 obj
+(templateinithwdata)
+endobj
+417 0 obj
+<< /S /GoTo /D (11.25.69.2) >>
+endobj
+420 0 obj
+(Name)
+endobj
+421 0 obj
+<< /S /GoTo /D (11.25.70.2) >>
+endobj
+424 0 obj
+(Synopsis)
+endobj
+425 0 obj
+<< /S /GoTo /D (11.25.71.2) >>
+endobj
+428 0 obj
+(Arguments)
+endobj
+429 0 obj
+<< /S /GoTo /D (11.25.72.2) >>
+endobj
+432 0 obj
+(Description)
+endobj
+433 0 obj
+<< /S /GoTo /D (11.25.73.2) >>
+endobj
+436 0 obj
+(Return Value)
+endobj
+437 0 obj
+<< /S /GoTo /D (11.25.74.2) >>
+endobj
+440 0 obj
+(File)
+endobj
+441 0 obj
+<< /S /GoTo /D (11.26.1) >>
+endobj
+444 0 obj
+(templateinitchipdata)
+endobj
+445 0 obj
+<< /S /GoTo /D (11.26.75.2) >>
+endobj
+448 0 obj
+(Name)
+endobj
+449 0 obj
+<< /S /GoTo /D (11.26.76.2) >>
+endobj
+452 0 obj
+(Synopsis)
+endobj
+453 0 obj
+<< /S /GoTo /D (11.26.77.2) >>
+endobj
+456 0 obj
+(Arguments)
+endobj
+457 0 obj
+<< /S /GoTo /D (11.26.78.2) >>
+endobj
+460 0 obj
+(Description)
+endobj
+461 0 obj
+<< /S /GoTo /D (11.26.79.2) >>
+endobj
+464 0 obj
+(Return Value)
+endobj
+465 0 obj
+<< /S /GoTo /D (11.26.80.2) >>
+endobj
+468 0 obj
+(File)
+endobj
+469 0 obj
+<< /S /GoTo /D (11.27.1) >>
+endobj
+472 0 obj
+(templateinitobjdata)
+endobj
+473 0 obj
+<< /S /GoTo /D (11.27.81.2) >>
+endobj
+476 0 obj
+(Name)
+endobj
+477 0 obj
+<< /S /GoTo /D (11.27.82.2) >>
+endobj
+480 0 obj
+(Synopsis)
+endobj
+481 0 obj
+<< /S /GoTo /D (11.27.83.2) >>
+endobj
+484 0 obj
+(Arguments)
+endobj
+485 0 obj
+<< /S /GoTo /D (11.27.84.2) >>
+endobj
+488 0 obj
+(Description)
+endobj
+489 0 obj
+<< /S /GoTo /D (11.27.85.2) >>
+endobj
+492 0 obj
+(Return Value)
+endobj
+493 0 obj
+<< /S /GoTo /D (11.27.86.2) >>
+endobj
+496 0 obj
+(File)
+endobj
+497 0 obj
+<< /S /GoTo /D (11.28.1) >>
+endobj
+500 0 obj
+(templateprogramirq)
+endobj
+501 0 obj
+<< /S /GoTo /D (11.28.87.2) >>
+endobj
+504 0 obj
+(Name)
+endobj
+505 0 obj
+<< /S /GoTo /D (11.28.88.2) >>
+endobj
+508 0 obj
+(Synopsis)
+endobj
+509 0 obj
+<< /S /GoTo /D (11.28.89.2) >>
+endobj
+512 0 obj
+(Arguments)
+endobj
+513 0 obj
+<< /S /GoTo /D (11.28.90.2) >>
+endobj
+516 0 obj
+(Description)
+endobj
+517 0 obj
+<< /S /GoTo /D (11.28.91.2) >>
+endobj
+520 0 obj
+(Return value)
+endobj
+521 0 obj
+<< /S /GoTo /D (11.28.92.2) >>
+endobj
+524 0 obj
+(File)
+endobj
+525 0 obj
+<< /S /GoTo /D (11.29.1) >>
+endobj
+528 0 obj
+(templatewriteregister)
+endobj
+529 0 obj
+<< /S /GoTo /D (11.29.93.2) >>
+endobj
+532 0 obj
+(Name)
+endobj
+533 0 obj
+<< /S /GoTo /D (11.29.94.2) >>
+endobj
+536 0 obj
+(Synopsis)
+endobj
+537 0 obj
+<< /S /GoTo /D (11.29.95.2) >>
+endobj
+540 0 obj
+(Arguments)
+endobj
+541 0 obj
+<< /S /GoTo /D (11.29.96.2) >>
+endobj
+544 0 obj
+(Description)
+endobj
+545 0 obj
+<< /S /GoTo /D (11.29.97.2) >>
+endobj
+548 0 obj
+(Return Value)
+endobj
+549 0 obj
+<< /S /GoTo /D (11.29.98.2) >>
+endobj
+552 0 obj
+(File)
+endobj
+553 0 obj
+<< /S /GoTo /D (11.30.1) >>
+endobj
+556 0 obj
+(templatereadregister)
+endobj
+557 0 obj
+<< /S /GoTo /D (11.30.99.2) >>
+endobj
+560 0 obj
+(Name)
+endobj
+561 0 obj
+<< /S /GoTo /D (11.30.100.2) >>
+endobj
+564 0 obj
+(Synopsis)
+endobj
+565 0 obj
+<< /S /GoTo /D (11.30.101.2) >>
+endobj
+568 0 obj
+(Arguments)
+endobj
+569 0 obj
+<< /S /GoTo /D (11.30.102.2) >>
+endobj
+572 0 obj
+(Description)
+endobj
+573 0 obj
+<< /S /GoTo /D (11.30.103.2) >>
+endobj
+576 0 obj
+(Return Value)
+endobj
+577 0 obj
+<< /S /GoTo /D (11.30.104.2) >>
+endobj
+580 0 obj
+(File)
+endobj
+581 0 obj
+<< /S /GoTo /D (11.31.1) >>
+endobj
+584 0 obj
+(1.6.3. Chip Support Functions)
+endobj
+585 0 obj
+<< /S /GoTo /D (11.32.1) >>
+endobj
+588 0 obj
+(sja1000penableconfiguration)
+endobj
+589 0 obj
+<< /S /GoTo /D (11.32.105.2) >>
+endobj
+592 0 obj
+(Name)
+endobj
+593 0 obj
+<< /S /GoTo /D (11.32.106.2) >>
+endobj
+596 0 obj
+(Synopsis)
+endobj
+597 0 obj
+<< /S /GoTo /D (11.32.107.2) >>
+endobj
+600 0 obj
+(Arguments)
+endobj
+601 0 obj
+<< /S /GoTo /D (11.33.1) >>
+endobj
+604 0 obj
+(sja1000pdisableconfiguration)
+endobj
+605 0 obj
+<< /S /GoTo /D (11.33.108.2) >>
+endobj
+608 0 obj
+(Name)
+endobj
+609 0 obj
+<< /S /GoTo /D (11.33.109.2) >>
+endobj
+612 0 obj
+(Synopsis)
+endobj
+613 0 obj
+<< /S /GoTo /D (11.33.110.2) >>
+endobj
+616 0 obj
+(Arguments)
+endobj
+617 0 obj
+<< /S /GoTo /D (11.34.1) >>
+endobj
+620 0 obj
+(sja1000pchipconfig)
+endobj
+621 0 obj
+<< /S /GoTo /D (11.34.111.2) >>
+endobj
+624 0 obj
+(Name)
+endobj
+625 0 obj
+<< /S /GoTo /D (11.34.112.2) >>
+endobj
+628 0 obj
+(Synopsis)
+endobj
+629 0 obj
+<< /S /GoTo /D (11.34.113.2) >>
+endobj
+632 0 obj
+(Arguments)
+endobj
+633 0 obj
+<< /S /GoTo /D (11.34.114.2) >>
+endobj
+636 0 obj
+(Description)
+endobj
+637 0 obj
+<< /S /GoTo /D (11.34.115.2) >>
+endobj
+640 0 obj
+(Return Value)
+endobj
+641 0 obj
+<< /S /GoTo /D (11.34.116.2) >>
+endobj
+644 0 obj
+(File)
+endobj
+645 0 obj
+<< /S /GoTo /D (11.35.1) >>
+endobj
+648 0 obj
+(sja1000pextendedmask)
+endobj
+649 0 obj
+<< /S /GoTo /D (11.35.117.2) >>
+endobj
+652 0 obj
+(Name)
+endobj
+653 0 obj
+<< /S /GoTo /D (11.35.118.2) >>
+endobj
+656 0 obj
+(Synopsis)
+endobj
+657 0 obj
+<< /S /GoTo /D (11.35.119.2) >>
+endobj
+660 0 obj
+(Arguments)
+endobj
+661 0 obj
+<< /S /GoTo /D (11.35.120.2) >>
+endobj
+664 0 obj
+(Return Value)
+endobj
+665 0 obj
+<< /S /GoTo /D (11.35.121.2) >>
+endobj
+668 0 obj
+(File)
+endobj
+669 0 obj
+<< /S /GoTo /D (11.36.1) >>
+endobj
+672 0 obj
+(sja1000pbaudrate)
+endobj
+673 0 obj
+<< /S /GoTo /D (11.36.122.2) >>
+endobj
+676 0 obj
+(Name)
+endobj
+677 0 obj
+<< /S /GoTo /D (11.36.123.2) >>
+endobj
+680 0 obj
+(Synopsis)
+endobj
+681 0 obj
+<< /S /GoTo /D (11.36.124.2) >>
+endobj
+684 0 obj
+(Arguments)
+endobj
+685 0 obj
+<< /S /GoTo /D (11.36.125.2) >>
+endobj
+688 0 obj
+(Return Value)
+endobj
+689 0 obj
+<< /S /GoTo /D (11.36.126.2) >>
+endobj
+692 0 obj
+(File)
+endobj
+693 0 obj
+<< /S /GoTo /D (11.37.1) >>
+endobj
+696 0 obj
+(sja1000pread)
+endobj
+697 0 obj
+<< /S /GoTo /D (11.37.127.2) >>
+endobj
+700 0 obj
+(Name)
+endobj
+701 0 obj
+<< /S /GoTo /D (11.37.128.2) >>
+endobj
+704 0 obj
+(Synopsis)
+endobj
+705 0 obj
+<< /S /GoTo /D (11.37.129.2) >>
+endobj
+708 0 obj
+(Arguments)
+endobj
+709 0 obj
+<< /S /GoTo /D (11.37.130.2) >>
+endobj
+712 0 obj
+(File)
+endobj
+713 0 obj
+<< /S /GoTo /D (11.38.1) >>
+endobj
+716 0 obj
+(sja1000pprereadconfig)
+endobj
+717 0 obj
+<< /S /GoTo /D (11.38.131.2) >>
+endobj
+720 0 obj
+(Name)
+endobj
+721 0 obj
+<< /S /GoTo /D (11.38.132.2) >>
+endobj
+724 0 obj
+(Synopsis)
+endobj
+725 0 obj
+<< /S /GoTo /D (11.38.133.2) >>
+endobj
+728 0 obj
+(Arguments)
+endobj
+729 0 obj
+<< /S /GoTo /D (11.38.134.2) >>
+endobj
+732 0 obj
+(Return Value)
+endobj
+733 0 obj
+<< /S /GoTo /D (11.38.135.2) >>
+endobj
+736 0 obj
+(File)
+endobj
+737 0 obj
+<< /S /GoTo /D (11.39.1) >>
+endobj
+740 0 obj
+(sja1000pprewriteconfig)
+endobj
+741 0 obj
+<< /S /GoTo /D (11.39.136.2) >>
+endobj
+744 0 obj
+(Name)
+endobj
+745 0 obj
+<< /S /GoTo /D (11.39.137.2) >>
+endobj
+748 0 obj
+(Synopsis)
+endobj
+749 0 obj
+<< /S /GoTo /D (11.39.138.2) >>
+endobj
+752 0 obj
+(Arguments)
+endobj
+753 0 obj
+<< /S /GoTo /D (11.39.139.2) >>
+endobj
+756 0 obj
+(Description)
+endobj
+757 0 obj
+<< /S /GoTo /D (11.39.140.2) >>
+endobj
+760 0 obj
+(Return Value)
+endobj
+761 0 obj
+<< /S /GoTo /D (11.39.141.2) >>
+endobj
+764 0 obj
+(File)
+endobj
+765 0 obj
+<< /S /GoTo /D (11.40.1) >>
+endobj
+768 0 obj
+(sja1000psendmsg)
+endobj
+769 0 obj
+<< /S /GoTo /D (11.40.142.2) >>
+endobj
+772 0 obj
+(Name)
+endobj
+773 0 obj
+<< /S /GoTo /D (11.40.143.2) >>
+endobj
+776 0 obj
+(Synopsis)
+endobj
+777 0 obj
+<< /S /GoTo /D (11.40.144.2) >>
+endobj
+780 0 obj
+(Arguments)
+endobj
+781 0 obj
+<< /S /GoTo /D (11.40.145.2) >>
+endobj
+784 0 obj
+(Description)
+endobj
+785 0 obj
+<< /S /GoTo /D (11.40.146.2) >>
+endobj
+788 0 obj
+(Return Value)
+endobj
+789 0 obj
+<< /S /GoTo /D (11.40.147.2) >>
+endobj
+792 0 obj
+(File)
+endobj
+793 0 obj
+<< /S /GoTo /D (11.41.1) >>
+endobj
+796 0 obj
+(sja1000pchecktxstat)
+endobj
+797 0 obj
+<< /S /GoTo /D (11.41.148.2) >>
+endobj
+800 0 obj
+(Name)
+endobj
+801 0 obj
+<< /S /GoTo /D (11.41.149.2) >>
+endobj
+804 0 obj
+(Synopsis)
+endobj
+805 0 obj
+<< /S /GoTo /D (11.41.150.2) >>
+endobj
+808 0 obj
+(Arguments)
+endobj
+809 0 obj
+<< /S /GoTo /D (11.41.151.2) >>
+endobj
+812 0 obj
+(Return Value)
+endobj
+813 0 obj
+<< /S /GoTo /D (11.41.152.2) >>
+endobj
+816 0 obj
+(File)
+endobj
+817 0 obj
+<< /S /GoTo /D (11.42.1) >>
+endobj
+820 0 obj
+(sja1000psetbtregs)
+endobj
+821 0 obj
+<< /S /GoTo /D (11.42.153.2) >>
+endobj
+824 0 obj
+(Name)
+endobj
+825 0 obj
+<< /S /GoTo /D (11.42.154.2) >>
+endobj
+828 0 obj
+(Synopsis)
+endobj
+829 0 obj
+<< /S /GoTo /D (11.42.155.2) >>
+endobj
+832 0 obj
+(Arguments)
+endobj
+833 0 obj
+<< /S /GoTo /D (11.42.156.2) >>
+endobj
+836 0 obj
+(Return Value)
+endobj
+837 0 obj
+<< /S /GoTo /D (11.42.157.2) >>
+endobj
+840 0 obj
+(File)
+endobj
+841 0 obj
+<< /S /GoTo /D (11.43.1) >>
+endobj
+844 0 obj
+(sja1000pstartchip)
+endobj
+845 0 obj
+<< /S /GoTo /D (11.43.158.2) >>
+endobj
+848 0 obj
+(Name)
+endobj
+849 0 obj
+<< /S /GoTo /D (11.43.159.2) >>
+endobj
+852 0 obj
+(Synopsis)
+endobj
+853 0 obj
+<< /S /GoTo /D (11.43.160.2) >>
+endobj
+856 0 obj
+(Arguments)
+endobj
+857 0 obj
+<< /S /GoTo /D (11.43.161.2) >>
+endobj
+860 0 obj
+(Return Value)
+endobj
+861 0 obj
+<< /S /GoTo /D (11.43.162.2) >>
+endobj
+864 0 obj
+(File)
+endobj
+865 0 obj
+<< /S /GoTo /D (11.44.1) >>
+endobj
+868 0 obj
+(sja1000pstopchip)
+endobj
+869 0 obj
+<< /S /GoTo /D (11.44.163.2) >>
+endobj
+872 0 obj
+(Name)
+endobj
+873 0 obj
+<< /S /GoTo /D (11.44.164.2) >>
+endobj
+876 0 obj
+(Synopsis)
+endobj
+877 0 obj
+<< /S /GoTo /D (11.44.165.2) >>
+endobj
+880 0 obj
+(Arguments)
+endobj
+881 0 obj
+<< /S /GoTo /D (11.44.166.2) >>
+endobj
+884 0 obj
+(Return Value)
+endobj
+885 0 obj
+<< /S /GoTo /D (11.44.167.2) >>
+endobj
+888 0 obj
+(File)
+endobj
+889 0 obj
+<< /S /GoTo /D (11.45.1) >>
+endobj
+892 0 obj
+(sja1000pattachtochip)
+endobj
+893 0 obj
+<< /S /GoTo /D (11.45.168.2) >>
+endobj
+896 0 obj
+(Name)
+endobj
+897 0 obj
+<< /S /GoTo /D (11.45.169.2) >>
+endobj
+900 0 obj
+(Synopsis)
+endobj
+901 0 obj
+<< /S /GoTo /D (11.45.170.2) >>
+endobj
+904 0 obj
+(Arguments)
+endobj
+905 0 obj
+<< /S /GoTo /D (11.45.171.2) >>
+endobj
+908 0 obj
+(Return Value)
+endobj
+909 0 obj
+<< /S /GoTo /D (11.45.172.2) >>
+endobj
+912 0 obj
+(File)
+endobj
+913 0 obj
+<< /S /GoTo /D (11.46.1) >>
+endobj
+916 0 obj
+(sja1000preleasechip)
+endobj
+917 0 obj
+<< /S /GoTo /D (11.46.173.2) >>
+endobj
+920 0 obj
+(Name)
+endobj
+921 0 obj
+<< /S /GoTo /D (11.46.174.2) >>
+endobj
+924 0 obj
+(Synopsis)
+endobj
+925 0 obj
+<< /S /GoTo /D (11.46.175.2) >>
+endobj
+928 0 obj
+(Arguments)
+endobj
+929 0 obj
+<< /S /GoTo /D (11.46.176.2) >>
+endobj
+932 0 obj
+(Return Value)
+endobj
+933 0 obj
+<< /S /GoTo /D (11.46.177.2) >>
+endobj
+936 0 obj
+(File)
+endobj
+937 0 obj
+<< /S /GoTo /D (11.47.1) >>
+endobj
+940 0 obj
+(sja1000premoterequest)
+endobj
+941 0 obj
+<< /S /GoTo /D (11.47.178.2) >>
+endobj
+944 0 obj
+(Name)
+endobj
+945 0 obj
+<< /S /GoTo /D (11.47.179.2) >>
+endobj
+948 0 obj
+(Synopsis)
+endobj
+949 0 obj
+<< /S /GoTo /D (11.47.180.2) >>
+endobj
+952 0 obj
+(Arguments)
+endobj
+953 0 obj
+<< /S /GoTo /D (11.47.181.2) >>
+endobj
+956 0 obj
+(Return Value)
+endobj
+957 0 obj
+<< /S /GoTo /D (11.47.182.2) >>
+endobj
+960 0 obj
+(File)
+endobj
+961 0 obj
+<< /S /GoTo /D (11.48.1) >>
+endobj
+964 0 obj
+(sja1000pstandardmask)
+endobj
+965 0 obj
+<< /S /GoTo /D (11.48.183.2) >>
+endobj
+968 0 obj
+(Name)
+endobj
+969 0 obj
+<< /S /GoTo /D (11.48.184.2) >>
+endobj
+972 0 obj
+(Synopsis)
+endobj
+973 0 obj
+<< /S /GoTo /D (11.48.185.2) >>
+endobj
+976 0 obj
+(Arguments)
+endobj
+977 0 obj
+<< /S /GoTo /D (11.48.186.2) >>
+endobj
+980 0 obj
+(Return Value)
+endobj
+981 0 obj
+<< /S /GoTo /D (11.48.187.2) >>
+endobj
+984 0 obj
+(File)
+endobj
+985 0 obj
+<< /S /GoTo /D (11.49.1) >>
+endobj
+988 0 obj
+(sja1000pclearobjects)
+endobj
+989 0 obj
+<< /S /GoTo /D (11.49.188.2) >>
+endobj
+992 0 obj
+(Name)
+endobj
+993 0 obj
+<< /S /GoTo /D (11.49.189.2) >>
+endobj
+996 0 obj
+(Synopsis)
+endobj
+997 0 obj
+<< /S /GoTo /D (11.49.190.2) >>
+endobj
+1000 0 obj
+(Arguments)
+endobj
+1001 0 obj
+<< /S /GoTo /D (11.49.191.2) >>
+endobj
+1004 0 obj
+(Return Value)
+endobj
+1005 0 obj
+<< /S /GoTo /D (11.49.192.2) >>
+endobj
+1008 0 obj
+(File)
+endobj
+1009 0 obj
+<< /S /GoTo /D (11.50.1) >>
+endobj
+1012 0 obj
+(sja1000pconfigirqs)
+endobj
+1013 0 obj
+<< /S /GoTo /D (11.50.193.2) >>
+endobj
+1016 0 obj
+(Name)
+endobj
+1017 0 obj
+<< /S /GoTo /D (11.50.194.2) >>
+endobj
+1020 0 obj
+(Synopsis)
+endobj
+1021 0 obj
+<< /S /GoTo /D (11.50.195.2) >>
+endobj
+1024 0 obj
+(Arguments)
+endobj
+1025 0 obj
+<< /S /GoTo /D (11.50.196.2) >>
+endobj
+1028 0 obj
+(Return Value)
+endobj
+1029 0 obj
+<< /S /GoTo /D (11.50.197.2) >>
+endobj
+1032 0 obj
+(File)
+endobj
+1033 0 obj
+<< /S /GoTo /D (11.51.1) >>
+endobj
+1036 0 obj
+(sja1000pirqwritehandler)
+endobj
+1037 0 obj
+<< /S /GoTo /D (11.51.198.2) >>
+endobj
+1040 0 obj
+(Name)
+endobj
+1041 0 obj
+<< /S /GoTo /D (11.51.199.2) >>
+endobj
+1044 0 obj
+(Synopsis)
+endobj
+1045 0 obj
+<< /S /GoTo /D (11.51.200.2) >>
+endobj
+1048 0 obj
+(Arguments)
+endobj
+1049 0 obj
+<< /S /GoTo /D (11.51.201.2) >>
+endobj
+1052 0 obj
+(Description)
+endobj
+1053 0 obj
+<< /S /GoTo /D (11.51.202.2) >>
+endobj
+1056 0 obj
+(File)
+endobj
+1057 0 obj
+<< /S /GoTo /D (11.52.1) >>
+endobj
+1060 0 obj
+(sja1000pirqhandler)
+endobj
+1061 0 obj
+<< /S /GoTo /D (11.52.203.2) >>
+endobj
+1064 0 obj
+(Name)
+endobj
+1065 0 obj
+<< /S /GoTo /D (11.52.204.2) >>
+endobj
+1068 0 obj
+(Synopsis)
+endobj
+1069 0 obj
+<< /S /GoTo /D (11.52.205.2) >>
+endobj
+1072 0 obj
+(Arguments)
+endobj
+1073 0 obj
+<< /S /GoTo /D (11.52.206.2) >>
+endobj
+1076 0 obj
+(Description)
+endobj
+1077 0 obj
+<< /S /GoTo /D (11.52.207.2) >>
+endobj
+1080 0 obj
+(File)
+endobj
+1081 0 obj
+<< /S /GoTo /D (11.53.1) >>
+endobj
+1084 0 obj
+(sja1000pwakeuptx)
+endobj
+1085 0 obj
+<< /S /GoTo /D (11.53.208.2) >>
+endobj
+1088 0 obj
+(Name)
+endobj
+1089 0 obj
+<< /S /GoTo /D (11.53.209.2) >>
+endobj
+1092 0 obj
+(Synopsis)
+endobj
+1093 0 obj
+<< /S /GoTo /D (11.53.210.2) >>
+endobj
+1096 0 obj
+(Arguments)
+endobj
+1097 0 obj
+<< /S /GoTo /D (11.53.211.2) >>
+endobj
+1100 0 obj
+(Description)
+endobj
+1101 0 obj
+<< /S /GoTo /D (11.53.212.2) >>
+endobj
+1104 0 obj
+(Return Value)
+endobj
+1105 0 obj
+<< /S /GoTo /D (11.53.213.2) >>
+endobj
+1108 0 obj
+(File)
+endobj
+1109 0 obj
+<< /S /GoTo /D (11.54.1) >>
+endobj
+1112 0 obj
+(sja1000pfillchipspecops)
+endobj
+1113 0 obj
+<< /S /GoTo /D (11.54.214.2) >>
+endobj
+1116 0 obj
+(Name)
+endobj
+1117 0 obj
+<< /S /GoTo /D (11.54.215.2) >>
+endobj
+1120 0 obj
+(Synopsis)
+endobj
+1121 0 obj
+<< /S /GoTo /D (11.54.216.2) >>
+endobj
+1124 0 obj
+(Arguments)
+endobj
+1125 0 obj
+<< /S /GoTo /D (11.54.217.2) >>
+endobj
+1128 0 obj
+(Description)
+endobj
+1129 0 obj
+<< /S /GoTo /D (11.54.218.2) >>
+endobj
+1132 0 obj
+(Return Value)
+endobj
+1133 0 obj
+<< /S /GoTo /D (11.55.1) >>
+endobj
+1136 0 obj
+(1.6.4. CAN Queues Common Structures and Functions)
+endobj
+1137 0 obj
+<< /S /GoTo /D (11.56.1) >>
+endobj
+1140 0 obj
+(struct canqueslott)
+endobj
+1141 0 obj
+<< /S /GoTo /D (11.56.219.2) >>
+endobj
+1144 0 obj
+(Name)
+endobj
+1145 0 obj
+<< /S /GoTo /D (11.56.220.2) >>
+endobj
+1148 0 obj
+(Synopsis)
+endobj
+1149 0 obj
+<< /S /GoTo /D (11.56.221.2) >>
+endobj
+1152 0 obj
+(Members)
+endobj
+1153 0 obj
+<< /S /GoTo /D (11.56.222.2) >>
+endobj
+1156 0 obj
+(Description)
+endobj
+1157 0 obj
+<< /S /GoTo /D (11.57.1) >>
+endobj
+1160 0 obj
+(struct canquefifot)
+endobj
+1161 0 obj
+<< /S /GoTo /D (11.57.223.2) >>
+endobj
+1164 0 obj
+(Name)
+endobj
+1165 0 obj
+<< /S /GoTo /D (11.57.224.2) >>
+endobj
+1168 0 obj
+(Synopsis)
+endobj
+1169 0 obj
+<< /S /GoTo /D (11.57.225.2) >>
+endobj
+1172 0 obj
+(Members)
+endobj
+1173 0 obj
+<< /S /GoTo /D (11.57.226.2) >>
+endobj
+1176 0 obj
+(Description)
+endobj
+1177 0 obj
+<< /S /GoTo /D (11.58.1) >>
+endobj
+1180 0 obj
+(canquefifogetinslot)
+endobj
+1181 0 obj
+<< /S /GoTo /D (11.58.227.2) >>
+endobj
+1184 0 obj
+(Name)
+endobj
+1185 0 obj
+<< /S /GoTo /D (11.58.228.2) >>
+endobj
+1188 0 obj
+(Synopsis)
+endobj
+1189 0 obj
+<< /S /GoTo /D (11.58.229.2) >>
+endobj
+1192 0 obj
+(Arguments)
+endobj
+1193 0 obj
+<< /S /GoTo /D (11.58.230.2) >>
+endobj
+1196 0 obj
+(Return Value)
+endobj
+1197 0 obj
+<< /S /GoTo /D (11.59.1) >>
+endobj
+1200 0 obj
+(canquefifoputinslot)
+endobj
+1201 0 obj
+<< /S /GoTo /D (11.59.231.2) >>
+endobj
+1204 0 obj
+(Name)
+endobj
+1205 0 obj
+<< /S /GoTo /D (11.59.232.2) >>
+endobj
+1208 0 obj
+(Synopsis)
+endobj
+1209 0 obj
+<< /S /GoTo /D (11.59.233.2) >>
+endobj
+1212 0 obj
+(Arguments)
+endobj
+1213 0 obj
+<< /S /GoTo /D (11.59.234.2) >>
+endobj
+1216 0 obj
+(Return Value)
+endobj
+1217 0 obj
+<< /S /GoTo /D (11.60.1) >>
+endobj
+1220 0 obj
+(canquefifoabortinslot)
+endobj
+1221 0 obj
+<< /S /GoTo /D (11.60.235.2) >>
+endobj
+1224 0 obj
+(Name)
+endobj
+1225 0 obj
+<< /S /GoTo /D (11.60.236.2) >>
+endobj
+1228 0 obj
+(Synopsis)
+endobj
+1229 0 obj
+<< /S /GoTo /D (11.60.237.2) >>
+endobj
+1232 0 obj
+(Arguments)
+endobj
+1233 0 obj
+<< /S /GoTo /D (11.60.238.2) >>
+endobj
+1236 0 obj
+(Return Value)
+endobj
+1237 0 obj
+<< /S /GoTo /D (11.61.1) >>
+endobj
+1240 0 obj
+(canquefifotestoutslot)
+endobj
+1241 0 obj
+<< /S /GoTo /D (11.61.239.2) >>
+endobj
+1244 0 obj
+(Name)
+endobj
+1245 0 obj
+<< /S /GoTo /D (11.61.240.2) >>
+endobj
+1248 0 obj
+(Synopsis)
+endobj
+1249 0 obj
+<< /S /GoTo /D (11.61.241.2) >>
+endobj
+1252 0 obj
+(Arguments)
+endobj
+1253 0 obj
+<< /S /GoTo /D (11.61.242.2) >>
+endobj
+1256 0 obj
+(Return Value)
+endobj
+1257 0 obj
+<< /S /GoTo /D (11.62.1) >>
+endobj
+1260 0 obj
+(canquefifofreeoutslot)
+endobj
+1261 0 obj
+<< /S /GoTo /D (11.62.243.2) >>
+endobj
+1264 0 obj
+(Name)
+endobj
+1265 0 obj
+<< /S /GoTo /D (11.62.244.2) >>
+endobj
+1268 0 obj
+(Synopsis)
+endobj
+1269 0 obj
+<< /S /GoTo /D (11.62.245.2) >>
+endobj
+1272 0 obj
+(Arguments)
+endobj
+1273 0 obj
+<< /S /GoTo /D (11.62.246.2) >>
+endobj
+1276 0 obj
+(Return Value)
+endobj
+1277 0 obj
+<< /S /GoTo /D (11.63.1) >>
+endobj
+1280 0 obj
+(canquefifoagainoutslot)
+endobj
+1281 0 obj
+<< /S /GoTo /D (11.63.247.2) >>
+endobj
+1284 0 obj
+(Name)
+endobj
+1285 0 obj
+<< /S /GoTo /D (11.63.248.2) >>
+endobj
+1288 0 obj
+(Synopsis)
+endobj
+1289 0 obj
+<< /S /GoTo /D (11.63.249.2) >>
+endobj
+1292 0 obj
+(Arguments)
+endobj
+1293 0 obj
+<< /S /GoTo /D (11.63.250.2) >>
+endobj
+1296 0 obj
+(Return Value)
+endobj
+1297 0 obj
+<< /S /GoTo /D (11.64.1) >>
+endobj
+1300 0 obj
+(struct canqueedget)
+endobj
+1301 0 obj
+<< /S /GoTo /D (11.64.251.2) >>
+endobj
+1304 0 obj
+(Name)
+endobj
+1305 0 obj
+<< /S /GoTo /D (11.64.252.2) >>
+endobj
+1308 0 obj
+(Synopsis)
+endobj
+1309 0 obj
+<< /S /GoTo /D (11.64.253.2) >>
+endobj
+1312 0 obj
+(Members)
+endobj
+1313 0 obj
+<< /S /GoTo /D (11.64.254.2) >>
+endobj
+1316 0 obj
+(Description)
+endobj
+1317 0 obj
+<< /S /GoTo /D (11.65.1) >>
+endobj
+1320 0 obj
+(struct canqueendst)
+endobj
+1321 0 obj
+<< /S /GoTo /D (11.65.255.2) >>
+endobj
+1324 0 obj
+(Name)
+endobj
+1325 0 obj
+<< /S /GoTo /D (11.65.256.2) >>
+endobj
+1328 0 obj
+(Synopsis)
+endobj
+1329 0 obj
+<< /S /GoTo /D (11.65.257.2) >>
+endobj
+1332 0 obj
+(Members)
+endobj
+1333 0 obj
+<< /S /GoTo /D (11.65.258.2) >>
+endobj
+1336 0 obj
+(Description)
+endobj
+1337 0 obj
+<< /S /GoTo /D (11.66.1) >>
+endobj
+1340 0 obj
+(canquenotifyinends)
+endobj
+1341 0 obj
+<< /S /GoTo /D (11.66.259.2) >>
+endobj
+1344 0 obj
+(Name)
+endobj
+1345 0 obj
+<< /S /GoTo /D (11.66.260.2) >>
+endobj
+1348 0 obj
+(Synopsis)
+endobj
+1349 0 obj
+<< /S /GoTo /D (11.66.261.2) >>
+endobj
+1352 0 obj
+(Arguments)
+endobj
+1353 0 obj
+<< /S /GoTo /D (11.67.1) >>
+endobj
+1356 0 obj
+(canquenotifyoutends)
+endobj
+1357 0 obj
+<< /S /GoTo /D (11.67.262.2) >>
+endobj
+1360 0 obj
+(Name)
+endobj
+1361 0 obj
+<< /S /GoTo /D (11.67.263.2) >>
+endobj
+1364 0 obj
+(Synopsis)
+endobj
+1365 0 obj
+<< /S /GoTo /D (11.67.264.2) >>
+endobj
+1368 0 obj
+(Arguments)
+endobj
+1369 0 obj
+<< /S /GoTo /D (11.68.1) >>
+endobj
+1372 0 obj
+(canquenotifybothends)
+endobj
+1373 0 obj
+<< /S /GoTo /D (11.68.265.2) >>
+endobj
+1376 0 obj
+(Name)
+endobj
+1377 0 obj
+<< /S /GoTo /D (11.68.266.2) >>
+endobj
+1380 0 obj
+(Synopsis)
+endobj
+1381 0 obj
+<< /S /GoTo /D (11.68.267.2) >>
+endobj
+1384 0 obj
+(Arguments)
+endobj
+1385 0 obj
+<< /S /GoTo /D (11.69.1) >>
+endobj
+1388 0 obj
+(canqueactivateedge)
+endobj
+1389 0 obj
+<< /S /GoTo /D (11.69.268.2) >>
+endobj
+1392 0 obj
+(Name)
+endobj
+1393 0 obj
+<< /S /GoTo /D (11.69.269.2) >>
+endobj
+1396 0 obj
+(Synopsis)
+endobj
+1397 0 obj
+<< /S /GoTo /D (11.69.270.2) >>
+endobj
+1400 0 obj
+(Arguments)
+endobj
+1401 0 obj
+<< /S /GoTo /D (11.69.271.2) >>
+endobj
+1404 0 obj
+(Description)
+endobj
+1405 0 obj
+<< /S /GoTo /D (11.70.1) >>
+endobj
+1408 0 obj
+(canquefiltid2internal)
+endobj
+1409 0 obj
+<< /S /GoTo /D (11.70.272.2) >>
+endobj
+1412 0 obj
+(Name)
+endobj
+1413 0 obj
+<< /S /GoTo /D (11.70.273.2) >>
+endobj
+1416 0 obj
+(Synopsis)
+endobj
+1417 0 obj
+<< /S /GoTo /D (11.70.274.2) >>
+endobj
+1420 0 obj
+(Arguments)
+endobj
+1421 0 obj
+<< /S /GoTo /D (11.70.275.2) >>
+endobj
+1424 0 obj
+(Description)
+endobj
+1425 0 obj
+<< /S /GoTo /D (11.71.1) >>
+endobj
+1428 0 obj
+(canqueedgeincref)
+endobj
+1429 0 obj
+<< /S /GoTo /D (11.71.276.2) >>
+endobj
+1432 0 obj
+(Name)
+endobj
+1433 0 obj
+<< /S /GoTo /D (11.71.277.2) >>
+endobj
+1436 0 obj
+(Synopsis)
+endobj
+1437 0 obj
+<< /S /GoTo /D (11.71.278.2) >>
+endobj
+1440 0 obj
+(Arguments)
+endobj
+1441 0 obj
+<< /S /GoTo /D (11.72.1) >>
+endobj
+1444 0 obj
+(canqueedgedecref)
+endobj
+1445 0 obj
+<< /S /GoTo /D (11.72.279.2) >>
+endobj
+1448 0 obj
+(Name)
+endobj
+1449 0 obj
+<< /S /GoTo /D (11.72.280.2) >>
+endobj
+1452 0 obj
+(Synopsis)
+endobj
+1453 0 obj
+<< /S /GoTo /D (11.72.281.2) >>
+endobj
+1456 0 obj
+(Arguments)
+endobj
+1457 0 obj
+<< /S /GoTo /D (11.72.282.2) >>
+endobj
+1460 0 obj
+(Description)
+endobj
+1461 0 obj
+<< /S /GoTo /D (11.73.1) >>
+endobj
+1464 0 obj
+(canquefifoflushslots)
+endobj
+1465 0 obj
+<< /S /GoTo /D (11.73.283.2) >>
+endobj
+1468 0 obj
+(Name)
+endobj
+1469 0 obj
+<< /S /GoTo /D (11.73.284.2) >>
+endobj
+1472 0 obj
+(Synopsis)
+endobj
+1473 0 obj
+<< /S /GoTo /D (11.73.285.2) >>
+endobj
+1476 0 obj
+(Arguments)
+endobj
+1477 0 obj
+<< /S /GoTo /D (11.73.286.2) >>
+endobj
+1480 0 obj
+(Description)
+endobj
+1481 0 obj
+<< /S /GoTo /D (11.73.287.2) >>
+endobj
+1484 0 obj
+(Return Value)
+endobj
+1485 0 obj
+<< /S /GoTo /D (11.74.1) >>
+endobj
+1488 0 obj
+(canquefifoinitslots)
+endobj
+1489 0 obj
+<< /S /GoTo /D (11.74.288.2) >>
+endobj
+1492 0 obj
+(Name)
+endobj
+1493 0 obj
+<< /S /GoTo /D (11.74.289.2) >>
+endobj
+1496 0 obj
+(Synopsis)
+endobj
+1497 0 obj
+<< /S /GoTo /D (11.74.290.2) >>
+endobj
+1500 0 obj
+(Arguments)
+endobj
+1501 0 obj
+<< /S /GoTo /D (11.74.291.2) >>
+endobj
+1504 0 obj
+(Return Value)
+endobj
+1505 0 obj
+<< /S /GoTo /D (11.75.1) >>
+endobj
+1508 0 obj
+(canquegetinslot)
+endobj
+1509 0 obj
+<< /S /GoTo /D (11.75.292.2) >>
+endobj
+1512 0 obj
+(Name)
+endobj
+1513 0 obj
+<< /S /GoTo /D (11.75.293.2) >>
+endobj
+1516 0 obj
+(Synopsis)
+endobj
+1517 0 obj
+<< /S /GoTo /D (11.75.294.2) >>
+endobj
+1520 0 obj
+(Arguments)
+endobj
+1521 0 obj
+<< /S /GoTo /D (11.75.295.2) >>
+endobj
+1524 0 obj
+(Description)
+endobj
+1525 0 obj
+<< /S /GoTo /D (11.75.296.2) >>
+endobj
+1528 0 obj
+(Return Value)
+endobj
+1529 0 obj
+<< /S /GoTo /D (11.76.1) >>
+endobj
+1532 0 obj
+(canquegetinslot4id)
+endobj
+1533 0 obj
+<< /S /GoTo /D (11.76.297.2) >>
+endobj
+1536 0 obj
+(Name)
+endobj
+1537 0 obj
+<< /S /GoTo /D (11.76.298.2) >>
+endobj
+1540 0 obj
+(Synopsis)
+endobj
+1541 0 obj
+<< /S /GoTo /D (11.76.299.2) >>
+endobj
+1544 0 obj
+(Arguments)
+endobj
+1545 0 obj
+<< /S /GoTo /D (11.76.300.2) >>
+endobj
+1548 0 obj
+(Description)
+endobj
+1549 0 obj
+<< /S /GoTo /D (11.76.301.2) >>
+endobj
+1552 0 obj
+(Return Value)
+endobj
+1553 0 obj
+<< /S /GoTo /D (11.77.1) >>
+endobj
+1556 0 obj
+(canqueputinslot)
+endobj
+1557 0 obj
+<< /S /GoTo /D (11.77.302.2) >>
+endobj
+1560 0 obj
+(Name)
+endobj
+1561 0 obj
+<< /S /GoTo /D (11.77.303.2) >>
+endobj
+1564 0 obj
+(Synopsis)
+endobj
+1565 0 obj
+<< /S /GoTo /D (11.77.304.2) >>
+endobj
+1568 0 obj
+(Arguments)
+endobj
+1569 0 obj
+<< /S /GoTo /D (11.77.305.2) >>
+endobj
+1572 0 obj
+(Description)
+endobj
+1573 0 obj
+<< /S /GoTo /D (11.77.306.2) >>
+endobj
+1576 0 obj
+(Return Value)
+endobj
+1577 0 obj
+<< /S /GoTo /D (11.78.1) >>
+endobj
+1580 0 obj
+(canqueabortinslot)
+endobj
+1581 0 obj
+<< /S /GoTo /D (11.78.307.2) >>
+endobj
+1584 0 obj
+(Name)
+endobj
+1585 0 obj
+<< /S /GoTo /D (11.78.308.2) >>
+endobj
+1588 0 obj
+(Synopsis)
+endobj
+1589 0 obj
+<< /S /GoTo /D (11.78.309.2) >>
+endobj
+1592 0 obj
+(Arguments)
+endobj
+1593 0 obj
+<< /S /GoTo /D (11.78.310.2) >>
+endobj
+1596 0 obj
+(Description)
+endobj
+1597 0 obj
+<< /S /GoTo /D (11.78.311.2) >>
+endobj
+1600 0 obj
+(Return Value)
+endobj
+1601 0 obj
+<< /S /GoTo /D (11.79.1) >>
+endobj
+1604 0 obj
+(canquefiltermsg2edges)
+endobj
+1605 0 obj
+<< /S /GoTo /D (11.79.312.2) >>
+endobj
+1608 0 obj
+(Name)
+endobj
+1609 0 obj
+<< /S /GoTo /D (11.79.313.2) >>
+endobj
+1612 0 obj
+(Synopsis)
+endobj
+1613 0 obj
+<< /S /GoTo /D (11.79.314.2) >>
+endobj
+1616 0 obj
+(Arguments)
+endobj
+1617 0 obj
+<< /S /GoTo /D (11.79.315.2) >>
+endobj
+1620 0 obj
+(Description)
+endobj
+1621 0 obj
+<< /S /GoTo /D (11.79.316.2) >>
+endobj
+1624 0 obj
+(Return Value)
+endobj
+1625 0 obj
+<< /S /GoTo /D (11.80.1) >>
+endobj
+1628 0 obj
+(canquetestoutslot)
+endobj
+1629 0 obj
+<< /S /GoTo /D (11.80.317.2) >>
+endobj
+1632 0 obj
+(Name)
+endobj
+1633 0 obj
+<< /S /GoTo /D (11.80.318.2) >>
+endobj
+1636 0 obj
+(Synopsis)
+endobj
+1637 0 obj
+<< /S /GoTo /D (11.80.319.2) >>
+endobj
+1640 0 obj
+(Arguments)
+endobj
+1641 0 obj
+<< /S /GoTo /D (11.80.320.2) >>
+endobj
+1644 0 obj
+(Description)
+endobj
+1645 0 obj
+<< /S /GoTo /D (11.80.321.2) >>
+endobj
+1648 0 obj
+(Return Value)
+endobj
+1649 0 obj
+<< /S /GoTo /D (11.81.1) >>
+endobj
+1652 0 obj
+(canquefreeoutslot)
+endobj
+1653 0 obj
+<< /S /GoTo /D (11.81.322.2) >>
+endobj
+1656 0 obj
+(Name)
+endobj
+1657 0 obj
+<< /S /GoTo /D (11.81.323.2) >>
+endobj
+1660 0 obj
+(Synopsis)
+endobj
+1661 0 obj
+<< /S /GoTo /D (11.81.324.2) >>
+endobj
+1664 0 obj
+(Arguments)
+endobj
+1665 0 obj
+<< /S /GoTo /D (11.81.325.2) >>
+endobj
+1668 0 obj
+(Description)
+endobj
+1669 0 obj
+<< /S /GoTo /D (11.81.326.2) >>
+endobj
+1672 0 obj
+(Return Value)
+endobj
+1673 0 obj
+<< /S /GoTo /D (11.82.1) >>
+endobj
+1676 0 obj
+(canqueagainoutslot)
+endobj
+1677 0 obj
+<< /S /GoTo /D (11.82.327.2) >>
+endobj
+1680 0 obj
+(Name)
+endobj
+1681 0 obj
+<< /S /GoTo /D (11.82.328.2) >>
+endobj
+1684 0 obj
+(Synopsis)
+endobj
+1685 0 obj
+<< /S /GoTo /D (11.82.329.2) >>
+endobj
+1688 0 obj
+(Arguments)
+endobj
+1689 0 obj
+<< /S /GoTo /D (11.82.330.2) >>
+endobj
+1692 0 obj
+(Description)
+endobj
+1693 0 obj
+<< /S /GoTo /D (11.82.331.2) >>
+endobj
+1696 0 obj
+(Return Value)
+endobj
+1697 0 obj
+<< /S /GoTo /D (11.83.1) >>
+endobj
+1700 0 obj
+(canquesetfilt)
+endobj
+1701 0 obj
+<< /S /GoTo /D (11.83.332.2) >>
+endobj
+1704 0 obj
+(Name)
+endobj
+1705 0 obj
+<< /S /GoTo /D (11.83.333.2) >>
+endobj
+1708 0 obj
+(Synopsis)
+endobj
+1709 0 obj
+<< /S /GoTo /D (11.83.334.2) >>
+endobj
+1712 0 obj
+(Arguments)
+endobj
+1713 0 obj
+<< /S /GoTo /D (11.83.335.2) >>
+endobj
+1716 0 obj
+(Return Value)
+endobj
+1717 0 obj
+<< /S /GoTo /D (11.84.1) >>
+endobj
+1720 0 obj
+(canqueflush)
+endobj
+1721 0 obj
+<< /S /GoTo /D (11.84.336.2) >>
+endobj
+1724 0 obj
+(Name)
+endobj
+1725 0 obj
+<< /S /GoTo /D (11.84.337.2) >>
+endobj
+1728 0 obj
+(Synopsis)
+endobj
+1729 0 obj
+<< /S /GoTo /D (11.84.338.2) >>
+endobj
+1732 0 obj
+(Arguments)
+endobj
+1733 0 obj
+<< /S /GoTo /D (11.84.339.2) >>
+endobj
+1736 0 obj
+(Description)
+endobj
+1737 0 obj
+<< /S /GoTo /D (11.84.340.2) >>
+endobj
+1740 0 obj
+(Return Value)
+endobj
+1741 0 obj
+<< /S /GoTo /D (11.85.1) >>
+endobj
+1744 0 obj
+(canqueueendsinitgen)
+endobj
+1745 0 obj
+<< /S /GoTo /D (11.85.341.2) >>
+endobj
+1748 0 obj
+(Name)
+endobj
+1749 0 obj
+<< /S /GoTo /D (11.85.342.2) >>
+endobj
+1752 0 obj
+(Synopsis)
+endobj
+1753 0 obj
+<< /S /GoTo /D (11.85.343.2) >>
+endobj
+1756 0 obj
+(Arguments)
+endobj
+1757 0 obj
+<< /S /GoTo /D (11.85.344.2) >>
+endobj
+1760 0 obj
+(Return Value)
+endobj
+1761 0 obj
+<< /S /GoTo /D (11.86.1) >>
+endobj
+1764 0 obj
+(canqueueconnectedge)
+endobj
+1765 0 obj
+<< /S /GoTo /D (11.86.345.2) >>
+endobj
+1768 0 obj
+(Name)
+endobj
+1769 0 obj
+<< /S /GoTo /D (11.86.346.2) >>
+endobj
+1772 0 obj
+(Synopsis)
+endobj
+1773 0 obj
+<< /S /GoTo /D (11.86.347.2) >>
+endobj
+1776 0 obj
+(Arguments)
+endobj
+1777 0 obj
+<< /S /GoTo /D (11.86.348.2) >>
+endobj
+1780 0 obj
+(Return Value)
+endobj
+1781 0 obj
+<< /S /GoTo /D (11.87.1) >>
+endobj
+1784 0 obj
+(canqueuedisconnectedge)
+endobj
+1785 0 obj
+<< /S /GoTo /D (11.87.349.2) >>
+endobj
+1788 0 obj
+(Name)
+endobj
+1789 0 obj
+<< /S /GoTo /D (11.87.350.2) >>
+endobj
+1792 0 obj
+(Synopsis)
+endobj
+1793 0 obj
+<< /S /GoTo /D (11.87.351.2) >>
+endobj
+1796 0 obj
+(Arguments)
+endobj
+1797 0 obj
+<< /S /GoTo /D (11.87.352.2) >>
+endobj
+1800 0 obj
+(Return Value)
+endobj
+1801 0 obj
+<< /S /GoTo /D (11.88.1) >>
+endobj
+1804 0 obj
+(canqueueblockinlist)
+endobj
+1805 0 obj
+<< /S /GoTo /D (11.88.353.2) >>
+endobj
+1808 0 obj
+(Name)
+endobj
+1809 0 obj
+<< /S /GoTo /D (11.88.354.2) >>
+endobj
+1812 0 obj
+(Synopsis)
+endobj
+1813 0 obj
+<< /S /GoTo /D (11.88.355.2) >>
+endobj
+1816 0 obj
+(Arguments)
+endobj
+1817 0 obj
+<< /S /GoTo /D (11.89.1) >>
+endobj
+1820 0 obj
+(canqueueblockoutlist)
+endobj
+1821 0 obj
+<< /S /GoTo /D (11.89.356.2) >>
+endobj
+1824 0 obj
+(Name)
+endobj
+1825 0 obj
+<< /S /GoTo /D (11.89.357.2) >>
+endobj
+1828 0 obj
+(Synopsis)
+endobj
+1829 0 obj
+<< /S /GoTo /D (11.89.358.2) >>
+endobj
+1832 0 obj
+(Arguments)
+endobj
+1833 0 obj
+<< /S /GoTo /D (11.90.1) >>
+endobj
+1836 0 obj
+(canqueueendskillinlist)
+endobj
+1837 0 obj
+<< /S /GoTo /D (11.90.359.2) >>
+endobj
+1840 0 obj
+(Name)
+endobj
+1841 0 obj
+<< /S /GoTo /D (11.90.360.2) >>
+endobj
+1844 0 obj
+(Synopsis)
+endobj
+1845 0 obj
+<< /S /GoTo /D (11.90.361.2) >>
+endobj
+1848 0 obj
+(Arguments)
+endobj
+1849 0 obj
+<< /S /GoTo /D (11.90.362.2) >>
+endobj
+1852 0 obj
+(Return Value)
+endobj
+1853 0 obj
+<< /S /GoTo /D (11.91.1) >>
+endobj
+1856 0 obj
+(canqueueendskilloutlist)
+endobj
+1857 0 obj
+<< /S /GoTo /D (11.91.363.2) >>
+endobj
+1860 0 obj
+(Name)
+endobj
+1861 0 obj
+<< /S /GoTo /D (11.91.364.2) >>
+endobj
+1864 0 obj
+(Synopsis)
+endobj
+1865 0 obj
+<< /S /GoTo /D (11.91.365.2) >>
+endobj
+1868 0 obj
+(Arguments)
+endobj
+1869 0 obj
+<< /S /GoTo /D (11.91.366.2) >>
+endobj
+1872 0 obj
+(Return Value)
+endobj
+1873 0 obj
+<< /S /GoTo /D (11.92.1) >>
+endobj
+1876 0 obj
+(canqueueendsfiltconjuction)
+endobj
+1877 0 obj
+<< /S /GoTo /D (11.92.367.2) >>
+endobj
+1880 0 obj
+(Name)
+endobj
+1881 0 obj
+<< /S /GoTo /D (11.92.368.2) >>
+endobj
+1884 0 obj
+(Synopsis)
+endobj
+1885 0 obj
+<< /S /GoTo /D (11.92.369.2) >>
+endobj
+1888 0 obj
+(Arguments)
+endobj
+1889 0 obj
+<< /S /GoTo /D (11.92.370.2) >>
+endobj
+1892 0 obj
+(Return Value)
+endobj
+1893 0 obj
+<< /S /GoTo /D (11.93.1) >>
+endobj
+1896 0 obj
+(canqueueendsflushinlist)
+endobj
+1897 0 obj
+<< /S /GoTo /D (11.93.371.2) >>
+endobj
+1900 0 obj
+(Name)
+endobj
+1901 0 obj
+<< /S /GoTo /D (11.93.372.2) >>
+endobj
+1904 0 obj
+(Synopsis)
+endobj
+1905 0 obj
+<< /S /GoTo /D (11.93.373.2) >>
+endobj
+1908 0 obj
+(Arguments)
+endobj
+1909 0 obj
+<< /S /GoTo /D (11.93.374.2) >>
+endobj
+1912 0 obj
+(Return Value)
+endobj
+1913 0 obj
+<< /S /GoTo /D (11.94.1) >>
+endobj
+1916 0 obj
+(canqueueendsflushoutlist)
+endobj
+1917 0 obj
+<< /S /GoTo /D (11.94.375.2) >>
+endobj
+1920 0 obj
+(Name)
+endobj
+1921 0 obj
+<< /S /GoTo /D (11.94.376.2) >>
+endobj
+1924 0 obj
+(Synopsis)
+endobj
+1925 0 obj
+<< /S /GoTo /D (11.94.377.2) >>
+endobj
+1928 0 obj
+(Arguments)
+endobj
+1929 0 obj
+<< /S /GoTo /D (11.94.378.2) >>
+endobj
+1932 0 obj
+(Return Value)
+endobj
+1933 0 obj
+<< /S /GoTo /D (11.95.1) >>
+endobj
+1936 0 obj
+(1.6.5. CAN Queues Kernel Specific Functions)
+endobj
+1937 0 obj
+<< /S /GoTo /D (11.96.1) >>
+endobj
+1940 0 obj
+(canqueuenotifykern)
+endobj
+1941 0 obj
+<< /S /GoTo /D (11.96.379.2) >>
+endobj
+1944 0 obj
+(Name)
+endobj
+1945 0 obj
+<< /S /GoTo /D (11.96.380.2) >>
+endobj
+1948 0 obj
+(Synopsis)
+endobj
+1949 0 obj
+<< /S /GoTo /D (11.96.381.2) >>
+endobj
+1952 0 obj
+(Arguments)
+endobj
+1953 0 obj
+<< /S /GoTo /D (11.96.382.2) >>
+endobj
+1956 0 obj
+(Description)
+endobj
+1957 0 obj
+<< /S /GoTo /D (11.97.1) >>
+endobj
+1960 0 obj
+(canqueueendsinitkern)
+endobj
+1961 0 obj
+<< /S /GoTo /D (11.97.383.2) >>
+endobj
+1964 0 obj
+(Name)
+endobj
+1965 0 obj
+<< /S /GoTo /D (11.97.384.2) >>
+endobj
+1968 0 obj
+(Synopsis)
+endobj
+1969 0 obj
+<< /S /GoTo /D (11.97.385.2) >>
+endobj
+1972 0 obj
+(Arguments)
+endobj
+1973 0 obj
+<< /S /GoTo /D (11.98.1) >>
+endobj
+1976 0 obj
+(canquegetinslot4idwaitkern)
+endobj
+1977 0 obj
+<< /S /GoTo /D (11.98.386.2) >>
+endobj
+1980 0 obj
+(Name)
+endobj
+1981 0 obj
+<< /S /GoTo /D (11.98.387.2) >>
+endobj
+1984 0 obj
+(Synopsis)
+endobj
+1985 0 obj
+<< /S /GoTo /D (11.98.388.2) >>
+endobj
+1988 0 obj
+(Arguments)
+endobj
+1989 0 obj
+<< /S /GoTo /D (11.98.389.2) >>
+endobj
+1992 0 obj
+(Description)
+endobj
+1993 0 obj
+<< /S /GoTo /D (11.98.390.2) >>
+endobj
+1996 0 obj
+(Return Value)
+endobj
+1997 0 obj
+<< /S /GoTo /D (11.99.1) >>
+endobj
+2000 0 obj
+(canquegetoutslotwaitkern)
+endobj
+2001 0 obj
+<< /S /GoTo /D (11.99.391.2) >>
+endobj
+2004 0 obj
+(Name)
+endobj
+2005 0 obj
+<< /S /GoTo /D (11.99.392.2) >>
+endobj
+2008 0 obj
+(Synopsis)
+endobj
+2009 0 obj
+<< /S /GoTo /D (11.99.393.2) >>
+endobj
+2012 0 obj
+(Arguments)
+endobj
+2013 0 obj
+<< /S /GoTo /D (11.99.394.2) >>
+endobj
+2016 0 obj
+(Description)
+endobj
+2017 0 obj
+<< /S /GoTo /D (11.99.395.2) >>
+endobj
+2020 0 obj
+(Return Value)
+endobj
+2021 0 obj
+<< /S /GoTo /D (11.100.1) >>
+endobj
+2024 0 obj
+(canquesyncwaitkern)
+endobj
+2025 0 obj
+<< /S /GoTo /D (11.100.396.2) >>
+endobj
+2028 0 obj
+(Name)
+endobj
+2029 0 obj
+<< /S /GoTo /D (11.100.397.2) >>
+endobj
+2032 0 obj
+(Synopsis)
+endobj
+2033 0 obj
+<< /S /GoTo /D (11.100.398.2) >>
+endobj
+2036 0 obj
+(Arguments)
+endobj
+2037 0 obj
+<< /S /GoTo /D (11.100.399.2) >>
+endobj
+2040 0 obj
+(Description)
+endobj
+2041 0 obj
+<< /S /GoTo /D (11.100.400.2) >>
+endobj
+2044 0 obj
+(Return Value)
+endobj
+2045 0 obj
+<< /S /GoTo /D (11.101.1) >>
+endobj
+2048 0 obj
+(canquefifoinitkern)
+endobj
+2049 0 obj
+<< /S /GoTo /D (11.101.401.2) >>
+endobj
+2052 0 obj
+(Name)
+endobj
+2053 0 obj
+<< /S /GoTo /D (11.101.402.2) >>
+endobj
+2056 0 obj
+(Synopsis)
+endobj
+2057 0 obj
+<< /S /GoTo /D (11.101.403.2) >>
+endobj
+2060 0 obj
+(Arguments)
+endobj
+2061 0 obj
+<< /S /GoTo /D (11.101.404.2) >>
+endobj
+2064 0 obj
+(Return Value)
+endobj
+2065 0 obj
+<< /S /GoTo /D (11.102.1) >>
+endobj
+2068 0 obj
+(canquefifodonekern)
+endobj
+2069 0 obj
+<< /S /GoTo /D (11.102.405.2) >>
+endobj
+2072 0 obj
+(Name)
+endobj
+2073 0 obj
+<< /S /GoTo /D (11.102.406.2) >>
+endobj
+2076 0 obj
+(Synopsis)
+endobj
+2077 0 obj
+<< /S /GoTo /D (11.102.407.2) >>
+endobj
+2080 0 obj
+(Arguments)
+endobj
+2081 0 obj
+<< /S /GoTo /D (11.103.1) >>
+endobj
+2084 0 obj
+(canquenewedgekern)
+endobj
+2085 0 obj
+<< /S /GoTo /D (11.103.408.2) >>
+endobj
+2088 0 obj
+(Name)
+endobj
+2089 0 obj
+<< /S /GoTo /D (11.103.409.2) >>
+endobj
+2092 0 obj
+(Synopsis)
+endobj
+2093 0 obj
+<< /S /GoTo /D (11.103.410.2) >>
+endobj
+2096 0 obj
+(Arguments)
+endobj
+2097 0 obj
+<< /S /GoTo /D (11.103.411.2) >>
+endobj
+2100 0 obj
+(Return Value)
+endobj
+2101 0 obj
+<< /S /GoTo /D (11.104.1) >>
+endobj
+2104 0 obj
+(canqueueendsdisposekern)
+endobj
+2105 0 obj
+<< /S /GoTo /D (11.104.412.2) >>
+endobj
+2108 0 obj
+(Name)
+endobj
+2109 0 obj
+<< /S /GoTo /D (11.104.413.2) >>
+endobj
+2112 0 obj
+(Synopsis)
+endobj
+2113 0 obj
+<< /S /GoTo /D (11.104.414.2) >>
+endobj
+2116 0 obj
+(Arguments)
+endobj
+2117 0 obj
+<< /S /GoTo /D (11.104.415.2) >>
+endobj
+2120 0 obj
+(Return Value)
+endobj
+2121 0 obj
+<< /S /GoTo /D (11.105.1) >>
+endobj
+2124 0 obj
+(1.6.6. CAN Queues RTLinux Specific Functions)
+endobj
+2125 0 obj
+<< /S /GoTo /D (11.106.1) >>
+endobj
+2128 0 obj
+(canqueuertl2lincheckandpend)
+endobj
+2129 0 obj
+<< /S /GoTo /D (11.106.416.2) >>
+endobj
+2132 0 obj
+(Name)
+endobj
+2133 0 obj
+<< /S /GoTo /D (11.106.417.2) >>
+endobj
+2136 0 obj
+(Synopsis)
+endobj
+2137 0 obj
+<< /S /GoTo /D (11.106.418.2) >>
+endobj
+2140 0 obj
+(Arguments)
+endobj
+2141 0 obj
+<< /S /GoTo /D (11.106.419.2) >>
+endobj
+2144 0 obj
+(Return Value)
+endobj
+2145 0 obj
+<< /S /GoTo /D (11.107.1) >>
+endobj
+2148 0 obj
+(canquegetinslot4idwaitrtl)
+endobj
+2149 0 obj
+<< /S /GoTo /D (11.107.420.2) >>
+endobj
+2152 0 obj
+(Name)
+endobj
+2153 0 obj
+<< /S /GoTo /D (11.107.421.2) >>
+endobj
+2156 0 obj
+(Synopsis)
+endobj
+2157 0 obj
+<< /S /GoTo /D (11.107.422.2) >>
+endobj
+2160 0 obj
+(Arguments)
+endobj
+2161 0 obj
+<< /S /GoTo /D (11.107.423.2) >>
+endobj
+2164 0 obj
+(Description)
+endobj
+2165 0 obj
+<< /S /GoTo /D (11.107.424.2) >>
+endobj
+2168 0 obj
+(Return Value)
+endobj
+2169 0 obj
+<< /S /GoTo /D (11.108.1) >>
+endobj
+2172 0 obj
+(canquegetoutslotwaitrtl)
+endobj
+2173 0 obj
+<< /S /GoTo /D (11.108.425.2) >>
+endobj
+2176 0 obj
+(Name)
+endobj
+2177 0 obj
+<< /S /GoTo /D (11.108.426.2) >>
+endobj
+2180 0 obj
+(Synopsis)
+endobj
+2181 0 obj
+<< /S /GoTo /D (11.108.427.2) >>
+endobj
+2184 0 obj
+(Arguments)
+endobj
+2185 0 obj
+<< /S /GoTo /D (11.108.428.2) >>
+endobj
+2188 0 obj
+(Description)
+endobj
+2189 0 obj
+<< /S /GoTo /D (11.108.429.2) >>
+endobj
+2192 0 obj
+(Return Value)
+endobj
+2193 0 obj
+<< /S /GoTo /D (11.109.1) >>
+endobj
+2196 0 obj
+(canquesyncwaitrtl)
+endobj
+2197 0 obj
+<< /S /GoTo /D (11.109.430.2) >>
+endobj
+2200 0 obj
+(Name)
+endobj
+2201 0 obj
+<< /S /GoTo /D (11.109.431.2) >>
+endobj
+2204 0 obj
+(Synopsis)
+endobj
+2205 0 obj
+<< /S /GoTo /D (11.109.432.2) >>
+endobj
+2208 0 obj
+(Arguments)
+endobj
+2209 0 obj
+<< /S /GoTo /D (11.109.433.2) >>
+endobj
+2212 0 obj
+(Description)
+endobj
+2213 0 obj
+<< /S /GoTo /D (11.109.434.2) >>
+endobj
+2216 0 obj
+(Return Value)
+endobj
+2217 0 obj
+<< /S /GoTo /D (11.110.1) >>
+endobj
+2220 0 obj
+(canquefifoinitrtl)
+endobj
+2221 0 obj
+<< /S /GoTo /D (11.110.435.2) >>
+endobj
+2224 0 obj
+(Name)
+endobj
+2225 0 obj
+<< /S /GoTo /D (11.110.436.2) >>
+endobj
+2228 0 obj
+(Synopsis)
+endobj
+2229 0 obj
+<< /S /GoTo /D (11.110.437.2) >>
+endobj
+2232 0 obj
+(Arguments)
+endobj
+2233 0 obj
+<< /S /GoTo /D (11.110.438.2) >>
+endobj
+2236 0 obj
+(Return Value)
+endobj
+2237 0 obj
+<< /S /GoTo /D (11.111.1) >>
+endobj
+2240 0 obj
+(canquefifodonertl)
+endobj
+2241 0 obj
+<< /S /GoTo /D (11.111.439.2) >>
+endobj
+2244 0 obj
+(Name)
+endobj
+2245 0 obj
+<< /S /GoTo /D (11.111.440.2) >>
+endobj
+2248 0 obj
+(Synopsis)
+endobj
+2249 0 obj
+<< /S /GoTo /D (11.111.441.2) >>
+endobj
+2252 0 obj
+(Arguments)
+endobj
+2253 0 obj
+<< /S /GoTo /D (11.112.1) >>
+endobj
+2256 0 obj
+(canquenewedgertl)
+endobj
+2257 0 obj
+<< /S /GoTo /D (11.112.442.2) >>
+endobj
+2260 0 obj
+(Name)
+endobj
+2261 0 obj
+<< /S /GoTo /D (11.112.443.2) >>
+endobj
+2264 0 obj
+(Synopsis)
+endobj
+2265 0 obj
+<< /S /GoTo /D (11.112.444.2) >>
+endobj
+2268 0 obj
+(Arguments)
+endobj
+2269 0 obj
+<< /S /GoTo /D (11.112.445.2) >>
+endobj
+2272 0 obj
+(Return Value)
+endobj
+2273 0 obj
+<< /S /GoTo /D (11.113.1) >>
+endobj
+2276 0 obj
+(canqueuenotifyrtl)
+endobj
+2277 0 obj
+<< /S /GoTo /D (11.113.446.2) >>
+endobj
+2280 0 obj
+(Name)
+endobj
+2281 0 obj
+<< /S /GoTo /D (11.113.447.2) >>
+endobj
+2284 0 obj
+(Synopsis)
+endobj
+2285 0 obj
+<< /S /GoTo /D (11.113.448.2) >>
+endobj
+2288 0 obj
+(Arguments)
+endobj
+2289 0 obj
+<< /S /GoTo /D (11.114.1) >>
+endobj
+2292 0 obj
+(canqueueendsinitrtl)
+endobj
+2293 0 obj
+<< /S /GoTo /D (11.114.449.2) >>
+endobj
+2296 0 obj
+(Name)
+endobj
+2297 0 obj
+<< /S /GoTo /D (11.114.450.2) >>
+endobj
+2300 0 obj
+(Synopsis)
+endobj
+2301 0 obj
+<< /S /GoTo /D (11.114.451.2) >>
+endobj
+2304 0 obj
+(Arguments)
+endobj
+2305 0 obj
+<< /S /GoTo /D (11.115.1) >>
+endobj
+2308 0 obj
+(canqueueendsdisposertl)
+endobj
+2309 0 obj
+<< /S /GoTo /D (11.115.452.2) >>
+endobj
+2312 0 obj
+(Name)
+endobj
+2313 0 obj
+<< /S /GoTo /D (11.115.453.2) >>
+endobj
+2316 0 obj
+(Synopsis)
+endobj
+2317 0 obj
+<< /S /GoTo /D (11.115.454.2) >>
+endobj
+2320 0 obj
+(Arguments)
+endobj
+2321 0 obj
+<< /S /GoTo /D (11.115.455.2) >>
+endobj
+2324 0 obj
+(Return Value)
+endobj
+2325 0 obj
+<< /S /GoTo /D (11.116.1) >>
+endobj
+2328 0 obj
+(canqueuertlinitialize)
+endobj
+2329 0 obj
+<< /S /GoTo /D (11.116.456.2) >>
+endobj
+2332 0 obj
+(Name)
+endobj
+2333 0 obj
+<< /S /GoTo /D (11.116.457.2) >>
+endobj
+2336 0 obj
+(Synopsis)
+endobj
+2337 0 obj
+<< /S /GoTo /D (11.116.458.2) >>
+endobj
+2340 0 obj
+(Arguments)
+endobj
+2341 0 obj
+<< /S /GoTo /D (11.117.1) >>
+endobj
+2344 0 obj
+(canqueuertldone)
+endobj
+2345 0 obj
+<< /S /GoTo /D (11.117.459.2) >>
+endobj
+2348 0 obj
+(Name)
+endobj
+2349 0 obj
+<< /S /GoTo /D (11.117.460.2) >>
+endobj
+2352 0 obj
+(Synopsis)
+endobj
+2353 0 obj
+<< /S /GoTo /D (11.117.461.2) >>
+endobj
+2356 0 obj
+(Arguments)
+endobj
+2357 0 obj
+<< /S /GoTo /D (11.118.1) >>
+endobj
+2360 0 obj
+(1.6.7. CAN Queues CAN Chips Specific Functions)
+endobj
+2361 0 obj
+<< /S /GoTo /D (11.119.1) >>
+endobj
+2364 0 obj
+(canqueuenotifychip)
+endobj
+2365 0 obj
+<< /S /GoTo /D (11.119.462.2) >>
+endobj
+2368 0 obj
+(Name)
+endobj
+2369 0 obj
+<< /S /GoTo /D (11.119.463.2) >>
+endobj
+2372 0 obj
+(Synopsis)
+endobj
+2373 0 obj
+<< /S /GoTo /D (11.119.464.2) >>
+endobj
+2376 0 obj
+(Arguments)
+endobj
+2377 0 obj
+<< /S /GoTo /D (11.119.465.2) >>
+endobj
+2380 0 obj
+(Description)
+endobj
+2381 0 obj
+<< /S /GoTo /D (11.120.1) >>
+endobj
+2384 0 obj
+(canqueueendsinitchip)
+endobj
+2385 0 obj
+<< /S /GoTo /D (11.120.466.2) >>
+endobj
+2388 0 obj
+(Name)
+endobj
+2389 0 obj
+<< /S /GoTo /D (11.120.467.2) >>
+endobj
+2392 0 obj
+(Synopsis)
+endobj
+2393 0 obj
+<< /S /GoTo /D (11.120.468.2) >>
+endobj
+2396 0 obj
+(Arguments)
+endobj
+2397 0 obj
+<< /S /GoTo /D (11.121.1) >>
+endobj
+2400 0 obj
+(canqueueendsdonechip)
+endobj
+2401 0 obj
+<< /S /GoTo /D (11.121.469.2) >>
+endobj
+2404 0 obj
+(Name)
+endobj
+2405 0 obj
+<< /S /GoTo /D (11.121.470.2) >>
+endobj
+2408 0 obj
+(Synopsis)
+endobj
+2409 0 obj
+<< /S /GoTo /D (11.121.471.2) >>
+endobj
+2412 0 obj
+(Arguments)
+endobj
+2413 0 obj
+<< /S /GoTo /D (11.121.472.2) >>
+endobj
+2416 0 obj
+(Return Value)
+endobj
+2417 0 obj
+<< /S /GoTo /D (11.122.1) >>
+endobj
+2420 0 obj
+(1.6.8. CAN Boards and Chip Setup specific Functions)
+endobj
+2421 0 obj
+<< /S /GoTo /D (11.123.1) >>
+endobj
+2424 0 obj
+(cancheckedmalloc)
+endobj
+2425 0 obj
+<< /S /GoTo /D (11.123.473.2) >>
+endobj
+2428 0 obj
+(Name)
+endobj
+2429 0 obj
+<< /S /GoTo /D (11.123.474.2) >>
+endobj
+2432 0 obj
+(Synopsis)
+endobj
+2433 0 obj
+<< /S /GoTo /D (11.123.475.2) >>
+endobj
+2436 0 obj
+(Arguments)
+endobj
+2437 0 obj
+<< /S /GoTo /D (11.123.476.2) >>
+endobj
+2440 0 obj
+(Description)
+endobj
+2441 0 obj
+<< /S /GoTo /D (11.123.477.2) >>
+endobj
+2444 0 obj
+(Return Value)
+endobj
+2445 0 obj
+<< /S /GoTo /D (11.124.1) >>
+endobj
+2448 0 obj
+(cancheckedfree)
+endobj
+2449 0 obj
+<< /S /GoTo /D (11.124.478.2) >>
+endobj
+2452 0 obj
+(Name)
+endobj
+2453 0 obj
+<< /S /GoTo /D (11.124.479.2) >>
+endobj
+2456 0 obj
+(Synopsis)
+endobj
+2457 0 obj
+<< /S /GoTo /D (11.124.480.2) >>
+endobj
+2460 0 obj
+(Arguments)
+endobj
+2461 0 obj
+<< /S /GoTo /D (11.125.1) >>
+endobj
+2464 0 obj
+(candelmemlist)
+endobj
+2465 0 obj
+<< /S /GoTo /D (11.125.481.2) >>
+endobj
+2468 0 obj
+(Name)
+endobj
+2469 0 obj
+<< /S /GoTo /D (11.125.482.2) >>
+endobj
+2472 0 obj
+(Synopsis)
+endobj
+2473 0 obj
+<< /S /GoTo /D (11.125.483.2) >>
+endobj
+2476 0 obj
+(Arguments)
+endobj
+2477 0 obj
+<< /S /GoTo /D (11.125.484.2) >>
+endobj
+2480 0 obj
+(Description)
+endobj
+2481 0 obj
+<< /S /GoTo /D (11.126.1) >>
+endobj
+2484 0 obj
+(canrequestioregion)
+endobj
+2485 0 obj
+<< /S /GoTo /D (11.126.485.2) >>
+endobj
+2488 0 obj
+(Name)
+endobj
+2489 0 obj
+<< /S /GoTo /D (11.126.486.2) >>
+endobj
+2492 0 obj
+(Synopsis)
+endobj
+2493 0 obj
+<< /S /GoTo /D (11.126.487.2) >>
+endobj
+2496 0 obj
+(Arguments)
+endobj
+2497 0 obj
+<< /S /GoTo /D (11.126.488.2) >>
+endobj
+2500 0 obj
+(Description)
+endobj
+2501 0 obj
+<< /S /GoTo /D (11.126.489.2) >>
+endobj
+2504 0 obj
+(Return Value)
+endobj
+2505 0 obj
+<< /S /GoTo /D (11.127.1) >>
+endobj
+2508 0 obj
+(canreleaseioregion)
+endobj
+2509 0 obj
+<< /S /GoTo /D (11.127.490.2) >>
+endobj
+2512 0 obj
+(Name)
+endobj
+2513 0 obj
+<< /S /GoTo /D (11.127.491.2) >>
+endobj
+2516 0 obj
+(Synopsis)
+endobj
+2517 0 obj
+<< /S /GoTo /D (11.127.492.2) >>
+endobj
+2520 0 obj
+(Arguments)
+endobj
+2521 0 obj
+<< /S /GoTo /D (11.128.1) >>
+endobj
+2524 0 obj
+(canrequestmemregion)
+endobj
+2525 0 obj
+<< /S /GoTo /D (11.128.493.2) >>
+endobj
+2528 0 obj
+(Name)
+endobj
+2529 0 obj
+<< /S /GoTo /D (11.128.494.2) >>
+endobj
+2532 0 obj
+(Synopsis)
+endobj
+2533 0 obj
+<< /S /GoTo /D (11.128.495.2) >>
+endobj
+2536 0 obj
+(Arguments)
+endobj
+2537 0 obj
+<< /S /GoTo /D (11.128.496.2) >>
+endobj
+2540 0 obj
+(Description)
+endobj
+2541 0 obj
+<< /S /GoTo /D (11.128.497.2) >>
+endobj
+2544 0 obj
+(Return Value)
+endobj
+2545 0 obj
+<< /S /GoTo /D (11.129.1) >>
+endobj
+2548 0 obj
+(canreleasememregion)
+endobj
+2549 0 obj
+<< /S /GoTo /D (11.129.498.2) >>
+endobj
+2552 0 obj
+(Name)
+endobj
+2553 0 obj
+<< /S /GoTo /D (11.129.499.2) >>
+endobj
+2556 0 obj
+(Synopsis)
+endobj
+2557 0 obj
+<< /S /GoTo /D (11.129.500.2) >>
+endobj
+2560 0 obj
+(Arguments)
+endobj
+2561 0 obj
+<< /S /GoTo /D (11.130.1) >>
+endobj
+2564 0 obj
+(canbaseaddrfixup)
+endobj
+2565 0 obj
+<< /S /GoTo /D (11.130.501.2) >>
+endobj
+2568 0 obj
+(Name)
+endobj
+2569 0 obj
+<< /S /GoTo /D (11.130.502.2) >>
+endobj
+2572 0 obj
+(Synopsis)
+endobj
+2573 0 obj
+<< /S /GoTo /D (11.130.503.2) >>
+endobj
+2576 0 obj
+(Arguments)
+endobj
+2577 0 obj
+<< /S /GoTo /D (11.130.504.2) >>
+endobj
+2580 0 obj
+(Description)
+endobj
+2581 0 obj
+<< /S /GoTo /D (11.131.1) >>
+endobj
+2584 0 obj
+(cancheckdevtaken)
+endobj
+2585 0 obj
+<< /S /GoTo /D (11.131.505.2) >>
+endobj
+2588 0 obj
+(Name)
+endobj
+2589 0 obj
+<< /S /GoTo /D (11.131.506.2) >>
+endobj
+2592 0 obj
+(Synopsis)
+endobj
+2593 0 obj
+<< /S /GoTo /D (11.131.507.2) >>
+endobj
+2596 0 obj
+(Arguments)
+endobj
+2597 0 obj
+<< /S /GoTo /D (11.131.508.2) >>
+endobj
+2600 0 obj
+(Returns)
+endobj
+2601 0 obj
+<< /S /GoTo /D (11.132.1) >>
+endobj
+2604 0 obj
+(registerobjstruct)
+endobj
+2605 0 obj
+<< /S /GoTo /D (11.132.509.2) >>
+endobj
+2608 0 obj
+(Name)
+endobj
+2609 0 obj
+<< /S /GoTo /D (11.132.510.2) >>
+endobj
+2612 0 obj
+(Synopsis)
+endobj
+2613 0 obj
+<< /S /GoTo /D (11.132.511.2) >>
+endobj
+2616 0 obj
+(Arguments)
+endobj
+2617 0 obj
+<< /S /GoTo /D (11.132.512.2) >>
+endobj
+2620 0 obj
+(Return Value)
+endobj
+2621 0 obj
+<< /S /GoTo /D (11.133.1) >>
+endobj
+2624 0 obj
+(registerchipstruct)
+endobj
+2625 0 obj
+<< /S /GoTo /D (11.133.513.2) >>
+endobj
+2628 0 obj
+(Name)
+endobj
+2629 0 obj
+<< /S /GoTo /D (11.133.514.2) >>
+endobj
+2632 0 obj
+(Synopsis)
+endobj
+2633 0 obj
+<< /S /GoTo /D (11.133.515.2) >>
+endobj
+2636 0 obj
+(Arguments)
+endobj
+2637 0 obj
+<< /S /GoTo /D (11.133.516.2) >>
+endobj
+2640 0 obj
+(Return Value)
+endobj
+2641 0 obj
+<< /S /GoTo /D (11.134.1) >>
+endobj
+2644 0 obj
+(inithwstruct)
+endobj
+2645 0 obj
+<< /S /GoTo /D (11.134.517.2) >>
+endobj
+2648 0 obj
+(Name)
+endobj
+2649 0 obj
+<< /S /GoTo /D (11.134.518.2) >>
+endobj
+2652 0 obj
+(Synopsis)
+endobj
+2653 0 obj
+<< /S /GoTo /D (11.134.519.2) >>
+endobj
+2656 0 obj
+(Arguments)
+endobj
+2657 0 obj
+<< /S /GoTo /D (11.134.520.2) >>
+endobj
+2660 0 obj
+(Description)
+endobj
+2661 0 obj
+<< /S /GoTo /D (11.134.521.2) >>
+endobj
+2664 0 obj
+(Return Value)
+endobj
+2665 0 obj
+<< /S /GoTo /D (11.135.1) >>
+endobj
+2668 0 obj
+(initdevicestruct)
+endobj
+2669 0 obj
+<< /S /GoTo /D (11.135.522.2) >>
+endobj
+2672 0 obj
+(Name)
+endobj
+2673 0 obj
+<< /S /GoTo /D (11.135.523.2) >>
+endobj
+2676 0 obj
+(Synopsis)
+endobj
+2677 0 obj
+<< /S /GoTo /D (11.135.524.2) >>
+endobj
+2680 0 obj
+(Arguments)
+endobj
+2681 0 obj
+<< /S /GoTo /D (11.135.525.2) >>
+endobj
+2684 0 obj
+(Description)
+endobj
+2685 0 obj
+<< /S /GoTo /D (11.135.526.2) >>
+endobj
+2688 0 obj
+(in the module parameters arrays)
+endobj
+2689 0 obj
+<< /S /GoTo /D (11.135.527.2) >>
+endobj
+2692 0 obj
+(Return Value)
+endobj
+2693 0 obj
+<< /S /GoTo /D (11.136.1) >>
+endobj
+2696 0 obj
+(initchipstruct)
+endobj
+2697 0 obj
+<< /S /GoTo /D (11.136.528.2) >>
+endobj
+2700 0 obj
+(Name)
+endobj
+2701 0 obj
+<< /S /GoTo /D (11.136.529.2) >>
+endobj
+2704 0 obj
+(Synopsis)
+endobj
+2705 0 obj
+<< /S /GoTo /D (11.136.530.2) >>
+endobj
+2708 0 obj
+(Arguments)
+endobj
+2709 0 obj
+<< /S /GoTo /D (11.136.531.2) >>
+endobj
+2712 0 obj
+(Description)
+endobj
+2713 0 obj
+<< /S /GoTo /D (11.136.532.2) >>
+endobj
+2716 0 obj
+(Return Value)
+endobj
+2717 0 obj
+<< /S /GoTo /D (11.137.1) >>
+endobj
+2720 0 obj
+(initobjstruct)
+endobj
+2721 0 obj
+<< /S /GoTo /D (11.137.533.2) >>
+endobj
+2724 0 obj
+(Name)
+endobj
+2725 0 obj
+<< /S /GoTo /D (11.137.534.2) >>
+endobj
+2728 0 obj
+(Synopsis)
+endobj
+2729 0 obj
+<< /S /GoTo /D (11.137.535.2) >>
+endobj
+2732 0 obj
+(Arguments)
+endobj
+2733 0 obj
+<< /S /GoTo /D (11.137.536.2) >>
+endobj
+2736 0 obj
+(Description)
+endobj
+2737 0 obj
+<< /S /GoTo /D (11.137.537.2) >>
+endobj
+2740 0 obj
+(Return Value)
+endobj
+2741 0 obj
+<< /S /GoTo /D (11.138.1) >>
+endobj
+2744 0 obj
+(inithwspecops)
+endobj
+2745 0 obj
+<< /S /GoTo /D (11.138.538.2) >>
+endobj
+2748 0 obj
+(Name)
+endobj
+2749 0 obj
+<< /S /GoTo /D (11.138.539.2) >>
+endobj
+2752 0 obj
+(Synopsis)
+endobj
+2753 0 obj
+<< /S /GoTo /D (11.138.540.2) >>
+endobj
+2756 0 obj
+(Arguments)
+endobj
+2757 0 obj
+<< /S /GoTo /D (11.138.541.2) >>
+endobj
+2760 0 obj
+(Description)
+endobj
+2761 0 obj
+<< /S /GoTo /D (11.138.542.2) >>
+endobj
+2764 0 obj
+(Return Value)
+endobj
+2765 0 obj
+<< /S /GoTo /D (11.139.1) >>
+endobj
+2768 0 obj
+(candefaultirqdispatch)
+endobj
+2769 0 obj
+<< /S /GoTo /D (11.139.543.2) >>
+endobj
+2772 0 obj
+(Name)
+endobj
+2773 0 obj
+<< /S /GoTo /D (11.139.544.2) >>
+endobj
+2776 0 obj
+(Synopsis)
+endobj
+2777 0 obj
+<< /S /GoTo /D (11.139.545.2) >>
+endobj
+2780 0 obj
+(Arguments)
+endobj
+2781 0 obj
+<< /S /GoTo /D (11.139.546.2) >>
+endobj
+2784 0 obj
+(File)
+endobj
+2785 0 obj
+<< /S /GoTo /D (11.140.1) >>
+endobj
+2788 0 obj
+(canchipsetupirq)
+endobj
+2789 0 obj
+<< /S /GoTo /D (11.140.547.2) >>
+endobj
+2792 0 obj
+(Name)
+endobj
+2793 0 obj
+<< /S /GoTo /D (11.140.548.2) >>
+endobj
+2796 0 obj
+(Synopsis)
+endobj
+2797 0 obj
+<< /S /GoTo /D (11.140.549.2) >>
+endobj
+2800 0 obj
+(Arguments)
+endobj
+2801 0 obj
+<< /S /GoTo /D (11.140.550.2) >>
+endobj
+2804 0 obj
+(Return Value)
+endobj
+2805 0 obj
+<< /S /GoTo /D (11.141.1) >>
+endobj
+2808 0 obj
+(canchipfreeirq)
+endobj
+2809 0 obj
+<< /S /GoTo /D (11.141.551.2) >>
+endobj
+2812 0 obj
+(Name)
+endobj
+2813 0 obj
+<< /S /GoTo /D (11.141.552.2) >>
+endobj
+2816 0 obj
+(Synopsis)
+endobj
+2817 0 obj
+<< /S /GoTo /D (11.141.553.2) >>
+endobj
+2820 0 obj
+(Arguments)
+endobj
+2821 0 obj
+<< /S /GoTo /D (11.142.1) >>
+endobj
+2824 0 obj
+(1.6.9. CAN Boards and Chip Finalization Functions)
+endobj
+2825 0 obj
+<< /S /GoTo /D (11.143.1) >>
+endobj
+2828 0 obj
+(msgobjdone)
+endobj
+2829 0 obj
+<< /S /GoTo /D (11.143.554.2) >>
+endobj
+2832 0 obj
+(Name)
+endobj
+2833 0 obj
+<< /S /GoTo /D (11.143.555.2) >>
+endobj
+2836 0 obj
+(Synopsis)
+endobj
+2837 0 obj
+<< /S /GoTo /D (11.143.556.2) >>
+endobj
+2840 0 obj
+(Arguments)
+endobj
+2841 0 obj
+<< /S /GoTo /D (11.144.1) >>
+endobj
+2844 0 obj
+(canchipdone)
+endobj
+2845 0 obj
+<< /S /GoTo /D (11.144.557.2) >>
+endobj
+2848 0 obj
+(Name)
+endobj
+2849 0 obj
+<< /S /GoTo /D (11.144.558.2) >>
+endobj
+2852 0 obj
+(Synopsis)
+endobj
+2853 0 obj
+<< /S /GoTo /D (11.144.559.2) >>
+endobj
+2856 0 obj
+(Arguments)
+endobj
+2857 0 obj
+<< /S /GoTo /D (11.145.1) >>
+endobj
+2860 0 obj
+(candevicedone)
+endobj
+2861 0 obj
+<< /S /GoTo /D (11.145.560.2) >>
+endobj
+2864 0 obj
+(Name)
+endobj
+2865 0 obj
+<< /S /GoTo /D (11.145.561.2) >>
+endobj
+2868 0 obj
+(Synopsis)
+endobj
+2869 0 obj
+<< /S /GoTo /D (11.145.562.2) >>
+endobj
+2872 0 obj
+(Arguments)
+endobj
+2873 0 obj
+<< /S /GoTo /D (11.146.1) >>
+endobj
+2876 0 obj
+(canhardwaredone)
+endobj
+2877 0 obj
+<< /S /GoTo /D (11.146.563.2) >>
+endobj
+2880 0 obj
+(Name)
+endobj
+2881 0 obj
+<< /S /GoTo /D (11.146.564.2) >>
+endobj
+2884 0 obj
+(Synopsis)
+endobj
+2885 0 obj
+<< /S /GoTo /D (11.146.565.2) >>
+endobj
+2888 0 obj
+(Arguments)
+endobj
+2889 0 obj
+<< /S /GoTo /D (12.0) >>
+endobj
+2892 0 obj
+(1.7. LinCAN Usage Information)
+endobj
+2893 0 obj
+<< /S /GoTo /D (12.147.1) >>
+endobj
+2896 0 obj
+(1.7.1. Installation Prerequisites)
+endobj
+2897 0 obj
+<< /S /GoTo /D (12.148.1) >>
+endobj
+2900 0 obj
+(1.7.2. Quick Installation Instructions)
+endobj
+2901 0 obj
+<< /S /GoTo /D (12.149.1) >>
+endobj
+2904 0 obj
+(1.7.3. Installation instructions)
+endobj
+2905 0 obj
+<< /S /GoTo /D (12.150.1) >>
+endobj
+2908 0 obj
+(1.7.4. Simple Utilities)
+endobj
+2909 0 obj
+<< /S /GoTo /D (12.151.1) >>
+endobj
+2912 0 obj
+(readburst)
+endobj
+2913 0 obj
+<< /S /GoTo /D (12.151.566.2) >>
+endobj
+2916 0 obj
+(Name)
+endobj
+2917 0 obj
+<< /S /GoTo /D (12.151.567.2) >>
+endobj
+2920 0 obj
+(Synopsis)
+endobj
+2921 0 obj
+<< /S /GoTo /D (12.151.568.2) >>
+endobj
+2924 0 obj
+(Description)
+endobj
+2925 0 obj
+<< /S /GoTo /D (12.151.569.2) >>
+endobj
+2928 0 obj
+(OPTIONS)
+endobj
+2929 0 obj
+<< /S /GoTo /D (12.152.1) >>
+endobj
+2932 0 obj
+(sendburst)
+endobj
+2933 0 obj
+<< /S /GoTo /D (12.152.570.2) >>
+endobj
+2936 0 obj
+(Name)
+endobj
+2937 0 obj
+<< /S /GoTo /D (12.152.571.2) >>
+endobj
+2940 0 obj
+(Synopsis)
+endobj
+2941 0 obj
+<< /S /GoTo /D (12.152.572.2) >>
+endobj
+2944 0 obj
+(Description)
+endobj
+2945 0 obj
+<< /S /GoTo /D (12.152.573.2) >>
+endobj
+2948 0 obj
+(OPTIONS)
+endobj
+2949 0 obj
+<< /S /GoTo /D [2950 0 R  /Fit ] >>
+endobj
+2952 0 obj <<
+/Length 168       
+/Filter /FlateDecode
+>>
+stream
+xÚ\8d\ eÂ0\fÜó\15\1eÛ!&v\9a:\19yK\b1 lÀÄK\1d\ 4âó1¥B\f\fÈËY÷Ð\1d\81Ó#\10\ 4Ñ1F\89°¿\18\ageæ\86zEU%\f1)þAÚÀ\84\9eÁ~\ 5\8c²\19Ì\98\81+\94\ 4ù\ 4D5zªA\82\ 1òaS,\9bëí1Xç\928\14¶ûJËQ\8añpõ\ 6\93¶¹\1fÛr\97\17\1a\90\90ê\0Ö32K\17°uÁ©Må\8aè%3ÓüéÕÏÒ
+ÉÉß«\9e°ë;tendstream
+endobj
+2950 0 obj <<
+/Type /Page
+/Contents 2952 0 R
+/Resources 2951 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+>> endobj
+2953 0 obj <<
+/D [2950 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2954 0 obj <<
+/D [2950 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2955 0 obj <<
+/D [2950 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2 0 obj <<
+/D [2950 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6 0 obj <<
+/D [2950 0 R /XYZ 357.57 717.908 null]
+>> endobj
+2951 0 obj <<
+/Font << /F22 2958 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2962 0 obj <<
+/Length 405       
+/Filter /FlateDecode
+>>
+stream
+xÚ\8dSMOà\18¾ïWà\8d&\16\81®B\8f~'ƨ1½\18õÀ:º\11»²Ð¢îßû®\85m\1a\ f¦\aÞ¯çã%\94!
+\1fC\82\11\911$)'RHT­&\14- s3aab:-H.\v\88ÿh¦9g$ã(= 8/''×\9c£\82\14§\19*ë¨!rIèô\14\95ó\17|gZÿuòT&\8cç8\1d²$åRà\8b³û1¸t   ÃæC»1}¥9\851hCÄ\92·ò\164Ä^\83¢\94qRäl \9fm\0%$~L2\81UÂ(þÐM(\99Nmá[\ 4ÏIA³\ 1ñèg\8dé\96z>NÝ&àË·zÌ8¥yÄ\1c¨\ØõÆ\99Ų\1f§^9\18ÛÏ\ fQ4òPiXÇ©\9dqA
+\11}gDH>0>\83U\8a­\1fA\95j\ 33,oB\«*èmâÜÊwýÑp-Cê;Ð\92ø84íÜÔ\9bá\9e\ 2Ûc¤Ú°îÜt½33ß\87\85û¥éBÇV~¥Û>`m\1d9¼ëÂpí´þÕM\ 4^*·8ô±Ó\ 2îö=ÔfÖ÷±ªÿ¸aµ^;»vFEc\8d©t\e\85?ãi\9af¿úèɺ=ï\8fETolK¶Z\93«r÷\8eÃ\13åSx\10âß\7fÁ7íÐÑEendstream
+endobj
+2961 0 obj <<
+/Type /Page
+/Contents 2962 0 R
+/Resources 2960 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+>> endobj
+2963 0 obj <<
+/D [2961 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2960 0 obj <<
+/Font << /F22 2958 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+2969 0 obj <<
+/Length 43374     
+/Filter /FlateDecode
+>>
+stream
+xÚ\94ýM\93dW~]yÏù)0L\fà
+÷x\1fòµUmlI-\96F­¶²$*É\82¬
+@'\12¤øíûFúÙ'b\9fð»|Á\9eÁC6/÷Ï\ 1\15£\ 2u×ßóøÍÍöÿ;~óx<<Þ\1e¿yº9\1d\9e\1e\9f¾ùþ/\7fuóÍ¿nÿ\93ÿã¯\8eã\89»»çÃýÓóö__ø\1f~w\7f:\1enOß|÷fào~ÿWÿé\1fN§oN7\87\87ûço~ÿ/A\1eïo\ fÇãÝ7¿ÿãÿóá÷ß>Þ}øøÏ\7fþôíw§§Ç\ f?ýËùÿÿo\7fúñ˧\1f¿üòíÿûûÿó¯þþ÷Ó9\1e·\ fq\7fúæñöáp³M]ú(yæ»7\ få³<\1f\9e\1fn_>Ê:ôòYþÛçOÿòñûOïÌûçÃétKæñpÜþâ/ÿ\9d9>Ü\1cnïï¯|\9cñÐÛ\8fsx÷A\1e¶¿o§ûK\1fä\82z~ö\8aÚ\83;êýáéùNªçg¯¨=¸£>\1d\1e\1e¬z~ö\8aÚ\83\97Õí_¡w··N\1dϲº\fî¨w\87Ó\8dUÏÏ^Q{pG}8<?\9e¤z~ö\8aÚ\83;êóáñΪçg¯¨=xY}:\1dî\8f\8egY]\ 6wÔûÃéɪçg¯¨=¸£>\1d\ f\89ó£WÌ\9a»L>ß\1c\9eäÿ\9b\9e\1fe²çvÈÛ¯ÿnäÌó³WÐ\1eÜQ\1f\1fÓV=?{EíÁ\1dõyû1ý$Õó³WÔ\1e¼¨\9en\8eÛ\8fi§æYT×Á\1dõnû1ý(Õó³WÔ\1eÜQ\1f·\1fÓV=?{EíÁËêñfû1ýàÔñ,«Ëà\8ezÚ~L[õüì\15µ\awÔûíÇô½TÏÏ^Q{pG}Ú~L[õüì\15µ\a/«Ûï§'÷»K\9eeu\19ÜQï¶\1fÔV=?{EíÁ\1dõaûY}+Õó³WÔ\1eÜQ·ßÞ\9f­z~ö\8aÚ\83\97ÕÛÓáöÁýû\\9eeu\19ÜQï¿þÓ\85SÏÏ^Q{pG}<<ß\1c¥z~ö\8aÚ\83\97Õ»í\9f\15\1f¥:\9eeu\19ÜQo\ fwòÿpÎ\8f^1kn\87|8\9cì_ç×G¯\905·C>m?¦\9f¥y~ö
\83\97Õûí\9fùï¤:\9eeu\19ÜQï¶\1fÓòw\97ñì\15µ\awÔÇíÇ´UÏÏ^Q{ð²úp³ý\98\96¿»\8cgY]\ 6wÔÓöcÚªçg¯¨=¸£Þo?¦åï.ãÙ+j\ fî¨OÛ\8f\9e\9f½¢öàeõñå?U\92¿»\8cgY]\ 6wÔÛíÇ´UÏÏ^Q{pG}Ø~LË\1fÁãÙ+j\ fî¨ÏÛ\ f\9e\9f½¢öàeõé´ý¬\96¿»\8cgY]\ 6wÔ»Ãó\93UÏÏ^Q{pG}<<Þ[õüì\15µ\a/«Ï7\87û\93ü\8di<Ëê2¸£Þ\1eNÏV=?{EíÁ\1d\1f>Èß$ƳWÔ\1eÜQ\9f\ eO·V=?{EíÁ\8bêíÍñà~
+\9f\9fD±Çv¼»\83ü\ f\ 5Æ£WÄ\9aÛ!\1f·\9fÑÏÒ<?{\ 5íÁ\1du{þƪçg¯¨=xY=\9e\9fÑî×¥<Ëê2¸£Þo?£­z~ö\8aÚ\83;êÓö3Zþki<{EíÁËêéfû\19-Õñ,«Ëà\8ez»ý\8c\96ÿ\87:\9e½¢öà\8eú°ý\8c¶êùÙ+j\ fî¨ÏÛÏè{©\9e\9f½¢öàeõö´ý\8c\96êx\96ÕepG½Û~FßIõüì\15µ\awÔÇÃÃ\8dUÏÏ^Q{ð²zw³ý¬v¿¸äYV\97Á\1dõöp¼³êùÙ+j\ fî¨÷\87çãIªçg¯¨=¸£>\1d\1e\9e¬z~ö\8aÚ\83\97ÕûãáîÞýâ\92gY]\ 6wÔ»ÃédÕó³WÔ\1eÜQ\1f\ eÏòßÔÏ\8f^1kn\87|>ÈW\vãÑ+dÍ]&\1f\8f\979\9eet\19ÜQï·\1fÓV=?{EíÁ\1dõiû1-\7fw\19Ï^Q{ð²úx³ý\98\96êx\96ÕepG½Ý~LËß]ƳWÔ\1eÜQ\1f\1fÓV=?{EíÁ\1dõyû1-ÿïf<{EíÁËêÓqû1-Õñ,«Ëà\8ez·ý\98\96¿»\8cg¯¨=¸£>n?¦­z~ö\8aÚ\83\97Õç\9bíÇ´üÝe<Ëê2¸£\9e\1fÔV=?{EíÁ\1dõ~ûY-\7fw\19Ï^Q{pG}:ÜßZõüì\15µ\a/ªw7ÇÃí\8dûÝ%Ï¢º\ eî¨w\87\9b\9e\9f½¢öà\8eúpxº;Jõüì\15µ\awÔçÃÃѪçg¯¨=xY=\9e\ eòßèÆ£löÜ\ ey\7f\90\81Âxô
+Ys;äãöcúY\9açg¯ =xY}É\80\95gY]\ 6wÔÛíÇ´ü\7fÒñì\15µ\a\87íÇ´UÏÏ^Q{pG}Ú~L?Jõüì\15µ\a/«·ÇíÇ´Tdz¬.\83;êÝöcúAªçg¯¨=¸£>n?¦­z~ö\8aÚ\83\97Õ»\9bíÇ´ü\191\9eeu\19ÜQOÛ\8f\9e\9f½¢öà\8ez¿ý\98¾\93êùÙ+j\ fî¨OÛ\ f\9e\9f½¢öàeõþ¸ý¬v¿»äYV\97Á\1dõöð|²êùÙ+j\ fî¨\ f\87\aùr,Ï^Q{pG}>Ü=Xõüì\15µ\a\ f§ÃI¾\1c˳¬.\83;êýáæƪçg¯¨=¸£>\1eä?.\8f\985w\99|¼9ÈÌq<ÊdÏí\90·Û\8fiù»Ëxö
\83;êö?|´êùÙ+j\ fî¨OÛ\8fiù»Ëxö\8aÚ\83\97Õ§ãöcZªãYV\97Á\1dõnû1-ÿå;\9e½¢öà\8eú¸ý\98¶êùÙ+j\ fî¨ÛóòýX\9e½¢öàeõù´ý\98\96êx\96ÕepG½ß~LËß]ƳWÔ\1eÜQ\9f\1fÓV=?{EíÁ\8bêýÍqû1í~\1eæYT×Á\1dõvûAmÕó³WÔ\1eÜQ\1f\9fÕV=?{EíÁ\1dõùp+\83­<{EíÁËêñt¸\91ÁV\9eeu\19ÜQï\ eO÷'©\9e\9f½¢öà\8eúxx8áUïöO,ǽ\vÛ¯ÿë×^6ç¡·\1fä\87w\1fä|ÅL×Å/ÿQÝãË{\95ãýáöîtå\ 2yüg\14x\81<\9eyù@ÇÃùüù\1f\7føñ×ÿý\9fþûï¿=\9eî?|÷õ¿\e\7fý_^þ\8b\87\ f\7f÷ù\87\7fûôùüÿñ\7fÞÜßlÏlÿ³í¿:¾O\14¶¿ðÇoÞ|\94÷×Ë\ f§û\9d¿·¯Ñ\ 2ü¥ÌháÍ_Ê~´ðþ\83@´@ê2ÈÑ\82R\13- Ú\83\1c-(5Ñ\ 2ª=ÈÑ\82Qg´@ê2ÈÑ\82R\13- Ú\83\1c-(5Ñ\ 2ª=ÈÑ\82R\13- Ú\83\1c-\18uF\v¤.\83\1c-(5Ñ\ 2ª=\88Ñ\82BG´\80fÍa´ È\11- Ys\1c-\18sF\v\84.\83\1c-(5Ñ\ 2ª=ÈÑ\82R\13- Ú\83\1c-\18uF\v¤.\83\1c-(5Ñ\ 2ª=ÈÑ\82R\13- Ú\83\1c-(5Ñ\ 2ª=ÈÑ\82Qg´@ê2ÈÑ\82R\13- Ú\83\1c-(5Ñ\ 2ª=ÈÑ\82Qg´@ê2ÈÑ\82R\13- Ú\83\1c-(5Ñ\ 2ª=ÈÑ\82R\13- Ú\83\1c-\bõ5Z\0u\1dähA©\89\16PíA\8e\16\94\9ah\ 1Õ\1eähA©\89\16PíA\8c\16\f\9ah\81Ì\9eÃhA\91#Z@²æ8ZPf¢\ 5D{\90£\ 5£Îh\81Ôe\90£\ 5¥&Z@µ\a9ZPj¢\ 5T{\90£\ 5¥&Z@µ\a9Z0ê\8c\16H]\ 69ZPj¢\ 5T{\90£\ 5¥&Z@µ\a9Z0ê\8c\16H]\ 69ZPj¢\ 5T{\90£\ 5¥&Z@µ\a9ZPj¢\ 5T{\90£\ 5£Îh\81Ôe\90£\ 5¥&Z@µ\a9ZPj¢\ 5T{\90£\ 5¥&Z@µ\a9Z0ê\8c\16H]\ 69ZPj¢\ 5T{\10£\ 5\85\8eh\ 1Í\9aÃhÁ\90\89\16\88ì9\8e\16\94\99h\ 1Ñ\1eähA©\89\16PíA\8e\16\94\9ah\ 1Õ\1eähÁ¨3Z u\19ähA©\89\16PíA\8e\16\94\9ah\ 1Õ\1eähA©\89\16PíA\8e\16\8c\ 5R\97A\8e\16\94\9ah\ 1Õ\1eähA©\89\16PíA\8e\16\84ú\1a-\80º\ er´ ÔD\v¨ö G\vJM´\80j\ fr´ ÔD\v¨ö G\vF\9dÑ\ 2©Ë G\vû¯¸o¾~gØ^>°ý¶}í\17\8b<Toë÷ò\81ýÏñÝíããöY\93\ fÜ^Î\a^¾@îëou7/\ f=¼~ Ç7ùÀx(Ï\9có\81¯\ 1ÁãÓK@ð·ß\1e\9f>|Í\ 5¶ÿþ\9f~ýË_>~þ\8f÷ß       ÷|8½ü\9fÍ+´~\9aÓö¯µ½8àõ\vÛà\83Î/l{óA÷¿°íý\a\81/lCµ\aù\vÛ\94\9a/lCµ\aù\vÛ\8c:¿°\8dÔe\90¿°M©ùÂ6T{\90¿°M©ùÂ6T{\90¿°M©ùÂ6T{\90¿°Í¨ó\vÛH]\ 6ù\vÛ\94\9a/lCµ\aù\vÛ\94\9a/lCµ\aù\vÛ\94\9a/lCµ\aù\vÛ\8c:¿°\8dÔe\90¿°M©ùÂ6T{\90¿°M©ùÂ6T{\90¿°Í¨ó\vÛH]\ 6ù\vÛ\94\9a/lCµ\aù\vÛ\94\9a/lCµ\aù\vÛ\94\9a/lCµ\aé\vÛ\84\99/l\ 3±Çð\vÛ\148¾°\rÅ\9aã/lSf¾°\rÑ\1eä/lSj¾°\rÕ\1eä/l3êüÂ6R\97AþÂ6¥æ\vÛPíAþÂ6¥æ\vÛPíAþÂ6£Î/l#u\19ä/lSj¾°\rÕ\1eä/lSj¾°\rÕ\1eä/lSjÚgT{\90Ûg£Îö\99Ôe\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg£Îö\99Ôe\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg¥¦}Fµ\a¹}6êl\9fI]\ 6¹}VjÚgT{\10Ûg\85\8eö\19Í\9aÃöY\91£}F²æ¸}6æl\9f ]\ 6¹}VjÚgT{\90Ûg¥¦}Fµ\a¹}6êl\9fI]\ 6¹}VjÚgT{\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg£Îö\99Ôe\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg£Îö\99Ôe\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg¥¦}Fµ\a¹}\16êkû\fê:Èí³RÓ>£Ú\83Ü>+5í3ª=Èí³RÓ>£Ú\83Ø>\e4í3\99=\87í³"Gû\8cdÍqû¬Ì´Ï\88ö ·ÏF\9dí3©Ë ·ÏJMû\8cj\ frû¬Ô´Ï¨ö ·ÏJMû\8cj\ frûlÔÙ>\93º\frû¬Ô´Ï¨ö ·ÏJMû\8cj\ frûlÔÙ>\93º\frû¬Ô´Ï¨ö ·ÏJMû\8cj\ frû¬Ô´Ï¨ö ·ÏF\9dí3©Ë ·ÏJMû\8cj\ frû¬Ô´Ï¨ö ·ÏJ}¾^ɬ\83Ü>\eu¶Ï¤.\83Ü>+5í3ª=\88í³BGû\8cfÍaûlÈ´ÏDö\1c·ÏÊLû\8ch\ frû¬Ô´Ï¨ö ·ÏJMû\8cj\ frûlÔÙ>\93º\frû¬Ô´Ï¨ö ·ÏJMû\8cj\ frû¬Ô´Ï¨ö ·ÏF\9dí3©Ë ·ÏJMû\8cj\ frû¬Ô´Ï¨ö ·ÏB}m\9fA]\a¹}VjÚgT{\90Ûg¥¦}Fµ\a¹}VjÚgT{\90Ûg£Îö\99Ôe\90Ûçý\82÷fû¿zj\9f\1f\9f\8e×>Èù¡J\8d÷ÚçýÏñÝíË/\9e/ÿî³ý\85=ß_þzµãö\vÅíË\7f\ e¶ý®x¸}¾¿Ü>\8f\87òLÚçÔÏ»µóÍánû±ûfúýß«ÓöÏ\1e;µsþÀqúhyèíGÛû\ 3Ç/|\8eÝ?p\9cÍ\9a£?pÜ\91ç?p\9cÉ\9aÃ?pÜ\99ã\ f\1c\añ\ f\1cWjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu¥¦_Gu\19Ä~Ý©£_gµ\a±_wêè×YíAì×\9d:úuV{\10úuc\8e~\9dÄ\1e£~Ý\81ç~\9dÅ\9aÃ~Ý\99£_g´\a±_wêè×YíAì×\95\9a~\1dÕe\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAê×\1dzî×Ù¬9ê×\1dyî×\99¬9ì×\95\99~\1dÑe\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~ݨ³_'u\1dÄ~Ý©£_gµ\a±_wêè×YíAì×\9d:úuV{\90úu\85\8e~\1dÍ\9e£~Ý\91ç~\9dÉ\9aÃ~Ý\99£_g´\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_WjúuT\97Aì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_wêè×YíAê×\1dzî×Ù¬9ê×\159úu${\ eûug\8e~\9dÑ\1eÄ~Ý©£_gµ\a±_wêè×YíAì×\95\9a~\1dÕe\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_wêè×YíAì×\95\9a~\1dÕe\10ûu§\8e~\9dÕ\1eÄ~Ý©£_gµ\a±_7êì×I]\a±_wêè×YíAì×\9d:úuV{\10ûu§\8e~\9dÕ\1eÄ~]©é×Q]\ 6±_Ç&[ôëüAÎ\ fU.¾Ó¯ÃçxóÝÝЯ绻\1fF\9aGßÝ\9dgÎýúiç»»ç\1fõýò_\7fúåÛã\87ï?ÿðó\97\1f~úñ}ýö|þ\v}µ/}\11úq/p\9fi\1a\99¦½ùì;iÚÅ\ f²\93¦\1d¯©=Èi\9aR\93¦¡Ú\83\9c¦)5i\1aª=Hi\9a0\93¦\81Øc\98¦)p¤i(Ö\1c§iÊL\9a\86h\ fr\9a¦Ô¤i¨ö §iF\9di\1a©Ë §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iF\9di\1a©Ë §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a\99¦\91º\fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a\99¦\91º\fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iF\9di\1a©Ë §iJM\9a\86j\ fb\9a¦Ð\91¦¡Ys\98¦)r¤iHÖ\1c§iÆ\9ci\1a¡Ë §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iF\9di\1a©Ë §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a\99¦\91º\fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a\99¦\91º\fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iB}MÓ@]\a9MSjÒ4T{\90Ó4¥&MCµ\a9MSjÒ4T{\10Ó4\83&M#³ç0MSäHÓ\90¬9NÓ\94\994\rÑ\1eä4ͨ3M#u\19ä4M©IÓPíANÓ\94\9a4\rÕ\1eä4M©IÓPíANÓ\8c:Ó4R\97ANÓ\94\9a4\rÕ\1eä4M©IÓPíANÓ\8c:Ó4R\97ANÓ\94\9a4\rÕ\1eä4M©IÓPíANÓ\94\9a4\rÕ\1eä4ͨ3M#u\19ä4M©IÓPíANÓ\94\9a4\rÕ\1eä4M©Ï×_b®\83\9c¦\19u¦i¤.\83\9c¦)5i\1aª=\88i\9aBG\9a\86fÍa\9afȤiDö\1c§iÊL\9a\86h\ fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a\99¦\91º\fr\9a¦Ô¤i¨ö §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iF\9di\1a©Ë §iJM\9a\86j\ fr\9a¦Ô¤i¨ö §iB}MÓ@]\a9MSjÒ4T{\90Ó4¥&MCµ\a9MSjÒ4T{\90Ó4£Î4\8dÔe\90Ó4ª©L\9a\86\1fä¾\8a­\97\ frÚKÓö?ÇòÕª§+_­úðpØ~vðW«\8eg\92¦å«U\7f÷ã\97Ï?ýñ×ï/æg÷Û?Õ¼ü\96ôº¿~\88í\1fg\8f\8f{ùÙü^Lø|ó{1ß|¾ýïÅ|ÿAà{1QíAþ^L£ÎïÅ$u\19äïÅTj¾\17\13Õ\1eäïÅTj¾\17\13Õ\1eäïÅTj¾\17\13Õ\1eäïÅ4êü^LR\97Aþ^L¥æ{1QíAþ^L¥æ{1QíAþ^L¥æ{1QíAþ^L£ÎïÅ$u\19äïÅTj¾\17\13Õ\1eäïÅTj¾\17\13Õ\1eäïÅ4ê\8c\8fI]\ 6ù{1\95\9aïÅDµ\a9>VjâcT{\90ãc¥&>Fµ\a)>\16fâc\10{\fãc\ 5\8eø\18Å\9aãøX\99\89\8f\11íA\8e\8f\95\9aø\18Õ\1eäøب3>&u\19äøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøب3>&u\19äøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\8d:ãcR\97A\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\8d:ãcR\97A\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøب3>&u\19äøX©\89\8fQíA\8c\8f\15:âc4k\ eãcE\8eø\18É\9aãøØ\983>&t\19äøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøب3>&u\19äøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\8d:ãcR\97A\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\8d:ãcR\97A\8e\8f\95\9aø\18Õ\1eäøX©\89\8fQíA\8e\8f\95\9aø\18Õ\1eäøX¨¯ñ1¨ë ÇÇJM|\8cj\ fr|¬ÔÄǨö ÇÇJM|\8cj\ fb|lÐÄÇdö\1cÆÇ\8a\1cñ1\925Çñ±2\13\1f\83\1c\1f\euÆǤ.\83\1c\1f+5ñ1ª=Èñ±R\13\1f£Ú\83\1c\1f+5ñ1ª=Èñ±Qg|Lê2Èñ±R\13\1f£Ú\83\1c\1f+5ñ1ª=Èñ±Qg|Lê2Èñ±R\13\1f£Ú\83\1c\1f+5ñ1ª=Èñ±R\13\1f£Ú\83\1c\1f\euÆǤ.\83\1c\1f+5ñ1ª=Èñ±R\13\1f£Ú\83\1c\1f+5ñ1ª=Èñ±Qg|Lê2Èñ±R\13\1f£Ú\83\18\1f+tÄÇhÖ\1cÆÇ\86L|LdÏq|¬ÌÄÇ\88ö ÇÇJM|\8cj\ fr|¬ÔÄǨö ÇÇF\9dñ1©Ë ÇÇJM|\8cj\ fr|¬ÔÄǨö ÇÇJM|\8cj\ fr|lÔ\19\1f\93º\fr|¬ÔÄǨö ÇÇJM|\8cj\ fr|,Ô×ø\18Ôu\90ãc¥&>Fµ\a9>VjâcT{\90ãc¥&>Fµ\a9>6ê\8c\8fI]\ 69>Þoi]|\8c\1fdÄÇo>Èn|¼ÿ9~ã÷bn¿¥Þß\1dù{1Ç3çøøV|/æ?ýÇË÷b~ùô\97ñè§\7fûôçó\7fù×ÿíwï\e\90çÃñå׸×\8fò¾S~º\7fØù{û\1ahÀ_Ê\f4Þü¥ì\a\1aï?\b\ 4\1a¨ö \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aF\9d\81\ 6©Ë \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aF\9d\81\ 6©Ë \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aJM \81j\ fr aÔ\19h\90º\fr ¡Ô\ 4\1a¨ö \ 6\1a
+\1d\81\ 6\9a5\87\81\86"G \81dÍq aÌ\19h\10º\fr ¡Ô\ 4\1a¨ö \a\1aJM \81j\ fr aÔ\19h\90º\fr ¡Ô\ 4\1a¨ö \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aF\9d\81\ 6©Ë \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aF\9d\81\ 6©Ë \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aJM \81j\ fr !Ô×@\ 3Ôu\90\ 3\r¥&Ð@µ\a9ÐPj\ 2\rT{\90\ 3\r¥&Ð@µ\a1Ð0h\ 2\r2{\ e\ 3\rE\8e@\ 3É\9aã@C\99        4\10íA\ e4\8c:\ 3\rR\97A\ e4\94\9a@\ 3Õ\1eä@C©       4PíA\ e4\94\9a@\ 3Õ\1eä@è3Рu\19ä@C©       4PíA\ e4\94\9a@\ 3Õ\1eä@è3Рu\19ä@C©       4PíA\ e4\94\9a@\ 3Õ\1eä@C©        4PíA\ e4\8c:\ 3\rR\97A\ e4\94\9a@\ 3Õ\1eä@C©       4PíA\ e4\94ú|ý?Ê_\a9Ð0ê\f4H]\ 69ÐPj\ 2\rT{\10\ 3\r\85\8e@\ 3Í\9aÃ@Ã\90    4\88ì9\ e4\94\99@\ 3Ñ\1eä@C©        4PíA\ e4\94\9a@\ 3Õ\1eä@è3Рu\19ä@C©       4PíA\ e4\94\9a@\ 3Õ\1eä@C©        4PíA\ e4\8c:\ 3\rR\97A\ e4\94\9a@\ 3Õ\1eä@C©       4PíA\ e4\84ú\1ah\80º\ er ¡Ô\ 4\1a¨ö \a\1aJM \81j\ fr ¡Ô\ 4\1a¨ö \a\1aF\9d\81\ 6©Ë \a\1aû\11\81\v\83\8c@ãÍ\a¹Ý\v4ö?Çoüv¸í\9f\9f\9eùÛáÆ3    4òíp\7f÷éß~øþÓù¿þ\87o\8f7\1f~øó§_ÎÿíÇ\1fÿxþ/þ¯o\8f\1f>ýòËÇ\7f\1dÏýÓ\97Ï¿~ÿå×Ï\9f޿ù9ÿ(yý@ë§~y\17\7f·\97iÌWXð\174_a½ù\vÚ\7f\85õþ\83À+,T{\90_a)5¯°PíA~\85eÔù
+\8bÔe\90_a)5¯°PíA~\85¥Ô¼ÂBµ\aù\15\96
+\vÕ\1eäWXF\9d¯°H]\ 6ù\15\96
+\vÕ\1eäWXJÍ+,T{\90_a\19u¾Â"u\19äWXJÍ+,T{\90_a)5¯°PíA~\85¥Ô¼ÂBµ\aù\15\96P__a\81º\ eò+,¥æ\15\16ª=ȯ°\94\9aWX¨ö ¿ÂRj^a¡Ú\83ø
+Ë y\85EfÏá+,E\8eWXHÖ\1c¿ÂRf^a!Ú\83ü
+˨ó\15\16©Ë ¿ÂRj^a¡Ú\83ü
+K©y\85\85j\ fò+,¥æ\15\16ª=ȯ°\8c:_a\91º\fò+,¥æ\15\16ª=ȯ°\94\9aWX¨ö ¿Â2ê|\85Eê2ȯ°\94\9aWX¨ö ¿ÂRj^a¡Ú\83ü
+K©y\85\85j\ fò+,£ÎWX¤.\83ü
+K©y\85\85j\ fò+,¥æ\15\16ª=ȯ°\94\9aWX¨ö ¿Â2ê|\85Eê2ȯ°\94\9aWX¨ö ¾ÂRèx\85\85fÍá+,Cæ\15\16\91=ǯ°\94\99WX\88ö ¿ÂRj^a¡Ú\83ü
+K©y\85\85j\ fò+,£ÎWX¤.\83ü
+K©y\85\85j\ fò+,¥æ\15\16ª=ȯ°\94\9aWX¨ö ¿Â2ê|\85Eê2ȯ°\94\9aWX¨ö ¿ÂRj^a¡Ú\83ü
+K¨¯¯°@]\aù\15\96
+\vÕ\1eäWXJÍ+,T{\90_a)5¯°PíA~\85eÔù
+\8bÔe\90_aí¿`q¯°ð\83\8cWXo>Èî+¬ýϱ¼Â:^y\85uz<<Ü>ñ+¬ñL^a\9dÆ+¬Ý\13ã¼Ï:ÿwÿõÛã\87\9f?}þøòç ýòþÖõå?¥þæÍǸp_|·\7f_\9c\9b[øË\987·oþ2öonß\7f\10¸¹Eµ\aùæÖ¨óæ\96Ôe\90on\95\9a\9b[T{\90on\95\9a\9b[T{\90on\8d:onI]\ 6ùæV©¹¹Eµ\aùæV©¹¹Eµ\aùæV©¹¹Eµ\aùæÖ¨óæ\96Ôe\90on\95\9a\9b[T{\10on\15:nnѬ9¼¹U丹E²æøæÖ\983X t\19ä`A©      \16PíA\ e\16\94\9a`\ 1Õ\1eä`Á¨3X u\19ä`A©       \16PíA\ e\16\94\9a`\ 1Õ\1eä`A©        \16PíA\ e\16\8c:\83\ 5R\97A\ e\16\94\9a`\ 1Õ\1eä`A©       \16PíA\ e\16\8c:\83\ 5R\97A\ e\16\94\9a`\ 1Õ\1eä`A©       \16PíA\ e\16\94\9a`\ 1Õ\1eä`A¨¯Á\ 2¨ë \a\vJM°\80j\ fr° Ô\ 4\v¨ö \a\vJM°\80j\ fb°`Ð\ 4\v\1c\ 6\v\8a\1cÁ\ 2\925ÇÁ\822\13, Ú\83\1c,\18u\ 6\v¤.\83\1c,(5Á\ 2ª=ÈÁ\82R\13, Ú\83\1c,(5Á\ 2ª=ÈÁ\82Qg°@ê2ÈÁ\82R\13, Ú\83\1c,(5Á\ 2ª=ÈÁ\82Qg°@ê2ÈÁ\82R\13, Ú\83\1c,(5Á\ 2ª=ÈÁ\82R\13, Ú\83\1c,\18u\ 6\v¤.\83\1c,(5Á\ 2ª=ÈÁ\82R\13, Ú\83\1c,(5Á\ 2ª=ÈÁ\82Qg°@ê2ÈÁ\82R\13, Ú\83\18,(t\ 4\v\1c\ 6\v\86L°@dÏq° Ì\ 4\v\88ö \a\vJM°\80j\ fr° Ô\ 4\v¨ö \a\vF\9dÁ\ 2©Ë \a\vJM°\80j\ fr° Ô\ 4\v¨ö \a\vJM°\80j\ fr°`Ô\19,\90º\fr° Ô\ 4\v¨ö \a\vJM°\80j\ fr° Ô×`\ 1Ôu\90\83\ 5¥&X@µ\a9XPj\82\ 5T{\90\83\ 5¥&X@µ\a9X0ê\f\16H]\ 69XØ\7f±î\82\ 5ü #XxóAîö\82\85ýÏñÝííö\8f\8f|sû|<\9c¾þ\9d9¾ü§Ä\ f\97\83\85ñP\9eyù@?ýüéÇõ3\9d\8e·\87\9b\97w}¯[ïÏe\1f\9e÷ÎeO/\7fÝ_ÿ)   >K\1ezûY\ eï?ÈÓáþx\7fé\83\PÏÏ^Q{ð²zzùÛtçÔñ,«Ëà\8ez·ýM·êùÙ+j\ fî¨\ f\87§Ó­TÏÏ^Q{pG}>Ü?[õüì\15µ\a/«·§ÃíË?Ô\18u<Ëê2¸£Þ\1f\8e·V=?{EíÁ\1dõñð|s\94êùÙ+j\ f^Vïn\ e\ f\8fR\1dϲº\f\87\7f8çG¯\985·C>\1cNö¯óë£WÈ\9aÛ!\9f\ eÏ/ÿP£Ìó³WÐ\1e¼¬Þ\1f·\1fÓR\1dϲº\fî¨wÛ\8fé'©\9e\9f½¢öà\8eú¸ý\98¶êùÙ+j\ f^V\1f\7fw\7fù\87\1a£\8egY]\ 6wÔÓöcÚªçg¯¨=¸£Þo?¦\1f¤z~ö\8aÚ\83;êÓöcÚªçg¯¨=xY}<n?¦åï.ãYV\97Á\1dõvû1mÕó³WÔ\1eÜQ\1f\1fÓòGðxö\8aÚ\83;êóö\83Úªçg¯¨=xY}:m?«åï.ãYV\97Á\1dõîðüdÕó³WÔ\1eÜQ\1f\ f\8f÷V=?{EíÁËêóÍáþ$\7fc\1aϲº\f\87Ó³UÏÏ^Q{pG}8Ü<Èß$ƳWÔ\1eÜQ\9f\ eO·V=?{EíÁË\rËÍñà~
+\9f\9fD±Çv¼»Ãí£\ 4¿>zE¬¹\1dòqû\19ý,Íó³WÐ\1eÜQ·ço¬z~ö\8aÚ\83\97Õãiû\19í~]ʳ¬.\83;êýö3Úªçg¯¨=¸£>m?£å¿\96ƳWÔ\1eÜ9º\18\7fò\9b\1f%Gê2È\7f\94\9cRóGÉ¡Ú\83üGÉ)5g-¨ö \9fµ(5g-¨ö \9fµ\18u\9eµ\90º\fòY\8bRsÖ\82j\ fòY\8bRsÖ\82j\ fòY\8bQçY\v©Ë \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ\18u\9eµ\90º\fòY\8bRsÖ\82j\ fâY\8bBÇY\v\9a5\87g-\8a\1cg-HÖ\1c\9fµ\18s\9eµ\10º\fòY\8bRsÖ\82j\ fòY\8bRsÖ\82j\ fòY\8bQçY\v©Ë \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ\18u\9eµ\90º\fòY\8bRsÖ\82j\ fòY\8bRsÖ\82j\ fòY\8bQçY\v©Ë \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ(5g-¨ö \9fµ\bõõ¬\ 5Ôu\90ÏZ\94\9a³\16T{\90ÏZ\94\9a³\16T{\90ÏZ\94\9a³\16T{\10ÏZ\f\9a³\162{\ eÏZ\149ÎZ\90¬9>kQfÎZ\10íA>k1ê<k!u\19ä³\16¥æ¬\ 5Õ\1eä³\16¥æ¬\ 5Õ\1eä³\16¥æ¬\ 5Õ\1eä³\16£Î³\16R\97A>kQjÎZPíA>kQjÎZPíA>k1ê<k!u\19ä³\16¥æ¬\ 5Õ\1eä³\16¥æ¬\ 5Õ\1eä³\16¥æ¬\ 5Õ\1eä³\16£Î³\16R\97A>kQjÎZPíA>kQjÎZPíA>kQjÎZPíA>k1ê<k!u\19ä³\16¥æ¬\ 5Õ\1eij\16\85\8e³\164k\ eÏZ\f\99³\16"{\8eÏZ\94\99³\16D{\90ÏZ\94\9a³\16T{\90ÏZ\94\9a³\16T{\90ÏZ\8c:ÏZH]\ 6ù¬E©9kAµ\aù¬E©9kAµ\aù¬E©9kAµ\aù¬Å¨ó¬\85Ôe\90ÏZ\94\9a³\16T{\90ÏZ\94\9a³\16T{\90ÏZ\84úzÖ\ 2ê:Èg-JÍY\vª=Èg-JÍY\vª=Èg-JÍY\vª=Èg-F\9dg-¤.\83|Ö²\7f¹áÎZð\83\8c³\967\1fd÷¬eÿs,g-Ç+g-Û¿ª\1f·ÿ[³\96ñÌË\aúþÛÇ\ f\7fþé\97O\97N[^þOòuîýeËíóýÕË\16ø8ó²åÍÇÙ¿lyÿAà²\ 5Õ\1eäË\16£ÎË\16R\97A¾lQj.[PíA¾lQj.[PíA¾lQj.[PíA¾l1ê¼l!u\19äË\16¥æ²\ 5Õ\1eäË\16¥æ²\ 5Õ\1eäË\16£ÎË\16R\97A¼lQè¸lA³æð²E\91ã²\ 5É\9aãË\16eæ²\ 5Ñ\1eäË\16£ÎË\16R\97A¾lQj.[PíA¾lQj.[PíA¾l1ê¼l!u\19äË\16¥æ²\ 5Õ\1eäË\16¥æ²\ 5Õ\1eäË\16¥æ²\ 5Õ\1eäË\16£ÎË\16R\97A¾lQj.[PíA¾lQj.[PíA¾lQj.[PíA¾l1ê¼l!u\19äË\16¥æ²\ 5Õ\1eäË\16¥æ²\ 5Õ\1eäË\16£ÎË\16R\97A¾lQj.[PíA¾lQj.[PíA¾lQj.[PíAºl\11f.[@ì1¼lQà¸lA±æø²E\99¹lA´\aù²E©¹lAµ\aù²Å¨ó²\85Ôe\90/[\94\9aË\16T{\90/[\94\9aË\16T{\90/[\8c:/[H]\ 6ù²E©¹lAµ\aù²E©¹lAµ\aù²E©¹lAµ\aù²Å¨ó²\85Ôe\90/[\94\9aË\16T{\90/[\94\9aË\16T{\90/[\8c:/[H]\ 6ù²E©¹lAµ\aù²E©¹lAµ\aù²E©¹lAµ\aù²Å¨ó²\85Ôe\90/[\94\9aË\16T{\10/[\14:.[Ь9¼lQä¸lA²æø²Å\98ó²\85Ðe\90/[\94\9aË\16T{\90/[\94\9aË\16T{\90/[\8c:/[H]\ 6ù²E©¹lAµ\aù²E©¹lAµ\aù²E©¹lAµ\aù²Å¨ó²\85Ôe\90/[\94\9aË\16T{\90/[\94\9aË\16T{\90/[\8c:/[H]\ 6ù²E©¹lAµ\aù²E©¹lAµ\aù²E©¹lAµ\aù²E¨¯\97- ®\83|Ù¢Ô\¶ Ú\83|Ù¢Ô\¶ Ú\83|Ù¢Ô\¶ Ú\83xÙbÐ\¶\90ÙsxÙ¢ÈqÙ\82dÍñe\8b2sÙ\82h\ fòe\8bQçe\v©Ë _¶(5\97-¨ö _¶(5\97-¨ö _¶(5\97-¨ö _¶\18u^¶\90º\fòe\8bRsÙ\82j\ fòe\8bRsÙ\82j\ fòe\8bQçe\v©Ë _¶(5\97-¨ö _¶(5\97-¨ö _¶(5\97-¨ö _¶\18u^¶\90º\fòe\8bRsÙ\82j\ fòe\8bRsÙ\82j\ fòe\8bRsÙ\82j\ fòe\8bQçe\v©Ë _¶(5\97-¨ö ^¶(t\¶ YsxÙbÈ\¶\10Ùs|Ù¢Ì\¶ Ú\83|Ù¢Ô\¶ Ú\83|Ù¢Ô\¶ Ú\83|ÙbÔyÙBê2È\97-JÍe\vª=È\97-JÍe\vª=È\97-JÍe\vª=È\97-F\9d\97-¤.\83|Ù¢Ô\¶ Ú\83|Ù¢Ô\¶ Ú\83|Ù"Ô×Ë\16P×A¾lQj.[PíA¾lQj.[PíA¾lQj.[PíA¾l1ê¼l!u\19äË\96ýË\r\82\1fd\¶¼ù »\97\9fã·]¶Ü?=mè\1d^¶ä\99\97\ fôùÓÇ?¾¿&9\1e\9e·\7f\82y³µ\82ÛÿéÜ\1ewÏZ¶ÏùòÊ\8b>K\1ezûY.\9cµ\9co_.|\90ýc\1aV{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A:¦qèù\98\86Í\9a£c\1aG\9e\8fi\98¬9<¦qæ8¦a´\añ\98F©9¦Au\19Äc\1a§\8ec\1aV{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8ei\8c9\8eiHì1:¦qàù\98\86Å\9aÃc\1ag\8ec\1aF{\10\8fi\9c:\8eiXíA<¦Qj\8eiP]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA:¦qèù\98\86Í\9a£c\1aG\9e\8fi\98¬9<¦Qf\8ei\10]\ 6ñ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a£Îc\1aR×A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\90\8ei\14:\8eiÐì9:¦qäù\98\86É\9aÃc\1ag\8ec\1aF{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a§\8ec\1aV{\10\8fi\94\9ac\1aT\97A<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA:¦qèù\98\86Í\9a£c\1aE\8ec\1a${\ e\8fi\9c9\8ei\18íA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98ƨó\98\86Ôu\10\8fi\9c:\8eiXíA<¦qê8¦aµ\añ\98Æ©ã\98\86Õ\1eÄc\1a¥æ\98\ 6Õe\10\8fià^D\1dÓð\a9?ôö\83Üï\1cÓÀçX\8eiNW\8ei\1eï\ fO·'>¦\19ϼ| \7fÿüÃ\97O\97\8eXî^þî¼\8e½ÿ»sz¾½ö\87ÄÐ\87\99w-o>Ìþ]Ëû\ f\ 2w-¨ö ßµ\18uÞµ\90º\fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bQç]\v©Ë ßµ(5w-¨ö ßµ(5w-¨ö ßµ\18uÞµ\90º\fâ]\8bBÇ]\v\9a5\87w-\8a\1cw-HÖ\1cßµ(3w-\88ö ßµ\18uÞµ\90º\fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bQç]\v©Ë ßµ(5w-¨ö ßµ(5w-¨ö ßµ(5w-¨ö ßµ\18uÞµ\90º\fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bQç]\v©Ë ßµ(5w-¨ö ßµ(5w-¨ö ßµ\18uÞµ\90º\fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bRs×\82j\ fÒ]\8b0s×\ 2b\8fá]\8b\ 2Ç]\v\8a5Çw-ÊÌ]\v¢=Èw-JÍ]\vª=Èw-F\9dw-¤.\83|×¢Ôܵ Ú\83|×¢Ôܵ Ú\83|×bÔy×Bê2Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-F\9dw-¤.\83|×¢Ôܵ Ú\83|×¢Ôܵ Ú\83|×bÔy×Bê2Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-F\9dw-¤.\83|×¢Ôܵ Ú\83x×¢Ðq×\82fÍá]\8b"Ç]\v\925Çw-Æ\9cw-\84.\83|×¢Ôܵ Ú\83|×¢Ôܵ Ú\83|×bÔy×Bê2Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-F\9dw-¤.\83|×¢Ôܵ Ú\83|×¢Ôܵ Ú\83|×bÔy×Bê2Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-JÍ]\vª=Èw-B}½k\ 1u\1dä»\16¥æ®\ 5Õ\1eä»\16¥æ®\ 5Õ\1eä»\16¥æ®\ 5Õ\1eÄ»\16\83æ®\85Ì\9eû\16E\8e»\16$k\8eïZ\94\99»\16D{\90ïZ\8c:ïZH]\ 6ù®E©¹kAµ\aù®E©¹kAµ\aù®E©¹kAµ\aù®Å¨ó®\85Ôe\90ïZ\94\9a»\16T{\90ïZ\94\9a»\16T{\90ïZ\8c:ïZH]\ 6ù®E©¹kAµ\aù®E©¹kAµ\aù®E©¹kAµ\aù®Å¨ó®\85Ôe\90ïZ\94\9a»\16T{\90ïZ\94\9a»\16T{\90ïZ\94\9a»\16T{\90ïZ\8c:ïZH]\ 6ù®E©¹kAµ\añ®E¡ã®\ 5Í\9aû\16Cæ®\85È\9eã»\16eæ®\ 5Ñ\1eä»\16¥æ®\ 5Õ\1eä»\16¥æ®\ 5Õ\1eä»\16£Î»\16R\97A¾kQjîZPíA¾kQjîZPíA¾kQjîZPíA¾k1ê¼k!u\19ä»\16¥æ®\ 5Õ\1eä»\16¥æ®\ 5Õ\1eä»\16¡¾Þµ\80º\ eò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bRs×\82j\ fò]\8bQç]\v©Ë ßµÐå\86¹kÁ\ f2îZÞ|\90Ý»\96ýÏñ\eÿ\90\98\97¼ôéÈw-ã\99\97\ fôË\97Ï¿~ÿåÛïN\8fO\1f¾ÿøãÿ¼¹9ýùË\1f¾¼O~·ÿ§|I\13^çßÿýz¼Ùýscf\8f\v\1foö¸o>Þ~\8fûþ\83@\8f\8bj\ fr\8f«Ôô¸¨ö ÷¸JM\8f\8bj\ fr\8fkÔÙã\92º\fr\8f«Ôô¸¨ö ÷¸JM\8f\8bj\ fr\8f«Ôô¸¨ö ÷¸F\9d=.©Ë ÷¸JM\8f\8bj\ fr\8f«Ôô¸¨ö ÷¸F\9d=.©Ë ÷¸JM\8f\8bj\ fr\8f«Ôô¸¨ö ÷¸JM\8f\8bj\ fR\8f+Ìô¸ ö\18ö¸
+\1c=.\8a5Ç=®2Óã"Ú\83Üã*5=.ª=È=®Qg\8fKê2È=®RÓã¢Ú\83Üã*5=.ª=È=®Qg\8fKê2È=®RÓã¢Ú\83Üã*5=.ª=È=®RÓã¢Ú\83Üã\1auö¸¤.\83Üã*5=.ª=È=®RÓã¢Ú\83Üã\1auö¸¤.\83Üã*5=.ª=È=®RÓã¢Ú\83Üã*5=.ª=È=®Qg\8fKê2È=®RÓã¢Ú\83Øã*tô¸hÖ\1cö¸\8a\1c=.\925Ç=®1g\8fKè2È=®RÓã¢Ú\83Üã*5=.ª=È=®Qg\8fKê2È=®RÓã¢Ú\83Üã*5=.ª=È=®RÓã¢Ú\83Üã\1auö¸¤.\83Üã*5=.ª=È=®RÓã¢Ú\83Üã\1auö¸¤.\83Üã*5=.ª=È=®RÓã¢Ú\83Üã*5=.ª=È=®P_{\P×Aîq\95\9a\1e\17Õ\1eä\1eW©éqQíAîq\95\9a\1e\17Õ\1eÄ\1e× éqÉì9ìq\159z\$k\8e{\e¦ÇE´\a¹Ç5êìqI]\ 6¹ÇUjz\T{\90{\¥¦ÇEµ\a¹ÇUjz\T{\90{\£Î\1e\97Ôe\90{\¥¦ÇEµ\a¹ÇUjz\T{\90{\£Î\1e\97Ôe\90{\¥¦ÇEµ\a¹ÇUjz\T{\90{\¥¦ÇEµ\a¹Ç5êìqI]\ 6¹ÇUjz\T{\90{\¥¦ÇEµ\a¹ÇUjz\T{\90{\£Î\1e\97Ôe\90{\¥¦ÇEµ\a±ÇUèèqѬ9ìq\r\99\1e\97È\9eã\1eW\99éq\11íAîq\95\9a\1e\17Õ\1eä\1eW©éqQíAîq\8d:{\R\97Aîq\95\9a\1e\17Õ\1eä\1eW©éqQíAîq\95\9a\1e\17Õ\1eä\1eר³Ç%u\19ä\1eW©éqQíAîq\95\9a\1e\17Õ\1eä\1eW¨¯=.¨ë ÷¸JM\8f\8bj\ fr\8f«Ôô¸¨ö ÷¸JM\8f\8bj\ fr\8fkÔÙã\92º\fr\8fK}©éqñ\83\8c\1e÷Í\ayØëq÷?Çoü\9eù»ç¯\9f\e{ÜñÌË\aúÝ\7fýÛßÿã9ÇýÛo\8fO\1fþú¿üßÿãïÿð\ f¿ûÇo\1fï?üþÛã\87¿ÿïï\e\8fí\87ÿÝ7o¤õãl¿\9eß<íü­{mMà\93ÎÖäÍ'ÝoMÞ\7f\10hMPíAnM\8c:[\13R\97AnM\94\9aÖ\ 4Õ\1eäÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖĨ³5!u\19äÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖĨ³5!u\19äÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖD©iMPíAnM\8c:[\13R\97AnM\94\9aÖ\ 4Õ\1eÄÖD¡£5A³æ°5QähM\90¬9nM\8c9[\13B\97AnM\94\9aÖ\ 4Õ\1eäÖD©iMPíAnM\8c:[\13R\97AnM\94\9aÖ\ 4Õ\1eäÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖĨ³5!u\19äÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖĨ³5!u\19äÖD©iMPíAnM\94\9aÖ\ 4Õ\1eäÖD©iMPíAnM\84úÚ\9a\80º\ erk¢Ô´&¨ö ·&JMk\82j\ frk¢Ô´&¨ö ¶&\ 6MkBfÏak¢ÈÑ\9a YsÜ\9a(3­      ¢=È­\89QgkBê2È­\89\9a Ú\83Ü\9a(5­       ª=È­\89\9a Ú\83Ü\9a\18u¶&¤.\83Ü\9a(5­       ª=È­\89\9a Ú\83Ü\9a\18u¶&¤.\83Ü\9a(5­       ª=È­\89\9a Ú\83Ü\9a(5­        ª=È­\89QgkBê2È­\89\9a Ú\83Ü\9a(5­       ª=È­\89\9a Ú\83Ü\9a\18u¶&¤.\83Ü\9a(5­       ª=\88­\89BGk\82fÍakbÈ´&Dö\1c·&ÊLk\82h\ frk¢Ô´&¨ö ·&JMk\82j\ frkbÔÙ\9a\90º\frk¢Ô´&¨ö ·&JMk\82j\ frk¢Ô´&¨ö ·&F\9d­   ©Ë ·&JMk\82j\ frk¢Ô´&¨ö ·&B}mM@]\a¹5QjZ\13T{\90[\13¥¦5Aµ\a¹5QjZ\13T{\90[\13£ÎÖ\84Ôe\90[\93ý`µ&øAFkòæ\83ì¶&û\9fã7~÷ÛíÃáùñ\89[\93ñ\f´&ÿø?¾=~ø§ÿ|ñkS^~*½*ëG9\1d\1e·¿¯×:\13ø\94³3yó)÷;\93÷\1f\ 4:\13T{\90;\13£ÎÎ\84Ôe\90;\13¥¦3Aµ\a¹3Qj:\13T{\90;\13¥¦3Aµ\a¹31êìLH]\ 6¹3Qj:\13T{\90;\13¥¦3Aµ\a¹31êìLH]\ 6¹3Qj:\13T{\90;\13¥¦3Aµ\a¹3Qj:\13T{\90;\13£ÎÎ\84Ôe\90;\13¥¦3Aµ\a±3QèèLЬ9ìL\149:\13$k\8e;\13cÎÎ\84Ðe\90;\13¥¦3Aµ\a¹3Qj:\13T{\90;\13£ÎÎ\84Ôe\90;\13¥¦3Aµ\a¹3Qj:\13T{\90;\13¥¦3Aµ\a¹31êìLH]\ 6¹3Qj:\13T{\90;\13¥¦3Aµ\a¹31êìLH]\ 6¹3Qj:\13T{\90;\13¥¦3Aµ\a¹3Qj:\13T{\90;\13¡¾v& ®\83Ü\99(5\9d    ª=È\9d\89\99 Ú\83Ü\99(5\9d        ª=\88\9d\89\99\90ÙsØ\99(rt&HÖ\1cw&ÊLg\82h\ frgbÔÙ\99\90º\frg¢Ôt&¨ö w&JMg\82j\ frg¢Ôt&¨ö w&F\9d\9d    ©Ë w&JMg\82j\ frg¢Ôt&¨ö w&F\9d\9d       ©Ë w&JMg\82j\ frg¢Ôt&¨ö w&JMg\82j\ frgbÔÙ\99\90º\frg¢Ôt&¨ö w&JMg\82j\ frg¢Ôt&¨ö w&F\9d\9d    ©Ë w&JMg\82j\ fbg¢ÐÑ\99 YsØ\99\182\9d       \91\9d\89\99 Ú\83Ü\99(5\9d        ª=È\9d\89\99 Ú\83Ü\99\18uv&¤.\83Ü\99(5\9d       ª=È\9d\89\99 Ú\83Ü\99(5\9d        ª=È\9d\89QggBê2È\9d\89\99 Ú\83Ü\99(5\9d       ª=È\9d\89P_;\13P×AîL\94\9aÎ\ 4Õ\1eäÎD©éLPíAîL\94\9aÎ\ 4Õ\1eäÎĨ³3!u\19äÎd?\98p\9d   ~\90Ñ\99¼ù \8f{\9dÉþçøîöñqû¬Oü\9d&w·ã·ºÓÝáfûiu±3\19\ få\99\97\ ft<Ü\1dÎ\99É?þðã(MÎÿýß}þáß>}>ÿ×\7fýùûo\9f>üé\87/\9f¾ÿòëçOïÿ觻ÃÝË\7f\8a¿ÿ\9a\93ûí\9fuwþ\ 4ÂùgPÁ\87\9f\7f\ 6Õ\9b\ f¿ÿgP½ÿ ðgP¡Ú\83ôgP     3\7f\ 6\15\88=\86\7f\ 6\95\ 2Ç\9fA\85bÍñ\9fA¥Ìü\19T\88ö ÿ\19TJÍ\9fA\85j\ fò\9fAeÔùgP\91º\fò\9fA¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯eÔÙk\91º\fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZF\9d½\16©Ë ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZF\9d½\16©Ë ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯eÔÙk\91º\fr¯¥ÔôZ¨ö öZ
+\1d½\16\9a5\87½\96"G¯\85dÍq¯eÌÙk\11º\fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯eÔÙk\91º\fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZF\9d½\16©Ë ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZF\9d½\16©Ë ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯%Ô×^\vÔu\90{-¥¦×Bµ\a¹×Rjz-T{\90{-¥¦×Bµ\a±×2hz-2{\ e{-E\8e^\vÉ\9aã^K\99éµ\10íAîµ\8c:{-R\97Aîµ\94\9a^\vÕ\1eä^K©éµPíAîµ\94\9a^\vÕ\1eä^˨³×"u\19ä^K©éµPíAîµ\94\9a^\vÕ\1eä^˨³×"u\19ä^K©éµPíAîµ\94\9a^\vÕ\1eä^K©éµPíAîµ\8c:{-R\97Aîµ\94\9a^\vÕ\1eä^K©éµPíAîµ\94ú|ýÍÞ:Ƚ\96Qg¯Eê2Ƚ\96RÓk¡Ú\83Øk)tôZhÖ\1cöZ\86L¯EdÏq¯¥ÌôZ\88ö ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZF\9d½\16©Ë ÷ZJM¯\85j\ fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯eÔÙk\91º\fr¯¥ÔôZ¨ö ÷ZJM¯\85j\ fr¯%Ô×^\vÔu\90{-¥¦×Bµ\a¹×Rjz-T{\90{-¥¦×Bµ\a¹×2êìµH]\ 6¹×Ú/\8c\85\1fdôZo>Èn¯µÿ9\96^ëx¥×:\1e¿þ3\ föZã\99s¯u\7fxßgýç\1f~ùòÓçÿ8ÿ7\1f\7füãË\7fñøáw\7fùùÏ\9fþòéÇ/\1f¿üðÓ\8fçÿáï~ùå×O¿\z?öò\1fϼ~\98÷\7fw\1f\8e\1e\947fð\97\927foþJöß\98½ÿ\14ðÆ\8cÐe\90ß\98)5oÌPíA~c¦Ô¼1Cµ\aù\8d\99\e3R\97A~c¦Ô¼1Cµ\aù\8d\99RóÆ\fÕ\1eä7fJÍ\e3T{\90ß\98\19u¾1#u\19ä7fJÍ\e3T{\90ß\98)5oÌPíA~cfÔùÆ\8cÔe\90ß\98)5oÌPíA~c¦Ô¼1Cµ\aù\8d\99RóÆ\fÕ\1eä7fB}}c\ 6ê:ÈoÌ\94\9a7f¨ö ¿1SjÞ\98¡Ú\83üÆL©yc\86j\ fâ\e3\83æ\8d\19\99=\87\14\98!YsüÆL\99yc\86h\ fò\e3£Î7f¤.\83üÆL©yc\86j\ fò\e3¥æ\8d\19ª=ÈoÌ\94\9a7f¨ö ¿13ê|cFê2ÈoÌ\94\9a7f¨ö ¿1SjÞ\98¡Ú\83üÆ̨ó\8d\19©Ë ¿1SjÞ\98¡Ú\83üÆL©yc\86j\ fò\e3¥æ\8d\19ª=ÈoÌ\8c\98\91º\fò\e3¥æ\8d\19ª=ÈoÌ\94\9a7f¨ö ¿1Sêóõÿle\1dä7fF\9doÌH]\ 6ù\8d\99RóÆ\fÕ\1eÄ7f
+\1doÌЬ9|cfȼ1#²çø\8d\992óÆ\fÑ\1eä7fJÍ\e3T{\90ß\98)5oÌPíA~cfÔùÆ\8cÔe\90ß\98)5oÌPíA~c¦Ô¼1Cµ\aù\8d\99RóÆ\fÕ\1eä7fF\9doÌH]\ 6ù\8d\99RóÆ\fÕ\1eä7fJÍ\e3T{\90ß\98        õõ\8d\19¨ë ¿1SjÞ\98¡Ú\83üÆL©yc\86j\ fò\e3zÏAo\91n\ e§»+¿Xä¡zis³÷\1aiÿ\83ü¶³ÿ\97\7f\81\1d·_Ýè5R\9e9¿Fz\10gÿ¿ûñË·Ç\ f\9f>ÿøñÏï^\19\9d\1e·_ î¿y\ 3\13\ f°sòÿ´ý"ôò>\92>x\1ezûÁß\9füo?¨\9f\9fn/}\90\vêùÙ+j\ fî¨\8f_ÿ<\r§\9e\9f½¢öàÎ×\el¿á\9c¤:\9eeu\19ÜQo\ f§g«\9e\9f½¢öà\8ezþ¾\a§\8e/\90\añ\v$\9c:¾@\82Õ\1e\84/\900æø\ 2       \12{\8c¾@Â\81ç/\90`±æð\v$\9c9¾@\82Ñ\1eÄ/\90pêø\ 2  V{\10¿@B©ù\ 2       T\97\ 2   §\8e/\90\añ\v$\9c:¾@\82Õ\1eÄ/\90Pj¾@\ 2Õe\10¿@©ã\v$XíAü\ 2        §\8e/\90\añ\v$\9c:¾@\82Õ\1eÄ/\90Pj¾@\ 2Õe\10¿@©ã\v$XíAü\ 2        §\8e/\90\añ\v$\94\9a/\90@u\19Ä/\90pêø\ 2        V{\10¿@©ã\v$XíAü\ 2 §\8e/\90\añ\v$\94\9a/\90@u\19Ä/\90pêø\ 2        V{\90¾@¡ç/\90`³æè\v$\1cyÎá\98¬9Ìá\94\99\1c\ eÑe\10s8§\8e\1c\8eÕ\1eÄ\1cΩ#\87\a1\87Sjr8T\97AÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cΩ#\87\a1\87Sjr8T\97AÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cN©ÉáP]\ 61\87sêÈáXíAÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cΨ3\87#u\1dÄ\1cΩ#\87\a1\87sêÈáXíAÌá\9c:r8V{\90r8\85\8e\1c\ eÍ\9e£\1cÎ\91ç\1c\8eÉ\9aÃ\1cÎ\99#\87\a1\87Sjr8T\97AÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cΩ#\87\a1\87Sjr8T\97AÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cN©ÉáP]\ 61\87sêÈáXíAÌá\9c:r8V{\10s8§\8e\1c\8eÕ\1eÄ\1cN©ÉáP]\ 61\87sêÈáXíAÌá\9c:r8V{\10s8§>_\7f\ eb\ e§Ôäp¨.\83\98Ã9uäp¬ö åp\ e=çplÖ\1cåp\8a\1c9\1c\92=\879\9c3G\ eÇh\ fb\ eçÔ\91ñÚ\83\98Ã9uäp¬ö æpJM\ e\87ê2\889\9cSG\ eÇj\ fb\ eçÔ\91ñÚ\83\98Ã9uäp¬ö æpJM\ e\87ê2\889\9cSG\ eÇj\ fb\ eçÔ\91ñÚ\83\98Ã\19uæp¤®\83\98Ã9uäp¬ö æpN\1d9\1c«=\889\1c4\*\87Ã\ f2\1eªøì¸\93ÃÁ\aùîöå·±»+ߪ°ý»ìí×ÿpèéþp|<]ÎáÆCy&9Üq\ 4q\7fóñ\97\1f¾\7fßÂýÝÇ\97\16îãù¿ù§/\9f\7fýú'á¼ÿ&\85Û\9bÃñå?2xý\ 4ïÿ(\9cç»\87½ïR\98/µá¯`¾Ô~óW°ÿRûý\a\81\97Ú¨ö ¿ÔVj^j£Ú\83üRÛ¨ó¥6©Ë ¿ÔVj^j£Ú\83üR[©y©\8dj\ fòKm¥æ¥6ª=È/µ\8d:_j\93º\fòKm¥æ¥6ª=\88\15:^j£YsøR[\91ã¥6\925Ç/µ\8d9_j\13º\fòKm¥æ¥6ª=È/µ\95\9a\97Ú¨ö ¿Ô6ê|©Mê2È/µ\95\9a\97Ú¨ö ¿ÔVj^j£Ú\83üR[©y©\8dj\ fòKm£Î\97Ú¤.\83üR[©y©\8dj\ fòKm¥æ¥6ª=È/µ\8d:_j\93º\fòKm¥æ¥6ª=È/µ\95\9a\97Ú¨ö ¿ÔVj^j£Ú\83üR[¨¯/µA]\aù¥¶RóR\eÕ\1eä\97ÚJÍKmT{\90_j+5/µQíA|©mмÔ&³çð¥¶"ÇKm$k\8e_j+3/µ\11íA~©mÔùR\9bÔe\90_j+5/µQíA~©­Ô¼ÔFµ\aù¥¶RóR\eÕ\1eä\97ÚF\9d/µI]\ 6ù¥¶RóR\eÕ\1eä\97ÚJÍKmT{\90_j\eu¾Ô&u\19ä\97ÚJÍKmT{\90_j+5/µQíA~©­Ô¼ÔFµ\aù¥¶QçKmR\97A~©­Ô¼ÔFµ\aù¥¶RóR\eÕ\1eä\97ÚJÍKmT{\90_j\eu¾Ô&u\19ä\97ÚJÍKmT{\10_j+t¼ÔF³æð¥¶!óR\9bÈ\9eã\97ÚÊÌKmD{\90_j+5/µQíA~©­Ô¼ÔFµ\aù¥¶QçKmR\97A~©­Ô¼ÔFµ\aù¥¶RóR\eÕ\1eä\97ÚJÍKmT{\90_j\eu¾Ô&u\19ä\97ÚJÍKmT{\90_j+5/µQíA~©-Ô×\97Ú ®\83üR[©y©\8dj\ fòKm¥æ¥6ª=È/µ÷_Àº\97ÚôAòRûí+äÓÞKíý\ fòÝËÛâ\9b\97¯W \97ÚÏÇÃéë\97\96<\9e¾¾FºøR{<\94g^>Ñ/__R\9f_X\7fÿñÇ?}üüÇ\7f\7fù¦\97\8f\9f?ýáËů\16yù:\85WäÂ÷¹Üï~\9fËüÞ\ fø\90ó{?Þ|ÈýïýxÿAà{?PíAþÞ\ f¥æ{?PíAúÞ\ faæ{?@ì1üÞ\ f\ 5\8eïý@±æø{?\94\99ïý@´\aù{?\94\9aïý@µ\aù{?\8c:¿÷\83Ôe\90¿÷C©ùÞ\ fT{\90¿÷C©ùÞ\ fT{\90¿÷èó{?H]\ 6ù{?\94\9aïý@µ\aù{?\94\9aïý@µ\aù{?\94\9aïý@µ\aù{?\8c:\13)R\97AN¤\94\9aD
\1eäDJ©I¤PíAN¤\8c:\13)R\97AN¤\94\9aD
\1eäDJ©I¤PíAN¤\94\9aD
\1eäDʨ3\91"u\19äDJ©I¤PíAL¤\14:\12)4k\ e\13)E\8eD
\9aãDÊ\983\91"t\19äDJ©I¤PíAN¤\94\9aD
\1eäDʨ3\91"u\19äDJ©I¤PíAN¤\94\9aD
\1eäDJ©I¤PíAN¤\8c:\13)R\97AN¤\94\9aD
\1eäDJ©I¤PíAN¤\8c:\13)R\97AN¤\94\9aD
\1eäDJ©I¤PíAN¤\94\9aD
\1eäDJ¨¯\89\14¨ë 'RJM"\85j\ fr"¥Ô$R¨ö 'RJM"\85j\ fb"eÐ$Rdö\1c&R\8a\1c\89\14\92\89\942\93H!Ú\83\9cH\19u&R¤.\83\9cH)5\89\14ª=È\89\94R\93H¡Ú\83\9cH)5\89\14ª=È\89\94Qg"Eê2È\89\94R\93H¡Ú\83\9cH)5\89\14ª=È\89\94Qg"Eê2È\89\94R\93H¡Ú\83\9cH)5\89\14ª=È\89\94R\93H¡Ú\83\9cH\19u&R¤.\83\9cH)5\89\14ª=È\89\94R\93H¡Ú\83\9cH)5\89\14ª=È\89\94Qg"Eê2È\89\94R\93H¡Ú\83\98H)t$RhÖ\1c&R\86L"EdÏq"¥Ì$R\88ö 'RJM"\85j\ fr"¥Ô$R¨ö 'RF\9d\89\14©Ë 'RJM"\85j\ fr"¥Ô$R¨ö 'RJM"\85j\ fr"eÔ\99H\91º\fr"¥Ô$R¨ö 'RJM"\85j\ fr"%Ô×D
+Ôu\90\13)¥&\91\a9\91Rj\12)T{\90\13©ýÖÇ%RôA\92H½ù û\89Ôþ\aY\12©Ó\95DjûuæôðÌ\89ÔxæB"õÇOÿöÃ÷\97â¨Ç»óOü×ù÷_êñtÚûR\8fÓöoS\ f_ÿõ\ 2\1f/\ f½ýx\87\8b\7fèÖÝÝ¥\ frA=?{EíÁ\9d?ìjü9\F\9d\7f°\17©Ë ÿÁ^JÍ\1fì\85j\ fÂ\1fìeÕó³WÔ\1eä?Ø˨ó\ fö"u\19ä?ØK©        üPíA\ eü\94\9aÀ\ fÕ\1eäÀO©        üPíA
\84\99À\ fÄ\1eÃÀO\81#ðC±æ8ðSf\ 2?D{\90\ 3?¥&ðCµ\a9ð3ê\füH]\ 69ðSj\ 2?T{\90\ 3?¥&ðCµ\a9ð3ê\füH]\ 69ðSj\ 2?T{\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?£ÎÀ\8fÔe\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?£ÎÀ\8fÔe\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?¥&ðCµ\a9ð3ê\füH]\ 69ðSj\ 2?T{\10\ 3?\85\8eÀ\ fÍ\9aÃÀO\91#ðC²æ8ð3æ\fü\b]\ 69ðSj\ 2?T{\90\ 3?¥&ðCµ\a9ð3ê\füH]\ 69ðSj\ 2?T{\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?£ÎÀ\8fÔe\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?£ÎÀ\8fÔe\90\ 3?¥&ðCµ\a9ðSj\ 2?T{\90\ 3?¥&ðCµ\a\13êkà\aê:È\81\9fR\13ø¡Ú\83\1cø)5\81\1fª=È\81\9fR\13ø¡Ú\83\18ø\194\81\1f\99=\87\81\9f"Gà\87dÍqà§Ì\ 4~\88ö \a~F\9d\81\1f©Ë \a~JMà\87j\ frà§Ô\ 4~¨ö \a~JMà\87j\ fràgÔ\19ø\91º\frà§Ô\ 4~¨ö \a~JMà\87j\ fràgÔ\19ø\91º\frà§Ô\ 4~¨ö \a~JMà\87j\ frà§Ô\ 4~¨ö \a~F\9d\81\1f©Ë \a~JMà\87j\ frà§Ô\ 4~¨ö \a~JMà\87j\ fràgÔ\19ø\91º\frà§Ô\ 4~¨ö \ 6~
+\1d\81\1f\9a5\87\81\9f!\13ø\11Ùs\1cø)3\81\1f¢=È\81\9fR\13ø¡Ú\83\1cø)5\81\1fª=È\81\9fQgàGê2È\81\9fR\13ø¡Ú\83\1cø)5\81\1fª=È\81\9fR\13ø¡Ú\83\1cø\19u\ 6~¤.\83\1cø)5\81\1fª=È\81\9fR\13ø¡Ú\83\1cø õ5ð\ 3u\1däÀO©      üPíA\ eü\94\9aÀ\ fÕ\1eäÀo¿Ws\81\1f}\90\ 4~o>È~à·ÿA~ãw Ý=l\7feO\1cø\8dg.\ 4\7fûøáO?ü|¡ðÛ~u¸¿\7fýß½øwìæn÷ëÏ^þ׿þ \80Ï\97\87Þ~¾÷\9dÒÃö{øÃÃ¥\ frA=?{EíÁ\9d®pû=üåÿn\8d:\9eeu\19ÜQ·ßÃo¬z~ö\8aÚ\83\b-\95\9ar\13Õ\1eärS©)7QíA.7\8d:ËMR\97A.7\95\9ar\13Õ\1eärS©)7QíA.7\8d:ËMR\97A.7\95\9ar\13Õ\1eärS©)7QíA.7\95\9ar\13Õ\1e¤rS\98)7Aì1,7\158ÊM\14k\8eËMe¦ÜD´\a¹ÜTjÊMT{\90ËM£Îr\93Ôe\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM£Îr\93Ôe\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹Ü4ê,7I]\ 6¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹Ü4ê,7I]\ 6¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM£Îr\93Ôe\90ËM¥¦ÜDµ\a±ÜTè(7Ѭ9,7\159ÊM$k\8eËMcÎr\93Ðe\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM£Îr\93Ôe\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹Ü4ê,7I]\ 6¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹Ü4ê,7I]\ 6¹ÜTjÊMT{\90ËM¥¦ÜDµ\a¹ÜTjÊMT{\90ËM¡¾\96\9b ®\83\n*5å&ª=Èå¦RSn¢Ú\83\n*5å&ª=\88å¦ASn\92ÙsXn*r\94\9b\1c\97\9bÊL¹\89h\ fr¹iÔYn\92º\fr¹©Ô\94\9b¨ö \97\9bJM¹\89j\ fr¹©Ô\94\9b¨ö \97\9bF\9då&©Ë \97\9bJM¹\89j\ fr¹©Ô\94\9b¨ö \97\9bF\9då&©Ë \97\9bJM¹\89j\ fr¹©Ô\94\9b¨ö \97\9bJM¹\89j\ fr¹iÔYn\92º\fr¹©Ô\94\9b¨ö \97\9bJM¹\89j\ fr¹©Ô\94\9b¨ö \97\9bF\9då&©Ë \97\9bJM¹\89j\ fb¹©ÐQn¢YsXn\1a2å&\91=Çå¦2Sn"Ú\83\n*5å&ª=Èå¦RSn¢Ú\83\n\1au\96\9b¤.\83\n*5å&ª=Èå¦RSn¢Ú\83\n*5å&ª=Èå¦Qg¹Iê2Èå¦RSn¢Ú\83\n*5å&ª=Èå¦P_ËMP×A.7\95\9ar\13Õ\1eärS©)7QíA.7©C4å&}\90\94\9bo>Èñv¯ÜÜÿ ¿ñ«\19oo¿v\88Xn\8egÖró/¿üëOÿü¿.U\9b§ÃÝË\vì×í÷\7f·n·¿\8a½jsû§\84Ó#\7f¶<ôö³\1d.æ£/?)Þ\7f\10hEQíAnE\95\9aV\14Õ\1eäVÔ¨³\15%u\19äVT©iEQíAnE\95\9aV\14Õ\1eäVT©iEQíAnE\8d:[QR\97AnE\95\9aV\14Õ\1eäVT©iEQíAnE\8d:[QR\97AnE\95\9aV\14Õ\1eäVT©iEQíAnE\95\9aV\14Õ\1e¤VT\98iEAì1lE\158ZQ\14k\8e[Qe¦\15\a¹\15UjZQT{\90[Q£ÎV\94Ôe\90[Q¥¦\15\a¹\15UjZQT{\90[Q£ÎV\94Ôe\90[Q¥¦\15\a¹\15UjZQT{\90[Q¥¦\15\a¹\155êlEI]\ 6¹\15UjZQT{\90[Q¥¦\15\a¹\155êlEI]\ 6¹\15UjZQT{\90[Q¥¦\15\a¹\15UjZQT{\90[Q£ÎV\94Ôe\90[Q¥¦\15\a±\15UèhEѬ9lE\159ZQ$k\8e[QcÎV\94Ðe\90[Q¥¦\15\a¹\15UjZQT{\90[Q£ÎV\94Ôe\90[Q¥¦\15\a¹\15UjZQT{\90[Q¥¦\15\a¹\155êlEI]\ 6¹\15UjZQT{\90[Q¥¦\15\a¹\155êlEI]\ 6¹\15UjZQT{\90[Q¥¦\15\a¹\15UjZQT{\90[Q¡¾¶¢ ®\83Ü\8a*5­(ª=È­¨RÓ\8a¢Ú\83Ü\8a*5­(ª=\88­¨AÓ\8a\92ÙsØ\8a*r´¢HÖ\1c·¢ÊL+\8ah\ fr+jÔÙ\8a\92º\fr+ªÔ´¢¨ö ·¢JM+\8aj\ fr+ªÔ´¢¨ö ·¢F\9d­(©Ë ·¢JM+\8aj\ fr+ªÔ´¢¨ö ·¢F\9d­(©Ë ·¢JM+\8aj\ fr+ªÔ´¢¨ö ·¢JM+\8aj\ fr+jÔÙ\8a\92º\fr+ªÔ´¢¨ö ·¢JM+\8aj\ fr+ªÔ´¢¨ö ·¢F\9d­(©Ë ·¢JM+\8aj\ fb+ªÐÑ\8a¢YsØ\8a\1a2­(\91=Ç­¨2Ó\8a\83Ü\8a*5­(ª=È­¨RÓ\8a¢Ú\83Ü\8a\1au¶¢¤.\83Ü\8a*5­(ª=È­¨RÓ\8a¢Ú\83Ü\8a*5­(ª=È­¨Qg+Jê2È­¨RÓ\8a¢Ú\83Ü\8a*5­(ª=È­¨P_[QP×AnE\95\9aV\14Õ\1eäVT©iEQíAnE©~4­(}\90´¢o>Èñ~¯\15Ýÿ ¿ñ[>·\7f\84¾;Þs+:\9e¹ð-\9f¿þòéó¥Xôáðò\ fR¯Ûë\a8mÿúÚý3¼g? \9f\93o>Û~?ùþ\83@?Iê2Èý¤RÓO¢Ú\83ÜO*5ý$ª=Èý¤RÓO¢Ú\83ÜO\1a\93¤.\83ÜO*5ý$ª=Èý¤RÓO¢Ú\83ÜO\1a\93¤.\83ÜO*5ý$ª=Èý¤RÓO¢Ú\83ÜO*5ý$ª=Hý¤0ÓO\82ØcØO*pô\93\1c÷\93ÊL?\89h\ fr?©Ôô\93¨ö ÷\93F\9dý$©Ë ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93F\9dý$©Ë ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?iÔÙO\92º\fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?iÔÙO\92º\fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93F\9dý$©Ë ÷\93JM?\89j\ fb?©ÐÑO¢YsØO*rô\93\1c÷\93Æ\9cý$¡Ë ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93F\9dý$©Ë ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?iÔÙO\92º\fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?iÔÙO\92º\fr?©Ôô\93¨ö ÷\93JM?\89j\ fr?©Ôô\93¨ö ÷\93B}í'A]\a¹\9fTjúIT{\90ûI¥¦\9f\a¹\9fTjúIT{\10ûI\83¦\9f$³ç°\9fTäè'\91¬9î'\95\99~\12Ñ\1eä~Ò¨³\9f$u\19ä~R©é'QíAî'\95\9a~\12Õ\1eä~R©é'QíAî'\8d:ûIR\97Aî'\95\9a~\12Õ\1eä~R©é'QíAî'\8d:ûIR\97Aî'\95\9a~\12Õ\1eä~R©é'QíAî'\95\9a~\12Õ\1eä~Ò¨³\9f$u\19ä~R©é'QíAî'\95\9a~\12Õ\1eä~R©é'QíAî'\8d:ûIR\97Aî'\95\9a~\12Õ\1eÄ~R¡£\9fD³æ°\9f4dúI"{\8eûIe¦\9f\a¹\9fTjúIT{\90ûI¥¦\9f\a¹\9f4êì'I]\ 6¹\9fTjúIT{\90ûI¥¦\9f\a¹\9fTjúIT{\90ûI£Î~\92Ôe\90ûI¥¦\9f\a¹\9fTjúIT{\90ûI¡¾ö\93 ®\83ÜO*5ý$ª=Èý¤RÓO¢Ú\83ÜOî\17\81®\9f¤\ f\92~òÍ\a9>ìõ\93û\1fä7~×æÍãö/ë[î'Ç3k?ù§\7fÿåçOßÿôó/\17
+ÊÇçÃÍËïf¯ó\17¾nó~÷ë6gj\a\1fo¦vo>Þ~j÷þ\83@jGê2È©\9dR\93Ú¡Ú\83\9cÚ)5©\1dª=È©\9dQgjGê2È©\9dR\93Ú¡Ú\83\9cÚ)5©\1dª=È©\9dR\93Ú¡Ú\83\94Ú   3©\1d\88=\86©\9d\ 2Gj\87bÍqj§Ì¤v\88ö §vJMj\87j\ frjgÔ\99Ú\91º\frj§Ô¤v¨ö §vJMj\87j\ frjgÔ\99Ú\91º\frj§Ô¤v¨ö §vJMj\87j\ frj§Ô¤v¨ö §vF\9d©\1d©Ë §vJMj\87j\ frj§Ô¤v¨ö §vF\9d©\1d©Ë §vJMj\87j\ frj§Ô¤v¨ö §vJMj\87j\ frjgÔ\99Ú\91º\frj§Ô¤v¨ö ¦v
+\1d©\1d\9a5\87©\9d"Gj\87dÍqjgÌ\99Ú\11º\frj§Ô¤v¨ö §vJMj\87j\ frjgÔ\99Ú\91º\frj§Ô¤v¨ö §vJMj\87j\ frj§Ô¤v¨ö §vF\9d©\1d©Ë §vJMj\87j\ frj§Ô¤v¨ö §vF\9d©\1d©Ë §vJMj\87j\ frj§Ô¤v¨ö §vJMj\87j\ frj'Ô×Ô\ eÔu\90S;¥&µCµ\a9µSjR;T{\90S;¥&µCµ\a1µ3hR;2{\ eS;E\8eÔ\ eÉ\9aãÔN\99\10íANí\8c:S;R\97ANí\94\9aÔ\ eÕ\1eäÔN©IíPíANí\94\9aÔ\ eÕ\1eäÔΨ3µ#u\19äÔN©IíPíANí\94\9aÔ\ eÕ\1eäÔΨ3µ#u\19äÔN©IíPíANí\94\9aÔ\ eÕ\1eäÔN©IíPíANí\8c:S;R\97ANí\94\9aÔ\ eÕ\1eäÔN©IíPíANí\94\9aÔ\ eÕ\1eäÔΨ3µ#u\19äÔN©IíPíALí\14:R;4k\ eS;C&µ#²ç8µSfR;D{\90S;¥&µCµ\a9µSjR;T{\90S;£ÎÔ\8eÔe\90S;¥&µCµ\a9µSjR;T{\90S;¥&µCµ\a9µ3êLíH]\ 69µSjR;T{\90S;¥&µCµ\a\13êkj\aê:È©\9dR\93Ú¡Ú\83\9cÚ)5©\1dª=È©\1d\95c&µ£\ f\92ÔîÍ\a9>î¥vû\1fä·}Uáíóö\ f\13¦vyæÝW\15~ûøáO?ü¼ßÛm?
+ïïOß¼1Þÿ]ÛþYo¯·K\83F\9f1\ f½ý\8c»\rÚ\85\ f²ß ±Ú\83Ø )5\r\1aªË 6hN\1d\r\1a«=\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Р\19s4h$ö\185h\ e<7h,Ö\1c6hÎ\1c\r\1a£=\88\r\9aSG\83Æj\ fb\83¦Ô4h¨.\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fR\83æÐs\83ÆfÍQ\83æÈs\83ÆdÍa\83¦Ì4h\88.\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hF\9d\r\1a©ë 6hN\1d\r\1a«=\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ô )t4hhö\1c5h\8e<7hLÖ\1c6hÎ\1c\r\1a£=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aRÓ ¡º\fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ø 9u4h¬ö 6hJM\83\86ê2\88\r\9aSG\83Æj\ fR\83æÐs\83ÆfÍQ\83¦ÈÑ !ÙsØ 9s4h\8cö 6hN\1d\r\1a«=\88\r\9aSG\83Æj\ fb\83¦Ô4h¨.\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aSG\83Æj\ fb\83¦Ô4h¨.\83Ø 9u4h¬ö 6hN\1d\r\1a«=\88\r\9aQg\83Fê:\88\r\9aSG\83Æj\ fb\83æÔÑ ±Ú\83Ø aM%\1a4ü ã¡·\1fäø´Ó Á\aùîöå·±\97\1fÉÔ mÿ.{ûõ?\1cÚ~HÞ?\1c/7hã¡<óõ\13\1d\7f\f=\9c\e´¿ùéãç?\9eÿË\7fúõç\9f\7fú<Ú´\7føõÇï¿=~øòÃO?þò¾\828\1e\9dà\95]?Ûö\vìóÓÎßÈ×\ 6\ 4>öl@Þ|ìý\ 6äý\a\81\ 6\ 4Õ\1eä\ 6D©i@PíAn@\8c:\e\10R\97An@\94\9a\ 6\ 4Õ\1eä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6Ĩ³\ 1!u\19ä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6Ĩ³\ 1!u\19ä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6D©i@PíAn@\8c:\e\10R\97An@\94\9a\ 6\ 4Õ\1eÄ\ 6D¡£\ 1A³æ°\ 1Qäh@\90¬9n@\8c9\e\10B\97An@\94\9a\ 6\ 4Õ\1eä\ 6D©i@PíAn@\8c:\e\10R\97An@\94\9a\ 6\ 4Õ\1eä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6Ĩ³\ 1!u\19ä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6Ĩ³\ 1!u\19ä\ 6D©i@PíAn@\94\9a\ 6\ 4Õ\1eä\ 6D©i@PíAn@\84úÚ\80\80º\ er\ 3¢Ô4 ¨ö 7 JM\ 3\82j\ fr\ 3¢Ô4 ¨ö 6 \ 6M\ 3BfÏa\ 3¢ÈÑ\80 YsÜ\80(3\r\b¢=È\r\88Qg\ 3Bê2È\r\88\80 Ú\83Ü\80(5\r\bª=È\r\88\80 Ú\83Ü\80\18u6 ¤.\83Ü\80(5\r\bª=È\r\88\80 Ú\83Ü\80\18u6 ¤.\83Ü\80(5\r\bª=È\r\88\80 Ú\83Ü\80(5\r\bª=È\r\88Qg\ 3Bê2È\r\88\80 Ú\83Ü\80(5\r\bª=È\r\88\80 Ú\83Ü\80\18u6 ¤.\83Ü\80(5\r\bª=\88\r\88BG\ 3\82fÍa\ 3bÈ4 Dö\1c7 ÊL\ 3\82h\ fr\ 3¢Ô4 ¨ö 7 JM\ 3\82j\ fr\ 3bÔÙ\80\90º\fr\ 3¢Ô4 ¨ö 7 JM\ 3\82j\ fr\ 3¢Ô4 ¨ö 7 F\9d\r\b©Ë 7 JM\ 3\82j\ fr\ 3¢Ô4 ¨ö 7 B}m@@]\a¹\ 1Qj\1a\10T{\90\e\10¥¦\ 1\a¹\ 1ÙO\17\\ 3B\1f$\rÈÛâây¯\ 1Ùÿ ¿í\8fü{ù\8fÿ\1f\7f\eÂï!\1aϼ|¢/\9fþòó\9f?~ùô\87Ï\9fþ¿_?ýòå\ f?ütéë\87¾~\99Ëëôû¿YÇý?îo~ý\10|´ùõCo>Úþ×\ f½ÿ ðõC¨ö \7fý\90Qç×\ f\91º\fò×\ f)5_?\84j\ fò×\ f)5_?\84j\ fò×\ f)5_?\84j\ fÒ×\ f      3_?\ 4b\8fá×\ f)p|ý\10\8a5Ç_?¤Ì|ý\10¢=È_?¤Ô|ý\10ª=È_?dÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö ¦g
+\1dé\19\9a5\87é\99"Gz\86dÍqzfÌ\99\9e\11º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frz&Ô×ô\fÔu\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a1=3hÒ32{\ eÓ3E\8eô\fÉ\9aãôL\99\10íANÏ\8c:Ó3R\97ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂3=#u\19äôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂3=#u\19äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8c:Ó3R\97ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂3=#u\19äôL©IÏPíALÏ\14:Ò34k\ eÓ3C&=#²ç8=SfÒ3D{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£Îô\8cÔe\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êLÏH]\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=\13êkz\ 6ê:Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\19ÕT&=£\ f\92ôìÍ\aÙOÏö?Èoü#ðî·_\8e·\7f\98Åôl<³¤g\7fþôñ\97O\17Ó³Í}zúæÍôû¯\18z~¾¿\9a\9eÁG\9béÙ\9b\8f\9f\9e½ÿ \90\9e¡Ú\83\9c\9e\19u¦g¤.\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Hé\990\93\9e\81Øc\98\9e)p¤g(Ö\1c§gÊLz\86h\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ fbz¦Ð\91\9e¡Ys\98\9e)r¤gHÖ\1c§gÆ\9cé\19¡Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gB}MÏ@]\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\10Ó3\83&=#³ç0=SäHÏ\90¬9NÏ\94\99ô\fÑ\1eäǫ̂3=#u\19äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8c:Ó3R\97ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8c:Ó3R\97ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂3=#u\19äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8c:Ó3R\97ANÏ\94\9aô\fÕ\1eÄôL¡#=C³æ0=3dÒ3"{\8eÓ3e&=C´\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êLÏH]\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£Îô\8cÔe\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¡¾¦g ®\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9eí×T.=£\ f\92ôìÍ\a9Ýì¥gû\1fä7~ëÙö+ùãö\8f\1f\98\9e\8dg\96ôì\97O_ÞEA\ f7\87ãË¿p^WWzû\1fl¿)îTgÛo9O§GþTyèí§z_'m¿¹Ü¿ü\8cxÿA.¨çg¯¨=¸£n¿ó?Xõüì\15µ\a\8fÛïü/?#\8c:\9eeu\19ÜQ·ßùo¬z~ö\8aÚ\83;êö;ÿã\9dTÏÏ^Q{pGÝ~翳êùÙ+j\ fî\94\93ÛïüÇ[§\8egY]\ 6\11u*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89*5\95(ª=H\95¨0S\89\82ØcX\89*pT¢(Ö\1cW¢ÊL%\8ah\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fb%ªÐQ\89¢YsX\89*rT¢HÖ\1cW¢Æ\9c\95(¡Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%ªÔT¢¨ö W¢B}­DA]\a¹\12Uj*QT{\90+Q¥¦\12\a¹\12Uj*QT{\10+Q\83¦\12%³ç°\12Uä¨D\91¬9®D\95\99J\14Ñ\1eäJÔ¨³\12%u\19äJT©©DQíA®D\95\9aJ\14Õ\1eäJT©©DQíA®D\8d:+QR\97A®D\95\9aJ\14Õ\1eäJT©©DQíA®D\8d:+QR\97A®D\95\9aJ\14Õ\1eäJT©©DQíA®D\95\9aJ\14Õ\1eäJÔ¨³\12%u\19äJT©©DQíA®D\95\9aJ\14Õ\1eäJT©©DQíA®D\8d:+QR\97A®D\95\9aJ\14Õ\1eÄJT¡£\12E³æ°\125d*Q"{\8e+Qe¦\12\a¹\12Uj*QT{\90+Q¥¦\12\a¹\125ê¬DI]\ 6¹\12Uj*QT{\90+Q¥¦\12\a¹\12Uj*QT{\90+Q£ÎJ\94Ôe\90+Q¥¦\12\a¹\12Uj*QT{\90+Q¡¾V¢ ®\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89î×\8f®\12¥\ f\92JôÍ\a9\1d÷*Ñý\ fò\e¿ ðô|x¼¿çJt<S\95è\ f?þðå\ f\7fú÷?üñã\97\8fïÛ ÇÃóÝñ\9b7ãïÿv=íýÝz­\85à³ÍZèÍgÛ«\85Þ\7f\8aÝZ\bÄ\1eÃZH\81£\16B±æ¸\16Rfj!D{\90k!¥¦\16\a¹\162ê¬\85H]\ 6¹\16Rjj!T{\90k!¥¦\16\a¹\162ê¬\85H]\ 6¹\16Rjj!T{\90k!¥¦\16\a¹\16Rjj!T{\90k!£ÎZ\88Ôe\90k!¥¦\16\a¹\16Rjj!T{\90k!£ÎZ\88Ôe\90k!¥¦\16\a¹\16Rjj!T{\90k!¥¦\16\a¹\162ê¬\85H]\ 6¹\16Rjj!T{\10k!\85\8eZ\bÍ\9aÃZH\91£\16B²æ¸\162æ¬\85\b]\ 6¹\16Rjj!T{\90k!¥¦\16\a¹\162ê¬\85H]\ 6¹\16Rjj!T{\90k!¥¦\16\a¹\16Rjj!T{\90k!£ÎZ\88Ôe\90k!¥¦\16\a¹\16Rjj!T{\90k!£ÎZ\88Ôe\90k!¥¦\16\a¹\16Rjj!T{\90k!¥¦\16\a¹\16\12êk-\ 4ê:ȵ\90RS\v¡Ú\83\\v)5µ\10ª=ȵ\90RS\v¡Ú\83X\v\19\10\99=\87µ\90"G-\84dÍq-¤ÌÔB\88ö ×BF\9dµ\10©Ë ×BJM-\84j\ fr-¤ÔÔB¨ö ×BJM-\84j\ fr-dÔY\v\91º\fr-¤ÔÔB¨ö ×BJM-\84j\ fr-dÔY\v\91º\fr-¤ÔÔB¨ö ×BJM-\84j\ fr-¤ÔÔB¨ö ×BF\9dµ\10©Ë ×BJM-\84j\ fr-¤ÔÔB¨ö ×BJM-\84j\ fr-dÔY\v\91º\fr-¤ÔÔB¨ö ÖB
+\1dµ\10\9a5\87µ\90!S\v\11Ùs\\v)3µ\10¢=ȵ\90RS\v¡Ú\83\\v)5µ\10ª=ȵ\90Qg-Dê2ȵ\90RS\v¡Ú\83\\v)5µ\10ª=ȵ\90RS\v¡Ú\83\\v\19uÖB¤.\83\\v)5µ\10ª=ȵ\90RS\v¡Ú\83\\v õµ\16\ 2u\1däZH©©\85PíA®\85\94\9aZ\bÕ\1eäZ\88ò\17S\vÑ\aI-ôæ\83ì×Bû\1fä7~§Üñáðts˵Ðxæ}-ôý·\8f\1fþôÃÏ/ÉзÇ\ f\1fßG%Û?)¿üþð\8a\øÛö°÷·m\16\19SÔ¼ù\88ûEÍû\8f\ 1E\r¢=ÈE\8dRSÔ Ú\83\18u\165¤.\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\18u\165¤.\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dQgQCê2ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dQgQCê2ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\18u\165¤.\83\Ô(5E\rª=\88E\8dBGQ\83fÍaQ£ÈQÔ Ys\Ô\18s\165\84.\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\18u\165¤.\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dQgQCê2ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dQgQCê2ÈE\8dRSÔ Ú\83\Ô(5E\rª=ÈE\8dRSÔ Ú\83\bõµ¨\ 1u\1dä¢F©)jPíA.j\94\9a¢\ 6Õ\1eä¢F©)jPíA,j\f\9a¢\86Ì\9eâF\91£¨A²æ¸¨Qf\8a\1aD{\90\8b\1a£Î¢\86Ôe\90\8b\1a¥¦¨Aµ\a¹¨Qj\8a\1aT{\90\8b\1a¥¦¨Aµ\a¹¨1ê,jH]\ 6¹¨Qj\8a\1aT{\90\8b\1a¥¦¨Aµ\a¹¨1ê,jH]\ 6¹¨Qj\8a\1aT{\90\8b\1a¥¦¨Aµ\a¹¨Qj\8a\1aT{\90\8b\1a£Î¢\86Ôe\90\8b\1a¥¦¨Aµ\a¹¨Qj\8a\1aT{\90\8b\1a¥¦¨Aµ\a¹¨1ê,jH]\ 6¹¨Qj\8a\1aT{\10\8b\1a\85\8e¢\ 6Í\9aâÆ\90)j\88ì9.j\94\99¢\ 6Ñ\1eä¢F©)jPíA.j\94\9a¢\ 6Õ\1eä¢Æ¨³¨!u\19ä¢F©)jPíA.j\94\9a¢\ 6Õ\1eä¢F©)jPíA.j\8c:\8b\1aR\97A.j\94\9a¢\ 6Õ\1eä¢F©)jPíA.j\84úZÔ\80º\ erQ£Ô\145¨ö \175JMQ\83j\ frQ\83i\88(jè\83¤¨yóAN§½¢fÿ\83üÆïßÙþ¦?\9d³\9bý¢f<ó¾¨ùé\9fÿ×î\17ðÜ?¾þo^ø\bÛôöÏÐ×¾\81\a>Ýü\ 6\9e7\9f\e\7f\8cÝoà\ 1±Çð\ex\148z!\14k\8e{!e¦\17\a¹\17Rjz!T{\90{!£Î^\88Ôe\90{!¥¦\17\a¹\17Rjz!T{\90{!£Î^\88Ôe\90{!¥¦\17\a¹\17Rjz!T{\90{!¥¦\17\a¹\172êì\85H]\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\172êì\85H]\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\17Rjz!T{\90{!£Î^\88Ôe\90{!¥¦\17\a±\17Rèè\85Ь9ì\85\149z!$k\8e{!cÎ^\88Ðe\90{!¥¦\17\a¹\17Rjz!T{\90{!£Î^\88Ôe\90{!¥¦\17\a¹\17Rjz!T{\90{!¥¦\17\a¹\172êì\85H]\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\172êì\85H]\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\17Rjz!T{\90{!¡¾öB ®\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v)5½\10ª=\88½\90\v\91ÙsØ\v)rôBHÖ\1c÷BÊL/\84h\ fr/dÔÙ\v\91º\fr/¤ÔôB¨ö ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BF\9d½\10©Ë ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BF\9d½\10©Ë ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BJM/\84j\ fr/dÔÙ\v\91º\fr/¤ÔôB¨ö ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BF\9d½\10©Ë ÷BJM/\84j\ fb/¤ÐÑ\v¡YsØ\v\19\10\91=ǽ\90\v\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v\19uöB¤.\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\90Qg/Dê2Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\90P_{!P×Aî\85\94\9a^\bÕ\1eä^H©é\85PíAî\85öû\17×\vÑ\aI/ôæ\83\9cn÷z¡ý\ fòÿWvGKR\9dÙµ\85_E\97Ò\85      ª (¸>\11ç\ 5έ#\bZ"ÔØn\89\ 3(ìÇw\96rÍ?sþY{0¸q´Ãéùmã6PZÃ;\7f¬\17º\7fwzð\97\vå3Õ\v}þòçï_>üëý§/ÿÿ¶\16zý÷yõjû¶\16z}úÝê¨\16\19õæ\8e\9f-\1fº~¶\17·\ frN\8a\9ey\90ãF\89Õ\1e\84\98Ó(\91ØcÔ(9ðÜ(±XsØ(9s\1a%F{\10\e%§N£Äj\ fb£¤Ô4J¨n\83Ø(9u\1a%V{\10\e%§N£Äj\ fb£¤Ô4J¨n\83Ø(9u\1a%V{\10\e%§N£Äj\ fb£äÔi\94XíAl\94\94\9aF    Õm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\94\9aF       Õm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92RÓ(¡º\rb£äÔi\94XíAj\94\1czn\94ج9j\94\1cyn\94\98¬9l\94\94\99F   Ñm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\94\9aF       Õm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92RÓ(¡º\rb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92RÓ(¡º\rb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92S§Qbµ\a±Q2êj\94\a±Qrê4J¬ö 6JN\9dF\89Õ\1eÄFÉ©Ó(±Ú\83Ô()t\1a%4{\8e\1a%G\9e\e%&k\ e\e%gN£Äh\ fb£¤Ô4J¨n\83Ø(9u\1a%V{\10\e%§N£Äj\ fb£äÔi\94XíAl\94\94\9aF  Õm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\94\9aF       Õm\10\e%§N£Äj\ fb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92RÓ(¡º\rb£äÔi\94XíAl\94\9c:\8d\12«=\88\8d\92S§Qbµ\a±QRj\1a%T·Al\94\9c:\8d\12«=H\8d\92\8d\12\9b5G\8d\92"§QB²ç°Qræ4J\8cö 6JN\9dF\89Õ\1eÄFÉ©Ó(±Ú\83Ø()5\8d\12ªÛ 6JN\9dF\89Õ\1eÄFÉ©Ó(±Ú\83Ø(9u\1a%V{\10\e%¥¦QBu\eÄFÉ©Ó(±Ú\83Ø(9u\1a%V{\10\e%£®F\89Ô}\10\e%§N£Äj\ fb£äÔi\94XíAl\94 ºQ\8d\12>È|èúA\ e\e%x\90\1fû\96°ûÇÓ\ fî¯ßq£4\9f©Fé¿¿|:ýÇ/\1f\7fÿôõÛÇ_î~þr[\94Ü¿¸{óæ§+a\7f\8cÓßiNÿ.ã¯\b£\aLNsõ|Ç9Ííc@N\83h\ frN£Ôä4¨ö ç4F]9\r©Û ç4JMN\83j\ frN£Ôä4¨ö ç4F]9\r©Û ç4JMN\83j\ frN£Ôä4¨ö ç4JMN\83j\ frNcÔ\95Ó\90º\rrN£Ôä4¨ö ç4JMN\83j\ frNcÔ\95Ó\90º\rrN£Ôä4¨ö ç4JMN\83j\ frN£Ôä4¨ö ç4F]9\r©Û ç4JMN\83j\ fbN£ÐÉiЬ9Ìi\1499\r\925Ç9\8d1WNCè6È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dQWNCê6È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uå4¤n\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uå4¤n\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dP/9\r¨û ç4JMN\83j\ frN£Ôä4¨ö ç4JMN\83j\ fbNcÐä4dö\1cæ4\8a\9c\9c\ 6É\9aã\9cF\99Éi\10íAÎi\8cºr\1aR·AÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ+§!u\eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ+§!u\eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\8cºr\1aR·AÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ+§!u\eä\9cF©ÉiPíAÌi\14:9\r\9a5\879\8d!\93Ó\10Ùs\9cÓ(39\r¢=È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dQWNCê6È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uå4¤n\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\bõ\92Ó\80º\ frN£Ôä4¨ö ç4JMN\83j\ frNs\9c\86¸\9c\86\1e$9ÍÕ\83Ü¿>Êi\8e\1fä\a_ùóæõé\a¼·\9cÓÌg*§ùòñÃo©i¾<÷®\9d7\ fï~ºZ¿ýõº{¼ÿÞW\84ÑÓ­×ï\=ÝÑëwn\1fãðõ; ö\18¾~G\81Ó\v¡XsÜ\v)3½\10¢=Ƚ\90\v¡Ú\83Ü\v\19uõB¤n\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v\19uõB¤n\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\90QW/Dê6Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\90QW/Dê6Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v\19uõB¤n\83Ü\v)5½\10ª=\88½\90\17B³æ°\17RäôBHÖ\1c÷BÆ\½\10¡Û ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BF]½\10©Û ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BJM/\84j\ fr/dÔÕ\v\91º\rr/¤ÔôB¨ö ÷BJM/\84j\ fr/dÔÕ\v\91º\rr/¤ÔôB¨ö ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BB½ôB î\83Ü\v)5½\10ª=Ƚ\90\v¡Ú\83Ü\v)5½\10ª=\88½\90\v\91ÙsØ\v)rz!$k\8e{!e¦\17\a¹\172êê\85\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\17Rjz!T{\90{!£®^\88Ôm\90{!¥¦\17\a¹\17Rjz!T{\90{!£®^\88Ôm\90{!¥¦\17\a¹\17Rjz!T{\90{!¥¦\17\a¹\172êê\85\ 6¹\17Rjz!T{\90{!¥¦\17\a¹\17Rjz!T{\90{!£®^\88Ôm\90{!¥¦\17\a±\17RèôBhÖ\1cöB\86L/DdÏq/¤ÌôB\88ö ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BF]½\10©Û ÷BJM/\84j\ fr/¤ÔôB¨ö ÷BJM/\84j\ fr/dÔÕ\v\91º\rr/¤ÔôB¨ö ÷BJM/\84j\ fr/$ÔK/\ 4ê>Ƚ\90\v¡Ú\83Ü\v)5½\10ª=Ƚ\10õ/¦\17¢\aI/tõ Ç½Ðñ\83üÛ«§¿\8d\96L¯ß9ý)ûêï\7f8ôpÿâåë7Ï÷Bó¡|æé\89N¿¥¾xõâ\97\7f»\7f|ûóÿùç§Ïç\7fõÿþúüùÏ/ßÎÿÉÿýë\8f_\7f¹ûùÛ§?ÿøz\9b\99\13½Ëä³ß\1eöô\ fË\8fÞÉ\93Þ\ 5\1e{õ.W\8f}Ü»Ü>\bô.¨ö ÷.F]½\v©Û ÷.JMï\82j\ frï¢Ôô.¨ö ÷.F]½\v©Û ÷.JMï\82j\ frï¢Ôô.¨ö ÷.JMï\82j\ frïbÔÕ»\90º\rrï¢Ôô.¨ö ÷.JMï\82j\ frïbÔÕ»\90º\rrï¢Ôô.¨ö ÷.JMï\82j\ frï¢Ôô.¨ö ÷.F]½\v©Û ÷.JMï\82j\ fbï¢Ðé]Ь9ì]\14\v\925ǽ\8b1WïBè6Ƚ\8bRÓ» Ú\83Ü»(5½\vª=Ƚ\8bQWïBê6Ƚ\8bRÓ» Ú\83Ü»(5½\vª=Ƚ\8bRÓ» Ú\83Ü»\18uõ.¤n\83Ü»(5½\vª=Ƚ\8bRÓ» Ú\83Ü»\18uõ.¤n\83Ü»(5½\vª=Ƚ\8bRÓ» Ú\83Ü»(5½\vª=Ƚ\8bP/½\v¨û ÷.JMï\82j\ frï¢Ôô.¨ö ÷.JMï\82j\ fbïbÐô.dö\1cö.\8a\9cÞ\ 5É\9aãÞE\99é]\10íAî]\8cºz\17R·Aî]\94\9aÞ\ 5Õ\1eäÞE©é]PíAî]\94\9aÞ\ 5Õ\1eäÞŨ«w!u\eäÞE©é]PíAî]\94\9aÞ\ 5Õ\1eäÞŨ«w!u\eäÞE©é]PíAî]\94\9aÞ\ 5Õ\1eäÞE©é]PíAî]\8cºz\17R·Aî]\94\9aÞ\ 5Õ\1eäÞE©é]PíAî]\94\9aÞ\ 5Õ\1eäÞŨ«w!u\eäÞE©é]PíAì]\14\v\9a5\87½\8b!Ó»\10ÙsÜ»(3½\v¢=Ƚ\8bRÓ» Ú\83Ü»(5½\vª=Ƚ\8bQWïBê6Ƚ\8bRÓ» Ú\83Ü»(5½\vª=Ƚ\8bRÓ» Ú\83Ü»\18uõ.¤n\83Ü»(5½\vª=Ƚ\8bRÓ» Ú\83Ü»\bõÒ»\80º\ frï¢Ôô.¨ö ÷.JMï\82j\ frïr\9ci¸Þ\85\1e$½ËÕ\83Ü?\1cõ.Ç\ fò\83ïÇyõîÅËw\ fü~\9cùÌÓ\13\8f\ fw/_¾üüþã\1f\1fþñ_\1fßÿúç\1fÿþòåýï\7f=}ãÔ\87§Æåözûêô\vüö§+é6q¹\7fûæ(qYgdxÒuF¾zÒã3òí\83À\19\19Õ\1eä3²Q×\19\99Ôm\90ÏÈJÍ\19\19Õ\1eä3²RsFFµ\aù\8c¬Ô\9c\91QíA>#\eu\9d\91\ 6ù\8c¬Ô\9c\91QíA<#+tÎÈhÖ\1c\9e\91\159gd$k\8eÏÈÆ\gdB·A>#+5gdT{\90ÏÈJÍ\19\19Õ\1eä3²Q×\19\99Ôm\90ÏÈJÍ\19\19Õ\1eä3²RsFFµ\aù\8c¬Ô\9c\91QíA>#\eu\9d\91\ 6ù\8c¬Ô\9c\91QíA>#+5gdT{\90ÏÈF]gdR·A>#+5gdT{\90ÏÈJÍ\19\19Õ\1eä3²RsFFµ\aù\8c,ÔË\19\19Ô}\90ÏÈJÍ\19\19Õ\1eä3²RsFFµ\aù\8c¬Ô\9c\91QíA<#\e4gd2{\ eÏÈ\8a\9c32\925Çgdeæ\8c\8ch\ fò\19Ù¨ë\8cLê6Ègd¥æ\8c\8cj\ fò\19Y©9#£Ú\83|FVjÎȨö \9f\91\8dºÎȤn\83|FVjÎȨö \9f\91\95\9a32ª=Ègd£®32©Û \9f\91\95\9a32ª=Ègd¥æ\8c\8cj\ fò\19Y©9#£Ú\83|F6ê:#\93º\rò\19Y©9#£Ú\83|FVjÎȨö \9f\91\95\9a32ª=Ègd£®32©Û \9f\91\95\9a32ª=\88gd\85Î\19\19Í\9aÃ3²!sF&²çø\8c¬Ì\9c\91\11íA>#+5gdT{\90ÏÈJÍ\19\19Õ\1eä3²Q×\19\99Ôm\90ÏÈJÍ\19\19Õ\1eä3²RsFFµ\aù\8c¬Ô\9c\91QíA>#\eu\9d\91\ 6ù\8c¬Ô\9c\91QíA>#+5gdT{\90ÏÈB½\9c\91\aù\8c¬Ô\9c\91QíA>#+5gdT{\90ÏÈǧPwF¦\aÉ\19ùêA\8eÏÈÇ\ f²\9d\91ï¿sF>ýXùt\1eÄ3ò|¦ÎÈ¿}úZwä_î~þëè\8eüð÷WÂ\Q·wä7\ f\ f\87wä\táQ×E÷êQ\8f/º·\ f\ 2\17]R·A¾è*5\17]T{\90/ºJÍE\17Õ\1eä\8b®RsÑEµ\aù¢kÔuÑ%u\eä\8b®RsÑEµ\añ¢«Ð¹è¢YsxÑUä\t\91¬9¾è\1as]t   Ý\ 6ù¢«Ô\tQíA¾è*5\17]T{\90/ºF]\17]R·A¾è*5\17]T{\90/ºJÍE\17Õ\1eä\8b®RsÑEµ\aù¢kÔuÑ%u\eä\8b®RsÑEµ\aù¢«Ô\tQíA¾è\1au]tIÝ\ 6ù¢«Ô\tQíA¾è*5\17]T{\90/ºJÍE\17Õ\1eä\8b®P/\17]P÷A¾è*5\17]T{\90/ºJÍE\17Õ\1eä\8b®RsÑEµ\añ¢kÐ\tÉì9¼è*r.ºHÖ\1c_t\95\99\8b.¢=È\17]£®\8b.©Û _t\95\9a\8b.ª=È\17]¥æ¢\8bj\ fòEW©¹è¢Ú\83|Ñ5êºè\92º\ròEW©¹è¢Ú\83|ÑUj.º¨ö _t\8dº.º¤n\83|ÑUj.º¨ö _t\95\9a\8b.ª=È\17]¥æ¢\8bj\ fòEרë¢Kê6È\17]¥æ¢\8bj\ fòEW©¹è¢Ú\83|ÑUj.º¨ö _t\8dº.º¤n\83|ÑUj.º¨ö ^t\15:\17]4k\ e\86ÌE\97È\9eã\8b®2sÑE´\aù¢«Ô\tQíA¾è*5\17]T{\90/ºF]\17]R·A¾è*5\17]T{\90/ºJÍE\17Õ\1eä\8b®RsÑEµ\aù¢kÔuÑ%u\eä\8b®RsÑEµ\aù¢«Ô\tQíA¾è
+õrÑ\ 5u\1fä\8b®RsÑEµ\aù¢«Ô\tQíA¾è\1e\1f%ÝE\97\1e$\17Ý«\a9¾è\1e\ fþ?\ 6ß½zq÷î\9e/ºó\99ºèþúËãÏÿüôùrÑÝ\1eôþíÛóËÒ/Àþ\14÷§?\8a^\1fü\92Ý¿;ý\99|\7fÏ\ f\98\ f]?àÍÿîîß½zqÿîþ¹\ayF=\7fö;j\ f\1e¨§?hßÜIõüÙï¨=x \9eþ }eÕóg¿£öàÁ\97
+\9cþ Uæù\93(öØ\81wú#öQ\82\7f\7fô;bÍ\1d\90óå
+ÊÌ·5 Ú\83üm\rJÍ·5 Ú\83üm\rF]ßÖ@ê6ÈßÖ Ô|[\ 3ª=ÈßÖ Ô|[\ 3ª=ÈßÖ`Ôõm\r¤n\83üm\rJÍ·5 Ú\83üm\rJÍ·5 Ú\83üm\rJÍ·5 Ú\83üm\rF]ßÖ@ê6ÈßÖ Ô¼f\ 3Õ\1eä×l(5Q\16ª=ÈQ\96QW\94Eê6ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce\19uEY¤n\83\1ce)5Q\16ª=\88Q\96B'ÊB³æ0ÊRäDYHÖ\1cGYÆ\Q\16¡Û GYJM\94\85j\ fr\94¥ÔDY¨ö GYF]Q\16©Û GYJM\94\85j\ fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94\15e\91º\rr\94¥ÔDY¨ö GYJM\94\85j\ fr\94\15e\91º\rr\94¥ÔDY¨ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYB½DY î\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=\88Q\96A\13e\91Ùs\18e)r¢,$k\8e£,e&ÊB´\a9Ê2ê\8a²HÝ\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,£®(\8bÔm\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,£®(\8bÔm\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,¥&ÊBµ\a9Ê2ê\8a²HÝ\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,£®(\8bÔm\90£,¥&ÊBµ\a1ÊRèDYhÖ\1cFY\86L\94EdÏq\94¥ÌDY\88ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYF]Q\16©Û GYJM\94\85j\ fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94\15e\91º\rr\94¥ÔDY¨ö GYJM\94\85j\ fr\94%ÔK\94\ 5ê>ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQÖqaä¢,z\90DYW\ frÿæ(Ê:~\90\1f\8c²^>©w\1ceÍgúÛ\1aþçÛÇ?~ûøÛû\7f}øú\9f·5É´<\97õÛ7k¼||{ôf\8d\15\98ÀÓ­Àäêé\8e\ 3\93Û\a\81À\84Ôm\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£®À\84Ôm\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê
+LHÝ\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê
+LHÝ\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£®À\84Ôm\90\ 3\13¥&0Aµ\a10Qè\ 4&hÖ\1c\ 6&\8a\9cÀ\ 4É\9aãÀÄ\98+0!t\eäÀD©  LPíA\ eL\94\9aÀ\ 4Õ\1eäÀĨ+0!u\eäÀD©       LPíA\ eL\94\9aÀ\ 4Õ\1eäÀD©        LPíA\ eL\8cº\ 2\13R·A\ eL\94\9aÀ\ 4Õ\1eäÀD©       LPíA\ eL\8cº\ 2\13R·A\ eL\94\9aÀ\ 4Õ\1eäÀD©       LPíA\ eL\94\9aÀ\ 4Õ\1eäÀD¨\97À\ 4Ô}\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a101h\ 2\132{\ e\ 3\13EN`\82dÍq`¢Ì\ 4&\88ö \a&F]\81  ©Û \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&F]\81  ©Û \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \ 6&
+\9dÀ\ 4Í\9aÃÀÄ\90      L\88ì9\ eL\94\99À\ 4Ñ\1eäÀD©        LPíA\ eL\94\9aÀ\ 4Õ\1eäÀĨ+0!u\eäÀD©       LPíA\ eL\94\9aÀ\ 4Õ\1eäÀD©        LPíA\ eL\8cº\ 2\13R·A\ eL\94\9aÀ\ 4Õ\1eäÀD©       LPíA\ eL\84z        L@Ý\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a909\ e&\`B\ f\92ÀäêA\8e\ 3\93ã\aù±ïq¹;ýÆq\7fú\11\9a\ 2\93\ 2\93\7f|øë·÷_>|ûxûº\9f§¿\f¾þéjù\99¸äáè×êþôûç»ï=Y>týd·¯À9ý\17\1f\1f^=÷ Ï¨çÏ~GíÁ\83\17ï\9cßD¤Ô¼Ú\bÕm\10_mäÔyµ\11«=\88¯6rê¼Ú\88Õ\1eÄW\e9u^mÄj\ f«\8d\8c9¯6"±ÇèÕF\ e<¿Ú\88Å\9aÃW\e9s^mÄh\ fâ«\8d\9c\19«=\88å\99RS\9e¡º\rbyæÔ)ÏXíA,Ï\9c\19«=\88å\99RS\9e¡º\rbyæÔ)ÏXíA,Ï\9c\19«=\88å\99S§<cµ\a±<SjÊ3T·A,Ï\9c\19«=\88å\99S§<cµ\a±<SjÊ3T·A,Ï\9c\19«=\88å\99S§<cµ\a±<sê\94g¬ö \96gJMy\86ê6\88å\99S§<cµ\a©<sè¹<c³æ¨<sä¹<c²æ°<SfÊ3D·A,Ï\9c\19«=\88å\99S§<cµ\a±<SjÊ3T·A,Ï\9c\19«=\88å\99S§<cµ\a±<sê\94g¬ö \96gJMy\86ê6\88å\99S§<cµ\a±<sê\94g¬ö \96gJMy\86ê6\88å\99S§<cµ\a±<sê\94g¬ö \96gN\9dò\8cÕ\1eÄǫ̀«<#u\1fÄòÌ©S\9e±Ú\83X\9e9uÊ3V{\10Ë3§NyÆj\ fRy¦Ð)ÏÐì9*Ï\1cy.Ï\98¬9,Ï\9c\19£=\88å\99RS\9e¡º\rbyæÔ)ÏXíA,Ï\9c\19«=\88å\99S§<cµ\a±<SjÊ3T·A,Ï\9c\19«=\88å\99S§<cµ\a±<SjÊ3T·A,Ï\9c\19«=\88å\99S§<cµ\a±<sê\94g¬ö \96gJMy\86ê6\88å\99S§<cµ\a±<sê\94g¬ö \96gN\9dò\8cÕ\1eÄòL©)ÏPÝ\ 6±<sê\94g¬ö \95g\ e=\97glÖ\1c\95g\8a\9cò\fÉ\9eÃòÌ\99S\9e\83X\9e9uÊ3V{\10Ë3§NyÆj\ fby¦Ô\94g¨n\83X\9e9uÊ3V{\10Ë3§NyÆj\ fbyæÔ)ÏXíA,Ï\94\9aò\fÕm\10Ë3§NyÆj\ fbyæÔ)ÏXíA,Ï\8cºÊ3R÷A,Ï\9c\19«=\88å\99S§<cµ\a±<\83\9aJ\95gø ó¡ë\a¹\7f<(ÏàA~ìÕFw\8f§ß®^½åòl>SåÙ\97\8f\1f~»i\82\1e\1e_¼{úgX\97ÑÛï\98»{x8\8aÎÞ\9c\1eüïßéà¡ò¡ë\87º\8d\93N\7f]z{ÿøÜ\83\9e\1dµ\a\ fÔ\87\17\ fO¿1)õüÙï¨=x \9e~ÐxcÕóg¿£öàóêãé\a\8d§ß\98\8c:\9feu\e<PO?h¼´êù³ßQ{ð@=ý ñô\e\93\9fý\8eÚ\83\aêé\a\8d×V=\7fö;j\ f\1eä\9a§\1f4î^9u>Ëê6x NIªÔ¤©¨ö §©JM\9a\8aj\ fr\9a\95¦\92º\rr\9aªÔ¤©¨ö §©JM\9a\8aj\ fr\9aªÔ¤©¨ö ¥©ÂL\9a
+b\8fa\9aªÀISQ¬9NS\95\994\15Ñ\1eä4U©ISQíANS\8dºÒTR·ANS\95\9a4\15Õ\1eä4U©ISQíANS\8dºÒTR·ANS\95\9a4\15Õ\1eä4U©ISQíANS\95\9a4\15Õ\1eä4Õ¨+M%u\eä4U©ISQíANS\95\9a4\15Õ\1eä4Õ¨+M%u\eä4U©ISQíANS\95\9a4\15Õ\1eä4U©ISQíANS\8dºÒTR·ANS\95\9a4\15Õ\1eÄ4U¡\93¦¢Ys\98¦*rÒT$k\8eÓTc®4\95Ðm\90ÓT¥&MEµ\a9MUjÒTT{\90ÓT£®4\95Ôm\90ÓT¥&MEµ\a9MUjÒTT{\90ÓT¥&MEµ\a9M5êJSIÝ\ 69MUjÒTT{\90ÓT¥&MEµ\a9M5êJSIÝ\ 69MUjÒTT{\90ÓT¥&MEµ\a9MUjÒTT{\90ÓT¡^ÒTP÷ANS\95\9a4\15Õ\1eä4U©ISQíANS\95\9a4\15Õ\1eÄ4Õ ISÉì9LS\159i*\925Çiª2\93¦"Ú\83\9c¦\1au¥©¤n\83\9c¦*5i*ª=ÈiªR\93¦¢Ú\83\9c¦*5i*ª=ÈiªQW\9aJê6ÈiªR\93¦¢Ú\83\9c¦*5i*ª=ÈiªQW\9aJê6ÈiªR\93¦¢Ú\83\9c¦*5i*ª=ÈiªR\93¦¢Ú\83\9c¦\1au¥©¤n\83\9c¦*5i*ª=ÈiªR\93¦¢Ú\83\9c¦*5i*ª=ÈiªQW\9aJê6ÈiªR\93¦¢Ú\83\98¦*tÒT4k\ eÓTC&M%²ç8MUfÒTD{\90ÓT¥&MEµ\a9MUjÒTT{\90ÓT£®4\95Ôm\90ÓT¥&MEµ\a9MUjÒTT{\90ÓT¥&MEµ\a9M5êJSIÝ\ 69MUjÒTT{\90ÓT¥&MEµ\a9M\15ê%M\ 5u\1fä4U©ISQíANS\95\9a4\15Õ\1eä4õ¸¹ti*=HÒÔ«\a9NS\8f\1fä\a_\8aøæ´÷ö\r§©ó\99JS?\7fùøw\9eúþ×?ÿø÷\97\7f\7f¶(yÊ\13.Âm§úøæîè\9b7Wî\ 1O¸r\8f«'<Î=n\1f\ 4r\ fT{\90s\ f¥&÷@µ\a9÷0êÊ=HÝ\ 69÷Pjr\ fT{\90s\ f¥&÷@µ\a9÷Pjr\ fT{\90s\ f£®Ü\83Ôm\90s\ f¥&÷@µ\a9÷Pjr\ fT{\90s\ f£®Ü\83Ôm\90s\ f¥&÷@µ\a9÷Pjr\ fT{\90s\ f¥&÷@µ\a9÷0êÊ=HÝ\ 69÷Pjr\ fT{\10s\ f\85\81fÍaî¡ÈÉ=\90¬9Î=\8c¹r\ fB·AÎ=\94\9aÜ\ 3Õ\1eäÜC©É=PíAÎ=\8cºr\ fR·AÎ=\94\9aÜ\ 3Õ\1eäÜC©É=PíAÎ=\94\9aÜ\ 3Õ\1eäÜè+÷ u\eäÜC©É=PíAÎ=\94\9aÜ\ 3Õ\1eäÜè+÷ u\eäÜC©É=PíAÎ=\94\9aÜ\ 3Õ\1eäÜC©É=PíAÎ=\84zÉ=@Ý\a9÷Pjr\ fT{\90s\ f¥&÷@µ\a9÷Pjr\ fT{\10s\ f\83&÷ ³ç0÷Pää\1e\1cç\1eÊLî\81h\ frîaÔ\95{\90º\rrî¡Ôä\1e¨ö ç\1eJMî\81j\ frî¡Ôä\1e¨ö ç\1eF]¹\a©Û ç\1eJMî\81j\ frî¡Ôä\1e¨ö ç\1eF]¹\a©Û ç\1eJMî\81j\ frî¡Ôä\1e¨ö ç\1eJMî\81j\ frîaÔ\95{\90º\rrî¡Ôä\1e¨ö ç\1eJMî\81j\ frî¡Ôä\1e¨ö ç\1eF]¹\a©Û ç\1eJMî\81j\ fbî¡ÐÉ=Ь9Ì=\f\99Ü\83È\9eãÜC\99É=\10íAÎ=\94\9aÜ\ 3Õ\1eäÜC©É=PíAÎ=\8cºr\ fR·AÎ=\94\9aÜ\ 3Õ\1eäÜC©É=PíAÎ=\94\9aÜ\ 3Õ\1eäÜè+÷ u\eäÜC©É=PíAÎ=\94\9aÜ\ 3Õ\1eäÜC¨\97Ü\ 3Ô}\90s\ f¥&÷@µ\a9÷Pjr\ fT{\90s\8fãtÁå\1eô É=®\1eäþíQîqü ?ø&²Ó_S_\9fþ\r\86¹Ç|æ&÷øï/\9f¾}|ê=~¹ûùùäãîô£òÓ?¬¼(·ÉÇËÓ\a\8e\92\8fÄ\17ð\94+¾¸zÊãøâöA ¾@µ\a9¾0ê\8a/HÝ\ 69¾Pjâ\vT{\90ã\v¥&¾@µ\a9¾Pjâ\vT{\90ã\v£®ø\82Ôm\90ã\v¥&¾@µ\a9¾Pjâ\vT{\90ã\v£®ø\82Ôm\90ã\v¥&¾@µ\a9¾Pjâ\vT{\90ã\v¥&¾@µ\a9¾0ê\8a/HÝ\ 69¾Pjâ\vT{\10ã\v\85N|\81fÍa|¡È\89/\90¬9\8e/\8c¹â\vB·A\8e/\94\9aø\ 2Õ\1eäøB©\89/PíA\8e/\8cºâ\vR·A\8e/\94\9aø\ 2Õ\1eäøB©\89/PíA\8e/\94\9aø\ 2Õ\1eäø¨+¾ u\eäøB©\89/PíA\8e/\94\9aø\ 2Õ\1eäø¨+¾ u\eäøB©\89/PíA\8e/\94\9aø\ 2Õ\1eäøB©\89/PíA\8e/\84z\89/@Ý\a9¾Pjâ\vT{\90ã\v¥&¾@µ\a9¾Pjâ\vT{\10ã\v\83&¾ ³ç0¾PäÄ\17\1cÇ\17ÊL|\81h\ fr|aÔ\15_\90º\rr|¡ÔÄ\17¨ö Ç\17JM|\81j\ fr|¡ÔÄ\17¨ö Ç\17F]ñ\ 5©Û Ç\17JM|\81j\ fr|¡ÔÄ\17¨ö Ç\17F]ñ\ 5©Û Ç\17JM|\81j\ fr|¡ÔÄ\17¨ö Ç\17JM|\81j\ fr|aÔ\15_\90º\rr|¡ÔÄ\17¨ö Ç\17JM|\81j\ fr|¡ÔÄ\17¨ö Ç\17F]ñ\ 5©Û Ç\17JM|\81j\ fb|¡Ð\89/Ь9\8c/\f\99ø\82È\9eãøB\99\89/\10íA\8e/\94\9aø\ 2Õ\1eäøB©\89/PíA\8e/\8cºâ\vR·A\8e/\94\9aø\ 2Õ\1eäøB©\89/PíA\8e/\94\9aø\ 2Õ\1eäø¨+¾ u\eäøB©\89/PíA\8e/\94\9aø\ 2Õ\1eäøB¨\97ø\ 2Ô}\90ã\v¥&¾@µ\a9¾Pjâ\vT{\90ã\8bã\88ÀÅ\17ô \89\1eä8¾8~\90\1f|×Æ«Ó¿­Oÿ\ 2ã\8bùLÅ\17_?þñÛû\7f}ýý¹ï\91zúå¼ìÞæ\16\ f¯_\1d}\13Üú\8e'x®õ\1dOWÏuü\1d\ f\ 2ßñ\84j\ fòw<\19u}Ç\13©Û \7fÇ\93\1dO¨ö \7fÇ\93\1dO¨ö \7fÇ\93\1dO¨ö }Ç\93\1dO ö\18\93\ 2ç;\9eP¬9þ\8e'eæ;\9e\10íAþ\8e'¥æ;\9ePíAþ\8e'£®\97þ\90º\ròK\7f\94\9aî\fÕ\1eäîL©éÎPíAîÎ\8cºº3R·AîÎ\94\9aî\fÕ\1eäîL©éÎPíAîÎ\94\9aî\fÕ\1eäį̂«;#u\eäîL©éÎPíAîÎ\94\9aî\fÕ\1eäį̂«;#u\eäîL©éÎPíAîÎ\94\9aî\fÕ\1eäîL©éÎPíAîÎ\8cºº3R·AîÎ\94\9aî\fÕ\1eÄîL¡Ó\9d¡YsØ\9d)rº3$k\8e»3c®î\8cÐm\90»3¥¦;Cµ\a¹;Sjº3T{\90»3£®î\8cÔm\90»3¥¦;Cµ\a¹;Sjº3T{\90»3¥¦;Cµ\a¹;3êêÎHÝ\ 6¹;Sjº3T{\90»3¥¦;Cµ\a¹;3êêÎHÝ\ 6¹;Sjº3T{\90»3¥¦;Cµ\a¹;Sjº3T{\90»3¡^º3P÷AîÎ\94\9aî\fÕ\1eäîL©éÎPíAîÎ\94\9aî\fÕ\1eÄîÌ éÎÈì9ìÎ\14\19\925ÇÝ\99\9d\83Ü\9d\19uug¤n\83Ü\9d)5Ý\19ª=ÈÝ\99\9d¡Ú\83Ü\9d)5Ý\19ª=ÈÝ\99QWwFê6ÈÝ\99\9d¡Ú\83Ü\9d)5Ý\19ª=ÈÝ\99QWwFê6ÈÝ\99\9d¡Ú\83Ü\9d)5Ý\19ª=ÈÝ\99\9d¡Ú\83Ü\9d\19uug¤n\83Ü\9d)5Ý\19ª=ÈÝ\99\9d¡Ú\83Ü\9d)5Ý\19ª=ÈÝ\99QWwFê6ÈÝ\99\9d¡Ú\83Ø\9d)tº34k\ e»3C¦;#²ç¸;Sfº3D{\90»3¥¦;Cµ\a¹;Sjº3T{\90»3£®î\8cÔm\90»3¥¦;Cµ\a¹;Sjº3T{\90»3¥¦;Cµ\a¹;3êêÎHÝ\ 6¹;Sjº3T{\90»3¥¦;Cµ\a¹;\13ê¥;\ 3u\1fäîL©éÎPíAîÎ\94\9aî\fÕ\1eäî츦rÝ\19=Hº³«\a¹\7f\9d\1d\ f¾ôçþþôCÏ=wgó\99êÎ~ýåñç\7f~|ú\8fÿùþÛÿ¼ÿúí÷ۦäô O\7fñ¾\18û\83ܽxxûæè\95?SðÀ\13NÁsõ|\87\ 5Ïí3\1c\17<(Ö\1c\17<ÊLÁ\83h\ frÁ£Ô\14<¨ö \17<F]\ 5\ f©Û \17<JMÁ\83j\ frÁ£Ô\14<¨ö \17<F]\ 5\ f©Û \17<JMÁ\83j\ frÁ£Ô\14<¨ö \17<JMÁ\83j\ frÁcÔUð\90º\rrÁ£Ô\14<¨ö \17<JMÁ\83j\ frÁcÔUð\90º\rrÁ£Ô\14<¨ö \17<JMÁ\83j\ frÁ£Ô\14<¨ö \17<F]\ 5\ f©Û \17<JMÁ\83j\ fbÁ£Ð)xЬ9,x\149\ 5\ f\92\ 5\8f1WÁCè6È\ 5\8fRSð Ú\83\ð(5\ 5\ fª=È\ 5\8fQWÁCê6È\ 5\8fRSð Ú\83\ð(5\ 5\ fª=È\ 5\8fRSð Ú\83\18u\15<¤n\83\ð(5\ 5\ fª=È\ 5\8fRSð Ú\83\18u\15<¤n\83\ð(5\ 5\ fª=È\ 5\8fRSð Ú\83\ð(5\ 5\ fª=È\ 5\8fP/\ 5\ f¨û \17<JMÁ\83j\ frÁ£Ô\14<¨ö \17<JMÁ\83j\ fbÁcÐ\14<dö\1c\16<\8a\9c\82\aÉ\9aã\82G\99)x\10íA.x\8cº
+\1eR·A.x\94\9a\82\aÕ\1eä\82G©)xPíA.x\94\9a\82\aÕ\1eä\82Ǩ«à!u\eä\82G©)xPíA.x\94\9a\82\aÕ\1eä\82Ǩ«à!u\eä\82G©)xPíA.x\94\9a\82\aÕ\1eä\82G©)xPíA.x\8cº
+\1eR·A.x\94\9a\82\aÕ\1eä\82G©)xPíA.x\94\9a\82\aÕ\1eä\82Ǩ«à!u\eä\82G©)xPíA,x\14:\ 5\ f\9a5\87\ 5\8f!Sð\10Ùs\ð(3\ 5\ f¢=È\ 5\8fRSð Ú\83\ð(5\ 5\ fª=È\ 5\8fQWÁCê6È\ 5\8fRSð Ú\83\ð(5\ 5\ fª=È\ 5\8fRSð Ú\83\18u\15<¤n\83\ð(5\ 5\ fª=È\ 5\8fRSð Ú\83\bõRð\80º\ frÁ£Ô\14<¨ö \17<JMÁ\83j\ frÁsÜ¢¸\82\87\1e$\ 5ÏÕ\83\1c\17\ fò\83\ 5Ïé\7f²\87·w\ðÌg¶7G}{ÿ\8fo_>þþõö\9dM¯_¼~úgJ\97éÛ_¬\87»»ï¾<
+\1em½<êêÑ\8e_\1euû ðò(T{\90_\1eeÔõò(R·A~y\94Róò(T{\90_\1e¥Ô¼<
\1eä\97G)5/\8f\aéåQÂLz\ 6b\8faz¦ÀIÏP¬9NÏ\94\99ô\fÑ\1eäôL©IÏPíANÏ\8cºÒ3R·ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÒ3R·ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂+=#u\eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂+=#u\eäôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÒ3R·ANÏ\94\9aô\fÕ\1eÄôL¡\93\9e¡Ys\98\9e)rÒ3$k\8eÓ3c®ô\8cÐm\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£®ô\8cÔm\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êJÏHÝ\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=3êJÏHÝ\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¡^Ò3P÷ANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eÄôÌ IÏÈì9LÏ\14\19\925Çé\992\93\9e\83\9c\9e\19u¥g¤n\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QWzFê6Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QWzFê6Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u¥g¤n\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QWzFê6Èé\99R\93\9e¡Ú\83\98\9e)tÒ34k\ eÓ3C&=#²ç8=SfÒ3D{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£®ô\8cÔm\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êJÏHÝ\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=\13ê%=\ 3u\1fäôL©IÏPíANÏ\94\9aô\fÕ\1eäô\8cj*\93\9eÑ\83$=»z\90W/\8fÒ³ã\aù±/-|wú;Ô鹩<\9b\8ftxöíÃ\97\17H}ú|\9b|½:ývÿú§Ëöí;£\9e\82\94ï¤gðhùÌÕ£\1d\86g·OqÜ\9d!YsX\9d\19\19\91=\87É\99"§8C²æ°7SääfHÖ\1cÆf\8a\9cÖ\fÉ\9a\83ÒL\80\13\9a\ 1WS\94\99)í\\99!w=\86\8d\99\ 2'1C±æ00SäôeHÖ\1cÖe\86L\FdÏaZ¦È)Ë\90¬9ìÊ\149Y\19\925\87Q\99\94\11ÙsX\94)r\822$k\ es2ENM\86dÍaK¦ÈIÉ\90¬9\fÉ\f\99\8e\8cÈ\9eÃ\8aL\91\13\91!Ys\98\90)r
+2$k\ eû1C&\1f#²ç0\1eSä´cHÖ\1c\96c\8a\9cp\fÉ\9aÃlL\91S\8d!YsØ\8c\19\18\91=\87Á\98\17C²æ¨\16Sâ9\16Cðz\8cR1å\9dK1ô®Ç°\133`21\12{\ e#1EN#\86dÍa!¦È        Ä\90¬9ÌÃ\f\99:\8cÈ\9eÃ6L\91\93\86!Ys\18\86)rº0$k\ e«0EN\14\86dÍa\12\14aDö\1cö`\8a\9c\1c\fÉ\9aÃ\18L\91Ó\82!YsX\82\192!\18\91=\87\19\98\ 2C²æ°\ 1Sä$`HÖ\1c\ 6`\8a\9cþ\vÉ\9aÃúK\90\ 2r\9bÃôK\91S~!YsØ})r²/$k\ e£/ENó\85dÍQñeÄ       ¾\b¬1ʽ\94w®½Ð»\1eÃÖK\81\93z¡Xs\18z\192\9d\17\91=\87\95\97"'òB²æ0ñRä\14^HÖ\1cö]\8a\9c¼\vÉ\9aøË\90\88ì9,»\149a\17\925\87Y\97"§êB²æ°é2d\92."{\ e\83.ENÏ\85dÍaÍ¥È\89¹\90¬9L¹\149%\17\925\87\1d\97!\93q\11Ùs\18q)r\1a.$k\ e\v.ENÀ\85dÍa¾¥È©·\90¬9l·\f\99t\8bÈ\9eÃpK\91Óm!YsTm)ñ\1cm!x=FÉ\96ñ¦Ø"¯Æ°×RàäZ(Ö\1cÆZ\8a\9cV\vÉ\9aÃRK\91\13j!Ys\98i\192\95\16\91=\87\8d\96"'ÑB²æ0ÐRäôYHÖ\1cÖY\8a\9c8\vÉ\9aÃ4Ë\90\88ì9ì²\149Y\16\925\87Q\96"§ÉB²æ°È\12ä
\80Üæ0ÇRäÔXHÖ\1c¶X\8a\9c\14\vÉ\9aÃ\10ë8-R\1d\16=Å|æê)\ e+¬ã§ø±÷\7f½}õwX@\11Ö|d\8b°þü|Ü`½|ñxú     ä2ýÌ÷ö½|<l°N\7fi¹ã'Ëg®\9eìÅso!{wyzn°&ûB²æ0ûRäd_HÖ\1cf_\86LöEdÏaö¥Èɾ\90¬9̾\14\17\925\87Ù\97"'ûB²æ û\12àd_ÀÕ\14e_J;g_È]\8faö¥ÀɾP¬9̾\14\17\925\87Ù\97!\93}\11Ùs\98})r²/$k\ e³/ENö\85dÍaöeÈd_Dö\1cf_\8a\9cì\vÉ\9aÃìK\91\93}!Ys\98})r²/$k\ e³/C&û"²ç0ûRäd_HÖ\1cf_\8a\9cì\vÉ\9aÃìË\90ɾ\88ì9̾\14\17\925\87Ù\97"'ûB²æ0ûRäd_HÖ\1cf_\86LöEdÏaö¥Èɾ\90¬9ʾ\94xξ\10¼\1e£ìKyçì\v½ë1̾\f\98ì\8bÄ\9eÃìK\91\93}!Ys\98})r²/$k\ e³/C&û"²ç0ûRäd_HÖ\1cf_\8a\9cì\vÉ\9aÃìK\91\93}!Ys\98}\19\17\91=\87Ù\97"'ûB²æ0ûRäd_HÖ\1cf_\86LöEdÏaö¥Èɾ\90¬9̾\14\17\925\87Ù\97"'ûB²æ0û\12äʾ\80Üæ0ûRäd_HÖ\1cf_\8a\9cì\vÉ\9aÃìK\91\93}!Ys\94}\19q²/\ 2k\8c²/å\9d³/ô®Ç0ûRàd_(Ö\1cf_\86LöEdÏaö¥Èɾ\90¬9̾\14\17\925\87Ù\97"'ûB²æ0û2d²/"{\ e³/ENö\85dÍaö¥Èɾ\90¬9̾\f\99ì\8bÈ\9eÃìK\91\93}!Ys\98})r²/$k\ e³/ENö\85dÍaöeÈd_Dö\1cf_\8a\9cì\vÉ\9aÃìK\91\93}!Ys\98})r²/$k\ e³/C&û"²ç0ûRäd_HÖ\1ce_J<g_\b^\8fQöe¼É¾È«1̾\14\17\8a5\87Ù\97"'ûB²æ0ûRäd_HÖ\1cf_\86LöEdÏaö¥Èɾ\90¬9̾\14\17\925\87Ù\97"'ûB²æ0û2d²/"{\ e³/ENö\85dÍaö¥Èɾ\90¬9̾\ 4¹²/ ·9̾\14\17\925\87Ù\97"'ûB²æ0û:®\99TöEO1\9f¹z\8aWw\aÙ×ñSüØ»·N\7f\9c=\9eþO\95²¯ùHe_\1f¾}ûðwõõþÛ\9f\93\7fýr÷óççâ\927§ÿÞ\8b²?Éý\8b\87Ó¯éó¿f«ÿ\80\87Ìg®\1eò°ÿ¸}\8aãþ\ 3É\9aÃþÃ\90é?\88ì9ì?\14\a\925\87ý\87"§ÿ@²æ°ÿ0dú\ f"{\ eû\ fENÿ\81dÍaÿ¡Èé?\90¬9ì?\14\a\925\87ý\87\7f\10ÙsØ\7f(rú\ f$k\ eû\ fENÿ\81dÍaÿaÈô\1f\1cö\1f\8a\9cþ\ 3É\9aÃþC\91Ó\7f YsØ\7f(rú\ f$k\ eû\ fC¦ÿ ²ç°ÿPäô\1f\1cõ\1fJ<÷\1f\b^\8fQÿ¡¼sÿ\81Þõ\18ö\1f\ 6LÿAbÏaÿ¡Èé?\90¬9ì?\14\a\925\87ý\87\7f\10ÙsØ\7f(rú\ f$k\ eû\ fENÿ\81dÍaÿ¡Èé?\90¬9ì?\f\99þ\83È\9eÃþC\91Ó\7f YsØ\7f(rú\ f$k\ eû\ fC¦ÿ ²ç°ÿPäô\1f\1cö\1f\8a\9cþ\ 3É\9aÃþC\91Ó\7f YsØ\7f\b\1f@nsØ\7f(rú\ f$k\ eû\ fENÿ\81dÍaÿ¡Èé?\90¬9ê?\8c\a\815Fý\87òÎý\az×cØ\7f(pú\ f\14k\ eû\ fC¦ÿ ²ç°ÿPäô\1f\1cö\1f\8a\9cþ\ 3É\9aÃþC\91Ó\7f YsØ\7f\18\a\91=\87ý\87"§ÿ@²æ°ÿPäô\1f\1cö\1f\86LÿAdÏaÿ¡Èé?\90¬9ì?\14\a\925\87ý\87"§ÿ@²æ°ÿ0dú\ f"{\ eû\ fENÿ\81dÍaÿ¡Èé?\90¬9ì?\14\a\925\87ý\87\7f\10ÙsØ\7f(rú\ f$k\8eú\ f%\9eû\ f\ 4¯Ç¨ÿ0Þô\1fäÕ\18ö\1f
+\9cþ\ 3Å\9aÃþC\91Ó\7f YsØ\7f(rú\ f$k\ eû\ fC¦ÿ ²ç°ÿPäô\1f\1cö\1f\8a\9cþ\ 3É\9aÃþC\91Ó\7f YsØ\7f\18\a\91=\87ý\87"§ÿ@²æ°ÿPäô\1f\1cö\1f\82\a\90Û\1cö\1f\8a\9cþ\ 3É\9aÃþC\91Ó\7f YsØ\7f\1c·\fªÿ §\98Ï\=Åaÿqü\14?öÚ\9f\87§?>\1f°ÿ\98\8fTÿñåã\7f}üðõãá\9b\7fÞ½~q÷øæ§Ëúí\9b\7fÞ¾}8zóO^Ý\ 2\ f\97Ï\=Üá«[n\9fâøÕ-HÖ\1c¼ºE\80óê\16àj\8a^Ý¢´ó«[\90»\1eÃW·(pÒ\1d\14k\ eÓ\1dENº\83dÍaºcȤ;Dö\1c¦;\8a\9ct\aÉ\9aÃtG\91\93î Ys\98î\18\ e\91=\87é\8e"'ÝA²æ0ÝQä¤;HÖ\1c¦;\8a\9ct\aÉ\9aÃtÇ\90Iw\88ì9Lw\14\ e\925\87é\8e"'ÝA²æ0Ý1dÒ\1d"{\ eÓ\1dENº\83dÍaº£ÈIw\90¬9Lw\14\ e\925\87é\8e!\93î\10Ùs\98î(rÒ\1d$k\8eÒ\1d%\9eÓ\1d\ 4¯Ç(ÝQÞ9ÝAïz\fÓ\1d\ 3&Ý!±ç0ÝQä¤;HÖ\1c¦;\8a\9ct\aÉ\9aÃtÇ\90Iw\88ì9Lw\14\ e\925\87é\8e"'ÝA²æ0ÝQä¤;HÖ\1c¦;\86LºCdÏaº£ÈIw\90¬9Lw\14\ e\925\87é\8e!\93î\10Ùs\98î(rÒ\1d$k\ eÓ\1dENº\83dÍaº£ÈIw\90¬9Lw\ 4¹Ò\1d ·9Lw\14\ e\925\87é\8e"'ÝA²æ0ÝQä¤;HÖ\1c¥;F\9ct\87À\1a£tGyçt\a½ë1Lw\14\ e\8a5\87é\8e!\93î\10Ùs\98î(rÒ\1d$k\ eÓ\1dENº\83dÍaº£ÈIw\90¬9Lw\f\99t\87È\9eÃtG\91\93î Ys\98î(rÒ\1d$k\ eÓ\1dC&Ý!²ç0ÝQä¤;HÖ\1c¦;\8a\9ct\aÉ\9aÃtG\91\93î Ys\98î\18\ e\91=\87é\8e"'ÝA²æ0ÝQä¤;HÖ\1c¦;\8a\9ct\aÉ\9aÃtÇ\90Iw\88ì9Lw\14\ e\925Gé\8e\12Ïé\ e\82×c\94î\18\1dòj\fÓ\1d\ 5\83bÍaº£ÈIw\90¬9Lw\14\ e\925\87é\8e!\93î\10Ùs\98î(rÒ\1d$k\ eÓ\1dENº\83dÍaº£ÈIw\90¬9Lw\f\99t\87È\9eÃtG\91\93î Ys\98î(rÒ\1d$k\ eÓ\1dA®t\aÈm\ eÓ\1dENº\83dÍaº£ÈIw\90¬9Lw\8es\14\95îÐSÌg®\9eâÕýAºsü\14§¿Y¾{ñðôsí«Óß\91ß<ÿz\97ÇÓ\8fBO\7f\7fýâÝËÇõ4O_\ 5vy\9a\13túqi>òô4\9f>}:x\9cËN¨ÿ\ 5\7fsøÖendstream
+endobj
+2968 0 obj <<
+/Type /Page
+/Contents 2969 0 R
+/Resources 2967 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+/Annots [ 2971 0 R 2972 0 R 2973 0 R 2974 0 R 2975 0 R 2976 0 R 2977 0 R 2978 0 R 2979 0 R 2980 0 R 2981 0 R 2982 0 R 2983 0 R 2984 0 R 2985 0 R 2986 0 R 2987 0 R 2988 0 R 2989 0 R 2990 0 R 2991 0 R 2992 0 R 2993 0 R 2994 0 R 2995 0 R 2996 0 R 2997 0 R 2998 0 R 2999 0 R 3000 0 R 3001 0 R 3002 0 R 3003 0 R 3004 0 R 3005 0 R 3006 0 R 3007 0 R 3008 0 R 3009 0 R 3010 0 R 3011 0 R 3012 0 R 3013 0 R 3014 0 R 3015 0 R 3016 0 R 3017 0 R 3018 0 R 3019 0 R 3020 0 R 3021 0 R 3022 0 R 3023 0 R 3024 0 R 3025 0 R 3026 0 R 3027 0 R 3028 0 R 3029 0 R 3030 0 R 3031 0 R 3032 0 R 3033 0 R 3034 0 R 3035 0 R 3036 0 R 3037 0 R 3038 0 R 3039 0 R 3040 0 R 3041 0 R 3042 0 R 3043 0 R 3044 0 R 3045 0 R 3046 0 R 3047 0 R 3048 0 R 3049 0 R 3050 0 R 3051 0 R 3052 0 R 3053 0 R 3054 0 R 3055 0 R 3056 0 R 3057 0 R 3058 0 R 3059 0 R 3060 0 R 3061 0 R 3062 0 R 3063 0 R 3064 0 R 3065 0 R 3066 0 R 3067 0 R 3068 0 R 3069 0 R 3070 0 R 3071 0 R 3072 0 R 3073 0 R 3074 0 R 3075 0 R 3076 0 R ]
+>> endobj
+2971 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 735.912 159.223 743.214]
+/Subtype /Link
+/A << /S /GoTo /D (15) >>
+>> endobj
+2972 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [517.634 735.912 521.32 743.214]
+/Subtype /Link
+/A << /S /GoTo /D (15) >>
+>> endobj
+2973 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 719.523 327.67 728.26]
+/Subtype /Link
+/A << /S /GoTo /D (18) >>
+>> endobj
+2974 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.601 719.523 521.32 728.26]
+/Subtype /Link
+/A << /S /GoTo /D (18) >>
+>> endobj
+2975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 703.279 249.204 712.629]
+/Subtype /Link
+/A << /S /GoTo /D (21) >>
+>> endobj
+2976 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 703.279 521.32 712.629]
+/Subtype /Link
+/A << /S /GoTo /D (21) >>
+>> endobj
+2977 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 690.328 240.457 699.678]
+/Subtype /Link
+/A << /S /GoTo /D (23) >>
+>> endobj
+2978 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 690.328 521.32 699.678]
+/Subtype /Link
+/A << /S /GoTo /D (23) >>
+>> endobj
+2979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 677.376 289.781 686.726]
+/Subtype /Link
+/A << /S /GoTo /D (148) >>
+>> endobj
+2980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 677.376 521.32 686.726]
+/Subtype /Link
+/A << /S /GoTo /D (148) >>
+>> endobj
+2981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 666.378 252.801 673.775]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_intro) >>
+>> endobj
+2982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 666.378 521.32 673.775]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_intro) >>
+>> endobj
+2983 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 651.473 319.131 660.823]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api) >>
+>> endobj
+2984 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 651.473 521.32 660.823]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api) >>
+>> endobj
+2985 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 638.522 360.466 647.872]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-dev-and-msg) >>
+>> endobj
+2986 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 638.522 521.32 647.872]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-dev-and-msg) >>
+>> endobj
+2987 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 625.571 324.68 634.92]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-fops) >>
+>> endobj
+2988 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 625.571 521.32 634.92]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-fops) >>
+>> endobj
+2989 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 612.619 213.051 621.516]
+/Subtype /Link
+/A << /S /GoTo /D (222) >>
+>> endobj
+2990 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 612.619 521.32 621.516]
+/Subtype /Link
+/A << /S /GoTo /D (222) >>
+>> endobj
+2991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 601.62 213.35 609.018]
+/Subtype /Link
+/A << /S /GoTo /D (261) >>
+>> endobj
+2992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 601.62 521.32 609.018]
+/Subtype /Link
+/A << /S /GoTo /D (261) >>
+>> endobj
+2993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 588.669 211.945 596.066]
+/Subtype /Link
+/A << /S /GoTo /D (287) >>
+>> endobj
+2994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 588.669 521.32 596.066]
+/Subtype /Link
+/A << /S /GoTo /D (287) >>
+>> endobj
+2995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 575.718 215.452 583.115]
+/Subtype /Link
+/A << /S /GoTo /D (329) >>
+>> endobj
+2996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 575.718 521.32 583.115]
+/Subtype /Link
+/A << /S /GoTo /D (329) >>
+>> endobj
+2997 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 561.675 259.356 570.163]
+/Subtype /Link
+/A << /S /GoTo /D (372) >>
+>> endobj
+2998 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 561.675 521.32 570.163]
+/Subtype /Link
+/A << /S /GoTo /D (372) >>
+>> endobj
+2999 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 548.061 314.34 557.212]
+/Subtype /Link
+/A << /S /GoTo /D (421) >>
+>> endobj
+3000 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 548.061 521.32 557.212]
+/Subtype /Link
+/A << /S /GoTo /D (421) >>
+>> endobj
+3001 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 535.11 312.696 544.26]
+/Subtype /Link
+/A << /S /GoTo /D (466) >>
+>> endobj
+3002 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 535.11 521.32 544.26]
+/Subtype /Link
+/A << /S /GoTo /D (466) >>
+>> endobj
+3003 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 523.912 294.494 531.309]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_arch) >>
+>> endobj
+3004 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 523.912 521.32 531.309]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_arch) >>
+>> endobj
+3005 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 509.008 359.15 518.358]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_history) >>
+>> endobj
+3006 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 509.008 521.32 518.358]
+/Subtype /Link
+/A << /S /GoTo /D (lincan_history) >>
+>> endobj
+3007 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 498.009 279.45 505.406]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-internals) >>
+>> endobj
+3008 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 498.009 521.32 505.406]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-internals) >>
+>> endobj
+3009 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 485.058 330.119 492.455]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-main) >>
+>> endobj
+3010 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 485.058 521.32 492.455]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-main) >>
+>> endobj
+3011 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 471.015 290.539 479.503]
+/Subtype /Link
+/A << /S /GoTo /D (637) >>
+>> endobj
+3012 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 471.015 521.32 479.503]
+/Subtype /Link
+/A << /S /GoTo /D (637) >>
+>> endobj
+3013 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 458.064 274.848 466.552]
+/Subtype /Link
+/A << /S /GoTo /D (666) >>
+>> endobj
+3014 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 458.064 521.32 466.552]
+/Subtype /Link
+/A << /S /GoTo /D (666) >>
+>> endobj
+3015 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 444.251 265.553 453.6]
+/Subtype /Link
+/A << /S /GoTo /D (751) >>
+>> endobj
+3016 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 444.251 521.32 453.6]
+/Subtype /Link
+/A << /S /GoTo /D (751) >>
+>> endobj
+3017 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 431.299 262.495 440.649]
+/Subtype /Link
+/A << /S /GoTo /D (897) >>
+>> endobj
+3018 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 431.299 521.32 440.649]
+/Subtype /Link
+/A << /S /GoTo /D (897) >>
+>> endobj
+3019 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 419.209 266.36 427.244]
+/Subtype /Link
+/A << /S /GoTo /D (976) >>
+>> endobj
+3020 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 419.209 521.32 427.244]
+/Subtype /Link
+/A << /S /GoTo /D (976) >>
+>> endobj
+3021 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 405.396 279.092 414.746]
+/Subtype /Link
+/A << /S /GoTo /D (1018) >>
+>> endobj
+3022 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 405.396 521.32 414.746]
+/Subtype /Link
+/A << /S /GoTo /D (1018) >>
+>> endobj
+3023 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 392.445 284.552 401.795]
+/Subtype /Link
+/A << /S /GoTo /D (1081) >>
+>> endobj
+3024 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 392.445 521.32 401.795]
+/Subtype /Link
+/A << /S /GoTo /D (1081) >>
+>> endobj
+3025 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 379.493 311.48 388.843]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-board) >>
+>> endobj
+3026 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 379.493 521.32 388.843]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-board) >>
+>> endobj
+3027 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 366.542 284.831 375.892]
+/Subtype /Link
+/A << /S /GoTo /D (1191) >>
+>> endobj
+3028 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 366.542 521.32 375.892]
+/Subtype /Link
+/A << /S /GoTo /D (1191) >>
+>> endobj
+3029 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 353.591 282.988 362.94]
+/Subtype /Link
+/A << /S /GoTo /D (1228) >>
+>> endobj
+3030 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 353.591 521.32 362.94]
+/Subtype /Link
+/A << /S /GoTo /D (1228) >>
+>> endobj
+3031 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 340.639 260.104 349.989]
+/Subtype /Link
+/A << /S /GoTo /D (1261) >>
+>> endobj
+3032 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 340.639 521.32 349.989]
+/Subtype /Link
+/A << /S /GoTo /D (1261) >>
+>> endobj
+3033 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 327.688 297.941 337.037]
+/Subtype /Link
+/A << /S /GoTo /D (1295) >>
+>> endobj
+3034 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 327.688 521.32 337.037]
+/Subtype /Link
+/A << /S /GoTo /D (1295) >>
+>> endobj
+3035 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 314.736 303.401 324.086]
+/Subtype /Link
+/A << /S /GoTo /D (1332) >>
+>> endobj
+3036 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 314.736 521.32 324.086]
+/Subtype /Link
+/A << /S /GoTo /D (1332) >>
+>> endobj
+3037 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 301.785 297.573 311.135]
+/Subtype /Link
+/A << /S /GoTo /D (1418) >>
+>> endobj
+3038 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 301.785 521.32 311.135]
+/Subtype /Link
+/A << /S /GoTo /D (1418) >>
+>> endobj
+3039 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 288.833 294.604 298.183]
+/Subtype /Link
+/A << /S /GoTo /D (1460) >>
+>> endobj
+3040 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 288.833 521.32 298.183]
+/Subtype /Link
+/A << /S /GoTo /D (1460) >>
+>> endobj
+3041 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 275.882 302.166 285.232]
+/Subtype /Link
+/A << /S /GoTo /D (1496) >>
+>> endobj
+3042 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 275.882 521.32 285.232]
+/Subtype /Link
+/A << /S /GoTo /D (1496) >>
+>> endobj
+3043 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 262.931 298.659 272.28]
+/Subtype /Link
+/A << /S /GoTo /D (1536) >>
+>> endobj
+3044 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 262.931 521.32 272.28]
+/Subtype /Link
+/A << /S /GoTo /D (1536) >>
+>> endobj
+3045 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 249.979 305.762 259.329]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-chip) >>
+>> endobj
+3046 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 249.979 521.32 259.329]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-chip) >>
+>> endobj
+3047 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 237.028 333.548 246.377]
+/Subtype /Link
+/A << /S /GoTo /D (1574) >>
+>> endobj
+3048 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 237.028 521.32 246.377]
+/Subtype /Link
+/A << /S /GoTo /D (1574) >>
+>> endobj
+3049 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 224.076 335.949 233.426]
+/Subtype /Link
+/A << /S /GoTo /D (1597) >>
+>> endobj
+3050 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 224.076 521.32 233.426]
+/Subtype /Link
+/A << /S /GoTo /D (1597) >>
+>> endobj
+3051 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 211.125 288.448 220.475]
+/Subtype /Link
+/A << /S /GoTo /D (1620) >>
+>> endobj
+3052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 211.125 521.32 220.475]
+/Subtype /Link
+/A << /S /GoTo /D (1620) >>
+>> endobj
+3053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 198.173 308.831 207.523]
+/Subtype /Link
+/A << /S /GoTo /D (1654) >>
+>> endobj
+3054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 198.173 521.32 207.523]
+/Subtype /Link
+/A << /S /GoTo /D (1654) >>
+>> endobj
+3055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 185.222 283.924 194.572]
+/Subtype /Link
+/A << /S /GoTo /D (1697) >>
+>> endobj
+3056 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 185.222 521.32 194.572]
+/Subtype /Link
+/A << /S /GoTo /D (1697) >>
+>> endobj
+3057 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 172.27 257.902 181.62]
+/Subtype /Link
+/A << /S /GoTo /D (1768) >>
+>> endobj
+3058 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 172.27 521.32 181.62]
+/Subtype /Link
+/A << /S /GoTo /D (1768) >>
+>> endobj
+3059 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 159.319 309.917 168.669]
+/Subtype /Link
+/A << /S /GoTo /D (1801) >>
+>> endobj
+3060 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 159.319 521.32 168.669]
+/Subtype /Link
+/A << /S /GoTo /D (1801) >>
+>> endobj
+3061 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 146.368 313.424 155.717]
+/Subtype /Link
+/A << /S /GoTo /D (1837) >>
+>> endobj
+3062 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 146.368 521.32 155.717]
+/Subtype /Link
+/A << /S /GoTo /D (1837) >>
+>> endobj
+3063 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 133.416 282.44 142.766]
+/Subtype /Link
+/A << /S /GoTo /D (1885) >>
+>> endobj
+3064 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 133.416 521.32 142.766]
+/Subtype /Link
+/A << /S /GoTo /D (1885) >>
+>> endobj
+3065 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 120.465 300.014 129.815]
+/Subtype /Link
+/A << /S /GoTo /D (1932) >>
+>> endobj
+3066 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 120.465 521.32 129.815]
+/Subtype /Link
+/A << /S /GoTo /D (1932) >>
+>> endobj
+3067 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 107.513 284.472 116.863]
+/Subtype /Link
+/A << /S /GoTo /D (1961) >>
+>> endobj
+3068 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 107.513 521.32 116.863]
+/Subtype /Link
+/A << /S /GoTo /D (1961) >>
+>> endobj
+3069 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 94.562 283.844 103.912]
+/Subtype /Link
+/A << /S /GoTo /D (2004) >>
+>> endobj
+3070 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 94.562 521.32 103.912]
+/Subtype /Link
+/A << /S /GoTo /D (2004) >>
+>> endobj
+3071 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 81.61 280.706 90.96]
+/Subtype /Link
+/A << /S /GoTo /D (2033) >>
+>> endobj
+3072 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 81.61 521.32 90.96]
+/Subtype /Link
+/A << /S /GoTo /D (2033) >>
+>> endobj
+3073 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 68.659 304.626 78.009]
+/Subtype /Link
+/A << /S /GoTo /D (2062) >>
+>> endobj
+3074 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 68.659 521.32 78.009]
+/Subtype /Link
+/A << /S /GoTo /D (2062) >>
+>> endobj
+3075 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 55.708 294.176 65.057]
+/Subtype /Link
+/A << /S /GoTo /D (2091) >>
+>> endobj
+3076 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 55.708 521.32 65.057]
+/Subtype /Link
+/A << /S /GoTo /D (2091) >>
+>> endobj
+2970 0 obj <<
+/D [2968 0 R /XYZ 71.731 802.878 null]
+>> endobj
+10 0 obj <<
+/D [2968 0 R /XYZ 259.557 753.114 null]
+>> endobj
+2967 0 obj <<
+/Font << /F22 2958 0 R /F27 2966 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3135 0 obj <<
+/Length 40870     
+/Filter /FlateDecode
+>>
+stream
+xÚ\94ÝM\8f\99mç~ý\8alJ\r\85ãû£i\e¾\ 6Ü0`¸z\96A°Ä\94Ä{%RE&}í\7fï\93<k®8ó\8dØ#F¢\1a%\81[óY\f\92'#7ÇÞqóéúô\7f7\9f\9e\9eîn>=_ß^=?=\7fúË?ÿíúÓßN\7fä\7fý·\9buÅýýËÕÃóËé?¿ó\aÿtww}u}÷ôéO÷÷WÏw·ï^sórsuû|÷éOO\ fÏW×÷\8f_/ú\9fþýßþ\87ÿrûôéåêåñîÓ¿ÿõS.Ê5ÿþÃÿõ\87_ÿë÷7×××ÿúî\97ÏÿüùËçÓÿûÏß>ÿúÇ\9b?|ùãÿýïÿÛ¿ý/ÿ¾\8d»ëç«çÛ\9bO\17Â<ÆÍÕõóóÑ\9fÅõé\1c×/|Â\ty«7\a¹¹½z<}!ß9È[u]Ëê\18<P\1f®îï­z¾ö\ 3µ\a\ fÔç«Û\9b\9e¯ý@íÁ÷ÕÛë«\97g©®kY\1d\83\aêÝÕÓãTÏ×~ öà\81úxõpkÕóµ\1f¨=x ¾\ݾ<Hõ|í\aj\ f¾¯ÞÝ^]?Ju]Ëê\18<P¿~nÝKõ|í\aj\ f\1e¨OW\8f×V=_û\81Ú\83ï«÷×WwOwN]ײ:\ 6\ fÔ»«\9b\9e¯ý@íÁ\ 3õáêåæVªçk?P{ð@}¾z|¶êùÚ\ fÔ\1e|_}¸¹º\7f¸qêº\96Õ1x Þ_ÝÞZõ|í\aj\ f\1e¨\8fW//\12ýýÒ\ fÌ\9a; _®\9eägðùÒ\ fÈ\9a{\9f|¼=}LË?Íu-£cð@}8}L[õ|í\aj\ f\1e¨§?ø(¿wY×~ öàûêÓõécZªëZVÇà\81zwú\98\96ß»¬k?P{ð@}<}L[õ|í\aj\ f\1e¨/§\8fiùÏͺö\ 3µ\aßW\9foN\1fÓR]ײ:\ 6\ fÔûÓÇ´üÞe]û\81Ú\83\aêÓécÚªçk?P{ð}õåúô1-¿wYײ:\ 6\ fÔÛÓ\aµUÏ×~ öà\81úpú¬\96ß»¬k?P{ð@}¾z¸³êùÚ\ fÔ\1e|W½¿¾¹º»vß»äZTçà\81z\7fuýdÕóµ\1f¨=x >^=ßßHõ|í\aj\ f\1e¨/W\8f7V=_û\81Ú\83ï«7·Wò\17ºu)\9b=w@>\Ý<Hò÷K? kî\80|:}L¿Hó|í\ah\ f¾¯Þ^\9f>¦¥º®eu\f\1e¨w§\8f\97t]û\81Ú\83\aêãécÚªçk?P{ð@}>}L?Iõ|í\aj\ f¾¯ÞÝ\9c>¦¥º®eu\f\1e¨÷§\8féG©\9e¯ý@íÁ\ 3õéô1mÕóµ\1f¨=ø¾z\7f\98\96\9f\11ëZVÇà\81z{ú\98¶êùÚ\ fÔ\1e<P\1fN\1fÓ÷R=_û\81Ú\83\aêóé\83Úªçk?P{ð}õáæôYí¾wɵ¬\8eÁ\ 3õîêåÖªçk?P{ð@}¼z|\91ß»¬k?P{ð@}¹º\7f´êùÚ\ fÔ\1e|_}¼½º½\93ß»¬kY\1d\83\aêÃÕõµUÏ×~ öà\81út%\7f»¼.ýÀ¬¹÷ɧë«\aùÏêùR&{î\80¼;}LËï]Öµ\1f =x >\9e>¦­z¾ö\ 3µ\a\ fÔçÓÇ´üÞe]û\81Ú\83ï«Ï7§\8fi©®kY\1d\83\aêýécZþí»®ý@íÁ\ 3õéô1mÕóµ\1f¨=x \9e®\97ÿ~,×~ öàûêËíécZªëZVÇà\81úpú\98\96ß»¬k?P{ð@}>}L[õ|í\aj\ f¾«>\ß\9c>¦Ýça®Eu\ e\1e¨w§\ f\9e¯ý@íÁ\ 3õñôYmÕóµ\1f¨=x ¾\ÝÝÜQ0q}ú'á(ûx¸¹¾º½ÿà\e\8b\ty\90»Û7'¹½¹º»¥\83¼F&7·W/\ f7\1fD&§o\8e¯_\1e82Y×Tdòë\97ï\7fúáû_~øî\9fßÿñæ\ f¿þ·÷\1a\93ǯÿVì\15\98Ü>|Ü\98À\ 1wcrqÀãÆäíA 1!u\frc¢Ô4&¨ö 7&JMc\82j\ frcbÔÝ\98\90:\ 6¹1Qj\1a\13T{\90\e\13¥¦1Aµ\a¹1Qj\1a\13T{\90\e\13£îÆ\84Ô1È\8d\89\98 Ú\83Ü\98(5\8d        ª=È\8d\89QwcBê\18äÆD©iLPíAnL\94\9aÆ\ 4Õ\1eäÆD©iLPíAnL\8cº\e\13RÇ 7&JMc\82j\ fbc¢ÐÕ\98 YsØ\98(r5&HÖ\1c7&ÆÜ\8d   ¡c\90\e\13¥¦1Aµ\a¹1Qj\1a\13T{\90\e\13£îÆ\84Ô1È\8d\89\98 Ú\83Ü\98(5\8d      ª=È\8d\89\98 Ú\83Ü\98\18u7&¤\8eAnL\94\9aÆ\ 4Õ\1eäÆD©iLPíAnL\8cº\e\13RÇ 7&JMc\82j\ frc¢Ô4&¨ö 7&JMc\82j\ frc"Ô×Æ\ 4Ô9È\8d\89\98 Ú\83Ü\98(5\8d  ª=È\8d\89\98 Ú\83Ø\98\184\8d        \99=\87\8d\89"Wc\82dÍqc¢Ì4&\88ö 7&FÝ\8d       ©c\90\e\13¥¦1Aµ\a¹1Qj\1a\13T{\90\e\13¥¦1Aµ\a¹11ênLH\1d\83Ü\98(5\8d      ª=È\8d\89\98 Ú\83Ü\98\18u7&¤\8eAnL\94\9aÆ\ 4Õ\1eäÆD©iLPíAnL\94\9aÆ\ 4Õ\1eäÆĨ»1!u\frc¢Ô4&¨ö 7&JMc\82j\ frc¢Ô4&¨ö 7&FÝ\8d   ©c\90\e\13¥¦1Aµ\a±1QèjLЬ9lL\f\99Æ\84È\9eãÆD\99iL\10íAnL\94\9aÆ\ 4Õ\1eäÆD©iLPíAnL\8cº\e\13RÇ 7&JMc\82j\ frc¢Ô4&¨ö 7&JMc\82j\ frcbÔÝ\98\90:\ 6¹1Qj\1a\13T{\90\e\13¥¦1Aµ\a¹1\11êkc\ 2ê\1cäÆD©iLPíAnL\94\9aÆ\ 4Õ\1eäÆä8\98p\8d     \1d$\8dÉÅA\8e\e\93ã\83\8cÆä£\17\99ÜÝþþ¯\a±1Y×Tcò\97?>ýá\1f\9f¿ÿå»\9fÿã¿~þË\97_çAo_N¿Ò|½#ð
+¼ý\92]\9fþ|ßÿ\92ýþ?\7f¼á\ 3æ¢Ë\ 3^½=Èé\17\9f»\9b÷\ eò\8ez¾ö\ 3µ\aß¿+yúGèQ\99ç+Qì±\ 3ïôËÎ\93\ 4\7f¿ô\ 3±æ\ eÈÓ¯9w/Ò<_û\ 1Ú\83\aêê\8a\94\9aP       Õ\1eäPɨ;T"u\fr¨¤Ô\84J¨ö \87JJM¨\84j\ fr¨dÔ\1d*\91:\ 69TRjB%T{\90C%¥&TBµ\a9TRjB%T{\90C%£îP\89Ô1È¡\92R\13*¡Ú\83\1c*)5¡\12ª=È¡\92Qw¨Dê\18äPI©   \95PíA\ e\95\94\9aP       Õ\1eäPI©  \95PíA\ e\95\8cºC%RÇ \87JJM¨\84j\ fb¨¤Ð\15*¡Ys\18*)r\85JHÖ\1c\87JÆÜ¡\12¡c\90C%¥&TBµ\a9TRjB%T{\90C%£îP\89Ô1È¡\92R\13*¡Ú\83\1c*)5¡\12ª=È¡\92R\13*¡Ú\83\1c*\19u\87\8eA\ e\95\94\9aP       Õ\1eäPI©  \95PíA\ e\95\8cºC%RÇ \87JJM¨\84j\ fr¨¤Ô\84J¨ö \87JJM¨\84j\ fr¨$Ô×P    Ô9È¡\92R\13*¡Ú\83\1c*)5¡\12ª=È¡\92R\13*¡Ú\83\18*\19\12\99=\87¡\92"W¨\84dÍq¨¤Ì\84J\88ö \87JFÝ¡\12©c\90C%¥&TBµ\a9TRjB%T{\90C%¥&TBµ\a9T2ê\ e\95H\1d\83\1c*)5¡\12ª=È¡\92R\13*¡Ú\83\1c*\19u\87\8eA\ e\95\94\9aP        Õ\1eäPI©  \95PíA\ e\95\94\9aP       Õ\1eäPɨ;T"u\fr¨¤Ô\84J¨ö \87JJM¨\84j\ fr¨¤Ô\84J¨ö \87JFÝ¡\12©c\90C%¥&TBµ\a1TRè
+\95Ь9\f\95\f\99P\89È\9eãPI\99       \95\10íA\ e\95\94\9aP       Õ\1eäPI©  \95PíA\ e\95\8cºC%RÇ \87JJM¨\84j\ fr¨¤Ô\84J¨ö \87JJM¨\84j\ fr¨dÔ\1d*\91:\ 69TRjB%T{\90C%¥&TBµ\a9T\12êk¨\ 4ê\1cäPI©   \95PíA\ e\95\94\9aP       Õ\1eäP\89ª\e\13*ÑA\12*]\1cäîî(T:>È7¾\fçæåêæå\96C¥uM\87J?ÿôçëëÛ¿}÷ã/ÿù¶Rz~¼z~|ý_¾ûõz>ü\99Q·§O³§\87[>Ýù¢>Ý;\95Òé\97öÛÛ÷\ eòN¥t¾\96Õ1x Þ]ݾXõ|í\aj\ f\1e¨+ÛRj:0T{\90;0¥¦\ 3\a©\ 3\13f:0\10{\f;0\ 5®\ e\fÅ\9aã\ eL\99éÀ\10íAîÀ\94\9a\ e\fÕ\1eä\ ę»\ 3#u\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\afÔÝ\81\91:\ 6¹\ 3Sj:0T{\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0£î\ e\8cÔ1È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qw\a\18ä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\8cº;0RÇ w`JM\a\86j\ fb\a¦ÐÕ\81¡YsØ\81)ru`HÖ\1cw`ÆÜ\1d\18¡c\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0£î\ e\8cÔ1È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uw`¤\8eAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\8cº;0RÇ w`JM\a\86j\ fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a&Ô×\ e\fÔ9È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ø\81\194\1d\18\99=\87\1d\98"W\a\86dÍq\a¦Ìt`\88ö w`FÝ\1d\18©c\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0¥¦\ 3\a¹\ 33êîÀH\1d\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uw`¤\8eAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ ę»\ 3#u\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a¦Ôt`¨ö w`FÝ\1d\18©c\90;0¥¦\ 3\a±\ 3SèêÀЬ9ìÀ\f\99\ e\8cÈ\9eã\ eL\99éÀ\10íAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\8cº;0RÇ w`JM\a\86j\ fr\a¦Ôt`¨ö w`JM\a\86j\ fr\afÔÝ\81\91:\ 6¹\ 3Sj:0T{\90;0¥¦\ 3\a¹\ 3\13êk\a\ 6ê\1cä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ e\8cº&Ó\81ÑAÒ\81]\1cä¸\ 3;>È7v`§?ýÛû\eîÀÖ5Õ\81ýøË\7f~÷ß\7fùñËçïþþõ§¢ýôÃ?>ÿò^|p\7fÿôé\ 2yûe;ýÊ{ðsÑv\8e\0gÜ9ÂÅ\19\8fs\84·ç\80\1c\ 1Õ\1eä\1cA©É\11PíAÎ\11\94\9a\1c\ 1Õ\1eä\1cÁ¨;G u\fr\8e Ôä\b¨ö ç\bJM\8e\80j\ fr\8e\9d#\90:\ 69GPjr\ 4T{\90s\ 4¥&G@µ\a9GPjr\ 4T{\90s\ 4£î\1c\81Ô1È9\82R\93# Ú\83\98#(tå\b\1cæ\b\8a\9\ 2\925Ç9\821w\8e\18ä\1cA©É\11PíAÎ\11\94\9a\1c\ 1Õ\1eä\1cÁ¨;G u\fr\8e Ôä\b¨ö ç\bJM\8e\80j\ fr\8e Ôä\b¨ö ç\bFÝ9\ 2©c\90s\ 4¥&G@µ\a9GPjr\ 4T{\90s\ 4£î\1c\81Ô1È9\82R\93# Ú\83\9c#(59\ 2ª=È9\82R\93# Ú\83\9c#\bõ5G\0u\ er\8e Ôä\b¨ö ç\bJM\8e\80j\ fr\8e Ôä\b¨ö æ\b\ 6M\8e@fÏa\8e È\95# Ys\9c#(39\ 2¢=È9\82Qw\8e\18ä\1cA©É\11PíAÎ\11\94\9a\1c\ 1Õ\1eä\1cA©É\11PíAÎ\11\8cºs\ 4RÇ ç\bJM\8e\80j\ fr\8e Ôä\b¨ö ç\bFÝ9\ 2©c\90s\ 4¥&G@µ\a9GPjr\ 4T{\90s\ 4¥&G@µ\a9G0êÎ\11H\1d\83\9c#(59\ 2ª=È9\82R\93# Ú\83\9c#(59\ 2ª=È9\82Qw\8e\18ä\1cA©É\11PíAÌ\11\14ºr\ 44k\ es\ 4C&G ²ç8GPfr\ 4D{\90s\ 4¥&G@µ\a9GPjr\ 4T{\90s\ 4£î\1c\81Ô1È9\82R\93# Ú\83\9c#(59\ 2ª=È9\82R\93# Ú\83\9c#\18\b¤\8e\11\94\9a\1c\ 1Õ\1eä\1cA©É\11PíAÎ\11\84ú\9a#\80:\a9GPjr\ 4T{\90s\ 4¥&G@µ\a9G \7f¯nr\ 4:Hr\84\8b\83ÜÝ\1få\bÇ\aù¶\9f\9fõøõ\85'§ßBS\8e\90kÞä\b\7fÿþÝ
+áöëÿîô\9bÆ\8bíy\80\9bÓï*\1f\ e\7ftÖzQ\v\9d-\17]\9eíðE-ï\1cäøE-¬ö ¾¨Å©ëE-¬ö ¼¨Å\98ëE-$ö\18½¨Å\81ç\17µ°Xsø¢\16\17µ0Ú\83ø¢\16§®\17µ°Ú\83ø¢\16¥æE-¨\8eA|Q\8b\8bZXíA|Q\8b\8bZXíA|Q\8bRSF¡:\ 6±\8crê*£XíA,£\9cºÊ(V{\10Ë(§®2\8aÕ\1eÄ2J©)£P\1d\83XF9u\95Q¬ö \96QN]e\14«=\88e\94RSF¡:\ 6±\8crê*£XíA,£\9cºÊ(V{\10Ë(§®2\8aÕ\1eÄ2J©)£P\1d\83XF9u\95Q¬ö \95Q\ e=\97QlÖ\1c\95Q\8e<\97QLÖ\1c\96QÊL\19\85è\18Ä2Ê©«\8c\a±\8crê*£XíA,£\94\9a2
+Õ1\88e\94SW\19Åj\ fb\19åÔUF±Ú\83XF9u\95Q¬ö \96QJM\19\85ê\18Ä2Ê©«\8c\a±\8crê*£XíA,£\94\9a2
+Õ1\88e\94SW\19Åj\ fb\19åÔUF±Ú\83XF9u\95Q¬ö \96QFÝe\14©s\10Ë(§®2\8aÕ\1eÄ2Ê©«\8c\a±\8crê*£XíA*£\14ºÊ(4{\8eÊ(G\9eË(&k\ eË(g®2\8aÑ\1eÄ2J©)£P\1d\83XF9u\95Q¬ö \96QN]e\14«=\88e\94SW\19Åj\ fb\19¥Ô\94\8eA,£\9cºÊ(V{\10Ë(§®2\8aÕ\1eÄ2J©)£P\1d\83XF9u\95Q¬ö \96QN]e\14«=\88e\94SW\19Åj\ fb\19¥Ô\94\8eA,£\9cºÊ(V{\10Ë(§®2\8aÕ\1eÄ2Ê©«\8c\a±\8cRjÊ(TÇ \96QN]e\14«=He\94CÏe\14\9b5Ge\94"W\19\85dÏa\19åÌUF1Ú\83XF9u\95Q¬ö \96QN]e\14«=\88e\94RSF¡:\ 6±\8crê*£XíA,£\9cºÊ(V{\10Ë(§®2\8aÕ\1eÄ2J©)£P\1d\83XF9u\95Q¬ö \96QN]e\14«=\88e\94Qw\19\1cÄ2Ê©«\8c\a±\8crê*£XíA,£ õQe\14\1ed]ty\90Ã2
+\ eòm/jy|¾¾º»{æ2j]SeÔ\7fÿãÍó\1f¾ÿo\9f\7fû×w_þß·?°ëéêöáöÓÅú;oh¹¾Á\1fØõÁérÑåé\ e\7f`×;\a\81\8e\81]NM\a\86j\ fr\a¦Ôt`¨ö w`JM\a\86j\ fR\a&Ìt` ö\18v`
+\\1d\18\8a\1d\98\81\83Ü\81)5\1d\18ª=È\1d\98Qw\a\18ä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ ę»\ 3#u\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a¦Ôt`¨ö w`FÝ\1d\18©c\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0£î\ e\8cÔ1È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uw`¤\8eAîÀ\94\9a\ e\fÕ\1eÄ\ eL¡«\ 3C³æ°\ 3SäêÀ\90¬9îÀ\8c¹;0BÇ w`JM\a\86j\ fr\a¦Ôt`¨ö w`FÝ\1d\18©c\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0¥¦\ 3\a¹\ 33êîÀH\1d\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uw`¤\8eAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ eL¨¯\1d\18¨s\90;0¥¦\ 3\a¹\ 3Sj:0T{\90;0¥¦\ 3\a±\ 33h:02{\ e;0E®\ e\fÉ\9aã\ eL\99éÀ\10íAîÀ\8cº;0RÇ w`JM\a\86j\ fr\a¦Ôt`¨ö w`JM\a\86j\ fr\afÔÝ\81\91:\ 6¹\ 3Sj:0T{\90;0¥¦\ 3\a¹\ 33êîÀH\1d\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qw\a\18ä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\8cº;0RÇ w`JM\a\86j\ fb\a¦ÐÕ\81¡YsØ\81\192\1d\18\91\1d\98\81\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uw`¤\8eAîÀ\94\9a\ e\fÕ\1eä\ eL©éÀPíAîÀ\94\9a\ e\fÕ\1eä\ ę»\ 3#u\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a&Ô×\ e\fÔ9È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\18uM¦\ 3£\83¤\ 3»8ÈÝÃQ\av|\90o|CÖé\97Û»çGîÀÖ5Õ\81ýùúúö\1fÿøî/\7f|úÃß\7füׯÿúü\97\9fÿxó\87\7fýú6,9ý\ eòuãý¯ÜÓÑWî55\81sîÔäâ\9cÇ©ÉÛ\83@jBê\18äÔD©IMPíANM\94\9aÔ\ 4Õ\1eäÔĨ;5!u\frj¢Ô¤&¨ö §&JMj\82j\ frj¢Ô¤&¨ö §&FÝ©      ©c\90S\13¥&5Aµ\a95QjR\13T{\90S\13£îÔ\84Ô1È©\89R\93\9a Ú\83\9c\9a(5©      ª=È©\89R\93\9a Ú\83\9c\9a\18u§&¤\8eANM\94\9aÔ\ 4Õ\1eÄÔD¡+5A³æ05QäJM\90¬9NM\8c¹S\13BÇ §&JMj\82j\ frj¢Ô¤&¨ö §&FÝ©   ©c\90S\13¥&5Aµ\a95QjR\13T{\90S\13¥&5Aµ\a951êNMH\1d\83\9c\9a(5©      ª=È©\89R\93\9a Ú\83\9c\9a\18u§&¤\8eANM\94\9aÔ\ 4Õ\1eäÔD©IMPíANM\94\9aÔ\ 4Õ\1eäÔD¨¯©     ¨s\90S\13¥&5Aµ\a95QjR\13T{\90S\13¥&5Aµ\a151hR\132{\ eS\13E®Ô\ 4É\9aãÔD\99IM\10íANM\8cºS\13RÇ §&JMj\82j\ frj¢Ô¤&¨ö §&JMj\82j\ frjbÔ\9d\9a\90:\ 695QjR\13T{\90S\13¥&5Aµ\a951êNMH\1d\83\9c\9a(5©        ª=È©\89R\93\9a Ú\83\9c\9a(5©        ª=È©\89QwjBê\18äÔD©IMPíANM\94\9aÔ\ 4Õ\1eäÔD©IMPíANM\8cºS\13RÇ §&JMj\82j\ fbj¢Ð\95\9a Ys\98\9a\182©    \91=Ç©\892\93\9a Ú\83\9c\9a(5©        ª=È©\89R\93\9a Ú\83\9c\9a\18u§&¤\8eANM\94\9aÔ\ 4Õ\1eäÔD©IMPíANM\94\9aÔ\ 4Õ\1eäÔĨ;5!u\frj¢Ô¤&¨ö §&JMj\82j\ frj"Ô×Ô\ 4Ô9È©\89R\93\9a Ú\83\9c\9a(5©  ª=È©    \ 6\13"5¡\83$5¹8ÈÝãQjr|\90?Ý}ýnìëG2½rèëÿþ÷\9bC\ f÷W÷§¿ÁÞMMÖE¹æë\89N\1f©W÷W\7füÓíÓó\1fþç¯o\1dú\1fÿ÷ó\7fù?~ûüÛç_×\1føù\9fÿüãÍ\1f~þéü_ÿÏ/¿üö\97/¿ý\92?üýO?\9cÿÃ\7fùí§¿|ùñç\9f~}{\7fâåêúëÍë×Ó½ýqn\8f÷w\a_ï×\9b\aðg·o\1e\üÙ\1dß<x{\10¸y\80j\ fòÍ\ 3¥ææ\ 1ª=È7\ f\94\9a\9b\a¨ö ß<0ê¾y@ê\18ä\9b\aJÍÍ\ 3T{\90o\1e(57\ fPíA¾y`Ô}ó\80Ô1È7\ f\94\9a\9b\a¨ö ß<Pjn\1e Ú\83|ó@©¹y\80j\ fòÍ\ 3£î\9b\a¤\8eA¾y ÔÜ<@µ\aùæ\81Rsó\0Õ\1eä\9b\aJÍÍ\ 3T{\90o\1e\18uß< u\fòÍ\ 3¥ææ\ 1ª=\887\ f\14ºn\1e YsxóÀ\90¹y@dÏñÍ\ 3eææ\ 1¢=È7\ f\94\9a\9b\a¨ö ß<Pjn\1e Ú\83|óÀ¨ûæ\ 1©c\90o\1e(57\ fPíA¾y ÔÜ<@µ\aùæ\81Rsó\0Õ\1eä\9b\aFÝ7\ fH\1d\83|ó@©¹y\80j\ fòÍ\ 3¥ææ\ 1ª=È7\ f\84úzó\0Ô9È7\ f\94\9a\9b\a¨ö ß<Pjn\1e Ú\83|óàø7³îæ\ 1\1d$7\ f.\ er|óàø ßø\9cÊýÍÕýé?às*ë\9aß\9fSùýFÀù÷þ\7fùþ§ÿüíów¿þãç/ß}yûÊâÓ       ¿¾²ø\15\95Åwǯ,¾¿zùè\80¹èò\80Wï½;ù÷÷\1a¿=\b¼(\19Õ\1eä\17%\eu¿(\99Ô1È/JVj^\94\8cj\ fò\8b\92\95\9a\17%£Ú\83ü¢d¥æEɨö ½(Y\98yQ2\88=\86/JVàzQ2\8a5Ç/JVf^\94\8ch\ fò\8b\92\95\9a§×PíA~zͨûé5RÇ ?½¦Ô<½\86j\ fòÓkJÍÓk¨ö ?½fÔýô\1a©c\90\9f^Sj\9e^Cµ\aùé5¥æé5T{\90\9f^Sj\9e^Cµ\aùé5£î§×H\1d\83üô\9aRóô\1aª=ÈO¯)5O¯¡Ú\83üô\9aQ÷Ók¤\8eA~zM©yz\rÕ\1eä§×\94\9a§×PíA~zM©yz\rÕ\1eä§×\8cº\9f^#u\fòÓkJÍÓk¨ö >½¦Ðõô\1a\9a5\87O¯)r=½\86dÍñÓkÆÜO¯\11:\ 6ùé5¥æé5T{\90\9f^Sj\9e^Cµ\aùé5£î§×H\1d\83üô\9aRóô\1aª=ÈO¯)5O¯¡Ú\83üô\9aRóô\1aª=ÈO¯\19u?½Fê\18ä§×\94\9a§×PíA~zM©yz\rÕ\1eä§×\8cº\9f^#u\fòÓkJÍÓk¨ö ?½¦Ô<½\86j\ fòÓkJÍÓk¨ö ?½&Ôק×@\9d\83üô\9aRóô\1aª=ÈO¯)5O¯¡Ú\83üô\9aRóô\1aª=\88\194O¯\91Ùsøô\9a"×ÓkHÖ\1c?½¦Ì<½\86h\ fòÓkFÝ\ 1\1a©c\90\ 34¥&@Cµ\a9@Sj\ 24T{\90\ 34¥&@Cµ\a9@3ê\ eÐH\1d\83\1c )5\ 1\1aª=È\ 1\9aR\13 ¡Ú\83\1c \19u\a\8eA\ eÐ\94\9a\0\rÕ\1eä\0M© ÐPíA\ eÐ\94\9a\0\rÕ\1eä\0ͨ;@#u\fr\80¦Ô\ 4h¨ö \ahJM\80\86j\ fr\80¦Ô\ 4h¨ö \ahFÝ\ 1\1a©c\90\ 34¥&@Cµ\a1@Sè
+ÐЬ9\fÐ\f\99\0\8dÈ\9eã\0M\99       Ð\10íA\ eÐ\94\9a\0\rÕ\1eä\0M©        ÐPíA\ eÐ\8cº\ 34RÇ \ahJM\80\86j\ fr\80¦Ô\ 4h¨ö \ahJM\80\86j\ fr\80\1d \91:\ 69@Sj\ 24T{\90\ 34¥&@Cµ\a9@\13êk\80\ 6ê\1cä\0M©   ÐPíA\ eÐ\94\9a\0\rÕ\1eä\0\8dj*\13 ÑA\12 ]\1cä8@;>È\bÐn>\bÐn¿Þìºå\0m]s\10 }}eò_\7f~/A[ß³¼\12ó\1c·WO\ f·\1f&hpÄ\9d ]\1cñ8A{{\10HÐPíANÐ\8cº\134RÇ 'hJM\82\86j\ fr\82¦Ô$h¨ö 'hJM\82\86j\ fR\82&Ì$h ö\18&h
+\      \1a\8a5Ç    \9a2\93 !Ú\83\9c )5     \1aª=È    \9aQw\82\18ä\ 4M©IÐPíANÐ\94\9a\ 4\rÕ\1eä\ 4ͨ;A#u\fr\82¦Ô$h¨ö 'hJM\82\86j\ fr\82¦Ô$h¨ö 'hFÝ \1a©c\90\134¥&ACµ\a9ASj\124T{\90\134£î\ 4\8dÔ1È  \9aR\93 ¡Ú\83\9c )5     \1aª=È    \9aR\93 ¡Ú\83\9c \19u'h¤\8eANÐ\94\9a\ 4\rÕ\1eÄ\ 4M¡+AC³æ0ASäJÐ\90¬9NÐ\8c¹\134BÇ 'hJM\82\86j\ fr\82¦Ô$h¨ö 'hFÝ        \1a©c\90\134¥&ACµ\a9ASj\124T{\90\134¥&ACµ\a9A3êNÐH\1d\83\9c )5      \1aª=È    \9aR\93 ¡Ú\83\9c \19u'h¤\8eANÐ\94\9a\ 4\rÕ\1eä\ 4M©IÐPíANÐ\94\9a\ 4\rÕ\1eä\ 4M¨¯  \1a¨s\90\134¥&ACµ\a9ASj\124T{\90\134¥&ACµ\a1A3h\1242{\ e\134E®\ 4\rÉ\9aã\ 4M\99\10íANÐ\8cº\134RÇ 'hJM\82\86j\ fr\82¦Ô$h¨ö 'hJM\82\86j\ fr\82\9d \91:\ 69ASj\124T{\90\134¥&ACµ\a9A3êNÐH\1d\83\9c )5        \1aª=È    \9aR\93 ¡Ú\83\9c )5     \1aª=È    \9aQw\82\18ä\ 4M©IÐPíANÐ\94\9a\ 4\rÕ\1eä\ 4M©IÐPíANÐ\8cº\134RÇ 'hJM\82\86j\ fb\82¦Ð\95 ¡Ys\98 \19\1a\91=Ç    \9a2\93 !Ú\83\9c )5     \1aª=È    \9aR\93 ¡Ú\83\9c \19u'h¤\8eANÐ\94\9a\ 4\rÕ\1eä\ 4M©IÐPíANÐ\94\9a\ 4\rÕ\1eä\ 4ͨ;A#u\fr\82¦Ô$h¨ö 'hJM\82\86j\ fr\82&Ô×\ 4\rÔ9È   \9aR\93 ¡Ú\83\9c )5     \1aª=È    ÚqMå\124:H\12´\8b\83Ü=\1d%hÇ\aùÆ\ 4íæáêáù\86\13´uÍ×\13uvö·Ï_¾ûñ§¯/A{/\85úý\97·×ýoêÏv§\ 4çÛ\9dÒÅù\8e;¥·\a\81N    Õ\1e¤NI\98é\94@ì1ì\94\14¸:%\14k\8e;%e¦SB´\a¹SRj:%T{\90;%£îN\89Ô1È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN   Õ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJFÝ\9d\12©c\90;%¥¦SBµ\a¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=\88\9d\92BW§\84fÍa§¤ÈÕ)!YsÜ)\19swJ\84\8e\94\94\9aN        Õ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJJM§\84j\ fr§dÔÝ)\91:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92P_;%Pç wJJM§\84j\ fr§¤ÔtJ¨ö wJJM§\84j\ fb§dÐtJdö\1cvJ\8a\\9d\12\92\9d\922Ó)!Ú\83Ü)\19uwJ¤\8e\94\94\9aN    Õ\1eäNI©é\94PíAî\94\94\9aN        Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö wJJM§\84j\ fr§dÔÝ)\91:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹SRj:%T{\90;%£îN\89Ô1È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü)\19uwJ¤\8e\94\94\9aN Õ\1eÄNI¡«SB³æ°S2d:%"{\8e;%e¦SB´\a¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN  Õ\1eäNI¨¯\9d\12¨s\90;%¥¦SBµ\a¹SRj:%T{\90;¥ãêÆuJt\90tJ\17\a\94\8e\ fò\8d?«ñúô\ fÓéàØ)­kÞvJÿúí¸Sº¿zúúíïëþ<Äiüô\výG\9d\12\9cowJ\17ç;î\94Þ\1e\ 4:%T{\90:%a¦S\ 2±Ç°SRàê\94P¬9î\94\94\99N        Ñ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJFÝ\9d\12©c\90;%¥¦SBµ\a¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü)\19uwJ¤\8e\94\94\9aN Õ\1eäNI©é\94PíAî\94\94\9aN        Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö vJ
+]\9d\12\9a5\87\9d\92"W§\84dÍq§dÌÝ)\11:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN      Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö wJJM§\84j\ fr§¤ÔtJ¨ö wJB}í\94@\9d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=\88\9d\92AÓ)\91ÙsØ))ruJHÖ\1cwJÊL§\84h\ fr§dÔÝ)\91:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹SRj:%T{\90;%£îN\89Ô1È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN    Õ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJJM§\84j\ fr§dÔÝ)\91:\ 6¹SRj:%T{\10;%\85®N    Í\9aÃNÉ\90é\94\88ì9î\94\94\99N        Ñ\1eäNI©é\94PíAî\94\94\9aN        Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö wJJM§\84j\ fr§¤ÔtJ¨ö wJFÝ\9d\12©c\90;%¥¦SBµ\a¹SRj:%T{\90;%¡¾vJ ÎAî\94\94\9aN   Õ\1eäNI©é\94PíAî\94\8e«\e×)ÑAÒ)]\1cäîù¨S:>È·½Oéáô\8fð×`\82:¥\ó¶Súþ?~þå¨Tº;ýå¼\7f¼ùt!¼ó5»>ú\9a%§¡\ 3®k.Ïw\98Ó¼s\8cã\9c\86Ñ\1eÄ\9cÆ©+§aµ\a1§Qjr\1aTÇ æ4N]9\r«=\889\8dSWNÃj\ fbN£Ôä4¨\8eAÌi\9cºr\1aV{\10s\1a§®\9c\86Õ\1eÄ\9cÆ©+§aµ\a1§Qjr\1aTÇ æ4N]9\r«=\889\8dSWNÃj\ fbN£Ôä4¨\8eAÌi\9cºr\1aV{\10s\1a§®\9c\86Õ\1eÄ\9cÆ©+§aµ\a1§Qjr\1aTÇ æ4N]9\r«=H9\8dCÏ9\r\9b5G9\8d#Ï9\r\935\879\8d2\93Ó :\ 61§qêÊiXíAÌi\9cºr\1aV{\10s\1a¥&§Au\fbNãÔ\95Ó°Ú\83\98Ó8uå4¬ö æ4N]9\r«=\889\8dR\93Ó :\ 61§qêÊiXíAÌi\9cºr\1aV{\10s\1a¥&§Au\fbNãÔ\95Ó°Ú\83\98Ó8uå4¬ö æ4N]9\r«=\889\8dQwNCê\1cÄ\9cÆ©+§aµ\a1§qêÊiXíAÌi\9cºr\1aV{\90r\1a\85®\9c\ 6Í\9e£\9cÆ\91ç\9c\86É\9aÃ\9cÆ\99+§a´\a1§Qjr\1aTÇ æ4N]9\r«=\889\8dSWNÃj\ fbNãÔ\95Ó°Ú\83\98Ó(59\rªc\10s\1a§®\9c\86Õ\1eÄ\9cÆ©+§aµ\a1§Qjr\1aTÇ æ4N]9\r«=\889\8dSWNÃj\ fbNãÔ\95Ó°Ú\83\98Ó(59\rªc\10s\1a§®\9c\86Õ\1eÄ\9cÆ©+§aµ\a1§qêÊiXíAÌi\94\9a\9c\ 6Õ1\889\8dSWNÃj\ fRNãÐsNÃfÍQN£È\95Ó Ùs\98Ó8så4\8cö æ4N]9\r«=\889\8dSWNÃj\ fbN£Ôä4¨\8eAÌi\9cºr\1aV{\10s\1a§®\9c\86Õ\1eÄ\9cÆ©+§aµ\a1§Qjr\1aTÇ æ4N]9\r«=\889\8dSWNÃj\ fbNcÔ\9dÓ\90:\a1§qêÊiXíAÌi\9cºr\1aV{\10s\1aNC>Îið ë¢Ë\83\1cæ4p\90o{íÏÃé\17\84§Ó?Â\98Ó¬kÞæ4_>ÿúå»\9f\7fûò~Ns{uóøøéBxû\ 3ÊnO\7f\97}\90ÓÀ\ 1\93Ó\\9cï8§y{\fÈi\10íAÎi\94\9a\9c\ 6Õ\1eä\9cƨ;§!u\frN£Ôä4¨ö ç4JMN\83j\ frNcÔ\9dÓ\90:\ 69§Qjr\1aT{\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a£î\9c\86Ô1È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dQwNCê\18ä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\8cºs\1aRÇ ç4JMN\83j\ fbN£Ð\95Ó Ys\98Ó(rå4HÖ\1cç4ÆÜ9\r¡c\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a£î\9c\86Ô1È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uç4¤\8eAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\8cºs\1aRÇ ç4JMN\83j\ frN£Ôä4¨ö ç4JMN\83j\ frN#Ô×\9c\ 6Ô9È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\98Ó\1849\r\99=\879\8d"WN\83dÍqN£Ìä4\88ö ç4FÝ9\r©c\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a¥&§Aµ\a9§1êÎiH\1d\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uç4¤\8eAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ;§!u\frN£Ôä4¨ö ç4JMN\83j\ frN£Ôä4¨ö ç4FÝ9\r©c\90s\1a¥&§Aµ\a1§QèÊiЬ9Ìi\f\99\9c\86È\9eã\9cF\99Éi\10íAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\8cºs\1aRÇ ç4JMN\83j\ frN£Ôä4¨ö ç4JMN\83j\ frNcÔ\9dÓ\90:\ 69§Qjr\1aT{\90s\1a¥&§Aµ\a\11êkN\ 3ê\1cä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cæ8\rq9\r\1d$9ÍÅAî^\8er\9aã\83|ãÛi\1e¿~Ñ\1f8§Y×¼ÍiþúËçÏ\94Ó<Ü>|º\10Þþ\1c­¯¿\eø §\81\ 3&§¹8ßqNóö\18\90Ó Ú\83\9cÓ(59\rª=È9\8dQwNCê\18ä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ;§!u\frN£Ôä4¨ö ç4JMN\83j\ frN£Ôä4¨ö ç4FÝ9\r©c\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a£î\9c\86Ô1È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uç4¤\8eAÎi\94\9a\9c\ 6Õ\1eÄ\9cF¡+§A³æ0§QäÊi\90¬9Îi\8c¹s\1aBÇ ç4JMN\83j\ frN£Ôä4¨ö ç4FÝ9\r©c\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a¥&§Aµ\a9§1êÎiH\1d\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uç4¤\8eAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cF¨¯9\r¨s\90s\1a¥&§Aµ\a9§Qjr\1aT{\90s\1a¥&§Aµ\a1§1hr\1a2{\ es\1a\9c\ 6É\9aã\9cF\99Éi\10íAÎi\8cºs\1aRÇ ç4JMN\83j\ frN£Ôä4¨ö ç4JMN\83j\ frNcÔ\9dÓ\90:\ 69§Qjr\1aT{\90s\1a¥&§Aµ\a9§1êÎiH\1d\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9\8dQwNCê\18ä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\8cºs\1aRÇ ç4JMN\83j\ fbN£Ð\95Ó Ys\98Ó\1829\r\91=Ç9\8d2\93Ó Ú\83\9cÓ(59\rª=È9\8dR\93Ó Ú\83\9cÓ\18uç4¤\8eAÎi\94\9a\9c\ 6Õ\1eä\9cF©ÉiPíAÎi\94\9a\9c\ 6Õ\1eä\9cƨ;§!u\frN£Ôä4¨ö ç4JMN\83j\ frN#Ô×\9c\ 6Ô9È9\8dR\93Ó Ú\83\9cÓ(59\rª=È9Íq\1aâr\1a:Hr\9a\8b\83\1cç4Ç\aùÆ·Ó<\_=\9f¾uÃ\9cf]óÎ\ f{úÛ÷?þ´z\9a?ÞüámRsúsºÿúÛ\8cWå½7ÔÜ\1d%5;ù\80Sîäãâ\94ÇÉÇÛ\83\81j\ frò¡Ô$\1f¨ö '\1fFÝÉ\a©c\90\93\ f¥&ù@µ\a9ùPj\92\ fT{\90\93\ f¥&ù@µ\a9ù0êN>H\1d\83\9c|(5É\aª=ÈÉ\87R\93| Ú\83\9c|\18u'\1f¤\8eAN>\94\9aä\ 3Õ\1eääC©I>PíAN>\94\9aä\ 3Õ\1eääè;ù u\frò¡Ô$\1f¨ö &\1f
+]É\a\9a5\87É\87"Wò\81dÍqòaÌ\9d|\10:\ 69ùPj\92\ fT{\90\93\ f¥&ù@µ\a9ù0êN>H\1d\83\9c|(5É\aª=ÈÉ\87R\93| Ú\83\9c|(5É\aª=ÈÉ\87QwòAê\18ääC©I>PíAN>\94\9aä\ 3Õ\1eääè;ù u\frò¡Ô$\1f¨ö '\1fJMò\81j\ frò¡Ô$\1f¨ö '\1fB}M>@\9d\83\9c|(5É\aª=ÈÉ\87R\93| Ú\83\9c|(5É\aª=\88É\87A\93|\90Ùs\98|(r%\1f\1c'\1fÊLò\81h\ fròaÔ\9d|\90:\ 69ùPj\92\ fT{\90\93\ f¥&ù@µ\a9ùPj\92\ fT{\90\93\ f£îä\83Ô1ÈÉ\87R\93| Ú\83\9c|(5É\aª=ÈÉ\87QwòAê\18ääC©I>PíAN>\94\9aä\ 3Õ\1eääC©I>PíAN>\8cº\93\ fRÇ '\1fJMò\81j\ frò¡Ô$\1f¨ö '\1fJMò\81j\ fròaÔ\9d|\90:\ 69ùPj\92\ fT{\10\93\ f\85®ä\ 3Í\9aÃäÃ\90I>\88ì9N>\94\99ä\ 3Ñ\1eääC©I>PíAN>\94\9aä\ 3Õ\1eääè;ù u\frò¡Ô$\1f¨ö '\1fJMò\81j\ frò¡Ô$\1f¨ö '\1fFÝÉ\a©c\90\93\ f¥&ù@µ\a9ùPj\92\ fT{\90\93\ f¡¾&\1f ÎAN>\94\9aä\ 3Õ\1eääC©I>PíAN>\8eÓ\ 5\97|ÐA\92|\\1cäþú(ù8>È7¾AåôÛ\8fç§[N>Ö5_Oôë\97_~ûË\97?þéöé9ùÇç\1fþöù»7µÇíóé3ÿ뿹y\ 5Þ¾@åñþñàKvûrú5ùö\96\ f\98\8b.\ føæ¯ÝíËÝÕíËí{\ayG=_û\81Ú\83\aêé\17ÚÇ\e©\9e¯ý@íÁ\ 3õôE¿³êùÚ\ fÔ\1e<x]Ì鯤2ÏW¢Øc\aÞùÅ9
+\ïáA±æø=<ÊÌ{x\10íA~\ f\8f\1e\1eT{\90ßÃcÔ\1de\91:\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9Ê2ê\8e²H\1d\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96Qw\94\18ä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(˨;Ê"u\fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYFÝQ\16©c\90£,¥&ÊBµ\a1ÊRè\8a²Ð¬9\8c²\14¹¢,$k\8e£,cî(\8bÐ1ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96Qw\94\18ä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8e²\8cº£,RÇ GYJM\94\85j\ fr\94¥ÔDY¨ö GYFÝQ\16©c\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,¥&ÊBµ\a\12êk\94\ 5ê\1cä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8c²\f\9a(\8bÌ\9eÃ(K\91+ÊB²æ8ÊRf¢,D{\90£,£î(\8bÔ1ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce\19uGY¤\8eA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8e²\8cº£,RÇ GYJM\94\85j\ fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94\1de\91:\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,£î(\8bÔ1ÈQ\96R\13e¡Ú\83\18e)tEYhÖ\1cFY\86L\94EdÏq\94¥ÌDY\88ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYFÝQ\16©c\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,¥&ÊBµ\a9Ê2ê\8e²H\1d\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce õ5Ê\ 2u\ er\94¥ÔDY¨ö GYJM\94\85j\ fr\94u\\18¹(\8b\ e\92(ëâ ÇQÖñA¾1ʺ½?\1dü\86£¬uÍQ\94õÓ\ f¿¾\17\9cþtî?]\0o£¬ÓÊ\87Q\16\1cpGY\17\a<\8e²Þ\1e\ 4¢,T{\90£,¥&ÊBµ\a9ÊRj¢,T{\90¢,a&Ê\ 2±Ç0ÊRà\8a²P¬9\8e²\94\99(\vÑ\1eä(K©\89²PíA\8e²\8cº£,RÇ GYJM\94\85j\ fr\94¥ÔDY¨ö GYFÝQ\16©c\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,¥&ÊBµ\a9Ê2ê\8e²H\1d\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce\19uGY¤\8eA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(˨;Ê"u\fr\94¥ÔDY¨ö FY
+]Q\16\9a5\87Q\96"W\94\85dÍq\94\1de\11:\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9Ê2ê\8e²H\1d\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96Qw\94\18ä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(˨;Ê"u\fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYB}\8d²@\9d\83\1ce)5Q\16ª=ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=\88Q\96A\13e\91Ùs\18e)rEYHÖ\1cGYÊL\94\85h\ fr\94\1de\91:\ 69ÊRj¢,T{\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,£î(\8bÔ1ÈQ\96R\13e¡Ú\83\1ce)5Q\16ª=ÈQ\96Qw\94\18ä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8e²\8cº£,RÇ GYJM\94\85j\ fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94\1de\91:\ 69ÊRj¢,T{\10£,\85®(\vÍ\9aÃ(Ë\90\89²\88ì9\8e²\94\99(\vÑ\1eä(K©\89²PíA\8e²\94\9a(\vÕ\1eä(˨;Ê"u\fr\94¥ÔDY¨ö GYJM\94\85j\ fr\94¥ÔDY¨ö GYFÝQ\16©c\90£,¥&ÊBµ\a9ÊRj¢,T{\90£,¡¾FY ÎA\8e²\94\9a(\vÕ\1eä(K©\89²PíA\8e²\8e\v#\17eÑA\12e]\1cäþæ(Ê:>È7þp´\9b\9bÓ\ 1^8ÊZ×\üp´\9f~þòã_ÿ¿ï~üék\91õ6\rú\9a[=}ºØ~û#Ñ®o\1e\ e\94Qp¶]F]\9cí¸\8cz{\10(£PíA.£\94\9a2
\1e¤2J\98)£@ì1,£\14¸Ê(\14k\8eË(e¦\8c\a¹\8cRjÊ(T{\90Ë(£î2\8aÔ1Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2J©)£PíA.£\8cºË(RÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QFÝe\14©c\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=\88e\94BW\19\85fÍa\19¥ÈUF!Ys\F\19s\97Q\84\8eA.£\94\9a2
\1eä2J©)£PíA.£\8cºË(RÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19eÔ]F\91:\ 6¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94P_Ë(Pç \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fb\19\94Qdö\1c\96Q\8a\e\14\925Çe\942SF!Ú\83\F\19u\97\8eA.£\94\9a2
\1eä2J©)£PíA.£\94\9a2
\1eä2ʨ»\8c"u\fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19eÔ]F\91:\ 6¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(£î2\8aÔ1Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94RSF¡Ú\83\F\19u\97\8eA.£\94\9a2
\1eÄ2J¡«\8cB³æ°\8c2dÊ("{\8eË(e¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2J¨¯e\14¨s\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90˨ãÖÇ\95Qt\90\94Q\17\a¹¿=*£\8e\ fòm¯«º\7fy¹º>}HR\19\95\96Q?ÿöåý4êë¿'zøt1þöUUÏwÇ??påBt¸\ty¸\83\9dc\1cåB$ö\18åB\ e<çB,Ö\1cæBÎ\¹\10£=\88¹\90SW.Äj\ fb.¤ÔäB¨\8e\85\9cºr!V{\10s!§®\\88Õ\1eÄ\H©É\85P\1d\83\98\v9uåB¬ö æBN]¹\10«=\88¹\90SW.Äj\ fb.¤ÔäB¨\8e\85\9cºr!V{\10s!§®\\88Õ\1eÄ\H©É\85P\1d\83\98\v9uåB¬ö æBN]¹\10«=\88¹\90SW.Äj\ fb.¤ÔäB¨\8e\85\9cºr!V{\90r!\87\9es!6k\8er!G\9es!&k\ es!e&\17Bt\fb.äÔ\95\v±Ú\83\98\v9uåB¬ö æBJM.\84ê\18Ä\È©+\17\a1\17rêÊ\85XíAÌ\85\9cºr!V{\10s!¥&\17Bu\fb.äÔ\95\v±Ú\83\98\v9uåB¬ö æBJM.\84ê\18Ä\È©+\17\a1\17rêÊ\85XíAÌ\85\9cºr!V{\10s!£î\\88Ô9\88¹\90SW.Äj\ fb.äÔ\95\v±Ú\83\98\v9uåB¬ö åB
+]¹\10\9a=G¹\90#Ϲ\10\935\87¹\903W.Äh\ fb.¤ÔäB¨\8e\85\9cºr!V{\10s!§®\\88Õ\1eÄ\È©+\17\a1\17Rjr!TÇ æBN]¹\10«=\88¹\90SW.Äj\ fb.¤ÔäB¨\8e\85\9cºr!V{\10s!§®\\88Õ\1eÄ\È©+\17\a1\17Rjr!TÇ æBN]¹\10«=\88¹\90SW.Äj\ fb.äÔ\95\v±Ú\83\98\v)5¹\10ªc\10s!§®\\88Õ\1e¤\È¡ç\\88Í\9a£\H\91+\17B²ç0\17ræÊ\85\18íAÌ\85\9cºr!V{\10s!§®\\88Õ\1eÄ\H©É\85P\1d\83\98\v9uåB¬ö æBN]¹\10«=\88¹\90SW.Äj\ fb.¤ÔäB¨\8e\85\9cºr!V{\10s!§®\\88Õ\1eÄ\Ȩ;\17"u\ eb.äÔ\95\v±Ú\83\98\v9uåB¬ö æBп¨\\b\ f².º<ÈýÝA.\ 4\aù¶\17)Ý?\7f}5Ð#çBë\9a·¹Ð\7füüåïïõBw×·§ßJ=|ºX\7f¯\17:z\95ÒNiàpIi.Îv\9cÒ¼=\ 6¤4\88ö §4JMJ\83j\ frJcÔ\9dÒ\90:\ 69¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥1êNiH\1d\83\9cÒ(5)\rª=È)\8dR\93Ò Ú\83\9cÒ(5)\rª=È)\8dQwJCê\18ä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94ƨ;¥!u\frJ£Ô¤4¨ö §4JMJ\83j\ frJ£Ô¤4¨ö §4FÝ)\r©c\90S\1a¥&¥Aµ\a1¥QèJiЬ9Li\14¹R\1a$k\8eS\1a\94\86Ð1È)\8dR\93Ò Ú\83\9cÒ(5)\rª=È)\8dQwJCê\18ä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\8cºS\1aRÇ §4JMJ\83j\ frJ£Ô¤4¨ö §4FÝ)\r©c\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a¥&¥Aµ\a\11êkJ\ 3ê\1cä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94F©IiPíALi\f\9a\94\86Ì\9eÃ\94F\91+¥A²æ8¥QfR\1aD{\90S\1a£î\94\86Ô1È)\8dR\93Ò Ú\83\9cÒ(5)\rª=È)\8dR\93Ò Ú\83\9cÒ\18u§4¤\8eANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\8cºS\1aRÇ §4JMJ\83j\ frJ£Ô¤4¨ö §4JMJ\83j\ frJcÔ\9dÒ\90:\ 69¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a£î\94\86Ô1È)\8dR\93Ò Ú\83\98Ò(t¥4hÖ\1c¦4\86LJCdÏqJ£Ì¤4\88ö §4JMJ\83j\ frJ£Ô¤4¨ö §4FÝ)\r©c\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥1êNiH\1d\83\9cÒ(5)\rª=È)\8dR\93Ò Ú\83\9cÒ\bõ5¥\ 1u\ erJ£Ô¤4¨ö §4JMJ\83j\ frJs\9c\86¸\94\86\ e\92\94æâ Ç)ÍñA¾ñÍ;§_\86nn\1e8¥Y×\¤4ßÿåË\8fÿÏ÷_>\7f÷ù\87¿}~ïg\92=~ý\97õ¯ÛoC\9aGxñÎú\99dt¶\ty¶Ã\9fIöÎA\8e\7f&\19«=\88?\93Ì©yÉ\10ª=H/\19\12f^2\ 4b\8fáK\86\14¸Ê(\14k\8eË(e¦\8c\a¹\8cRjÊ(T{\90Ë(£î2\8aÔ1Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2J©)£PíA.£\8cºË(RÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QFÝe\14©c\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=\88e\94BW\19\85fÍa\19¥ÈUF!Ys\F\19s\97Q\84\8eA.£\94\9a2
\1eä2J©)£PíA.£\8cºË(RÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19eÔ]F\91:\ 6¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94P_Ë(Pç \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fb\19\94Qdö\1c\96Q\8a\e\14\925Çe\942SF!Ú\83\F\19u\97\8eA.£\94\9a2
\1eä2J©)£PíA.£\94\9a2
\1eä2ʨ»\8c"u\fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19eÔ]F\91:\ 6¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(£î2\8aÔ1Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94RSF¡Ú\83\F\19u\97\8eA.£\94\9a2
\1eÄ2J¡«\8cB³æ°\8c2dÊ("{\8eË(e¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2J¨¯e\14¨s\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90˨ãÖÇ\95Qt\90\94Q\17\a9.£\8e\ fò\8d/\19z¼¾º9\1d\0˨uÍE\19õçëëÛ\7f|ùñ\87Û\1f\7fúòù\97\9f¾ÿÇÛ<èîô[óçO\17ûó\10·¿ÿÛУ:*\9d\12\9cowJ\17ç;î\94Þ\1e\ 4:%T{\90:%a¦S\ 2±Ç°SRàê\94P¬9î\94\94\99N    Ñ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJFÝ\9d\12©c\90;%¥¦SBµ\a¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü)\19uwJ¤\8e\94\94\9aN Õ\1eäNI©é\94PíAî\94\94\9aN        Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö vJ
+]\9d\12\9a5\87\9d\92"W§\84dÍq§dÌÝ)\11:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹S2êî\94H\1d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN      Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö wJJM§\84j\ fr§¤ÔtJ¨ö wJB}í\94@\9d\83Ü))5\9d\12ª=È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=\88\9d\92AÓ)\91ÙsØ))ruJHÖ\1cwJÊL§\84h\ fr§dÔÝ)\91:\ 6¹SRj:%T{\90;%¥¦SBµ\a¹SRj:%T{\90;%£îN\89Ô1È\9d\92RÓ)¡Ú\83Ü))5\9d\12ª=È\9d\92Qw§Dê\18äNI©é\94PíAî\94\94\9aN    Õ\1eäNI©é\94PíAî\94\8cº;%RÇ wJJM§\84j\ fr§¤ÔtJ¨ö wJJM§\84j\ fr§dÔÝ)\91:\ 6¹SRj:%T{\10;%\85®N    Í\9aÃNÉ\90é\94\88ì9î\94\94\99N        Ñ\1eäNI©é\94PíAî\94\94\9aN        Õ\1eäNɨ»S"u\fr§¤ÔtJ¨ö wJJM§\84j\ fr§¤ÔtJ¨ö wJFÝ\9d\12©c\90;%¥¦SBµ\a¹SRj:%T{\90;%¡¾vJ ÎAî\94\94\9aN   Õ\1eäNI©é\94PíAî\94\8e«\e×)ÑAÒ)]\1cäþþ¨S:>È7¾Áéþéêöæ\96;¥uÍE§ôõÅMßýøÓ_~ùü×7aÐó×\eY\ f\9f.\96ßùZ]\1f}­n\9fOßéüþ-=\9c,\17]\9eìm¡tú$~¹8>\16JëÚ\ fÔ\1e<POß¿<Xõ|í\aj\ f\1eÔX§oano\9dº®eu\f\1e¨ë5ZJÍ{¹PíA~/\97RÓ»¡Ú\83Ü»)5½\eª=H½\9b0Ó»\81ØcØ»)põn(Ö\1c÷nÊLï\86h\ frï¦Ôôn¨ö ÷nFݽ\e©c\90{7¥¦wCµ\a¹wSjz7T{\90{7£îÞ\8dÔ1Ƚ\9bRÓ»¡Ú\83Ü»)5½\eª=Ƚ\9bRÓ»¡Ú\83Ü»\19u÷n¤\8eAîÝ\94\9aÞ\rÕ\1eäÞM©éÝPíAîÝ\8cº{7RÇ ÷nJMï\86j\ frï¦Ôôn¨ö ÷nJMï\86j\ frïfÔÝ»\91:\ 6¹wSjz7T{\10{7\85®Þ\rÍ\9aÃÞM\91«wC²æ¸w3æîÝ\b\1d\83Ü»)5½\eª=Ƚ\9bRÓ»¡Ú\83Ü»\19u÷n¤\8eAîÝ\94\9aÞ\rÕ\1eäÞM©éÝPíAîÝ\94\9aÞ\rÕ\1eäÞͨ»w#u\frï¦Ôôn¨ö ÷nJMï\86j\ frïfÔÝ»\91:\ 6¹wSjz7T{\90{7¥¦wCµ\a¹wSjz7T{\90{7¡¾ön ÎAîÝ\94\9aÞ\rÕ\1eäÞM©éÝPíAîÝ\94\9aÞ\rÕ\1eÄÞÍ éÝÈì9ìÝ\14¹z7$k\8e{7e¦wC´\a¹w3êîÝH\1d\83Ü»)5½\eª=Ƚ\9bRÓ»¡Ú\83Ü»)5½\eª=Ƚ\9bQwïFê\18äÞM©éÝPíAîÝ\94\9aÞ\rÕ\1eäÞͨ»w#u\frï¦Ôôn¨ö ÷nJMï\86j\ frï¦Ôôn¨ö ÷nFݽ\e©c\90{7¥¦wCµ\a¹wSjz7T{\90{7¥¦wCµ\a¹w3êîÝH\1d\83Ü»)5½\eª=\88½\9bBWï\86fÍaïfÈônDö\1c÷nÊLï\86h\ frï¦Ôôn¨ö ÷nJMï\86j\ frïfÔÝ»\91:\ 6¹wSjz7T{\90{7¥¦wCµ\a¹wSjz7T{\90{7£îÞ\8dÔ1Ƚ\9bRÓ»¡Ú\83Ü»)5½\eª=Ƚ\9bP_{7Pç ÷nJMï\86j\ frï¦Ôôn¨ö ÷nØp\89Þ\8d\ e\92Þíâ Ç½ÛñA¾±w;ý¦çöñ\86{·uÍìÝ~øü~ïv{úËøòébùí\e¹nO\7fw\1dõn)Ïàd»<»8Ùqyöö P\9e¡Ú\83\\9e\19u\97\8eA.Ï\94\9aò\fÕ\1eäòL©)ÏPíA.Ï\94\9aò\fÕ\1e¤òL\98)Ï@ì1,Ï\14¸Ê3\14k\8eË3e¦<C´\a¹<SjÊ3T{\90Ë3£îò\8cÔ1Èå\99RS\9e¡Ú\83\\9e)5å\19ª=Èå\99QwyFê\18äòL©)ÏPíA.Ï\94\9aò\fÕ\1eäòL©)ÏPíA.Ï\8cºË3RÇ \97gJMy\86j\ fry¦Ô\94g¨ö \97gFÝå\19©c\90Ë3¥¦<Cµ\a¹<SjÊ3T{\90Ë3¥¦<Cµ\a¹<3ê.ÏH\1d\83\\9e)5å\19ª=\88å\99BWy\86fÍay¦ÈU\9e!Ys\\9e\19s\97g\84\8eA.Ï\94\9aò\fÕ\1eäòL©)ÏPíA.Ï\8cºË3RÇ \97gJMy\86j\ fry¦Ô\94g¨ö \97gJMy\86j\ fryfÔ]\9e\91:\ 6¹<SjÊ3T{\90Ë3¥¦<Cµ\a¹<3ê.ÏH\1d\83\\9e)5å\19ª=Èå\99RS\9e¡Ú\83\\9e)5å\19ª=Èå\99P_Ë3Pç \97gJMy\86j\ fry¦Ô\94g¨ö \97gJMy\86j\ fbyfÐ\94gdö\1c\96g\8a\19\925Çå\992S\9e\83\\9e\19u\97\8eA.Ï\94\9aò\fÕ\1eäòL©)ÏPíA.Ï\94\9aò\fÕ\1eäǫ̀»<#u\fry¦Ô\94g¨ö \97gJMy\86j\ fryfÔ]\9e\91:\ 6¹<SjÊ3T{\90Ë3¥¦<Cµ\a¹<SjÊ3T{\90Ë3£îò\8cÔ1Èå\99RS\9e¡Ú\83\\9e)5å\19ª=Èå\99RS\9e¡Ú\83\\9e\19u\97\8eA.Ï\94\9aò\fÕ\1eÄòL¡«<C³æ°<3dÊ3"{\8eË3e¦<C´\a¹<SjÊ3T{\90Ë3¥¦<Cµ\a¹<3ê.ÏH\1d\83\\9e)5å\19ª=Èå\99RS\9e¡Ú\83\\9e)5å\19ª=Èå\99QwyFê\18äòL©)ÏPíA.Ï\94\9aò\fÕ\1eäòL¨¯å\19¨s\90Ë3¥¦<Cµ\a¹<SjÊ3T{\90˳ã\9aÊ\95gt\90\94g\17\a¹\7f8*Ï\8e\ fò\8d?\11òëÞé\97!,ÏÖ5ã'Bþõç¯ÿïî·_ÿþݯÿøù˯o\v¡Óïl\1eï?]\10ó\1c\7f¤\9e\ e\7f(d¢!8â\8e\86.\8ex\14\r½=Æa4\ 4b\8fa4¤À\15\r¡Xs\1c\r)3Ñ\10¢=ÈÑ\90R\13\r¡Ú\83\1c\r\19uGC¤\8eA\8e\86\94\9ah\bÕ\1eähH©\89\86PíA\8e\86\8cº£!RÇ GCJM4\84j\ fr4¤ÔDC¨ö GCJM4\84j\ fr4dÔ\1d\r\91:\ 69\1aRj¢!T{\90£!¥&\1a\a9\1a\8e\86H\1d\83\1c\r)5Ñ\10ª=ÈÑ\90R\13\r¡Ú\83\1c\r)5Ñ\10ª=ÈÑ\90Qw4Dê\18ähH©\89\86PíA\8c\86\14º¢!4k\ e£!E®h\bÉ\9aãhÈ\98;\1a"t\fr4¤ÔDC¨ö GCJM4\84j\ fr4dÔ\1d\r\91:\ 69\1aRj¢!T{\90£!¥&\1a\a9\1aRj¢!T{\90£!£îh\88Ô1ÈÑ\90R\13\r¡Ú\83\1c\r)5Ñ\10ª=ÈÑ\90Qw4Dê\18ähH©\89\86PíA\8e\86\94\9ah\bÕ\1eähH©\89\86PíA\8e\86\84ú\1a\r\81:\a9\1aRj¢!T{\90£!¥&\1a\a9\1aRj¢!T{\10£!\83&\1a"³ç0\1a\8a\86\90¬9\8e\86\94\99h\bÑ\1eähȨ;\1a"u\fr4¤ÔDC¨ö GCJM4\84j\ fr4¤ÔDC¨ö GCFÝÑ\10©c\90£!¥&\1a\a9\1aRj¢!T{\90£!£îh\88Ô1ÈÑ\90R\13\r¡Ú\83\1c\r)5Ñ\10ª=ÈÑ\90R\13\r¡Ú\83\1c\r\19uGC¤\8eA\8e\86\94\9ah\bÕ\1eähH©\89\86PíA\8e\86\94\9ah\bÕ\1eähȨ;\1a"u\fr4¤ÔDC¨ö FC
+]Ñ\10\9a5\87Ñ\90!\13\r\11Ùs\1c\r)3Ñ\10¢=ÈÑ\90R\13\r¡Ú\83\1c\r)5Ñ\10ª=ÈÑ\90Qw4Dê\18ähH©\89\86PíA\8e\86\94\9ah\bÕ\1eähH©\89\86PíA\8e\86\8cº£!RÇ GCJM4\84j\ fr4¤ÔDC¨ö GCB}\8d\86@\9d\83\1c\r)5Ñ\10ª=ÈÑ\90R\13\r¡Ú\83\1c\r\1d÷/.\1a¢\83$\1aº8Èq4t|\90o|]ÕõéÛÔÓof1\1aZ×¼\8d\86~üéÇ/GÅÐõÕÓ×\7f\85òºÿö¥U\ f'ç¨\18Ê+\95à|û\95J\17ç;~¥ÒÛ\83À+\95PíA~¥\92RSG¡Ú\83TG  3u\14\88=\86u\94\ 2W\1d\85bÍq\1d¥ÌÔQ\88ö ×QJM\1d\85j\ fr\1deÔ]G\91:\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e2ꮣH\1d\83\G)5u\14ª=Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94Qw\1d\18ä:J©©£PíA®£\94\9a:
\1eä:ʨ»\8e"u\fr\1d¥ÔÔQ¨ö ×QJM\1d\85j\ fr\1d¥ÔÔQ¨ö ×QFÝu\14©c\90ë(¥¦\8e\a±\8eR誣Ь9¬£\14¹ê($k\8eë(cî:\8aÐ1Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94Qw\1d\18ä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\8cºë(RÇ ×QJM\1d\85j\ fr\1d¥ÔÔQ¨ö ×QFÝu\14©c\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e\12êk\1d\ 5ê\1cä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA¬£\f\9a:\8aÌ\9eÃ:J\91«\8eB²æ¸\8eRfê(D{\90ë(£î:\8aÔ1Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94RSG¡Ú\83\G\19u×Q¤\8eA®£\94\9a:
\1eä:J©©£PíA®£\8cºë(RÇ ×QJM\1d\85j\ fr\1d¥ÔÔQ¨ö ×QJM\1d\85j\ fr\1deÔ]G\91:\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(£î:\8aÔ1Èu\94RSG¡Ú\83XG)tÕQhÖ\1cÖQ\86L\1dEdÏq\1d¥ÌÔQ\88ö ×QJM\1d\85j\ fr\1d¥ÔÔQ¨ö ×QFÝu\14©c\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e2ꮣH\1d\83\G)5u\14ª=Èu\94RSG¡Ú\83\G     õµ\8e\ 2u\ er\1d¥ÔÔQ¨ö ×QJM\1d\85j\ fr\1duÜú¸:\8a\ e\92:êâ ÇuÔñA¾í\95J_o±Ý\9f~ûAuT®¹¨£þöùËw?þôµ\8b\ 5\9d~]{9ýi\\f¿Í¢\9eN\7f
+\aYÔé\17¨Ç¯\7f§ÐÁrÑåÁÞ\ 6JO§oÔîïß;È;êùÚ\ fÔ\1e<ø  \82§oÔnî\9cº®eu\f\1e¨ç\1fnèÔõÓ\12YíAüi\89N]?-\91Õ\1eÄ\9f\96¨Ôü´DTÇ þ´D§®´\8fÕ\1eÄ´Ï©+ícµ\a1ísêJûXíAHû\8c¹Ò>\12{\8cÒ>\a\9eÓ>\16k\ eÓ>g®´\8fÑ\1eÄ´Ï©+ícµ\a1íSjÒ>TÇ ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚ§Ô¤}¨\8eALû\9cºÒ>V{\10Ó>§®´\8fÕ\1eÄ´Ï©+ícµ\a1íSjÒ>TÇ ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚ§Ô¤}¨\8eALû\9cºÒ>V{\10Ó>§®´\8fÕ\1eÄ´Ï©+ícµ\a1íSjÒ>TÇ ¦}N]i\1f«=Hi\9fCÏi\1f\9b5Gi\9f#Ïi\1f\935\87i\9f2\93ö!:\ 61ísêJûXíALû\9cºÒ>V{\10Ó>¥&íCu\fbÚçÔ\95ö±Ú\83\98ö9u¥}¬ö ¦}N]i\1f«=\88i\9fR\93ö¡:\ 61ísêJûXíALû\9cºÒ>V{\10Ó>¥&íCu\fbÚçÔ\95ö±Ú\83\98ö9u¥}¬ö ¦}N]i\1f«=\88i\9fQwÚGê\1cÄ´Ï©+ícµ\a1ísêJûXíALû\9cºÒ>V{\90Ò>\85®´\ fÍ\9e£´Ï\91ç´\8fÉ\9aôÏ\99+íc´\a1íSjÒ>TÇ ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚçÔ\95ö±Ú\83\98ö)5i\1fªc\10Ó>§®´\8fÕ\1eÄ´Ï©+ícµ\a1íSjÒ>TÇ ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚçÔ\95ö±Ú\83\98ö)5i\1fªc\10Ó>§®´\8fÕ\1eÄ´Ï©+ícµ\a1ísêJûXíALû\94\9a´\ fÕ1\88i\9fSWÚÇj\ fRÚçÐsÚÇfÍQÚ§È\95ö!Ùs\98ö9s¥}\8cö ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚ§Ô¤}¨\8eALû\9cºÒ>V{\10Ó>§®´\8fÕ\1eÄ´Ï©+ícµ\a1íSjÒ>TÇ ¦}N]i\1f«=\88i\9fSWÚÇj\ fbÚgÔ\9dö\91:\a1ísêJûXíALû\9cºÒ>V{\10Ó>èÕTÚ\87\aY\17]\1eäþñ í\83\83\8bÏî\9eo\7f¿\89\89iߺæÝ´ïþÇ\1fÞ&_§o}¿ÞõxÝ~[÷Ý\9c¾7>zéYz,8Ûî±.ÎvÜc½=\bôX¨ö ÷XJM\8f\85j\ fr\8f¥ÔôX¨ö õXÂL\8f\ 5b\8fa\8f¥ÀÕc¡XsÜc)3=\16¢=È=\96RÓc¡Ú\83Üc\19u÷X¤\8eAî±\94\9a\1e\vÕ\1eä\1eK©é±PíAî±\8cº{,RÇ ÷XJM\8f\85j\ fr\8f¥ÔôX¨ö ÷XJM\8f\85j\ fr\8feÔÝc\91:\ 6¹ÇRjz,T{\90{,¥¦ÇBµ\a¹Ç2êî±H\1d\83Üc)5=\16ª=È=\96RÓc¡Ú\83Üc)5=\16ª=È=\96Qw\8f\18ä\1eK©é±PíAì±\14ºz,4k\ e{,E®\1e\vÉ\9aã\1eË\98»Ç"t\fr\8f¥ÔôX¨ö ÷XJM\8f\85j\ fr\8feÔÝc\91:\ 6¹ÇRjz,T{\90{,¥¦ÇBµ\a¹ÇRjz,T{\90{,£î\1e\8bÔ1È=\96RÓc¡Ú\83Üc)5=\16ª=È=\96Qw\8f\18ä\1eK©é±PíAî±\94\9a\1e\vÕ\1eä\1eK©é±PíAî±\84úÚc\81:\a¹ÇRjz,T{\90{,¥¦ÇBµ\a¹ÇRjz,T{\10{,\83¦Ç"³ç°ÇRäê±\90¬9î±\94\99\1e\vÑ\1eä\1e˨»Ç"u\fr\8f¥ÔôX¨ö ÷XJM\8f\85j\ fr\8f¥ÔôX¨ö ÷XFÝ=\16©c\90{,¥¦ÇBµ\a¹ÇRjz,T{\90{,£î\1e\8bÔ1È=\96RÓc¡Ú\83Üc)5=\16ª=È=\96RÓc¡Ú\83Üc\19u÷X¤\8eAî±\94\9a\1e\vÕ\1eä\1eK©é±PíAî±\94\9a\1e\vÕ\1eä\1e˨»Ç"u\fr\8f¥ÔôX¨ö öX
+]=\16\9a5\87=\96!Óc\11ÙsÜc)3=\16¢=È=\96RÓc¡Ú\83Üc)5=\16ª=È=\96Qw\8f\18ä\1eK©é±PíAî±\94\9a\1e\vÕ\1eä\1eK©é±PíAî±\8cº{,RÇ ÷XJM\8f\85j\ fr\8f¥ÔôX¨ö ÷XB}í±@\9d\83Üc)5=\16ª=È=\96RÓc¡Ú\83Üc\1d\17F®Ç¢\83¤Çº8Èq\8fu|\90o|ÕÚãËÕé\vÏ=Öºæ¢Çú×oǯZ;ýsòõ\ eðëðÔO«§ß>\7fôª58Ø~ÕÚÅÁ\8e_µöö ðª5T{\90_µfÔýª5RÇ ¿jM©yÕ\1aª=ȯZSj^µ\86j\ fò«Ö\8cºÓ>RÇ §}JMÚ\87j\ frÚ§Ô¤}¨ö §}JMÚ\87j\ fRÚ'̤} ö\18¦}
+\i\1f\8a5Çi\9f2\93ö!Ú\83\9cö)5i\1fª=Èi\9fQwÚGê\18ä´O©IûPíANû\94\9a´\ fÕ\1eä´Ï¨;í#u\frÚ§Ô¤}¨ö §}JMÚ\87j\ frÚ§Ô¤}¨ö §}FÝi\1f©c\90Ó>¥&íCµ\a9íSjÒ>T{\90Ó>£î´\8fÔ1Èi\9fR\93ö¡Ú\83\9cö)5i\1fª=Èi\9fR\93ö¡Ú\83\9cö\19u§}¤\8eANû\94\9a´\ fÕ\1eÄ´O¡+íC³æ0íSäJû\90¬9Nû\8c¹Ó>BÇ §}JMÚ\87j\ frÚ§Ô¤}¨ö §}FÝi\1f©c\90Ó>¥&íCµ\a9íSjÒ>T{\90Ó>¥&íCµ\a9í3êNûH\1d\83\9cö)5i\1fª=Èi\9fR\93ö¡Ú\83\9cö\19u§}¤\8eANû\94\9a´\ fÕ\1eä´O©IûPíANû\94\9a´\ fÕ\1eä´O¨¯i\1f¨s\90Ó>¥&íCµ\a9íSjÒ>T{\90Ó>¥&íCµ\a1í3hÒ>2{\ eÓ>E®´\ fÉ\9aã´O\99\10íANû\8cºÓ>RÇ §}JMÚ\87j\ frÚ§Ô¤}¨ö §}JMÚ\87j\ frÚgÔ\9dö\91:\ 69íSjÒ>T{\90Ó>¥&íCµ\a9í3êNûH\1d\83\9cö)5i\1fª=Èi\9fR\93ö¡Ú\83\9cö)5i\1fª=Èi\9fQwÚGê\18ä´O©IûPíANû\94\9a´\ fÕ\1eä´O©IûPíANû\8cºÓ>RÇ §}JMÚ\87j\ fbÚ§Ð\95ö¡Ys\98ö\192i\1f\91=Çi\9f2\93ö!Ú\83\9cö)5i\1fª=Èi\9fR\93ö¡Ú\83\9cö\19u§}¤\8eANû\94\9a´\ fÕ\1eä´O©IûPíANû\94\9a´\ fÕ\1eä´Ï¨;í#u\frÚ§Ô¤}¨ö §}JMÚ\87j\ frÚ'Ô×´\ fÔ9Èi\9fR\93ö¡Ú\83\9cö)5i\1fª=Èißq¯æÒ>:HÒ¾\8b\83Ü?\1d¥}Ç\aùÆW­\9d¾\89z8÷\7fÇiߺæ"íûþ?~þå0î;}\ 2^\7f½Wø:ýö\8bõü|ôÅzMÏàh;=»8Úqzöö \90\9e¡Ú\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1e¤ôL\98IÏ@ì1LÏ\14¸Ò3\14k\8eÓ3e&=C´\a9=SjÒ3T{\90Ó3£îô\8cÔ1Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QwzFê\18äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÓ3RÇ §gJMz\86j\ frz¦Ô¤g¨ö §gFÝé\19©c\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=\88é\99BWz\86fÍaz¦È\95\9e!Ys\9c\9e\19s§g\84\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÓ3RÇ §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99P_Ó3Pç §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ fbzfФgdö\1c¦g\8a\19\925Çé\992\93\9e\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£îô\8cÔ1Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eÄôL¡+=C³æ0=3dÒ3"{\8eÓ3e&=C´\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QwzFê\18äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL¨¯é\19¨s\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3ª©LzF\aIzvq\90ûç£ôìø ß\98\9eÝ\7f½%~ÃéÙºæ"=ûóõõí?¾|þå»\7fþú·ÛÏ?üíó¯o\83\92Ç«û\9bO\17ûo¿bO\87_±×°\ 5ηÃ\96\8bó\1d\87-o\ f\ 2a\vª=Èa\8bQwØBê\18ä°E©      [PíA\ e[\94\9a°\ 5Õ\1eä°Å¨;l!u\frØ¢Ô\84-¨ö \87-JMØ\82j\ frØ¢Ô\84-¨ö \87-FÝa\v©c\90Ã\16¥&lAµ\a9lQjÂ\16T{\90Ã\16£î°\85Ô1Èa\8bR\13¶ Ú\83\1c¶(5a\vª=Èa\8bR\13¶ Ú\83\1c\18u\87\8eA\ e[\94\9a°\ 5Õ\1eÄ°E¡+lA³æ0lQä
+[\90¬9\ e[\8c¹Ã\16BÇ \87-JMØ\82j\ frØ¢Ô\84-¨ö \87-FÝa\v©c\90Ã\16¥&lAµ\a9lQjÂ\16T{\90Ã\16¥&lAµ\a9l1ê\ e[H\1d\83\1c¶(5a\vª=Èa\8bR\13¶ Ú\83\1c\18u\87\8eA\ e[\94\9a°\ 5Õ\1eä°E©        [PíA\ e[\94\9a°\ 5Õ\1eä°E¨¯a\v¨s\90Ã\16¥&lAµ\a9lQjÂ\16T{\90Ã\16¥&lAµ\a1l1hÂ\162{\ eÃ\16E®°\ 5É\9aã°E\99    [\10íA\ e[\8cºÃ\16RÇ \87-JMØ\82j\ frØ¢Ô\84-¨ö \87-JMØ\82j\ frØbÔ\1d\90:\ 69lQjÂ\16T{\90Ã\16¥&lAµ\a9l1ê\ e[H\1d\83\1c¶(5a\vª=Èa\8bR\13¶ Ú\83\1c¶(5a\vª=Èa\8bQwØBê\18ä°E© [PíA\ e[\94\9a°\ 5Õ\1eä°E©        [PíA\ e[\8cºÃ\16RÇ \87-JMØ\82j\ fbØ¢Ð\15¶ Ys\18\182a\v\91=Ça\8b2\13¶ Ú\83\1c¶(5a\vª=Èa\8bR\13¶ Ú\83\1c\18u\87\8eA\ e[\94\9a°\ 5Õ\1eä°E©   [PíA\ e[\94\9a°\ 5Õ\1eä°Å¨;l!u\frØ¢Ô\84-¨ö \87-JMØ\82j\ frØ"Ô×°\ 5Ô9Èa\8bR\13¶ Ú\83\1c¶(5a\vª=Èa\ve\1a&l¡\83$l¹8ÈqØr|\90oüq\89§\8b\1fï_8lY×\\84-_>ÿúå»\9f\7fûòþ;\95\9e^\9e?]LOÿöêæùáÃw*ÁÑö;\95.\8evüN¥·\a\81w*¡Ú\83üN%£îw*\91:\ 6ù\9dJJÍ;\95PíA~§\92RóN%T{\90ß©¤Ô¼S       Õ\1e¤w*   3ïT\ 2±Çð\9dJ
+\ïTB±æø\9dJÊLz\86h\ frz¦Ô¤g¨ö §gFÝé\19©c\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£îô\8cÔ1Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÓ3RÇ §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\10Ó3\85®ô\fÍ\9aÃôL\91+=C²æ8=3æNÏ\b\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¡¾¦g ÎANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eÄôÌ IÏÈì9LÏ\14¹Ò3$k\8eÓ3e&=C´\a9=3êNÏH\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QwzFê\18äôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gFÝé\19©c\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=\88é\99BWz\86fÍazfȤgDö\1c§gÊLz\86h\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£îô\8cÔ1Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99P_Ó3Pç §gJMz\86j\ frz¦Ô¤g¨ö §gÇ5\95KÏè IÏ.\ erÿr\94\9e\1d\1fä\eß©tú\8dûãË3§gë\9a\8bô쯿|þ|\9c\9eÝ\9d?\8b^§§\7fsõ|úØø(=\83£íôìâhÇéÙÛ\83@z\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ò3a&=\ 3±Ç0=SàJÏP¬9NÏ\94\99ô\fÑ\1eäôL©IÏPíANÏ\8cºÓ3RÇ §gJMz\86j\ frz¦Ô¤g¨ö §gFÝé\19©c\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u§g¤\8eANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö ¦g
+]é\19\9a5\87é\99"Wz\86dÍqzfÌ\9d\9e\11:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=3êNÏH\1d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QwzFê\18äôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gB}MÏ@\9d\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=\88é\99A\93\9e\91Ùs\98\9e)r¥gHÖ\1c§gÊLz\86h\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3£îô\8cÔ1Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QwzFê\18äôL©IÏPíANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8cºÓ3RÇ §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\9d\9e\91:\ 69=SjÒ3T{\10Ó3\85®ô\fÍ\9aÃôÌ\90\88ì9NÏ\94\99ô\fÑ\1eäôL©IÏPíANÏ\94\9aô\fÕ\1eäǫ̂;=#u\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gFÝé\19©c\90Ó3¥&=Cµ\a9=SjÒ3T{\90Ó3¡¾¦g ÎANÏ\94\9aô\fÕ\1eäôL©IÏPíANÏ\8ek*\97\9eÑA\92\9e]\1cä8=;>È7¾õìúþêéþ\91Ó³uÍEzöýß¾ÿñ§Ãöìô¿»ùz\9býuû\9b^{¶Ë(8Û.£.Îv\F½=\b\94Q¨ö \97QJM\19\85j\ fR\19\94Q ö\18\96Q
+\e\14\8a5Çe\942SF!Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2ʨ»\8c"u\fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QFÝe\14©c\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(£î2\8aÔ1Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94RSF¡Ú\83\F\19u\97\8eA.£\94\9a2
\1eÄ2J¡«\8cB³æ°\8cRä*£\90¬9.£\8c¹Ë(BÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QFÝe\14©c\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F\19u\97\8eA.£\94\9a2
\1eä2J©)£PíA.£\94\9a2
\1eä2J¨¯e\14¨s\90Ë(¥¦\8c\a¹\8cRjÊ(T{\90Ë(¥¦\8c\a±\8c2hÊ(2{\ eË(E®2
\9aã2J\99\10íA.£\8cºË(RÇ \97QJM\19\85j\ fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19eÔ]F\91:\ 6¹\8cRjÊ(T{\90Ë(¥¦\8c\a¹\8c2ê.£H\1d\83\F)5e\14ª=Èe\94RSF¡Ú\83\F)5e\14ª=Èe\94Qw\19\18ä2J©)£PíA.£\94\9a2
\1eä2J©)£PíA.£\8cºË(RÇ \97QJM\19\85j\ fb\19¥ÐUF¡YsXF\192e\14\91=Çe\942SF!Ú\83\F)5e\14ª=Èe\94RSF¡Ú\83\F\19u\97\8eA.£\94\9a2
\1eä2J©)£PíA.£\94\9a2
\1eä2ʨ»\8c"u\fr\19¥Ô\94Q¨ö \97QJM\19\85j\ fr\19%Ô×2
+Ô9Èe\94RSF¡Ú\83\F)5e\14ª=ÈeÔqëãÊ(:Hʨ\8b\83<\\1f\95\aù¶\97r}­\98\9e^\1e°\8cÊ5\17eÔ¯\9f¿|÷çëëÛ\7f¼Í¢\1e¯¯N¿¶}º\18~\9b\9d~¹=È¢Nßè<\9f\ e\81\aËE\97\a{\e(\9d¾yy8}L¼s\90wÔóµ\1f¨=x \9e¾í\7f´êùÚ\ fÔ\1e|_}:}Û\7fú\98Pêº\96Õ1x \9e¾í¿¶êùÚ\ fÔ\1e<POßö\9f>&\9cz¾ö\ 3µ\a\ fÔÓ·ý÷V=_û\81Ú\83\a¯\95;}Û\7fsçÔu-«cð@=¿ñΩë\15z¬ö ¾BÏ©ë\15z¬ö ¾BO©y\85\1eªc\10_¡çÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢N]¡(«=\b¡¨1W(Jb\8fQ(êÀs(ÊbÍa(êÌ\15\8a\83\18\8a:u\85¢¬ö \86¢JM(\8aê\18ÄPÔ©+\14\a1\14
+EYíA\fE\95\9aP\14Õ1\88¡¨SW(Êj\ fb(êÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢JM(\8aê\18ÄPÔ©+\14\a1\14
+EYíA\fE\95\9aP\14Õ1\88¡¨SW(Êj\ fb(êÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢JM(\8aê\18ÄPÔ©+\14\a)\14uè9\14e³æ(\14uä9\14e²æ0\14UfBQDÇ \86¢N]¡(«=\88¡¨SW(Êj\ fb(ªÔ\84¢¨\8eA\fE\9dºBQV{\10CQ§®P\94Õ\1eÄPÔ©+\14\a1\14UjBQTÇ \86¢N]¡(«=\88¡¨SW(Êj\ fb(ªÔ\84¢¨\8eA\fE\9dºBQV{\10CQ§®P\94Õ\1eÄPÔ©+\14\a1\14\ eEI\9d\83\18\8a:u\85¢¬ö \86¢N]¡(«=\88¡¨SW(Êj\ fR(ªÐ\15\8a¢Ùs\14\8a\1c\8a2Ys\18\8a:s\85¢\8cö \86¢JM(\8aê\18ÄPÔ©+\14\a1\14
+EYíA\fE\9dºBQV{\10CQ¥&\14Eu\fb(êÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢JM(\8aê\18ÄPÔ©+\14\a1\14
+EYíA\fE\9dºBQV{\10CQ¥&\14Eu\fb(êÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢N]¡(«=\88¡¨R\13\8a¢:\ 61\14
+EYíA
+E\1dz\ eE٬9
+E\15¹BQ${\ eCQg®P\94Ñ\1eÄPÔ©+\14\a1\14
+EYíA\fE\95\9aP\14Õ1\88¡¨SW(Êj\ fb(êÔ\15\8a²Ú\83\18\8a:u\85¢¬ö \86¢JM(\8aê\18ÄPÔ©+\14\a1\14
+EYíA\fE\8dºCQRç \86¢N]¡(«=\88¡¨SW(Êj\ fb(
+õ£
+Eñ ë¢Ë\83\1c\86¢p\90o{\85Þíï\1fÍw\1c\8a®k.BÑ?__ßýöëßßDA\ fçc]¬¾­D\9fNß)\1e\ f§ß\81ýþ±\ e§ÊE\97§z['=<\9d\8eþüÞAÞQÏ×~ öàA%zúÊ\7fý\146êº\96Õ1x ®lV©épQíAîp\95\9a\ e\17Õ\1eä\ eW©épQíAîp\8dº;\RÇ w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÝá\92:\ 6¹ÃUj:\T{\90;\¥¦ÃEµ\a¹Ã5êîpI\1d\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=H\1d®0Óá\82ØcØá*pu¸(Ö\1cw¸ÊL\87\8bh\ fr\87«Ôt¸¨ö w¸FÝ\1d.©c\90;\¥¦ÃEµ\a¹ÃUj:\T{\90;\£î\ e\97Ô1È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\1auw¸¤\8eAîp\95\9a\ e\17Õ\1eä\ eW©épQíAîp\8dº;\RÇ w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÝá\92:\ 6¹ÃUj:\T{\10;\\85®\ e\17Í\9aÃ\ eW\91«ÃE²æ¸Ã5æîp     \1d\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\1auw¸¤\8eAîp\95\9a\ e\17Õ\1eä\ eW©épQíAîp\95\9a\ e\17Õ\1eä\ eר»Ã%u\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÝá\92:\ 6¹ÃUj:\T{\90;\¥¦ÃEµ\a¹ÃUj:\T{\90;\¡¾v¸ ÎAîp\95\9a\ e\17Õ\1eä\ eW©épQíAîp\95\9a\ e\17Õ\1eÄ\ e× épÉì9ìp\15¹:\$k\8e;\e¦ÃE´\a¹Ã5êîpI\1d\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®Qw\87\18ä\ eW©épQíAîp\95\9a\ e\17Õ\1eä\ eר»Ã%u\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸FÝ\1d.©c\90;\¥¦ÃEµ\a¹ÃUj:\T{\90;\¥¦ÃEµ\a¹Ã5êîpI\1d\83Üá*5\1d.ª=\88\1d®BW\87\8bfÍa\87kÈt¸Dö\1cw¸ÊL\87\8bh\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÝá\92:\ 6¹ÃUj:\T{\90;\¥¦ÃEõÿ¯ì~zì:Óë\8a\7f\15\rÉA\17\7fÅ¡a$@\10 Aâ\f\r\10\89\9an3-P\81E%ð·Ï-Þg¿÷ì·x\16\17gvP½\7fGtZ¤Î³îU\ fr\87«Ôt¸¨ö w¸F]\1d.©Û w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸B½u¸ î\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\9e÷¥®Ã¥\aI\87{x\90·÷g\1dîù\83üä\17¶^~\8b\7füðÀ\1dîüÌ­ÃýóÓÇO_þúÇÇÏ_>\7fýø·O_¾\97ͼzúÍí¶þü×ëõ»û\93\95ÒÀÃ%¥9<ÛyJóü1 ¥A´\a9¥QjR\1aT{\90S\1a£®\94\86Ôm\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a£®\94\86Ôm\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥1êJiHÝ\ 69¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥1êJiHÝ\ 69¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a£®\94\86Ôm\90S\1a¥&¥Aµ\a1¥Qè¤4hÖ\1c¦4\8a\9c\94\ 6É\9aã\94Æ\98+¥!t\eä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94ƨ+¥!u\eä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\8cºR\1aR·ANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\8cºR\1aR·ANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94F¨·\94\ 6Ô}\90S\1a¥&¥Aµ\a9¥QjR\1aT{\90S\1a¥&¥Aµ\a1¥1hR\1a2{\ eS\1aENJ\83dÍqJ£Ì¤4\88ö §4F])\r©Û §4JMJ\83j\ frJ£Ô¤4¨ö §4JMJ\83j\ frJcÔ\95Ò\90º\rrJ£Ô¤4¨ö §4JMJ\83j\ frJcÔ\95Ò\90º\rrJ£Ô¤4¨ö §4JMJ\83j\ frJ£Ô¤4¨ö §4F])\r©Û §4JMJ\83j\ frJ£Ô¤4¨ö §4JMJ\83j\ frJcÔ\95Ò\90º\rrJ£Ô¤4¨ö ¦4
+\9d\94\ 6Í\9aÃ\94Æ\90Ii\88ì9Ni\94\99\94\ 6Ñ\1eä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94ƨ+¥!u\eä\94F©IiPíANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\8cºR\1aR·ANi\94\9a\94\ 6Õ\1eä\94F©IiPíANi\84zKi@Ý\a9¥QjR\1aT{\90S\1a¥&¥Aµ\a9¥¡4Ĥ4ô Ii\ e\ fr\9eÒ\9c?ÈO~¥ÝÛË\ f½á\92æú#\15Òüúû\97/\9f~ýúñÓ_ÿöéyJòêîñé\9bxÖôó_«÷¯?\9cf4ׯÀ9\7f®ù\ 6\9cÛS\9d~\ 1γ\a8\8fv\88;\8eq²cÀ\14;$Ö\1c÷:\86L®CdÍq¬#ÈÕê\0Ùs\ê\18\ e\91\99\8e!Sé\10YsÜè\br%:@ö\1c\a:\86L\9fCdÍq\9dcÈÄ9DÖ\1c§9\86L\99CdÍq\97\95å\0Ùs\1cå\182M\ e\915ÇE\8e!\13ä\10Ys\9cã\brÕ8@ö\1c·8\86L\8aCdÍq\88cÈt8DÖ\1cW8\86L\84CdÍq\82#ÈUà\0ÙsÜß\18\r\915\87ñ\8d\11§½!ð8\86å\8dñ&¼!ï8ÆÙ\8d\0Wu\ 3bÏqscÈ$7DÖ\1c\a7\86LoCdÍqm#È\15Û\0Ùs\9cÚ\18\r\91\9d\8d!\93Ù\10Ys\1cÙ\182\8d\r\91\85\8d W`\ 3dÏq^cÈÔ5DÖ\1c·5\86LZCdÍqX#ÈÕÕ\0Ùs\Õ\182Q\r\915ÇI\8d!SÔ\10YsÜÓ\1829\r\915Ç1Í\8fÉ[KsNns\Ò\182!\r\91\19\8d!SÑ\10YsÜÐ\18\r\915\87\ 1\8d\10ÓÏ\0XcXÏ\18\19ò\8ec\9cÎ\18\f\895ÇÝ\8c W6\ 3dÏq4cÈ43DÖ\1c\173\86L0CdÍq.cÈÔ2DÖ\1c·2\82\f\90=Ç¡\8c!ÓÉ\10Ys\É\182\91\f\91\89\8c W!\ 3dÏq\1fcÈä1DÖ\1cÇ1\86L\eCdÍq\19\841DÖ\1cg1\82\U\f\90=ÇM\8c!\93Ä\10Ys\1cÄ\182=\f\915Ç5\8c!\13Ã\10Ys\9cÂ\br\950@ö\1cw0\86L\ 6CdÍa\ 4cÄi`\b<\8ea\ 1\ 40àÕ\18ç/\ 6LýBbÍqûbȤ/DÖ\1c\87/\86L÷BdÍqõ"È\15½\0Ùs\9c¼\18\v\915ǽ\8b!\93»\10Ys\1c»\18\v\915Ç¥\8b Wè\ 2dÏqæbÈT.DÖ\1c7.\86LâBdÍqàòcòÖ·\9c\93Û\1c×-\86LÜBdÍqÚbÈ\94-DÖ\1cw-\90j\98¬\ 5\9e"UËí)Þ>\9cE-§Oñ\93_\ fóúÂ_þ\ 1\17£\96ù\99ªZþúù\8fCØòòþÅó¶åþò7»§?~Ü\88ý9.\7fÖ¼\7f\7f\16·¬H\ 1\1eqU
+\87G<Ï\14\9e?\bt
+¨ö \97
+F]©\ 2©Û Ç
+JM­\80j\ fr¯ Ô\ 4\v¨ö '\vJM³\80j\ frµ`Ô\95-\90º\rr¸ Ô\94\v¨ö ·\vJM¼\80j\ fr¾`ÔÕ/\90º\rrÁ Ô$\f¨ö G\fJMÅ\80j\ frÇ Ô\84\f¨ö §\fF]-\ 3©Û ×\fJMÎ\80j\ fbРÐ)\1aЬ9l\1a\149Q\ 3\925ÇY\831W×@è6Èe\83R\936 Ú\83\1c7(5u\ 3ª=È}\83QWà@ê6È\89\83RÓ8 Ú\83\9(5\99\ 3ª=È¡\83RS: Ú\83Ü:\18\ e¤n\83\9c;(5½\ 3ª=ÈÅ\83R\93< Ú\83\1c=\18uU\ f¤n\83Ü=(5á\ 3ª=Èé\83RÓ> Ú\83\?(5ù\ 3ª=È\ 1\84Po\ 5\ 4¨û 7\10JM\ 4\81j\ fr\ 6¡Ôt\10¨ö \97\10JM
+\81j\ fb\faÐÔ\10\1cö\10\8a\9c \ 2É\9aã$B\99i"\10íA®"\8cº²\bR·A\ e#\94\9a2\ 2Õ\1eä6B©\89#PíAÎ#\94\9a>\ 2Õ\1eäB¨+\91 u\eäHB©©$PíAî$\94\9aP\ 2Õ\1eäT¨«\95 u\eäZB©É%PíA\ e&\94\9ab\ 2Õ\1eäfB©\89&PíAÎ&\8cºº      R·A.'\94\9at\ 2Õ\1eäxB©©'PíAî'\94\9a\80\ 2Õ\1eä\84¨«¡ u\eä\8aB©É(PíA\f)\14:%\ 5\9a5\87-\85!\13S\10Ùs\9cS(3=\ 5¢=ÈE\85R\93T Ú\83\1cU(5U\ 5ª=È]\85QWXAê6Èi\85RÓV Ú\83\W(5y\ 5ª=È\81\85RSX Ú\83ÜX\18uE\16¤n\83\9cY(5\9d\ 5ª=È¥\85R\93Z Ú\83\1c[\bõV[\80º\ fro¡Ô\ 4\17¨ö '\17JMs\81j\ fruq\1e\11¸ì\82\1e$ÝÅáAÎÃ\8bó\aùÉòâáýå\87\1f¹¼\98\9f©òâ\7fýöû¯/ß¿øûÇÏ_~ûüÇ×ý9\1f.ÿ%}|¼ÿå°ÿüWìÍýÙ¿\9açáÃë»\87o\7f\0\84çË\ f\1d\9fïîù\83\~Ç{÷Ý\aù\8ezýÙ\1f¨=x¢^~Ç{mÕëÏþ@íÁ\93¯\18ùö=+ÂÌw¶\80Øcø­-
+\9c¯mA±æø\8b[\94\99onA´\aù»[\94\9a/oAµ\aùë[\8cº¾¿\85Ôm\90¿ÁE©©£PíA®£\94\9a:
\1eä:ʨ«\8e"u\eä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\8cºê(R·A®£\94\9a:
\1eä:J©©£PíA®£\8cºê(R·A®£\94\9a:
\1eä:J©©£PíA®£\94\9a:
\1eä:ʨ«\8e"u\eä:J©©£PíA¬£\14:u\14\9a5\87u\94\8eB²æ¸\8e2檣\bÝ\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e2ꪣHÝ\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(£®:\8aÔm\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(£®:\8aÔm\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e\12ê­\8e\ 2u\1fä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA¬£\f\9a:\8aÌ\9eÃ:J\91SG!Ys\G)3u\14¢=Èu\94QW\1dEê6Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94RSG¡Ú\83\G\19uÕQ¤n\83\G)5u\14ª=Èu\94RSG¡Ú\83\G\19uÕQ¤n\83\G)5u\14ª=Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94QW\1dEê6Èu\94RSG¡Ú\83\G)5u\14ª=Èu\94RSG¡Ú\83\G\19uÕQ¤n\83\G)5u\14ª=\88u\94\8eB³æ°\8e2dê("{\8eë(e¦\8e\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e2ꪣHÝ\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(£®:\8aÔm\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(¡Þê(P÷A®£\94\9a:
\1eä:J©©£PíA®£¨õ1u\14=Hê¨Ã\83¼}}VG\9d?ÈOþ»\96îßܽz|ÇuÔüÌ÷ë¨ßÿüúý<êñîíÓ5ã\ 6<ÿ%{¸ü¥\9cåQI\86à\ 1W2txÀ³dèùc\9c&C ö\18&C
+\9cd\bÅ\9aãdH\99I\86\10íAN\86\94\9ad\bÕ\1eädȨ+\19"u\eädH©I\86PíAN\86\94\9ad\bÕ\1eädȨ+\19"u\eädH©I\86PíAN\86\94\9ad\bÕ\1eädH©I\86PíAN\86\8cº\92!R·AN\86\94\9ad\bÕ\1eädH©I\86PíAN\86\8cº\92!R·AN\86\94\9ad\bÕ\1eädH©I\86PíAN\86\94\9ad\bÕ\1eädȨ+\19"u\eädH©I\86PíAL\86\14\10\9a5\87É\90"'\19B²æ8\192æJ\86\bÝ\ 69\19Rj\92!T{\90\93!¥&\19\a9\192êJ\86\ 69\19Rj\92!T{\90\93!¥&\19\a9\19Rj\92!T{\90\93!£®d\88Ôm\90\93!¥&\19\a9\19Rj\92!T{\90\93!£®d\88Ôm\90\93!¥&\19\a9\19Rj\92!T{\90\93!¥&\19\a9\19\12ê-\19\ 2u\1fädH©I\86PíAN\86\94\9ad\bÕ\1eädH©I\86PíAL\86\f\9ad\88Ì\9eÃdH\91\93\f!Ys\9c\f)3É\10¢=ÈÉ\90QW2Dê6ÈÉ\90R\93\f¡Ú\83\9c\f)5É\10ª=ÈÉ\90R\93\f¡Ú\83\9c\f\19u%C¤n\83\9c\f)5É\10ª=ÈÉ\90R\93\f¡Ú\83\9c\f\19u%C¤n\83\9c\f)5É\10ª=ÈÉ\90R\93\f¡Ú\83\9c\f)5É\10ª=ÈÉ\90QW2Dê6ÈÉ\90R\93\f¡Ú\83\9c\f)5É\10ª=ÈÉ\90R\93\f¡Ú\83\9c\f\19u%C¤n\83\9c\f)5É\10ª=\88É\90B'\19B³æ0\192d\92!"{\8e\93!e&\19\a9\19Rj\92!T{\90\93!¥&\19\a9\192êJ\86\ 69\19Rj\92!T{\90\93!¥&\19\a9\19Rj\92!T{\90\93!£®d\88Ôm\90\93!¥&\19\a9\19Rj\92!T{\90\93!¡Þ\92!P÷AN\86\94\9ad\bÕ\1eädH©I\86PíAN\86¨\7f\10=H\92¡Ã\83\9c'Cç\ fò\93_¨tù?õýåÿ\83a24?SÉЧ/\7fýããß?ÿöÛÓ7*½¼\7fñ\9djèõå¯èÝ»7¿\1c\8cýA\1eî^]þd~öï²Jð\ 1ϸ\82\8fÃ3\9e\a\1fÏ\1f\ 4\82\ fT{\90\83\ f¥&ø@µ\a9ø0ê
+>HÝ\ 69øPj\82\ fT{\90\83\ f¥&ø@µ\a9øPj\82\ fT{\90\83\ f£®à\83Ôm\90\83\ f¥&ø@µ\a9øPj\82\ fT{\90\83\ f£®à\83Ôm\90\83\ f¥&ø@µ\a9øPj\82\ fT{\90\83\ f¥&ø@µ\a9ø0ê
+>HÝ\ 69øPj\82\ fT{\10\83\ f\85\81fÍað¡È      >\90¬9\ e>\8c¹\82\ fB·A\ e>\94\9aà\ 3Õ\1eäàC©       >PíA\ e>\8cº\82\ fR·A\ e>\94\9aà\ 3Õ\1eäàC©       >PíA\ e>\94\9aà\ 3Õ\1eäàè+ø u\eäàC©       >PíA\ e>\94\9aà\ 3Õ\1eäàè+ø u\eäàC©       >PíA\ e>\94\9aà\ 3Õ\1eäàC©        >PíA\ e>\84z\v>@Ý\a9øPj\82\ fT{\90\83\ f¥&ø@µ\a9øPj\82\ fT{\10\83\ f\83&ø ³ç0øPä\ 4\1f\1c\a\1fÊLð\81h\ frðaÔ\15|\90º\rrð¡Ô\ 4\1f¨ö \a\1fJMð\81j\ frð¡Ô\ 4\1f¨ö \a\1fF]Á\a©Û \a\1fJMð\81j\ frð¡Ô\ 4\1f¨ö \a\1fF]Á\a©Û \a\1fJMð\81j\ frð¡Ô\ 4\1f¨ö \a\1fJMð\81j\ frðaÔ\15|\90º\rrð¡Ô\ 4\1f¨ö \a\1fJMð\81j\ frð¡Ô\ 4\1f¨ö \a\1fF]Á\a©Û \a\1fJMð\81j\ fbð¡Ð >Ь9\f>\f\99à\83È\9eãàC\99        >\10íA\ e>\94\9aà\ 3Õ\1eäàC©        >PíA\ e>\8cº\82\ fR·A\ e>\94\9aà\ 3Õ\1eäàC©       >PíA\ e>\94\9aà\ 3Õ\1eäàè+ø u\eäàC©       >PíA\ e>\94\9aà\ 3Õ\1eäàC¨·à\ 3Ô}\90\83\ f¥&ø@µ\a9øPj\82\ fT{\90\83\8fótÁ\ 5\1fô         >\ e\ fr\1e|\9c?ÈÏ}GÌýããÝýå\7f à#?s\12|<}IÌYññîò÷Â\87_\ eÈþ$÷w\8f\97¿\8c³âc*\bzÈüÐñ!O+\88ï<Èy\ 5\81ê6\88\15\84\82\a±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+B©© PÝ\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+B©© PÝ\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA(5\15\ 4ªÛ V\10N\9d
+\82Õ\1e¤
+¡×
+\82Í\9a£
\91×
+\82É\9aÃ
+B\99© \10Ý\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+B©© PÝ\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA(5\15\ 4ªÛ V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA(5\15\ 4ªÛ V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA8u*\bV{\10+\b£®
+\82Ô}\10+\b§N\ 5Áj\ fb\ 5áÔ© XíA¬ \9c:\15\ 4«=H\15\84\82@³ç¨\82päµ\82`²æ°\82pæT\10\8cö V\10JM\ 5\81ê6\88\15\84\82\a±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+B©© PÝ\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+B©© PÝ\ 6±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA(5\15\ 4ªÛ V\10N\9d
+\82Õ\1eÄ
+©SA°Ú\83XA8u*\bV{\10+\b¥¦\82@u\eÄ
+©SA°Ú\83TA8ôZA°YsTA(r*\b${\ e+\bgN\ 5Áh\ fb\ 5áÔ© XíA¬ \9c:\15\ 4«=\88\15\84RSA º\rb\ 5áÔ© XíA¬ \9c:\15\ 4«=\88\15\84\82\a±\82Pj*\bT·A¬ \9c:\15\ 4«=\88\15\84\82\a±\820ꪠHÝ\a±\82pêT\10¬ö V\10N\9d
+\82Õ\1eÄ
+\ 2Îùª\82À\a\99\1f:>ÈÛ7'\15\ 4<ÈÏ}íÅýû·ßþ}5XAÌÏ<¯ þùÕ«\87ß¾~üõ÷/ÿûÏ\97÷/~ýúù÷/ϯ·÷wo\1eßýr\90\9eÿÚ½}\7fökw;^Ã\93®ãõáIÏ\8f×Ï\1f\ 4\8eרö \1f¯\95\9aã5ª=ÈÇk£®ã5©Û \1f¯\95\9aã5ª=ÈÇk¥æx\8dj\ fòñZ©9^£Ú\83|¼6ê:^\93º\ròñZ©9^£Ú\83x¼Vè\1c¯Ñ¬9<^+r\8e×HÖ\1c\1f¯\8d¹\8e×\84n\83|¼Vj\8eרö \1f¯\95\9aã5ª=ÈÇk£®ã5©Û \1f¯\95\9aã5ª=ÈÇk¥æx\8dj\ fòñZ©9^£Ú\83|¼6ê:^\93º\ròñZ©9^£Ú\83|¼Vj\8eרö \1f¯\8dº\8eפn\83|¼Vj\8eרö \1f¯\95\9aã5ª=ÈÇk¥æx\8dj\ fòñZ¨·ã5¨û \1f¯\95\9aã5ª=ÈÇk¥æx\8dj\ fòñZ©9^£Ú\83x¼6h\8e×dö\1c\1e¯\159Çk$k\8e\8f×ÊÌñ\1aÑ\1eäãµQ×ñ\9aÔm\90\8f×JÍñ\1aÕ\1eäãµRs¼Fµ\aùx­Ô\1c¯QíA>^\eu\1d¯IÝ\ 6ùx­Ô\1c¯QíA>^+5ÇkT{\90\8f×F]ÇkR·A>^+5ÇkT{\90\8f×JÍñ\1aÕ\1eäãµRs¼Fµ\aùxmÔu¼&u\eäãµRs¼Fµ\aùx­Ô\1c¯QíA>^+5ÇkT{\90\8f×F]ÇkR·A>^+5ÇkT{\10\8f×
+\9dã5\9a5\87ÇkCæxMdÏññZ\999^#Ú\83|¼Vj\8eרö \1f¯\95\9aã5ª=ÈÇk£®ã5©Û \1f¯\95\9aã5ª=ÈÇk¥æx\8dj\ fòñZ©9^£Ú\83|¼6ê:^\93º\ròñZ©9^£Ú\83|¼Vj\8eרö \1f¯\85z;^\83º\ fòñZ©9^£Ú\83|¼Vj\8eרö \1f¯é\0k\8e×ô 9^\1f\1eäüx}þ ?ù\11þ§?X<òíúú#ß=]¿þó\8f\7f¥\7fiÃÓÇëßýrC\9eÿª=ýùâG\9fà?\7fÆõ\ 1þÛ3\9e\7f~ÿÙSÀÇ÷\81ì9þð¾!óÙ}"k\8e?¹oÈ|p\9fÈ\9aã\8fí\e2\9fÚ'²æø3û\82\ 3\90=ÇÍ\83!\93<\10Ys\1c<\18\ 3\915ǵ\83 Wì\0dÏqê`È\94\ e\1cw\ e\86Læ@dÍqä`È4\ e\1c\17\ e\82\\81\ 3\90=Çy\83!S7\10YsØ6\18\ 6\ 2\8fc\186\18\ 6ò\8ec\5\bpE\r ö\1c'\r\86LÑ@dÍqÏ`Èä\f\1cÇ\f\82\-\ 3\90=Ç%\83!\132\10Ys\9c1\182\15\ 3\91\r\83!\930\10Ys\1c0\b\v\1c×\v\86L¼@dÍqº`È\94\v\1cw\v\82\ 2\90=ÇÑ\82!Ó,\10Ys\,\18\ 2\915ǹ\82!S+\10YsÜ*ü\98¼¥
+çä6Ç¡\82!Ó)\10Ys\)\182\91\ 2\91\89\82!S(\10YsØ'\b1y\ 2\805\86q\82ñ¦M ï8Æe\82\ 1\13&\90Xs\9c%\brU   @ö\1c7    \86L\92@dÍq\90`Èô\b\1c×\b\86L\8c@dÍq\8a ÈU"\0ÙsÜ!\182\19\ 2\91\11\82!Ó \10Ys\ \br\ 5\b\1cç\a\86L}@dÍq{`Ȥ\a\1c\87\a\86Lw@dÍqu È\15\1d\0Ùs\9c\1c\18\ 1\915ǽ\81!\93\e\10Ys\1c\e\18\ 1\915Ç¥\81 Wh\0dÏqf`ÈT\ 6\1c6\ 6F\9cÄ\80Àã\18\ 6\ 6ÂK_\0^\8dq]`ÀÄ\ 5\1c§\ 5\86LY@dÍqW`Èd\ 5\1cG\ 5\82\M\ 1\90=ÇE\81!\13\14\10Ys\9c\13\1825\ 1\915Ç-\81!\93\12\10Ys\1c\12\bru\ 4\1cW\ 4\86LD@dÍqB`È\14\ 4\1c÷\ 3?&oùÀ9¹Íq<`È´\ 3\1c\97\ 3\86L8@dÍq6\0÷oS\rÀS$\1a¸=Åy3pú\14?ùy÷7\97¿ªËSc30?s\1e\rüþç×\97÷/~û^5pù§Ù\ fO\17Ò\9b³?ÌÃÝÛË\1fÅN²\81\86ç\çíÃs\9eß·\9f?\b\1c¸QíA>q\euݸIÝ\ 6ùÊ­Ô\9c¹QíA>t+5\97nT{\90oÝF]ÇnR·A>w+5÷nT{\90/ÞJÍÉ\eÕ\1e䣷RsõFµ\aùîmÔuø&u\eäÓ·RsûFµ\añú­Ð9\7f£Ysx\0Wä\À\91¬9¾\81\es\1dÁ       Ý\ 6ù\f®ÔÜÁQíA¾\84+5§pT{\90\8fáF]×pR·A¾\87+5\aqT{\90OâJÍM\1cÕ\1e䫸Rs\16\aù0nÔu\19'u\eäÛ¸Rs\1c\aù<®ÔÜÇQíA¾\90\eu\9dÈIÝ\ 6ùH®Ô\ÉQíA¾\93+5\87rT{\90OåJÍ­\1cÕ\1eäk¹PoçrP÷A>\98+5\17sT{\90oæJÍÑ\1cÕ\1eä³¹Rs7Gµ\añrnÐ\9cÎÉì9<\9e+r®çHÖ\1cßÏ\95\99\ 3:¢=È't£®\e:©Û _Ñ\95\9a3:ª=È\87t¥æ\92\8ej\ fò-]©9¦£Ú\83|N7꺧\93º\ròE]©9©£Ú\83|TWj®ê¨ö ßÕ\8dº\ eë¤n\83|ZWjnë¨ö _×\95\9aó:ª=È\av¥æÂ\8ej\ fò\8dݨëÈNê6Ègv¥æÎ\8ej\ fò¥]©9µ£Ú\83|lWj®í¨ö ßÛ\8dº\ eî¤n\83|rWjnî¨ö ^Ý\15:gw4k\ e\ fï\86Ìå\9dÈ\9eãÛ»2s|G´\aùü®ÔÜßQíA¾À+5'xT{\90\8fðF]WxR·A¾Ã+5\87xT{\90OñJÍ-\1eÕ\1eäk¼Rs\8e\aù oÔu\91'u\eä\9b¼Rs\94\aù,¯ÔÜåQíA¾Ì\võv\9a\au\1fäã¼Rs\9d\aù>¯Ô\1cèQíA>Ñ\9f\1f\9bÝ\8d\9e\1e$GúÃ\83¼}{v¥?\7f\90¿¼~úÓØ·¿%Ã\99þò»ìëo/\87^?½\9c>ùhÿüP~æé\89.\7fK½{{÷ò/\ fï\1f_üãËûÇ\17ÿð_®ÿË\7f{:Þÿqý\9fÿóË¿Ü¿zñéß¾|z:Þ_ÿßþéÿ|úõóÓ×Øÿzýßÿã\9f_¾}\8bý\1fÏß\84\8bvC¿ÿK}ù[ÝÉ]\7f½\91\87¿°õFþð\17vþFþù\83À\eyT{\90ßÈ\e\91'u\eä7òJÍ\eyT{\90ßÈ+5oäQíA~#oÔõF\9eÔm\90ßÈ+5oäQíA~#¯Ô¼\91\aù\8d¼RóF\1eÕ\1eä7òB½½\91\au\1fä7òJÍ\eyT{\90ßÈ+5oäQíA~#¯Ô¼\91\añ\8d¼AóF\9eÌ\9eÃ7ò\8a\9c7òHÖ\1c¿\91WfÞÈ#Ú\83üFÞ¨ë\8d<©Û ¿\91WjÞÈ£Ú\83üF^©y#\8fj\ fò\ey¥æ\8d<ª=Èoä\8dºÞÈ\93º\rò\ey¥æ\8d<ª=Èoä\95\9a7ò¨ö ¿\917êz#Oê6Èoä\95\9a7ò¨ö ¿\91WjÞÈ£Ú\83üF^©y#\8fj\ fò\ey£®7ò¤n\83üF^©y#\8fj\ fò\ey¥æ\8d<ª=Èoä\95\9a7ò¨ö ¿\917êz#Oê6Èoä\95\9a7ò¨ö ¾\91Wè¼\91G³æð\8d¼!óF\9eÈ\9eã7òÊÌ\eyD{\90ßÈ+5oäQíA~#¯Ô¼\91\aù\8d¼Q×\eyR·A~#¯Ô¼\91\aù\8d¼RóF\1eÕ\1eä7òJÍ\eyT{\90ßÈ\e\91'u\eä7òJÍ\eyT{\90ßÈ+5oäQíA~#/ÔÛ\eyP÷A~#¯Ô¼\91\aù\8d¼RóF\1eÕ\1eä7òø\9a\91§\aÉ\eùÃ\83\9c¿\91?\7f\90\9fü®Ý§\7f\98½üW\18?87?S\1f\9cûòû×Ïÿòï\1fÿþéß\9eý«a\1f>¼¾{ú4Îmúù/Öýû³ÏÊ=ý§\1f¾ýÙ\ f\1e-?t|´»çÏqùÍîÝý÷\1eä;êõg\7f öà\89zùÍîµU¯?û\ 3µ\a¿ÿ\16ôò_Ùwʼþ$\8a=vâ]~\9b{/Áo?ú\ 3±æNÈËïq¯?Hóú³?@{ðD½üü+«^\7fö\aj\ f~_½üw÷Ýå¿ßJ\9d\9feu\e<Q/¿Ç½±êõg\7f öà\89\97­Ô|ÿ6ª=ÈßÀmÔõ\15ܤn\83ü%ÜJÍ·p£Ú\83ü=ÜJÍG\95QíAþ¨²RóQeT{\90?ªlÔõQeR·Aþ¨²RóQeT{\90?ª¬Ô|T\19Õ\1eä\8f*\eu}T\99Ôm\90?ª¬Ô|T\19Õ\1eä\8f*+5\1fUFµ\aù£ÊJÍG\95QíAþ¨²Q×G\95\ 6ù£ÊJÍG\95QíAü¨²Bç£ÊhÖ\1c~TY\91óQe$k\8e?ªlÌõQeB·Aþ¨²RóQeT{\90?ª¬Ô|T\19Õ\1eä\8f*\eu}T\99Ôm\90?ª¬Ô|T\19Õ\1eä\8f*+5a\14ª=Èa\94R\13F¡Ú\83\1cF\19u\85Q¤n\83\1cF)5a\14ª=Èa\94R\13F¡Ú\83\1cF\19u\85Q¤n\83\1cF)5a\14ª=Èa\94R\13F¡Ú\83\1cF)5a\14ª=Èa\94Poa\14¨û \87QJM\18\85j\ fr\18¥Ô\84Q¨ö \87QJM\18\85j\ fb\18\84Qdö\1c\86Q\8a\9c0
\9aã0J\99 £\10íA\ e£\8cºÂ(R·A\ e£\94\9a0
\1eä0J© £PíA\ e£\94\9a0
\1eä0ʨ+\8c"u\eä0J©        £PíA\ e£\94\9a0
\1eä0ʨ+\8c"u\eä0J©        £PíA\ e£\94\9a0
\1eä0J© £PíA\ e£\8cºÂ(R·A\ e£\94\9a0
\1eä0J© £PíA\ e£\94\9a0
\1eä0ʨ+\8c"u\eä0J©        £PíA\f£\14:a\14\9a5\87a\94!\13F\11Ùs\1cF)3a\14¢=Èa\94R\13F¡Ú\83\1cF)5a\14ª=Èa\94QW\18Eê6Èa\94R\13F¡Ú\83\1cF)5a\14ª=Èa\94R\13F¡Ú\83\1cF\19u\85Q¤n\83\1cF)5a\14ª=Èa\94R\13F¡Ú\83\1cF   õ\16F\81º\ fr\18¥Ô\84Q¨ö \87QJM\18\85j\ fr\18\8f    £èA\12F\1d\1eä<\8c:\7f\90\9füFñ\8búæò\ f\ 2\18FÍÏ<ÿFñÏ_>\7fýn\eõúÕã·KÑmý;¿^÷g¿^·À\ 4\9en\ 5&\87§;\ fL\9e?\b\ 4&¤n\83\1c\98(5\81 ª=È\81\89R\13\98 Ú\83\1c\98\18u\ 5&¤n\83\1c\98(5\81       ª=È\81\89R\13\98 Ú\83\1c\98(5\81        ª=È\81\89QW`Bê6È\81\89R\13\98 Ú\83\1c\98(5\81       ª=È\81\89QW`Bê6È\81\89R\13\98 Ú\83\1c\98(5\81       ª=È\81\89R\13\98 Ú\83\1c\98\18u\ 5&¤n\83\1c\98(5\81       ª=\88\81\89B'0A³æ00Qä\ 4&HÖ\1c\a&Æ\\81       ¡Û \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&F]\81       ©Û \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&B½\ 5& î\83\1c\98(5\81 ª=È\81\89R\13\98 Ú\83\1c\98(5\81        ª=\88\81\89A\13\98\90Ùs\18\98(r\ 2\13$k\8e\ 3\13e&0A´\a901ê
+LHÝ\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£®À\84Ôm\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£®À\84Ôm\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê
+LHÝ\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£®À\84Ôm\90\ 3\13¥&0Aµ\a10Qè\ 4&hÖ\1c\ 6&\86L`BdÏq`¢Ì\ 4&\88ö \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&F]\81        ©Û \a&JM`\82j\ fr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`bÔ\15\98\90º\rr`¢Ô\ 4&¨ö \a&JM`\82j\ fr`"Ô[`\ 2ê>È\81\89R\13\98 Ú\83\1c\98(5\81   ª=È\81    \ 6\13"0¡\aI`rx\90·ïÎ\ 2\93ó\aù¹oÞùðþîíåOnÔ\97Ì\8fÜò\92\8f\7fûôõãç/\7füöû×7\9fÿúñÿ½¼ÿðâ\7f\9e\95&¯?Ü=>¼ùåæ<ÿ\85{ûæ´4É]\15\1e3?sxÌÓ«êó§8?ª"YsxRUä\T\91¬9¼§*rΩHÖ\1c\1eS\r\99[*\91=\87\97TEÎ!\15É\9a£3ª\12¯WT\ 4\8fctCUÞõ\84\8aÞq\f\ f¨\ 6Ìý\94Ä\9eÃë©"çx\8adÍáéT\91s9E²æðnjÈ\9cM\89ì9<\9a*rn¦HÖ\1c^L\159\aS$k\ eÏ¥\8a\9ck)\925\87·RCæTJdÏá¡T\91s'E²æðJªÈ9\92"Ysx"5d.¤Dö\1cÞG\159çQ$k\ e\8f£\8a\9cÛ(\925\87\97QEÎa\14É\9aó¨ ×U\14Èm\ e\8a\9c\93(\925\87\aQEÎ=\14É\9aÃk¨"ç\18\8adÍÑ)Ô\88s       %°Æè\ eª¼ë\19\14½ã\18\1eA\1587P\14k\ e\86Ì\ 1\94È\9eÃó§"çú\89dÍáíS\91súD²æðð©È¹{"Ysxõ4d\8e\9e\1c\9e<\159\17O$k\ eï\9d\8a\9cs'\925\87ÇNCæÖIdÏá¥S\91sèD²æð̩ȹr"YsxãTä\9c8\91¬9<p\1a2÷M"{\ e¯\9b\8a\9cã&\925\87§MEÎe\13É\9aû¦"ç¬\89dÍáQÓ\90¹i\12ÙsxÑTä\1c4\91¬9:g*ñzÍDð8F·LãÍ)\93¼\1aÃC¦\ 2ç\8e\89bÍá\15S\91sÄD²æð\84©È¹`"Ysx¿4dÎ\97\1c\1e/\159·K$k\ e/\97\8a\9cÃ%\925\87gKEÎÕ\12É\9aÃ\9b¥!s²$²çð`©È¹W"Ysx­Tä\1c+\91¬9<U
+r]*\81ÜæðN©È9S"Ysx¤TäÜ(\91¬9¼PÒ\9dM\1c(é)æg\ eOqz\9e<\7f\8a\9fûøûåoHoß?àur~d»NþþçקóäÓmòñé6ùòþÅÉyòò\aÊ7ï\7f¹Aßû üãÙy2\1f¬\85çÌÏ\1c\9eóôcµÏ\9fâüSµHÖ\1c~¦V\91ó\91Z$k\ e?PkÈÜ}\89ì9¼û*rî¾HÖ\1cÞ}\159w_$k\ eï¾\8a\9c»/\925\87w_CæîKdÏáÝW\91s÷E²æèî«ÄëÝ\17Áã\18Ý}\95w½û¢w\1cû¯\ 1s÷%±çðî«È¹û"Ysx÷UäÜ}\91¬9¼û\1a2w_"{\ eï¾\8a\9c»/\925\87w_EÎÝ\17É\9aû¯"çî\8bdÍáÝ×\90¹û\12Ùsx÷UäÜ}\91¬9¼û*rî¾HÖ\1cÞ}\r\99»/\91=\87w_EÎÝ\17É\9aû¯"çî\8bdÍáÝW\91s÷E²æðî+Èu÷\ 5r\9bû¯"çî\8bdÍáÝW\91s÷E²æðî«È¹û"Yst÷5âÜ}  ¬1ºû*ïz÷Eï8\86w_\ 5ÎÝ\17Å\9aû¯!s÷%²çðî«È¹û"Ysx÷UäÜ}\91¬9¼û*rî¾HÖ\1cÞ}\r\99»/\91=\87w_EÎÝ\17É\9aû¯"çî\8bdÍáÝ×\90¹û\12Ùsx÷UäÜ}\91¬9¼û*rî¾HÖ\1cÞ}\159w_$k\ eï¾\86ÌÝ\97È\9eû¯"çî\8bdÍáÝW\91s÷E²æðî«È¹û"Ysx÷5dî¾Dö\1cÞ}\159w_$k\8eî¾J¼Þ}\11<\8eÑÝ×xs÷%¯Æðî«À¹û¢Xsx÷UäÜ}\91¬9¼û*rî¾HÖ\1cÞ}\r\99»/\91=\87w_EÎÝ\17É\9aû¯"çî\8bdÍáÝW\91s÷E²æðîkÈÜ}\89ì9¼û*rî¾HÖ\1cÞ}\159w_$k\ eï¾\82\w_ ·9¼û*rî¾HÖ\1cÞ}\159w_$k\ eï¾xÀüñÝ\97\9eb~æð\14\9fÜ}Ï\9fâç>\95úþò÷@>û^\7fâpõýãß¿üºÎ½'_zþêîññþ\975þüWê=|çùå?E\ f\81Ûc=\7f+÷êòwÙ÷ÏõïPß~\10­ÃÔ   vùûëë\ fJ»þ$rDZ\13ïúmïÆ\9b/\8f'ï8\86_\1c/¼|m<x5\86_\19o¼ùÂxò\8ecøeñÆ\9b¯\8a'ï8\86_\13/¼|I<x5\86_\10o¼ùzxò\8ecøÕðÆ\9b/\86'ï8\86_
+o¼ùJxò\8ecøuðÂK³\ 2^\8da±b¼  VÈ;\8ea®b¼©UÈ;\8ea«"¼¤*àÕ\18\86\9bN\85¼ã\18V*Æ\9bH\85¼ã\18&*Æ\9bB\85¼ã\18ö)ÂK\9e\ 2^\8da\9cb¼iSÈ;\8eQ\99b¸k\98BÚa\8a²\14\83\14Â\ eSؤ\b-I
+p5\86A\8añ¦G!ï8\865\8añ&F!ï8\86)\8aðR¢\80WcØ¡\18o2\14ò\8ec\18¡\18o\1a\14ò\8ecX \18o\ 2\14ò\8ec\98\9f\b/õ  x5\86í\89ñ&=!ï8\86á\89ñ¦;!ï8\86Õ\89ð\12\9d\80Wc\98\9c\18o\8a\13ò\8e\9b\18or\13ò\8ec\18\9b\18oZ\13ò\8ecX\9aüØ[¡É¹×c\98\99\18o*\13ò\8e\98\18o\12\13ò\8ec\18\98\18\12ò\8ecT\97\b\12Ð\8eS\94\96\18ìZ\96\10v\98®Äh\93\95\10w\1cèDxiJÀ«1,J\8c7A  yÇ1ÌI\8c75        yÇ1lI\8c7)        yÇ1\fI\84\97\8e\ 4¼\1aÃ\8aÄx\13\91\90w\1cÃ\84ÄxS\90\90w\1cÃ~DxÉGÀ«1\8cG\8c\byÇ1,G\8c\byÇ1ÌF\8c\byÇ1lF\84\97d\ 4¼\1aÃ`ÄxÓ\8b\90w\1cÃZÄx\13\8b\90w\1cÃTÄxS\8a\90w\1cÃNDxÉDÀ«1\8cD\8c7\8d\byÇ1*D\fw\rDH;LQ\1e"°©C\0;Na\eb´IC\88;\8ea\18b¼éBÈ;\8ea\15\89BÈ;\8ea\12\14!àÕ\18ö Æ\9b\1c\84¼ã\18Æ Æ\9b\16\84¼ã\18\96 Æ\9b\10\84¼ã\18f ÂK\ 5\ 2^\8da\ 3b¼I@È;\8ea\0b¼é?È;\8eaýñcoÅ\1fç^\8faúa¼)?È;\8ea÷a¼É>È;\8e\ 1%\83h>à\11æGn\8fpZ|\9c>ÂÏ}ÐÿíãÝ»w\1f°ø\98\1f9$\1fÿüêÕÿü~þo¹\7føpùuxõøËm|\7f\80\87o\7f&ýþ¯ÓÃ\87×w\ fO\7f\b\83gËÏ\1c\9eíîùS\~\7fzwÿ\9d§ø\ eyýQ&kî\84¼ü\16õZ\92×\1fe²æN\ 2\90§üE\80\13Ò\0WS\94Ò(íÚÒ w\1cÃ\9aF\81\93Ó Xs\18Ô(r\8a\1a$k\ e\9b\1aC&ª!²ç0«Qät5HÖ\1c\965\8a\9c´\ 6É\9aøÆ\90©k\88ì9ìk\149\81\r\925\87\89\8d"§±A²æ°²Qäd6HÖ\1c\866\86LiCdÏak£È\89m\90¬9Ìm\14\r\925\87Å\8d!\93Ü\10Ùs\18Ý(rª\e$k\ e»\eENx\83dÍaz£Èio\90¬9¬o\f\99ü\86È\9eÃ\0G\91Sà YsÔà(ñ\1aá x\1c£\fGy×\ e\a½ã\18\968\ 6L\8aCbÏa\8c£È©q\90¬9ìq\149A\ e\925\87I\8e!Óä\10ÙsXå(r²\1c$k\ eÃ\1cEN\99\83dÍa\9b£È\89s\90¬9Ìs\f\99>\87È\9eÃBG\91\93è Ys\18é(r*\1d$k\ e;\1dC&Ô!²ç0ÕQä´:HÖ\1cÖ:\8a\9c\\aÉ\9aÃ`G\91Sì YsØì\brE;@ns\98í(rº\1d$k\ eË\1dENº\83dÍa¼£È©w\90¬9êw\8c8\ 1\ f\815F  \8fò®\r\ fzÇ1¬x\148\19\ f\8a5\87!\8f!Sò\10ÙsØò(rb\1e$k\ es\1eENÏ\83dÍaÑ£ÈIz\90¬9\8cz\f\99ª\87È\9eîG\91\13ö Ys\98ö(rÚ\1e$k\ eë\1eC&ï!²ç0ðQä\14>HÖ\1c6>\8a\9cÈ\aÉ\9aÃÌG\91Óù YsXú\18\ f\91=\87±\8f"§öA²æ°÷Qä\ 4?HÖ\1c&?\8a\9cæ\aÉ\9aÃêÇ\90É~\88ì9\f\7f\14\ f\925Gí\8f\12¯ñ\ f\82Ç1Ê\7f\8c\ fy5\86\ 5\90\ 2'\ 1B±æ0\ 2RäT@HÖ\1cv@\8a\9c\10\bÉ\9aÃ\14È\90i\81\88ì9¬\81\1499\10\925\87A\90\bB²æ°       RäDAHÖ\1cfA\86L\17DdÏa\19¤ÈI\83\90¬9\8c\83\149u\10\925\87}\90 W \ 4ä6\87\89\90\11B²æ°\12RädBHÖ\1c\86\ 5\8c*\85è)æg\ eOñöñ¤\15:\7f\8aË\9f,?ܽ}úçÚ×\97\93 èýå\1f\85\9eþôððæîë÷ëi\9e"¤»Ë?\95]\1ef~b~àéYþë?þ\87ÿþ\ fw/ÿòðþñÅ\7fú§ÿqý\1f^_\1eúáé\19¿ý\87\ f\7fr½ü1òÕ\13÷ô\9füü\7fOþ*n|\9eðÿ\ 3Ùw\10Àendstream
+endobj
+3134 0 obj <<
+/Type /Page
+/Contents 3135 0 R
+/Resources 3133 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+/Annots [ 3137 0 R 3138 0 R 3139 0 R 3140 0 R 3141 0 R 3142 0 R 3143 0 R 3144 0 R 3145 0 R 3146 0 R 3147 0 R 3148 0 R 3149 0 R 3150 0 R 3151 0 R 3152 0 R 3153 0 R 3154 0 R 3155 0 R 3156 0 R 3157 0 R 3158 0 R 3159 0 R 3160 0 R 3161 0 R 3162 0 R 3163 0 R 3164 0 R 3165 0 R 3166 0 R 3167 0 R 3168 0 R 3169 0 R 3170 0 R 3171 0 R 3172 0 R 3173 0 R 3174 0 R 3175 0 R 3176 0 R 3177 0 R 3178 0 R 3179 0 R 3180 0 R 3181 0 R 3182 0 R 3183 0 R 3184 0 R 3185 0 R 3186 0 R 3187 0 R 3188 0 R 3189 0 R 3190 0 R 3191 0 R 3192 0 R 3193 0 R 3194 0 R 3195 0 R 3196 0 R 3197 0 R 3198 0 R 3199 0 R 3200 0 R 3201 0 R 3202 0 R 3203 0 R 3204 0 R 3205 0 R 3206 0 R 3207 0 R 3208 0 R 3209 0 R 3210 0 R 3211 0 R 3212 0 R 3213 0 R 3214 0 R 3215 0 R 3216 0 R 3217 0 R 3218 0 R 3219 0 R 3220 0 R 3221 0 R 3222 0 R 3223 0 R 3224 0 R 3225 0 R 3226 0 R 3227 0 R 3228 0 R 3229 0 R 3230 0 R 3231 0 R 3232 0 R 3233 0 R 3234 0 R 3235 0 R 3236 0 R 3237 0 R 3238 0 R 3239 0 R 3240 0 R 3241 0 R 3242 0 R 3243 0 R 3244 0 R 3245 0 R 3246 0 R ]
+>> endobj
+3137 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 755.979 308.821 765.329]
+/Subtype /Link
+/A << /S /GoTo /D (2121) >>
+>> endobj
+3138 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 755.979 521.32 765.329]
+/Subtype /Link
+/A << /S /GoTo /D (2121) >>
+>> endobj
+3139 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 743.028 308.651 752.378]
+/Subtype /Link
+/A << /S /GoTo /D (2157) >>
+>> endobj
+3140 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 743.028 521.32 752.378]
+/Subtype /Link
+/A << /S /GoTo /D (2157) >>
+>> endobj
+3141 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 730.076 296.019 739.426]
+/Subtype /Link
+/A << /S /GoTo /D (2200) >>
+>> endobj
+3142 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 730.076 521.32 739.426]
+/Subtype /Link
+/A << /S /GoTo /D (2200) >>
+>> endobj
+3143 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 717.125 286.863 726.475]
+/Subtype /Link
+/A << /S /GoTo /D (2229) >>
+>> endobj
+3144 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 717.125 521.32 726.475]
+/Subtype /Link
+/A << /S /GoTo /D (2229) >>
+>> endobj
+3145 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 704.173 320.447 713.523]
+/Subtype /Link
+/A << /S /GoTo /D (2265) >>
+>> endobj
+3146 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 704.173 521.32 713.523]
+/Subtype /Link
+/A << /S /GoTo /D (2265) >>
+>> endobj
+3147 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 691.222 291.297 700.572]
+/Subtype /Link
+/A << /S /GoTo /D (2302) >>
+>> endobj
+3148 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 691.222 521.32 700.572]
+/Subtype /Link
+/A << /S /GoTo /D (2302) >>
+>> endobj
+3149 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 678.271 287.252 687.62]
+/Subtype /Link
+/A << /S /GoTo /D (2338) >>
+>> endobj
+3150 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 678.271 521.32 687.62]
+/Subtype /Link
+/A << /S /GoTo /D (2338) >>
+>> endobj
+3151 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 665.319 308.93 674.669]
+/Subtype /Link
+/A << /S /GoTo /D (2377) >>
+>> endobj
+3152 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 665.319 521.32 674.669]
+/Subtype /Link
+/A << /S /GoTo /D (2377) >>
+>> endobj
+3153 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 652.567 419.046 661.718]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-queues) >>
+>> endobj
+3154 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 652.567 521.32 661.718]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-queues) >>
+>> endobj
+3155 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 639.416 284.452 648.766]
+/Subtype /Link
+/A << /S /GoTo /D (2409) >>
+>> endobj
+3156 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 639.416 521.32 648.766]
+/Subtype /Link
+/A << /S /GoTo /D (2409) >>
+>> endobj
+3157 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 626.465 282.231 635.815]
+/Subtype /Link
+/A << /S /GoTo /D (2437) >>
+>> endobj
+3158 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 626.465 521.32 635.815]
+/Subtype /Link
+/A << /S /GoTo /D (2437) >>
+>> endobj
+3159 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 613.513 293.309 622.863]
+/Subtype /Link
+/A << /S /GoTo /D (2493) >>
+>> endobj
+3160 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 613.513 521.32 622.863]
+/Subtype /Link
+/A << /S /GoTo /D (2493) >>
+>> endobj
+3161 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 600.562 294.784 609.912]
+/Subtype /Link
+/A << /S /GoTo /D (2533) >>
+>> endobj
+3162 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 600.562 521.32 609.912]
+/Subtype /Link
+/A << /S /GoTo /D (2533) >>
+>> endobj
+3163 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 587.611 303.461 596.96]
+/Subtype /Link
+/A << /S /GoTo /D (2567) >>
+>> endobj
+3164 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 587.611 521.32 596.96]
+/Subtype /Link
+/A << /S /GoTo /D (2567) >>
+>> endobj
+3165 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 574.659 302.166 584.009]
+/Subtype /Link
+/A << /S /GoTo /D (2601) >>
+>> endobj
+3166 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 574.659 521.32 584.009]
+/Subtype /Link
+/A << /S /GoTo /D (2601) >>
+>> endobj
+3167 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 561.708 302.525 571.057]
+/Subtype /Link
+/A << /S /GoTo /D (2637) >>
+>> endobj
+3168 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 561.708 521.32 571.057]
+/Subtype /Link
+/A << /S /GoTo /D (2637) >>
+>> endobj
+3169 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 548.756 310.475 558.106]
+/Subtype /Link
+/A << /S /GoTo /D (2673) >>
+>> endobj
+3170 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 548.756 521.32 558.106]
+/Subtype /Link
+/A << /S /GoTo /D (2673) >>
+>> endobj
+3171 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 535.805 288.876 545.155]
+/Subtype /Link
+/A << /S /GoTo /D (2707) >>
+>> endobj
+3172 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 535.805 521.32 545.155]
+/Subtype /Link
+/A << /S /GoTo /D (2707) >>
+>> endobj
+3173 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 522.853 289.244 532.203]
+/Subtype /Link
+/A << /S /GoTo /D (2793) >>
+>> endobj
+3174 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 522.853 521.32 532.203]
+/Subtype /Link
+/A << /S /GoTo /D (2793) >>
+>> endobj
+3175 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 509.902 291.277 519.252]
+/Subtype /Link
+/A << /S /GoTo /D (2859) >>
+>> endobj
+3176 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 509.902 521.32 519.252]
+/Subtype /Link
+/A << /S /GoTo /D (2859) >>
+>> endobj
+3177 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 496.951 296.995 506.3]
+/Subtype /Link
+/A << /S /GoTo /D (2889) >>
+>> endobj
+3178 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 496.951 521.32 506.3]
+/Subtype /Link
+/A << /S /GoTo /D (2889) >>
+>> endobj
+3179 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 483.999 302.535 493.349]
+/Subtype /Link
+/A << /S /GoTo /D (2919) >>
+>> endobj
+3180 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 483.999 521.32 493.349]
+/Subtype /Link
+/A << /S /GoTo /D (2919) >>
+>> endobj
+3181 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 471.048 291.656 480.397]
+/Subtype /Link
+/A << /S /GoTo /D (2949) >>
+>> endobj
+3182 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 471.048 521.32 480.397]
+/Subtype /Link
+/A << /S /GoTo /D (2949) >>
+>> endobj
+3183 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 458.096 293.688 467.446]
+/Subtype /Link
+/A << /S /GoTo /D (2982) >>
+>> endobj
+3184 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 458.096 521.32 467.446]
+/Subtype /Link
+/A << /S /GoTo /D (2982) >>
+>> endobj
+3185 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 445.145 281.305 454.495]
+/Subtype /Link
+/A << /S /GoTo /D (3018) >>
+>> endobj
+3186 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 445.145 521.32 454.495]
+/Subtype /Link
+/A << /S /GoTo /D (3018) >>
+>> endobj
+3187 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 432.193 282.779 441.543]
+/Subtype /Link
+/A << /S /GoTo /D (3041) >>
+>> endobj
+3188 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 432.193 521.32 441.543]
+/Subtype /Link
+/A << /S /GoTo /D (3041) >>
+>> endobj
+3189 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 419.242 297.364 428.592]
+/Subtype /Link
+/A << /S /GoTo /D (3068) >>
+>> endobj
+3190 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 419.242 521.32 428.592]
+/Subtype /Link
+/A << /S /GoTo /D (3068) >>
+>> endobj
+3191 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 406.29 290.729 415.64]
+/Subtype /Link
+/A << /S /GoTo /D (3097) >>
+>> endobj
+3192 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 406.29 521.32 415.64]
+/Subtype /Link
+/A << /S /GoTo /D (3097) >>
+>> endobj
+3193 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 393.339 273.942 402.689]
+/Subtype /Link
+/A << /S /GoTo /D (3123) >>
+>> endobj
+3194 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 393.339 521.32 402.689]
+/Subtype /Link
+/A << /S /GoTo /D (3123) >>
+>> endobj
+3195 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 380.388 288.338 389.737]
+/Subtype /Link
+/A << /S /GoTo /D (3174) >>
+>> endobj
+3196 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 380.388 521.32 389.737]
+/Subtype /Link
+/A << /S /GoTo /D (3174) >>
+>> endobj
+3197 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 367.436 275.416 376.786]
+/Subtype /Link
+/A << /S /GoTo /D (3238) >>
+>> endobj
+3198 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 367.436 521.32 376.786]
+/Subtype /Link
+/A << /S /GoTo /D (3238) >>
+>> endobj
+3199 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 354.485 284.094 363.835]
+/Subtype /Link
+/A << /S /GoTo /D (3283) >>
+>> endobj
+3200 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 354.485 521.32 363.835]
+/Subtype /Link
+/A << /S /GoTo /D (3283) >>
+>> endobj
+3201 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 341.533 306.41 350.883]
+/Subtype /Link
+/A << /S /GoTo /D (3328) >>
+>> endobj
+3202 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 341.533 521.32 350.883]
+/Subtype /Link
+/A << /S /GoTo /D (3328) >>
+>> endobj
+3203 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 328.582 282.798 337.932]
+/Subtype /Link
+/A << /S /GoTo /D (3364) >>
+>> endobj
+3204 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 328.582 521.32 337.932]
+/Subtype /Link
+/A << /S /GoTo /D (3364) >>
+>> endobj
+3205 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 315.63 283.157 324.98]
+/Subtype /Link
+/A << /S /GoTo /D (3407) >>
+>> endobj
+3206 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 315.63 521.32 324.98]
+/Subtype /Link
+/A << /S /GoTo /D (3407) >>
+>> endobj
+3207 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 302.679 291.107 312.029]
+/Subtype /Link
+/A << /S /GoTo /D (3451) >>
+>> endobj
+3208 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 302.679 521.32 312.029]
+/Subtype /Link
+/A << /S /GoTo /D (3451) >>
+>> endobj
+3209 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 289.728 260.473 299.077]
+/Subtype /Link
+/A << /S /GoTo /D (3495) >>
+>> endobj
+3210 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 289.728 521.32 299.077]
+/Subtype /Link
+/A << /S /GoTo /D (3495) >>
+>> endobj
+3211 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 276.776 251.795 286.126]
+/Subtype /Link
+/A << /S /GoTo /D (3542) >>
+>> endobj
+3212 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 276.776 521.32 286.126]
+/Subtype /Link
+/A << /S /GoTo /D (3542) >>
+>> endobj
+3213 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 263.825 304.009 273.175]
+/Subtype /Link
+/A << /S /GoTo /D (3571) >>
+>> endobj
+3214 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 263.825 521.32 273.175]
+/Subtype /Link
+/A << /S /GoTo /D (3571) >>
+>> endobj
+3215 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 250.873 300.861 260.223]
+/Subtype /Link
+/A << /S /GoTo /D (3597) >>
+>> endobj
+3216 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 250.873 521.32 260.223]
+/Subtype /Link
+/A << /S /GoTo /D (3597) >>
+>> endobj
+3217 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 237.922 314.331 247.272]
+/Subtype /Link
+/A << /S /GoTo /D (3637) >>
+>> endobj
+3218 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 237.922 521.32 247.272]
+/Subtype /Link
+/A << /S /GoTo /D (3637) >>
+>> endobj
+3219 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 224.97 292.881 234.32]
+/Subtype /Link
+/A << /S /GoTo /D (3663) >>
+>> endobj
+3220 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 224.97 521.32 234.32]
+/Subtype /Link
+/A << /S /GoTo /D (3663) >>
+>> endobj
+3221 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 212.019 298.599 221.369]
+/Subtype /Link
+/A << /S /GoTo /D (3686) >>
+>> endobj
+3222 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 212.019 521.32 221.369]
+/Subtype /Link
+/A << /S /GoTo /D (3686) >>
+>> endobj
+3223 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 199.068 310.664 208.417]
+/Subtype /Link
+/A << /S /GoTo /D (3709) >>
+>> endobj
+3224 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 199.068 521.32 208.417]
+/Subtype /Link
+/A << /S /GoTo /D (3709) >>
+>> endobj
+3225 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 186.116 316.382 195.466]
+/Subtype /Link
+/A << /S /GoTo /D (3742) >>
+>> endobj
+3226 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 186.116 521.32 195.466]
+/Subtype /Link
+/A << /S /GoTo /D (3742) >>
+>> endobj
+3227 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 173.165 331.486 182.515]
+/Subtype /Link
+/A << /S /GoTo /D (3768) >>
+>> endobj
+3228 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 173.165 521.32 182.515]
+/Subtype /Link
+/A << /S /GoTo /D (3768) >>
+>> endobj
+3229 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 160.213 318.216 169.563]
+/Subtype /Link
+/A << /S /GoTo /D (3801) >>
+>> endobj
+3230 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 160.213 521.32 169.563]
+/Subtype /Link
+/A << /S /GoTo /D (3801) >>
+>> endobj
+3231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 147.262 323.934 156.612]
+/Subtype /Link
+/A << /S /GoTo /D (3827) >>
+>> endobj
+3232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 147.262 521.32 156.612]
+/Subtype /Link
+/A << /S /GoTo /D (3827) >>
+>> endobj
+3233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 134.31 375.42 143.66]
+/Subtype /Link
+/A << /S /GoTo /D (3853) >>
+>> endobj
+3234 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 134.31 521.32 143.66]
+/Subtype /Link
+/A << /S /GoTo /D (3853) >>
+>> endobj
+3235 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 121.359 293.12 130.709]
+/Subtype /Link
+/A << /S /GoTo /D (3855) >>
+>> endobj
+3236 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 121.359 521.32 130.709]
+/Subtype /Link
+/A << /S /GoTo /D (3855) >>
+>> endobj
+3237 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 108.408 308.99 117.757]
+/Subtype /Link
+/A << /S /GoTo /D (3897) >>
+>> endobj
+3238 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 108.408 521.32 117.757]
+/Subtype /Link
+/A << /S /GoTo /D (3897) >>
+>> endobj
+3239 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 95.456 339.824 104.806]
+/Subtype /Link
+/A << /S /GoTo /D (3920) >>
+>> endobj
+3240 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 95.456 521.32 104.806]
+/Subtype /Link
+/A << /S /GoTo /D (3920) >>
+>> endobj
+3241 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 82.505 331.147 91.854]
+/Subtype /Link
+/A << /S /GoTo /D (3985) >>
+>> endobj
+3242 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 82.505 521.32 91.854]
+/Subtype /Link
+/A << /S /GoTo /D (3985) >>
+>> endobj
+3243 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 69.553 300.881 78.903]
+/Subtype /Link
+/A << /S /GoTo /D (4029) >>
+>> endobj
+3244 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 69.553 521.32 78.903]
+/Subtype /Link
+/A << /S /GoTo /D (4029) >>
+>> endobj
+3245 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 56.602 290.908 65.952]
+/Subtype /Link
+/A << /S /GoTo /D (4065) >>
+>> endobj
+3246 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 56.602 521.32 65.952]
+/Subtype /Link
+/A << /S /GoTo /D (4065) >>
+>> endobj
+3136 0 obj <<
+/D [3134 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3133 0 obj <<
+/Font << /F27 2966 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3304 0 obj <<
+/Length 40056     
+/Filter /FlateDecode
+>>
+stream
+xÚ\94Ý_\8f\81]ù÷þ\14|,>('#òÿ£mL\ f0\18\18ðXoÓ\ 3¢\9aLI´ªÉê"Ërϧ\9fÈ\8a³OÄ>\99wÅ"\f4$÷íý»E©\92¬{Ö\8dؽ»>ü¿Ý»\87ÝÕÃÍîÝãõþêñáñÝÇ\7fû§ëw\7f=üoþ\8f\7fÚ\8d+no\9f®î\1e\9f\ eÿú\8dÿå\9fnn®¯®o\1eÞýéööêñfÿæ5»§ÝÕþñæÝ\9f\1eî\1e¯®oï_.úÏ\7fþ§ÿí\9f÷\ fï\9e®\9eîoÞýù/ïrQ®ùó§ÿç§\8f?\7fù÷ß\9f?üËõõþ/_?|úúåùÃß\9f\7fûòþÿýóÿùOÿû\9f\7fº¿º½y|w6¿ÞÃþêæéfã/aÿôx¸õ\1dß^.:¿½«õFn®wW÷oÝÆë_¶?®D±Ç6¼Û«Ã¯½\ 3ÿ¸ô\82Xs\eäÃÕîæI\9aÇk/ =¸¡\1e®¿¶êñÚ\vj\ f¾­îöW÷\ f\8fN\1dײº\fn¨wW··V=^{AíÁ\rõñj¿\93ÿ]\1a×^P{ðmu\7f}õô(Õq-«Ëà\86zsõp'ÿF\1d×^P{pC½¿ºÛ[õxí\ 5µ\a7Ô§«ýÓ\9dT\8f×^P{ðmõf\7fu}/Õq-«Ëà\86úò{ЭT\8f×^P{pC}¸º¿¶êñÚ\vj\ f¾­Þ^\1f~Vß8u\Ëê2¸¡Þ\ín­z¼ö\82Ú\83\eêÝÕÓn/Õãµ\17Ô\1eÜP\1f¯î\1f­z¼ö\82Ú\83o«w»«Û»\9dSǵ¬.\83\eêíÕ~oÕãµ\17Ô\1eÜPï¯\9eäoêÇK/\985·A>]=È\9fÁÇK/\905÷6y¿?ü\98\96\7f\99ãZF\97Á\rõîðcÚªÇk/¨=¸¡\1eþ\97÷òÏ.ãÚ\vj\ f¾­>\\1f~LKu\Ëê2¸¡Þ\1c~LË?»\8ck/¨=¸¡Þ\1f~L[õxí\ 5µ\a7Ô§Ã\8fiù÷͸ö\82Ú\83\8f»Ã\8f\8ekY]\ 67ÔÛÃ\8fiùg\97\ 5µ\a\87Ã\8f\1e¯½ öàÛêÓõáÇ´ü³Ë¸\96ÕepCÝ\1f~P[õxí\ 5µ\a7Ô»ÃÏjùg\97\ 5µ\a7ÔÇ«»\e«\1e¯½ öà\9bêíõîêæÚýÙ%×¢º\ en¨·W×\ fV=^{AíÁ\rõþêñv'Õãµ\17Ô\1eÜP\9f®îwV=^{AíÁ·ÕÝþJþF7.e³ç6È»«Ý\9d$ÿ¸ô\ 2Ys\eäÃáÇô\934\8f×^@{ðmu\7f}ø1-Õq-«Ëà\86zsø1-ÿ#\1d×^P{pC½?ü\98¶êñÚ\vj\ f\8f\87\1fÓ\ fR=^{AíÁ·Õ\9bÝáÇ´Tǵ¬.\83\eêíáÇô½T\8f×^P{pC}8ü\98¶êñÚ\vj\ f¾­Þ^\1f~LË\9f\11ãZV\97Á\ru\7fø1mÕãµ\17Ô\1eÜPï\ e?¦o¥z¼ö\82Ú\83\eêãá\aµU\8f×^P{ðmõnwøYíþì\92kY]\ 6\9b«§½U\8f×^P{pC½¿º\7f\92\7fv\19×^P{pC}ºº½·êñÚ\vj\ f¾­Þï¯ö7òÏ.ãZV\97Á\rõîêúÚªÇk/¨=¸¡>\É\7f\\1e\97^0kîmòáúêNþ½z¼\94É\9eÛ o\ e?¦å\9f]Ƶ\17Ð\1eÜPï\ f?¦­z¼ö\82Ú\83\eêãáÇ´ü³Ë¸ö\82Ú\83\8f»Ã\8f\8ekY]\ 67ÔÛÃ\8fiù_ßqí\ 5µ\a\87Ã\8f\1e¯½ öà\86z¸^\9e\8fåÚ\vj\ f¾­>í\ f?¦¥:®eu\19ÜPï\ e?¦å\9f]Ƶ\17Ô\1eÜP\1f\ f?¦­z¼ö\82Ú\83oªw×»Ã\8fi÷ó0×¢º\ en¨7\87\1fÔV=^{AíÁ\rõþð³ÚªÇk/¨=¸¡>]Ýìn¨\7f¹>ü\9d°\95ðÜí®¯ö·\17þ`\91\8bÎoäîñÕ\9dìwW7{º\91S0´Û_=Ýí.\ 4C\87?\1c_?Ýq04®9\v\86¾<ÿãÃ󧿾]\vÝ\__í^\ euOÛë\rì\ e\7f/Ýo\ 5O£Ü\81;\eåÎÙ}m\96;¯ïa»ÜA±æ¸ÜQfÊ\1dD{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\10Ë\1d\85\8er\aÍ\9aÃrG\91£ÜA²æ¸Ü1æ,w\b]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü\11ê©Ü\ 1u\1därG©)wPíA.w\94\9ar\aÕ\1eärG©)wPíA,w\f\9ar\87Ì\9eÃrG\91£ÜA²æ¸ÜQfÊ\1dD{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d£Îr\87Ôe\90Ë\1d¥¦ÜAµ\a¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹Ü1ê,wH]\ 6¹ÜQjÊ\1dT{\10Ë\1d\85\8er\aÍ\9aÃrÇ\90)w\88ì9.w\94\99r\aÑ\1eärG©)wPíA.w\94\9ar\aÕ\1eärǨ³Ü!u\19ärG©)wPíA.w\94\9ar\aÕ\1eärG©)wPíA.w\8c\1dR\97A.w\94\9ar\aÕ\1eärG©)wPíA.w\84z*w@]\a¹ÜQjÊ\1dT{\90Ë\1d¥¦ÜAµ\a¹ÜÙnQ\¹C7\92rçìFî\9e¶Ê\9dí\e\9dK\1fõs³ÿãx\10Ë\9dqÍ©ÜùýùÃó\97Oß>|úüíׯß\9e?üýý\12\9e\97óó\97g\11'äõ/Ûõn·\95ðÌ3z¸ÉyF\7fv\93Ûgô¯o\ 4ÎèQíA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z£Î3zR\97A>£WjÎèQíA>£WjÎèQíA>£WjÎèQíA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eÄ3z\85\8e3z4k\ eÏè\159Îè\91¬9>£7æ<£'t\19ä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z£Î3zR\97A>£WjÎèQíA>£WjÎèQíA>£WjÎèQíA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z£Î3zR\97A>£WjÎèQíA>£WjÎèQíA>£WjÎèQíA>£\17êé\8c\1eÔu\90Ïè\95\9a3zT{\90Ïè\95\9a3zT{\90Ïè\95\9a3zT{\10Ïè\r\9a3z2{\ eÏè\159Îè\91¬9>£WfÎè\11íA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z£Î3zR\97A>£WjÎèQíA>£WjÎèQíA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z£Î3zR\97A>£WjÎèQíA>£WjÎèQíA>£WjÎèQíA>£7ê<£'u\19ä3z¥æ\8c\1eÕ\1eÄ3z\85\8e3z4k\ eÏè\r\993z"{\8eÏè\95\993zD{\90Ïè\95\9a3zT{\90Ïè\95\9a3zT{\90Ïè\8d:ÏèI]\ 6ù\8c^©9£Gµ\aù\8c^©9£Gµ\aù\8c^©9£Gµ\aù\8cÞ¨ó\8c\9eÔe\90Ïè\95\9a3zT{\90Ïè\95\9a3zT{\90Ïè\85z:£\au\1dä3z¥æ\8c\1eÕ\1eä3z¥æ\8c\1eÕ\1eä3z:l6gôt#9£?»\91í3úí\eùÓÍË\9fÆ^~$Ó§k\1c~\97½ùãáÐîéj÷´\7fû\8c~\\94k^îèð#õðÿÞÿiÿðøÓ\7fy¿{üé?ý×ã¿ùo/'÷ß\8eÿúÿþóûÝõõO\7fú¿>¿ßýôå÷ÿuüÿýï¿>\7füüò=>\1f\8fÿþ\9f\7fÿòñûç¯_¾½ù¤öå\11çéÞÞ8Ú¿Ù<Ú\9f\ foá¯m>¼=ûkÛ~xûúFàá-©Ë ?¼Uj\1eÞ¢Ú\83üðV©yx\8bj\ fòÃ[¥æá-ª=È\ fo\85zzx\vê:È\ fo\95\9a\87·¨ö ?¼Uj\1eÞ¢Ú\83üðV©yx\8bj\ fâÃ[\83æá-\99=\87\ fo\159\1eÞ"YsüðV\99yx\8bh\ fòÃ[£Î\87·¤.\83üðV©yx\8bj\ fòÃ[¥æá-ª=È\ fo\95\9a\87·¨ö ?¼5ê|xKê2È\ fo\95\9a\87·¨ö ?¼Uj\1eÞ¢Ú\83üðÖ¨óá-©Ë ?¼Uj\1eÞ¢Ú\83üðV©yx\8bj\ fòÃ[¥æá-ª=È\ fo\8d:\1fÞ\92º\fòÃ[¥æá-ª=È\ fo\95\9a\87·¨ö ?¼Uj\1eÞ¢Ú\83üðÖ¨óá-©Ë ?¼Uj\1eÞ¢Ú\83øðV¡ãá-\9a5\87\ fo\r\99\87·Dö\1c?¼Uf\1eÞ"Ú\83üðV©yx\8bj\ fòÃ[¥æá-ª=È\ fo\8d:\1fÞ\92º\fòÃ[¥æá-ª=È\ fo\95\9a\87·¨ö ?¼Uj\1eÞ¢Ú\83üðÖ¨óá-©Ë ?¼Uj\1eÞ¢Ú\83üðV©yx\8bj\ fòÃ[¡\9e\1eÞ\82º\ eòÃ[¥æá-ª=È\ fo\95\9a\87·¨ö ?¼¥Ç\89æá-ÝH\1eÞ\9eÝÈöÃÛí\eùÁ\8fF>üåïowü\82Õ¸¦^°úíû/û_>\7fùðñýÃO\7f{~ù\9f\7fÿð~÷ÓÏ_>}øõù˧×/j<]=¾tÓ'ïõÇ%ß\1fþsØx ;ߢ\80û\9doQ\9cÝïö[\14¯o\ 4Þ¢@µ\añ-
+\85\8e·(Ь9|\8bB\91ã-
+$k\8eߢ0æ|\8b\82Ðe\90ߢPjÞ¢@µ\aù-
+¥æ-
+T{\90ߢ0ê|\8b\82Ôe\90ߢPjÞ¢@µ\aù-
+¥æ-
+T{\90ߢPjÞ¢@µ\aù-
+£Î·(H]\ 6ù-
+¥æ-
+T{\90ߢPj\ eâPíA>\883ê<\88#u\19ä\838¥æ \ eÕ\1eä\838¥æ \ eÕ\1eä\838¥æ \ eÕ\1eä\83\9e\ eâ@]\aù N©9\88\aù N©9\88\aù N©9\88\añ Î 9\88#³çð N\91ã \ eÉ\9aã\838eæ \ eÑ\1eä\838£Î\838R\97A>\88Sj\ eâPíA>\88Sj\ eâPíA>\88Sj\ eâPíA>\883ê<\88#u\19ä\838¥æ \ eÕ\1eä\838¥æ \ eÕ\1eä\838£Î\838R\97A>\88Sj\ eâPíA>\88Sj\ eâPíA>\88Sj\ eâPíA>\883ê<\88#u\19ä\838¥æ \ eÕ\1eä\838¥æ \ eÕ\1eä\838¥æ \ eÕ\1eä\838£Î\838R\97A>\88Sj\ eâPíA<\88Sè8\88C³æð Î\909\88#²çø N\999\88\aù N©9\88\aù N©9\88\aù Î¨ó \8eÔe\90\ fâ\94\9a\838T{\90\ fâ\94\9a\838T{\90\ fâ\94\9a\838T{\90\ fâ\8c:\ fâH]\ 6ù N©9\88\aù N©9\88\aù N¨§\838P×A>\88Sj\ eâPíA>\88Sj\ eâPíA>\88Û>Fr\aqt#9\88\91ûë­\83¸í\eù±O:¼\7fº9ü\8b'<\88Ë5gßQú×çï\1f>\7fùöË×ï·\9f?}øÇûÝÓO?\7fþþr:÷Ö\87\f>ÞïÞ\9dAëÝ\1cþhs½y\ 2\97O\0¤\eÍEç7ºù        \80oÜÈö'\0²Ú\83ø     \80N\1d\9f\0Èj\ fâ'\0*5\9f\0\88ê2\88\9f\0èÔñ        \80¬ö ~\ 2 SÇ'\0²Ú\83ø \80N\1d\9f\0Èj\ fâ'\0*5gר.\83xvíÔqvÍj\ fÒÙµC\8fg×lÖ\1c\9d];òxvÍdÍáÙµ2sv\8dè2\88g×N\1dg׬ö \9e];u\9c]³Ú\83xv­Ô\9c]£º\fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e];u\9c]³Ú\83xv­Ô\9c]£º\fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]\eu\9e]\93º\ eâÙµSÇÙ5«=\88g×N\1dg׬ö \9e];u\9c]³Ú\83tv­Ðqv\8dfÏÑÙµ#\8fg×LÖ\1c\9e];s\9c]3Ú\83xv­Ô\9c]£º\fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e];u\9c]³Ú\83xv­Ô\9c]£º\fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fÒÙµC\8fg×lÖ\1c\9d]+r\9c]#ÙsxvíÌqvÍh\ fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×N\1dg׬ö \9e]+5gר.\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×F\9dgפ®\83xvíÔqvÍj\ fâÙµSÇÙ5«=\88g×p\0«Î®ñFÆEç7²yv\r7òc/\91Þ?^_ÝÜ<òÙõ¸f9»þúû÷\97Ãë\97\93ëÇ\97\93ë÷»\9fÞ>¼>ü\91ôå\ fÂ'éõáõÝÃ~ó«ú\ eÿ­¸»ç;ÍEçwzõæw\ 6îïߺ\91í/\b\añ\v\ 2\9d:¾ \90Õ\1eÄ/\bTêÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ f0êÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0£Î<\80Ôe\90ó\0¥&\ f\a1\ fPèÈ\ 3Ь9Ì\ 3\14\0$k\8eó\0cÎ<\80Ðe\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0£Î<\80Ôe\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0¥&\ f\a9\ f0êÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ f0êÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0¡\9eò\0P×AÎ\ 3\94\9a<\0Õ\1eä<@©É\ 3PíAÎ\ 3\94\9a<\0Õ\1eÄ<À É\ 3Èì9Ì\ 3\14\0$k\8eó\0e&\ f\a9\ f0êÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0£Î<\80Ôe\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0£Î<\80Ôe\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0¥&\ f\a9\ f0êÌ\ 3H]\ 69\ fPjò\0T{\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\0£Î<\80Ôe\90ó\0¥&\ f\a1\ fPèÈ\ 3Ь9Ì\ 3\f\99<\80È\9eã<@\99É\ 3\10íAÎ\ 3\94\9a<\0Õ\1eä<@©É\ 3PíAÎ\ 3\8c\0R\97\ 3\94\9a<\0Õ\1eä<@©É\ 3PíAÎ\ 3\94\9a<\0Õ\1eä<À¨3\ f u\19ä<@©É\ 3PíAÎ\ 3\94\9a<\0Õ\1eä<@¨§<\0Ôu\90ó\0¥&\ f\a9\ fPjò\0T{\90ó\80í#n\97\aÐ\8d$\ f\91ûÝV\1e°}#?øjûË\97\0>Þs\1e0®9Ë\ 3¾ýÇ\97\8f³\vx+
+Ø?\1d~A^~ø\9eö_G\ 1/§¡oÿ\8aí_ò\87§\1dß_.:¿¿«×7rø\1dï~÷Ö\8d¼¡\1e¯½ öà\86\1dïƪÇk/¨=øö£ÐÃß·÷Ê<^\89b\8fmx\87ßë\1e$øÇ¥\17Ä\9aÛ \ f¿ÑÝ<Ióxí\ 5´\a7ÔÃõ×V=^{AíÁ·ÕÃßÀ÷\ f\8fN\1dײº\f\87ßèn­z¼ö\82Ú\83\eêá7º\9düïÒ¸ö\82Ú\83\eíÎá§Ô£Tǵ¬.\83\eê\88\99\94\9a:
\1eä:J©©£PíA®£\94\9a:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\8c:ë(R\97A®£\94\9a:
\1eÄ:J¡£\8eB³æ°\8eR䨣\90¬9®£\8c9ë(B\97A®£\94\9a:
\1eä:J©©£PíA®£\8c:ë(R\97A®£\94\9a:
\1eä:J©©£PíA®£\94\9a:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\84zª£@]\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8eRjê(T{\10ë(\83¦\8e"³ç°\8eR䨣\90¬9®£\94\99:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\8c:ë(R\97A®£\94\9a:
\1eä:J©©£PíA®£\8c:ë(R\97A®£\94\9a:
\1eä:J©©£PíA®£\94\9a:
\1eä:ʨ³\8e"u\19ä:J©©£PíA®£\94\9a:
\1eä:J©©£PíA®£\8c:ë(R\97A®£\94\9a:
\1eÄ:J¡£\8eB³æ°\8e2dê("{\8eë(e¦\8e\a¹\8eRjê(T{\90ë(¥¦\8e\a¹\8e2ꬣH]\ 6¹\8eRjê(T{\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(£Î:\8aÔe\90ë(¥¦\8e\a¹\8eRjê(T{\90ë(¡\9eê(P×A®£\94\9a:
\1eä:J©©£PíA®£¶[\1fWGÑ\8d¤\8e\91í:jûF~ðÃSîn¯n\ fÿ\ 5Ã:j\sVGýËõõþ/_?|þ²ÑF=\1e~9^\1e>\9fÖ×[8L\1fþ   o£\8dz<üigwáîrÑùݽ®\94\ e?\8d\9fÎþ\12°R\1a×^P{pC=ü\19æΪÇk/¨=¸Qd\1dþ\18³ß;u\Ëê2¸¡¾$jV=^{AíAnÞ\94\9aæ\rÕ\1eäæM©iÞPíAjÞ\84\99æ\rÄ\1eÃæM\81£yC±æ¸ySf\9a7D{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\10\9b7\85\8eæ\rÍ\9aÃæM\91£yC²æ¸y3ælÞ\b]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y\13ê©y\ 3u\1däæM©iÞPíAnÞ\94\9aæ\rÕ\1eäæM©iÞPíAlÞ\f\9aæ\8dÌ\9eÃæM\91£yC²æ¸ySf\9a7D{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7£Îæ\8dÔe\90\9b7¥¦yCµ\a¹ySj\9a7T{\90\9b7¥¦yCµ\a¹y3êlÞH]\ 6¹ySj\9a7T{\10\9b7\85\8eæ\rÍ\9aÃæÍ\90\88ì9nÞ\94\99æ\rÑ\1eäæM©iÞPíAnÞ\94\9aæ\rÕ\1eäæͨ³y#u\19äæM©iÞPíAnÞ\94\9aæ\rÕ\1eäæM©iÞPíAnÞ\8c:\9b7R\97AnÞ\94\9aæ\rÕ\1eäæM©iÞPíAnÞ\84zjÞ@]\a¹ySj\9a7T{\90\9b7¥¦yCµ\a¹yÛn¸\óF7\92æíìFî÷[ÍÛö\8düà'\82Ýî®n\ fÿ\ 2\9b·qÍëæíÓ×/Ïo7o÷W·/ÿxqZ\7f£y{ØnÞ^\12¯=ßÝìÀÎîn»\ 3{}#Ð\81\91º\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a¦Ôt`¨ö u`ÂL\a\ 6b\8fa\a¦ÀÑ\81¡XsÜ\81)3\1d\18¢=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=\88\1d\98BG\a\86fÍa\a¦ÈÑ\81!YsÜ\81\19sv`\84.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81   õÔ\81\81º\ er\a¦Ôt`¨ö w`JM\a\86j\ fr\a¦Ôt`¨ö v`\ 6M\aFfÏa\a¦ÈÑ\81!YsÜ\81)3\1d\18¢=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98Qg\aFê2È\1d\98\81¡Ú\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81\19uv`¤.\83Ü\81)5\1d\18ª=\88\1d\98BG\a\86fÍa\afÈt`Dö\1cw`ÊL\a\86h\ fr\a¦Ôt`¨ö w`JM\a\86j\ fr\afÔÙ\81\91º\fr\a¦Ôt`¨ö w`JM\a\86j\ fr\a¦Ôt`¨ö w`F\9d\1d\18©Ë w`JM\a\86j\ fr\a¦Ôt`¨ö w`B=u` ®\83Ü\81)5\1d\18ª=È\1d\98\81¡Ú\83Ü\81mwM®\ 3£\eI\avv#Û\1dØö\8düàg\9fí_\1eví¹\ 3\e×\9cu`_\9eÿñáùÓ_\9f·¾\14r÷°{w6ýú\17ëæn·ù¥\90ɱàÖf\8euvkÛ9Öë\e\81\1c\vÕ\1eä\1cK©É±PíAα\94\9a\1c\vÕ\1e¤\1cK\98ɱ@ì1̱\148r,\14k\8es,e&ÇB´\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,¥&ÇBµ\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a1ÇRèȱЬ9̱\149r,$k\8es,cÎ\1c\8bÐe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,¥&ÇBµ\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9ÇRjr,T{\90s,¡\9er,P×Aα\94\9a\1c\vÕ\1eä\1cK©É±PíAα\94\9a\1c\vÕ\1eÄ\1cˠɱÈì9̱\149r,$k\8es,e&ÇB´\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a9ÇRjr,T{\90s,¥&ÇBµ\a9Ç2ê̱H]\ 69ÇRjr,T{\90s,¥&ÇBµ\a9ÇRjr,T{\90s,£Î\1c\8bÔe\90s,¥&ÇBµ\a1ÇRèȱЬ9̱\f\99\1c\8bÈ\9eã\1cK\99ɱ\10íAα\94\9a\1c\vÕ\1eä\1cK©É±PíAα\8c:s,R\97Aα\94\9a\1c\vÕ\1eä\1cK©É±PíAα\94\9a\1c\vÕ\1eä\1c˨3Ç"u\19ä\1cK©É±PíAα\94\9a\1c\vÕ\1eä\1cK¨§\1c\vÔu\90s,¥&ÇBµ\a9ÇRjr,T{\90s,*\8cL\8eE7\92\1cëìF¶s¬í\eùÁ\1ckwwu÷¸ã\1ck\sʱ^\82¬¯ß?ÿå?ÞþL®\9bãÏ¢ÓôëÏäz<üØØúL®|#$ÜÚüFȳ[ÛþFÈ×7\ 2ß\b\89j\ fò'\81\19u¦g¤.\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Hé\990\93\9e\81Øc\98\9e)p¤g(Ö\1c§gÊLz\86h\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ fbz¦Ð\91\9e¡Ys\98\9e)r¤gHÖ\1c§gÆ\9cé\19¡Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gB=¥g ®\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=\88é\99A\93\9e\91Ùs\98\9e)r¤gHÖ\1c§gÊLz\86h\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ frz¦Ô¤g¨ö §gJMz\86j\ frzfÔ\99\9e\91º\frz¦Ô¤g¨ö §gJMz\86j\ frz¦Ô¤g¨ö §gF\9dé\19©Ë §gJMz\86j\ fbz¦Ð\91\9e¡Ys\98\9e\19\19\91=Çé\992\93\9e\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e\19u¦g¤.\83\9c\9e)5é\19ª=Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99QgzFê2Èé\99R\93\9e¡Ú\83\9c\9e)5é\19ª=Èé\99POé\19¨ë §gJMz\86j\ frz¦Ô¤g¨ö §gÛ5\95KÏèF\92\9e\9dÝÈýÍVz¶}#?ø\8d\90×\87¿\99\ e7\8eéÙ¸¦Ò³ç/\9f¾}øüåó÷·?\fìéêúå\1fVOëë-ì¯î\1eö\e¿^iwàÞF»svg\9bíÎë{ØnwP¬9nw\94\99v\aÑ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eävG©iwPíAnw\94\9av\aÕ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eÄvG¡£ÝA³æ°ÝQähw\90¬9nw\8c\1dB\97Anw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eävG©iwPíAnw\94\9av\aÕ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävG©iwPíAnw\84zjw@]\a¹ÝQjÚ\1dT{\90Û\1d¥¦ÝAµ\a¹ÝQjÚ\1dT{\10Û\1d\83¦Ý!³ç°ÝQähw\90¬9nw\94\99v\aÑ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eävG©iwPíAnw\94\9av\aÕ\1eävǨ³Ý!u\19ävG©iwPíAnw\94\9av\aÕ\1eävG©iwPíAnw\8c\1dR\97Anw\94\9av\aÕ\1eÄvG¡£ÝA³æ°Ý1dÚ\1d"{\8eÛ\1de¦ÝA´\a¹ÝQjÚ\1dT{\90Û\1d¥¦ÝAµ\a¹Ý1êlwH]\ 6¹ÝQjÚ\1dT{\90Û\1d¥¦ÝAµ\a¹ÝQjÚ\1dT{\90Û\1d£Îv\87Ôe\90Û\1d¥¦ÝAµ\a¹ÝQjÚ\1dT{\90Û\1d¡\9eÚ\1dP×Anw\94\9av\aÕ\1eävG©iwPíAnw¶[\14×îÐ\8d¤Ý9»\91ívgûF~ìc£î\ e\7f\v¿\ 4\13Ôîä\9a×íΧÏß~ýúíùÃoïw?½.xnv\87_Ú»ý»3ãõçGÝ\1fþ\9eÚ(x\12AÐ=æ¢ó{Ü\8c Þ¸\91í\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82\88 XíA\8c \94\9a\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\90"\b\87\1e#\b6k\8e"\bG\1e#\b&k\ e#\be&\82@t\19Ä\b©#\82\a1\82\88 XíA\8c \94\9a\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82\88 XíA\8c \94\9a\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82\8c H]\a1\82\88 XíA\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1e¤\bB¡#\82@³ç(\82pä1\82`²æ0\82\88 \18íA\8c \94\9a\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82\88 XíA\8c \94\9a\b\ 2Õe\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1eÄ\b©#\82\a1\82Pj"\bT\97A\8c \9c:"\bV{\90"\b\87\1e#\b6k\8e"\bE\8e\b\ 2É\9eÃ\bÂ\99#\82\a1\82\88 XíA\8c \9c:"\bV{\10#\b¥&\82@u\19Ä\b©#\82\a1\82\88 XíA\8c \9c:"\bV{\10#\b¥&\82@u\19Ä\b©#\82\a1\82\88 XíA\8c \8c:#\bR×A\8c \9c:"\bV{\10#\b§\8e\b\82Õ\1eÄ\b\ 2\8eóU\ 4\8172.:¿\91ûÛ\8d\b\ 2näÇ>Àäîð\eÂÃáoa\8c Æ5\15Aüöý\97?>¿äóÏ¿|þÿÞï~z~ý!&\87\7f°yù\8fó$¼N n\ f?³6¾B+_zDw\98\8bÎïpãK\8fÞ¸\8d­\ fN!±Çè\83S\1cxüà\14\16k\ e?8Å\99ã\83S\18íAüà\14§\8e\ fNaµ\añ\83S\94\9a\ fNAu\19Ä\ fNqêøà\14V{\10?8Å©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eäfH©i\86PíAn\86\94\9af\bÕ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfH©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eÄfH¡£\19B³æ°\19Räh\86\90¬9n\86\8c9\9b!B\97An\86\94\9af\bÕ\1eäfH©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eäfH©i\86PíAn\86\94\9af\bÕ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfH©i\86PíAn\86\84zj\86@]\a¹\19Rj\9a!T{\90\9b!¥¦\19\a¹\19Rj\9a!T{\10\9b!\83¦\19"³ç°\19Räh\86\90¬9n\86\94\99f\bÑ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfH©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eäfH©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eäfH©i\86PíAn\86\94\9af\bÕ\1eäfȨ³\19"u\19äfH©i\86PíAn\86\94\9af\bÕ\1eäfH©i\86PíAn\86\8c:\9b!R\97An\86\94\9af\bÕ\1eÄfH¡£\19B³æ°\192d\9a!"{\8e\9b!e¦\19\a¹\19Rj\9a!T{\90\9b!¥¦\19\a¹\192êl\86H]\ 6¹\19Rj\9a!T{\90\9b!¥¦\19\a¹\19Rj\9a!T{\90\9b!£Îf\88Ôe\90\9b!¥¦\19\a¹\19Rj\9a!T{\90\9b\9e\9a!P×An\86\94\9af\bÕ\1eäfH©i\86PíAn\86¶û\17×\fÑ\8d¤\19\91ífhûF~ð\83Sî_~Ñï¸\19\1a×¼j\86>}ýò:\15:ü¬ß½\9cØ\9c\86_§BûûÇ­TèáðÇ«?þ3\83\eËEç7öê?³ýãá\8f\9b·näµ:®eu\19ÜPo¯\9e\1e­z¼ö\82Ú\83\eêá\ fMwV=^{AíÁ·Õ§Ã\9f\9bö{§\8ekY]\ 6\9b«ý\93U\8f×^P{pC=üÁé~'Õãµ\17Ô\1eÜPG\13§ÔDv¨ö EvÂLd\ab\8fad§À\11Ù¡Xs\1cÙ)3\91\1d¢=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=\88\91\9dBGd\87fÍad§È\11Ù!Ys\1cÙ\19sFv\84.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ   õ\14Ù\81º\ erd§ÔDv¨ö GvJMd\87j\ frd§ÔDv¨ö Fv\ 6MdGfÏad§È\11Ù!Ys\1cÙ)3\91\1d¢=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dQgdGê2È\91\9dR\13Ù¡Ú\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙ\19uFv¤.\83\1cÙ)5\91\1dª=\88\91\9dBGd\87fÍadgÈDvDö\1cGvÊLd\87h\ frd§ÔDv¨ö GvJMd\87j\ frdgÔ\19Ù\91º\frd§ÔDv¨ö GvJMd\87j\ frd§ÔDv¨ö GvF\9d\91\1d©Ë GvJMd\87j\ frd§ÔDv¨ö GvB=Ev ®\83\1cÙ)5\91\1dª=È\91\9dR\13Ù¡Ú\83\1cÙm\97c.²£\eIdwv#Û\91Ýö\8düéæåOc/?\92é\83¹î_>5ëå\8e\1e\ f\7ft{3²\e\17å\9a\97;:üH½z¸zÿ§ýÃãOÿåýîñ§ÿô_\8fÿ濽¤wßÞø_\1cþÍO\7fûüëø_ý÷_\9f?~þ\97ëëýÇã¿ÿçß¿|üþùë\97oo=L|¼¾ywv\83ë_Åþêáfë\9bÍæ\83>øë\9b\ fúÎþú¶\1fô½¾\ f\aê:È\ fú\94\9a\a}¨ö ?èSj\1eô¡Ú\83ü O©yÐ\87j\ fâ\83>\83æA\1f\99=\87\ fú\149\1eô!Ysü O\99\87h\ fò\83>£Î\a}¤.\83ü O©yÐ\87j\ fò\83>¥æA\1fª=È\ fú\94\9a\a}¨ö ?è3ê|ÐGê2È\ fú\94\9a\a}¨ö ?èSj\1eô¡Ú\83ü Ï¨óA\1f©Ë ?èSj\1eô¡Ú\83ü O©yÐ\87j\ fò\83>¥æA\1fª=È\ fú\8c:\1fô\91º\fò\83>¥æA\1fª=È\ fú\94\9a\a}¨ö ?èSj\1eô¡Ú\83ü Ï¨óA\1f©Ë ?èSj\1eô¡Ú\83ø O¡ãA\1f\9a5\87\ fú\f\99\a}Dö\1c?èSf\1eô!Ú\83ü O©yÐ\87j\ fò\83>¥æA\1fª=È\ fú\8c:\1fô\91º\fò\83>¥æA\1fª=È\ fú\94\9a\a}¨ö ?èSj\1eô¡Ú\83ü Ï¨óA\1f©Ë ?èSj\1eô¡Ú\83ü O©yÐ\87j\ fò\83\9e\1eô\81º\ eò\83>¥æA\1fª=È\ fú\94\9a\a}¨ö ?èÛ~êä\1eôÑ\8däAßÙ\8dÜßm=èÛ¾\91\1f|\9böð\8f\1f\8f\ f{~\9bv\SoÓ~ùúýó_þãÃÇ÷\ f/\8fñ^¿\ 6xøoÐËÏÞÓüëÇtûÃ\7fØ[\1f¿\9f· áöæ[\90g··ý\16äë\e\81· QíA~\vR©y\v\12Õ\1e¤· \85\99· Aì1|\vR\81ã-H\14k\8eß\82TfÞ\82\aù-H¥æ-HT{\90ß\824ê|\v\92Ôe\90ß\82TjÞ\82\aù-H¥æ-HT{\90ß\824ê|\v\92Ôe\90ß\82TjÞ\82\aù-H¥æ-HT{\90ß\82TjÞ\82\aù-H£Î· I]\ 6ù-H¥æ-HT{\90ß\82TjÞ\82\aù-H£Î· I]\ 6ù-H¥æ-HT{\90ß\82TjÞ\82\aù-H¥æ-HT{\90ß\824ê|\v\92Ôe\90ß\82TjÞ\82\añ-H\85\8e· Ñ¬9|\vR\91ã-H$k\8eß\824æ|\v\92Ðe\90ß\82TjÞ\82\aù-H¥æ-HT{\90ß\824ê|\v\92Ôe\90ß\82TjÞ\82\aù-H¥æ-HT{\90ß\82TjÞ\82\aù-H£Î· I]\ 6ù-H¥æ-HT{\90ß\82TjÞ\82\aù-H£Î· I]\ 6ù-H¥æ-HT{\90ß\82TjÞ\82\aù-H¥&\8e\a9\8e\12ê)\8e\ 2u\1dä8J©\89£PíA\8e£\94\9a8
\1eä8J©\89£PíA\8c£\f\9a8\8aÌ\9eÃ8J\91#\8eB²æ8\8eRfâ(D{\90ã(£Î8\8aÔe\90ã(¥&\8e\a9\8eRjâ(T{\90ã(¥&\8e\a9\8e\8c£H]\ 69\8eRjâ(T{\90ã(¥&\8e\a9\8e\8c£H]\ 69\8eRjâ(T{\90ã(¥&\8e\a9\8eRjâ(T{\90ã(£Î8\8aÔe\90ã(¥&\8e\a9\8eRjâ(T{\90ã(¥&\8e\a9\8e\8c£H]\ 69\8eRjâ(T{\10ã(\85\8e8
\9aÃ8Ê\90\89£\88ì9\8e£\94\998
\1eä8J©\89£PíA\8e£\94\9a8
\1eä8ʨ3\8e"u\19ä8J©\89£PíA\8e£\94\9a8
\1eä8J©\89£PíA\8e£\8c:ã(R\97A\8e£\94\9a8
\1eä8J©\89£PíA\8e£\84z\8a£@]\a9\8eRjâ(T{\90ã(¥&\8e\a9\8eÚn}\\1cE7\928êìF¶ã¨í\eùÁ8j\7f{¸ñ\1dÇQã\9a\8a£\9e¿|úöáó\97Ïß·ú¨\9b\97\87<\8f\8fïÎ\84׿fû»ÝÖ{\8c3m\81;\9ciËÙ\1dn§-¯o\ 4Ò\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16¥&mAµ\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a1mQèH[Ь9L[\14\16$k\8eÓ\16cδ\85Ðe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16¥&mAµ\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16¡\9eÒ\16P×AN[\94\9a´\ 5Õ\1eä´E©I[PíAN[\94\9a´\ 5Õ\1eÄ´Å I[Èì9L[\14\16$k\8eÓ\16e&mA´\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16¥&mAµ\a9m1êL[H]\ 69mQjÒ\16T{\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16£Î´\85Ôe\90Ó\16¥&mAµ\a1mQèH[Ь9L[\f\99´\85È\9eã´E\99I[\10íAN[\94\9a´\ 5Õ\1eä´E©I[PíAN[\8c\16R\97AN[\94\9a´\ 5Õ\1eä´E©I[PíAN[\94\9a´\ 5Õ\1eä´Å¨3m!u\19ä´E©I[PíAN[\94\9a´\ 5Õ\1eä´E¨§´\ 5Ôu\90Ó\16¥&mAµ\a9mQjÒ\16T{\90Ó\16Ê4LÚB7\92´åìF¶Ó\96í\e\96ý\85´e·;ÜÀ\13§-ã\9a×i˧¯_\9e\96\ 3\7fûòã÷$¼\91¶Üo\95-³ö\80\e\9cµÇÙ\r\1e¯ï\ 3j\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\10k\ f\85\8eÚ\ 3Í\9aÃÚC\91£ö@²æ¸ö0æ¬=\b]\ 6¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö\10ê©ö\0u\1däÚC©©=PíA®=\94\9aÚ\ 3Õ\1eäÚC©©=PíA¬=\f\9aÚ\83Ì\9eÃÚC\91£ö@²æ¸öPfj\ fD{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f£ÎÚ\83Ôe\90k\ f¥¦ö@µ\a¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö0ê¬=H]\ 6¹öPjj\ fT{\10k\ f\85\8eÚ\ 3Í\9aÃÚÃ\90©=\88ì9®=\94\99Ú\ 3Ñ\1eäÚC©©=PíA®=\94\9aÚ\ 3Õ\1eäÚè³ö u\19äÚC©©=PíA®=\94\9aÚ\ 3Õ\1eäÚC©©=PíA®=\8c:k\ fR\97A®=\94\9aÚ\ 3Õ\1eäÚC©©=PíA®=\84zª=@]\a¹öPjj\ fT{\90k\ f¥¦ö@µ\a¹ö rÁÔ\1et#©=Înäþ~«öؾ\91åëÜwüuî·OO\7f|\1d\13}\9d{®É×¹?¾õuîÿùëÏ¿}\1aßÙþó\97\8a¿½ßýôù×ñMîÏß\7f\1fÿò\9býR÷\97ç'/§\g·ùú\17~w·õ\v\9fG4ôW9®9ÿ\8bÜzDóÆ]l>¢a²æð\11\8d3Ç#\1aF{\10\1fÑ(5\8fhP]\ 6ñ\11\8dSÇ#\1aV{\10\1fÑ8u<¢aµ\añ\11\8dSÇ#\1aV{\10\1fÑ(5\8fhP]\ 6ñ\11\8dSÇ#\1aV{\10\1fÑ8u<¢aµ\añ\11\8d\88\ 6Õe\10\1fÑ8u<¢aµ\añ\11\8dSÇ#\1aV{\10\1fÑ8u<¢aµ\añ\11\8d\88\ 6Õe\10\1fÑ8u<¢aµ\añ\11\8dSÇ#\1aV{\10\1fÑ8u<¢aµ\añ\11\8d\88\ 6Õe\10\1fÑ8u<¢aµ\aé\11\8dC\8f\8fhج9zD£Èñ\88\ 6É\9eÃG4Î\1c\8fh\18íA|DãÔñ\88\86Õ\1eÄG4N\1d\8fhXíA|D£Ô<¢Au\19ÄG4N\1d\8fhXíA|DãÔñ\88\86Õ\1eÄG4N\1d\8fhXíA|D£Ô<¢Au\19ÄG4N\1d\8fhXíA|DãÔñ\88\86Õ\1eÄG4F\9d\8fhH]\añ\11\8dSÇ#\1aV{\10\1fÑ8u<¢aµ\añ\11\r>)\10\8fhðFÆEç7²ù\88\ 6näÇ^ȹ}|ù^é{|!'×\8c\17r\8eoà<¿üÏ¿?\7fúðo?ÿòË×\8f¯¾\8aúñå\9d\8a»wgûëMìþøçÙ\8doâ>ü\14}ºt\7f¹èüþ^\7f'öá'ãÃÝÍ[7ò\86z¼ö\82Ú\83\eßÄ}ø#Å~ïÔq-«Ëà\86züjr§\8eï:gµ\añ»Î\9d:¾ë\9cÕ\1eÄï:wêø®sV{\10¾ëÜ\98ã»ÎIì1ú®s\a\1e¿ë\9cÅ\9aÃï:wæø@hF{\10?\10Ú©ã\ 3¡YíAü@h¥æ\15AT\97A|EЩã\15AV{\10_\11têxE\90Õ\1eÄW\ 4\95\9aW\ 4Q]\ 6ñ\15\8eW\ 4YíA|EЩã\15AV{\10_\11têxE\90Õ\1eÄW\ 4\95\9aW\ 4Q]\ 6ñ\15\8eW\ 4YíA|EЩã\15AV{\10_\11Tj^\11Du\19ÄW\ 4\9d:^\11\añ\15\8eW\ 4YíA|EЩã\15AV{\10_\11Tj^\11Du\19ÄW\ 4\9d:^\11\aé\15A\87\1e_\11d³æè\15AG\1e_\11d²æð\15Aeæ\15AD\97A|EЩã\15AV{\10_\11têxE\90Õ\1eÄW\ 4\95\9aW\ 4Q]\ 6ñ\15\8eW\ 4YíA|EЩã\15AV{\10_\11têxE\90Õ\1eÄW\ 4\95\9aW\ 4Q]\ 6ñ\15\8eW\ 4YíA|EЩã\15AV{\10_\11Tj^\11Du\19ÄW\ 4\9d:^\11\añ\15\8eW\ 4YíA|EЩã\15AV{\10_\114ê|E\90Ôu\10_\11têxE\90Õ\1eÄW\ 4\9d:^\11\añ\15\8eW\ 4YíAzEP¡éÏÈì9ìÏ\149ú3$k\8eû3e¦?C´\a¹?3êìÏH]\ 6¹?Sjú3T{\90û3¥¦?Cµ\a¹?Sjú3T{\90û3£Îþ\8cÔe\90û3¥¦?Cµ\a¹?Sjú3T{\90û3£Îþ\8cÔe\90û3¥¦?Cµ\a¹?Sjú3T{\90û3¥¦?Cµ\a¹?3êìÏH]\ 6¹?Sjú3T{\90û3¥¦?Cµ\a¹?Sjú3T{\90û3£Îþ\8cÔe\90û3¥¦?Cµ\a±?SèèÏЬ9ìÏ\f\99þ\8cÈ\9eãþL\99éÏ\10íAîÏ\94\9aþ\fÕ\1eäþL©éÏPíAîÏ\8c:û3R\97AîÏ\94\9aþ\fÕ\1eäþL©éÏPíAîÏ\94\9aþ\fÕ\1eäþ̨³?#u\19äþL©éÏPíAîÏ\94\9aþ\fÕ\1eäþL¨§þ\fÔu\90û3¥¦?Cµ\a¹?Sjú3T{\90û³í\9aÊõgt#éÏÎnd»?Û¾\91\1fû®ó\97ß\86v»;îÏÆ5o÷g\7fùíùùU\1côp¸Ë\97\83¸Óúz\v/',7[õÙáÿìéú\8eï.\17\9dßÝëJéðûÝýË\7f§^ßÈ\eêñÚ\vj\ f\87?#ÞZõxí\ 5µ\a7J»Ã\9f\11w7N\1dײº\fn¨#\ 2TjªBT{\90«B¥¦*Dµ\a¹*4ê¬
+I]\ 6¹*TjªBT{\90«B¥¦*Dµ\a¹*TjªBT{\90ªBa¦*\ 4±Ç°*Tà¨
+Q¬9®
+\95\99ª\10Ñ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\95\9aª\10Õ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eĪP¡£*D³æ°*Tä¨
+\91¬9®
+\8d9«BB\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\95\9aª\10Õ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\85
+A]\a¹*TjªBT{\90«B¥¦*Dµ\a¹*TjªBT{\10«B\83¦*$³ç°*Tä¨
+\91¬9®
+\95\99ª\10Ñ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\95\9aª\10Õ\1eäªÐ¨³*$u\19äªP©©
+QíA®
+\95\9aª\10Õ\1eäªP©©
+QíA®
+\8d:«BR\97
+\95\9aª\10Õ\1eĪP¡£*D³æ°*4dªB"{\8e«Be¦*D´\a¹*TjªBT{\90«B¥¦*Dµ\a¹*4ê¬
+I]\ 6¹*TjªBT{\90«B¥¦*Dµ\a¹*TjªBT{\90«B£Îª\90Ôe\90«B¥¦*Dµ\a¹*TjªBT{\90«B¡\9eªBP×A®
+\95\9aª\10Õ\1eäªP©©
+QíA®
+·+9W\15Ò\8d¤*<»\91íªpûF~ðSív\87\eÀªp\\93ªðÓó/\1fþíùß>üòùÛ÷×AÝÍÕÝÃéÿæÍ_©\9bÃ_Á¥\9e\10îkö\84g÷µÝ\13¾¾\11è      QíAî    \95\9a\9e\10Õ\1eä\9eШ³'$u\19ä\9eP©é    QíAî    \95\9a\9e\10Õ\1eä\9eШ³'$u\19ä\9eP©é    QíAî    \95\9a\9e\10Õ\1eä\9eP©é     QíAê    \85\99\9e\10Ä\1eÃ\9eP\81£'D±æ¸'TfzBD{\90{B¥¦'Dµ\a¹'4êì   I]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì       I]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'TjzBT{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì  I]\ 6¹'TjzBT{\10{B\85\8e\9e\10Í\9aÃ\9eP\91£'D²æ¸'4æì              ]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì        I]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'TjzBT{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B¥¦'Dµ\a¹'\14ê©'\ 4u\1dä\9eP©é QíAî    \95\9a\9e\10Õ\1eä\9eP©é     QíAì    \r\9a\9e\90Ì\9eÃ\9eP\91£'D²æ¸'TfzBD{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì I]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì       I]\ 6¹'TjzBT{\90{B¥¦'Dµ\a¹'TjzBT{\90{B£Î\9e\90Ôe\90{B¥¦'Dµ\a¹'TjzBT{\90{B¥¦'Dµ\a¹'4êì    I]\ 6¹'TjzBT{\10{B\85\8e\9e\10Í\9aÃ\9eÐ\90é       \89ì9î    \95\99\9e\10Ñ\1eä\9eP©é     QíAî    \95\9a\9e\10Õ\1eä\9eШ³'$u\19ä\9eP©é    QíAî    \95\9a\9e\10Õ\1eä\9eP©é     QíAî    \8d:{BR\97Aî        \95\9a\9e\10Õ\1eä\9eP©é     QíAî    \85zê     A]\a¹'TjzBT{\90{B¥¦'Dµ\a¹'¤JÎô\84t#é  Ïnäþa«'ܾ\91\1fü\94ÂÛ\87«ýnÏ=á¸&=áoÏÿþûó·ï\1f>\7f=üË¿~þúå­\ eêñå§Ñiüõ\87\14î\ fÿ\ 5Û\88
+g¤\ 477#¥³\9bÛ\8e\94\bDJ¨ö EJÂL¤\ 4b\8fa¤¤À\11)¡Xs\1c))3\91\12¢=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=\88\91\92BG¤\84fÍa¤¤È\11)!Ys\1c)\19sFJ\84.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)  õ\14)\81º\ er¤¤ÔDJ¨ö GJJM¤\84j\ fr¤¤ÔDJ¨ö FJ\ 6M¤DfÏa¤¤È\11)!Ys\1c))3\91\12¢=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92Qg¤Dê2È\91\92R\13)¡Ú\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)\19uFJ¤.\83\1c))5\91\12ª=\88\91\92BG¤\84fÍa¤dÈDJDö\1cGJÊL¤\84h\ fr¤¤ÔDJ¨ö GJJM¤\84j\ fr¤dÔ\19)\91º\fr¤¤ÔDJ¨ö GJJM¤\84j\ fr¤¤ÔDJ¨ö GJF\9d\91\12©Ë GJJM¤\84j\ fr¤¤ÔDJ¨ö GJB=EJ ®\83\1c))5\91\12ª=È\91\92R\13)¡Ú\83\1c)mW7.R¢\eI¤tv#Û\91Òö\8dü`¤tø\87\9eýý\8e#¥qÍ)RúåùçoÏ\14)í¯®_þÄ}\1a_ïà°üð¸\19)åó\9bàææç7\9dÝÜöç7½¾\11H£PíAN£\94\9a4
\1e¤4J\98I£@ì1L£\148Ò(\14k\8eÓ(e&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(¥&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a1\8dRèH£Ð¬9L£\149Ò($k\8eÓ(cÎ4\8aÐe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(¥&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(¡\9eÒ(P×AN£\94\9a4
\1eä4J©I£PíAN£\94\9a4
\1eÄ4Ê I£Èì9L£\149Ò($k\8eÓ(e&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(¥&\8d\a9\8d2êL£H]\ 69\8dRjÒ(T{\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó(£Î4\8aÔe\90Ó(¥&\8d\a1\8dRèH£Ð¬9L£\f\994\8aÈ\9eã4J\99\10íAN£\94\9a4
\1eä4J©I£PíAN£\8c:Ó(R\97AN£\94\9a4
\1eä4J©I£PíAN£\94\9a4
\1eä4ʨ3\8d"u\19ä4J©I£PíAN£\94\9a4
\1eä4J¨§4
+Ôu\90Ó(¥&\8d\a9\8dRjÒ(T{\90Ó¨íÖÇ¥Qt#I£Înäþq+\8dÚ¾\91\1fü>È\97½ÃoC\98F\8dkÖÏozùNÈ·Û¨\9bëÇ«Û\97Û<­¿n£n\ f¿Í¿ýëu
+Làîf`rvwÛ\81Éë\e\81À\84Ôe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a10Qè\bLЬ9\fL\149\ 2\13$k\8e\ 3\13cÎÀ\84Ðe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¡\9e\ 2\13P×A\ eL\94\9aÀ\ 4Õ\1eäÀD©   LPíA\ eL\94\9aÀ\ 4Õ\1eÄÀÄ         LÈì9\fL\149\ 2\13$k\8e\ 3\13e&0A´\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13¥&0Aµ\a901ê\fLH]\ 690Qj\ 2\13T{\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\13£ÎÀ\84Ôe\90\ 3\13¥&0Aµ\a10Qè\bLЬ9\fL\f\99À\84È\9eãÀD\99   L\10íA\ eL\94\9aÀ\ 4Õ\1eäÀD©        LPíA\ eL\8c:\ 3\13R\97A\ eL\94\9aÀ\ 4Õ\1eäÀD©       LPíA\ eL\94\9aÀ\ 4Õ\1eäÀĨ30!u\19äÀD©       LPíA\ eL\94\9aÀ\ 4Õ\1eäÀD¨§À\ 4Ôu\90\ 3\13¥&0Aµ\a90Qj\ 2\13T{\90\ 3\93í`Â\ 5&t#        LÎnd;0Ù¾\91\1füì\9dëÃ\1fS\ fÿ0\8b\81ɸfýì\1d
+L\ e¿¨/ÿ`~Z\7fýëuw·Ù\97äcSàææǦ\9cÝÜöǦ¼¾\ f¨ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eĪE¡£jA³æ°jQä¨Z\90¬9®Z\8c\16B\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\84zªZ@]\a¹jQjª\16T{\90«\16¥¦jAµ\a¹jQjª\16T{\10«\16\83¦j!³ç°jQä¨Z\90¬9®Z\94\99ª\ 5Ñ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªÅ¨³j!u\19äªE©©ZPíA®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z\8c\16R\97A®Z\94\9aª\ 5Õ\1eĪE¡£jA³æ°j1dª\16"{\8e«\16e¦jA´\a¹jQjª\16T{\90«\16¥¦jAµ\a¹j1ê¬ZH]\ 6¹jQjª\16T{\90«\16¥¦jAµ\a¹jQjª\16T{\90«\16£Îª\85Ôe\90«\16¥¦jAµ\a¹jQjª\16T{\90«\16¡\9eª\16P×A®Z\94\9aª\ 5Õ\1eäªE©©ZPíA®Z¨Ò0U\vÝHª\96³\e¹\7fÚªZ¶oäÇ>6åå\11Ûíá\1f?¨jÉ5©Zþõ%iùùÓ§ß>üËõõþ\7fýþ뫯T:ü4º{Ú½;\e\7fý˵;ü!jã\e¥\ eÿç\ fw\17n.\17\9dßÜ\eßítø\9d}¿\7fëFÞøn§ãµ¬.\83\eêñË®\9c:¾=\8bÕ\1eÄoÏrêøö,V{\10¿=Ë©ãÛ³XíAøö,c\8eoÏ"±ÇèÛ³\1cxüö,\16k\ e¿=Ë\99#\ 3\a1\ 3sêÈÀXíAÌÀ\94\9a\f\fÕe\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÊÀ\1czÌÀج9ÊÀ\1cyÌÀ\98¬9ÌÀ\94\99\f\fÑe\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\f̨3\ 3#u\1dÄ\fÌ©#\ 3\a1\ 3sêÈÀXíAÌÀ\9c:20V{\9020\85\8e\f\fÍ\9e£\fÌ\91Ç\f\8cÉ\9aÃ\fÌ\99#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3Sj20T\97AÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÌÀ\9c:20V{\1030§\8e\f\8cÕ\1eÄ\fL©ÉÀP]\ 61\ 3sêÈÀXíAÊÀ\1czÌÀج9ÊÀ\14920${\ e30g\8e\f\8cÑ\1eÄ\fÌ©#\ 3\a1\ 3sêÈÀXíAÌÀ\94\9a\f\fÕe\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 3sêÈÀXíAÌÀ\94\9a\f\fÕe\1030§\8e\f\8cÕ\1eÄ\fÌ©#\ 3\a1\ 33êÌÀH]\a1\ 3sêÈÀXíAÌÀ\9c:20V{\1030ì\9aD\ 6\8672.:¿\91Í\f\fnäÇ>ÜèæqÿÇCLÌÀÆ5ÉÀ>¾\7føéoÏ/ÿóï\1f>=ÿÏ\ fß\7fþûó\97·
+¬Ûwgóo\84`ûÍ\10l&Yp{3É:»½í$ëõ\8d@\92\85j\ fr\92¥Ô$Y¨ö 'YJM\92\85j\ fR\92%Ì$Y ö\18&Y
+\1cI\16\8a5ÇI\962\93d!Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\98d)t$YhÖ\1c&Y\8a\1cI\16\925ÇI\961g\92Eè2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96POI\16¨ë 'YJM\92\85j\ fr\92¥Ô$Y¨ö 'YJM\92\85j\ fb\92eÐ$Ydö\1c&Y\8a\1cI\16\925ÇI\962\93d!Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd\19u&Y¤.\83\9cd)5I\16ª=ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\96Qg\92Eê2ÈI\96R\93d¡Ú\83\98d)t$YhÖ\1c&Y\86L\92EdÏq\92¥Ì$Y\88ö 'YJM\92\85j\ fr\92¥Ô$Y¨ö 'YF\9dI\16©Ë 'YJM\92\85j\ fr\92¥Ô$Y¨ö 'YJM\92\85j\ fr\92\99d\91º\fr\92¥Ô$Y¨ö 'YJM\92\85j\ fr\92%ÔS\92\ 5ê:ÈI\96R\93d¡Ú\83\9cd)5I\16ª=ÈI\16\15F&É¢\eI\92uv#ÛIÖö\8düà'sÝ?]\1d~á9É\1a×¼ÜÑË÷Ë}ûþüÛ\87¯ÿú?>|ûþÛï\1f¿¿*\83\1e\ e¿\83¿ü3ãizõ\ f?\98o\1f¶r¬\87Ã\1f°þøO\rn-\17\9dßÚëDéð\8b´ßݼu#o|\1aØñZV\97Á\rõöêéѪÇk/¨=¸¡\8e\ f*Sj>ù\fÕ\1eäO>3êÌìH]\ 69³Sj2;T{\903;¥&³Cµ\a9³Sj2;T{\902;a&³\ 3±Ç0³SàÈìP¬9Îì\94\99Ì\ eÑ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eÄÌN¡#³C³æ0³SäÈì\90¬9Îì\8c93;B\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\84zÊì@]\a9³Sj2;T{\903;¥&³Cµ\a9³Sj2;T{\103;\83&³#³ç0³SäÈì\90¬9Îì\94\99Ì\ eÑ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌΨ3³#u\19äÌN©ÉìPíAÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì\8c:3;R\97AÎì\94\9aÌ\ eÕ\1eÄÌN¡#³C³æ0³3d2;"{\8e3;e&³C´\a9³Sj2;T{\903;¥&³Cµ\a9³3êÌìH]\ 69³Sj2;T{\903;¥&³Cµ\a9³Sj2;T{\903;£ÎÌ\8eÔe\903;¥&³Cµ\a9³Sj2;T{\903;¡\9e2;P×AÎì\94\9aÌ\ eÕ\1eäÌN©ÉìPíAÎì¶Ë1\97ÙÑ\8d$³;»\91\87ë­ÌnûF~ð\93Ï\ e\7f\88º;¶xÛ\99ݸ¦2»?>þìó¯[©ÝãÍÕýþîÝÙüëÔîå\e<·¾\ 2\19ÜÞÌÏÎno;?{}#\90\9f¡Ú\83\9c\9f\19uæg¤.\83\9c\9f)5ù\19ª=Èù\99R\93\9f¡Ú\83\9c\9f)5ù\19ª=Hù\990\93\9f\81Øc\98\9f)päg(Ö\1cçgÊL~\86h\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fr~¦Ôäg¨ö çgJM~\86j\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fb~¦Ð\91\9f¡Ys\98\9f)rägHÖ\1cçgÆ\9cù\19¡Ë çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fr~¦Ôäg¨ö çgJM~\86j\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~¦Ôäg¨ö çgB=åg ®\83\9c\9f)5ù\19ª=Èù\99R\93\9f¡Ú\83\9c\9f)5ù\19ª=\88ù\99A\93\9f\91Ùs\98\9f)rägHÖ\1cçgÊL~\86h\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fr~¦Ôäg¨ö çgJM~\86j\ fr~fÔ\99\9f\91º\fr~¦Ôäg¨ö çgJM~\86j\ fr~¦Ôäg¨ö çgF\9dù\19©Ë çgJM~\86j\ fb~¦Ð\91\9f¡Ys\98\9f\19\19\91=Çù\992\93\9f\83\9c\9f)5ù\19ª=Èù\99R\93\9f¡Ú\83\9c\9f\19uæg¤.\83\9c\9f)5ù\19ª=Èù\99R\93\9f¡Ú\83\9c\9f)5ù\19ª=Èù\99Qg~Fê2Èù\99R\93\9f¡Ú\83\9c\9f)5ù\19ª=Èù\99POù\19¨ë çgJM~\86j\ fr~¦Ôäg¨ö çgÛ5\95ËÏèF\92\9f\9dÝÈv~¶}#?\98\9fݾ<\12ßq~6®y¹£Ï_>\7fÿð·\7flUgw\8f\87\1f¹OïÎV_Wg·7\9bÕÙýáÎÿøQ\aw\95\8bÎïêu\9dtøóÒãþá­\eyC=^{AíÁ\rõîêîå'\93R\8f×^P{pC=ü\93ƽU\8f×^P{ðmõáðO\1a/?\99\8c:®eu\19ÜP\ fÿ¤qmÕãµ\17Ô\1eÜP\ fÿ¤ñò\93I©Çk/¨=¸¡\8eO2Tj>\1a\11Õ\1eä\8fF4êühDR\97AþhD¥¦MEµ\a¹MUjÚTT{\90ÛT£Î6\95Ôe\90ÛT¥¦MEµ\a¹MUjÚTT{\90ÛT¥¦MEµ\a©M\15fÚT\10{\fÛT\ 5\8e6\15Å\9aã6U\99iS\11íAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6U©iSQíAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAlS\15:ÚT4k\ eÛTE\8e6\15É\9aã6Õ\98³M%t\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6U©iSQíAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\95\9a6\15Õ\1eä6U¨§6\15Ôu\90ÛT¥¦MEµ\a¹MUjÚTT{\90ÛT¥¦MEµ\a±M5hÚT2{\ eÛTE\8e6\15É\9aã6U\99iS\11íAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAnS\95\9a6\15Õ\1eä6U©iSQíAnS\8d:ÛTR\97AnS\95\9a6\15Õ\1eä6U©iSQíAnS\95\9a6\15Õ\1eä6Õ¨³M%u\19ä6U©iSQíAlS\15:ÚT4k\ eÛTC¦M%²ç¸MUfÚTD{\90ÛT¥¦MEµ\a¹MUjÚTT{\90ÛT£Î6\95Ôe\90ÛT¥¦MEµ\a¹MUjÚTT{\90ÛT¥¦MEµ\a¹M5êlSI]\ 6¹MUjÚTT{\90ÛT¥¦MEµ\a¹M\15ê©M\ 5u\1dä6U©iSQíAnS\95\9a6\15Õ\1eä6u»¹tm*ÝHÚÔ³\eyØmµ©Û7ò\83ß@|¸øþö\89ÛÔqÍlS?=ÿÏÏ\1f\9f7¿\80øð\eÛË\7f\8c§å׿Vw7»Í/ NQ\bw6\8b³;Û.
+_ß\b\14\85¨ö \17\85JMQ\88j\ frQhÔY\14\92º\frQ¨Ô\14\85¨ö \17\85JMQ\88j\ frQhÔY\14\92º\frQ¨Ô\14\85¨ö \17\85JMQ\88j\ frQ¨Ô\14\85¨ö \15\85ÂLQ\bb\8faQ¨ÀQ\14¢Xs\\14*3E!¢=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=\88E¡BGQ\88fÍaQ¨ÈQ\14"Ys\\14\1as\16\85\84.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14
+õT\14\82º\ erQ¨Ô\14\85¨ö \17\85JMQ\88j\ frQ¨Ô\14\85¨ö \16\85\ 6MQHfÏaQ¨ÈQ\14"Ys\\14*3E!¢=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡QgQHê2ÈE¡RS\14¢Ú\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14\1au\16\85¤.\83\\14*5E!ª=\88E¡BGQ\88fÍaQhÈ\14\85\1c\17\85ÊLQ\88h\ frQ¨Ô\14\85¨ö \17\85JMQ\88j\ frQhÔY\14\92º\frQ¨Ô\14\85¨ö \17\85JMQ\88j\ frQ¨Ô\14\85¨ö \17\85F\9dE!©Ë \17\85JMQ\88j\ frQ¨Ô\14\85¨ö \17\85B=\15\85 ®\83\\14*5E!ª=ÈE¡RS\14¢Ú\83\\14R%g\8a\91\14\85g7²]\14nßÈ\ f~Úåá\1fÜï\9f\1e¹(\1c×Ì¢ðÂ\17-ßß\1e\7f\8f9M¿þÈË»ÝÃæG^æc áÖæÇ@\9eÝÚöÇ@¾¾\11ø\18HT{\90?\ 6Ò¨óc I]\ 6ùc \95\9ah\13Õ\1eähS©\896QíA\8e6\95\9ah\13Õ\1eähÓ¨3Ú$u\19ähS©\896QíA\8e6\95\9ah\13Õ\1eähÓ¨3Ú$u\19ähS©\896QíA\8e6\95\9ah\13Õ\1eähS©\896QíA\8a6\85\99h\13Ä\1eÃhS\81#ÚD±æ8ÚTf¢MD{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\10£M\85\8eh\13Í\9aÃhS\91#ÚD²æ8Ú4æ\8c6     ]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M¥&ÚDµ\a\14ê)Ú\ 4u\1dähS©\896QíA\8e6\95\9ah\13Õ\1eähS©\896QíA\8c6\r\9ah\93Ì\9eÃhS\91#ÚD²æ8ÚTf¢MD{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M£Îh\93Ôe\90£M¥&ÚDµ\a9ÚTj¢MT{\90£M¥&ÚDµ\a9Ú4ê\8c6I]\ 69ÚTj¢MT{\10£M\85\8eh\13Í\9aÃhÓ\90\896\89ì9\8e6\95\99h\13Ñ\1eähS©\896QíA\8e6\95\9ah\13Õ\1eähÓ¨3Ú$u\19ähS©\896QíA\8e6\95\9ah\13Õ\1eähS©\896QíA\8e6\8d:£MR\97A\8e6\95\9ah\13Õ\1eähS©\896QíA\8e6\85z\8a6A]\a9ÚTj¢MT{\90£M¥&ÚDµ\a9ÚÜî\10]´I7\92hóìF\1eö[Ñæö\8düàÇ@^ß^=ÜÞs´9®\99Ñæ×\7fý\1fð\1dåû»Ý»³Ù×Áæãá\1fw.}G9ÜÖü\8eò³ÛÚþ\8eò×7\ 2ßQ\8ej\ fòw\94+5q*ª=ÈqªR\13§¢Ú\83\1c§\1auÆ©¤.\83\1c§*5q*ª=ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªQg\9cJê2ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªQg\9cJê2ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªR\13§¢Ú\83\14§
+3q*\88=\86\ 2G\9c\8abÍq\9cªÌÄ©\88ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Æ©
+\1dq*\9a5\87qª"G\9c\8adÍq\9c\19§\12º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c*ÔS\9c
+ê:ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªR\13§¢Ú\83\18§\1a4q*\99=\87qª"G\9c\8adÍq\9cªÌÄ©\88ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©F\9dq*©Ë Ç©JM\9c\8aj\ fr\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9c\19§\92º\fr\9cªÔÄ©¨ö Æ©
+\1dq*\9a5\87qª!\13§\12Ùs\1c§*3q*¢=ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªQg\9cJê2ÈqªR\13§¢Ú\83\1c§*5q*ª=ÈqªR\13§¢Ú\83\1c§\1auÆ©¤.\83\1c§*5q*ª=ÈqªR\13§¢Ú\83\1c§
\14§\82º\ er\9cªÔÄ©¨ö Ç©JM\9c\8aj\ fr\9cºÝ\º8\95n$qêÙ\8dlÇ©Û7òc\9f(º?ü\8b\87§;\8cSsÍ\8cSÿö\8fo¿>\7füúë·×\99äáî\ eÿ@~¶úºM½½yÜlSG%Jw\95\8bÎïj³\12}ãF¶+QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q¥¦\12Eu\19ÄJÔ©£\12\a±\12uê¨DYíA¬D\9d:*QV{\10*Qc\8eJ\94Ä\1e£JÔ\81ÇJ\94Å\9aÃJÔ\99£\12\a±\12uê¨DYíA¬D\95\9aJ\14Õe\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíAªD\1dz¬DÙ¬9ªD\1dy¬D\99¬9¬D\95\99J\14Ñe\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJÔ¨³\12%u\1dÄJÔ©£\12\a±\12uê¨DYíA¬D\9d:*QV{\90*Q\85\8eJ\14Í\9e£JÔ\91ÇJ\94É\9aÃJÔ\99£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12Uj*QT\97A¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíA¬D\9d:*QV{\10+Q§\8eJ\94Õ\1eÄJT©©DQ]\ 6±\12uê¨DYíAªD\1dz¬DÙ¬9ªD\159*Q${\ e+Qg\8eJ\94Ñ\1eÄJÔ©£\12\a±\12uê¨DYíA¬D\95\9aJ\14Õe\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\12uê¨DYíA¬D\95\9aJ\14Õe\10+Q§\8eJ\94Õ\1eÄJÔ©£\12\a±\125ê¬DI]\a±\12uê¨DYíA¬D\9d:*QV{\10+Q¨\1fU%\8a72.:¿\91\87\9b\8dJ\14näÇ>ÂtÿÇ\8fæ\e®DÇ5/wôñç/\1f>=ÿåçß\7fùþáóoÿþáÓço¿þüýãûÇ\9fþöVÈrýò[ù\89\8bv}ø£ÔÛ¿h§¶\ 5nq¶-g·¸Ý¶¼¾\11h[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eĶE¡£mA³æ°mQäh[\90¬9n[\8c\16B\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶E©i[PíAn[\84zj[@]\a¹mQjÚ\16T{\90Û\16¥¦mAµ\a¹mQjÚ\16T{\10Û\16\83¦m!³ç°mQäh[\90¬9n[\94\99\ 5Ñ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶Å¨³m!u\19ä¶E©i[PíAn[\94\9a\ 5Õ\1eä¶E©i[PíAn[\8c\16R\97An[\94\9a\ 5Õ\1eĶE¡£mA³æ°m1dÚ\16"{\8eÛ\16e¦mA´\a¹mQjÚ\16T{\90Û\16¥¦mAµ\a¹m1êl[H]\ 6¹mQjÚ\16T{\90Û\16¥¦mAµ\a¹mQjÚ\16T{\90Û\16£Î¶\85Ôe\90Û\16¥¦mAµ\a¹mQjÚ\16T{\90Û\16¡\9eÚ\16P×An[\94\9a\ 5Õ\1eä¶E©i[PíAn[(Ó0m\vÝHÚ\96³\eÙn[¶oä\a?\ 1íð[üãÓ\9eÛ\96qMÚ\96\8fï\1f~úÛç_?|{þþû¯/\85Ë[\9f\18õtûôîl|½\83Ã\1fgîo·>\bm~\9c\13ÜÜü8§³\9bÛþ8§×7\ 2\1fç\84j\ fòÇ9)5\1fç\84j\ fòÇ9\19u~\9c\13©Ë \7f\9c\93RóqN¨ö \7f\9c\93RóqN¨ö \7f\9c\93RóqN¨ö }\9c\930óqN ö\18~\9c\93\ 2ÇÇ9¡XsüqNÊLò\86h\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oJMò\86j\ fròfÔ\99¼\91º\frò¦Ô$o¨ö 'oJMò\86j\ fròfÔ\99¼\91º\frò¦Ô$o¨ö 'oJMò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ fbò¦Ð\91¼¡Ys\98¼)r$oHÖ\1c'oÆ\9cÉ\e¡Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ôÿ¿²{ë\91ë8¬(üWôH>hÀ¹öÌ£b$\80\81À¹8~\ eh\89\99È\94CJ\ e\90_\9fnvíêÞÕsV/½IB{\7fG\92\9cZÅIò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oJMò\86j\ frò&ÔSò\ 6ê:ÈÉ\9bR\93¼¡Ú\83\9c¼)5É\eª=ÈÉ\9bR\93¼¡Ú\83\98¼\19\e\99=\87É\9b"Gò\86dÍqò¦Ì$o\88ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oJMò\86j\ fròfÔ\99¼\91º\frò¦Ô$o¨ö 'oJMò\86j\ fròfÔ\99¼\91º\frò¦Ô$o¨ö 'oJMò\86j\ frò¦Ô$o¨ö 'oF\9dÉ\e©Ë 'oJMò\86j\ frò¦Ô$o¨ö 'oJMò\86j\ fròfÔ\99¼\91º\frò¦Ô$o¨ö &o
+\1dÉ\e\9a5\87É\9b!\93¼\11Ùs\9c¼)3É\e¢=ÈÉ\9bR\93¼¡Ú\83\9c¼)5É\eª=ÈÉ\9bQgòFê2ÈÉ\9bR\93¼¡Ú\83\9c¼)5É\eª=ÈÉ\9bR\93¼¡Ú\83\9c¼\19u&o¤.\83\9c¼)5É\eª=ÈÉ\9bR\93¼¡Ú\83\9c¼ õ\94¼\81º\ erò¦Ô$o¨ö 'oJMò\86j\ frò¶Ýp¹ä\8d\1e$ÉÛÙ\83ì\1e\92·í\aù\95¿\9cÓãþC\ f\1d\ 6o\7fúüáÃë½ÛÝÍý!Á\98Ë\97?÷óqïlänóçCn?Øüñ\90§\aÛþé\90\17O\ 1?\1c\92È\9aã\1f\riÈüdH"k\8e\7f.¤ gG\bdÏqEhÈD\84\1c'\84\86LAHdÍq?(È\99\ f\ 2Ùs\1c\ f\1a2í \915Çå !\13\ e\12Ys\9c\r\1a2Õ \915GÍàu0Éà6WS\18\f\1a\82Ä\9d\8fq-hÀÄ\82\1c§\82\86L)HdÍq'(È\99     \ 2Ùs\1c    \1a2\8d \91\85 !\13\b\12Ys\9c\a
+rÖ\81\1c·\81\86L\1aHdÍq\18hÈt\81\1cW\81\86L\14HdÍq\12(ÈY\ 4\ 2ÙsÜ\ 3\1a29 \915Ç1 !Ó\ 2\12Ys\\ 2
+r\86\80\1cg\80\86L\ 5HdÍq\ 3hÈ$\80\1c\a\80\86LÿGdÍqý'È\19ÿ\ 1Ùs\9cþ\19\1f\915\87Ý\9f\11GöGàù\18F\7fÆ\eÍ\1fyçc\ü  p\ 6\7f ö\1cç~\86LíGdÍqëgȤ~DÖ\1c\87~\82\9c\9d\1f\90\95\9f!\13ù\11Ys\9cø\192\85\1f\915Ç}\9f!\93÷\11Ys\1c÷     r¶}@ö\1c\97}\86LØGdÍqÖgÈT}DÖ\1c7}\82\9cI\1f\90=ÇA\9f!Óó\11Ys\ó\1921\1f\915Ç)\9f!Sò\11YsÜñ]'O\19ß6¹ÌqÄgÈ4|DÖ\1c\17|\86LÀGdÍq¾gÈÔ{DÖ\1c¶{BLº\a`\8da¸g¼Ñí\91w>ÆÕ\9e\ 1\13í\91Xs\9cì       r\16{@ö\1c÷z\86L®GdÍq¬gÈ´zDÖ\1c\97z\86L¨GdÍq¦'ÈYé\ 1ÙsÜè\192\89\1e\91\81\9e!Óç\11Ys\ç     rÆy@ö\1c§y\86L\99GdÍq\97gÈdyDÖ\1cGy\86L\93GdÍq\91\19ä\ 1Ùs\9cã\1925\1e\915Ç-\9e!\93â\11Ys\1câ\192\1d\1e\91\15\9e g\84\adÏq\82\14xDÖ\1cöwF\1cù\1d\81çc\18ß  /í\1dx5Æå\9d\ 1\13Þ\91Xs\9cÝ\19\1d\915ÇÍ\9d!\93Ü\11Ys\1cÜ       röv@ö\1c×v\86LlGdÍqjgÈ\94vDÖ\1cwv\86LfGdÍqd'ÈÙØ\ 1Ùs\Ø\192\81\1d\915Çy\9d!S×\11YsÜÖ]'OiÝ6¹ÌqXgÈtuDÖ\1cWu\86LTGdÍqR·\99\89¹¢\ e\9e"AÝé)¶{ºÍ§øöþðõÔá_·ô+Èíÿ³yÿõ=Íý\9eß\7f\83ûjO7>\94Ï\1c\1ehÿ¯Ì\9b\97\9b·\87_\vïÍoÞÞ>¿ùîwÇßù\87\9fÞ\7fþáËñ·ß\7fúa|â/ooß|üÛñwþéíí»7\1f?½ÿñãÿ½ÿùãO\9fÆ\1fýåÓ÷\87ßûrù>æñæöðMéé        /»¼ÝþoÈë\7fÁO¯\85àÏp¾\17:û3Ü~1tù ðf\bÕ\1eÄwC\ 6ÍË!2{\ e_\ f)r¼\1fB²æø\r\91\8a\bÑ\1eä\97DF\9do\89H]\ 6ù=\91Ró¢\bÕ\1eäWEJÍ»"T{\90ß\16)5¯\8bPíA~adÔùÆ\88Ôe\90ß\19)5/\8dPíA~m¤Ô¼7Bµ\aùÍ\91Qç«#R\97A~y¤Ô¼=Bµ\aùý\91\ 2 Õ\1eäWHJÍ;$T{\90ß"\19u¾F"u\19ä\17IJÍ\9b$T{\90ß%)5/\93PíA~\9d¤Ô¼OBµ\aù\8d\92Qç+%R\97A~©¤Ô¼UBµ\añ½\92\8b%4k\ e_-\19\96\88ì9~»¤Ì¼^B´\aù\ 5\93\86  Õ\1eäwLJÍK&T{\90_3\19u¾g"u\19ä7MJÍ«&T{\90_6)5o\9bPíA~ߤԼpBµ\aù\95\93Qç;'R\97A~ë¤Ô¼vBµ\aùÅ\93Róæ      Õ\1eäwOB=½|\ 2u\1dä×OJÍû'T{\90ß@)5¯ PíA~        µýRĽ\85¢\aÉk¨³\aÙ=n½\87Ú~\90_ù£\fîvû\ f?óÅÎñ\99Ã\13ýõË\9f\7fúã\7fýç\ f?}úpqeëñÝþÑn¿9\9b¼|s´ÿ\86rëFçþK×ÝÃ\v?R>tþH\97\1e÷ßÈ\1dþÅ\7fù ¯¨ÇÏ^Q{pCÝíÿjYõøÙ+j\ f¾®>íÿf\1fþÅoÔñYV\97Á\ruÿ\8dÜ\9dU\8f\9f½¢öà\86úxóxø\17¿R\8f\9f½¢öà\86ºÿFîɪÇÏ^Q{pã\92ðþ\e¹Ã¿ø\8d:>Ëê2¸¡\8e\eÓJÍ\rlT{\90ï`+5\97°QíA¾\86­ÔÜÃFµ\aù&¶QçUlR\97\8c­ÔÜÆFµ\aù>¶Rs!\eÕ\1eä+ÙF\9dw²I]\ 6ùV¶Rs-\eÕ\1eä\8bÙJÍÍlT{\90ïf+5\97³QíAº\9e-ÌÜÏ\ 6±Çð\86\ 2Ç\15m\14k\8e/i+3·´\11íA¾§­Ô\ÔFµ\aùª¶Qç]mR\97A¾­­Ô\×Fµ\aù¶Rsc\eÕ\1eä;ÛF\9d\97¶I]\ 6ùÚ¶Rso\eÕ\1eä\9bÛJÍÕmT{\90/o+5··QíA¾¿mÔy\81\9bÔe\90¯p+5w¸QíA¾Å­Ô\ãFµ\aù"·QçMnR\97A¾Ë­Ô\æFµ\aù:·Rs\9f\eÕ\1eä\eÝJÍ\95nT{\90/u\euÞê&u\19ä{ÝJÍÅnT{\10¯v+tÜíF³æðv·"Çõn$k\8e/x\esÞð&t\19ä;ÞJÍ%oT{\90¯y+5÷¼QíA¾émÔyÕ\9bÔe\90/{+5·½QíA¾ï­Ô\øFµ\aùÊ·Rsç\eÕ\1eä[ßF\9d×¾I]\ 6ùâ·Rsó\eÕ\1eä»ßJÍåoT{\90¯\7f\euÞÿ&u\19ä\eàJÍ\15pT{\90/\81+5·ÀQíA¾\a®Ô\\ 4\aù*¸POwÁA]\aù6¸Rs\1d\1cÕ\1eä\váJMú\8bj\ frú«Ô¤¿¨ö ¦¿\ 6MúKfÏaú«È\91þ"Ys\9cþ*3é/¢=Èé¯QgúKê2Èé¯R\93þ¢Ú\83\9cþ*5é/ª=Èé¯R\93þ¢Ú\83\9cþ\1au¦¿¤.\83\9cþ*5é/ª=Èé¯R\93þ¢Ú\83\9cþ\1au¦¿¤.\83\9cþ*5é/ª=Èé¯R\93þ¢Ú\83\9cþ*5é/ª=Èé¯QgúKê2Èé¯R\93þ¢Ú\83\9cþ*5é/ª=Èé¯R\93þ¢Ú\83\9cþ\1au¦¿¤.\83\9cþ*5é/ª=\88é¯BGú\8bfÍaúkȤ¿Dö\1c§¿ÊLú\8bh\ frú«Ô¤¿¨ö §¿JMú\8bj\ frúkÔ\99þ\92º\frú«Ô¤¿¨ö §¿JMú\8bj\ frú«Ô¤¿¨ö §¿F\9dé/©Ë §¿JMú\8bj\ frú«Ô¤¿¨ö §¿B=¥¿ ®\83\9cþ*5é/ª=Èé¯R\93þ¢Ú\83\9cþnW­.ý¥\aIú{ö Ûéïö\83üÊ\1férûpóîù\89Óßñ\99ñC]ò3]^Ï\7f￾ï8­^Ö¿·÷Ûõo:\xªÙá\9e=Õv\87{ù Ðá¢Ú\83Üá\1auv¸¤.\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®Qg\87Kê2È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\1auv¸¤.\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\1auv¸¤.\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=H\1d®0Óá\82ØcØá*pt¸(Ö\1cw¸ÊL\87\8bh\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fb\87«ÐÑá¢YsØá*rt¸HÖ\1cw¸Æ\9c\1d.¡Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸B=u¸ ®\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=\88\1d®AÓá\92ÙsØá*rt¸HÖ\1cw¸ÊL\87\8bh\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87kÔÙá\92º\fr\87«Ôt¸¨ö w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸F\9d\1d.©Ë w¸JM\87\8bj\ fb\87«ÐÑá¢YsØá\1a2\1d.\91\1d®2Óá"Ú\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá\1auv¸¤.\83Üá*5\1d.ª=È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®Qg\87Kê2È\1d®RÓá¢Ú\83Üá*5\1d.ª=È\1d®PO\1d.¨ë w¸JM\87\8bj\ fr\87«Ôt¸¨ö w¸Û}©ëpéAÒá\9e=Èv\87»ý ¿ò\97à}w,\ 2±Ã\1d\9f\19\1dî\ f\1fþþñû\ f¯g¸O\87üâñ\9b³ÕË¿N·\8fw[\1dî¬Dá©f%zöTÛ\95èå\83@%\8aj\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%ªÔT¢¨ö U¢ÂL%
+b\8fa%ªÀQ\89¢Xs\\89*3\95(¢=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=\88\95¨BG%\8afÍa%ªÈQ\89"Ys\\89\1asV¢\84.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89
+õT\89\82º\ er%ªÔT¢¨ö W¢JM%\8aj\ fr%ªÔT¢¨ö V¢\ 6M%JfÏa%ªÈQ\89"Ys\\89*3\95(¢=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨Qg%Jê2È\95¨RS\89¢Ú\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89\1auV¢¤.\83\\89*5\95(ª=\88\95¨BG%\8afÍa%jÈT¢Dö\1cW¢ÊL%\8ah\ fr%ªÔT¢¨ö W¢JM%\8aj\ fr%jÔY\89\92º\fr%ªÔT¢¨ö W¢JM%\8aj\ fr%ªÔT¢¨ö W¢F\9d\95(©Ë W¢JM%\8aj\ fr%ªÔT¢¨ö W¢B=U¢ ®\83\\89*5\95(ª=È\95¨RS\89¢Ú\83\\89Rýh*Qz\90T¢g\ f²]\89n?ȯûÕZo\9f\9fon÷¿A\95h>3*Ñ¿¼ÿüÃÿ¾½}~óþóF+º;¶\8d\97¿fë»Ýæ¯Ù\9aÎ\8e\9e-\1f:\7f\8dÎîáµ\aÙè쮩ˠvvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbg§Ôtv¨.\83ØÙ9utv¬ö vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fBggÌÑÙ\91ØcÔÙ9ðØÙ±XsØÙ9stv\8cö vvN\1d\9d\1d«=\88\9d\9dRÓÙ¡º\fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=H\9d\9dC\8f\9d\1d\9b5G\9d\9d#\8f\9d\1d\935\87\9d\9d2ÓÙ!º\fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ\19uvv¤®\83ØÙ9utv¬ö vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fRg§ÐÑÙ¡ÙsÔÙ9òØÙ1YsØÙ9stv\8cö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvJMg\87ê2\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbgçÔÑÙ±Ú\83ØÙ)5\9d\1dªË vvN\1d\9d\1d«=H\9d\9dC\8f\9d\1d\9b5G\9d\9d"Gg\87dÏagçÌÑÙ1Ú\83ØÙ9utv¬ö vvN\1d\9d\1d«=\88\9d\9dRÓÙ¡º\fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvN\1d\9d\1d«=\88\9d\9dRÓÙ¡º\fbgçÔÑÙ±Ú\83ØÙ9utv¬ö vvF\9d\9d\1d©ë vvN\1d\9d\1d«=\88\9d\9dSGgÇj\ fbg\aå\98êìðAÆ\87Î\1fd÷´ÑÙÁ\83|{¿ÛÝ<\7fý&\16~5Æ\87ûñ¥Îîqÿ\7f°»×;»ñ¡|æðDûoÌnÞ~{·{~óÏ\1f?ýæPÛ}÷»ãïÿáËû?\7f8þæo?ý駷·o>ÿõýÏ\1f\7fúôz\9bõòÍ\19½>ßÝ××~\e\19Þ\f§àÑg8uöèÛáÔå\83@8\85j\ fr8¥Ô\84S¨ö \85SÂL8\ 5b\8fa8¥À\11N¡Xs\1cN)3á\14¢=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=\88á\94BG8\85fÍa8¥È\11N!Ys\1cN\19s\86S\84.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN       õ\14N\81º\ er8¥Ô\84S¨ö \87SJM8\85j\ fr8¥Ô\84S¨ö \86S\ 6M8EfÏa8¥È\11N!Ys\1cN)3á\14¢=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN\19u\86S¤.\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94Qg8Eê2Èá\94R\13N¡Ú\83\1cN)5á\14ª=Èá\94R_®\9f\83\1cN\19u\86S¤.\83\1cN)5á\14ª=\88á\94BG8\85fÍa8eÈ\84SDö\1c\87SÊL8\85h\ fr8¥Ô\84S¨ö \87SJM8\85j\ fr8eÔ\19N\91º\fr8¥Ô\84S¨ö \87SJM8\85j\ fr8¥Ô\84S¨ö \87SF\9dá\14©Ë \87SJM8\85j\ fr8¥Ô\84S¨ö \87SB=\85S ®\83\1cN)5á\14ª=Èá\94R\13N¡Ú\83\1cNm·>.\9c¢\aI8uö ÛáÔö\83|{\7føjìá\99\7f\81²ý\7fe￾\1c:|añüz75>3>\92lêö&uÔ\97\9fßÿøã±\8dúúGþõó\87Ï\1fÞÞ¾ù\9f_>~ùøó\87/\97\ 5Äþ?y\ fsðÕ`êvÿ­Ðë\7f\11O%Æö#Ï\10ãôÈÛ\1dÆÅS@\86AdÍq\84!ÈÙ`\0Ùs\`\182\ 1\ 6\915Çù\85!S_\10YsÜ^\18\ 5\915Çá\85 gw\ 1dÏquaÈD\17\1c'\17\86LqAdÍqo!È\99[\0Ùs\1c[\18\ 5\915Ç¥\85!\13Z\10Ys\9cY\182\95\ 5\91\8d\85 gb\ 1dÏq`aÈô\15\1cÖ\15F\1cq\ 5\81çc\98V\18o\94\15ä\9d\8fqW!À\99U\80Øs\1cU\182M\ 5\915ÇE\85!\13T\10Ys\9cS\b\14\1c·\14\86LJAdÍqHaÈt\14\1cW\14\86LDAdÍqB!ÈYP\0ÙsÜO\18\ 4\915Çñ\84!ÓN\10Ys\N\br\86\13\1cg\13\86L5AdÍq3aÈ$\13\1c\a\13\86L/AdÍq-q\9d\12Ûä2Ç©\84!SJ\10YsÜI\182\99\ 4\91\91\84!ÓH\10YsXH\b1\81\ 4\805\86y\84ñF\1dAÞù\18·\11\ 6L\1aAbÍq\18!ÈÙE\0Ùs\E\182Q\ 4\915ÇI\84!SD\10YsÜC\1829\ 4\915Ç1\84 g\v\ 1dÏq aÈ\84\10\1cg\10\86L\ 5AdÍq\ 3\99@\0Ùs\1c@\18\ 3\915Çõ\83!\13?\10Ys\9c>\18\ 3\915ÇÝ\83 gö\0dÏqô`È4\ f\1c\17\ f\86Lð@dÍqî`ÈÔ\ e\1c·\ e\82\9c©\ 3\90=Ç¡\83!Ó9\10YsX9\18qD\ e\ 4\9e\8faâ ¼\14\ eàÕ\18÷\r\ 6LÞ@bÍqÜ`È´\r\1c\97\r\86LØ@dÍqÖ ÈY5\0ÙsÜ4\182I\ 3\915ÇA\83!Ó3\10Ys\3\1821\ 3\915Ç)\83 gÉ\0dÏqÇ`Èd\f\1cG\f\86LÃ@dÍqÁp\9d<\ 5\fÛä2Çù\82!S/\10YsÜ.\18\ 2\915ÇáÂæ\91»ë\16à)\92-\9c\9eb»ZØ|\8a%Z¸½\12-<ìÿ¬öO\8dÕÂøL²\85»\91-üÛ/\1f¿\7f»{óß\17\11ÃÛÛ7\9fN\7fðó/ß\1fÂ\86Ë\86áþùæöéå\9b³G¸\8c\18îöÿßÛ\88\18æÉ%ü)̣˳?\85í³ËË\a\81ÃKT{\90\8f/\95\9aóKT{\90O0\95\9a#LT{\90\ f1\8d:O1I]\ 6ù\1cS©9ÈDµ\añ(S¡ã,\13Í\9aÃÓLE\8eãL$k\8e\ f4\8d9O4    ]\ 6ùLS©9ÔDµ\aùXS©9×Dµ\aùdÓ¨óh\93Ôe\90\ f7\95\9aÓMT{\90Ï7\95\9a\ 3NT{\90\8f8\95\9a3NT{\90O9\8d:\8f9I]\ 6ù S©9éDµ\aù¬S©9ìDµ\aù¸Ó¨ó¼\93Ôe\90O<\95\9a#OT{\90\ f=\95\9aSOT{\90Ï=\95\9a\83OT{\90\8f>\85z:û\ 4u\1däÓO¥æø\13Õ\1eä\ 3P¥æ\ 4\14Õ\1eä3P¥æ\10\14Õ\1eÄcP\83æ\1c\94Ì\9eÃ\93PE\8e£P$k\8e\ fC\95\99ÓPD{\90ÏC\8d:\ fDI]\ 6ùHT©9\13\aùTT©9\16\aù`T©9\19\aùlÔ¨óp\94Ôe\90\8fG\95\9aóQT{\90OH\95\9a#RT{\90\ fI\8d:OII]\ 6ù\9cT©9(Eµ\aù¨T©9+Eµ\aù´T©9.Eµ\aùÀÔ¨óÄ\94Ôe\90ÏL\95\9aCST{\90\8fM\95\9asST{\90ON\95\9a£ST{\90\ fO\8d:OOI]\ 6ùüT©9@Eµ\añ\bU¡ã\f\15Í\9aÃSTCæ\18\95È\9eã\83Teæ$\15Ñ\1eä³T¥æ0\15Õ\1eäãT¥æ<\15Õ\1eä\13U£Î#UR\97A>TUjNUQíA>WUj\ eVQíA>ZUjÎVQíA>]5ê<^%u\19ä\ 3V¥æ\84\15Õ\1eä3V¥æ\90\15Õ\1eäcV¡\9eÎYA]\aù¤U©9jEµ\aù°U©9mEµ\aù¼uûxÐ\1d¸Ò\83äÄõìAv»­#×í\aù\95g®÷\87\97ÓWn\8a\8fÏäÌõ~óªøÇý\1f9üh\8d­SÖw»ý\9fâã7gèå)ëÓÓæ)ëü\ 1\ 5ðÐó\a\14\9c=ôö\ f(¸|\10ø\ 1\ 5¤.\83ü\ 3
+\94\9akñ¨ö _\8cWjnÆ£Ú\83|7Þ¨ór<©Ë _\8fWjîÇ£Ú\83|C^©¹"\8fj\ fò%y¥æ\96<ª=È÷ä\8d:/Ê\93º\fòUy¥æ®<ª=È·å\95\9aëò¨ö _\987êìNH]\ 6¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13£Îî\84Ôe\90»\13¥¦;Aµ\a±;QèèNЬ9ìN\14\13$k\8e»\13cÎî\84Ðe\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13£Îî\84Ôe\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;1êìNH]\ 6¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;1êìNH]\ 6¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13¡\9eº\13P×AîN\94\9aî\ 4Õ\1eäîD©éNPíAîN\94\9aî\ 4Õ\1eÄîÄ éNÈì9ìN\14\13$k\8e»\13e¦;A´\a¹;1êìNH]\ 6¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13£Îî\84Ôe\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13£Îî\84Ôe\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;1êìNH]\ 6¹;Qjº\13T{\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\13£Îî\84Ôe\90»\13¥¦;Aµ\a±;QèèNЬ9ìN\f\99î\84È\9eãîD\99éN\10íAîN\94\9aî\ 4Õ\1eäîD©éNPíAîN\8c\13R\97AîN\94\9aî\ 4Õ\1eäîD©éNPíAîN\94\9aî\ 4Õ\1eäîĨ³;!u\19äîD©éNPíAîN\94\9aî\ 4Õ\1eäîD¨§î\ 4Ôu\90»\13¥¦;Aµ\a¹;Qjº\13T{\90»\93í`Âu'ô éNÎ\1ed»;Ù~\90\ 3
+\ eßÌîÿ\11Æîd|&ÝÉÃèN~ÿñ¯\7fûñÃñ·ÿðóÇ\1f?þüñò§\12ÜíG\ e{gÐå_º\87\e\7féî\9eö_F?=ñ\83æCç\ fzñ÷ðn·ÿÒøð\8fÒå\83\ªã³¬.\83\eêþoÆ;«\1e?{EíÁ\ruÿ¥ñá\1f\1e?{EíÁ\ruÿ¥ñ\83U\8f\9f½¢öàëêóþKãÛ{§\8eϲº\f\ f7/ÏV=~ö\8aÚ\83\eêþ\8bãG«\1e?{EíÁ×Õ\97ý×ÇwwN\1d\9feu\19ÜPïoî^¬züì\15µ\a7Ôý\17ÈO·R=~ö\8aÚ\83\eêþ\vä{«\1e?{EíÁ×ONöÿ\99\7fRæñ\93(öØ\86·ÿÒx'Á¯\1f½"ÖÜ\ 6¹ÿºøþE\9aÇÏ^A{pC\1dí£R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS*51%ª=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=\881¥BGL\89fÍaL©È\11S"Ys\1cS\1a\94\84.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS*51%ª=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS
\14S\82º\ erL©ÔÄ\94¨ö Ç\94JML\89j\ frL©ÔÄ\94¨ö Æ\94\ 6MLIfÏaL©È\11S"Ys\1cS*31%¢=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS*51%ª=È1¥QgLIê2È1¥R\13S¢Ú\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cS\1a\94¤.\83\1cS*51%ª=\881¥BGL\89fÍaLiÈÄ\94\1cÇ\94ÊLL\89h\ frL©ÔÄ\94¨ö Ç\94JML\89j\ frLiÔ\19S\92º\frL©ÔÄ\94¨ö Ç\94JML\89j\ frL©ÔÄ\94¨ö Ç\94F\9d1%©Ë Ç\94JML\89j\ frL©ÔÄ\94¨ö Ç\94B=Å\94 ®\83\1cS*51%ª=È1¥R\13S¢Ú\83\1cSR\11hbJz\90Ä\94g\ f²{Ù\8a\1fäÛûûý×öÇ\12\17ñz¹½¹ûÚwíÕ\87ý7\ 2¯Æ\94ãCùÌá\89>\7fxÿÃ\1f\7fùüåç\8b\1eèþéæáì嘆7\ fû\7f\1doD\93ûo\83^¾~=\ 2\ f\94\ f\9d?Ðe\98´ÿÖæiwûÚ\83\ªã³¬.\83\eêþoÈ\83D¿~ô\8aYs\eäÓÍ\9dýóüúÑ+dÍm\90Ï7/\87/\1f\94yüì\15´\a_W÷ßÔì\1e¤:>Ëê2¸¡>Ü<\1e¾|Pêñ³WÔ\1eÜPwû\7fæ¬züì\15µ\a_W\9föÿÊ8|ù`ÔñYV\97Á\rõîæùΪÇÏ^Q{pC}¼y<|ù Ôãg¯¨=¸¡\8eÞ[©        ÈQíA\ eÈ\8d:\ 3rR\97A\ eÈ\95\9a\80\1cÕ\1eä\80\©       ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80ܨ3 'u\19ä\80\©       ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80ܨ3 'u\19ä\80\©       ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80\©        ÈQíA
\85\99\80\1cÄ\1eÃ\80\\81# G±æ8 Wf\ 2rD{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\10\ 3r\85\8e\80\1cÍ\9aÃ\80\\91# G²æ8 7æ\fÈ    ]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r¥& Gµ\a\17ê) \au\1dä\80\© ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80\©        ÈQíA\fÈ\r\9a\80\9cÌ\9eÃ\80\\91# G²æ8 Wf\ 2rD{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r£Î\80\9cÔe\90\ 3r¥& Gµ\a9 Wj\ 2rT{\90\ 3r¥& Gµ\a9 7ê\fÈI]\ 69 Wj\ 2rT{\10\ 3r\85\8e\80\1cÍ\9aÃ\80Ü\90   È\89ì9\ eÈ\95\99\80\1cÑ\1eä\80\©        ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80ܨ3 'u\19ä\80\©       ÈQíA\ eÈ\95\9a\80\1cÕ\1eä\80\©        ÈQíA\ eÈ\8d:\ 3rR\97A\ eÈ\95\9a\80\1cÕ\1eä\80\©       ÈQíA\ eÈ\85z
+ÈA]\a9 Wj\ 2rT{\90\ 3r¥& Gµ\a9 ß®£]@N\ f\92\80üìA\9eßm\ 5äÛ\ f²\ 4äw\1c\90¿ìn\1e÷_¹Q?>>rx\9e/\1f>måã»ýw§ß\9cÖ.ÿò<=ß^\8bÇáaò\99³\87ÙLÇ/\9f\1c'²ç¨\eWâ1\eGð|\8c¢qå\1d\9bqôÎÇ°\18\bÆQ¬9ÌÅ\r\99Z\9cÈ\9eÃV\\91#\15G²æ0\14WäèÄ\91¬9¬Ä\r\99H\9cÈ\9eÃD\\91£\10G²æ°\ fWäÈÃ\91¬9\8cÃ\159Úp$k\ eËpC&\f'²ç0\vWä¨Â\91¬9lÂ\159\92p$k\ e\83pE\8e\1e\1cÉ\9aÃ\1aÜ\90\89Á\89ì9LÁ\159Jp$k\ e;pE\8e\f\1cÉ\9aÃ\bÜ\90\89ì9,À\159\ 2p$k\ eóoE\8eú\eÉ\9aÃö[\91#ýF²æ ü\16àè¾\81«)ª¾\95v\8c¾\91;\1fÃä[\81£øF±æ°÷VäȽ\91¬9\8c½\r\99Ö\9bÈ\9eÃÒ[\91#ôF²æ0óV䨼\91¬9l¼\r\99Ä\9bÈ\9eÃÀ[\91£ïF²æ°îVä\88»\91¬9L»\159Ên$k\ e»nC&ë&²ç0êVähº\91¬9,º\159\82n$k\ esnC¦æ&²ç°åVäH¹\91¬9\f¹\159:n$k\ e+nE\8e\88\eÉ\9aÃ\84Û\90\89ì9ì·\159òm$k\8eâm%\1eÛm\ 4ÏǨÜVÞ1ÜFï|\f³m\ 3¦Ú&±ç°ÙVäH¶\91¬9\f\159zm$k\ ekmC&Ö&²ç0ÕVä(µ\91¬9ì´\1592m$k\ e#mE\8eF\eÉ\9aÃBÛ\90        ´\89ì9̳\159êl$k\ eÛlE\8e4\eÉ\9aÃ0Û\90é²\89ì9¬²\159¢l$k\ e\93lE\8e"\eÉ\9aÃ\1e[\91#ÇF²æ0Æ\16äl±\81\æ°ÄVä\b±\91¬9Ì°\159*l$k\ e\elE\8e\ 4\eÉ\9a£\0Û\88£¿&°Æ¨¾VÞ1¾Fï|\fÓk\ 5\8eò\1aÅ\9aÃîÚ\90É®\89ì9\8c®\159\9ak$k\ e\8bkE\8eà\1aÉ\9aÃÜZ\91£¶F²æ°µ6dRk"{\ eCkE\8eÎ\1aÉ\9aÃÊZ\91#²F²æ0±6d
+k"{\ eûjE\8e¼\1aÉ\9aøZ\91£­F²æ°¬Vä\b«\91¬9̪\r\99ª\9aÈ\9eæZ\91#©F²æ0¨Väè©\91¬9¬©\159bj$k\ eSjC¦¤&²ç°£VäȨ\91¬9\8a¨\95xl¨\11<\1f£\82Úx# &¯Æ0\9fVਧQ¬9l§\159Òi$k\ eÃiE\8en\1aÉ\9aÃjÚ\90\89¦\89ì9L¦\159\8ai$k\ e{iE\8e\\1aÉ\9aÃXZ\91£\95F²æ°\946dBi"{\ e3iE\8eJ\1aÉ\9aÃFZ\91#\91F²æ0\90\16äì£\81\æ°\8e\88£\91¬9L£\159Êh$k\ e»hê~E\16MO1>sö\14Ï·\eQôöS쿲|¹y<|_»Ûÿ3qûú/¼½Û\7f+tÿ5d½yy·\9b\1fÞ\7f\8b½;<ÌøÄøÀáYþå7ÿøïßݼýön÷üæ·¿ÿ\8fãoÜï\1fúîð\8c_ÿÇg_¹>\8c_Aûð¿üûÆ\9fÄIÏ\ 3þ?Ø\1c\7f\8dendstream
+endobj
+3303 0 obj <<
+/Type /Page
+/Contents 3304 0 R
+/Resources 3302 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+/Annots [ 3306 0 R 3307 0 R 3308 0 R 3309 0 R 3310 0 R 3311 0 R 3312 0 R 3313 0 R 3314 0 R 3315 0 R 3316 0 R 3317 0 R 3318 0 R 3319 0 R 3320 0 R 3321 0 R 3322 0 R 3323 0 R 3324 0 R 3325 0 R 3326 0 R 3327 0 R 3328 0 R 3329 0 R 3330 0 R 3331 0 R 3332 0 R 3333 0 R 3334 0 R 3335 0 R 3336 0 R 3337 0 R 3338 0 R 3339 0 R 3340 0 R 3341 0 R 3342 0 R 3343 0 R 3344 0 R 3345 0 R 3346 0 R 3347 0 R 3348 0 R 3349 0 R 3350 0 R 3351 0 R 3352 0 R 3353 0 R 3354 0 R 3355 0 R 3356 0 R 3357 0 R 3358 0 R 3359 0 R 3360 0 R 3361 0 R 3362 0 R 3363 0 R 3364 0 R 3365 0 R 3366 0 R 3367 0 R 3368 0 R 3369 0 R 3370 0 R 3371 0 R 3372 0 R 3373 0 R 3374 0 R 3375 0 R 3376 0 R 3377 0 R 3378 0 R 3379 0 R 3380 0 R 3381 0 R 3382 0 R 3383 0 R 3384 0 R 3385 0 R 3386 0 R 3387 0 R 3388 0 R 3389 0 R 3390 0 R 3391 0 R 3392 0 R 3393 0 R 3394 0 R 3395 0 R 3396 0 R 3397 0 R 3398 0 R 3399 0 R 3400 0 R 3401 0 R 3402 0 R 3403 0 R 3404 0 R 3405 0 R 3406 0 R 3407 0 R 3408 0 R 3409 0 R ]
+>> endobj
+3306 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 755.979 296.438 765.329]
+/Subtype /Link
+/A << /S /GoTo /D (4098) >>
+>> endobj
+3307 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 755.979 521.32 765.329]
+/Subtype /Link
+/A << /S /GoTo /D (4098) >>
+>> endobj
+3308 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 743.028 300.134 752.378]
+/Subtype /Link
+/A << /S /GoTo /D (4121) >>
+>> endobj
+3309 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 743.028 521.32 752.378]
+/Subtype /Link
+/A << /S /GoTo /D (4121) >>
+>> endobj
+3310 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 730.076 326.515 739.426]
+/Subtype /Link
+/A << /S /GoTo /D (4148) >>
+>> endobj
+3311 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 730.076 521.32 739.426]
+/Subtype /Link
+/A << /S /GoTo /D (4148) >>
+>> endobj
+3312 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 717.125 387.424 726.475]
+/Subtype /Link
+/A << /S /GoTo /D (4181) >>
+>> endobj
+3313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 717.125 521.32 726.475]
+/Subtype /Link
+/A << /S /GoTo /D (4181) >>
+>> endobj
+3314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 704.173 349.807 713.523]
+/Subtype /Link
+/A << /S /GoTo /D (4183) >>
+>> endobj
+3315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 704.173 521.32 713.523]
+/Subtype /Link
+/A << /S /GoTo /D (4183) >>
+>> endobj
+3316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 691.222 329.861 700.572]
+/Subtype /Link
+/A << /S /GoTo /D (4223) >>
+>> endobj
+3317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 691.222 521.32 700.572]
+/Subtype /Link
+/A << /S /GoTo /D (4223) >>
+>> endobj
+3318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 678.271 321.184 687.62]
+/Subtype /Link
+/A << /S /GoTo /D (4288) >>
+>> endobj
+3319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 678.271 521.32 687.62]
+/Subtype /Link
+/A << /S /GoTo /D (4288) >>
+>> endobj
+3320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 665.319 290.918 674.669]
+/Subtype /Link
+/A << /S /GoTo /D (4332) >>
+>> endobj
+3321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 665.319 521.32 674.669]
+/Subtype /Link
+/A << /S /GoTo /D (4332) >>
+>> endobj
+3322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 652.368 280.946 661.718]
+/Subtype /Link
+/A << /S /GoTo /D (4368) >>
+>> endobj
+3323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 652.368 521.32 661.718]
+/Subtype /Link
+/A << /S /GoTo /D (4368) >>
+>> endobj
+3324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 639.416 286.475 648.766]
+/Subtype /Link
+/A << /S /GoTo /D (4401) >>
+>> endobj
+3325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 639.416 521.32 648.766]
+/Subtype /Link
+/A << /S /GoTo /D (4401) >>
+>> endobj
+3326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 626.465 290.171 635.815]
+/Subtype /Link
+/A << /S /GoTo /D (4424) >>
+>> endobj
+3327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 626.465 521.32 635.815]
+/Subtype /Link
+/A << /S /GoTo /D (4424) >>
+>> endobj
+3328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 613.513 283.157 622.863]
+/Subtype /Link
+/A << /S /GoTo /D (4451) >>
+>> endobj
+3329 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 613.513 521.32 622.863]
+/Subtype /Link
+/A << /S /GoTo /D (4451) >>
+>> endobj
+3330 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 600.562 299.028 609.912]
+/Subtype /Link
+/A << /S /GoTo /D (4488) >>
+>> endobj
+3331 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 600.562 521.32 609.912]
+/Subtype /Link
+/A << /S /GoTo /D (4488) >>
+>> endobj
+3332 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 587.611 316.552 596.96]
+/Subtype /Link
+/A << /S /GoTo /D (4511) >>
+>> endobj
+3333 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 587.611 521.32 596.96]
+/Subtype /Link
+/A << /S /GoTo /D (4511) >>
+>> endobj
+3334 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 574.659 297.374 584.009]
+/Subtype /Link
+/A << /S /GoTo /D (4544) >>
+>> endobj
+3335 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 574.659 521.32 584.009]
+/Subtype /Link
+/A << /S /GoTo /D (4544) >>
+>> endobj
+3336 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 561.708 278.176 571.057]
+/Subtype /Link
+/A << /S /GoTo /D (4567) >>
+>> endobj
+3337 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 561.708 521.32 571.057]
+/Subtype /Link
+/A << /S /GoTo /D (4567) >>
+>> endobj
+3338 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 548.756 395.803 558.106]
+/Subtype /Link
+/A << /S /GoTo /D (4590) >>
+>> endobj
+3339 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 548.756 521.32 558.106]
+/Subtype /Link
+/A << /S /GoTo /D (4590) >>
+>> endobj
+3340 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 535.805 291.018 545.155]
+/Subtype /Link
+/A << /S /GoTo /D (4592) >>
+>> endobj
+3341 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 535.805 521.32 545.155]
+/Subtype /Link
+/A << /S /GoTo /D (4592) >>
+>> endobj
+3342 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 522.853 306.888 532.203]
+/Subtype /Link
+/A << /S /GoTo /D (4632) >>
+>> endobj
+3343 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 522.853 521.32 532.203]
+/Subtype /Link
+/A << /S /GoTo /D (4632) >>
+>> endobj
+3344 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 509.902 312.418 519.252]
+/Subtype /Link
+/A << /S /GoTo /D (4669) >>
+>> endobj
+3345 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 509.902 521.32 519.252]
+/Subtype /Link
+/A << /S /GoTo /D (4669) >>
+>> endobj
+3346 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 496.951 412.221 506.3]
+/Subtype /Link
+/A << /S /GoTo /D (4695) >>
+>> endobj
+3347 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 496.951 521.32 506.3]
+/Subtype /Link
+/A << /S /GoTo /D (4695) >>
+>> endobj
+3348 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 484.861 283.755 493.349]
+/Subtype /Link
+/A << /S /GoTo /D (4697) >>
+>> endobj
+3349 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 484.861 521.32 493.349]
+/Subtype /Link
+/A << /S /GoTo /D (4697) >>
+>> endobj
+3350 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 471.909 271.382 480.397]
+/Subtype /Link
+/A << /S /GoTo /D (4726) >>
+>> endobj
+3351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 471.909 521.32 480.397]
+/Subtype /Link
+/A << /S /GoTo /D (4726) >>
+>> endobj
+3352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 458.958 273.573 467.446]
+/Subtype /Link
+/A << /S /GoTo /D (4750) >>
+>> endobj
+3353 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 458.958 521.32 467.446]
+/Subtype /Link
+/A << /S /GoTo /D (4750) >>
+>> endobj
+3354 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 445.145 293.857 454.495]
+/Subtype /Link
+/A << /S /GoTo /D (4777) >>
+>> endobj
+3355 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 445.145 521.32 454.495]
+/Subtype /Link
+/A << /S /GoTo /D (4777) >>
+>> endobj
+3356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 432.193 292.014 441.543]
+/Subtype /Link
+/A << /S /GoTo /D (4820) >>
+>> endobj
+3357 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 432.193 521.32 441.543]
+/Subtype /Link
+/A << /S /GoTo /D (4820) >>
+>> endobj
+3358 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 419.242 308.432 428.592]
+/Subtype /Link
+/A << /S /GoTo /D (4850) >>
+>> endobj
+3359 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 419.242 521.32 428.592]
+/Subtype /Link
+/A << /S /GoTo /D (4850) >>
+>> endobj
+3360 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 406.29 306.589 415.64]
+/Subtype /Link
+/A << /S /GoTo /D (4893) >>
+>> endobj
+3361 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 406.29 521.32 415.64]
+/Subtype /Link
+/A << /S /GoTo /D (4893) >>
+>> endobj
+3362 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 393.339 287.591 402.689]
+/Subtype /Link
+/A << /S /GoTo /D (4923) >>
+>> endobj
+3363 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 393.339 521.32 402.689]
+/Subtype /Link
+/A << /S /GoTo /D (4923) >>
+>> endobj
+3364 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 381.249 290.4 389.737]
+/Subtype /Link
+/A << /S /GoTo /D (4958) >>
+>> endobj
+3365 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 381.249 521.32 389.737]
+/Subtype /Link
+/A << /S /GoTo /D (4958) >>
+>> endobj
+3366 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 367.436 277.797 376.786]
+/Subtype /Link
+/A << /S /GoTo /D (4984) >>
+>> endobj
+3367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 367.436 521.32 376.786]
+/Subtype /Link
+/A << /S /GoTo /D (4984) >>
+>> endobj
+3368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 354.485 283.625 363.835]
+/Subtype /Link
+/A << /S /GoTo /D (5017) >>
+>> endobj
+3369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 354.485 521.32 363.835]
+/Subtype /Link
+/A << /S /GoTo /D (5017) >>
+>> endobj
+3370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 342.395 258.619 350.883]
+/Subtype /Link
+/A << /S /GoTo /D (5050) >>
+>> endobj
+3371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 342.395 521.32 350.883]
+/Subtype /Link
+/A << /S /GoTo /D (5050) >>
+>> endobj
+3372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 329.444 273.374 337.932]
+/Subtype /Link
+/A << /S /GoTo /D (5081) >>
+>> endobj
+3373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 329.444 521.32 337.932]
+/Subtype /Link
+/A << /S /GoTo /D (5081) >>
+>> endobj
+3374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 315.63 264.079 324.98]
+/Subtype /Link
+/A << /S /GoTo /D (5137) >>
+>> endobj
+3375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 315.63 521.32 324.98]
+/Subtype /Link
+/A << /S /GoTo /D (5137) >>
+>> endobj
+3376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 302.679 258.251 312.029]
+/Subtype /Link
+/A << /S /GoTo /D (5190) >>
+>> endobj
+3377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 302.679 521.32 312.029]
+/Subtype /Link
+/A << /S /GoTo /D (5190) >>
+>> endobj
+3378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 289.728 261.389 299.077]
+/Subtype /Link
+/A << /S /GoTo /D (5233) >>
+>> endobj
+3379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 289.728 521.32 299.077]
+/Subtype /Link
+/A << /S /GoTo /D (5233) >>
+>> endobj
+3380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 276.776 307.077 286.126]
+/Subtype /Link
+/A << /S /GoTo /D (5272) >>
+>> endobj
+3381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 276.776 521.32 286.126]
+/Subtype /Link
+/A << /S /GoTo /D (5272) >>
+>> endobj
+3382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 263.825 279.949 273.175]
+/Subtype /Link
+/A << /S /GoTo /D (5314) >>
+>> endobj
+3383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 263.825 521.32 273.175]
+/Subtype /Link
+/A << /S /GoTo /D (5314) >>
+>> endobj
+3384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 250.873 272.378 260.223]
+/Subtype /Link
+/A << /S /GoTo /D (5340) >>
+>> endobj
+3385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 250.873 521.32 260.223]
+/Subtype /Link
+/A << /S /GoTo /D (5340) >>
+>> endobj
+3386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 237.922 405.128 247.272]
+/Subtype /Link
+/A << /S /GoTo /D (5363) >>
+>> endobj
+3387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 237.922 521.32 247.272]
+/Subtype /Link
+/A << /S /GoTo /D (5363) >>
+>> endobj
+3388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 224.97 250.321 234.32]
+/Subtype /Link
+/A << /S /GoTo /D (5365) >>
+>> endobj
+3389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 224.97 521.32 234.32]
+/Subtype /Link
+/A << /S /GoTo /D (5365) >>
+>> endobj
+3390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 212.019 253.38 221.369]
+/Subtype /Link
+/A << /S /GoTo /D (5388) >>
+>> endobj
+3391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 212.019 521.32 221.369]
+/Subtype /Link
+/A << /S /GoTo /D (5388) >>
+>> endobj
+3392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 199.929 262.675 208.417]
+/Subtype /Link
+/A << /S /GoTo /D (5411) >>
+>> endobj
+3393 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 199.929 521.32 208.417]
+/Subtype /Link
+/A << /S /GoTo /D (5411) >>
+>> endobj
+3394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 186.978 278.366 195.466]
+/Subtype /Link
+/A << /S /GoTo /D (5434) >>
+>> endobj
+3395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 186.978 521.32 195.466]
+/Subtype /Link
+/A << /S /GoTo /D (5434) >>
+>> endobj
+3396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [143.462 173.165 290.529 182.515]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-usage) >>
+>> endobj
+3397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 173.165 521.32 182.515]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-usage) >>
+>> endobj
+3398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 160.213 313.342 169.563]
+/Subtype /Link
+/A << /S /GoTo /D (5459) >>
+>> endobj
+3399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 160.213 521.32 169.563]
+/Subtype /Link
+/A << /S /GoTo /D (5459) >>
+>> endobj
+3400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 147.461 338.169 156.612]
+/Subtype /Link
+/A << /S /GoTo /D (5486) >>
+>> endobj
+3401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 147.461 521.32 156.612]
+/Subtype /Link
+/A << /S /GoTo /D (5486) >>
+>> endobj
+3402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 136.263 307.245 143.66]
+/Subtype /Link
+/A << /S /GoTo /D (5512) >>
+>> endobj
+3403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 136.263 521.32 143.66]
+/Subtype /Link
+/A << /S /GoTo /D (5512) >>
+>> endobj
+3404 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.372 121.359 267.963 130.709]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-utils) >>
+>> endobj
+3405 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 121.359 521.32 130.709]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-utils) >>
+>> endobj
+3406 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 110.36 236.483 117.757]
+/Subtype /Link
+/A << /S /GoTo /D (5730) >>
+>> endobj
+3407 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 110.36 521.32 117.757]
+/Subtype /Link
+/A << /S /GoTo /D (5730) >>
+>> endobj
+3408 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [191.283 97.409 237.22 104.806]
+/Subtype /Link
+/A << /S /GoTo /D (5886) >>
+>> endobj
+3409 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [510.242 97.409 521.32 104.806]
+/Subtype /Link
+/A << /S /GoTo /D (5886) >>
+>> endobj
+3305 0 obj <<
+/D [3303 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3302 0 obj <<
+/Font << /F27 2966 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3464 0 obj <<
+/Length 3606      
+/Filter /FlateDecode
+>>
+stream
+xÚ\95ÜAoÝÆ\15Åñ}>\85\96òÂì#ùøH.Û¢)Z\14íÆ»¶\v#Vl\ 3±\138núõ;òÌ¥tF\9cÿ\9c"\vÛÒÅùÍS¬\11ås¡ñî\92þ\eïÖqXçñn»Lönw?|úîr÷>½çÏß\8deâzÝ\87eÛÓïOÞùz\99Æa\9eî^?\vøÃ\9bï~÷ý4ÝM\97á¶ìwo~\fd]æa\1c¯woÞýóþo\1f\7fýúêõ´­÷?ÿ\98\7fýþÕ¸Ý\7f|ÿ\9f/\ f¿¾ú÷\9b¿~÷§7\872\8eé\bËt·Î·á\92\82Î\ e\12\9f\rå\93¬wû°ßæÇ\83ÔA\8f'\19_\8fC:Áº¥3}þãã!~ÿ÷üç·_~xµÞ\7føøõá\87¯¯Æût²ú`Sʹ]G:Ø8L·ÆÇn\9a×a¿\8c\18z~äáÅ9®éc½\9e\9eã¥ZfY­\ 2\eê<\¯&úm´cJ\\83¼\r\93û:¿\8dvH\89k\90Û°¯»iæÙ\ eª\81çê\92>g®¦ZfY­\ 2\eêuXÆÍTólGÕÀ\86º\ eÓæªy¶£jà¹z»\f\97eõÔ2Ëj\15ØPÓ=9¹j\9eí¨\1aØP\97aÙo¦\9ag;ª\ 66Ôm\98\9ag;ª\ 6\9e«é«Í8/\9eZfY­\ 2\eê\9c®iWͳ\1dU\ 3\ejúú³\9aWp\99í¨\1aØP÷tQ»j\9eí¨\1ax®nSº«gO-³¬V\81\rõ:ì\9b«æÙ\8eª\81\ru\1dÒÓ\92©æÙ\8eª\81çê~\19\96iòÔ2Ëj\15ØPçaÚ]5ÏvT\rl¨é\9d7óI¢ÌvT\rl¨Û°Í®\9ag;ª\ 6\9eªóe\1c¼[8O¢¨a\rï:Ì«   ~\eí\88\12× ×tGï¦\99g;¨\ 66Ô4\7fqÕ<ÛQ5ð\\1d§tG{\8fK1Ëj\15ØP\97tG»j\9eí¨\1aØP·tG\9b\7f\97ÊlGÕÀs5}ëºo¦ZfY­\ 2\eê\9cîhó\13µÌvT\rl¨·tG»j\9eí¨\1aØP÷tG/¦\9ag;ª\ 6\9e«ó\94îhS-³¬V\81\rõ\9aîè«©æÙ\8eª\81\ru\1dn\17Wͳ\1dU\ 3ÏÕë%ÝÕÞ\83K̲Z\ 56Ôy\18¯®\9ag;ª\ 66ÔeØÇÉTólGÕÀ\86º\r·ÍUólGÕÀsu\19\87ëâ=¸Ä,«U`C½\ eÓäªy¶£j`C½\r»ùE=\8fvL\89k\90û°\9awp\1eí\90\12wNÞ¦tM\9b/³Ì2Z\ 56Ô%]Ó®\9ag;ª\ 66Ô-]Óæ³K\99í¨\1ax®®\97tM\9bj\99
+l¨sº¦Íg\972ÛQ5°¡ÞÒ5íªy¶£j`CÝÓ5m~Þ\94Ù\8eª\81çê6¦kÚTË,«U`C½¦kÚ|v)³\1dU\ 3\eê\9a®iWͳ\1dU\ 3ÏÕý\92®ió٥̲Z\ 56Ô)]Ô®\9ag;ª\ 66Ô%ÝÕæ³K\99í¨\1aØP·a\99]5ÏvT\r<U¯\97q\98/Þ³KÌ¢Z\a6ÔëpY]5ÏvT\rl¨·a»\8e¦\9ag;ª\ 66Ô}¸\8d®\9ag;ª\ 6\9e«ã4\98_èÊ(\9b\1a× \97a\LòÛh\87\94¸\ 6¹¦kz7Í<ÛA5ð\}¬Ñ7S-³¬V\81\ruN×´ù¿´ÌvT\rl¨·tM»j\9eí¨\1aØP·tM¯¦\9ag;ª\ 6\9e«ó\98®iS-³¬V\81\rõ\9a®é\9b©æÙ\8eª\81\ruM×´«æÙ\8eª\81çêõ\92®ió\8e(³¬V\81\ruJ×´«æÙ\8eª\81\ruI×ôÕTólGÕÀ\86º¥\8bÚUólGÕÀsu\19Ó]í=»Ä,«U`C\9d\87}rÕ<ÛQ5°¡Þ\86\9bY\8eÅlGÕÀ\86º\ f×\9b«æÙ\8eª\81çêm\1a\1c\8bYV«À\86º\f\97\8b«æÙ\8eª\81\ru\1dÌo\97ËhÇ\94¸sr½\f\8bù¹\9aG\99Ô¸\ 69§kÚ|v)³\1dT\ 3\ejzçêªy¶£j`CÝÒ5m>»\94Ù\8eª\81çê6¦kÚTË,«U`C½¦kÚüë[f;ª\ 66Ô5]Ó®\9ag;ª\ 66Ô4oöc1ÛQ5ð\ݧtM\9bj\99
+l¨Kº¦Íg\972ÛQ5°¡né\9avÕ<ÛQ5ðT].cº¦½û0fQ­\ 3\eê\9c.jWͳ\1dU\ 3\eê-ÝÕ®\9ag;ª\ 66Ô}\98Í\85­\98í¨\1a\8eÓp1\17¶b\96Õ*°¡^\87\8d7Ô/é³¾¹E?.ú\8d½\83ä¡ç\aÙ^\1c$ïãÓ¦üã?\9a­\8f\rGzaûÒÛ¦Oß·_6^¦Ï#y\97~jìÒ\7fzøõ×·ï\1f\1eÿ°Þ\7fÿ\97ïÿ\91ßüñÓ/?=|zøüõí×\8f?\7f\88\98\1e¿á:\ eñò\83\9a¾`5>¨O;\12í×p¬H<½\86ö\86Ä\8b\82\ 4\91\12Çë\11\ e\19Û\11DJ\1cïF\18ä±\1a\ 1¤Æñb\84CÆ^\ 4\91\12Ç[\11\ e\19K\11DJ\1c¯D\18ä±\11\ 1¤Æñ>\84CÆ:\ 4\91\12ÇË\10\ e\19»\10DJ\1coB8d,B\10)q¼\ 6a\90Ç\16\ 4\90\1aÇ;\10\ e\19+\10DJ\1c.@8bÙ\7f ðy\18n?8^Y~ ïy\18¯>\18à±ù\0¢ÆñÞ\83CÆÚ\ 3\91\12ÇK\ f\ e\19;\ fDJ\1co<\18ä±ð\0¤Æñº\83Cƶ\ 3\91\12Ç»\ e\ e\19«\ eDJ\1c/:8dì9\10)q¼å`\90Ç\92\ 3\90\1aÇ+\ e\ e\19\e\ eDJ\1cï78d¬7\10)q¼Ü`\90Çn\ 3\90\1aÇ\9b\r\ e\19\8b\rDJ\1c¯58dl5\10)q¼Óà\90±Ò@¤ÄñBC\9f|Úgh\93U\1co38d,3\10)q¼Êà\90±É@¤Äñ\1e\83\1a\ 3\91\12\87K\f\86\18;\f\0J\18n08^Y` ïy\18¯/8`l/\90(q¼»`\90Çê\ 2\90\1aÇ\8b\v\ e\19{\vDJ\1co-8d,-\10)q¼²à\90±±@¤Äñ¾\82A\1eë
+@j\1c/+8dì*\10)q¼©à\90±¨@¤Äñ\9a\82A\1e[
+@j\1cï(8d¬(\10)q¼ à\90±\9f@¤Äñv\82CÆr\ 2\91\12Ç«       \ 6yl&\0©q¼\97à\90±\96@¤ÄñR\82CÆN\ 2\91\12Ç\e     \ e\19\v     DJ\1c¯#\18ä±\8d\0¤Æñ.\82CÆ*\ 2\91\12\87\8b\b\8e\10\b|\1e\86[\b\86\17K\bàI\18¯ 8`l \90(q¼\7fà\90±~@¤Äñò\81CÆî\ 1\91\12Ç\9b\a\ 6y,\1e\0©q¼và\90±u@¤ÄñÎ\81CÆÊ\ 1\91\12Ç\v\a\ e\19û\ 6DJ\1co\e\18ä±l\0¤Æñª\81CƦ\ 1\91\12Ç{\ 6\ e\19k\ 6DJ\1c/\19ôɧ\1d\836YÅñ\86\81\82\ 1\91\12Çë\ 5\ e\19Û\ 5DJ\1cï\168d¬\16\10)q¼X`\90Ç^\ 1\90\1aÇ[\ 5Ð\7f;K\ 5t\8a²Sðt\8aæJAó\10ÕFÁÔÙ(\18/Ã8uV
+ÊLÞ)\98\e;\ 5ï¾|üíáKì\17¼\1aï\8f\15\83íþ_\97Ëüó\7fóïß\7fyûË\87üÛ\87wï_þxÁy¾<¾²g\a{ùCüömi­\19\1cm8¼°£\ e\7föÂÚ}øË\83@!\8eª\ 6r%n©Ñ\89£ª\81Ü\8a;êQ\8b\93Z\ 5r1n©Ñ\8c£ª\81Ü\8d[j\94ã¨j ×ã\96\1aý8ª\1aÈ\r¹£\1e\159©U \97ä\96\1a-9ª\1a\88\85\96¢\1cM\89êÜ"KW\8e¤Äq[î\98G]Nh\15È\85¹¥Fc\8eª\ 6rgn©Q\9a£ª\81\\9b;êÑ\9b\93Z\ 5rsn©Q\9d£ª\81\\9e[j´ç¨j ÷ç\96\1a\ 5\1aÈ\15º£\1e\1d:©U ·è\96\1a5:ª\1aÈEº¥F\93\8eª\ 6r\97î¨G\99Nj\15Èuº¥F\9f\8eª\ 6r£n©Q©£ª\81\ª[j´ê¨j ÷ê\86úT¬\83Z\arµn©Ñ­£ª\81Ü®[jÔë¨j \17ì\96\1a\r\1a\88\1d»\83FÉN¦ÆaÍn\91¥gGRâ¸i·Ì¨Ú\11Õ@.Û\1dõhÛI­\ 2¹o·Ô(ÜQÕ@®Ü-5:wT5\90[wK\8dÚ\1dU\räâÝQ\8fæ\9dÔ*\90»wK\8dò\1dU\räúÝR£\7fGU\ 3¹\81wÔ£\82
\12ÞR£\85GU\ 3¹\87·Ô(âQÕ@®â-5ºxT5\90ÛxG=êxR«@.ä-5\1ayT5\90;yK\8dR\1eU\räZÞR£\97GU\ 3¹\99wÔ£\9a
+ärÞR£\9dGU\ 3±\9f·ÐRУ)qXÑ;dtôDj\1c·ô\96\195=¢\1aÈE½¥FS\8fª\ 6rWo©QÖ£ª\81\×;êÑ×\93Z\ 5rco©QÙ£ª\81\Ú[j´ö¨j ÷ö\96\1aÅ=ª\1aÈÕ½£\1eÝ=©U ·÷\96\1aõ=ª\1aÈ\ 5¾¥F\83\8fª\ 6r\87o¨O%>¨u ×ø\96\1a=>ª\1aÈM¾¥F\95\8fª\ 6r\99o©Ñ棪\81Üç;êQè\93Z\ 5r¥ß.\9b½N\1f\ fRJýg\aÙ[­~û\1cÿß\ f
+¸íé\8eL\8f\16TëÇL®õ¯¥Ö\97NÿÃÛ/ïþûø\86·_J\93ÿéçw¯Æû\87\9fÊ\ f\fø\9c\7fýúá\ 1\97\ 2Nêæô\85ùÙ!ëW2\rsz²oTüQ\ 5Ó\8b\8c¡ç/²Y\ 5\9f\1c¤]\ 5³ª\81X\ 5{j©\82YÕ@¬\82-5ª`T«@¬\82=µTÁ¬j UÁ\1e\9a«`6%\8eª`\8fÌU0\93\12\87U°eF\15\8ch\15\88U°§\96*\98U\rÄ*ØSK\15̪\ 6b\15l©Q\ 5£Z\ 5b\15ì©¥
+fU\ 3±
+öÔR\ 5³ª\81X\ 5{j©\82YÕ@¬\82-5ª`T«@¬\82=µTÁ¬j VÁ\9eZª`V5\10«`K\8d*\18Õ*\10«`O-U0«\1a\88U°§\96*\98U\rÄ*ØSK\15̪\ 6b\15ì¨G\15Lj\1d\88U°§\96*\98U\rÄ*ØSK\15̪\ 6b\15ì©¥
+fU\ 3©
+¶ÐR\ 5£©qT\ 5{d®\82\99\94\82=³TÁ\8cj VÁ\96\1aU0ªU VÁ\9eZª`V5\10«`O-U0«\1a\88U°§\96*\98U\rÄ*ØR£
+Fµ
+Ä*ØSK\15̪\ 6b\15ì©¥
+fU\ 3±
+¶Ô¨\82\ 2±
+öÔR\ 5³ª\81X\ 5{j©\82YÕ@¬\82=µTÁ¬j VÁ\96\1aU0ªU VÁ\9eZª`V5\10«`O-U0«\1a\88U°§\96*\98U\rÄ*ØR£
+Fµ
+Ä*ØSK\15̪\ 6R\15졹
+fSâ¨
+¶ÈR\ 5#©qX\ 5{f©\82\19Õ@¬\82=µTÁ¬j VÁ\9eZª`V5\10«`K\8d*\18Õ*\10«`O-U0«\1a\88U°§\96*\98U\rÄ*ØSK\15̪\ 6b\15l©Q\ 5£Z\ 5b\15ì©¥
+fU\ 3±
+öÔR\ 5³ª\81X\ 5;êQ\ 5\93Z\ab\15ì©¥
+fU\ 3±
+öÔR\ 5³ª\81X\ 5{j©\82YÕ@¬\82-5ª`T«@¬\82¡\94´ª`>H\1ez~\90V\15\fçHOâû°|ûW\825=\1f\9dϬé{ÉÇÇ«é:ì\97§ã¤dù¸lé\reäñ4¿}l\1cç)&¤ÿ\ 1Ï\1a\8aeendstream
+endobj
+3463 0 obj <<
+/Type /Page
+/Contents 3464 0 R
+/Resources 3462 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 2959 0 R
+/Annots [ 3466 0 R 3467 0 R 3468 0 R 3469 0 R 3470 0 R 3471 0 R 3472 0 R 3473 0 R ]
+>> endobj
+3466 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 735.917 236.641 743.314]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_arch1) >>
+>> endobj
+3467 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 735.917 521.32 743.314]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_arch1) >>
+>> endobj
+3468 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 721.013 323.275 730.363]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canqueue1) >>
+>> endobj
+3469 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 721.013 521.32 730.363]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canqueue1) >>
+>> endobj
+3470 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 708.061 330.08 717.411]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canends1) >>
+>> endobj
+3471 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 708.061 521.32 717.411]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canends1) >>
+>> endobj
+3472 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 697.063 340.79 704.46]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canhardware1) >>
+>> endobj
+3473 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [515.781 697.063 521.32 704.46]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canhardware1) >>
+>> endobj
+3465 0 obj <<
+/D [3463 0 R /XYZ 71.731 802.878 null]
+>> endobj
+14 0 obj <<
+/D [3463 0 R /XYZ 227.805 753.114 null]
+>> endobj
+3462 0 obj <<
+/Font << /F22 2958 0 R /F27 2966 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3480 0 obj <<
+/Length 725       
+/Filter /FlateDecode
+>>
+stream
+xÚmTKOã0\10¾÷Wä\98H\8d\e;     I\8eP±+XÔ"èeµ»B&q¨\17ç!Ç\85åßïØã\96\ 2\95\ f\1eÏë\eÏ\8b\ 6   \1c\1a\14\94\14)\rÊ\84\91²(\83º\9b\13H¾Ï¨×Ȳ\8aäe\ 5ô  a\9c3JR\16ÄG\ e.6³Å7Æ\ 2\96\90³¼
+6í\1e¤ÈSBi\16l\9a_á­\16-¯Eôgs\rÊEP\91ê,µºYAJ\ 6\8eYJò´tº7²_F´\fÏWQ\9c\964\94\13Þ\1c/\10ïþ!ù,t/\14ÒÝÐì\94@Úl¹ñ¶Ý¨D\17ÑPôæØ\r\v\ 1¢:@4Z¾\b\8dtÍGþ¸÷4´x¿\ eúYöO6~HDL\19©ræ¢}\95f\eÅ,ÏÃn§\8c\1c­%Ë3p£\9b)by8G©x\11=Rï\16\8dl[¡!4|ÖQ\11nå8¡\ 3Þ7ȾZ{ÿÂl\aôI\90\9d\89·\1e:ûÑ]/knäàÁ\86ÇøCÐÔ\ 5ýWÔ\16³*!L«X\15á£@\ 6¯k1M¢ÁW«\87\ e)çûðA«8\8eÊCMÞ×Ð×;\rÿ\ 1U£Þ"ê#\ 5Ñ\95\87\9bvã8hã\rî6\11M\92\ 1\ 3[Õ9²\19\13\99f$\ 3\854õ©±\ 4#g\96H}N-«Ý)\80v$\16\1fÒ+¼ú$\14||\8e&ã \94÷×òé­¯mÏyÆúaµ^]ܬ\97?¼ò\ 1qýpÿsµ<\91ÒIt¼7²¶]VìC,Rì
+³Õ\827.\f\90Yzñª¥\11øv\1d'\9546\rb_`+±i³·m?ïØÿ\14\15\ba+oëí,à·êDòdÉrVØ\ 4gUx»µH
+[\rÞ%«Y\92x!ö]V\82Ö\91Êýµ\eI(W\82\8cßI\9e¸²ás2`\a-ÿÙG\94\16¡Pò0ÐV
+£*À\9câëHäZèT¿\1a\rÅ\12ú\90\9a*ÅÔÀí¶CÅÂ\91kÏq3\v7Çk\12\9fø\1e\a\86)\1fílZ\99\16\8ac»T.¯ãÐûÍ\ 1ï\ 6fX\81n\83\88ܳ? \7f\8d}½¼¼;\87ß\15v\9ax'l-\89Õ\9b]n\ e\8bÕ¯L\96\91*)Nn^¯\11¿«¸Å\vËø°KsZ\92$I÷^\Ù?\ 3ù\ 5þ\15è?c$\94àendstream
+endobj
+3479 0 obj <<
+/Type /Page
+/Contents 3480 0 R
+/Resources 3478 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+>> endobj
+3080 0 obj <<
+/D [3479 0 R /XYZ 71.731 768.009 null]
+>> endobj
+18 0 obj <<
+/D [3479 0 R /XYZ 153.993 753.114 null]
+>> endobj
+3481 0 obj <<
+/D [3479 0 R /XYZ 71.731 742.279 null]
+>> endobj
+3478 0 obj <<
+/Font << /F22 2958 0 R /F27 2966 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3485 0 obj <<
+/Length 2041      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YÝsÛ6\f\7fï_áGùn¦Eê{onÚmÙ\9a6\97xÛö\aE¦c­úð$9nö°¿}\0AJ²%ÅÙ­×ë\99\ 4A\0ü\ 1 @\85ÏløÇg\ 1g\81Ãg¡-X\18\84³$\7f\1eaåû7\s¸nļ0\82ñÈâÂ\13\9c9b¶è   x»~³üN\88\99°\99ïE³õÖ(        <\87qîÎÖ\9b߬«]¼od5_\880°8£ß\ fiqø²¼[Ϲð¬\85\9aÑÂÕê#\rÞ͹U¥O°ñ\8fõ\8f`ÁBø,ô|%òwÛ³a\ fðÂ\88#\ 3\98\11Ì"\16ù\ e\ 6,\14`²p\98çDjËz'ç\v'
\ f× øãÕ\9c\87\16ªBRZão`Å\85\9eçûLæ²hâ&-\vZ+·´Ö´rÈf\Ûȧ4Ñä\rÙ¬èõa¿/«&-\1ei-/+I+F½>\1a\17,ò¸²3)\8b¦*³LÉð\85\95Ì\ 3k\97îÑBß\ 1\v7DÎãâ\99HÝI\80\9c\16\80ô6VÆÀÚC\19W\9bz\ e\103Z¿n´ Á\11aq\17ëŬT\16#)­\9b²z>±S(;ã¬\92ñæYù\ f}
+b\ 1û?]½¿\ 3\90W4\ 38j¥\ 3y\10F$6Ä+Z¼p\1coÀXµ\È#\91¶2n\ e\95Tgø\86H\88\10`_\1ej\9aËb\17\17\89:L=\ 2(Aæ¸V%S0êüÜ° \ë8VÝT\87\ 4µõÉ®ÕÀ®\9d¦ik¹m+D\81rSÖ\rm\aHÁÙqÑÐ\82²\1ccXoUA\86âv±Þ°9  ï\1e¶:n`\83ë@Ô\1c²&\ 5«q\16Yå^\16DGû\14¥\90DHÊ<?\14\8f¦x\1eþ\94IC|̵۪D\15\87HÓA\8cD\85\13Òä\93Ñ\80é        ']\8c j26\88¬x¿Ï´ÒZSP\14\ e\9a\1d\ 6\89 @¤P\8cÀ\0¼Ç­øQÏTX\84v\8b5\8e\ 5 XR-¼I\1fwMöL\93¤<\02F[i´j©OiÕ\1câlÄü.i¸c­n¯qà\9ed\ fÐ\ 1Ï=\80«\1c
+Óã.UÉH¼»t#kZhS\9e\1ci=\ 3\18\9d\89E3\91\83n\12 ô\0\1c   \86}U>Vq\9eC\16\11\8e\89\19\ f\98à\1e^w\vsß9~»\8d³ÞUÛ^ª÷\87<\8f)\9fI\86Ë\1c×G\19 Ô\81{ÝsÚÝfÿé\9e\91[\96\87̧Köc\9c+è)8ñWû"ì\81 rÞ¼_·u\85s(:`´g\87Êø\91Ò#Xà\9fU¥ó߶Jq! Ja¹êäQ\99êYÎ\9d\88¹AÐê<\89è°\8b\ e\9c¼kc0¤ºsý\11\ 2\98ò\ 3zA¸ðà×aAHA¶:4»²\9a\eÚð\e~µóöäM\9e×ð u·s\a*\1e$¸¥\ 2\15\8fw\9bÖq\e\81.ó9!³ª\8aø°!\96_ç¾mɺ\91Å\83¬\1eG\98×sϳÊ<®ÿ¦\r7eó\9cÉcý9=ÅI\84Ì\89¨A¸\89!Cà¿\9cÆ
+üä\88¯\88U'o\1a+Ís   «1ÏcÊõcè\1ao\80B64\83rVªÊ\90ÈzêÄN\0R\1dï«\9d¸'oòÄ\86\aO°k\9aý·Ëåñx¤
+_&²\8aY  .WGø\84)ðþnE3¸¢¨ÌàdW\9a;`\8f×{?B\9c¾hÀ\0\0Ø\82H\89P1\80\87Òj)YõRi\ 4An ú  TåúÖ½Úõ\9d
+²JU\ f vú\81YiE\81´F\ 5\a\ 6$d¤\14üroÜ\92Á\1düÔ\1aßìô\15VÒï\al\1fNýºéÝ\rt\9e\9a&iM×¥+:\98OóD\1doÙÞ\8a5\ eóe\12\17\92¥\ 5\8c\867.\8f8\13¡\ 3¢P\ 43ñGľt\8dq\92ï\15\14[\99}fÉÓ¡aÉß(ÿ\9f=D/*#k³2\89uX7\90Ûª_UÇK+\80Õô\7fc©{\a\9d¯<N'.ÔqÆ]þÕ¸'o2\8c\rOÛõ\v\ 1Q\81\91\ 5ÆR×\b\84ÖuÂ7\1dª^\81ãH¢#\18ª¹\0êÃ3ѨwBÊ¡nK²ZiuÅ\89ê:ú¢iA5ØH}\90r¬Ô\e}NèZªI\f¡½_ÿL\ 44\0\7fÁ\0<
+Mtfàp\83\r\at\87\95é\95q·Ùô3´\85ô°¨i\81ºâ\9eØ·\90S¶µzGËßç\ f?|3\92,]\ f\84ñ\ 1\b\98\v@.>u÷\ 1Ä\15·tÁH\ eU¥Z(\9cth\8cµ\býlJ\8bv1­Ú[f\ 3ý9\88>k\84N2¬ß¢bg\8e\1d\fu\97\81Ö\ 4\83D=\8b\88f|\1cúÖ1U9\ fT¸   ¤ÙÝ\19=&\8a\8cþv\90\0&\18áÕê\aîè\83Úð,zL&ª\ 3\16\ 5'A­YÔëW\bo Ï\85\1eÕ7\9dUzÏ\98þ.«\0À=Ñ\7f{Åm\97|²Ú<Á\83GöbâöêÆ\ 1\17ù¡­\9dz0W\8bb\8a\8bÂTPõ8Õ¡ ½-\98\96k^\1e½¦L\16ñ\ 3<\82ÚÀú\8c\155\9bÄ\1d\ 2ÁöÅ\ 5Ü;¦IÜ5ËEÜ\87ú^\81ûPÿ\0÷\9eþÛô§»O¦£¸×¹\96\9c\81\18 \88L¿À\10QßT¯\16IB®\9e\82\8eG\ 1\97\91ëx¦\80Ó\1c\97p\e\fÛPù9j=åo·ñ;ÝÈ_ßÜ\98\18\1d`\87¥ýµ1øª\0ä!¼¦\9cð\ 2\8c\1dÓ$\8e\9aå"\90C}¯@r¨\7f\0eOÿO¿Ì\ 3×ZÝ¿¿Ó7r\ 2ÏÖbñ×Y\12\ 3\96\93Qg
\7f\16tl\9c_ÂÝ\ f\19Àt\ 1÷\8ei\12wÍr\11÷¡¾Wà>Ô?À½§ß|Ç8¿6ÛÚu\1aÁq¦YëgXÏuK\1aëߣÌè\8bÈBD,\fCÝÏQo~O_\9e\8cÐL½y\9e±§\98hðàq\0fþÏþ\8e\a\8c{~ÛÀ¾ì:n3ß~9e4ËE×u¢þ\83ë\86ú\a®ëéÿ!}Ü-ô· å\ 5õ\88\8cÓL\15³áãÈĽï´_\95qÜû\84¤>\94\9eHQ\1cð\90¢A]n\e\1aU2Î\16M\9ak\8e\9eè²P\1fÐÌ\a\1f_^ZD\9e~\91\9bE^näH\vx\92¡Ë^\9eví[ ¾ö¤YûIk,Q=\87\85<zÙÙ\1dÏ\94¯5Ç%W\ f\95]öôPù¹£{Ê?\94Ç\17ÝÜ7Jÿ\8dD¸,\ 2=c\0h\8eEÇ¢Lpz½®Ç=õ¹A³¨\8f\8aô_l\86\8aþ\ 5±á\³endstream
+endobj
+3484 0 obj <<
+/Type /Page
+/Contents 3485 0 R
+/Resources 3483 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+>> endobj
+3081 0 obj <<
+/D [3484 0 R /XYZ 71.731 768.009 null]
+>> endobj
+22 0 obj <<
+/D [3484 0 R /XYZ 173.473 726.258 null]
+>> endobj
+3486 0 obj <<
+/D [3484 0 R /XYZ 71.731 713.254 null]
+>> endobj
+3082 0 obj <<
+/D [3484 0 R /XYZ 71.731 609.992 null]
+>> endobj
+26 0 obj <<
+/D [3484 0 R /XYZ 268.743 575.107 null]
+>> endobj
+3083 0 obj <<
+/D [3484 0 R /XYZ 71.731 571.414 null]
+>> endobj
+30 0 obj <<
+/D [3484 0 R /XYZ 184.52 542.254 null]
+>> endobj
+3487 0 obj <<
+/D [3484 0 R /XYZ 71.731 539.177 null]
+>> endobj
+3488 0 obj <<
+/D [3484 0 R /XYZ 71.731 533.438 null]
+>> endobj
+3489 0 obj <<
+/D [3484 0 R /XYZ 71.731 521.497 null]
+>> endobj
+3490 0 obj <<
+/D [3484 0 R /XYZ 139.477 508.952 null]
+>> endobj
+3491 0 obj <<
+/D [3484 0 R /XYZ 71.731 506.917 null]
+>> endobj
+3492 0 obj <<
+/D [3484 0 R /XYZ 71.731 495.056 null]
+>> endobj
+3493 0 obj <<
+/D [3484 0 R /XYZ 139.477 480.558 null]
+>> endobj
+3494 0 obj <<
+/D [3484 0 R /XYZ 139.477 480.558 null]
+>> endobj
+3495 0 obj <<
+/D [3484 0 R /XYZ 71.731 478.783 null]
+>> endobj
+3496 0 obj <<
+/D [3484 0 R /XYZ 71.731 478.783 null]
+>> endobj
+3497 0 obj <<
+/D [3484 0 R /XYZ 71.731 462.218 null]
+>> endobj
+3498 0 obj <<
+/D [3484 0 R /XYZ 71.731 462.218 null]
+>> endobj
+3499 0 obj <<
+/D [3484 0 R /XYZ 71.731 435.892 null]
+>> endobj
+3500 0 obj <<
+/D [3484 0 R /XYZ 71.731 422.826 null]
+>> endobj
+3501 0 obj <<
+/D [3484 0 R /XYZ 139.477 408.328 null]
+>> endobj
+3502 0 obj <<
+/D [3484 0 R /XYZ 139.477 408.328 null]
+>> endobj
+3503 0 obj <<
+/D [3484 0 R /XYZ 71.731 407.384 null]
+>> endobj
+3504 0 obj <<
+/D [3484 0 R /XYZ 71.731 394.432 null]
+>> endobj
+3505 0 obj <<
+/D [3484 0 R /XYZ 139.477 379.935 null]
+>> endobj
+3506 0 obj <<
+/D [3484 0 R /XYZ 139.477 379.935 null]
+>> endobj
+3507 0 obj <<
+/D [3484 0 R /XYZ 71.731 376.207 null]
+>> endobj
+3508 0 obj <<
+/D [3484 0 R /XYZ 71.731 376.207 null]
+>> endobj
+3509 0 obj <<
+/D [3484 0 R /XYZ 71.731 348.643 null]
+>> endobj
+3510 0 obj <<
+/D [3484 0 R /XYZ 71.731 348.643 null]
+>> endobj
+3511 0 obj <<
+/D [3484 0 R /XYZ 71.731 348.643 null]
+>> endobj
+3514 0 obj <<
+/D [3484 0 R /XYZ 71.731 334.534 null]
+>> endobj
+3515 0 obj <<
+/D [3484 0 R /XYZ 71.731 334.534 null]
+>> endobj
+3516 0 obj <<
+/D [3484 0 R /XYZ 71.731 307.704 null]
+>> endobj
+3517 0 obj <<
+/D [3484 0 R /XYZ 71.731 294.639 null]
+>> endobj
+3518 0 obj <<
+/D [3484 0 R /XYZ 139.477 280.141 null]
+>> endobj
+3519 0 obj <<
+/D [3484 0 R /XYZ 71.731 252.171 null]
+>> endobj
+3520 0 obj <<
+/D [3484 0 R /XYZ 71.731 252.171 null]
+>> endobj
+3521 0 obj <<
+/D [3484 0 R /XYZ 71.731 241.167 null]
+>> endobj
+3522 0 obj <<
+/D [3484 0 R /XYZ 149.44 226.674 null]
+>> endobj
+3523 0 obj <<
+/D [3484 0 R /XYZ 71.731 226.56 null]
+>> endobj
+3524 0 obj <<
+/D [3484 0 R /XYZ 149.44 212.062 null]
+>> endobj
+3525 0 obj <<
+/D [3484 0 R /XYZ 71.731 211.948 null]
+>> endobj
+3526 0 obj <<
+/D [3484 0 R /XYZ 149.44 197.45 null]
+>> endobj
+3527 0 obj <<
+/D [3484 0 R /XYZ 71.731 197.335 null]
+>> endobj
+3528 0 obj <<
+/D [3484 0 R /XYZ 149.44 182.838 null]
+>> endobj
+3529 0 obj <<
+/D [3484 0 R /XYZ 71.731 180.77 null]
+>> endobj
+3530 0 obj <<
+/D [3484 0 R /XYZ 149.44 168.225 null]
+>> endobj
+3531 0 obj <<
+/D [3484 0 R /XYZ 71.731 152.783 null]
+>> endobj
+3532 0 obj <<
+/D [3484 0 R /XYZ 71.731 137.765 null]
+>> endobj
+3533 0 obj <<
+/D [3484 0 R /XYZ 142.246 125.22 null]
+>> endobj
+3534 0 obj <<
+/D [3484 0 R /XYZ 71.731 125.22 null]
+>> endobj
+3535 0 obj <<
+/D [3484 0 R /XYZ 149.44 110.608 null]
+>> endobj
+3536 0 obj <<
+/D [3484 0 R /XYZ 71.731 106.88 null]
+>> endobj
+3537 0 obj <<
+/D [3484 0 R /XYZ 145.016 68.432 null]
+>> endobj
+3538 0 obj <<
+/D [3484 0 R /XYZ 149.44 53.819 null]
+>> endobj
+3483 0 obj <<
+/Font << /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F32 3079 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3541 0 obj <<
+/Length 2368      
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZÝsÛ8\ e\7fï_áGg¦fDêû1MÛ\1d߶Û^\93éìÌv\1f\14\99\8eu+K>}$é\7f\7f\0AJ´iE\9e¹\8e\1fD\82 \ 1ü\b\12$h¾ðàÇ\171g±Ï\17\89'X\12'\8b|ÿÆ[<BËoo¸æXi\96\95ÅóîþÍõG_,R\96Fþâ~»\10\82 \82q"\16Dáâ~ó×òv\97\1d:Ù\­D\9c,9£ï§¢ê_®¿Ý_qÏ[® vÅ\97ý\vµÝÞüA\85÷Mñd:þðB\ fØ \rJüêïû\7f½ùp?(\17
+Î@\8f×Ô×,\8eú"\1eÕçA
+ê/â0a\1eX\81Ú[*¢~~"\96\eùTä\92ÊEKß\ 6ô\97\8fE\v\86Ê\r\91êªüI¥mÝPa_¼ÈÍj_otï£Á¯\a\11|¹Ñ\96#S^ïWh/\98±â\82¥!W\8a\1d\8a\8aº\ 2@}Á\97÷;\1cS\88±+\10÷²m³GÙRK×dU»/:P\15ú\11-«6TP\ 6ä²8tC[ÓW-\8dShÊ.k6DidV®ºb/\8f4\13J³n\a­\9b\96æ\r»â·íó«x¹£J\9eµò\8a'K¦z¯DÊ\92$Y¬\ 2\9fy\1e9Í÷«8\ʦEeNæ\9aó\94\85 *\8a\ 3\16\8aèÜd\v\16G)\94¬¦Óïà\17\\bð\v(Xã¹\8eá\83cÄñ \13U,\8b*Ϫ\95Ç|²\ 2ÔJE\b_\9fÅ        !q×e]ßN\1a\10D\8c\83Kþ2\ 3Æñ¦\rÐ<¨Ý;ÙegT'÷z/\ f²ÚÈ*/ä´\ 1<\86-!ùu\ 6\8cãM\e yPGåóèO\ek£hä\7fû¢\91ÚýnÑÍh?\89Á\17ayn³\÷Bo~Æö¬Ñ\14µP±\90å9,\1d*wµ\198+\9dA\93å\ 3\88´+ãB\bXÄ     `³\7f\ 5\1cVqVaÁ_>Húö°àZÜ+°"\9f¤n~ÆÕÙíê¾£ú±\928R±¥\96\8cªOEÓõ¨\99\1a¼V+T±µDÊëê\87ç\89Ç\1e6&FM÷»¢=³£´²ë\ fzÕjÛûVnûò\ 4\9cN¶j\ f©\1e©^oÍR\ax\9fëæ\1f§¥îvfz\8e°\83­íPW²ê\0Âð,\84zODæ\7fdSÉR+¶mê=\95\ 4\13\f´yykª\ 1Ó\1dÔÞF´ÈÐZÙ\14Æ7ÆiïKܪi\9b:\1cê¦C¨le|Ëß\92ðhßFÙD}Òû\95ªøL`!X*Ô\80ðåö÷\e·û\vqÉ*{(Ñ\e°½ý  qdO\rj&\80¦ÝZsÐ\@³Ú\91Ý©\1c·g3\8dãv{\f0ÙÄcG) \8d\ 6AÅZW\ e7\f{ý1°Î\ 1<\89\99\10 
+Eì³²¬sb²\97´\1f²$\8a4Ó[\1a÷yW\988\ 1µBK;dMG%åQð5h\9eS\ 5\ 2\8a\80H\92DGQi4Æv\rµ,Õ26[Iý\8cg\91²Î6rsâøu¹1n|\8a\16\90´\0í\\93Xû Í\a\14Re\ e\12¾Ó² ÊÍ×5\15Êâ¡É\9a\9f\93F
+\1eú\búAPïè \91\9aã\ 5:w¶/Õ¾\85µìp(\8b<Óñ\1c\b\17\1dé\88\84\ayî`Ñ=KY¹û*¬j\13Ó5zñhò°z\87P"\12æ§\ 1EA³¦¦¶]<Ûµõ\15\9eW\88PÕݸÕÈ͹\13\9f\89A\ 1\1cÙÐ\8bþ¿\18\ 4A\85\87Ñ0YçÎ\8f&\0Á)%d"\fì(\15³4¶\83\94aAë\7f\b\11\a\ 1ó½\91ï¢(©û\9c\93\7fz\80µåßl\9e\98­Ó××Û\15÷\ 2\f¸ûQâé\19ïM\90S\1d²
+¶\½@j½Õ\1c\19b\f\16\1e\8b\829àF¦Ià4Ë,p®¼\v\80så;ÀYò¿\16¿\7fû¢\ 3ÕúîÆì\17¯\80\0\97\1eO¤3 \8cL\93 h\96Y\10\y\17\80àÊw@°ä¿Ûfïõelýù³ñ\99y,ü\94³\80ǯca1MaaXæ°8#o\1e\8b3òO±°åÿ\ e\97\92`ys÷á\9bÁa\8d\17\80\7fãî÷v\80\86/\15õý\95\1f\8fTEº\9b\ 4+\8eX\ 2\17\9f×Á\1a\99&ÁÒ,³`¹ò.\0Ë\95ï\80eÉwÁ:\8b\95\v\15!uJù8\89]$\18\19ìF¦Iì4Ë,v®¼\v°så;ØYò?\7fýD¶ßü¦1X\7f\rß\ eÅè-E_(Æ#5\99D(\88Y\98Ì\04ðLâC\1c³ð8Â.@Ç\11î\803
+ÿãníF1}í±ï\17|\89­S\90øpÜ\89æ0\19\99&AÑ,³¨¸ò.\80Å\95ïàbÉ¿­!ÊÃu\8aN\8c
+
+ 45Ý\98â\19¼^\ 3\8bÃQ.\8c\1a\99&ÁÒ,³`¹ò.\0Ë\95ï\80eÉ¿irs\7fÔ(Qå\8en^p3\7fÕÉnÖ\9f\81l\m
+7Ïgq\10Ìà62Mâ¦Yfqså]\80\9b+ßÁÍ\92¿þóÏ\e´úþäXda\ 3\90­\ 1\9fÂE$éTÚkÄÅb\9aÂÅ°ÌárFÞ<.gä\9fâbË¿ûpûåU\8fÁSvàG\93\98`^\91Ï\1c\1d-¦IL4Ë,&®¼\v0qå;\98Xòß\8dÖë¬\8a¹Óí\ fe\86\19$}Ûkë¾ÉMRf¸lÿ\94\9a¿¯ÚW.\90S\80\86 \9a7sþ´\98&\ 1Õ,³\80ºò.\0Ô\95ï\0jÉÿ\8e6\9blßÑ\95lL¡«k7\9d"¾ÉRb\9e\9dîuY'§®Ð\82\83ÿ²4®5Þd\1a×ð ¢\1f¯Âp)\1f\9a~\88\£p\ 4}\ 5ÞÍ\ 5\ f±ó*\8aa'\82\9f\f9\15\8eé?0;^Òë\10\95\87\97#,Ë6oô»Æ0&Ì\0>ðl1÷\ 1A4        ýa4®Ç[c\Øô¹ÕÑ2\ 4N$       \1aËC\96Ø\99´(T\8a\fYN¨oðmEë\ 3U\95Ô\82ogø1×\84Ù?ªíA¦)o¡cÝ\9c°\9b\94\13\14)%Je+s\86B0\88\1dJ¹WÉUE²ÂÕÉ\83\8dNó`B\v_\93¼Dgª¼x|MòT¶vßW\98RR/JÐJ¯GªÉ\1c5\90\W\92ȵ\e\0\8cÕ«\94M«     h@qР   uEú\90\91Un\9eJ3_\8fCbÖ{Lñû:    \8eßF\1e\1aÙ\ 2\16\12`A\9d¹¯òúئ\80ÅBv8`æOçÌtÏL\7fÉ&,4ôÕ6AéH\ 1ýä¦y\1fVgàþ\8fÌÕ\9c¤\9e~g(hò\93TIC:%_\9a\87S Ð££Î´)
\e\ er¤·\1e Ó\85ú u©3ü'\83\83Xó¢©F«Î%\941cy&Ë«·\a\9drÞ¸ËDø,å\9aãÚ\1d\ 1ö\97X·>7E'Ï$\89A\87Ø$\89MbÜçha©ü\r\8a\94\0\85\82å]©ýø  Múñ³¥\1c0RL§FæÒ¼z"㮩ûÇ\9d©¨0¥¶Ø8a\81z$³\°®*\98LÊÊ{ãÜc¥~ÀyfTÑ/\a\1ef²³½ì\94Ç+®-};Ãpf\f\8cBáÁpÖ\9b\ 2_v\8cô\87\9fãP\ eÐÇ\1e¸þr{ÿé\fÖ¾z¼?Á:\8c\15Ö\8c\8a´3 \r¼¨¬[õÖ\83u\95Ê\ e\13½\9c4ÃèfH\19\1eÎC|NPÑ©5µá\10\80Uõ`\90Q\82\eª`ÙIèÒÿE\10Ád\907ÿV\18\9f\15L\88?\1e\ 3MV\8f
\1c\19×\ f¹'\b\9f\ e\ 1\ 4q/ÔX\89\89ÿ#¸úý\ fÿ)ã\15endstream
+endobj
+3540 0 obj <<
+/Type /Page
+/Contents 3541 0 R
+/Resources 3539 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+>> endobj
+3542 0 obj <<
+/D [3540 0 R /XYZ 71.731 768.009 null]
+>> endobj
+3543 0 obj <<
+/D [3540 0 R /XYZ 71.731 702.089 null]
+>> endobj
+3544 0 obj <<
+/D [3540 0 R /XYZ 71.731 689.023 null]
+>> endobj
+3545 0 obj <<
+/D [3540 0 R /XYZ 139.477 674.526 null]
+>> endobj
+3546 0 obj <<
+/D [3540 0 R /XYZ 71.731 673.581 null]
+>> endobj
+3547 0 obj <<
+/D [3540 0 R /XYZ 71.731 660.63 null]
+>> endobj
+3548 0 obj <<
+/D [3540 0 R /XYZ 139.477 646.132 null]
+>> endobj
+3549 0 obj <<
+/D [3540 0 R /XYZ 71.731 645.188 null]
+>> endobj
+3550 0 obj <<
+/D [3540 0 R /XYZ 71.731 630.284 null]
+>> endobj
+3551 0 obj <<
+/D [3540 0 R /XYZ 139.477 617.738 null]
+>> endobj
+3552 0 obj <<
+/D [3540 0 R /XYZ 71.731 614.011 null]
+>> endobj
+3553 0 obj <<
+/D [3540 0 R /XYZ 71.731 586.447 null]
+>> endobj
+3554 0 obj <<
+/D [3540 0 R /XYZ 71.731 571.835 null]
+>> endobj
+3555 0 obj <<
+/D [3540 0 R /XYZ 71.731 546.224 null]
+>> endobj
+3556 0 obj <<
+/D [3540 0 R /XYZ 326.697 533.387 null]
+>> endobj
+3557 0 obj <<
+/D [3540 0 R /XYZ 71.731 518.66 null]
+>> endobj
+3558 0 obj <<
+/D [3540 0 R /XYZ 71.731 477.43 null]
+>> endobj
+3559 0 obj <<
+/D [3540 0 R /XYZ 71.731 462.411 null]
+>> endobj
+3560 0 obj <<
+/D [3540 0 R /XYZ 142.246 449.866 null]
+>> endobj
+3561 0 obj <<
+/D [3540 0 R /XYZ 71.731 449.866 null]
+>> endobj
+3562 0 obj <<
+/D [3540 0 R /XYZ 149.44 435.254 null]
+>> endobj
+3563 0 obj <<
+/D [3540 0 R /XYZ 71.731 435.139 null]
+>> endobj
+3564 0 obj <<
+/D [3540 0 R /XYZ 149.44 420.642 null]
+>> endobj
+3565 0 obj <<
+/D [3540 0 R /XYZ 71.731 420.527 null]
+>> endobj
+3566 0 obj <<
+/D [3540 0 R /XYZ 149.44 406.029 null]
+>> endobj
+3567 0 obj <<
+/D [3540 0 R /XYZ 71.731 405.915 null]
+>> endobj
+3568 0 obj <<
+/D [3540 0 R /XYZ 149.44 391.417 null]
+>> endobj
+3569 0 obj <<
+/D [3540 0 R /XYZ 71.731 389.549 null]
+>> endobj
+3570 0 obj <<
+/D [3540 0 R /XYZ 149.44 376.805 null]
+>> endobj
+3571 0 obj <<
+/D [3540 0 R /XYZ 71.731 374.937 null]
+>> endobj
+3572 0 obj <<
+/D [3540 0 R /XYZ 149.44 362.193 null]
+>> endobj
+3573 0 obj <<
+/D [3540 0 R /XYZ 71.731 360.325 null]
+>> endobj
+3574 0 obj <<
+/D [3540 0 R /XYZ 149.44 347.58 null]
+>> endobj
+3575 0 obj <<
+/D [3540 0 R /XYZ 71.731 347.466 null]
+>> endobj
+3576 0 obj <<
+/D [3540 0 R /XYZ 149.44 332.968 null]
+>> endobj
+3577 0 obj <<
+/D [3540 0 R /XYZ 71.731 330.901 null]
+>> endobj
+3578 0 obj <<
+/D [3540 0 R /XYZ 149.44 318.356 null]
+>> endobj
+3579 0 obj <<
+/D [3540 0 R /XYZ 71.731 316.289 null]
+>> endobj
+3580 0 obj <<
+/D [3540 0 R /XYZ 149.44 303.744 null]
+>> endobj
+3581 0 obj <<
+/D [3540 0 R /XYZ 71.731 303.629 null]
+>> endobj
+3582 0 obj <<
+/D [3540 0 R /XYZ 149.44 289.132 null]
+>> endobj
+3583 0 obj <<
+/D [3540 0 R /XYZ 71.731 289.017 null]
+>> endobj
+3584 0 obj <<
+/D [3540 0 R /XYZ 149.44 274.519 null]
+>> endobj
+3585 0 obj <<
+/D [3540 0 R /XYZ 71.731 272.452 null]
+>> endobj
+3586 0 obj <<
+/D [3540 0 R /XYZ 149.44 259.907 null]
+>> endobj
+3587 0 obj <<
+/D [3540 0 R /XYZ 71.731 244.465 null]
+>> endobj
+3588 0 obj <<
+/D [3540 0 R /XYZ 71.731 231.399 null]
+>> endobj
+3589 0 obj <<
+/D [3540 0 R /XYZ 139.477 216.901 null]
+>> endobj
+3084 0 obj <<
+/D [3540 0 R /XYZ 71.731 212.344 null]
+>> endobj
+34 0 obj <<
+/D [3540 0 R /XYZ 351.463 178.289 null]
+>> endobj
+3085 0 obj <<
+/D [3540 0 R /XYZ 71.731 174.597 null]
+>> endobj
+38 0 obj <<
+/D [3540 0 R /XYZ 208.42 145.436 null]
+>> endobj
+3590 0 obj <<
+/D [3540 0 R /XYZ 71.731 142.395 null]
+>> endobj
+3591 0 obj <<
+/D [3540 0 R /XYZ 138.321 77.81 null]
+>> endobj
+3592 0 obj <<
+/D [3540 0 R /XYZ 165.001 77.81 null]
+>> endobj
+3593 0 obj <<
+/D [3540 0 R /XYZ 119.552 51.907 null]
+>> endobj
+3539 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3596 0 obj <<
+/Length 2876      
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZÝoÛÈ\11\7fÏ_áG\198Ñäòûò\94:¾4×\bĺ¶Àå\10P$%±G\91*?ì¤Eÿ÷þfg\96¤,Ê\ ep\81\1f8;\1cÎÎÎηì\Øøs.BÇ
+]ç"²\95\15\85ÑEº\7fa_lñæÍ\vG(\96\9cÐüeõâê'W]ÄV\1c¸\17«Í\85\8a"Ëó\ 2ð        ,/ð/VÙo\8bë]rèòær©ÂháXü|WTý\97«\8f«KǶ\17K¬.\9dEÿ\85ß]¿zÏÀ릸7\1f~²}\edx\aȹü}õó\8b\9bÕ \9c¯\1c\vr<%¾\90\9c\88¯ÂQ|Ç\89-ßW\17¡\1fY6\8eAâw»üréÙÞ"9\1cÊ"Mº¢®,Ƭ̫\ 3¤oò6¯:^Cê\16d¼¨7ü\1c\18er,\82Ûþp¨\9b®5$M.D{°¬[á\97Öû½aw}éD\vh\b\1aÀÁ\96\8e²bßÑ\92¦uÕ5uYbó\1f\1f+h8\99
+-'pf5dh\96\13"£¢Ð\8aÃ#\r              íûI)ÿd?åYn4»ßã縿|3·ÿxE
+\ 2\91\0o«./ÙL\8aHù*d8½\f\17»âÐ\9eÕ\ 5tç{ñ3º\18\89ÎêBH\9eÕÅé~ß \8bÓýOu1\11àvW\94tf­\81H¥Ê¶¿M\eA\8cs¹áÓÚ\98\10\9dÓ\86!yN\e3û=¯\8d\99ýO´1\15àH\ew?k×AÄy¬\126\9d\8a\9eá¢í\92*K\9a\8c±\80\19¸½tÃE^\16Æÿ4r_g¹öÄ%\89\ 1\ 1\1dÏ
+\1cWï-Ñ\81\18Ã<Ëb+á!2.|%Ïú\90\8e\17iÒÀí³\96Wí®îË\8c?Y\v/\89\17yÆ$ë¯f\v~J\8c\89\17U\9e4\8cÚô]ßä´\93Å\88\ fU>\13<t\94rpú^k\85\17\81&Z^\15ò¼]\ e:Ð_äM\ 1º\Þ\1aFéøá¡©³>Õ2;\ 1Ë\fì¯U!\11«½T¾\96\ e\1a\0\8a\92Ķ\11v M\8aª\9d\11]tBtþbS7¼Í¾nrFu»¤b\\97\v\80\ 3Är\80`\94Ô_¬\93¶H\85öë!\17ìCÑí\18\99\15\9bMÞðEâ\ 5âòº¨tJh\99\80Oïë\8b\98Jª´¤Éº¾\87P®k/ö`\82ÏH)´\1cL\915A¨÷uÇ@R\96B¤­Òu\9dE\aÍ°|´J\1aaºËKáGJ¦ç\87ë\9b\8f¯Ì\8eû5R\ 3íð\83\10õ²ÃõêWa\90Ì)xð\81.oµé±éÓ®G~\ 5¡\8ck\91öÄÉX»G¾ôP\94åÈ\91¡¶Þç31\9c\8eì,\8e\4\12ë&hjÝ\10\1c\11A]8¡¥\1c\9fBÂÒ\v­H!\80¸\11Ü\92ï\0U\0Õ Q¸àr\82á¡Ô\0\15§Ü\vM~¯S\vÀW·oÇ-\10\8f¨>Ø\90¦\\14\14¾;0w\84ýëü¾Hs\86\7f"     \8b\92.\8c\96¬\b\0¿äm\9bl\85è®kúT\1f\87·\99Ä6s\ eÇ×OÚê&1\8ej«II¡ØMmw\91ð²í×­\1c\88\96\ f»bò\1dÝ·\ 6ªZ\18\15M\9evÂ@
+\1eè_\8a\19wQ²>\88\14ú°\18\92\16\88d\r¼¡ÚÎy©\báú¶\16\91\9e¨\99\ ep\9db]\92\ 1{1{/½éÛ\ ö\90\90\16       Lá      òe×$U\vê½v>áZu5CF\1d\9ae_¥â \8fx`¯S\17Í
+lØMb`S÷8\91\89nEu_§âð3Aë(0\ e\972\89\9dÅþPæäû\1c\ra
+ò"1\11\17\e'M\92væË\8cÍèT¡\1c\95\94ïpÔ\87ÏLS\17Ð\991@\9fî7Ë\19[%û¼e\vó&\95»\13*+D\8aµ5ï+|{\95&\95}j\8a¾k\85q$t?\9c2ò-\15ú\8fØ8gØÄ\ 3\e-Z\ e½s\9e"\91W;\91xRxó\eä\93%g]\15ùVà{G7¸m\12r^Oé²¹¯Ä\84µï\ 1)j\ 3ÄjóFïa$.|«)\9c\91b¢XZ\99\0\ 1¸¬\1f\ 4\80g`\9b\92WEuè»+\98\ e\1e3wwh\8a}ÑaW\12
+\11\9cº\9b\19U"°xFGºJ8Q£r­Øyê2ìÀ0H˺\9d  -¨\9a¢(ú6\16M\9ed\7fJ\86\87¦èþ¤\fm^R\84\81\10ï\ 4Æð(À\9e\9axl\ 5\9e'\14E\9dvå3\92P§iñ\ 5±1Rª\1cÊ?`\aÃ\ 1\8c\ 2å\9e\98f\80\89N\8a,ÊZ½\ 4}\80\ 6\ 5Sks\93Ó(bQÿW\99¼'Ï,oÓ¦X\9b\14lÒ!\9b©Î\8b_L6EÔÏSîU\8dù\1d\97¦'êQ¶\15¸îÓ7\1dX\91û\94\8aÁC\ 5ÞÓ\97MéÒ6*\9eDg\15»8\80>\e 
+åú©\ 3½V2V(\98\ 4\10\84T!\80Æ\8b!4ò*Õ®ÛÜ\84iÂò%\ 2h)ÓJ\bA;`ù®\7ftOc\12>:\9c\ 3È\b\8e¨¶o·\9fg\fÑ·-O\19\7fÐ7\17P,þdÛJ\97{´Ôy\8e\80ng(\ e}s¨µ    `Á\ 5\ 2\803ßë\9b×OJ\18e\9fÉwDTÎ\89\8ePâ¡O\ed§¨lí\9e\89î\163\9dµ\96¥\e¢¦\8a\8e\93\a\ f\1eê\1cmªº\ 69¶^:\ 6\95²(ü~\1c¶F¿\1fzzkX\99\anôtÑð\8d</\97\81m\8fRèÕ\7fõ5ë\9a0¢6ÍUÜ\1a\16\95\10lÊdÛ¾4^2C\90Öë\99×=ê\96­¾\10¢)k\14=K'\ 2Xd3ÔF&$\92ýÁ\88Ö\15°SB<Ë\1e­ 58\8e¢­òjÛí\9eý$ÝQ\8d¬%Ê\92\r¥îç_îÞ|~wóþÍ꯿¿\14ë\9fè%Ò\þÇ\9fß¾ºþÛÍë\97§7¹tmËq¹\16õ<%\81Òv¡Äs£\ 5×ÁEù³C'\14\1d\7fÛ\14@AJªæG~§S\07¶¼0\1cö\1c:q,\ 69±P\83\91é7»ºÌZ\ 6\8bꨮt¨kÓ\8d\12¾Ùëz\9dª     ^ë6\87K\16¢\1c6Z\17Ý\8c\13ƶ\1e\17Ð]|\}\9c©õ}ô\16&Êî\93æ\ f\91«É%b¹n`©ãIJ¯;]A;\1c/!à¾hy\ 4IÈ&ÿw¯\e-ZPù\aÇ\9aÄFÂþ\ 3Á\9a
+w½ ¤äzö8\f\90ï8mÑ\e©µM\8d\10\80é=\88\973Õµ0P\bàë\7féFÃU\1e"@\95\95¢T,Ñ\15ô%\8dD\89\8e"\1d=õ¹ÆC)\9e«ê7;aIÚÔoöT\88±°r7J\86µ\132w8ÐÌ$5ÑW\1f.ÖæªÑ\aäi\8el¯í\85\87\18\84åÍõkÊ7\19/RnÙ\ 1\15\e¦¯jaØo6ÜÙ\ 4R\89júºá  2º¡\8co\ 1Ø·¯\99\8e»%\1a£äK\1dàK#EQÍè\98ErcS\9dÐ\84ÝbÌʼ\9aµÏ(B"\f&æyóÏÕ¬y*eú\84\ 2⢼æADL\93\96Î@²Óh5XÈ\89\ 1!ÔçUÆÓ\8fX\97¿$\926\1d\153²Í;3êÇù\$&ÿØèI?4\11çi\82gû2%óði\95\96\ 3YB"cvs\95\16Ó\fcüY­8±O¿\e\8cZùð÷y§\8dB5IúÄ\8f\ 6\7f|HÚfcdÙ$<×÷Y}d7\93²Ñs,'V§³9åËtO\ 5ú\0øìÀ1\8a0\83\9a\89\ eÎÞ\v\ 2Øf,F¬\f\ f8\14X\90OuÜ\8c\1a.Ànu»\vD*\13H%ºÅ\13\rò\9cgw¨K{Íȵá\1ez8ñ\a/t¤°\8d¯\0\85.\19ÔåK\81º¹åu²Ñ\8d¯þ\8c=^âð\1c\9f1âÐ\96ý\10ΰº\e"\97=(gv´eª\10
+´¦®\86s\9f\98A\80T6\14\7f:\8f~¸~õn¦Ð &t0(Kì×\vÐÃP\12su\9bͿ׬ÏeL\aÅ\15\r\98¾WÆ\9cð;\9b1\rÍ8»vÆJ\8cG!hQ\9a{\9e\DfÒ\1añè\ 2u\Mí/\87/Z\8f&\89ÅØ\8a\17DV1Ö$\ 1\82«\9eÆ\93&Z\11æmgF¿d\84§wG\16é\86\8a2\86x|\14Æz&\9d\94Å\7fL\16\a\8bÈ\16秸\9e1b°\ efÑÔ{\86¸µÐÐ\10Ã\88\8fI\\80%\v\12\9a\9b÷\ e\1f\92U\89WÎ6n\9b\1e\ 2\1dM2Á\a7¤|±\18>q\91\9d5\18åY¶ÿýìe`wÞ\\98DÿÂ{ô\93ÈôÌ\bÑn8{ \89\1a¦\ 2>w®\98æ;ßÏ\ fFvgÏ%$\83\17\11¹<\13ÕõÍÕ2\89niÈT7Úü\1f5ö3\8a!+\94ð­\89\8aý3WÏUÿÙ\1fïPÆã\18ßKM#»³j\12\92\89\9a|ãÂ\80=9¾o\8eïë&\84¡õW]0\10ØR\1aã_\ 58WÓs¬´hž20ò¦Öæ\ fJ\95±aèO¥¡2X\ 4òI \99\b\15!'%Cô\17ñƹ\v\a\ 5úqÐü¼QË\ f¬Öã\e\91ÿ\92\80sÄvøäÿQ\8c$æß(ÌO©Ç<HNý3\8eüëÄÛ»\15\ 3h
+lÅ\19hú?\18\9e§\1d\933\90{æ?%Nåû?Æ\ f\9b\8bendstream
+endobj
+3595 0 obj <<
+/Type /Page
+/Contents 3596 0 R
+/Resources 3594 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+>> endobj
+3597 0 obj <<
+/D [3595 0 R /XYZ 71.731 814.833 null]
+>> endobj
+3598 0 obj <<
+/D [3595 0 R /XYZ 71.731 744.98 null]
+>> endobj
+3599 0 obj <<
+/D [3595 0 R /XYZ 71.731 743.32 null]
+>> endobj
+3600 0 obj <<
+/D [3595 0 R /XYZ 129.514 727.161 null]
+>> endobj
+3601 0 obj <<
+/D [3595 0 R /XYZ 71.731 725.094 null]
+>> endobj
+3602 0 obj <<
+/D [3595 0 R /XYZ 129.514 712.549 null]
+>> endobj
+3603 0 obj <<
+/D [3595 0 R /XYZ 71.731 710.482 null]
+>> endobj
+3604 0 obj <<
+/D [3595 0 R /XYZ 129.514 697.937 null]
+>> endobj
+3605 0 obj <<
+/D [3595 0 R /XYZ 71.731 694.209 null]
+>> endobj
+3086 0 obj <<
+/D [3595 0 R /XYZ 71.731 626.961 null]
+>> endobj
+42 0 obj <<
+/D [3595 0 R /XYZ 403.091 592.907 null]
+>> endobj
+3087 0 obj <<
+/D [3595 0 R /XYZ 71.731 589.214 null]
+>> endobj
+46 0 obj <<
+/D [3595 0 R /XYZ 378.45 560.054 null]
+>> endobj
+3606 0 obj <<
+/D [3595 0 R /XYZ 71.731 554.107 null]
+>> endobj
+3607 0 obj <<
+/D [3595 0 R /XYZ 292.334 505.379 null]
+>> endobj
+3608 0 obj <<
+/D [3595 0 R /XYZ 351.407 505.379 null]
+>> endobj
+3609 0 obj <<
+/D [3595 0 R /XYZ 172.401 479.476 null]
+>> endobj
+3610 0 obj <<
+/D [3595 0 R /XYZ 201.38 479.476 null]
+>> endobj
+3611 0 obj <<
+/D [3595 0 R /XYZ 236.337 479.476 null]
+>> endobj
+3612 0 obj <<
+/D [3595 0 R /XYZ 265.316 479.476 null]
+>> endobj
+3613 0 obj <<
+/D [3595 0 R /XYZ 300.273 479.476 null]
+>> endobj
+3614 0 obj <<
+/D [3595 0 R /XYZ 358.082 479.476 null]
+>> endobj
+3615 0 obj <<
+/D [3595 0 R /XYZ 71.731 462.797 null]
+>> endobj
+3616 0 obj <<
+/D [3595 0 R /XYZ 140.185 451.912 null]
+>> endobj
+3617 0 obj <<
+/D [3595 0 R /XYZ 187.279 451.912 null]
+>> endobj
+3618 0 obj <<
+/D [3595 0 R /XYZ 141.52 438.961 null]
+>> endobj
+3619 0 obj <<
+/D [3595 0 R /XYZ 444.438 438.961 null]
+>> endobj
+3620 0 obj <<
+/D [3595 0 R /XYZ 119.552 426.009 null]
+>> endobj
+3621 0 obj <<
+/D [3595 0 R /XYZ 71.731 422.785 null]
+>> endobj
+3622 0 obj <<
+/D [3595 0 R /XYZ 71.731 339.566 null]
+>> endobj
+3623 0 obj <<
+/D [3595 0 R /XYZ 71.731 337.075 null]
+>> endobj
+3624 0 obj <<
+/D [3595 0 R /XYZ 71.731 322.896 null]
+>> endobj
+3625 0 obj <<
+/D [3595 0 R /XYZ 139.477 310.351 null]
+>> endobj
+3626 0 obj <<
+/D [3595 0 R /XYZ 430.414 310.351 null]
+>> endobj
+3627 0 obj <<
+/D [3595 0 R /XYZ 228.013 258.545 null]
+>> endobj
+3628 0 obj <<
+/D [3595 0 R /XYZ 334.797 245.594 null]
+>> endobj
+3629 0 obj <<
+/D [3595 0 R /XYZ 209.045 206.74 null]
+>> endobj
+3630 0 obj <<
+/D [3595 0 R /XYZ 71.731 203.843 null]
+>> endobj
+3631 0 obj <<
+/D [3595 0 R /XYZ 71.731 192.844 null]
+>> endobj
+3632 0 obj <<
+/D [3595 0 R /XYZ 139.477 178.346 null]
+>> endobj
+3633 0 obj <<
+/D [3595 0 R /XYZ 71.731 149.546 null]
+>> endobj
+3634 0 obj <<
+/D [3595 0 R /XYZ 71.731 138.547 null]
+>> endobj
+3635 0 obj <<
+/D [3595 0 R /XYZ 139.477 124.05 null]
+>> endobj
+3636 0 obj <<
+/D [3595 0 R /XYZ 71.731 121.153 null]
+>> endobj
+3637 0 obj <<
+/D [3595 0 R /XYZ 71.731 108.201 null]
+>> endobj
+3638 0 obj <<
+/D [3595 0 R /XYZ 139.477 95.656 null]
+>> endobj
+3639 0 obj <<
+/D [3595 0 R /XYZ 71.731 92.759 null]
+>> endobj
+3640 0 obj <<
+/D [3595 0 R /XYZ 71.731 79.808 null]
+>> endobj
+3641 0 obj <<
+/D [3595 0 R /XYZ 139.477 67.263 null]
+>> endobj
+3594 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3644 0 obj <<
+/Length 2130      
+/Filter /FlateDecode
+>>
+stream
+xÚ­X_sã6\ e\7fßOáG¹³fDR\14¥¹§Ýlss½NÒÉfÚ\87îM\87\96h[=[ò\88rvóí\v\10¤,ÿI¶\ f\1d?\18\ 4\a\10\ 4@òY
+?>Ó\9ciÉgE*X¡\8bYµ{\97ÎÖ0óïw<H,\82Èb"óñéÝÍ\9d\14³\92\95¹\9c=­f¢(X\96å 'gY®fOõïÉíÆì\aÛÏ\17B\17   gôÿsÓ\1e¾Ý<>Íy\9a&\v\18ÍyrøFs·\1fî\89øÔ7ÏñÃ/©JA\fæ\80âóÿ=ýôîǧ\11\9c\12\9c\ 1\8e·à\a\91\vøB\1fás^2¥ÄL«\82¥`\ 6¯Í`Î\97\eå2É2\99][O0\9d\97@M¦ÎÿGh\\b\80\86.>ê»Ä&K\96i=®\89Ø\9e6\96¼³|\19\ 2eúÞ\80S\93\17\1anºmÝ´k\1aìÀÉÖ9³\ e²h\1a\0\ 2¬#\14üg,çÂ+ÿàæ\vY\16É×9\aµ~P\92\8avhºÖÖÄ1ËîÙ¢È{\12¯\9bÞV\ 3ÑU·Û\1dÚ¦2øAÐÖ\f\e¢\ 6\ 4\8f\1aê°ÍÄì»Ã:H¸\177Ø]Pe¶[籦è0V*BÙ 0\9d'm7\10aÛª;ô`cM㥭\f\ 6\97³4\1e\93¦\85°\\99*LDöÞôC\ 3«½Ðp\ 4\ 1tm÷\16\ 6\17\10Ç´a\99Ê´#\84¥=\ 1Ê=Ð}×\ f\1eS&\92¡Ã\7f\99À*DØö¹é»v\a\8eLÚÁÍ\85J\18Íø-FÂ\1dÖkë`>hÁ¯\ 1\7f\v¾}¶¤Ö[\0\13Q=Ù\f\13\ f·?>~ Þ¾ï\9e\9b:\ 2ùõ\16wîÃ\15¸ÛfÙ\9b\1e} ²ä릩æ:ÙШ¶_ÒT´ÖÑ\90ö\11\b´Ð,·aD\9e\ 1\ 2¿ÜZÓÒ(8\1dìð~W*\19\80î\ 2¹Áð": ãÉ}X5F       *Ùí·v\a\9b`\16WB\ 2\83\8d\8düc@\93+y\99t\0\195\89\14\ e\81ë½\aÿ¦®\9b\10¯ Ð­\88KV\ 2\ 3·à°G[i¼êz\92híWâ\10òû u\12d0\v¦¯ãBÞCç\1fT]»¸²\1fCßm·\88:S¹wé¦ÙÇ8É\94\ 6ãÈuH»ÃÒÁ\19D\eÎ\12\97P%ãE6Ë3H&J^M\94Qf1\11ºÈFç\8a\10âG´\8d\0~\8e\1eB8w\a<3\1e\8f;\a$5è\81}{\vP\94y\13\90,$ËËò\ 4Pm]Õ7K\fT\ 4\ 5Çx¿5\83¥ÑêÐ\ 6HàÄ÷\94\ 5E\9e1\9eé\93h\9aÄ>¤ÕÖZÚ>N§\fXKKã1(ýáâcdp\8c\f\9fM\80çÈ1$Â)\1c\18M\85ðä\13\9cȦ\0\f¢£\92Å+\19\86\12{\85§Í×\85\90éWÝ\ 1\83\rÉ&LųFÅ5\15[\9f´nî²I9ç\ 2ê\9c\10°\ eêw}u\13±±\8a¤§[\80;Pè \1cê\8aà\92\89´\fçPNÎ!Ôý\8e0ô4\1a\8cû?QÞq\ 2«M×\aÑ%U5Ìt8áºÃÖÑ\f\1e[dM\8em\1a¼\86JcFIGß\9f­1D4\87v²98\13NÙµÃø²÷%\ fÏ^*È $\0V_EÚ+Ã|íë/²\86(÷ù'\7fâ¡÷I\89\11\97ò\ 3Ü¡\13ñ_æR'vÛ\8cy\ 2\99»Î\17¢ð½      ß8Û?\a\1e\96lÿß^±À~3\18®Á\b¡eì%$\1c\f¬JHEs\90F\87â?\95O¤FÌ^4ú\16\a\r°\7fuàµñû ðµ\98\13eæû³c̹?\rzjÿjÌåcÌ\8d\96øà\93º`*ÏN\8eóë¹\91ë\94©LÎ\14ü§ÅõT\14e\16\13¡ËNíL\115ÁÞSù$5âànLBç\89ºà,MÕ\9b`¢Ì\9b`\ 4zH\95'`&y\11A,\8d\83\14çÉcR\84¡N0oÛ
+[Fì\ 4\90CÇ&ÏÃ>\ 2áË\1eNUób<.\v\8e\994Õ'1\17b\84\85]\143È   \12»ìÕl\91iV`\a,9+S\12\87v\9d      ÜÒB\87+\ 1\10ã\95\0è;\8cÞ\ 6û\r\1c=ìmoF_\92\ 4\1f\82_\16\8c礹Ã.î\12Ä\88!g¢¤»Ë½Ù]   Q<JÊË\9ei\9bú=\87À\fqùE\b\1d:ðiû\1d»cprh\90\91Û-ÿôý³§Qµ§b\17\1d\ eè\b\1f\1c¦¼\8d\vZ\12ê7\93²ð\v\7f~i»½kÜh\82f\gÑ\84\9c\91\91Т\90\80J\8f\ 2ÞwÑ\80£\89S\1dp¡:\16\a¼\9fAëâ\0y\ eÉ´Ú\98\9e¨\1f\82n~ü0O\99Èã\87{3lÚ©\9bG1\99ÁE'\9eí÷¤í\88u¢OàfijÚ\9aµû>Xþ¯k.äEÊ4Ô0¸r0¸äÑ=¨_\1f°¬»qá\93@Ðp+Î.,¹v[\84+\1e\1c\8fÝ\16'ú^½-F\99ãmQ\95\1e(QØÃ\bU\8cÍ5òjûÜTA²íê@ù\9c\ eÿno«\ 6s·OìÊ_ãú±\8e\80À¸
+DÃ3]\15Íö\s\91 £\82JÌ)\97\7f!\b\ f\ 2±îùKëäQÀô×\9a\96\14;Á°Ó7°æ\rTÇôò\84*ÉtY\8cáu¡G1%ÏÕðïªñ¸ìP\91G."f! »h¼hÃg\ 5?\8dØkA# "e\9aÿcA3Ñ÷jÐD\19:*©DxPL%ô\1cu³zñý\8cÔ\19Ô÷\17\7fÛ\ví\ 1²(c!\a³\14#&5|¾!\80;\ f¶±\97U_h(Õ2¸ñá\8fÇO¿=^ú\1að©±ÃÜùØôj7Ð\ eÖ´Ö2ðàî\e81¼°HÁ=â$È\8e7/QÄð¤PF\ 6á\ 6Â/u%Ð
+VÈ#æû\87\8f??Üþ÷J\88h\96æ1\91ùV\r\95.\83ò\80T\8co#â\18äHû§\17\9cµäP\ f¬q\13d\9eêí"\96^H\87eyVz·\83;íÿ\9bÝÎÖ\8d\89ïF½Å{ø¡\8fUhuÅ^)ØhFoMývÕÃëíå>§\90WU\90øÚ7\83½¢¤dEQLï\11\17\95\ eD\84¯u9+KJÓ\9f|S³\8f\9dÝ©JªØ2£]\7f´\ 3\18\8aþ\90\90\88ì:<¡\b            ï°[\86;   \ e½³dx«BFe\9c%\96o\88\81\1eÛ|¨M\8c&N´\8f\1f\86v×3ë\0Õ÷R²\bM\15®\ eI±&^\8cÌËÄxÒCL»\85¸³ø¼\ 16ô±[p6<\14\öEcߥ¸?~>@·\9d³ßk\8fò¿Ý\1eMÕM\8f\92Ò\7f¯A\82ýÁ7¢+\r\92\7f\9c}½I\9aæÔð\82-2è1õ\9boÜG\91øÄ­Y©\11÷©\ e\7fðñq-<kÿçó\13\11RñT\90ÕÓ÷ñ,ËX\1aÃ?{å\15û\12ß_0\ fõ¥endstream
+endobj
+3643 0 obj <<
+/Type /Page
+/Contents 3644 0 R
+/Resources 3642 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+/Annots [ 3649 0 R 3653 0 R ]
+>> endobj
+3649 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [259.184 647.385 379.152 656.735]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-board) >>
+>> endobj
+3653 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [170.543 568.016 281.005 577.366]
+/Subtype /Link
+/A << /S /GoTo /D (lincan-api-chip) >>
+>> endobj
+3645 0 obj <<
+/D [3643 0 R /XYZ 71.731 768.009 null]
+>> endobj
+3646 0 obj <<
+/D [3643 0 R /XYZ 71.731 757.932 null]
+>> endobj
+3647 0 obj <<
+/D [3643 0 R /XYZ 139.477 743.434 null]
+>> endobj
+3648 0 obj <<
+/D [3643 0 R /XYZ 71.731 675.241 null]
+>> endobj
+3650 0 obj <<
+/D [3643 0 R /XYZ 249.074 623.55 null]
+>> endobj
+3651 0 obj <<
+/D [3643 0 R /XYZ 71.731 619.822 null]
+>> endobj
+3652 0 obj <<
+/D [3643 0 R /XYZ 414.43 583.035 null]
+>> endobj
+3088 0 obj <<
+/D [3643 0 R /XYZ 71.731 553.404 null]
+>> endobj
+50 0 obj <<
+/D [3643 0 R /XYZ 319.861 525.231 null]
+>> endobj
+3089 0 obj <<
+/D [3643 0 R /XYZ 71.731 522.154 null]
+>> endobj
+3654 0 obj <<
+/D [3643 0 R /XYZ 71.731 506.373 null]
+>> endobj
+54 0 obj <<
+/D [3643 0 R /XYZ 115.406 487.07 null]
+>> endobj
+3655 0 obj <<
+/D [3643 0 R /XYZ 71.731 476.492 null]
+>> endobj
+3656 0 obj <<
+/D [3643 0 R /XYZ 71.731 476.492 null]
+>> endobj
+58 0 obj <<
+/D [3643 0 R /XYZ 162.317 450.775 null]
+>> endobj
+3657 0 obj <<
+/D [3643 0 R /XYZ 143.462 434.954 null]
+>> endobj
+3658 0 obj <<
+/D [3643 0 R /XYZ 71.731 432.887 null]
+>> endobj
+62 0 obj <<
+/D [3643 0 R /XYZ 174.677 409.616 null]
+>> endobj
+3659 0 obj <<
+/D [3643 0 R /XYZ 71.731 404.661 null]
+>> endobj
+3660 0 obj <<
+/D [3643 0 R /XYZ 71.731 402.27 null]
+>> endobj
+3661 0 obj <<
+/D [3643 0 R /XYZ 136.77 393.116 null]
+>> endobj
+3664 0 obj <<
+/D [3643 0 R /XYZ 158.292 393.116 null]
+>> endobj
+3665 0 obj <<
+/D [3643 0 R /XYZ 218.554 393.116 null]
+>> endobj
+3668 0 obj <<
+/D [3643 0 R /XYZ 261.599 393.116 null]
+>> endobj
+3669 0 obj <<
+/D [3643 0 R /XYZ 278.817 393.116 null]
+>> endobj
+3670 0 obj <<
+/D [3643 0 R /XYZ 71.731 379.334 null]
+>> endobj
+66 0 obj <<
+/D [3643 0 R /XYZ 187.959 353.997 null]
+>> endobj
+3671 0 obj <<
+/D [3643 0 R /XYZ 71.731 351.432 null]
+>> endobj
+3672 0 obj <<
+/D [3643 0 R /XYZ 71.731 346.65 null]
+>> endobj
+3673 0 obj <<
+/D [3643 0 R /XYZ 71.731 346.65 null]
+>> endobj
+3674 0 obj <<
+/D [3643 0 R /XYZ 71.731 334.699 null]
+>> endobj
+3675 0 obj <<
+/D [3643 0 R /XYZ 139.477 321.651 null]
+>> endobj
+3676 0 obj <<
+/D [3643 0 R /XYZ 243.167 308.699 null]
+>> endobj
+3677 0 obj <<
+/D [3643 0 R /XYZ 302.504 308.699 null]
+>> endobj
+3678 0 obj <<
+/D [3643 0 R /XYZ 71.731 306.002 null]
+>> endobj
+3679 0 obj <<
+/D [3643 0 R /XYZ 71.731 306.002 null]
+>> endobj
+3680 0 obj <<
+/D [3643 0 R /XYZ 71.731 293.354 null]
+>> endobj
+3681 0 obj <<
+/D [3643 0 R /XYZ 139.477 280.306 null]
+>> endobj
+3682 0 obj <<
+/D [3643 0 R /XYZ 367.04 280.306 null]
+>> endobj
+3683 0 obj <<
+/D [3643 0 R /XYZ 248.31 267.354 null]
+>> endobj
+3684 0 obj <<
+/D [3643 0 R /XYZ 272.137 254.403 null]
+>> endobj
+3685 0 obj <<
+/D [3643 0 R /XYZ 318.932 254.403 null]
+>> endobj
+3686 0 obj <<
+/D [3643 0 R /XYZ 71.731 252.533 null]
+>> endobj
+70 0 obj <<
+/D [3643 0 R /XYZ 192.609 227.404 null]
+>> endobj
+3687 0 obj <<
+/D [3643 0 R /XYZ 71.731 222.449 null]
+>> endobj
+3090 0 obj <<
+/D [3643 0 R /XYZ 71.731 182.838 null]
+>> endobj
+3688 0 obj <<
+/D [3643 0 R /XYZ 71.731 169.927 null]
+>> endobj
+74 0 obj <<
+/D [3643 0 R /XYZ 116.37 147.547 null]
+>> endobj
+3689 0 obj <<
+/D [3643 0 R /XYZ 71.731 140.454 null]
+>> endobj
+3690 0 obj <<
+/D [3643 0 R /XYZ 71.731 140.454 null]
+>> endobj
+78 0 obj <<
+/D [3643 0 R /XYZ 162.317 111.251 null]
+>> endobj
+3691 0 obj <<
+/D [3643 0 R /XYZ 149.44 95.43 null]
+>> endobj
+3692 0 obj <<
+/D [3643 0 R /XYZ 71.731 93.363 null]
+>> endobj
+3642 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3695 0 obj <<
+/Length 1077      
+/Filter /FlateDecode
+>>
+stream
+xÚÕX]\8f\9c6\14}ß_Á#S\15/¶16êÓf\93T­ªTÚÌ[\12U,ã\99¥\1a`ÄÇ&Û_ßkl\83\99\81춢©¢yÀ\83\8f¯Ïý<\12Ø\vá\87=\8e\11§Ø\13!A\82\v/+®Bï\0;?_a\83\b\f$p0¯¶W×o)ñ\12\94ÄÔÛî="\ 4\8a¢\18ìÄ(\8a\99·Ý}ðo\1fÒS+ëM@¸ð1ÒÏßò²ûr}·Ýà0ô\ 3ø·Á~÷EïÝÞ¼Ó\8b×uþh\ f~\fY\b\83\15Þ|Úþzõf;\90c\ 4#àñ5ú\ 6rA\9f\10\ fc\940¦øc\9c Æ\88Ç\99@!ø¡ø¿\7f*«S\937êÎë·\11l"Ì#\85\ e½\0ÇH{\99\97­\ 6°p\ 4`\8e\b\16\80S\88ìX5òÒ\baH\90Ø`\94\97£%ì 0b\84\1aÔ~wiF \91°Ñ
+þIC&Þ\ 5\9cBV \ 64Aài\8f½©\ f]!˶\19î\1c\92©Üã\90óȹÔ\rº\rVÌC\14
+<\17u\82x\9cÀÊÙ:\7f\ e   Â\84@\82`áØÓ\19â#'\fÔ#Î\87;µ»!9J]&;Ùdu~j+S6m¥\9fÕI\96r§ÖÜÏÒR¿,dÓ¤\as2«\8a¢+ó,móÊìW÷\7fʬ\9d\v$x\9e\10æ\ 5$FI¢\ 3ùÚܬNë\13|\1aJ\86($LAïdÛÕe£/)å\ 1®|4,Ê®¸\87V°U\9f\e\83e\996fUíõSÖ58«Ú\b\8dLUÝi¦\11\87òRå\ f\ 5\14ëLÖ2Ý\8dÐ\b
+j\914F$Ñ¥ÿ.-Æ\8a=sF\90sc\8e¿\10\97ØÖýGB¸¦ª°\8d]f\12\9cÞ\99\8eß`áë®ç6+\ 6¸¯«b&[Ë©ÑW\aÐV\94\8a\7fÐÀM\93ÿ%ÿ\98ib\1a¡\88ÚÖ\1aÝuíLú|\9d\1eþq\13Ä\90ÓÇ*ßéÕ\ f\97\ 6©@°Ðøûn?Ã\8b\92©Å\89\9b\vƲª³\ eLF\95r\80<7dp¢\ 2\f\90¡Ï\f\99\b\87\883¾Ú\90qì-\ e\19\8bùfCÆ\rÌ0c \89Ü4\9bIò\|¨\0ÇàäZñqì-ÆÇb\14µS\ 55/Ï\ 2\92Öu
+£É\7f\1aFÖÅ0\11Юx¨»´,\9a\83­N÷J\16¢¡\90\9b¶î2\98 0"\b³So\1a:\ 65K\12\13;<­éÙè1\8a\92õ\8ak4·\1c;\réý\81\8e\9cÎôIÍ\9c\ 5QÉC·ß\9f+\84\12\ eûÎ\9a¹\7fje³¦|Ñ©|QB\1cù¢\84ú\8fÀÔ?væ\9fâ¦0½z©\17Z½Ô+EQ=µzõ\9bòh7ëÉ\ 5Æ1\ 5±§ú)ܯ´\8býæç\87<ÛpÿAoèqß3'à·®\81¢;¶ùé(\97Ë\91A¾9þw娭öÙ\ 49\9bUc\f2\8c¡\99]9þ\ç­\M\8f]k\ eaJP\f\93ì\\91{ts!Âb"Â|èç9      Ö*=\8cÂ:-\9b"\a1\1dêhRy\86Ç\7f\8e÷\17ÂE_¤Ïä\19}\8e§j\9aUeÓ¾@ªã\bòÍ\9fÕjñ\8dµ\9a\10Å\8b®¬Õ\ 2£8\89V\9b¦£¹Åij ß\83PÃÜ_O¥­±ÅÀô\80ÿ_\9fÝ@\98ï\bPyIÈ¿ú¥a\84Ø\ f\r¼×Ìý\99\ruéï·oînÌÇ\85_Þoõ\822\1c\12MÖýJ\11E\11
+íÈ`\vß\12.ùý\rT3)\84endstream
+endobj
+3694 0 obj <<
+/Type /Page
+/Contents 3695 0 R
+/Resources 3693 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3482 0 R
+>> endobj
+82 0 obj <<
+/D [3694 0 R /XYZ 174.677 758.046 null]
+>> endobj
+3696 0 obj <<
+/D [3694 0 R /XYZ 71.731 753.091 null]
+>> endobj
+3697 0 obj <<
+/D [3694 0 R /XYZ 71.731 750.7 null]
+>> endobj
+3698 0 obj <<
+/D [3694 0 R /XYZ 136.77 741.546 null]
+>> endobj
+3699 0 obj <<
+/D [3694 0 R /XYZ 162.596 741.546 null]
+>> endobj
+3700 0 obj <<
+/D [3694 0 R /XYZ 184.119 741.546 null]
+>> endobj
+3701 0 obj <<
+/D [3694 0 R /XYZ 71.731 727.765 null]
+>> endobj
+86 0 obj <<
+/D [3694 0 R /XYZ 187.959 702.427 null]
+>> endobj
+3702 0 obj <<
+/D [3694 0 R /XYZ 71.731 699.863 null]
+>> endobj
+3703 0 obj <<
+/D [3694 0 R /XYZ 71.731 695.081 null]
+>> endobj
+3704 0 obj <<
+/D [3694 0 R /XYZ 71.731 695.081 null]
+>> endobj
+3705 0 obj <<
+/D [3694 0 R /XYZ 71.731 684.484 null]
+>> endobj
+3706 0 obj <<
+/D [3694 0 R /XYZ 139.477 670.081 null]
+>> endobj
+3707 0 obj <<
+/D [3694 0 R /XYZ 71.731 666.353 null]
+>> endobj
+90 0 obj <<
+/D [3694 0 R /XYZ 192.609 643.082 null]
+>> endobj
+3708 0 obj <<
+/D [3694 0 R /XYZ 71.731 638.127 null]
+>> endobj
+3091 0 obj <<
+/D [3694 0 R /XYZ 71.731 611.468 null]
+>> endobj
+3709 0 obj <<
+/D [3694 0 R /XYZ 71.731 598.556 null]
+>> endobj
+94 0 obj <<
+/D [3694 0 R /XYZ 112.549 576.176 null]
+>> endobj
+3710 0 obj <<
+/D [3694 0 R /XYZ 71.731 569.084 null]
+>> endobj
+3711 0 obj <<
+/D [3694 0 R /XYZ 71.731 569.084 null]
+>> endobj
+98 0 obj <<
+/D [3694 0 R /XYZ 162.317 539.88 null]
+>> endobj
+3712 0 obj <<
+/D [3694 0 R /XYZ 143.462 524.06 null]
+>> endobj
+3713 0 obj <<
+/D [3694 0 R /XYZ 71.731 521.993 null]
+>> endobj
+102 0 obj <<
+/D [3694 0 R /XYZ 174.677 498.722 null]
+>> endobj
+3714 0 obj <<
+/D [3694 0 R /XYZ 71.731 493.766 null]
+>> endobj
+3715 0 obj <<
+/D [3694 0 R /XYZ 71.731 491.375 null]
+>> endobj
+3716 0 obj <<
+/D [3694 0 R /XYZ 153.987 482.222 null]
+>> endobj
+3717 0 obj <<
+/D [3694 0 R /XYZ 171.205 482.222 null]
+>> endobj
+3718 0 obj <<
+/D [3694 0 R /XYZ 192.728 482.222 null]
+>> endobj
+3719 0 obj <<
+/D [3694 0 R /XYZ 210.232 482.222 null]
+>> endobj
+3720 0 obj <<
+/D [3694 0 R /XYZ 240.363 482.222 null]
+>> endobj
+3721 0 obj <<
+/D [3694 0 R /XYZ 262.331 482.222 null]
+>> endobj
+3722 0 obj <<
+/D [3694 0 R /XYZ 292.462 482.222 null]
+>> endobj
+3723 0 obj <<
+/D [3694 0 R /XYZ 71.731 468.44 null]
+>> endobj
+106 0 obj <<
+/D [3694 0 R /XYZ 187.959 443.102 null]
+>> endobj
+3724 0 obj <<
+/D [3694 0 R /XYZ 71.731 440.538 null]
+>> endobj
+3725 0 obj <<
+/D [3694 0 R /XYZ 71.731 435.756 null]
+>> endobj
+3726 0 obj <<
+/D [3694 0 R /XYZ 71.731 435.756 null]
+>> endobj
+3727 0 obj <<
+/D [3694 0 R /XYZ 71.731 425.16 null]
+>> endobj
+3728 0 obj <<
+/D [3694 0 R /XYZ 139.477 410.757 null]
+>> endobj
+3729 0 obj <<
+/D [3694 0 R /XYZ 71.731 407.86 null]
+>> endobj
+3730 0 obj <<
+/D [3694 0 R /XYZ 71.731 407.86 null]
+>> endobj
+3731 0 obj <<
+/D [3694 0 R /XYZ 71.731 396.766 null]
+>> endobj
+3732 0 obj <<
+/D [3694 0 R /XYZ 139.477 382.363 null]
+>> endobj
+3733 0 obj <<
+/D [3694 0 R /XYZ 226.091 382.363 null]
+>> endobj
+3734 0 obj <<
+/D [3694 0 R /XYZ 71.731 379.466 null]
+>> endobj
+3735 0 obj <<
+/D [3694 0 R /XYZ 71.731 379.466 null]
+>> endobj
+3736 0 obj <<
+/D [3694 0 R /XYZ 71.731 368.373 null]
+>> endobj
+3737 0 obj <<
+/D [3694 0 R /XYZ 139.477 353.97 null]
+>> endobj
+3738 0 obj <<
+/D [3694 0 R /XYZ 71.731 350.242 null]
+>> endobj
+110 0 obj <<
+/D [3694 0 R /XYZ 192.609 326.971 null]
+>> endobj
+3739 0 obj <<
+/D [3694 0 R /XYZ 71.731 322.016 null]
+>> endobj
+3740 0 obj <<
+/D [3694 0 R /XYZ 172.323 298.677 null]
+>> endobj
+3092 0 obj <<
+/D [3694 0 R /XYZ 71.731 282.405 null]
+>> endobj
+3741 0 obj <<
+/D [3694 0 R /XYZ 71.731 269.493 null]
+>> endobj
+114 0 obj <<
+/D [3694 0 R /XYZ 119.555 247.113 null]
+>> endobj
+3742 0 obj <<
+/D [3694 0 R /XYZ 71.731 240.021 null]
+>> endobj
+3743 0 obj <<
+/D [3694 0 R /XYZ 71.731 240.021 null]
+>> endobj
+118 0 obj <<
+/D [3694 0 R /XYZ 162.317 210.818 null]
+>> endobj
+3744 0 obj <<
+/D [3694 0 R /XYZ 149.44 194.997 null]
+>> endobj
+3745 0 obj <<
+/D [3694 0 R /XYZ 71.731 192.93 null]
+>> endobj
+122 0 obj <<
+/D [3694 0 R /XYZ 174.677 169.659 null]
+>> endobj
+3746 0 obj <<
+/D [3694 0 R /XYZ 71.731 164.703 null]
+>> endobj
+3747 0 obj <<
+/D [3694 0 R /XYZ 71.731 162.312 null]
+>> endobj
+3748 0 obj <<
+/D [3694 0 R /XYZ 153.987 153.159 null]
+>> endobj
+3749 0 obj <<
+/D [3694 0 R /XYZ 175.51 153.159 null]
+>> endobj
+3750 0 obj <<
+/D [3694 0 R /XYZ 197.032 153.159 null]
+>> endobj
+3751 0 obj <<
+/D [3694 0 R /XYZ 214.537 153.159 null]
+>> endobj
+3752 0 obj <<
+/D [3694 0 R /XYZ 270.495 153.159 null]
+>> endobj
+3753 0 obj <<
+/D [3694 0 R /XYZ 292.462 153.159 null]
+>> endobj
+3754 0 obj <<
+/D [3694 0 R /XYZ 322.593 153.159 null]
+>> endobj
+3755 0 obj <<
+/D [3694 0 R /XYZ 71.731 139.377 null]
+>> endobj
+126 0 obj <<
+/D [3694 0 R /XYZ 187.959 114.039 null]
+>> endobj
+3756 0 obj <<
+/D [3694 0 R /XYZ 71.731 111.475 null]
+>> endobj
+3757 0 obj <<
+/D [3694 0 R /XYZ 71.731 106.693 null]
+>> endobj
+3758 0 obj <<
+/D [3694 0 R /XYZ 71.731 106.693 null]
+>> endobj
+3759 0 obj <<
+/D [3694 0 R /XYZ 71.731 96.097 null]
+>> endobj
+3760 0 obj <<
+/D [3694 0 R /XYZ 139.477 81.694 null]
+>> endobj
+3761 0 obj <<
+/D [3694 0 R /XYZ 71.731 78.797 null]
+>> endobj
+3762 0 obj <<
+/D [3694 0 R /XYZ 71.731 78.797 null]
+>> endobj
+3763 0 obj <<
+/D [3694 0 R /XYZ 71.731 67.703 null]
+>> endobj
+3764 0 obj <<
+/D [3694 0 R /XYZ 139.477 53.3 null]
+>> endobj
+3765 0 obj <<
+/D [3694 0 R /XYZ 226.091 53.3 null]
+>> endobj
+3693 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3768 0 obj <<
+/Length 1584      
+/Filter /FlateDecode
+>>
+stream
+xÚ­XY\8fÛ6\10~ß_á·z\81\98\11)J\94\90§íæ@Û\1c\85×(
+4E Ë²W\8d$º"\95d[ô¿w\86\87L¯åM\e,üÀ¡8\9cããpfh:\8bàGg\82\12\11ÓY\161\92\89lV¶\17Ñl\a+¯.¨ãX8\96EÀóýêâéË\98Ír\92§ñlµ\9d±,#\9c§ '%<Mf«ÍoóëÛb¯«þrÁD6§Ä\8e¯ënøòt¹º¤Q4_Àì\92Î\87/víúê­%\9e÷õ'¿ñ}\94\ 6k@ÑËßW?^¼X\8dÆ%\8c\12°ã!ó\1dË\89ù =\98OiN\92\84ÍD\92\91\bÜ@óK9tú¾¾\91\91Ç\84Ç|J!#"Í\81
+\96î\8f£m\94\r1>È3Æ1\11\18\17ç\84\v1êDãTýW\ 5øÐ|.·vl\ 1ÈJ©bç¾\17}_\0Èó;;]\ fÛ­\81\14h\0\1dÆlÞ\ríÚ\7fóbÖwºR\97,\99\13;_ÝV\96y_ôE[é\83\8c­ì[e'\e\7f^ÀW¬å``\ 3\ fÁ?\92\ 3Îhñ¨\8cGV\19\8c-¨¢s´YÙ\ fû¾\ 2=ÕÆÎ@\83%t_tª­\95ª%\9a\1e\83w\9dãQ·rh\1c½®\9cØ¡Ñõ¾q3 *¶hÐÓ\97<\88Ø8æ$b\f¬4\87]t­Ú}Ð\96/D\7fá\19­3̯û¡ÔC_Ù\18\ 1¾\13·\9dA\9c\0oböCÄä,\99-XJò<7Û\9fWªìë½FwN\14"l  \89¹Õ´¬@M\aðÄY4ïª]¡\ 1j;ûT4\83#ñDqÔ·îCY(G!Ö8V}\8fp\1a²ñ\8bý\91twBá.\e\ e\86TCYB\80m\87¦¹\9b8_¥¥9¸8¢`\8e\ 6Ð¥\9d´>*q"×\7fT¥Fúþ©âê\9fC58 \r\87   >\ØKU;Ç#oµW6\9a\8d\8a\95å0\11°8²ÒÂi£\ 2\8eLN\84\ 4\13$\15éW#"\89H\92;®¯\a\82 \8cº@\80\b\882\ 1\19\89\92\ 4E\8dûas&Pãû(b\8d\1e\95Âv\ e\91\90âv.H\86\99"N Ëm\86z\v\17òÔ\v\e\e*H#\f\8an[\aâ\ 3\9frHß\94:§Þ3&\9c?ÇîÙ\v D\ 1¡°Ç3.º²òy\1aM÷Y[Á\11í§n\83S´`\10âqfÔÝÜur¯àè¼+\82\9dÏ1Ï\81\99BVN\1eðÇLÿ6ç\9d\914\82-9äUav`0\9aõmSìÔ3\1f\14\13\f\10~õæ!\86R®'\96\87NÕ;\13\8eÈÓÈng©IYç\98ÛB}´ì\8b\13\ fþy6\85ä\bNJhj\91|SáUPÓ9E@\15·A\aG\15\ 3\14çj[\9cq"xöhµ-\90w¶¶y\1e4oL\18.¬¼­§aÎIJí½~sóêÃrµ<õ\9c#Oì\ 2\9b¸&äH\ 3æ\f\1c\97U+µù&æ«ã\82cV!:\94~rjÈ©¸oÎ\8b_WßbÎçZßZªú¢+l\8f\1eÂ\87\1f\9e_Æbþ?Lx÷Ë\7fE¤î6uYèÑ]S¡a´\19Ù`"¡ÄãiÈÏv©\94°\aw|Õ x4èõ»ë«×\13\195\85\84\98=\84\8aìë]Ý\15¦\18¡1Û^¶vEßú\ 3ìäæ\90|!ËZ¡!&P\1e1\95QÎ!\859
+ò®ìûJíÑ\1d¼\8df\15¯£[^×z"ü Õ\81Dæmvá÷áÍÕÍO§î¹\ 6Ú²N \ 5W\93æ<\10\ 5¡ó\8d¢\16±ÈI\ 4Ù3,Í#òg\84f1I3_÷È\84PÇp?¼~^¾»~qssæP¡Á\87Òç¤V]±nððx\92CÖ+¡5\9d7væÎÙ­í{\89]\869      \9ed¦³Á靈A¢\94íú\12[\f\17­øÍÜ\19sèNiXòw\8d\\17ÍX\964\8a¶¼¾1ËH\9cÛ\185\15à\^dÀHÓôÑòb ï4/b¯\ fFy\1eó\9eÂàÆ'\12\8fb\7f1\91¬7U§k¬¿æ\ 6\ 38\bKÄçõ\81ÄZm\10\ 4ºÄº­Üf¼è8Z|\8184Ï£\1aeé=\16w³§s«\83ò\9fð\95&÷Ug\91\85\86\99¦G!XwJc¯àßp\aôiLDFÝ\8bk}\ e{\9a¥¦¥y,ì\ 3y\13Ø3 éò<Ö´¶\1dºã\14éZY\93z\ 6|~­Ã7k'Ý\1a\80´9¸\r\ 6¤9?rû|ÄQx\8eröx\958\90wÞkÇc\9a­ª\ 1\17}ùé¡\ 4Ö½\9f¹×GX,L`õAµ²¥ÅÍ}\1e\9dÄÀäÛs(Ä\11\89\1eñ­\1dÈ;Û\8fx\9e\ 3
+\81\13®ÕßuîÒuÚ\15\1e\9bËdkd\vïÙZÉnl\ 5\83\1cJ-\93/xºøè·\15¾ã¶¯i'«\a|ÃJ\15¢\f\86=\99P\11\1d«ØÈî;\1dè¸\87¸«.\8c\93<\12\ fþ\17t`ñ\7f\ 5    \92\8b B9\ 6´\ 1\8aÄòÊ\19ðÃÍÊ\12qB#f\8bFø?\12\87Æ!J\ÑHÏüÛsjß¿ü½­\13endstream
+endobj
+3767 0 obj <<
+/Type /Page
+/Contents 3768 0 R
+/Resources 3766 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+>> endobj
+3769 0 obj <<
+/D [3767 0 R /XYZ 71.731 768.009 null]
+>> endobj
+3770 0 obj <<
+/D [3767 0 R /XYZ 71.731 768.009 null]
+>> endobj
+3771 0 obj <<
+/D [3767 0 R /XYZ 71.731 757.837 null]
+>> endobj
+3772 0 obj <<
+/D [3767 0 R /XYZ 139.477 743.434 null]
+>> endobj
+3773 0 obj <<
+/D [3767 0 R /XYZ 473.499 730.483 null]
+>> endobj
+3774 0 obj <<
+/D [3767 0 R /XYZ 71.731 715.756 null]
+>> endobj
+130 0 obj <<
+/D [3767 0 R /XYZ 192.609 690.532 null]
+>> endobj
+3775 0 obj <<
+/D [3767 0 R /XYZ 71.731 685.577 null]
+>> endobj
+3776 0 obj <<
+/D [3767 0 R /XYZ 147.228 649.287 null]
+>> endobj
+3093 0 obj <<
+/D [3767 0 R /XYZ 71.731 633.015 null]
+>> endobj
+3777 0 obj <<
+/D [3767 0 R /XYZ 71.731 620.104 null]
+>> endobj
+134 0 obj <<
+/D [3767 0 R /XYZ 203.256 597.724 null]
+>> endobj
+3778 0 obj <<
+/D [3767 0 R /XYZ 71.731 588.823 null]
+>> endobj
+3779 0 obj <<
+/D [3767 0 R /XYZ 71.731 588.823 null]
+>> endobj
+138 0 obj <<
+/D [3767 0 R /XYZ 162.317 561.428 null]
+>> endobj
+3780 0 obj <<
+/D [3767 0 R /XYZ 215.193 545.607 null]
+>> endobj
+3781 0 obj <<
+/D [3767 0 R /XYZ 71.731 543.54 null]
+>> endobj
+142 0 obj <<
+/D [3767 0 R /XYZ 174.677 520.269 null]
+>> endobj
+3782 0 obj <<
+/D [3767 0 R /XYZ 71.731 515.314 null]
+>> endobj
+3783 0 obj <<
+/D [3767 0 R /XYZ 71.731 441.593 null]
+>> endobj
+146 0 obj <<
+/D [3767 0 R /XYZ 176.446 417.094 null]
+>> endobj
+3784 0 obj <<
+/D [3767 0 R /XYZ 71.731 416.951 null]
+>> endobj
+3785 0 obj <<
+/D [3767 0 R /XYZ 71.731 412.168 null]
+>> endobj
+3786 0 obj <<
+/D [3767 0 R /XYZ 71.731 397.293 null]
+>> endobj
+3787 0 obj <<
+/D [3767 0 R /XYZ 139.477 384.748 null]
+>> endobj
+3788 0 obj <<
+/D [3767 0 R /XYZ 71.731 381.02 null]
+>> endobj
+3789 0 obj <<
+/D [3767 0 R /XYZ 71.731 381.02 null]
+>> endobj
+3790 0 obj <<
+/D [3767 0 R /XYZ 71.731 366.408 null]
+>> endobj
+3791 0 obj <<
+/D [3767 0 R /XYZ 71.731 366.408 null]
+>> endobj
+3792 0 obj <<
+/D [3767 0 R /XYZ 71.731 351.796 null]
+>> endobj
+3793 0 obj <<
+/D [3767 0 R /XYZ 71.731 351.796 null]
+>> endobj
+3794 0 obj <<
+/D [3767 0 R /XYZ 71.731 337.184 null]
+>> endobj
+3795 0 obj <<
+/D [3767 0 R /XYZ 71.731 337.184 null]
+>> endobj
+3796 0 obj <<
+/D [3767 0 R /XYZ 71.731 322.571 null]
+>> endobj
+3797 0 obj <<
+/D [3767 0 R /XYZ 357.895 311.687 null]
+>> endobj
+3798 0 obj <<
+/D [3767 0 R /XYZ 446.82 311.687 null]
+>> endobj
+3799 0 obj <<
+/D [3767 0 R /XYZ 139.477 298.736 null]
+>> endobj
+3800 0 obj <<
+/D [3767 0 R /XYZ 71.731 295.909 null]
+>> endobj
+3801 0 obj <<
+/D [3767 0 R /XYZ 71.731 295.909 null]
+>> endobj
+3802 0 obj <<
+/D [3767 0 R /XYZ 71.731 255.73 null]
+>> endobj
+3803 0 obj <<
+/D [3767 0 R /XYZ 71.731 240.711 null]
+>> endobj
+3804 0 obj <<
+/D [3767 0 R /XYZ 139.477 228.166 null]
+>> endobj
+3805 0 obj <<
+/D [3767 0 R /XYZ 71.731 213.18 null]
+>> endobj
+3806 0 obj <<
+/D [3767 0 R /XYZ 71.731 201.319 null]
+>> endobj
+3807 0 obj <<
+/D [3767 0 R /XYZ 139.477 186.821 null]
+>> endobj
+3808 0 obj <<
+/D [3767 0 R /XYZ 71.731 183.924 null]
+>> endobj
+3809 0 obj <<
+/D [3767 0 R /XYZ 71.731 172.926 null]
+>> endobj
+3810 0 obj <<
+/D [3767 0 R /XYZ 139.477 158.428 null]
+>> endobj
+3811 0 obj <<
+/D [3767 0 R /XYZ 71.731 155.531 null]
+>> endobj
+3812 0 obj <<
+/D [3767 0 R /XYZ 71.731 144.532 null]
+>> endobj
+3813 0 obj <<
+/D [3767 0 R /XYZ 139.477 130.034 null]
+>> endobj
+3814 0 obj <<
+/D [3767 0 R /XYZ 71.731 126.306 null]
+>> endobj
+3815 0 obj <<
+/D [3767 0 R /XYZ 71.731 111.694 null]
+>> endobj
+3094 0 obj <<
+/D [3767 0 R /XYZ 71.731 69.926 null]
+>> endobj
+3766 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3819 0 obj <<
+/Length 1358      
+/Filter /FlateDecode
+>>
+stream
+xÚíXÉnä6\10½û+tT\aÓ´¸\89\14\82\1c\1c\8f\9d80f\10[sÊ\ 4\ 3YÍv+ÑÒÑ2Ûק$\92ZZ\92\83\ 4\r\ 4\ 1\ 2\1f\9a"KUÅWË+\v;\1eüaG`$(v¤G\90\14Ò\89³\vÏy\86\93\1f\91Ø\1a\91íHæûðâò\96\12'@\81O\9d\10)\11c>èñ\11ó¹\13î~q¯\ fѱVåfK\84t1Ò¿÷IÞ|¾|\b7ØóÜ-<m°Û|Ög×Woôâu\99|´/¾÷¸\abp\ 6+¼ù5üéâ&ì\9dã\ 4#ðã%÷\8dÈÌ}B\1c,\10Á¼õßÜQp\8ex :÷ïÞ^\87÷à\83\14­c?¿»ùp{wß¹\1dÞ<´~h\15\fQ¸7¨`\ 2I\ 2ö¨\8fHàw*ÞD\99Ò\92l\84\95çl1ïdGf|Ð;\98\19,\88á=\8c}°Eáýö½÷\84\b\8dУª+½\8aâX\1dë(\8f\95ÅÎ#©      \81\85\81ôz\83¥k±þ£Q\8d\11\8f\8b<Wq­vú±.ÌöF¸i¢òºu     |7nl1A\ 1×\97¨ê¨V\ 3&\18\ e¸¹*á\88RÙI=~É\8bc\95T=$\ 2aÁ,$>Òi\93hC\97·Ü\e\ 4ºHIsõ¤\88ët®\ 4âÌÁº\81\aÒfÐ\84W¤ö»¹\1a\89$\84O\9f¿Ò\81YVÔÆP\18Á¸È²(_ÐF\19\12½¹ï\16âlLTuÙĵ^ÇQ¾OÒú\83yüfn\es\ 6Y\81í-@xny\ 2Y[;ß.\ 4hK=\8c¤ôa\11 L:Ù«ò¹É ÜUow\92º\ 2*\85\8eÐ\e\97\ 1â\9c8\\80qâ/Õ#AÂ\ f`5::ýíK\17\13\ 2¥ÛÖð O×î¸,Às&DoS_\17\12ßdõNUq\99\1ck\9bý6­\8b£Êuª\8b\16\99©ª\8a\9eûzȲ&Oâ¨N
+s^<ý\ 6\152\af\v\17\ f\b\87_\8a\84$§9±\88\11\83L\83Æt6\8c\ 6\18\19\99Ö½×*/jU½Ü\12¦\1dÄÜèÕ¼§aá!Ém5,4²\13°¼\ e%\8d\16\9e$ñ"TÄC\8c\ 6ç\83jз\ e\95\91i};\16Ð\ 1ÔIþÔ\87\85ÞîC·ÃÌ6\85¾\8e\9cC·ómqêÚoJÕ\ 6\ 1-U)fP¥\9e\80n꣠\bLüt^·¹9Ó¯9¦mÓ­h¸ä*Ü\8fÐõ\80\8dµI\10%öV\96\179\81¾ø±è«\83S·ÒL\ 4'\13&\82\93,ª~×'Å^ïDUUÄI\ 4ô¯    \a\0/\9b\b8k¾ñ \10\9cMùæ¨â¤ÍMý*s\8fQ    \\v1ª6\84»Ho^\81rÀ5Jõ#\8c\14\95q\95\197X\17Ån±³3\a¬[Æ;DùsW\1dð<ª\82ù«\14:Ì>j {»ÝRÅj\88J\17\88Áo}½.Ê \1c¸0\ 6¹ZK`zÖn\1e\91O-#\81\86d7\8f\10%ÝØeòéP4éNk}ê´K\bUR'Q\9a|Uæ Kc8øªÊbºS5ÇcQÖz\13\b\11~JÒ¤þ¢Ï?%õA\1fî\9b.kM\98\1e6×Õ-f7\9aã\fú&>\16\1a\86|Ã:áÁvÝ(MõªT >7\1d*WÏQ\rp\81F£0Jm\97Jò¡$\8d\8eʬº`Á¯*K \80vz\e\15X?þmíðÆa:ðÙÚüwÿîñÇsL~k\83ßHÿdîó\10õýÙÜw\9b6ÕÁ6pC\æi\ f@\95Efaì3r­×/µ\1ccõÿ\ 1n}\80kãõ\92\ 5é#/\98\17îÉ\9de/³:¥\11*\90ï\9d{J#\1eheòl´:Ò·J«Væ¿2¥a\11 hëgÃh¤o\15#+ów¦4
+½à¯\874ÜMÈSÎ\1f\9aΠ T\18a\8e'3Z\9fÃ\8bHq\18\ 1á\7f\92³!5è[GÊÈtÍɲ\1e\0òÔ\13Ã\98õú´\12\96õF\89\9eΩ       ë\89\9eõÚæªYO§m\99\9d\93ÜRC5¹÷ÏG¸\13z4Q·ÉÑïgàÑ\94\rz*è       r!\93ììù¯òò8±Ì7\19\ 2ÿêÂèûÒ\97©AÄ~\98\12¨ý\8a³?ÑÑÞçíõÍÃ\95ù\18\18ê\ 5åØ#:\ 4ã¯Z\8cÙ¡W¬|x\9a;÷'ñ_Á]endstream
+endobj
+3818 0 obj <<
+/Type /Page
+/Contents 3819 0 R
+/Resources 3817 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+>> endobj
+3820 0 obj <<
+/D [3818 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3821 0 obj <<
+/D [3818 0 R /XYZ 71.731 768.009 null]
+>> endobj
+150 0 obj <<
+/D [3818 0 R /XYZ 298.371 755.597 null]
+>> endobj
+3822 0 obj <<
+/D [3818 0 R /XYZ 71.731 745.405 null]
+>> endobj
+3823 0 obj <<
+/D [3818 0 R /XYZ 71.731 745.405 null]
+>> endobj
+154 0 obj <<
+/D [3818 0 R /XYZ 162.317 719.301 null]
+>> endobj
+3824 0 obj <<
+/D [3818 0 R /XYZ 233.126 703.48 null]
+>> endobj
+3825 0 obj <<
+/D [3818 0 R /XYZ 71.731 690.414 null]
+>> endobj
+158 0 obj <<
+/D [3818 0 R /XYZ 174.677 665.191 null]
+>> endobj
+3826 0 obj <<
+/D [3818 0 R /XYZ 71.731 660.235 null]
+>> endobj
+3827 0 obj <<
+/D [3818 0 R /XYZ 71.731 657.844 null]
+>> endobj
+3828 0 obj <<
+/D [3818 0 R /XYZ 136.77 648.691 null]
+>> endobj
+3829 0 obj <<
+/D [3818 0 R /XYZ 158.292 648.691 null]
+>> endobj
+3830 0 obj <<
+/D [3818 0 R /XYZ 179.814 648.691 null]
+>> endobj
+3831 0 obj <<
+/D [3818 0 R /XYZ 197.319 648.691 null]
+>> endobj
+3832 0 obj <<
+/D [3818 0 R /XYZ 214.537 648.691 null]
+>> endobj
+3833 0 obj <<
+/D [3818 0 R /XYZ 322.435 648.691 null]
+>> endobj
+3834 0 obj <<
+/D [3818 0 R /XYZ 404.22 648.691 null]
+>> endobj
+3835 0 obj <<
+/D [3818 0 R /XYZ 71.731 634.909 null]
+>> endobj
+162 0 obj <<
+/D [3818 0 R /XYZ 187.959 609.571 null]
+>> endobj
+3836 0 obj <<
+/D [3818 0 R /XYZ 71.731 607.007 null]
+>> endobj
+3837 0 obj <<
+/D [3818 0 R /XYZ 71.731 602.225 null]
+>> endobj
+3838 0 obj <<
+/D [3818 0 R /XYZ 71.731 602.225 null]
+>> endobj
+3839 0 obj <<
+/D [3818 0 R /XYZ 71.731 591.629 null]
+>> endobj
+3840 0 obj <<
+/D [3818 0 R /XYZ 139.477 577.226 null]
+>> endobj
+3841 0 obj <<
+/D [3818 0 R /XYZ 71.731 574.329 null]
+>> endobj
+3842 0 obj <<
+/D [3818 0 R /XYZ 71.731 574.329 null]
+>> endobj
+3843 0 obj <<
+/D [3818 0 R /XYZ 71.731 563.235 null]
+>> endobj
+3844 0 obj <<
+/D [3818 0 R /XYZ 139.477 548.832 null]
+>> endobj
+3845 0 obj <<
+/D [3818 0 R /XYZ 310.334 548.832 null]
+>> endobj
+3846 0 obj <<
+/D [3818 0 R /XYZ 71.731 545.935 null]
+>> endobj
+3847 0 obj <<
+/D [3818 0 R /XYZ 71.731 545.935 null]
+>> endobj
+3848 0 obj <<
+/D [3818 0 R /XYZ 71.731 534.842 null]
+>> endobj
+3849 0 obj <<
+/D [3818 0 R /XYZ 139.477 520.439 null]
+>> endobj
+3850 0 obj <<
+/D [3818 0 R /XYZ 204.791 520.439 null]
+>> endobj
+3851 0 obj <<
+/D [3818 0 R /XYZ 71.731 516.711 null]
+>> endobj
+166 0 obj <<
+/D [3818 0 R /XYZ 192.609 493.44 null]
+>> endobj
+3852 0 obj <<
+/D [3818 0 R /XYZ 71.731 488.484 null]
+>> endobj
+3853 0 obj <<
+/D [3818 0 R /XYZ 139.782 478.097 null]
+>> endobj
+3854 0 obj <<
+/D [3818 0 R /XYZ 195.188 452.194 null]
+>> endobj
+3855 0 obj <<
+/D [3818 0 R /XYZ 71.731 437.468 null]
+>> endobj
+3095 0 obj <<
+/D [3818 0 R /XYZ 71.731 408.359 null]
+>> endobj
+3856 0 obj <<
+/D [3818 0 R /XYZ 71.731 395.447 null]
+>> endobj
+170 0 obj <<
+/D [3818 0 R /XYZ 293.723 373.067 null]
+>> endobj
+3857 0 obj <<
+/D [3818 0 R /XYZ 71.731 362.876 null]
+>> endobj
+3858 0 obj <<
+/D [3818 0 R /XYZ 71.731 362.876 null]
+>> endobj
+174 0 obj <<
+/D [3818 0 R /XYZ 162.317 336.771 null]
+>> endobj
+3859 0 obj <<
+/D [3818 0 R /XYZ 227.148 320.951 null]
+>> endobj
+3860 0 obj <<
+/D [3818 0 R /XYZ 71.731 318.883 null]
+>> endobj
+178 0 obj <<
+/D [3818 0 R /XYZ 174.677 295.613 null]
+>> endobj
+3861 0 obj <<
+/D [3818 0 R /XYZ 71.731 290.657 null]
+>> endobj
+3862 0 obj <<
+/D [3818 0 R /XYZ 71.731 288.266 null]
+>> endobj
+3863 0 obj <<
+/D [3818 0 R /XYZ 136.77 279.113 null]
+>> endobj
+3864 0 obj <<
+/D [3818 0 R /XYZ 158.292 279.113 null]
+>> endobj
+3865 0 obj <<
+/D [3818 0 R /XYZ 179.814 279.113 null]
+>> endobj
+3866 0 obj <<
+/D [3818 0 R /XYZ 197.319 279.113 null]
+>> endobj
+3867 0 obj <<
+/D [3818 0 R /XYZ 214.537 279.113 null]
+>> endobj
+3868 0 obj <<
+/D [3818 0 R /XYZ 318.131 279.113 null]
+>> endobj
+3869 0 obj <<
+/D [3818 0 R /XYZ 335.348 279.113 null]
+>> endobj
+3870 0 obj <<
+/D [3818 0 R /XYZ 71.731 265.331 null]
+>> endobj
+182 0 obj <<
+/D [3818 0 R /XYZ 187.959 239.993 null]
+>> endobj
+3871 0 obj <<
+/D [3818 0 R /XYZ 71.731 237.429 null]
+>> endobj
+3872 0 obj <<
+/D [3818 0 R /XYZ 71.731 232.647 null]
+>> endobj
+3873 0 obj <<
+/D [3818 0 R /XYZ 71.731 232.647 null]
+>> endobj
+3874 0 obj <<
+/D [3818 0 R /XYZ 71.731 222.051 null]
+>> endobj
+3875 0 obj <<
+/D [3818 0 R /XYZ 139.477 207.648 null]
+>> endobj
+3876 0 obj <<
+/D [3818 0 R /XYZ 71.731 204.751 null]
+>> endobj
+3877 0 obj <<
+/D [3818 0 R /XYZ 71.731 204.751 null]
+>> endobj
+3878 0 obj <<
+/D [3818 0 R /XYZ 71.731 193.657 null]
+>> endobj
+3879 0 obj <<
+/D [3818 0 R /XYZ 139.477 179.254 null]
+>> endobj
+3880 0 obj <<
+/D [3818 0 R /XYZ 310.703 179.254 null]
+>> endobj
+3881 0 obj <<
+/D [3818 0 R /XYZ 71.731 176.357 null]
+>> endobj
+3882 0 obj <<
+/D [3818 0 R /XYZ 71.731 176.357 null]
+>> endobj
+3883 0 obj <<
+/D [3818 0 R /XYZ 71.731 163.909 null]
+>> endobj
+3884 0 obj <<
+/D [3818 0 R /XYZ 139.477 150.861 null]
+>> endobj
+3885 0 obj <<
+/D [3818 0 R /XYZ 71.731 147.133 null]
+>> endobj
+186 0 obj <<
+/D [3818 0 R /XYZ 192.609 123.862 null]
+>> endobj
+3886 0 obj <<
+/D [3818 0 R /XYZ 71.731 118.906 null]
+>> endobj
+3887 0 obj <<
+/D [3818 0 R /XYZ 71.731 104.791 null]
+>> endobj
+3096 0 obj <<
+/D [3818 0 R /XYZ 71.731 76.805 null]
+>> endobj
+3817 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3891 0 obj <<
+/Length 2295      
+/Filter /FlateDecode
+>>
+stream
+xÚ\85\18Ù\8eÛ6ð}¿Â\8f6PqE\1d\96\84\9bÝt\834I\e£/m\11È\16\95\8e=Zôß;\aIɶ²\85\r\883\1c\ e\87s\93ræÃOÎ\12)\92PÎR?\10i\92Î6\87+\7f\83\99wWÒPx\86Ä\eÑü°ºº¾\v\83Y&²e8[mgA\9a\8a(Z\ 2\9f¥\88\96ñlUü6¿ÙçÇN5\v/HÒ¹\14üý «þùú\97ÕBúþÜ\ 3h!çý3ÏݼùÈ\83·\8d\v\7f÷c\1fÈ`\ eFrñÇêýÕíÊ   \17\aR\80\1c¯\89oH.Ä\ f\82\99LD c\94ß\9c1\89c\11g      \89/E\842§É\9c·ç±\13\rÆo\9aÍ^wjÓõ\8d\80g2¨$JD\1aÀþr)Â\8c5²Ú«\85\a\0q\Èt\8e\Ã,\9a\1f\9búQ\17ªåÙV\1fú²Ë+U£r\fò¡W½*x¼©\ f\87¾Ò\9b¼ÓuÅ\1c¶uÃs\87ºQ\96ªÚôM\ 3<TÕ1ªé+\ f%\ 5Íx2\10Y,I®JW;Öv~<\96\86\bâ¹8Wx\10D"\\ 6¤x\19 2g\ f3_D1Í»\ 1ãí"\83y¸:C\ß\1fäìm}õóÕ\8cþÎfv\17oØÆÚlp¹0\11~\16Íb?\11K6Ù\1dêTïÐ\1cd éÉ      \13æh6ÐÊ7-çI?\13I\12 \14IÊ:º}T¤j\7f®òÍ"\99ï\19¨·üÝ\0Ãs«ÀìúOØÄPä\ 6¹Vüí[²g\9aÍ×/\86¼2SlLß\19Ó¿0Ìw¼òi¯Y\18\97\88d\99\9dX\16\ 2    Ð\87\96\1a¿Á¼#?\ 4Ĺ#\ 1Ê\89\fc]AüVyÉ«\1aulT\v¾\94£òÌ\82\80\85\aâ\83Ê«\96\14@\r>\ eÀÝýݧ\13ß\vHBòkãk^\14H\b\12Ýâ(\0·Í×¥2\0Ê\8eÓë^\97\ 5£@úc©\9e\19ß¾´\9d:\18âuNºE¼"»!²6_4UÞ\18\1eye\99¡\1aõÑ*\17\97\9e(÷4b\86\80Ũ©«òÅ\8e\14\ f\18½\83ri\9a\94Û\ e\99\8dÂ\16\ 1õ\9cãa\18øò\9e\14\a)ÒǤ'\9c\0\91XÊpH%A\92Í\8bQ®$\17CäÚL\82ù\7f÷ý\0#¢`\fª\11\ 1\18ù¨\9b®G3#à\8c\86\9a4\85x\14·­·Ý\13Îç\8dYª Uå\1dsOÁ\aÚ6ß©     \85ñÉ)\85\ 3eâäè\14h©íL\ 1\18¶NȺ Î\8aÕ\95Ì­\ e»=f´Q5ái¶?\8f\9ft·¯û\8e\81=\9c`,s
+\8eüÐk£\11+        î7\9d\e9\1aBV\1d})z`Ð(
+\8dp¤3\ 4Ö½ug\84V\96ÚY\18\81Á0è\1d\f¦È¤\93ñ\1e#Î)ÈÒ=ÕÍ_\96\85ÓÏeT\99¸§ \90|Fü\92\80E'TÃ_ç\ 3\b\8có\ 2\v\17Iô^\18sv \95[F\7fX`¦p\82â\94uJ\1cS4÷Ý×O\95AU\13\8a\8ez^qd\ 4\89\19Z\8b\10Z\8c¥L&k¼¥ñFD\0Fiý\9c\91©\18¾­\18a\94bŸØ?KE\b\rÄ«û\e\9a×÷?c\84û\vÞ\96\9d$\9aJ\e\88u9\19ƨNü\9aê\11%\9c\80£ÔøL4
+#\ 4\ ed@ÝQI\ 1¸ÈÕÁòÅäÇ\85#\85:wâ@àh@\13ø\8e\19T\86#U@À\15êQo¨[\ 1@\93Wcþ¯Èß\10G"Á÷ÓÍí/o`(Á\91óê­zd´u]¬#\82\ 1\18ä\evC\cbúÒW
+\ 5²\14ÜÖ\8cr`\bÁýæó=#IQðÝ뢠Á1wÔ\8c;©¦\84é\81]ÃÃ_ùȼ¢Ôë&o^\16ÒDtb#z\9c)\91\10\94JJ¾\8cE«qè\91ç]\ 3E\12\13&&µt\9clS\97=[CZ3Éêæóõýgƹ\ 4\80\13\;\0û\1eÓM\8e\9eü\98ó\14\ 6*\97@\84\8e°!\10\1f\98ZW¤=oR­Õe&\1e\8eÆ\1dbeòæ\8d©\10f\1fÊå6\91cÙ,5p;-]¬\8f[×?ÅáTß\ 4XçðqÀv\ 4\9ck?ÈÉ`"o-\vJòà8dA\98aÿäYL+è\9f)\99\ f\10\98ïÍäàÈÈ\87\1a4X¾V\13VDï§\83f\19ë ô}>gÝZ<¹½\8fÍ\1aìqâa\80Ô\95!*k\ö\17÷Ü\80 È\ 4\82
+
+ÐÅä¡.\9cð@s\96k\9d\f\9a-\87²\1d§,ë\84aû´\18yyG\9c¿\eL\ 6ýÏ\99\91­!¸¥\19׬Ê\94eWUaºkê²´Þ°~a\82ûO7«\ ff[W£±W)A\88Ò\\v?U\93M\ 3\96\10߶Á\91?ê(   íâ\ 5!2\1f\ eÖ\86¶µ7\1f\ 4,«Fm\14$\8b\82¡nßÔýnÏ$O\rß
+®¡8\16\86\85\11\98ù\97¥ëS}ÎXSÁÞa\fÆØ.#\97 \96ómS\1f\18GA\ 4_تë0)á4\ 5zlºr\1c¸\96\ e\9d\1cDj\f\1ec\98´\8bcdz\85n\86Nº1dX\97ñ\8bÆz¶ô­þ[ñvm×ôtñi'4î\82ÌÝ\bO3\ 1h\1cSËN\r·Ãë»(\98%B&\11\15\ 5-*¸¢XF¬\12Þpá-ÙH\87v÷Õ@ÿ\90\ 4pÕóã\99\97Á-\9d\8b¢F£É\14\b¶e¾k¿·rNQlêõÄ|_µzGá\8aÛ\945\1e\86Èu1Am\85j;èЬl\9d\86Ã"â\7fÙCcÓ 8\ 1n¥ª]·ÿß%\eÈWF"t\98ßànúõ§/ï¾~¸ýønõã\1f¼Þ»PÌ¿ßO]V\8dÆÃP\ 4æ\1eÌ\15*NOß\19\0v\852\86\86O5­I¸éÜ\17\ 1\ fö\9cU±IvN\8a ®¶Mî\\87q&õ#3ËÇ^\0\bÀ\e_;\19Ö»¼\ 2\7f\84µq\14£1k\1c-aB\9bü\8e\90*(¶\91d\ruO¡(\88w\99
+gøD-Ïà\15ŹäðP\10§"
+3\10bðF:\ 3[B£É/Ô\9aÅà¿Ò¬ák\vî0¾àÀ\19#á§\13×\1cÌHQ:º0SæÅ\8cDøi1¥\8cE\16\84Ób\82\7f\ 2ë)A¥\9fÐ\93ÕXÒÈôv4à¶\rG¶,²\f~\80ù×\80º\ 2_¯¨\14"ØRq C\ 6A( ·\8dsÜ´ü¡\b\r\15´«Í¤ø\12ØCê\18Ä\87ô\9ae     û0\ eø\96ß\19¨Q%W\1fò\0Ä8ß@\0¼=#oGàäæG\87\91r)ÒLN§¼Q}4õÏ*\ fËØHC8¡í·,{8íp\ 5Öî\9aªì5\7fú^\13ù\81ð\83l\96\9d
+Kâ\r4\17·\8a36ç\97\1az{õ¢\8bÍá.\94È×77$¯n~Ê\86o4\1c\e¡/$¤£\8b7\8bp\99\8d²Ä\92³\ 4£§ý*[B\90\85ßt¬\87^}Ýêm=é\!È\95F'±\81\eiègu^ê¿Ý»\17¶/\85\91\ eê|½á\16\1dAÛöx&\1e ÏÆt°Á\85 #ZÛ·\9bª?¬í{\fUbì{ÊÚ¾blòã@k\1fAöuY\9c½\1fY\15Qëwf<óX\1dD"ó\93W\9fì\a\12ûb\9f\b|ÞÞ\9eñÀCÐ]Í´c÷_V<\bc    y\82\14;~î\8f"È|±Ñkú\8dGùKùþ\ 3\1f\8fmãendstream
+endobj
+3890 0 obj <<
+/Type /Page
+/Contents 3891 0 R
+/Resources 3889 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+/Annots [ 3896 0 R 3903 0 R ]
+>> endobj
+3888 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/home/cvs/ocera/ocera-pc104/doc/WP07/D7.4/lincandoc/img/lincan_arch1.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 3906 0 R 
+/Matrix [1 0 0 1 0 0]
+/BBox [0 0 427 413]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R4 3907 0 R
+>>/Font << /R10 3908 0 R >>
+>>
+/Length 3909 0 R
+/Filter /FlateDecode
+>>
+stream
+x\9c½ÝM\8f\1cÇ\91\ 6àûü\8a\ 6ö`ia\8eóûã(ËZÀ\80½k[\84÷â\8bW¢-\193¢Mií¿¿\99\19\91\91ñF\r\aK\91"\ 4\b\ f«»+;ª2##««§Ý½\ f77ÿÛøêñî\1fw¿øCºýõû»ß\ fÎm\8fãÿ1¥p{¸\8b97°\eøæî¿oßݹûVóí¯wþöí]ðÝß\97z\8b>\8cÍñæc\1e»pîöæÕÝ_þýÎçÛ¿\9e\97òh¨®ÝÇË\1e\9e{X½8<Ùüs\ f\9f\17·:\1f\8b\9fzøË\11\99/óQ\1fZ\9cï«;\8cû­\8f\9evS\9eûÍok÷©\87g»ûÑy8®í¾õÑ/ïæC¥ä[è+"óÒg\1eU/å\ 3ù\96\97^\1f\1do¸Ð\83>Ñ~½Ã\1eòÌÃ_Þå\10ÇÃã8\8exæ9x\1cÏ/°åA¶4ïxKkþ-[Ϋì\9e\1fæ\9b\89÷uvØ\8fÙê7#J7\ 6Ó?në\8c\8dms j\7fõxûåË1R½»\85|\1fn/ÿ2FÞ|À\8fs\95î£+·8zY¾½|¼ûäå«ï\7føêáÛWßýðé˿ݽ\bõ¾äÒo/R\9fOøúî\93ÏÿüÝo_\7f÷í\ f¯ßÜþÍÏç\8cw2\1eù\r>\12\19·8"\98-Ær\9fs¯·\17¾\84½\9f_½úçÚÃ\vïÒ½\1fiE\1aùãç\9fÝ\1e¾ý\9fùà~ì\85Oí¼\ 5yiÏo}%DüÂ÷pïúHIÎ\9fÝ<¾þîë\15Ã}OÕ·Û\8bîì^Æ\e¾¯-\ 6yìóÏþóöõ\9boÿùê\8d4âû}\83Ã:\9ar­ß2\1dÓ¯^\7f÷Ã\9b×\ f\ fô
+_ïs\ fá6\9aãÝQ3y\8c;_n/bYÛÇQüç·o~øß??Ì\87¿xyû=%Ã\9c¸OTêï\8fgK£\ñ0ûýÞæ\82}\96\8f\97g\85l\9f\15ÊyÖÿ?¹ç²²\\99;"®>[\120Õ¶z²\ 3Î\97Mzdq\8bÁ0ÑX0¤\9d%d\r\8bÙ\90\9a(ÈFMTCj¢\19R\13\1dÙW\13Ñ\19®&¢\a\9a\18]\v¹\9a\98ó\ 5p5\11\13ÒS\13Ù\90\9a(È@MTCj¢\19R\13\1d\19W\13É\19®&\92\8bÁ°.FÃÕ5RB\ 6zY6Ì\8bÅÐ/V¤§&\9a!5Ñ\91n5\91\9dáj"{ÃÕD\ eÀØW\139\1a®&rB6j"\eR\13Å\90\9a¨ÈJM4Cj¢#Ëj¢8ÃÕDñ\86«\89\12\90y5ACZ±PI÷[¹i\16t\92g¸rQ\99\87gèwË)³`\û-c\1e\98{\89©ÙýÆF¹*\8f\9fópyÕ\83\14\95\1fj\7fß¼s\86\fÞí\f9¸Ó¢f\b;-jÎ\97QZ\ 4ú\9d\16\91;-"wZ\ 4\86\9d\16\91;-\ 2ãN\8bÈ\9d\16\91;-\ 2ÓN\8bÈ\9d\16\81y§EäN\8bÈ\9d\16\81e§EäN\8bÀºÓ"r§EäN\8bÀ¶Ó"r§EäN\8bÈ\9d\16\91;-\ 2ëN\8bÈ\9d\16\91;-\ 2ËN\8bÈ\9d\16\81y§EäN\8bÈ\9d\16\81i§EäN\8bÀ¸Ó"r§EäN\8bÀ°Ó"r§E ßi\11¹Ó"r§E Ûi\11ù\\86\f.\9a\f¹×?ï\97!Ã(sÍ~Gi\88\19m?çáòªk\86|ßýý\88\fÙ¤\86\1c\94´¨Ø¥pÔlR8\ 2¥pDJZ\ 4JZÔ\94Â\11)iQS
+G¤¤E ¤EM)\1c\91\92\16\15»\14\8eHI\8b@I\8b\9aR8"%-jJá\88\94´\b\94´¨)\85#RÒ"PÒ"PÒ"PÒ¢¦\14\8eHI\8b@I\8b\9aR8"%-jJá\88\94´\b\94´¨Ø¤pDJZÔ\94Â\11)i\11(iQS
+G¤¤EM)\1c\91\92\16\81\92\165¥pD>\9b!Ûe]Ú?D\r\19\9a­ùF¯±\19­Ù\9aïl¹dÈ÷Üß»eÈàÆl\1fÃ\18\12\8fâ9À\82\e\99Ÿ/wë4÷4¦§\8býò\bÎ8,\87\8bãr¼8-\8fqe\9c\97óÅe¹\\\97Gï4^1Î
+ÉxÅè»õ*\1eÇäê\8c\vÅÞ»qe7ãæÎ>µ;»XSìë\98\83éX\8d\8elLǶ^Lç¢\Lm\8dÜ\81n\14\98\8e\98\8eíÈ{Æt.üÅtîÜÅ\89úØÅ\91ú¤³^1º\9a¬½z\8e¶#WãÊ};ZS\8cë\\83)Æyå\13Í1Fk\8a18k:§¡XóX\88ÖtNc·ög\8c\80Õ9Õ.tNs·¦\18\8b³¦\18g:AS\8c9[gÕ\966\8fånM1¦jM1¦dÍ1zk\8a16ãÜOn\ 1«>\f¦\18£³¦\18Cµæs\9a¬Ó\19\v`\8aÑ7ëpr&Ø\9f¾\ 4¦\18½3æÜåªuS¹Z»\9e1\b.4\16ºu&\17ëtÆ\ e\98ÆlwÖá\8cA0\8fÙdÍc6\18¯¹ÉV\ 1Þ\851uÎ\8fý2Ï®òA`x\9f*`ä\98°ö\eb¡êb\8e\1eÚo©÷\9c\9f\86Ö\96æ÷\16|Õ©\ 2>ÔþÞ±
+\98W\rF2­«=2õè\1e­ë\9eyÐ<Ã÷lͯ-ÆYf<c\9eÙ\9a5ÏÀÝ\98\9c\81\8d\eÙ\e\f.X\17r´nê9Úý¼7í=\93'k:&ëØ\82id·lÍ3¹³¦cR\8b5e\9aê­¹\ 2ªÖtîV5\rn;£\eóÌ\90\8c¹RHÝ\9a3q¶æÌí¬yf+Ö\14#-UµóθÆ\9c\89£uÝ\99Õ\98bôÉ\9a3eGÓÂx8[S\8cÎY\87\9d\11\8d9óyë´3\9f\99Ï\98\9fS¬¹2jÖag\cʬ=XSfí    ÍÇdÅ\82¦\15CoÖU\8e    \9aÎÑ\1aSà¼g$cê\ 3®XS\9f\9agNgÍ3g°vª\ f(s\9f÷ź\9d¾\ 4æÊ×Ys\9f\fÖR)\18K%hL1Ò\95\1f\ 4\9d\18\835WFÉ\98\1a\83\8c\9au=c\19L1¦`M1¦d-+<c©\ 4\8dÃÉ9`\8a1{k®|£ñ®|³5çÀjÍ\95o·æ\1cë­óÉ\81\8cº5ÏëÉ\9aW6Í\9a+£`-+\e\92sÐí\8c\1a³à"9\10\9d\ 4§3¦ÀRù\1a\873FÀþä|0÷ao\9cT\1f\ 6·ÓWÁõ\9c#p9}\f\9cO_\ 2S\8ck\ e\ 5S\8c\ 5S\8ctIG\9bb\s:\98b\5\806]¡¡\9a\ 1ÌW8²õ\8cñ\eî5}}¨¸Í³M´~êjÛ©³÷Õ6¹í­åöîw\81\9c:{Ô¼~uâ¸ë÷âxK¦ý\8e\91@Ïé®î-ø*]g\7f\98ý½s\9d=\8eõ¼\85îq\9bûâ\9c³ÁÜwçXEsíج¹FìÖÔ\17ç\1c\8fæZÜ[S\9f\98s?x_Ñ\8aÖ\ë'kz\ fs\r\80æ\9a¾Xó{¨Öü\1e\9aõY\ 3\80)ׯ5\0\9a×\ 6Þ:\91\83õY\ 3 y\r\90¬;9\e7~\ fÅ\9a×\1eÕ\9aßC³®êµÚMµ¥ÝÏ{ÖîîÄ\b
+\1cÎ1\aÇs\8eÀé\9ckp>}\ 6\N\1f\ 3×ÓWÁíômp?cD9q\8d\1a\9aÇN²æ5X°>k04¯Áº5¯Áªu\91\1c\8dæ+ÒÉ\9ab¬ÁºË\1c\0ö\14céÖ^æ\124Ï1Å\9aç¤dM1ÎÏ[Ð\14cñÖ|%°[Ë\95Cc®±\8aõYs\82éáЧæCS\8cóÓ44×\94ÍúÔ èSá¹&\88Ö\CxëSs ¹FiÆ\91k\9ajÍ5}¶æ5@´æ5v°æ5¶³æ5I³\96+\9fƼæÉÖ\14ã\Û )Æ\10\8c¹¦\99k'4¯Ùº5¯ñª5×\94ÙúÔ h\8aÑ\akùäÂ\98kânÍWV«5_S(Æù\S\0¿íùoÝ?¿\87f]Ô{Óæ\18\9duR1jGuL´ù\98Gk¯\8e­¶SçB9\9e56º\9ds
+>×tÐåô\r°|òb,Wæ\8dÏÚ\ 3Ík\8fhíTßVæ±¼Æ\ 2\98ÇB±®gL\81Ë\19\83`\8e¥[«±\fæ±ï­ÃÉ        `\7fr\bø\;\0\84Å\98¯\1d\14ëzr\1a¸\9c\1c\b¦\18c·N'\97\82ãɽ`¾v\10¬ýÉá`¾Ö\99\8cy.^s\ 1\98s{±æ¹ ZóÜѬy®éÖ¼¶tÖ\14ã\9aûÀ<÷\ 5k\9e+£5Ï­        ½k­\9c­ÏÜ\8dæ¹¾ZsmЬy-Ý­¹öpÖ\«xk®m\82µ|\ 2n̵S2æk\7f%[×óZp;ï\rÜOìÚ]\1f[m/ç\14\1d¤Ï £ôIt\92>\8fÎ2¦ÐEÆ,ºJN@7ÉEè\93ë´w_Z¹\14¬æt0Ï)Å\9aç hÍ×\88»5_\93*Ö<'FësÍ\vÍ×ȪµÜ!\83ö|\rÝYó5»jÍ\9f\84&k¾¦\1f¬ßö|Þg±vª-e~Ï­[s\8cÞº\92\83uQÇA\9b?)ÎÖI\1dCmþ\8c¤[\au.´ù3\98`-w(\81w\9ftÙúÔTèSS¡¹ÆpÖ§\86D'é«èS£¢OM\8bæ1Ò¬OÍ\fæ\9c3k\e4\8fÙh}jx4×\1eÅú¬\11Чö@\9fÚ\ 3}Ö,h®=\92\1eŸ\9e5\14\9ak\8fn}Öh賦C\9fÏ0ÐgÍ\88>\9fa Ïg\18è³\86\9d<èý\19F²Vs1XÍÅà³fGó\1aßYó\\1c¬Ï5\ 44ÏÅÙú\£@\9fk\1a`¾' :ësÍ\ 4Í×X¢5_\93ÉÖç\1a\ e\9a¯ù4ës\8d\b}®)¡ù\1aT´æëàO_ew-âÝ,³\13¼×Ý,ù\9e.\vå}õ~Þ`º\8a\14¹û¤¯¶Çò4Éurx\15ÜÍòAö÷nWÙÇÀ\98ßùkón\96íy&\87«u%7ã\95)\87»uZ^_7\ 5Ókç·Lµó\9ayüú\9e):\93£u#'ã5\93ûõmS4Å2¿o\8aîäj¼Vx~}ç\14ͯíÖM½V»\9f÷¬\1dϱBSì¾XS,>XÓ{sÍ\9a\8e¹ËÖt\f\9d·^±ÌSb\Éɺ\91\9dõ\8aqv\1dôºb1\1c­W\8c©vë@ÎÖ\91\1c¬W\8c©4ëLNÖ\14ãüö%\9ab\9cßöDS\8c9ZS\8có{«àL1ÎïÉ¢)Æù½\4Å8¿\a\8c¦\18ç7\8cÑ\14ãüF3\9ab\}\ fL1®1\ 2¦\18\83³¦\18\ 3S\8c>\1a\17\8aÑ{ã·=\7fï3[WÕ\966½g߬³zÏÚtLV\ e\ 1G\15»6\1dó\95+À^\1dCm\8aq\8d}mî\ 3ë\\80\18¬)Æ\98¬)ÆX¬óé\e`\8a19k\8a1yk\8a1Ekî\93Ù\9aûp5æ1\9e\9au;c\ 1Ìc*XS\8c9YS\8c¹X§36Á\14cîÖá\8cq0ÅX¢5ÅX²1åðT\8au;9\aL1Vg]Nî\ 2S\8c5Z§\93\ 3Á\9c\ 3«u8¹\14L16oÍ99\18{Îáɺ\9dÜ\ e.ç=\80ë\19\v`z­sÖô\1c\97¬i\9f®Zç\93sÀéä\16p<9\ 4\1c\0óØ/Öjìk;\1eûÑ\9aÇ~µ®gÌ\82\94¬ó\19k`\1e\vÞ\9aÇB¶\ eg\8c\80y,\ 4kwú¼rê]ú6ºI\1fFWé\eè"}\12\9d¥ï¡)ÆÖ¬)Æ\1e¬)Æ\9e­)ÆÞ­©6sѸQ-çª5Õ~óÏÓ é®!³:Y\7ffg¼¬ì{\80ä/Pe÷\1e÷\0Í¿\82B{ñ\8d÷\9bZæ-|ßû\1cO´¥\ 4jɾê¬N>ÔþÞquÒG\ f­i>\95HóK\1fy^\93f£>^\ 6ôÄ\8e\g¼\8f\ 2\ 5\18\89\1e\99\88\ 1\99\89\11Y\88       Y\89\19Ù\88\ 5I\ 1\95
+¤Ê¢\8f\99\ 4H\ 1\8dÕ<\90\ 2\1a£\ eH\ 1U\8f¤\80Æ\8c\ 3¤\80Æø\ 4Ò[¯      Io}ÌA@zëµ\0©\1eìc|\ 3é­×\86ä·Þ\91ôÖ\9bCÒ[\1fù\ 1Ho}Ì^@:-£\e\ 2\91I\80\14PËH
\15`uò\ 4M/;Ó\fÒ°f\947©y\ 2ÒÌ\12¼f\91\ 3¥Yå j69\ 1\9açd)6''VÓK'Ð\fÒa4£t.Í$\1dQ3K§Õ,ÒÁ5«\f\ 6Í&\ 3G³Ë SìN\ 6¤¦\97Á«\19døk\9e\99$­hfIA\9a\95f\95Ô¦I\ 1å\82ä4\985\9bã4\98\90\9c\ 6#\92\ 2\1a\19\ 3H\ 1\8dì\ 2¤\80F&\ 2R@#k\ 1\91á\80\14ÐÈ\86@
+hdN \ 5\942\90j¬>22\90\ 2\1aÙ\eH\ 1\8dL\ f¤\80Ƭ\0¤\80Ƽ\ 2¤\80Æ\ 2\ 6H\ 1Å\8a¤\80Æâ\ 5H\ 1Å\8c¤\80b\ 2RÝ=ÿ\92\ 2\90\ 2\1a\8b\16 \ 54jh \ 54\16,@
+hԥ@
+h,V\80\14ÐXª\0) ±\ 5H\ 1\8dW\ 3\90\80´\86êã]\ 1\11\ 1\90\ 2\1aÑ\ 2) qd\80\14Ð8\8a@
+h\1c\ 5\19\90\ 2\1aç\17H\ 1ù\84¤\80|\ 4rÙ1ú\18\90\ 2\1aý\11H\ 1\8d¾\v¤\80F?\aR@cL\0) 1~\80\14Ð\18k@
+h\8c\ 54Æ0\90\ 2r\11ÈeÇÈ\r@
+hä\11 \ 54r\ ep\ 54¿ú\ 4\86|ú¹þìLÑ\9d\86\ fw@\ 1YOl\8aù\ 4¯\18Ï\81R\fç *ºs\ 2\ e¹kÌ\93¥YåÄj\16é\ 4\9aI:\8cf\90Î¥éO\9f<ä¡ç\13²I\a×<\83A\93\e®È(ÃIÓËÐÓt2L\159\rÎ!­YdøkfI\15\9a\8af\90\14¤é$])ò\842S\9bf\95\99%ej&I¯\9a'\15k\9e´}¸'ì\91Ë\80<u$$O3\19É\r\17$'þ\8aä\86\e\92§\99\ eäâ)9$Oã\1eÉS~@òÄ\1a\91< '¤;/Sô§ Åpޤ⠠ S3É\81ÒÌrP5\8b\9c\16ͺO,°í®\ 1\94n¤É\a5d¤ß]\19(S\1d0îá\ 4L{è\ 1ó\1e¼À²\87?°î\ 4\ 2l;Ù\0ûNW\8a»´\9c        OÓKÊÔ\f\92^59½\ 6$Ou\ e¹\ 2Z\93\84f!Vd%fd#Fd'z ¥\8aùµVà
+h~y\15\18\88\ 5IÓWKH\9aêZDR@Í#) Ú\91\14P­H
+¨f$\ 5T\13\90Rñü
+(\90\ 2ª\ eI\ 1\95\8e|ú¹¼3\ fÜ\r\a$¿É\88¬çý*\96\13\90"\1d¨Z\90é\1c\12E:\ 1µ!Ã9¨\8a|b\1dÒ\9dÓrÈ\1d¦\ 5d\93\13«I\ 1µ\8c,Òa4¹\13Td\92.§É\9d«#\83tZM\7fúº"wð É\ 3}\ e\11 \ f\9c\84\94A\ 6ä\ 1Y\90y\ f\94\80@)\ 1\81RZ\ 2¥\f\ 5Jɪ٤¼\ 5\9d®\80\15dÙ    \ fÈEdC&É\9e\9a\9cÌ\1d2HÒÕä\92* y©\11\81U\8a\14{@Nü\ 5É\93DEÊ2
+(K. ,Ï\80gRÓ\94e\1fP\96\88\9aE\96\93@\9e\84\v\92\v¸\8aäÒ²!¥¬\ 3JY\aä\ 2Ã#¹\18   H.´"\92\v­\ 4äË¥1#ù\92AAr1R\91\¸4$\179\1dI\ 1ͲNS.\87\0åÒ P.³\0å\92\8cf\92Ë7@.-+\92/\v5$\17\9c\1dÉ\97Ò\1c\92/My$_Æ
+H¾ä\15\91|y,!\9f¼¿l\7f\82\93÷ýeóòâýºvO¿åñ#?Áieý\9d¢± Û¿e1\ eðÜ2\ 6ûþ-\8b\91\92×/\9däÎ-ÙW©Op>ÐþÞñ[ÜeÞk0oË|\14¯;\v˼ç\ 5ÝÉÑ\98î\b,ó3Ot!gcºÓ±Ì{mÐ\89\­+¹\19Ó\9d£eþ\95z4½vÞË\80¦Xæg­`º\13·Ì{\1cÐ\99\1c­)öyï\ 3\98îT¦¶ÀáÄ\b\8eç\18\82é=Ï_\16@Ó{\98÷\16¡éØÎÏêÑt¬æ=qh\8a=$k\8a%8t ;ËË\1cBh\8aqÞ+\84¦\18Ç\14jL1\8eÉÙ\98b\1cO5^1æñ\16\8d\v9[W²·^1æV­;9\19Ó7\arsÖ+Æ\\8bu Gë\15ãü\91\18ãDÎÖ\14ãü\f\1fM1Îß1@S\8c9YS\8c³o£)Æ9¦Àô\r·õ\8b\13h\8aqÞã\80¦\18cµ¦ç̾\8aæ}zãý\1e\825½ç\94¬)ÆT¬é\98¤fMÇ0uë¤\8e\896\9d£\1c­)Æ\9c­)Æ\­\9d:GÊÜÇ\8a³nç\\83\92¬Ëé3`î3Õ:\9d¾\a¦\18«·V}\18Ì}>Y»3\16\949\87äÚ¬\9b\8c)4Åؼ5ÅØ¢5Åزu\921\8e¦\18[·¦\18»³¦\18ç=)h\8a±'c\9a\vr/ÖMr\17\9asT·¦\1cî¼5å|\17­9gfë\93\9c\93\9b5çpgÍ9ß\eW>§Ý\98\9e³~\9d\aMÇ0\LÏ\99÷l\82y\9fÑYÓ1\9c÷`¢é\18Æf]$ç 9'dë$¹\ 2Í9!XsN(Ö^Æ8ÚÉX\ 6\97.c\16Ýdl¢)Æ\9a­Ë\19k`\1e\9aÇH±Vc\ 4Ìc$Zó\18©ÖÔgæ=\83`úfKqɺ\9d>  ®§ï\81i\8cølMcdÞ³\8f¦12ï\19\18\99÷\f¢i\8c¬¾\a¦1²ú6\98b\9cs"xÕÌßÌ^9³uXß aó,Z¬©\9eÇõÌxÆú\8eÉù\1d¡Y·¯»¸ü{}_&ûJ{i~ï×;Þoço³äÐé×\17Câo¼\98W©ïË| ý½ãz&¯¿ë\9c×Á]ä\19Ï#¥¾\ 2òl\1a\91m\8fQÍÈ#7#y\9c\17dÜ£\19È\r7$7Ü\91\1d²ïl \99xn\ eH\9eá#\92\ eÉüÛâ\9aeg\13 7\\90Üp\ 5f¿ó\ e0îY\ 2È9Ç!y¦÷Ⱥó\16\90«÷\bäÜ4_¦\19¥       Í$oR3K\98\9aç\90hV9¨\9a\92¯\81]N¡â\9e\v\1aòt#Í ]N3J§Õ<Ý^\93»\9cCÊú\ 2È«\8b\82äµEFR@9\ 2y^\1f}\ 1ÈU³CR@£\8f\ 1) T\90<?g$Ïæ\11)s?\90W\12\ eÉuECö\9d\9b\ 6\9c\7fw]\93W@\11ÉÙÝ#) ù\97Ø5) \91s\80\14Ðükú\9a\14Ðüí   M
+(D$\ 54ÿ^»&\ 54ÿzÿ!\7f«|Þö\ f¤\80Æb\vH\ 1\8dä\ fä¬\1e\91\14Ð\98¿\81\14\90wH
+È5$\ 5ä
+\92\ 2\1aû\ 4R@.\ 2ym6"\0®\80æ\9dåÀ@lÈH,ÈDLÈL\8cÈBôÈ\15мi\1dØ\88\rÙ\89\ 5Hëìyÿ=\90\ 2\1aã\aH\ 1\8d\11\b¤\80Æ\18\ 6R@c¼\ 3\91\e\80O?÷éýrÃ\ eéÏÛQä\80\ 2p\a\1f\91M\82×ä\83\9a\91å\1cIE
+hä\ 6`:'@1\9e\93¥È\1dÆ!ý9Ý\8a\14P\ f@ê´«Ãh6é\\9a\14PÏÈ"ÝS\93;bE&éà\9aQ\ 6\83&\r\90^\86\93&\ f² ¹\93\8d\8bH\19¼@\1eè\19Yöð\aR\ 2\99¿\ e¡\99v\ 2\ 1Rb\1aÇ\16\18v
+\ 2ú\9d®\80\9c\1c\ 3\90'\89ù\8b\16\9a\14Ðè7ÀºS&°ìô
+ääX\91\9cH\e\92\93nGR@Á!yUî\91¼&\ f@\9eÜCDò\84\92\90<ùd$OT\ 5É\93ZE\9e    Ps¯!\90<±:$OÂ\1eÉ\13v\0rQ6'lM¹Ö\0ä+\r\19I\ 1Å\82¤\80Æj\10H\ 1Å\86äB #ÃÙ\99b<oR1Ið\9a§hÐ,r
+5«t\rÍ&]NótpE>¨Þ!½\fHÍ \ 3]3î´\ 2L;]\ 1óN\83@\99X\81\9cø+R&     O(\1eH\83aNj@JæsI I\89\7f\16ÿ\9a\94HKCR@%#) ¹LÕ¤\80f\91®I\ 1å\8a|ú¹¼3\87L§     E~\93\11\19Î\9bT¤àçBWÓ\9d0\ fù ®E\90"\9d\80¹xÕ¤\80æâJ³È¡Ö\94b\ 4\b\90'l\87äb$ ¥x\ 2r1\92\81¥KçÒ\94\ 2\ eÈ\13¶C\9eN«)E$\90\aCFJq
+\94B\16èe\90iJ\81¬\99Ï\84­É\13vFJ\91\ e\94\82\1e(Å?P\16
+@YT\0e\ 1\ 2\94Å
+P\166\9aé¬\87\82Ió,®4ÏBLó$]Í3©i\9eÅ æY8j\9eE¦æY\90*ƳxÕ<\v]ͳ(Ö<\vhͳØÖ<\vsͳ\88×<\v~Ísq@ó\HP\fç¢\83æ¹@¡y.fh\9e\v\1f\9a3 ËµØ\91¯æµØÄw\92¬\8b\8eëÞ\92qrù~\8c\1fu-6%ú\9d¬Öù^\90y2Ö\96õÕ]^8­ïî¦Ðd\v¾J]\8bý@û{×{KÖïM»u1\96Í÷c4k¾\1f£\eÓ\82©Ð¯NkÓu~úÝieZ\10\96õËÓ`jkýö4\98ÚZ?3¯\1d¹­lÍm\15ãÄmUkn«Ys[Ý\98?_¨Î\9aÚªÞ\98?O\99\7f\ 5\fMmÍ¿\ 2\86¦¶j2®ÜV¶æ¶\8a1\7f\ eX«5·Õ¬¹­nM\9fû4gM\9f×4oM\9f³´`L¥@\99\7fe\fM\9fã´d\¸­lÍm\15kn«\1aóçPóW+ÐÜV7æû¦æ_ÉDS[ó¯O¢©­\1e\8c)\15\97ù«\ 3hj«'ãÀmekn«Xs[ÕØs[Í\9aÛêÆt¹¢Î¿b\89Îd\8f\ e<\ 6g®Ð¦ç\²o¡ì;¿\94»?a¢-ï÷{ñó½ÜÃï»Ë~å÷ÝÇû*ú9\ f\97W©ìû\81ö÷#²ïº³\83³ïþt·®»       \94ù\17\991\ eûL¢ùî¹u7\16\9ebìvÏBS9[ÖÝ[à°{.\9a?\r\9e\9f6£Ó\1e\19Æn\8f$t*{ä\19\87=RÑT\ eÍ\91m\9cv&0v;s ©\9c\98\99Æ8ìÌ\84ömg2ã´3\9f±Û\99\12íÊάÆqghãº3:\9a.T\16u\a\1c\19øï\19\ 6\1dâ\9e\91\8c¹­`\1c¹-oÍm9kjkÝå¤MEô\9c\81\8d©­õA´6\7fª?ÿz\ e\9aÚZw]\81¹­d\¸­hÍm\ 5\9buþõ+4·å¬ù.ÔnÌwý¬»ÏÀugV´{ò~\83\9de\8bͲïy¿\ 1g¼1\1fE³ßñF0\aîç<\^¥²ì\aÚß̲ÿ¸­\1axü{ƤýÕãí\97/ï~ñ\87ùw\90Ç®n/ÿ2\82\99\ f\8cÙkþ\11!w\9fo/\1fï>ùõ\7fÝ^¿¹ýö\8bß~úòoôô¸\9e\1cF-ÝG²\1cçÿå×w\9f|ñ«/å  {\7f/Bsë9s\86\9dOúãç\9fÝ>ûݯç\13_ôÛ\8b\91ªæÖÿøöáÕíõß¿¿ýé\937_ÿüö¯7?¿}ûú«\1f\1eþôé|âüɲu»ÎèPóÙ/?ÿÝ/~ý»õÈ\98NæwV^ÌÂd>ô÷?¿ùþÕ\9bùÐ|S¿Ù\eÆûÿôgc\rpO\e¿zýø÷ÑâÜöÅËÛïK¾¬oç®ÅA,÷ë\8f\9dÝÞ¼\9a§$_\1eV\ fÆç\1eLÏï¸<÷ÚúükÛs¯\r\a׺-_ãyîÑøì£i<Zô£\10Îs¯¬Ï¼²=ûÊù\ 3p+\89õ½2\95-òm\8218VÞ²\e\82ßß%د¹nÙû}Ð\8d¥\16öW\17ö\96\92\97\rÙ9³ëë\96½_h\8c\ 6¬nläD~O;\10»!z¿¿7Á¯¹nÙû\85Æè/üêÆbé\18ÈeCrÅìúºeï\17\1a˵\9aȲ|ßc\1fµË\86\9eÍ®\9fØÂû\85ÆÆLj"+ëo\17«}_7tgvýÄ\16Þ/4VK1\8dÕÔð¨]7´dºÃ\13[\8aþ6\8d\8bë+1s@óaä-^^ØF\9f÷å©-´rX;ßû¹nqA\1d\98\9aĶ·\94fv~Ý2ó$îüºeï\19£ëÕD\17êî\13\12ËeKôÒ)øU×-{ÏÐ\ìÞD\17k4±\·$ïÌί[ö\9e¡¹Ü¼\89.\97hbybKïfçOliþ\1aÝ(WMtE¾\e¶wþÄ\96\9eÌÎ\9fØRó5ºZ\9di®æ`\ eÝ\13[Z3\1dã\89\9dæâ}]\85Q\b0ë=^æî\aÙÒË>\19!ÑкnQ¯2{¦â)_Ú³ÅÀ\83l9{Ïɽe\8b\93í¥K{¶\84x\90-gïé\12_ºÄg÷Lí\95K{¶&y\90-gïå\12_¹Äg÷LíÕK{¶Ìy\90-gïõ\12_½Äg÷LíµK{¶nz\90-gïí\12_»Äg÷LíÍüª
+\99G[\89\ 6\9f÷l\19æÕë'·\9c\17án©­hÛ\8a¶­xi+^Ú\8a¶­øT[)8ý¬G[\a\86³çti+Ù¶Ìnw\9f4q\15\eW¹ÄU.m\15ÛVy*®jÛª6®z\89«^Úª¶­úT[ͶÕl\í\12W»´Õl[í©¶>^\15«[ûéËXÝÚO_ÇêÖ~úBV·öÓW²ºµ\9f¾\94]­}ÄZV·÷1\8aY\88ï#T³º½\8fQÎêö>F=«Ûû\18\ 5­nïcT´T[\9aù Ûù _æ\83|\99\ f²\9d\ fòsóÁO\7f  \85*\13[uÙ«d\ f²åÔXñRuÅKÕe÷¼?Hú?¹\9dù\93endstream
+endobj
+3906 0 obj
+<<
+/Producer (AFPL Ghostscript 7.0)
+/Title (/root/ocera/presentation/RTLWS03/fig/lincan_arch1.fig)
+/Creator (fig2dev Version 3.2 Patchlevel 4)
+/CreationDate (Sat Oct  4 16:34:08 2003)
+/Author (pisa@kotik \(Pavel Pisa\))
+>>
+endobj
+3907 0 obj
+<<
+/Type /ExtGState
+/Name /R4
+/TR /Identity
+/OPM 1
+/SM 0.02
+>>
+endobj
+3908 0 obj
+<<
+/Subtype /Type1
+/BaseFont /PWKFQH#2BTimes-Roman
+/Type /Font
+/Name /R10
+/FontDescriptor 3910 0 R
+/FirstChar 32
+/LastChar 251
+/Widths [ 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 500 500 167 500 500 500 500 180 444 500 333 333 556 556 250 500 500 500 250 250 453 350 333 444 444 500 1000 1000 250 444 250 333 333 333 333 333 333 333 333 250 333 333 250 333 333 333 1000 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 889 250 276 250 250 250 250 611 722 889 310 250 250 250 250 250 667 250 250 250 278 250 250 278 500 722 500]
+>>
+endobj
+3909 0 obj
+7974
+endobj
+3910 0 obj
+<<
+/Type /FontDescriptor
+/FontName /PWKFQH#2BTimes-Roman
+/FontBBox [ -168 -281 1000 924]
+/Flags 34
+/Ascent 924
+/CapHeight 676
+/Descent -281
+/ItalicAngle 0
+/StemV 111
+/MissingWidth 250
+/XHeight 461
+/CharSet (/space/numbersign/parenleft/parenright/comma/slash/one/two/A/C/D/E/F/I/M/N/O/P/S/T/V/a/b/c/d/e/i/l/m/n/o/p/r/s/t/u/v/w)
+/FontFile3 3911 0 R
+>>
+endobj
+3911 0 obj
+<<
+/Subtype /Type1C
+/Filter /FlateDecode
+/Length 3912 0 R
+>>
+stream
+x\9c\9dWyXSgÖ¿1äÞë\ 2íG\9a\91\88&\99ºÖ\ 5\97±\15\8a[E
\8e\v[\80HH"       \90\84\84$\106OØÂ\96\ 4H\ 4\14DP@T\8aËP­\vvµ¶¶Õ.è´\9d.ã´¥ÓùÞK/ó=ß\e\9cg:ÏóÍ_ßóÜ?î{Ï{Ïò{Ïù\9dór\b\9fi\ 4\87Ãá\87ÇîÙ\11±kY\94,[ª^\11©ÌNVx?/c\ 29ÌÜiÌ<.»\81=ý«á×U¼yDh+×\97\11Í"\8eÍõßì?\91ð_\13¾O1_?ýDQ%§\8b\99X\12\1d\19ûܲeË·)Uº\1cYF¦F²zýúõ\92\14\9dä\9f\12I\88T-ËPH\16á\97<©\©Ê\96*4A\92}R©D\93)\95¤ËäRɶWÃãw\87í\94\19\16-Ù)UHs\92å\92ðÜ\14¹,U\12*K\95*ÔÒç$éÊ\1c\89üÉB\92ªT¤É42¥B\1d$Ù¢\96$KÔ*iª\fÿ$Õ¦JU^Ár\89J\9a\93-S«ñ»D¦\96dä$+4Ò4\89F)\91)Rå¹i^óø{ºR¡\91¨r\94X\9e\8d%XU¸R­Q§æÈT\1a ¶\18\1e²ã\89\8f\9aÌd\8d×®Z\86Å\12e:Þ\99¦LÍõFó/\99&Y¦PK4R­Æk'E*I\93©Uòd\1d\8bU©rdS.äªe\8a\8c߬/\97äH3\92sÒäRõ\94^/*¿Å'ù·¨\93U*¹nê_åÔ®\7fÙ\97iÔRyzP\98,;%W-\99:SI\98r½$T\12)ÍÈ\95'çü_Éoçõÿ;A\82 \16mQ¤îU¦\85mSI_\r  ß\9e³C­\91íË\8dÚ\9d\97/O\8eÉNyN²|þÊÕk\96\10ijīD\b\11D\84\13Û\89\95Ä\ 2"\82ØA¬"\16\12«\89EÄ>b1\11ED\13¯\10k\89\18âyb)\11\11{\89­Ä:"\8cØFÌ 8\84/áC<Mø\13|b:±\18ç\1e^J\89û\9c5\1c7çûi²i\1fsøw|Vû\9cæ-áµ\93+ÈJ\92¥\1a¨_é8zrºbú¥é\7f\9f\113ãñÌçf¾3ká¬\8f|×úê|\r¾Wü\96ùmõ³ù}ùÔ\12Tå7\91\ e\1e\14w\8eù½\873\11ã\16\1c¬²4dÞc+\99·\ 3òI6mÒ´\87]d*H¬\10jQ\82\9bJÌwt5U9k\1câa4\9d\87\ä¹eM*û\110
+!G_\1cs\94Ö¢:j²\105\b\10\85º\10Ívñü\98rp1s®qÞ\1aC!cÜfæYAmU\83­\11è®zC\82\98µQ\10i6Æ\95Ñ\ 6\94é¢âª\rMÐG£ÓÔ¥×Ú\9az\81¾Ü!ß-f¥\14\84\16êã½\9bÒ\TB\8d©      .ÓHG}wè\8d\ 3 ×ïÜC? ¬\95    :\999ª@èÇ\84[>`x'9ð \97y\16­\12$nÏPG\ 2½jϧ\88úùÚÝÏú\1cæô\ 6qmn\9d²Uw\f\84'ÚÜíol¿¸.!.?#E\1c\7f\136Ðìï\1e\ 4!®è5\18lî;ÕÙáîì¾Iûýê\vî        \1f7çñ\10Ó:Î\9dx\81y_0\19OA°©pC)\ e¾×Mm­1:á.Í\84Sp×á¸WK»ÙD\8a=2YÉ\160\95<6AK~^ê0ÁVzr)\ 5\v\8cÚà\12ü\9fÉMm¬Ö·ÃO4³\98\93\17yN\12\ 3gébÖtqàkäü\9a\8bª\98$\ 1û»UËX\11\eøí"ä\8füÿòw$B³W~Ï>#.T
+Æn.cç±¼\83;7§¥w\fæ\89\95#\ 5ïcG¾¿xû®È«k\ 4\9a\99\19XÛ#\94?ÆE\8f-\ 2´x\84×Lé\8eV@9Ð\19Å\8dÃbæ-ª´2Q\9fiÙ£\17\16Pu¶Z¨\ 3º¿Þ\92"fWQÒ\1eUc*Ð,\15ÄòØgÙg>Z\8b¦½1à¹xZ¼\87B\1c\1f°ZM\16³.?Ç¢\0:8êSô\14â]¾÷ñë\97÷Ç\88q\92\99=E^àü1p\7f\18\9aÍ\7f\8d\ 2¦\9d\82[\rýn\87³ÁY=P\8d\912i©\81rg\99«Èc¬Ï\80½4û55)`´<v\93\96¼\0ÎâÁýôä^\8a\1f÷\9f\80\9b\1dL\18\86Îob¥q\88ùy\90\ 3\88æN\10L\8c \båñòÈ\92¼\ 2S>\14\81¡ÊP\9bÐ\1c\1fÖC°|oÔö½Ò `§AP÷ó\7f\8c¼õÊ7Ò\1f\0ñà\87áÑÏh]ë\96\90ÝÙÁ \f\85}\9e¤\81¨Ëò¯\ 1qi´û[4\1d-\14]\87\91¼ÁÔ\9e,\97Òý
+\8d1f³[ô­:\94méaünù¿?\86r\1fÍæ\97Ö3ó\ 4õ6;Ô\ 3}ÚnÙ/\9e̤ Öl\ e/¡ù\8bô¨\94â\1fl¥6Û
+\eáM\1a­¦Î\1cî°\9c\a\1aÍø\ 6ù \85èéí_-Ýw('ú\90ø\13ª¤2:/³0J/DK7\vºßè\e¾wy\13K³Ü\84ÍÛöGöu\8b¼i\7f\a)z\10ÕÇa\96£`Aâ¦$Å\1e\88\84¤\93\8aëº\ 1koÅ(\8dFÉâ·-'sz²û\ e\1c\8b\85xد\93Êö§¨B`=Í\8a>x\1eQ¢ïá£\9bç\11A³÷ÑrAãýÓý£0
+\1dJÇZ\1a\9f£±\8fù\9f>\8c,ÉlD$\17ýc"XÀîcç²\vØ\ 3+zV]\8d\10ß\bý*íKì\7f<\9a\8b$èÀ\ f\8a\87Q·Ä¡wÖõ-ÃIæ3\fú¾¬«       §V\0;\13Â\vwäÇ\16åès4\9aÌÌ\83º\188\0\a[3OÅ\ e\1fþ Ã\fã]\8fÏ_¤Ï^¸Üv\r¼¶Á­íg\1eökÝþ_\8e3$âÌæÛþ\868\ 2Øf*ÜTJóåZÔO!\1a~é½ýÆÛ7û¿\82Çðuöý¨k;ï°\9c>v\1eNÝv\92?WK=°Ö\17Á\16¼\7f¼Wpª±î\9cè\11¼]pIv?úÜóÀ\12ÀÎHY÷âþ8E\84i-Щ¦ú\1e±\1fó:¸QÛ ºâµ=6\8e
+¼¶åè \1a\12\9c¨h9z\ 2îÃÕ\86\v\1d·zúFá\1d8o\1cP\9dL\1dZÛµ\ 2\9bl!ù-Zê^q\83\ 5¶Ñ\93Û)XWlÙd}B\15\eª\f\10;ÂäùtÚí\9d(ðöþ\ 5KÃãYJ\94\ fF\9b¦\12ç\14ò\ 6\8d.\9c\ 3Øö\9fÆgó5Ìwèe\81\92\8cg\89$5;\1fh\15\99\0É5V{iUE#´Ð\bP\10õ9¸
+\1dÁt;2hHkJ\99Ál,Ô+\8b÷c\87\82P\ eÙU[Û)B\81$Nó6CËjú8Y\8eæó&»H¾\rûZâ0Âvz\12\13Øv£a+\ 66DËôS~è\11æñ\97=\9c»c\;3Gପ·5\ 1}¼¾à\90\98­¢ ÞjÝcÂüluQ;«ô.¸N£\ªçÂ\95NQ-Ô\976Z\9a\8d\8d%\ e ;\-]½y\1e\19\9eHB\12Äß`¾\89ÉÍ(\f×
+\9f\80<úo\81f2jT À\11\97t\86\97°ï\v½¾×x}\9fû\1f|ÿä7ß1ÎÁfoRLá¼±\1a\a4R \85ÔgÐbhz\11\ 3+´´\99<L\90§°Í\1fn£õïÏæ/Gï¡w\ 5eh.ÏLVT\14Y\8f\1e-\ 3a     X*Í54¿¥.7·úHà\86ȸmûzR\1f&\8ao\1c>\93ߢ\ 6¹ðP\962N$\ 3¹CÛ\96w¼¨½ð:]À®r\90ö\86êJ\8c\ f\1e\9c\15í¸Ö[Jº:ËZ\ 3?yëÆûWÔ½¯ö\89Yâ-e³á8t
+\aOu\rc2é\96µ¯¡ýÐ)Ë\b3«Ç\1fP)»wl6ÿ!ªÃ\14Æ¿³\bÑdÃѪ\12\91µ¨¤Èj\91F%%\16\94Ñü\87fk\89µt\ e\94Û*ª*hþ\9d×Ù«äºî¤\9b¢Ë0ÐÑ;RØ\18\90\97£·ä\ 2\9dnè|S\8cÎRü\87?\91Ø\b\99®3\1eä;î\7f\ 5\17´ÍÛaVFñ\f\98ú\9b*\1d¶z\10vL\1d¯\81\82m\16ó\ eoûµ¸¨Ý5Å\r^8\11ÅgâP\9e@¥Ñ(\95m\9a®\93ím'»4í
+o½\18ûr=\f{Næñ?ù\b\19\7f\9aÍ\9fËìÃT\91G\96iÌf=X@_­¯£ù½Îôôº¬À$8¤?¬È\94ë\92!\16^\1aÚ\87|Â?\90\8e¤\1c\97Ö\17Öä\81\9aÞ\15\7f`«h\r\84^\8bG~´\86ìf3ym$?Ômkrº\ 2\97¹­X\97a`°x0\10Q_=øùó¨·Ù\80»âgo$\ fÁUúÚù\81Û¸\8f\9f×\9eÉ8\95å<Ò\1c\8e\93ÆÛ\11oDz\98\17[\8cNÿÛchÇ\98×Gõ\15A)yÀ\8c[!ú\v»\86â÷ê©ÛåM\16\88§Y\13\ 5ÊR£Ñ¬Ê\95\9b²\81NË:}^ÌoA\ fØEFêR¹Ó\0\a\86Úp)îCQ?\9cmîì¼p! \98â\87VW\ñô5þÑ)\9cªeæ¯ç9È2ÎEö      B0YNÁ\vfs°7M_sSë«\8d\ eL\aLÝU
+\91Цkg§Ñ\1dd      ÚÈ\9b\1c%KØ\8d¼\ e²\ 3qÚÝÈ\a³!®Æ'\83\bÖEyIps¡i]9Vt\ 5+ª*ðò\8aw\ 4ùÐé\18ó6Ö+Zêai\93\19Ó\1e\ eÜèa6x8Ì\11\9cV¬Ø@ö\94», \ 5K\85¥Ì²\84m
+X\88êK\9cåN¨\17Bk£ýL\15íbã\fÔ@\85Ý2¼\0Íb\a\ 3*Kª¬UŵºÚâZ¨\ 5»ÃÕ\8f\9e\ 2N¾Wkï®\9aj\12O\f¼\87\r\18¨ÓÖ\ 6+èÁP¢6«V³9\ 1ë\90F?\f\0\ e!´5Ú/Ú±úC\ 6ª¿¬Éì\89¶kíÚZÝ*61`     r\965T4@\83\10\8e\9d®Æ»v\19¨ö\8a:K[\1c
+d¿\ fhÊ®3ÖB\rÔ9\9aNàNi\rø3kv¦W\97Ô\82Ð\ e5õÍ\83x6ú! õ|U\8d\a\9b ¦2\9eó`\8cë\9eà
+jÉF[\93\rÏ6=\r\8f\8fP\10m,\f-ÅémvQ¡Õ¦\ 6¸F3ßQe\95±z©e\87~j\9e¼\1ey\83       èðw\7f\81\96\9d_ÂÞ\11è\8d¦R\ 3Ð\1a«sH\8cb)\18)=ièÈíKr\87\ 3½bKB¨Æ\93ßÞqÌÓV}´æ¨]\Q\7f´\ eìtgOÛàåNE´(\8cb\83öê\8b\93¤¹ùF\19\1c¦ùq¡C\87FECpîØè\bÍwÄÖ´æ\9d\v<\8dÃ?3\80\85ìÊ/\ 4 /-Ê3©\8dÊ¢< 3\95§/\88«)¸y®\ fù\ eÑS3Ö\84/\9eâ÷N,\15°ÉZòZy«\19\94P`U\99²ÙÅ\93Ü\0v\19úóá\ f\8bÛÁ%\ 4·³¡§²\1a\1amN\eN\ f·\96º\á4^X\83\8eN\ e\a¸H\94ÃÜè}ÐØx©Jè7áÆT1o\84\83Ç\99PïÃuã\11ÞQUç\1dáOÔ\17$\8aÙZ/~\86}G1~9.*¦ÒÐ\bgit\86\82ʺ\ 6»ýxû\85\963@\ fµen\17³Ù\14ì3\9b#½L¢qQ\916C\vܦQ\rÕ}¡·u\18èë­ª`1\9b\81¯\ 4ÅÅ\11V¼Ié¢\8eTfW\16¶ÂY!J¡Ð\8c´[\eE\11\10w$:Bw]Ö\19\r\87@i\f\ e¥?ÂÃ\7f\9c\16\ fÿ\ 6¡·²{\98\99orÞ\19Cù_rÑ\8a\89\97\ 5¥\95É\ 6UñþB¡¢\98W@ÕÚªÁ\ eô`}Q²x²\99\92?<ü)
+\18GÓÐ|ôÔ¦ï\16\8b "#?\81\8eñ9{±oäþ\95\97Y?\96\9b¸g}ìÁöã"\x\13\v<\1c´ñ\11w\80Ý.¸w©ûDÿðÝ?\9dù\11Ðt@Ϥ?þÃxÊ¥#m±=¦\82\80OC;3»6wìjÜ\ 4\8ba~a°*L\19\9a\9d±-\ 2Wo\15~J<\ 5\7fóÿñìl~Ò\17ìï\ 5ïö¾6
+·è+\99g\ ffâˤ\88\7f,«]Û\87\9b§ÝVk£ùI\95v\0[`]mIq\962=:]ì½Wá\8bÛ54ç\1az\ 5\17[\16ê\10,&=h\ eï\97kKÉnt\90\17Af³\a\90<5µ\90{\173¢Ð42\8f\9dÃcé¨ÿ&\ f³rÞ\r²\17Éyh\ e\96{\17§¼\v\ eÉ\8aP\84 ß»o\ ey\fëÄåcôL\88\83\98Æw\91¬î\1f;xï\91O.w¯;ïz8ã\8f¸hÈ;\rîZÅ3RM5\8dÕÕ\95­ö\96ê\ 6 \8fÕ\e²ÄÞkÒábMA\91¡ÈX\9eìÍ\95\93.j\83­ \ 1.ÑÌcÊ«éc¦ý\1e\a\8d>â2J4OPX\93\1eYXt\10\84l1\89\90¯¾=û1Ü\17þøâ'óEQ\10\9b\9b\9e\9a%3déC\8e\95\ 6\fþµ¯ç\ eÐc×#×½| hÝ\1a\83\8dà\99\989Ô?\8f\v°s\97°s[\12³\8f¤\1f\bY\9b¹\18ØéÀòû\9fûrá¹Ä\13¹#YMÍ\ 1/½©<£úHý®ùcø\11~q|Þy»ëvwß\a7h¿|\ f\13ãAQ\1e²{ÆÃ\99Ýu³f=l\9dåK\10ÿ\v\98+uÌendstream
+endobj
+3912 0 obj
+4149
+endobj
+3896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.946 386.55 198.332 395.899]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_arch1) >>
+>> endobj
+3903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [402.029 75.371 449.719 84.721]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canhardware1) >>
+>> endobj
+3892 0 obj <<
+/D [3890 0 R /XYZ 71.731 802.878 null]
+>> endobj
+190 0 obj <<
+/D [3890 0 R /XYZ 360.724 755.597 null]
+>> endobj
+3893 0 obj <<
+/D [3890 0 R /XYZ 71.731 751.947 null]
+>> endobj
+3474 0 obj <<
+/D [3890 0 R /XYZ 206.953 726.251 null]
+>> endobj
+3894 0 obj <<
+/D [3890 0 R /XYZ 71.731 710.411 null]
+>> endobj
+3895 0 obj <<
+/D [3890 0 R /XYZ 71.731 451.307 null]
+>> endobj
+3897 0 obj <<
+/D [3890 0 R /XYZ 71.731 335.036 null]
+>> endobj
+3898 0 obj <<
+/D [3890 0 R /XYZ 71.731 253.714 null]
+>> endobj
+3899 0 obj <<
+/D [3890 0 R /XYZ 71.731 142.196 null]
+>> endobj
+3900 0 obj <<
+/D [3890 0 R /XYZ 377.991 116.293 null]
+>> endobj
+3901 0 obj <<
+/D [3890 0 R /XYZ 235.475 103.342 null]
+>> endobj
+3902 0 obj <<
+/D [3890 0 R /XYZ 122.869 90.39 null]
+>> endobj
+3904 0 obj <<
+/D [3890 0 R /XYZ 71.731 73.711 null]
+>> endobj
+3905 0 obj <<
+/D [3890 0 R /XYZ 215.635 62.826 null]
+>> endobj
+3475 0 obj <<
+/D [3890 0 R /XYZ 363.683 49.875 null]
+>> endobj
+3889 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R >>
+/XObject << /Im1 3888 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3918 0 obj <<
+/Length 2463      
+/Filter /FlateDecode
+>>
+stream
+xÚ¥\19]sÛ8î=¿Â\8fÎL¬\88Ô÷c·ÛÞäæî:»ë·Û\9b\8cbÓ6¯2¥ê#iúë\17_\94e[Ívg'\99!\b\82\0\b\80  «E\b\7fj\91© \8bÔ"\ fu\90gùbs¼      \17{XùÇ\8d\12\8a\95\90¬&4?­oî?FzQ\ 4E\1a-Ö»\85Îó \8e\93\ 6q\9a,ÖÛÿ.ß\1fʦ7ííJgùR\ 5<þ˺áëý¯ë[\15\86Ë\15ÌnÕrøÊkïßý\87\81\9f[ûì7þ\1e&!\90Á\1a@êö\7fë\7fÞ|X\8fÊ%Z\ 5 Ç[êGº\bT\14-V*J\ 2­\88hñe\11\ 6qB$#Àx¿O0_n.\10÷\ fG½ø¹¾ùåfAÿ£\1cUè@åÙb\95¦Y\90¦£\99ôÄLª\b\ 3\9d,Ò$\ 6MÈH\1foU¾´û¡5pÜ<[ª\95\ e\18âC3|4]\a\86*÷Bõñáã'\86챩ÌѸ¾ìmíÐ< 1;I\¥Q\90*\8d§\ f²\9c\ fÀ&JÒeYU\b$Ë®ªûNp­a\eÝg³ed_3®÷;w­\19ɺ^vîÈÛ\bZPÖÙÞ\96\95ýF\8a\ 5\8c\17É,\90Q\9bÒ1êIX·æË`º\1eDÃa ú\820OA}\1d\14   «ÿôz»J2o\ 4\84¬k\86\9eÁÎn\rC\9el7¸ÍÉ6ñÔ\e©\ e2\8d\ eD¶ \b\b~ÜÙ]ý¸7ý£u¤ä\95EU¤\82$ÌdWÀBè`$\9f\ eFJu<þ\1e\86ºªÐ\92¢\15\1dK\17\10\ 2:\97\83\85^&\17G±^n˾d¨t[\ 6\90#\8e£g\10çÈ7\0±9\10\82c\fÂ\ 5\8d\80ã÷\8d !ZãBÏ\18\ 1lúÃF 3EE\1e\14Eqæ¬\87Ýí*ÎÕ²iͳ­\87®zåùÉË0\rÅl¸\80\87ÄÑyD7l6`\98ÝPù½'\8bâìI°h°;á![7xg\9c\90\19/¸2e7Ù|e\91ðÌ)S\8b\94Ouû\86\br\9f>\ 5F\1c+\ e\f\ 4ꡧ E\98\83\94°;\1e{ÐÔS²# \v\16ê\18\ 4ûuÆm.¶µ¦ÜJ@yéSã˵ÖiDVÂ\11\ 3\ 1dÍÇB\96\11t\1d
+¨È#\9cà\a\ f\8e\82Ðñ8RÊ@\0ö¢`\9eXQ«5ýÐ:ôÆTÉþà×w\ 3f\12
+Ý;¹8\90ñcÈ¡S\1f¡¿u\9e2W\18\9b¶Æ\90\90\ 2!þä{\9c\914\18ßH\109$ÍbÆ\1e\98þþ\8a=rI}¨M\ 3'bý¬ÛËÅÑ\19<\vç¾£¼¨\vM\81\8bcSw}S³­
+¼ø<²}\ 1ØÀÉ\18Âè \9d\80iÛº\955\19\ fv\7f0\ 27­­[Û¿òlÌB¼4jJs¹¶¤vx\99\95¯í\97\ 4Q1\17Oå¾´î\r\ 3&QPÄ~£÷\ fÞ¨D/ßá£\85\0\9c\1cO\8c 'éxJo\18\ 2uÓÛ£ýF·\1dwÔ<\82IùΤE\10EéY,íJ|ÏÒ0æ°A ;Àµ¿cøå`7·ÙòÀ3ãʧÊt<AîDþê\88¤­\9dý\ 6Î6\88Æ·\13á#Ó`ì\11mcݪª\91þ³`̱l@ ç\8aZ\[{?\94mézCn\82$××GÐ\8b`WÂ\95b±8å`Ph­cÀ \87bá3\rB\17e\ 4ã:\19«jè0AµeÏѧ$ú\94\8f>ÎÉTÅ\\14hJ\15A\ 2¦\8d\vÎ-s\15\9a§YM\88¸t\9aÆÄ\ 5#)\9e±xÂ"s¥¯äÃó¦ã?\91/4oË¿`4¾{Si\1a\9eÅ(Ê\16\11¸*,â¿_jF³¥¦\17³\9aȹ®5ó$\bÓb¡áUNãø;Õf4Smn}ù\r\94\rr*e¢ú\85á}\vaÊ Ùî!ZgJÏ$H\14h©sJ\ 3cé©3¨a\88\96\95y6\15ãN²2.g:&)[Á½\80Ì\86B0ãÒ\ 6Wßã\99¸sТ
+\81\ e\e¸
+F¸`#q\9d¢"\ 5îÌ.Ê\1fäò8\93\97à}ÌBÿ\1e`;rç\v\9f$Hsu\96GN\89B+ÉH\b\füü(xÚàFQ6\ 6øtr iJ\9fp\15¦ªþÅ\18'\0õ!°©\8fø\148zÝ\95d|àãË\b\84Å\8bØg\ 5LÅÆG>`\97RX!M\94-W3I¦\eS\81O"\18%£¹a>FJ\11âÉ$aÀc\ 2ªùTá]\82Ù¢æqS;g6ýÈ\93\1a@LcNö\9cúC|þý2Ú³BÖÝ=\bk»3\95Åê\16Òì*Ö)\11\1flÓñ\8c8\13º>\1e\ag7\92ç\10U?ý\1f\94énuBE\e`>\94â:\9c\80<|\e\15,ß1æäZ\9cQÁª¡Ê\80\97\801ôÌÀx¨+\91\8a6ðܶ$énÆÞ\87\12\vüLÚ­LZ"\98ãk9ð ;÷Ò\86YpÑÈ ¤¹ Î¡~J<íxIЫ\ 1óç&\rÄJ[\858R\9b\90\18
\13ºõ\1e\12Ê\92/*âÊÖ?¬y\ eÉZ\9d\9fÎ\905\80Ù\©\15cnLD+먫¼R\1d\1aø<M&\ 5¶×\16\ 1ë ¬1^\9eͽ96XÎ\900*ºÇ#\10
+«ç,æÇ\8b\968D\11äÒ\ 1\0¯n¼¤8Á¥\99æ)\87ü;\16*v[\99k¥5¦_oo\7f\199t¶a|\16½Ü饠 ^P¸X\b§|\0D\8a\ fRߣ§^I¢r²s®ÍU\ 1T\12¢\81°¾¶m1i褩\a~\9bº\85\f
+ÉfK)   EQt¦þc@ê£\eQc%©ø2!\ e\1dt¥ÓJ\87*PJ]\96¼?Üqd\90p/\vD¼a1\17α\86\ 4hzÓ\1e­3\8c§>\11Ðæk    Èò´\81Â\ 1\16¼Ñ\11\87\ 6è|cŲÎ\1a\ e꿨¹¡x\89¹£ÁqLå´\8e\99\0[xha\9bþ^ªi\9fi\80`}ðû '"\8d0)?\eÁCÙßYN-±T°\80\1d:\91Ð\95G/ëµ13Iåì¾2¸Ãg'â»±¯Ù¯\99äH¾÷\90%GôÖ¶F\8akqê4G\8cj_å\ 6Y§Ï;\0<qIJËÏF\90ô\1a^gqV0\99T\ 48¡¶\1f\9a%òq#\99ö/8ó{Ùæ%õÌÄ«ì>\8fG\80ùCÏ#}U!.¦\81\8bµåÙ¨Ân ôHp_¶{ÓÏ=\95¢Sì5îä{YÍXà½5¨¿cþñôdà\a°\8d<B4\aÕëv;òô\ ÚlË\14Ó#Çrä\98C\8098\91\83ç¸V\17Ô\19Ü\16\1a\b 
+#¡\ 6`W\ e\95àúºB\8fµ#ÑIc\98lá~´öià[\84\18ù\10\85\84u+Tc­\80\93'lå±F\10\17\0êßS\96\10\99XØÀûÛ\96ü\ 1\80\19s|Ë\ 5\fÎ]½å`ó§ÆÀ\8d2ì°ÌÆzÚi;\8bsÿ\81èôØ&§VÈ¿·%z§~\96eú6qmÑÓ=\88à&u<¾\98ª
+\18ä\v\ 3\0¼´KÈ@M%sº3\11^:\bm)\8cب\93ÅÚ    õEù\12E\89\94/"\90Ê\1f\84ú\97\98T6Ý×\rÝ?¬]\\877\ 4\1dÝ       Æ\8fÔôIÇǤ<rÖ\a ±ô!i¦ç\8b c\16yºÈ\12\8bù\8fòB²:Ñ\u\\17l.\e\ 1ú\97+áE\1a¨$~S¸\90¼)ü\9c\8d\14\1c(s}àoßz¬\81\1e°
+ú$\86+½nÖÉ\a«,\85ç÷üã\ e·Íбú7\aapEïÑT\b\ 3P;éä\ 1Fi÷Ò²Ã\94ÚsDs­C(ÇãȾ;Ô/\823\12tTç]ØL~áÑqP@      ðÖo@'\12ÿ\13\10¶OÔ\e\9dñÀC~zÿá×wò³ÏÃok\ 6¢D\85\9a\1fôéïGq\1c\a¡¯ì\8aïüÊs­ß\1ff\80\bæendstream
+endobj
+3917 0 obj <<
+/Type /Page
+/Contents 3918 0 R
+/Resources 3916 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+/Annots [ 3927 0 R 3936 0 R ]
+>> endobj
+3913 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/home/cvs/ocera/ocera-pc104/doc/WP07/D7.4/lincandoc/img/lincan_canqueue1.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 3938 0 R 
+/Matrix [1 0 0 1 0 0]
+/BBox [0 0 570 223]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R4 3939 0 R
+>>/Font << /R10 3940 0 R >>
+>>
+/Length 3941 0 R
+/Filter /FlateDecode
+>>
+stream
+x\9c\8d]K¯&·qÝß_qw\91\ 5dÒ|\93Û\0Ùe£d\80,\ 5A\9e\91\15LKÐÃ\bòïÃf=Nññ\8dc\ 3òõ\11»xª\9a,\16\8bÅþ®\ fο_Ï\7få\8f\1fï·ßÞþå?âûO\7f¼}×ÿ|°»ÿÓÕTß¿¼Å\92濯þÇßÞþëý\97·ëC-éý§7÷þó\9bË\1frÎéݧöÁåòîbö\1fÒ»K½Åï\9fÞ>\7fûæÒûÿü£fÿÙûýé-ä+~pý_Ö§qél:\12,òåA<#N\91ëCÞ\90§MѧRk\8c8Eê@²iS\18A\9b<$'Ó&\8f6É´I£M\9c\90§M0OÅÑ&\986¤©7H\18\8a\90ZÉ<U6$ÏH\7f\8a\88i38GÛfè\15f$?\88yjØÇÛ6\8c\986dUÛ\86,\8f6òv,â\1eä\1aOÅj^ó\f\ 5\82\9c\81Ò\ eåýÁz\82ò¡\11¢Ì³\eãÊh§\88\16\9b<Èl·ìübÛ\a\99í\9fÝÐmG\92\953ÆC¶È:\1e\18©32FQ^\103\86ù©              Ë\`ÝÍ\9c\12\8bÙ¹\19çÙÚ§ÿo½ëðüg8\1dû÷\8f÷û¿~ì\1eÈ]ï¾ÛìýãçîQ\9e\7fáÞ}ÿG\1fýîýãýöÍ\8f?üòÛß?ýýÓ÷\9f\7fþüë÷\7fþåã\7f¿ÅÖ\9dÇ?ûòþñ¯oß|þòÃO\7f\7f\ÊÇ\7f\7fûæÓï¿ÿúû÷?þú×O\7fù§·o¾ýÛ§\1fþ:þøöÏ\1f~þ2þúüåç?þ\1c\7f}úåÏßÿ·ÿõo\1fß¿{\vþ\1a¶ññ\1anêî\8e«$\8b|y\90¡å\83dA<!\ e\b\8d\94èõ©Ü¨MÐ6¹\12\92Ð\86æSÌh\93INE\9b1¾}2}\95ÑfG²ô¥zí\88êõ¸êEø­H\8eÍ\12x\86ar\ví\9cü¢ZNqQ?§´\98(§¼\98\ 2\84Ü[ª\8bj9\81\ f#±(RÛ\19±&ZÍ8Ô\9f\85ß}á\vaî®#\89\10¡Ô\912ÓîH\9dU\8b%^³ú\1d\89:âg3v$\10âÐ&̪õ¾è©\1d   i5Ñ\8e¨^]ýUø­\88O\97%àì\80\14Ú\18´¢\1a\ 6¶¨\8fÁ/&Â\ 4\113b\12\89©1ÑD5\fZE\12\9eò×\19±&ZÍ8Ô\9f\87îöY³Ï,}jGì`ó)ò\98¬\1c\11½\87¾,KÔ\14B\8avÈv\ f\9d¦\ 6Þ±\ 5y\90í\rÚüò¶\ 6¡Tr@*aú×ÑGz!)\9d\bºîÆÇ\92Õ\92ø\8aà\87¼Xu¶\ 6?\16ÃXÕ\r\ 6Zjbѹ\19h\r\8fE}\85§`¤\9bM\91:\86ë\83°d_\1a!    \88§§Ô3øL\92+$§a³Ø. Ä§U cô¦K\19zzSÉ¡¯4FTò\11Èè=\ 5\ fd\8cÞ\84\85Ãç\8b\10H&Ï\99\124-\14¬%ð©\14\bd\aûP_\19\0êi#\96¿\1a!\17,\9fIrÆÛ \84à)O\9abI
+\81ø\ 4¼¯0ÞEòxË\81úr\rH%\8b9ûÔ°j\02\8d\1fòÀ\89ÆlôX\80\88@4\8b\ 2\89\8a©\ 1¡×
+\83d"\193<\1e9\93\98U\91ç=\f\92º\8e§\98\17Ú\8f%V$lOÑëp\17ÚÐ\8b¾*ÚÐ\80¹Ôø\89µð;\12\81Ð\84òÁJ\1e\88\aBÃÞ;ô5Ù\90\fË31¹¨³5Ò\9b\ 5¥@¾=]\17\10\9a¿\rãÁ\91ÑÌ{\9c%sw³¨cw\91\a@Í"*\92\9f\8cõ\ 2âÄ9¼¦´Ò~\b,¢îSw\89\83n\b\17$ãÅq¨\9eÃkJ\eí1\92gQ÷±»Ô\bÁèJUƶ{E`#ù8ûgDôÿ\13tñêëèðl!ÉPé\8bV"D¼¨\ f¼ÉÓÉå\ 3EJ!£M\1dÃ)\94K\11ò½¡à©Brj\ 22&NhÁ¶yh_\1e\b\93«÷E/W=IGh"ë4é\9cÉ!¨§õ\91ö\8aQ}T×\9d¦IP9ÑQ_Qû\1a"\1fäR$Ðz\11ª"<\95BT\84V\87è\e\90<O·\1e        Q\e\87§2ÉÑÁß\91HöA_\82\80O¦wZÁ\99Ö¯P {¢6êè:gÚÊ'èNî1$´¡1lÇÆ<~hPe\1a\9f\9e\17â>¨2\85v!«ú94¡¤H!D_=ûð    ¡=qQ£¥2\bx\f\98Ä»ªæ\818j£})r\ 1!9µ\ 2¡8¨fÈ\19/Úc¸æDa­®\ eþ    ÕW\84â¡\\81P\b\96\eä°Å\1cÚL6äÙ\1aÈÚÜì\99­\1c\r6\8c«HÛÌ\96\97÷è\eÞ£¿èíW´\99$sw³ð§»JVº0e
+iwA8Ûöò\e\120\906J;íUµA©Ò˽Ä=úDi\12\97ñ*/JÈ%¼¸\8bS\17Î"nA(u\81±\9d8e\b¿wRmS\7ffÈA;ç<8ÒxhÓhwQ_A
+\9c\11T+ñ:îàXx­w¡à)Î\11\1aÄ\13\82§\ eêï&\9a\182m\9an\8ewm\ fíTæf>QtêR\ 1B\8aè\16u lIE(mi¬}Pv7ÈÄ\87IRÀ,\ 3à!I\v\84k @Á°kº\18%Úĸ
+ûÓ\92á*,yPdSvî\9d)ÍÝ\rJdð\ 6](\99ê±ú<éÌ\81À½Ðkò!|\8dö¢ÚðÀ³¨ûØ\1dç 5°é\b\e\1f\9f={Å\0\92\8dö 0\8bºÏÝ\91\83m ä\89d\8b*|'°\92|º«\89\ 3\12\1d\ 35\ eÿ\19¢vW)º\ e\18N5PÎUS\a¾zZ_¢®\1d\95H\86¨/¥R¦8DõÞ¥ÑZ\96"\10
+¢²\8e·"\ 1R\ 5\92%\1cr\82\ 3\13I\eøI\96\13¯\80¾\82\84C\8aоÆéTªä\ 1°#èzQ|è\vt¿(h¹`\1f\ e\87`\1fÚ²=m\ 4\89\1ch¡/Z\ 1\9fý\88 YÃ3EhÏâ`çBÁ\ f\1ci¥$^À\8aP98Ä\f­\85#\ 4ôN«\7fÀÚZ)©\18à²j\ e\14Æà\9dÎã\87\12;\91Lä³ì}âH-Ø\ 1\13#\13\88Ñ"£M\ 1Âì)BYMt\17\ 3©\1f\90é\1a\1aØá:\10· e\1eÀ\1d!E4\82\1dÈó\94úÕñÔ@d\98õX\96\16߬iÆç=°îÚ\86Ã\18\8f6M\12\86ç8RX\91\8e5&d²ªÌ_2ZÑõ±Ñ\ 2á³¾ý\96)A§É\8a\1e=P\96\eÞ¸r\10\8bmÈ"\99º[D\9dº\v\8e<\ fV¨à\1c-\91\9a\87é\byõø\15J\eí'\85\88ºOÝyZÅ
+\1dî\10B)ôg\1a       2\86\99áFi§ý\10XDݧîÆfåñÆÚÝ3Ë\87«7mhÑ,\86äJi£ý\10XDݧî8ÞvNE1b\ fîv\ 6\eË\91´äÓ+§
+\17òìæl·Fò\Πì\17\fÂ\91«vW\1cåz>èIÙÒ\17\11XDݧî\1aÍÌÒ\f2^^Á\11p#o\92¡ïNi£ý\10XDÝ\87îú\1c§SW¯®á¢­µó\9aL¿*k'Îâ@i£ýøÓEÔ}êÎU>\82¯@(¾Ñ\8dPG8䪠¹PÚi?\ 4\16Q÷©;ϧkºÂEO®Ùû\ 4\84Ü¥w¯)m´Gj|\16u\9fº\e±Ç³ñÓ££@ÉD¯\99î\8eè\ 6Ò½¢´Ñ~\b,¢îcw\1cÍ8=ö\88\1cñè®ï@`#I¹~rF\17¥Ú\9et\1eåJÜEÿ;ò¹\14Ó_\94W\19\99A~Ê5iC'1\1dñÒ\86w}×U\ 4áMÎu\89d>\ fèH\10\84£g\83PNÊ>EvëH\15\84÷*\97Ó§\123$^\9cÇ\1fm¼ðñ\14\80\ eM\ 5!OuQvÈ"É\99§\ 6B\e\r+9WEX\8b"\16\eËô\83\ f\9fjtDùðP¿\9aJ\16k4}\8a\vW.:)À)\8by*ð\11ÿ#YÞ\8eÓÞ\9d¾Á!§\88î!@\vyïI5\15\84­ªÖXÆ\ f\rªB¯,y\19ÃN#WÍíVZM\91ìëH\9a\8ePjÏ´\91x\17rÈèÉ\e\84\ e-\90\7fW¤lOU´¡ô·Nó\8e\8cÁ\99\f\1fz\89c\8fKH©QÚ(â7\84Î\f¼\9ej¨}Ê\86LsÓU\1e{Yæ&\97Ü\YÆyä\12) ì\1cúSÅ´YÞ\9aÌVJé|ÙúâTû,üÉt{\1eZQ\ 6ö8)[\10\1eØñRÄ­.¥IwJéH{Rm$ßçî\9ec$\11~ÉHæ\1d©ñ\18ٱݮK\91ñ|kHÙ\8bM\94äI\91EÙQ[0w÷P"·ÖLý\aÕS5S#BSº\99ê\93:lÒt\97ÞI\ e\89­\19dSdUvP\9a»ë\94
+e·«æú\aÒÿª\19Ã\92\8a\834>ï¯\19´É[µ\90¿¢Èªìð       ³ðûH \ eíJ\ 5\ 1\8bæsûL\19\ 4
+\8e~\v½\9eªÛ\95]\91A`\16u\9fº«´f\15Í\1eº'\95ðtwÁ  Ð°,8K;PZi?\ 4\16Q÷±;\1a`ÙÃ\vÑ\e\7f\10%Iµ#8\94Ý)m´\a\81YÔ}ìNÎ\89\8dM\86\13\9e\90\8dÀJrtç£}ð>
+'\7f\9e\1cÌëô\809¿$0K\96H\86\8d Çr|æý\98Å\89ߣ\82\9efÎÅÇèÍUGøs\9aþ´)8=¥]tÆa^ \84ZÎêÀ=\95tf\1cK?g\10ÏS\18\96²ËÒ=¼ãØ2kP:*    F_¦Ú\80¬mª\1f(&Ézìá<W½h:Õy:L5CËÓ\.8Ìö\14X\16g$\ fÎ\ 5\v%G;\ 5N\89«\1f
+
+à<\9df\95\bkP\ 5XA%Ù³w\1d\bê<(qVPI橼¶ f"\\81ÚàÜ\9a§\8c&\r;B³Xó)ý\9dRñ$Â\ 6®_)8\80\ f\8a\86Ðëø¡4\84\ f\\82&     &\1fx/i\ eDyÄ"'+\açU³\8dR\90¡®Æ3É\84ó-\96\9c\91;S¤Ù6nA¨\90\ eys6QÆYZ CS\8bP\95,&B×\94+Û4ÿè¥úÍ´¡©¡I1EôÕ\ fdX,¯r\90\9f]¬*Ñ\8e\93ÑÈó7\92\19\8bæÅ\1c\9fe\16\ 4`\91\ 2\92\82`/PÒày\8f:B&É\1cÛÌ¢\8eÝ¥JS\ 6E\8a\896­f\88¦Ê\ 3²¼¦´Ñ\1e\91Ì,ê>uW(¶)E笠\96ÒJ`#9\96?~PS¥\aá\95*N
\18\ 4Ñ\94â\81À"\99\9d¿<¨Þx\17Þh\99.ð«\8d¶¨\ 5\1e²±GBIÐNié\8b\b,¢îCwþ
+q\16Õ\11zwH\ e^´ù5®l§´Ñ~\Ç"ê>uçho\´\ 6·#DRc§\8e°7+ ¹PÚi\8f2ÂYÔ}ì\8ev=\18\99\1d!]P\96áhs]4qq ´Ñ\1e\ 4fQ÷©;O«mq\ 6!]PQáÉ}a-;QZi\ fï=\8bº\8fÝ%^:Õ\7fr `\86\87÷\14îg\94\94\83À,ê>vGó\171\80ç<oÖ̾÷\85£\v\9dÒJ{\10\98EÝÇî\1a{uxþª\1eû5\81\95ä\18ó\94Ý\b\rc\9e¢ \80\ 5ëª\94ªÒ\9a*ϹAS\87ĹAs Ä\99\94\80\83Þ«ða¡*re>×QE®´\9cµø+ÒQS0\13\9cÎltGÓ\91\8b\10Höz\f)\b×`a\99ã<\17êl:Â\957ê*\eíß\83ño´W
\91m\¹¥ç©£Í°*¬A\ 1\7f¼`1®µÕè¥3ä#½\b\84\ f\ 2ay:Í5\87\8e\12Ã\ 4\8bñ1$4M\\98\98`yâ\83J)Î"E\a;SþÓÔ\84]\é{\81á<~ø(\88)\ 5Y(ÃEç\10Ñ      ípQòjB8u/Â;\92\85R\9eÛèöÇ7Ê\12'\9cq6\1aÀOu£"K½cG<!8Râ\9cÏ¥\1e²Q\0\14.\9cUS7
+AM)[£-ÌSî¶"\90\13\96ÜZG¸l.@²·6ü²Y\95ç/×·iq§wä¯\9eR8ñ´\\15§1yGèu À»øü\12^n\91Ì\vÄ,êØ\9d'w\81Ü\9d÷\95sw\88K\e\15I»ü\9aÒF{¸ÇYÔ}ê\8e\13S       \aØ\91v\7f   \85qñâJîü\9aÒF{\14KÍ¢îcwtón\Ê\12\846¤¨0H\94\ fJ¦èp£´Ñ\1e\ 4fá7U«äg/o*ZhÓ±#:\95:B\8b\b\16Ö\ 3¥\8dö¦\1a\95æLÝ=\85)\99Ö,,÷\99r\82\13Bmô\80©#´I\87Ý\12Í\Kò È¢ì¨\95\99\85ß'\ 2r}è\8a@hÓ×PPBÕ\99   5F\99<§!¹)ò\10XDݧî¸ê%\15\83ÐS¨éäLQÊ\86äJi£=\8eÿgQ÷±;
+       \90\1e\97â\ f3\9b¸\88äI­æW\94\83À,ê>u×øÊ\aB\8bÆE½\ 5>\96î¾D\ 4\e\aJ+í±\fÍ¢îcw\14\8cÅ"gqh/   l$Çñ?\171{1xð´}ÀB\1c<n\b(ÂuEI\11ö¨ºî\ 4ÏA\91¾ßÀÇU(PV¤:´¡°M+}\ 3\10Ì\8cÞ\1d\ 5<ÊÇÍAQð\81«µ´\8cÃÓ¹\ f
+k\82§
+\89 )¦à)_1!Z+ÆO9JD\aSüÁÁ§)\10)u\ eÉ\82£W\16ô\95u\84$ëF58.ëÑ\90L\91æÖ§Z\83dz_\1a\ 3t\84ã\96d\19f\e8\ 5×\82\84[b\ròÛQÏ\8f\82\97"x¼w.\827È<~hP\ 52Q¬âZ\ 3\97ðFu#!rt§[\9b\8eplé\80P$©åÂ!ò\82«ÁL\88|¤¥)è\10+_\95ñ\e\ 29d"\ 4`!\962\87[\1d\ 3ÃrE\97A\ 2_\84×\ 4W\b\8dï\83]@øv\87\98\bH´m\8cÅxnÒ\8d\ 6ðÌMÏñ\1eÆ°Ï\8b²\9e¢2c\10O\aL¨±[%Ã\15\18Qçîøҩàá\1d"Â]¾É\96\1d\1cÈ\81ÒB{\10\98\85?\ 4xùÓã³ÀGð¹Á\edÎ1B;¾ô\8bYs ´Ó^U\e\94æî\1eJ\9cO\ e\10EÛØ\120\95\1f \9cÏ\80\ 2\9caã4 \8eI>s/\ 1î\91·Ãµ}EÙÕ \83öÜ]§Í\87õEK\ f\83$05Ë\1aø\82ß\84Ôí)NËcèr\eÝ;\ 4Ï_\99ðå+Ê®\ 6\19~cîî¡Í97Ø\96/k\19û\87Èi"\9dË!ði\ 2f%¥\8b\91·      Áq²ôÿ¡Z´Cbéî!Éé&¸\97@ÛRämB Ã\8b\f¿\1dhíË\r\94¨\82¿h\ 5íI\91UÙAi\16~\1f      4¾@®ËVà05Án¥Í)\9a\10È\ 3?G­ù\85"\83À,ê>uÇWª\10\96\87H\85:ù2Î\93C÷ë+\94VÚ£\88p\16u\1f»ózÀ§\bù%Í®ô§è\ 2§\19\ 3\e¥\8d6U1N¢îcw\9câhX\ 4iXFLçÈ»l,(;¥\8dö 0\8bº\8fÝQ\ 29V¬°\1cì\95ú\15\ 2+ɧ;þü\81\l{¾´Ãq\bb\83Ì\97ñ\10IæÊé\1a\9d\ 5\8f\9aõÀU\rfÑç\83~Ô¾\ f$S}¼>E\15áP$7¾!v¡wzJ\13ã\83á\88Ü \87\v»\11If¾V\17!\99cTD\809\96%&\94[mæ)¾c\80(1Ó±xÀ\1cÉ\8e\19ê åï¨à:\96|5eÜ¡\14\84¢ÍZ-âlż|}\ 5I0ù\1a\8c\89
+2\9d0"q\172×JÁmfÉðÀ>´n>#A\11Î\1dá½s g\90yüpe,goªnF\1a\85è£À\9c\1el®-\e\8dÆ%^\88Ü\9a×,¥¶¡1¬\97®{\98V%Þs\v\82§pÁ[\11\8a[0\\e_K\86\19\eÍ;\83pAWÔ|cGxnf´áy\97Ð\86ÂoÝ2\ 3q\16ÉÅ|\8f`µ!ÏVJÚ˽\8bg¶f\ e\89ëòF\909\f\99ªy\8d\898i`r\9b\8bäÉ9\88¨sw\14\93gÝ8\84̹\1d\ f\ 2\8d\132  Ós§´Ð\1e\ 4fQ÷©»B\97ú
+2·\85Ï­4o3*Ã\9d-f8QZi\8f"óYøSdN\93½h-GGø8O'ráj\ 1lu9ýRôfÅ\81Ò\81öªÚ 4w÷P¢\ 1_0ä
+\97a45o¡÷;!N\10!I\85©\ 5ûÐ\9e½` \96ÄÅKhÃÑ\8e^\878©¿\9ah(2w÷(B;µ\82àJj¥,R\ 5\11\ 2\95UÓ1Yèô§è\15â!Ç\11í\fÕ\86"É"«²\8bAèc)SwOÙÿÅå[\98Î|â       ßÎ7Ê\86\86\82\90M
+ìVXNû\8a"«²\83Ò,ü>\11¨TË\84J\98\8eP0\8f\94HåãÎ\b\vÐ\1dûR0nWE\86Ã\9fEÝÇîx\94"J¬üU#¼Ü\1aÖ0u§´Ñ¦»\18\93¨ûØ]æ2\12tÇ10B;¾6\96\rí\9dÒJ\9b\96¼IÔ}ì\8eO\8b°\v®\9cÐ@ÜÈwä\92Y\1avJ+íA`\16u\9fºküu\18|´¨R\rUÂ~¶Ò\86\ eßy9QZi\ f\ 2³¨ûÔ]ã/V`\99kt \r\9f
+\1a\a)_¡´Ò\1e×afQ÷±;\ e\96\10p¶Ks8î\15\81\8d$}H\85¾°§ß\b\93ÏèTS~F\89\97\8aâ7Þ\9cV\8d\97F¹à\83 \88.\10¥\8a/¹ðN¼êýOÇ\aOU3!\8eOØ-Bwv*\8aÖøÃC\15¥\98\9c\95­æ\ 3F\94Q©¨lç\8cJE¥\13WdU=/s\9eÎF«)Ï£u¡â[<\ýe\8a\8a=\1d¦W[¬H6D\91-\97\14VS¬H5ßµá)º\8eÞ4\rå<ùÒvA/ÚÅ4M\15:O{ÛvA2Õ\997M]öwAÖÐUR®KT|:\8a+ú*\8eà\ 3íì\9eë­\8aÐ\eD è2~øF\15ÇWY<yßPQ\80­W\88;Bá½\8eØ\1eús¬\88\eU>ʨÎ\82ð7°ô\16«ã¨Ø<%H\ 2B\9bV\9d/\1dá\82F\\8câ\ f!é²\15]t\vÂEù8ý\89WæãE½G*ºë\82\18¯D9a\r\e\80\14È\99,Æs\93\8aûk1\1fý!DSp\8e·Ã\15\91\9e¥º@\13¿¢$c\91\18\9aD\1d»Ët\10ßP;\9di\87Þ4ºs¼µlºK:PÚh\8f\ 2þYÔ}ê®ò\15\86d\10*Îǽ\ 3®¦n\9a\ 3<PÚhS­ø$ê>u×ø\9aC5\bUþc\9a4:ámz\96w ´Ñ\1eõ{³¨ûÐ\9dw\99o\91\|\rÍ»,\97Åø\ 2\97çs\99¦Ëý\81ÒF\9bª×&Q÷©»\10øVWÈ\ 6\19m\ 2ß\19ñz\8b\8aö\19'J;í\87À"ê>u\17\e_Q¡Íå@ø\86Nâë0\ 3\19rÈï\1e)m´©6`\12u\9fºË\91¯\9fT1x\8eÜ])\8a0íâ\rÉ\99ÒF{\1c»Ï¢îSw\85ÖMçä /\95¯¤µb\90ñTs/)m´Ç±û,ê>uÇY\ eÇ^| ¤\8b\93»\90\ 3\19m®×\946ÚãÐy\16u\1fº\v\\8eå\9c¼»\81\8c6ò~\81È\85Í\ 3¥\8dö\13\83-¢îSw|Ðé\(+ây î\ 4v\92ãÖ½\8arÜÝ.\9cO(:Ò6$(RY8_f<PZú\9a\ ehDÔ}ê\8e¿­Ö\91l\90Ù&|þh^ÁNi£MG´\93¨ûÔ]äï\99;Ïï.DyÊ;Eøf¾K/)m´G¾z\16u\9fºKt×´\v\97î\92è"×ÐBÒ\11Þ\94öJi£ý\10XDݧî2\7f¬çªU\11¾\ 6+\17l%c<fô+J\eí\91¤\9aEݧîJâ\9bËI\86\1f\1cÏ\ f\90\97+Jr¥´Ñ¦DÊ$ê>uÇwcq\ 5;T¹\9cè¢"r5²½¤´Ñ¦íÿ$ê>vG\1e»!ÝÁÛº\96ÍFoÈiH\9bï\946Ú´ù\9dDݧî\1a\9aùÊ\ 1\85²Í&\81i©Ezó@i¥=ö\9e³¨ûÐ]äK\98\15Dz\8dFxÅqC£-I\8dØ\8dn\94\83À,ê>t\17ùÒ5®TÄ\8b¼dÑ\1a¿(\97\ 5Êõ\15J+í±s\99EÝÇî(w\97u\1fÝ\11Ê¥`\7fÁµ \19{\90\8dÒN{\10\98Eݧî\1cíæ\92\96Fw\84J#4¹\11\95\84\86îvJ+íñ1\8aYÔ}ì\8e.[%|aG\9eÊ_!°\91\1cÝ9þH\b\fNk\15¾\8a\189bÃ\97\13;¢_WÔ6ôY\89\86­\99ãïôaèJ_xM\14\84ûV-â\9eoJÀn´\ 5\b\17¶xä\16\ e\b¦  ëµ#Ðk¼îYø­H4\83\99O\9dÌ®\93kÚ˪\1a¾C-êã,UL\84Ê=1cÔÍ\85\98:V·¨\86o^+bF2\7fÆwC¬\89V3\ eõgáÏ\87G\9c[ºã;&\86\92wq¡í%½pᩲ¨ï7\13y1\11¾ Â_l\80©=\e\rªù\8b\9fÚ\90TW£íHµo\7f\11~+\12.¨Ïßļ®\85\19´~\eØ^\ 6vZLd&\b\9bÑL"6µ\99\9a\99\8c\8c\987ëøø{C¬\89V3\ eõgQ÷©»mÖ\1cf\96ÈÙ\11;ØÂó\v\rκ\9a\90ø\87%Tøø\90ÓäjBâ/ØàÜS?ä\1a\81°óÑE9å6¿\91\8eÔù­\rdr5!åÅ\92]r{\81 \0`½vdr5«ð[\11¸\1a¡\84ñ/´1GD5Ì#Qß\94\890\1fÅ\8c\98³bjÌkQ\rsD\11¬ã©-\ 3I\10k¢Õ\8cCýYø\13^òñ1º+|2\ eJ%§ÙÕ\84ÂF\83j%·EýRØ\1fâxQL\84s::;6¦.ô©_£Záóô\1dIu5Ú\8eXW³
+¿\151v+ü\8dB\94i1I3D\8b\fõUY3ÔÙ f:°ÑÌ\94\9aiÅÆ7S\8f\95\93\11Ë\99\ eÈvÄ\1am5ì0È,ê>u·Í£Ã\\139;2\r?ï'WóìñCZºã-±±\0ïÒ\8d\95\16çã¼~³X\9e\92¾ÌG\ 3óâ|8#`Þ¬£ÓmcI\17Ê2³\ 4\81²¬×\8eÌÎg\11~+b\9c\ fS23\82i\9bYê\99\99Åê\9bÙÇ&23\94Íhf1\9bÚÌtVÍx\ 3A0\90\lgÄ\9ah5ãP\7f\16þä7üµtǧ-\86\12\9fÄ\19ÚA\8e?P\91(&ªhS\17ç\13üêÃù#!ÆÔüi\b£Zpë<\12ÄÜ#\90ß®Ø\90Éù,ÂoE\8c«aJf@\ 6¿®\98¬\9a\19ØA\ 6vZLd&\b\9bÑL"6µ\99ha\r3\ 41o\96\ fÑvÄ\9ah5£\14\12Ï\83\7fïn\9b5\87\99\15ÖÈg'9.\r\91¾A+ç}\91\89¬\97}
+\1dt\ 6\9c/@\ 5{\93\8b\97\ 3|ä7°gÃ\87\80=\8f\7fÍê\17Ï\94\1aÚ°"øè°g7búj/\10ÜÀ\15½vÄÖí¯ÂoEàj\84\12Æ¿Ð6w¦Xµh¾\83ÌŨ:×ÄDæ2T      Ë\9c\15Sc^\8bj\98#\8a\14ÈIËÒ/\885ÑjFº4×fWã\e\17[¢»Æ\1fY\ 6¥æ\96ðÌ7§\91\8f>Uæ8§#\8b«ñ͵9Îñ\8d\1d\1dLÝüªZ»ê\v$ÕÕh;b]Í*üV$à\9bÎLÉ\fH¦m\ 6-«f\ 6v\93Ì\0®¹9võ¸\83Ì\17ä1\89ØÔf¢±jf2
+\827[Û:A\18±&ZÍ8Ô\9fEݧî¶Ys\98YòÔ\8eL\83-z\8dX¸»\10Ü\1c2yvìæw/\82øº\806Ëæt|)([ÇîÕ\8dg ~^ ä\eDXD\80èõ[þ¡¦\ 3\82[´¬×\8eLQÍ*üVÄ\8cv&if\84\985¬¬\99Yl\103ûØhf\86Ê"\8eY,¿A\85\99.\b\86Mà¯ûn\885Èj4:\99\r\8bcI\92uÁÍbv\b \94\ 2ÚiMCù$&ªh³\9a(\89\89\12Ú¤ÅÔI\ 2HHæLÑ\8eÀ\8d\88^;29\96Eø­\bb\18¡d\86_\92a¼ªf\86q\92a\9c\16\13\99é\90\13\16\9f\93qq\1e¢\82\987\9b.\7f\89V3\ eõgQ÷©»m\8e\1cæ\91ÈÙ\91i°]>Z7ò\14BÈVH\v±ÚêX:Rç\\8dk\12\1fâK#\12\1fâk$ë\eq|(\8c·æ\1aÿ\0\ 3¾ª×Ö9â\9aDP\e\ 2eY¯\1d\99\1cË*üV\ 41\8cP2?4È´Í\8f\b¶u\1e\89ú\98kb"ó+eMr\95(qY]\8d¨f~
+Q\10|Y«­®F\10\83«Y\85?U(\9b«q\9b«q²¥B©\8cw³j\1d      K\f#5fp5Rc\ 6Wã6W£;SHÞ\\8d[]\8dêµ#\93«Y\84ß\8a\98ië6çã6çãd¨¯Ê\1açãd¨§ÅhÆù°a\8dóq\9bóq\9b7p\9bóáò\91\1d±F[\r;\f²9\9f½»m\1e\1dæ\9aÛ\9cÏFòÉKóÇåÌ\99T¬k^:ÖÅ\ 21Ö<[)Æ\1agKÆX\17kGùY&¤îc]2l\91/\8c\9b#\80¸¦\85clî\ 5\82¬8ëµ#ó\99Ô"üVÄ\9cI1%sP´Ía
+«f\ e\X}s(Ã&2\a7lFs¸Ã¦6\a\9a9$\12\ 4'\ eé
+gÄ\9ah5ãP\7f\16ÞÕÏ%.Ýå\92g\7fØ\91ÅgÆ\Ú¢Z®K\9e¼#«\89r]|xGâbê\\17W\13ó\9aáT\ 4'P¢×\8eLgR\8bð[\11s&Å\94Ì\80ÌuY1E53°s]NIÄDf\82°\19Í$bS\9b\89\96å§õü¢¬y³9/\87\ 2\82X\13­f\1cêÏ¢îSwÛ¬9Ì,\91³#Ë©\ 4]\ 1ø@?Òq\9f~\dÿA\90í\87<\ e?öqøI\92¥³Áà»·ÿ\ 3yÓÙsendstream
+endobj
+3938 0 obj
+<<
+/Producer (AFPL Ghostscript 7.0)
+/Title (/root/ocera/presentation/RTLWS03/fig/lincan_canqueue1.fig)
+/Creator (fig2dev Version 3.2 Patchlevel 4)
+/CreationDate (Sat Oct  4 15:59:58 2003)
+/Author (pisa@kotik \(Pavel Pisa\))
+>>
+endobj
+3939 0 obj
+<<
+/Type /ExtGState
+/Name /R4
+/TR /Identity
+/OPM 1
+/SM 0.02
+>>
+endobj
+3940 0 obj
+<<
+/Subtype /Type1
+/BaseFont /APCXUL#2BTimes-Roman
+/Type /Font
+/Name /R10
+/FontDescriptor 3942 0 R
+/FirstChar 32
+/LastChar 251
+/Widths [ 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 500 500 167 500 500 500 500 180 444 500 333 333 556 556 250 500 500 500 250 250 453 350 333 444 444 500 1000 1000 250 444 250 333 333 333 333 333 333 333 333 250 333 333 250 333 333 333 1000 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 889 250 276 250 250 250 250 611 722 889 310 250 250 250 250 250 667 250 250 250 278 250 250 278 500 722 500]
+>>
+endobj
+3941 0 obj
+8068
+endobj
+3942 0 obj
+<<
+/Type /FontDescriptor
+/FontName /APCXUL#2BTimes-Roman
+/FontBBox [ -168 -281 1000 924]
+/Flags 34
+/Ascent 924
+/CapHeight 676
+/Descent -281
+/ItalicAngle 0
+/StemV 111
+/MissingWidth 250
+/XHeight 461
+/CharSet (/asterisk/underscore/a/c/d/e/f/g/h/i/l/n/o/q/r/s/t/u/y)
+/FontFile3 3943 0 R
+>>
+endobj
+3943 0 obj
+<<
+/Subtype /Type1C
+/Filter /FlateDecode
+/Length 3944 0 R
+>>
+stream
+x\9c\9dU[TSW\1a>1\92³W½´%M%jsÎtuÙ\8b\96\99\96\8e\9dÖ\82RGTD@@)\ 48\84`HB.\84\84\!  \97\r!\17\b!\81\84\8b$ÈUT´V\18êuÁX\1d/S§ÚN±\ f\9diu\1e¦³ÚµO{|\98\13\9cÕÎZó6/gí³ÿ½¿ïÿ÷ÿíos°åË0\ e\87Ãß\96\99\9a\97\93±1[ZE©_ÎRT\89åñé\8dô:\ e½~\19ý\f\97ÙÊ\8cÿdüisÂ3XF/w\15-Z\89õ­_Q\9eøã¯\9e¤\7fz\9cþú\89G@m\9c\18ç\fçÇ\17\ e¼¸qã¦T\85\92J*4ä«)))d\89\9eüO\84L£ÔR\89\9cÜÀ\ ej(\99BYEÉ5Éä~\8a"5\15\14Y.\95QdêÞÌü\9d{ÒÉ\17Ò÷ä\90é\94\9cR\89ed¦¶D&-%3¤¥\94\M½H\96+T¤ìÑ\ f\90\97I5R\85\\9dLnS\93bR­¤J¥ì&ª¶\94\ 3\9bH%¥ª\92ªÕì\98\94ªI\89J,×Pe¤FAJå¥2mY\9c\9e\9d/WÈ5¤R¥`ãUl\84\85ÊT¨5êR\95T©!YÆÌ´\1d\8frÔT\885q^µ\94\r\93\8arve\99¢T\e¯æç\98F,\95«I\r\89ó\94Pd\99\94\89õ,/\v¥TI\97RЪ¥rÉ/ì\9bH\15%\11«Êd\94z     7~*¿ÔGþWÕb¥R¦_Ú«XZõ3¿T£¦dåÉ{¤U%Z5¹ÔSr\8f"\85Ì ³(\89V&Výoä\97\7f\1dÄ0\8c¯\97\97*ʨêr\95D]¡\91²</\15aX\ 1\17KÃ2±íØ\ e,\vKÇöcïcÙØN,\aû=\96\8bíÆÞÃV`ïbO±\12Â\96cv\8cæìãô.[¿Ì´ì\aî~î\89å­      \e\12Â<.OÌ»\85?\81\9f\ 4=`\1c¹VÓM\8c|\91\9e\8fph\ 5\9d+`Ö\19y£¡úºÆ\16G\93\9dx\89\19fpäqt7\ 6 _\b{\83ÞSm È\94\98ð¡Æ\1e«Ï\80xLK\92«!X\15Ë\ fI Q\b\8d\9a\fC\95©Z[k\82\ eXßfs×z\rí\ 6\b4:\9dºrT5}íì\ 5ôÜ9\ 2\9b\ 2£þÎA\97\90å\87AzíyÎ\95E\94¶È\rÑÏ
+<®ÎV?\ 4±\ ec\ 1Á´â0ËjÊk\ 4FT\11ÄóÚ\8d]p\12 qüì\87ý]c\10Ì\fÊv\12\f\85Ã\f³!?¾¨,\88\17¸-]p\ 6 =þmÑ\85m¢B(3¤ï\ 2wq{[\81^jÍ®c93m·è\84a\ eü\8cK?\8b6\v\ en\97¨³ Ø¼ës\84ÿëüÍ/&\ 3ÖòN£õ)zõ}P8Ô\1f\1e¸°ý£7
+òt\92\12"¿H\91\ e·\ 2æé»É\88\10\9e\bM\8eD\aÃÑ£\97\ 1[\8c-Fo\89qàרûk.rÑÅ\ 2æéÍ\e\19\11³î\9b\r(\11%>ø\ 1\89Ð\9aWî3O\11f\85`ñòFæ\19\83ôwËÊ\a\10\8a¹º\eð&¸ÿÑÂMQ\1ck\ e\86èÇX´¯\90n\91\8bþa\13 çç\12B¸¾¥\196A ið\9f!è+¸³í ¡Â¶Ë ¬Ã}­\1eè\83àX\87­\84`6ãÔ¨Ò_
+\ 1\83'3   Ì³ÌS·_GË.LE>\1a'vá\88³\1cÚí\16\9bU¯SÙä\10¼\99ý9z\1c%Ì|ú\97\8fg\ eå\12ñ3º\8eä£\b\9fäÐ\9bÐ\9b\82\83ï\14ËwÁ,X<,¿¨\9f²\8f\ 34ÏkøÄ6¬\1a­\9a,ì;\0óá!=%=T¢L\83)\80\11Ýú5ÂE÷áíËÓ\b\ 3Ì\1d´Ià¿3~l\1eÎÃAEàõøY1Uݦ\1e\945O'Æ\12Ù\1aë\16×ð\8dè!ý¶ 0ZÕQÆæýäFf9ó\1c\93xuË·\97Î\ f\9d=M0\998ܯ7¦9\ 1\7fÆ\80¬ÝxvW\83\ fN\ 3ú¾\15\7f\8fùR\0Õ\8df[\83¶¶Ò"\832¨ìÔE\ e\ f×|\ 2¯\ 2ôØÇ\9fÞ[\18©|_´\1a
+îùQ$\8eq¾dOu!®úÇ\11à]
+\8fL\89ú`·­W\1eªî²õ@0\10î\1d\98,\1aÚ»;WYXMT\175HZ~\vR\ eÿ\95¹Æ\83ïY-©q½\ 5\82x\8aËê\87·\ 1º\86\8fÐß\8epn.r½ôZA·«£µ\v\82#\1duE\ 4ãÂa¾Ý¾ËÂn³\añt\97!\b/\ 2¤ÅGOÍFE\1eØáôÛB&¿#\0Á`°'6V\13\91²Æ\9aV@ü\9dmq®Vbά\15.]×\8bèµ\bZs\ 4U\1ew³â¸\81ê>\8bƸt%\9d$8þ;\\a\8d.\9dWëKRv*ÝÕ\10$oKÝ\9c\11¥®V\12µz½Áá¬\94\9buP\akº,'ui\a\94\95°\1cäÞ)º/º\rï\fÍMO\8dô\8cÂ)¸phz\9b\8b\11x\92rÛT\1d0\ 4#c\13Q_G\8b·Å\ 5ÃÍ\81\16\ f<\ 6O\ 4G¢c±à\ 4\9c\85ÃÎ\ 1Ó(`ì\ f×
+Æì\9f;f øÛ\98Y²ï\9d2&áµ}ç\a¼\81éYÂ\8d¾\11\\8eM\9c\11\8dÀ!C¨ª·¢«\10\96\81ýò\8a½âO\1e°r\17Úú-\11:9bîO\84\v(åÆ\1aþ&ô'tMÐ\88Ö'XyÍÍõö\96\96F(t@[\9bÕ\rø=>­¶½zÝÖ¬¼Ôý£¥÷\ e\12\97*'t=j(\13\16\1d\89¤P\16¨í¯9R?`¾\bê\98Í\ 1\9e·³½\8dm\ 5\ 3v7\ f8X\ 4G,ÚØ»î³+\97n̪ÇöN\12\fvE\112\1e\81\89\91Ø\19ÑExT:°\ 5<r¨uçâ\ eµ\87\15Ì«è\81`úÌÑ\9eã\10Ì\1e\91l'\98\ 2\1c¦ÛÌû\1c\8f,*§Óá\83×\ 1:\88\7f/>÷\96(\13\8aÕ\85{\ 1º\88;]R\8bªa\7f\9d\90P\87··º \e\82\86bâáa\1cnwÔïk`\11dA|\9fÇÖÅ"¬F#¶9zåh"DNf7{7î!\1f«Uþõ\r¬X;[\\ e\91½ÞQo·QÙÅ\aë\1a\ 1ÿ\9eÕî°;צÖfW3à_ÿ\989Ç{ãhñeÑ\f\9c\1a\1c\9b\93jT\ 6\9b\16\82rcô\8f\ 4:\8eóïý\93Ç\92°Å­\bNDЪï\12\17¾û\rËó=J\8dûÖ+Ù        FÖPºÚ\ 2­\1dP8¸¤`#\ eSmÖ\1dqáÛ\82øNwC'¼\ 5\10Âùt\1eª\11(5\1a\85¢_\13\e\1eè\1f\8ei\ 6äDÜÃ.eEè·zLÝ\89\v\8bh\a\8b¾\9e
+\9c¼B+k^è\ 1³\ 5ç\8f\19ð\85¦.\eÌ\a\8c\ 5\87
+§ÉdUje\96*\bÊ\ e\8fO\13ü\1et\97Ù`ÂÏ6u\ea!`ÜøÖ³y\7f\16\1d\83ÇCÑè©SIoâü\8cöæÙȤÿ\ fÝÂ¥z8w\17¹á\1f¹\ 2\ fÏßÚÕÊúáh§é\10ñ°\1a\879&s\86\93\1aÄ3Ú-\9dð< ¿Å\eÛ\ e\18\ eÃÒ»p1ë\12\9d4\98\18þ\12½ðÅ\1aþ\87ô\9e«\ 2\83Éâ4²o\98½û4\81\ eàpÎ9l\1cÔN\16\873!xy[A\86\e\18ì\8bô··¸[¼DsG\8b\ fzAt´ÿÄLT\9e\833É»\r\rÅ\94Vg\92ÂJÀÏË8]4/:\rOöÍÏ\ 1\80»·æäºqØ×51Å\ 6\99WX\17\939ëk,j\93¢¾\ 6\82
+Åø)¢\1d\87\97ON¢U§ãjüñ¹\b\a½\eæ"\a\9d#h5´Õ8äf©Ð®o4@+Ð\85\fá¾Þp\9f\bz\9a\ 2Î\80yÂ>\ 5\8f\ 3/îmê¯ïÓG+\85Gd=\96^\búº\83ýCF\7f\91\97\1cîª\ e\93fbaïiï\94\87\801T#2B\83Y­PU©´Z\8b½1i\b\87\83\9e\98\7fÄ\13n\ fA?è«\vétF£N\ 4-ízOMg¥\9bµ\`Æ©¾ÚPå¤nÐâ«\83 ÖX§SGLgë\89cö£¶°ÙoO*QÕ9
+ë?h0X 
+h»Íý¢\10ìp÷\84\87ÇÜn\9f·³Ãë\9eè_z\1e\9e\9cåÄ¿\82Ù\87Mùøj]\84Î\8d ì\bïèc÷V\1cõ­\y¯wå*\fû7Ø\8a59endstream
+endobj
+3944 0 obj
+2618
+endobj
+3914 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/home/cvs/ocera/ocera-pc104/doc/WP07/D7.4/lincandoc/img/lincan_canends1.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 3945 0 R 
+/Matrix [1 0 0 1 0 0]
+/BBox [0 0 396 390]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R4 3946 0 R
+>>/Font << /R10 3947 0 R >>
+>>
+/Length 3948 0 R
+/Filter /FlateDecode
+>>
+stream
+x\9c½\É\8e\11½×WÔÍ\92\ 1µ\18Üã(\eÖɶ k\f\1f\f\1fäQk4B¥\96\99±ôû&\19\v\93KÕA\80\1a})¼$_¼`r    &\83m\9eÀ^Mý\93\1f¯\8fËÏ\97Oÿá¯oÞ_¾,?ÍÕÙ`®Ç¥>¼]\9c\1fíÑíòÝå_×\1f.æ)§p}s\81ëÛ\8bu    \9f ]!\9büäÜ\15Ka0¥ð»çË·\7f¼@¸þú°ÌW\17\vÁק\16\9d«O\ 1l¸V\9bÄðèñW\9dÚ\16Q«ùG\8f»e°>\94Ç÷,ï\1e\97Ê\1e\9eb,O\81\96\1f<þê\ 2±<\8cájmÈ\e\9f\1f=þª½\1f¸¾{S¼Ë±
+t\10\9awGEð©Xu¶\1a\8dY\87¡\95qF\10o,!±Õª\b\98\86\14ÍR\ 6\90\10§el"Äk\19\17\9a­S\99ò3\12\8f \ 1ÈVêHne\9cU\9eèIsÐ2\91Ê@Ò2     \1aR:\90\94I\96\103\95±Ø­ÇÖ\1a6w\85±i¶)vëÍw[\8a
+\12\1c!¶ûÕÚ°¾\rAJãU\9eÐyl¦2áÜ\86\91\10mgRØÞ*¿\v/¶ô}%BRG\f\96¯ï½ù¥
+]vâ»ëH\e6x.Sß\85I\1d\19úÏ­õ=ã\9aH\88®¶céTè\r\80ÕÛR\f\95\10/H\12¤Õ"\84jåÌHá¡29\12\ 2\86\1a­\f\b\14\89
+Oµ\9ccÄ)â\19       Z+0³Zw\99<µg\ 4\1a\92\15\1aF\91 íã\ 6ëÜb·¥\ro4#\18êi\98u´:\1aw =ÖYîù\1dq4\82úX¨C\a\861.#\1aNc|°E\ 2&ò"ÀòÀ\8f\1a*Ó;¿\ 5\1dÒ\ 2\rØÔ'\19G]ËÚ\a²gת¤É\\91\ 4\84x§ä\15\81\8ahÿ\a\92ä]îH{)u\ 2R\914;%Û\91Å\91ÙÙ6ë\8fäÇN\80±­Lè¯ÀÐô\18¬NªÜ\aB\9fx\ 1ÚpóÞÞu¤
+\98¨\8e\8d9@ß$E\9d3\ 1iÖ¢\9eË\b\95qp_Ò"»Î\0\13Õ±3\97s\9b~\93\ 5ie\92\17rÈè\bé²gI«ì*`¢:¶æló%ë\f\\90æKÖY\1a²kµr\84û\92\16ÙMÀHuìÌ¥ØÈ1IÓ\15¤QaB-\93ÚÌ\80Ùª¹UÒ,»
+\98¨\8e­9\1aõ`0ð´\93LbD¦¯D\1d\fÀÈÔ´JZd7\ 1#Õ±3\17y&´\ 6\ 5ñ\86\10p<7FÏe Þ\974Ën!ÐHuìÌ\85Heê\ 2æ\18¡IÞ\ 1*BËG\9d\1dI\8bì\16¹\8eTÇÎ\9cO\14!z#\rî\13­\17^[Àg 2\90Tö,i\91]\ 5LäE\80K$Àg^\88\v\9cGY\9e\\8a\8cô2´¨y\fw%mdÏ®UIu6m`\ e,ÉzY\9dÅ\17\e,¯³ò
+làÕ¹ÄÓRÆOÈNöêÚ`\9d$Y\8a0\9b\0zM`"!)3\15\18ò.d\11Ù\11T$OÈNöêÚ`\9d$Mæ\ eBFI\ 6"\97Ѩ\ 6¸\f>\1299RÌ\95Ö X·u.\95\8d\164&ê_Òq\f­<\ 51jÍr_Ö\98\85V9pÆK\19CÎYän\82uöl\ 3\ 5Ù],¯"\12ÂÌ\988\12´\99}ÅÒÝ\15!\9ehæZµe\85\99£E/e¤\96D\9dÎ\ 4\89:\1d\95qÒmÑq\8cé,÷\1a¬a\a!üÒ:âR¯E\88\ fbK\98\83F¸ì\ 5\ 5KMa\10D<\rÜ>µ§²§ \880Kk¸$­\9a8R®\b·j\9c\972\1aóò|Lñ\8c¼AÒ£±*8*\13ÜÔï\\8f\8b\81ß»K§\9exê?\1c½RŶ;¢¨$p\8c\19\f¿²òËÒþÆ\ 4E\1c\97ɧ2\r\91\8eWf\10d\84E\96è\95÷[\1e\14ñ\8ap-C;\9e3»+Ïî\97\9d\13ïÀ\1c\9e\90Æãø\95\9d\90¨¶2{\1a\95\19\19ñ\82\809·FC,#VË\84\ 5\89c­Ò°X5Ò\e\ 1\9eÀLä7âõ\8dDdD÷\1c¼\148\91ÝÊ\10\12´\87p\19\8bÒ\8bF[¼á\8bél®NW\99\91,ݦ\84IOC\17\ 5@x\92\ e)\b\9bK:¥lEN\8e\8cÖy\ 6Í´D»¶ÃmëLæEÌÉJ[÷º\84\88H\8b¼bØ^\86\171\9bïË^]\e­ó:3\9ak\92\92J\1a\97¬ \11\8a|\7fÒ\11\ 1¼\v\87:\ eîË\9e\£µw :væ| \ 6\ f\1a£ù\10\18\11s\9e£\18Ý\97o$-²[<2R\1d;s\81¾y@\94Ï\0\10,\856QÍ\ 5Úõ\16DE.\92\16Ù-"\e©\8e­¹Lo<i°\13è\93XAÄ»À\r\9e²\ 6\89\8b¤Ev\130R\1d;sÑÓä\89F&ê\18h©Í¨arH\8cH\ 4º\914ËnAñHuìÌ%\9aó­\ 1\19b\89fxk\8c\84{ÉÒde\8c¿+i\91ݶ\ 5#Õ±5Çߢ\0\92"\99\11\19ª\89öaek\8dw%-²\9b\80\91êØ\99Ë\91Èí       iÞµO\0D\9eùc¡ÕÈ}#i\96ݶ\86#Õ±3\87\14ÞZg²"ä\8b\ 252h<ºW[%-²iw>P\1d\esÖD 2ò¥­ \9e\11Ð2´\18¹\14ïJZd·ï\13#yý@\92i½ö\12\17[\9eB\e\92\19I\8cH´P×\8bVK¦ôUÒVöäZûf3\92\1f;\ 1üÙ¬\84\e²dóW+ës:!­V\ 6\95ÍK¿\ 6\f\8b#íÓÚHuìÌy+±\90F\11\96^Ü(i\14°\88¤\90¿\1dÀD\17å\8b*\7f§°  \aä¦H\ 6ÃH\8d%÷H¯537³î)Õã\9c\97´ú]=,igH\9e\ fc2Å$)\98z<"g1|F\ 4\14¿ï\1fz\1a\1eÃCSZñçkûúV\1eÕ\93\95óï×ÇõO¯.\9fþ\ 3J\8d24®¯¾½À\95\8e_,b=±¸¾:.\1f=ÿðÍû\8f_}\7fñOáúIt×Wß\>zûÍí¹b\ e
+øê¯\ 5øáööý\87\8fÿPL\96Q\1dZ¡¯_\7fxûËó¿ÿS\v~ââ\95ë~öÓO\9fþóýó;¨x³^\96¹|¶^B¼\12Qã5\90\80×?þðáÝ\8f·Ûó»Z£LCeÙ´¥©\1aÛ\9f?û{ãoÑ(Äk5Tñ\1fß]\7fyûîÃÿ¾¾ÕÇ\7fyuý²72Òw¾m;z>½Ø>L|Ð6<üÍ\r\feMø}\9bتï®\1dºÕýæ¦\9bèC\9fÌÒÁôark×üM¾ûêv\99`~\17×ÿöþÍõÇÿ~ÿüúCë,e\82-\ 3ãZöLTëù\9b7ÏÍ^   h2\ 2^?¡\97P\1eýúöÃwÔ\95ÊRm
+c\7fôù\17\9f\7fñ~iËlèð©\fëP\ 6µåã͸<>=ô\8f\1e\86ÇÄéQÝü¸.>ªë\80¶ßmXÔ³ØÙ¡\87\8fýãÇ\ 1è;B\7f<¸ô°n~T\17\1f×µ\89¿V \9et\b\92e\8e\ 6ËÇØ\vB_Oi®§Z+"Ì·³9\9fõ¬G\90è'ò\15©\1f\e\15ñù|\8e#ªÐMÞÙ$G´êË\82\83T®µ"Â<\98s9MÞ¹\88\93/+âM\9cÈWD\98\as!¥É»\10pòe\83`\98È7HJ«w1Áä]\f~"ß h&ò\r\92`õ.Å8\99K>OM·A²\9f\ 6\89ç\ 3\14\87\19Ë\8d)\bhE,Û°¸E¬Õ¡!<+bloL\ 1}\16ï\14\89y"_\11\8a\1eÏä+"Ì£w\98&ï¬\9eø¨/\vBg\1d\15\11æÁ\9cC\98¼«çÅ£/+âõ\b[}Y\10\87°z\172LÞ\85è&_6\bâD¾A2¬ÞÅ\14&ï¢&u\bù\ 6A?\91o\90\14VïR2\93¹\14ìÔt\e$ç©cl\90dº9\ eð\9dóÃRx,\vúM\11ÔÔ\ 1Ç\1f¿WäTkb¦\0?.öæ\bá¦Hgoß'¶È©ÖÖ^XìÍqÅM\91Î\1e\16ÿÂâßÌLöÒbo\ eTn\8atö´ø\97\16ÿff²\97\17{sìsS¤³çÅ¿¼ø73\93=\ìÍÁÔM\91Î\8e\8b\7f¸ø73\93½ºµ>Ç5Ç\12\9fÝ\14\81 «¦\v|\14³ §Z\133Ùó\8b½9¢»)ÒÙýbÏ/öffé\9fn(w,!âM\91Î\1e\16{a±73Kÿ\9cý\9b£Î\9b"\9d=-öÒbof\96þ9Û\9bÃØ\9b"\9d=/öòbof\96þ9Û\9b\9b"\9d\1d\17{¸Ø\9b\99ÉÞKFºg{/\11ê\9eí½D¬{¶÷\12ÁîÙÞKD»g{/\11î¶\ fj/\18ï\9eí½DÀ;ø÷\ 2\11ïÙÞK\84¼g{/\11ó\9eí½DÐ{¶÷\12Q/Å\9fóú0\7fй)ÒW\83¸¬\ fqY\1ffæq¼¿Ä\87\17\8a_æølþÈvS¤Gc~\89Ïü\12\9fÍÌdo\97\91Ägì g×\9a\91dzÖ     \9dÌ[=&5\86\13õP²i0K&\91fÊpF\83Í\9a\91\ 4\82ð\91\11J£t$\ 6Aøp\15\83|ýÍ\92[ä³ \92=á5GIó\8f¸\96\9e\8f¡\93\f 9\ eE'\19@ <\9am$Y     µ\f!N3ì%ßÇ/ùGaÉ?
+\92!Å/\b\\94Z\92iU³\84¦ü£(zzþ\91äLIV\97\8b\923\85\92\ f\155WÞp&EÔ\f6É?
+\9a\81\ 2\9e\93;zÞ\eç\16ù\9e\89&y+\9a6b\rg«i6ÿØ\7fnç»=)hTà)q&iï·\9e2PòrK$\9b~»CÊ\f÷OjJîé¦\ 4åPf¯\91\8a£üÈ\ 1±\84ø^\v\bé\89òl«ß\90áZ)Â\99§Ílýæ\ 6åì¦pÒ\13\ 4ÑZ\89Z#N\9a\adh1Nÿ1\9c        Ø²ÂÛØLüf­\8eMIä±=m\aÇ7ÒóÑ \9f\90\133\9b\e©¶æ4\93HOÂë1,M\17V\91Ä\93Cº/i\96M¹E\ 3Õ±3Wg\9c\96ù\98¥\97Z:¬\86z\v\87Ë\88\0\19#\eI\8blÊ$\1a¨\8e\9d¹úî\1a\95ä\95\ 2¿q°§l#Ë\88&@-\92\16Ù\94I4P\1d;s|  
\11I\9e3}¡ç\16y\9aÃaÈÐ\1d%-²[&ÑHuìÌIj\ f\1c\ 4^2@'\93ÀI¬ ÉÇ«¤EvKä\19©\8e­¹LÝ\124+*p\92´AÍä¦\81Y\10wWÒ"»   \18©\8e\9d¹è  1A\ 6]äËHÆGEh\825\1eîK\9ae·L¢\91êØ\99K\94¼Ùò\b\ 5iÝ      u\ 3\ 5\11\ 6¢\86)«¤E6]0\18¨\8e­¹De\82^\17I\94\11\83þtéÂ\13¢eVI\8blºb1P\1d;s\99º\13\9a\84®8¢é7:<Mòº%ØHZd·L¢\91êØ\99CÊþÈz;\11\90îðÔ¤#)C\17ä²FÞ\eI\8bì\96I4R\1d\esÖ¸&)÷«V|ÿ­~jÉ\82ÐR¨\97\886\92\16Ù-\93h¤:væ\80\12Ór\8fq\15\81s\19 \15ÜÝ\91´Ê¦\e¾\ 3Õ±3ç\f\a\f}¡'$¡?K\1a\ 5,"[Ä"Tr¯iGN¹\9fçØ\ 3Ù\\98$\9d\ 4L̼Ôò\\94%)  -G°YÆ8\ 2G\83YR·\10² \1cé\9dÊHn¾\ 5Aúí\ 1äDH]ý)E\1a(\1a»r\84Oe\92\96qZKÊ\ 4FP\11\9a?³éYí\94Ã\9e5\18\90\182ç3BéB^\91ÌH\9cyrß\83xEºÂ\19±c­6\94ø\82\a:IME\ e\86Q\97ÂL\83\vê§FAhÊEÙ\1a\14\84Ök´²È"o\82Ð{E\ 6[<\99\8cTÇÎ\â¤ÚÜ/\8c\8fÑ9\9f\17bÔ}Ù*i\91ݦÓ\91êØ\99\8b\89ȳ\}(\88=gu5\ 4\18Á»\92\16ÙmE\e©\8e\9d¹\90ùÝE8!­\8cÞ¢\b|9*§û\92\16Ù\94\1d<P\1d;s^\10\9fOH«%\17MôvV\8e殤Ev\v«FªcgÎñÝ\82ìÄ\17\83¹È¹ÀA\83¨EÒ"»\ 5\96#Õ±3g\9d zaL\10½\92²
+XD¶@Úur\ e¤\17\11xvz«I\10¹ë³\1101ótª\15u£4\93#òV:;½2\95§     v#`bæÅ\ 2)\83Õ´\84ɶX`bD\12fùâ·5¶_Uá2"©]Cie\84\\13Q\8d×2t[Ûj\84V\10Ê{5r-ÃzÏ̽L\883\ f§ë\9el%fîzè¦_»zÌHæ2rû± îì{Cøò\84ÇR\ 6\10ýÈ\ 3(Yüb\vPîÝ\89\9e\82(säÉ$\86ѯ\96\ f=øÞò¡ó¹}
+\92\14aæ^ÆòÄ\15Õ\16¯n\18ýø¾Îzx\1fÝ5;Ì\93_Ü7N¾;\9cÛgê?r\8bËrEÉÝv\81ú\1eJâ¿ g*ú\9f\1dÖh\82¹ÜvZ\90ÎÓúðHµ5g\ 3¯/²e³r§ôTÆçÙ»EÒ"»ý\7f\81\91êØ\99\ 3¾è\80ù\8cP\83KW\a¾ç\89r\ec#i\91M\11æ@uìÌ\99ÈoS&ó\96öN½Âj\19§=9ß\91´È¦lý\81êØ\98k\1d\8bº.("\89À\12,!/%\18ïKZd·Ðh¤:¶æ\96`i  rv\81Ð,i\95]\ 4|yù?Ó\1eiÈendstream
+endobj
+3945 0 obj
+<<
+/Producer (AFPL Ghostscript 7.0)
+/Title (lincan_canends1.fig)
+/Creator (fig2dev Version 3.2 Patchlevel 4)
+/CreationDate (Sat Oct  4 15:43:59 2003)
+/Author (pisa@kotik \(Pavel Pisa\))
+>>
+endobj
+3946 0 obj
+<<
+/Type /ExtGState
+/Name /R4
+/TR /Identity
+/OPM 1
+/SM 0.02
+>>
+endobj
+3947 0 obj
+<<
+/Subtype /Type1
+/BaseFont /QRJTSF#2BTimes-Roman
+/Type /Font
+/Name /R10
+/FontDescriptor 3949 0 R
+/FirstChar 32
+/LastChar 251
+/Widths [ 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 500 500 167 500 500 500 500 180 444 500 333 333 556 556 250 500 500 500 250 250 453 350 333 444 444 500 1000 1000 250 444 250 333 333 333 333 333 333 333 333 250 333 333 250 333 333 333 1000 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 889 250 276 250 250 250 250 611 722 889 310 250 250 250 250 250 667 250 250 250 278 250 250 278 500 722 500]
+>>
+endobj
+3948 0 obj
+4149
+endobj
+3949 0 obj
+<<
+/Type /FontDescriptor
+/FontName /QRJTSF#2BTimes-Roman
+/FontBBox [ -168 -281 1000 924]
+/Flags 34
+/Ascent 924
+/CapHeight 676
+/Descent -281
+/ItalicAngle 0
+/StemV 111
+/MissingWidth 250
+/XHeight 461
+/CharSet (/space/slash/one/two/A/C/F/M/N/O/U/bracketleft/bracketright/a/b/c/d/e/g/h/i/j/l/n/o/p/r/s/t/u/v/w)
+/FontFile3 3950 0 R
+>>
+endobj
+3950 0 obj
+<<
+/Subtype /Type1C
+/Filter /FlateDecode
+/Length 3951 0 R
+>>
+stream
+x\9c\9dV{T\93W¶ÿbHÎç³\1dÒ\8c¤Ú$Ó\87µU\11íCíX\1f\15µ\16DD^\82¨\b\ 1\82!\89y\0 IH A`C\80\90\90\10\1e\91GA\ 5DD¤X\1cj«Vk{}t¬Úv\ 6\9d©­µ½Þ:kî:\1fýè]÷\ 4gMïZwþ\9aÿ¾d\9f³÷ùíÇï·9TÈ4\8aÃá\b¶Ç½\13¿cÓ¢xy\9eL»$N\95\97®\fþ½\88\99ÇaæOc\9eᲫپ\9fM?Gð\9e¡¢[¸³\19ñ,êÐü'ÆB'ÞþÍ\ 4z\82¹÷äcGÕ\9c\bgbaB\ÒK\8b\16-Þ R\e4òì\1c\9dtÙªU«¤û\fÒ\7f\912­<[)]@>òe
+\95:O¦Ô\85KwÈdR]\8eL\9a%WȤ\e¶ÅîÜ\12³YºpsL\82t³L)Ó¤+¤±ú}
+y\864Z\9e!Sje/I³T\1a©âñ\ fi\86J\99)×ÉUJm¸t½V\9a.Õªe\19rrIV\98!S\a\r\8b¥j\99&O®Õ\92o©\+ÍÖ¤+u²L©N%\95+3\14úÌ`xò\7f\96\93ª5*bÏ#\16â*V¥Õi34rµNJ"ÆFnzüF]Nº.\18W+'f©*\8b\9cÌTeè\83hþiÓ¥Ë\95Z©NV¨\vÆÙ'\93fʵjEº\81Ä%®Ô\1aùÔ\13ôZ¹2û×è\8b¥\1aYvº&S!ÓNù\rfåW|Òÿ\83:]­V\18¦îª¦Ný3¾\§\95)²ÂcäyûôZéTM¥1ªUÒhi\9c,[¯H×ü\7f˯õú÷*HQ\94t½2c«*3f\83Z¶M\93½I\9b£\93ësó\13
+\14éûR¥iK\97-§¨g©mT$\15NÅR\e©¥ÔóÔvj\13\15Aí Þ¦^¤â©-T\ 2õ\ e\95HEQIÔëT2µ\95z\8bÚ@­¦8Ô\1aêI*\94\12P¿#\9dF\85P2ê6g9§\95ó`\9a|ÚMn\f÷jȲ\90>ÞlÞ·üxþC\94\85.Ó/ÑMÓ\9f\9c~`ú_f\14Î\18\9a¹sæðÌ»3¿\995{Öó³\94³Îcç\9c\89,\bàä\93Ìï\ 2\9c\89ÄVán§Í\93s\83­f>\r+à³\99\93ÅQì\82â¢Ô
+Q!NiE©\ 5¾n¯³±Ö'\19ÁÓyØÏ?¹È«v\1d\0³\b4ÆÒÄJº\10×£I\vö\b1ÂÝ\98f»ys\98rð3O\7fȹ<\8e#ǹM̳Â:§§ª\ 1èn·)EÂV!\88³\9a\93\ fÒ&\9cãGÉ5&/ôÓ¸\ f½ÿ^\9b·\17èÑ\ eÅ\16  +C\10m1î\f\1eÊô£\94Úb/\8cÒØ\80¾ßóÑzq\1a(\8c\9b£è/\91½:Å ·Æ\17\89æ0±¶Ï\19Þa\ eÜâ2Ïâ\baêÆlm\1cÐ\11Q_aô·\ f¯\7fÝï³fy$uúzU\8bá\10\88Þmkmÿhãé\15\ 5Ùû$;÷¨6Ãj\9aýí\97á\98+~\ f\ 6\9bú\8fvu´v\1d¹@Ïùy6´N\84´r~\1cfZ\1eq'^g®      'w"XYlY]FÀ÷¶¢·jÍ\8dp\9dfb\11\÷ùnÔÑ­l*b\ fLV³EL5\8fM)äÿ©ÌW\f\93/#xÞ\¸ÒAî\15·¢55Ævø\89f^D¸fò4¯\91O\12gëf\96wsà\1en¼ÇÅNf¯\90ýmÄ"VÌλ¿\0\87âÐ\1fþ\e\8bñÜ¥\ fا$\16\95püÂ"ö\19\96·{óºÌ¬\8eÁ|\89j¬è\1a\83Ó\97®\8b\83¾Æ \89\99A¼ÝÅ\ 5ã\ü£M\88_\1cã5!Ce\ 5\94\ 3\9d]Ú0"a.£²êTc\8e-Ê(*BõUuP\ fôq·m\9f\84\8d\1euC\ 6Ð,
+gyì³ìS_¼\8a§}4\108Ý'\89B\98\13\ 2v{±Íj(ÐØ\94\8cÿ
+?\81y£7n~0º+QB\9aÌ\1a(       &.\94\95á¹\82÷\18Æ*dÚ\11|ì9Þêkô4Ö\fÔ\90L\15\17¢\81òÆ\83þ\92\80Ù\9d\r[iö\1e\9a\142\85<vm!ÿ\144\96\ eî¢'·"Aò¿JÜ|$ð11$us&\96\9a\87\99¿\rr\0ÓÜ        \8aI\14\96à|^>ß\91_T\\0%`r\9aêR\9avÖï\82U°R±5~ãVY8°Ó üÈk\7f\88ûø\9dïd\ f\ 1óàáÈůiCËúÈ-y+A\14\r;\ 2{\aâG\15÷\0si¼å>\9e\8e_\10\9f\83±üÁ\8c\9eý~Uë;4É1\9b×ll1à<[\ f3çãÐkãX\7fw® ÌÍ<#tW¹À\rt\9f˶K2\99\83 Éj\8d\82\ 5F\\86\ 4»[к*K\ 3|BãeèXn\87m\bh<ã;\1c\82_ÀOnüæå\1d{4  {$·\90£:!?Ç\12o\14á\97× \8f|Ô?rct-K³Ü\94u\evÅõ\1f\11\aÛþ*Vö`ÔÏa\16ã\95ÂÔµ{\95Q\10\a{\ f\19\ 6ì½\15\17i|\91_ú©í°¦'¯?íP\12ì\84]\ 6\99|×>u$¬¢Yñç¯a$~\0_\\18Â\14ÍÞÆ\8b\85\r·û\8e_\84\8bСò½J\93:\9aû\99ÿé'\99å3k0\9f\8b\7f\99X)dw°óÙçÙ´%=\11g·KÎG\7f\93ùWòþ\9dx>\96â´\87Ê;ñ\1fK¢¯®è_D\9a,d\ 4F\fýûϦ\1c]\ 2ìL\88µl*H*Ñ\185:]NÎnC"¤Áî\96\9c£I#¹?\914ãî\1f\87NÓ'N\8d¶}\bô\1c|\97ðÈ\9b\ 1Îõq®\8byZØètWy\81ît\17í\91°N\ 4;íö¨bÂ\ fv?Úì4úá\1c\8dõ¨çÔ\99.q\1d¸Ë\1alMæ\ 6\87\ fè\ e\7fswo~@N4/2Eò\1dé÷D}¶%¶P\14,\9fò\1c~%\80çvâÜ\13µdR®á¢[]Ý\&\97    \13\9eX\83
+Hç\14¸ôõaj\8fºö\0Ðáë7DDwÉ>Ë\95\14\1a\fFGY®ÒR\0\ 5\90ï->Y\10\99¤Î\85,:ñö\9e\aâ/àö»cC\ 3G\9b{`\0\1aZïd\85ua\89Õ\1a74A ÷XW½»ÒUé\84Ö
+_e\1d\1c\87AÿÑ®Þnÿ18\ 3\87ËÚÍ=4k\9f|ZØkÿÊ1
+ô·½\96ìík3YÞ+Û\ f\ f·»|Cg$µø¾ðB÷±\11ñQx×Ø\94×\92ãM\83Lz\872'm[ú§?\90®ø\0ZñÅ\93Ø=PØ\1aú\97Gs\ 59\8c\16\17        ±I\87\8a\7fo0ý\9eÌô\vXÃï®­ë\12ãù|Òûm¦æet'¿\1c\9bìæ\vn\15¢\e\ e\9f\19\93\e       ×Y-kÿÁukj\b×}Nc%~\ 1}\rÍ&ï\ed
+D¶¶â\0\13\1e°´\85Â%¼êÚ\Áb|\ 5ÿ\87ð \9eϳò+*Jì\95\95\a\0[µµ\96\164×ëõ5\aæ­\8eKÞ°£'ãNªä|î±\82f-(D{ö«\92ÅrPø
+Ûò;KÚ-çè"6ÂÇwyjªIá\ 5Ñnh¬h'CÔìèî:Ø2ïÖåó×Îh{·õKX겪ÉÔ     ]¢Á£Ý#dJ\8fÈÛ\97Ó\8f\85hÞÙ \10Å\10\ 6\\86\7f\10\ e\8d\1ci>\ 1ô\99Îì\8d\126\ 5Áf\9be»ã±\12%x\1cõp\95Æ©èïégß\10ÇBº6m\e\8dÏ¡2§¼XSº£H¤.å\15¡\9a*'Ô\ 2}ª¾t¯dr?\82\8d\8e\92í¥Ä\83Â\8f¶×Ù¼ÄÃ\1c|Ô6ÆÌê       \ 5\Æn\1d\9f\83ë      '       ®.À4ßSét\88í%\8e\12»M\16¿7µè -¸cµ;ìeOCyU\85³\82\16\80=Ë_qdï\ 5ñ(\f\8eY\1aÂò5F\9b\1eè,S×'\12|\ 2    îüÄ'A\b¸\99þc\ 1<ûQè¥G¯\938\7fÇ\e\82\92±4\9eg"\î­öU¹AÔ15/&\ 4\elÖMA=µùÑ\96ÚRO°\8c\18     \98d\9c/Tët*U\9b®ûp{Ûán]»R\12\94\8fóq\ 1æ\8dfscè¥q¼\89x\9fÏhÏ\bËøiV¢\eø\av9\12ô\1aÑ¥r¯\rvÒl1\ 2U\99ÙlUë\15Åy@gîï\e\92\b\9añ\97ì\ 23z¿¼Ñ\ 4i4[\8bV¿\9füGñq8ÑÔÕuêTØJ$\88®©8\13èoøC£\88àa\95}\13!SpðëSxîã\ 4&MXæ\8cÕÉ,±\ 6"PµUþj\7f\95\aDín#Éþ\13\bÖ\96\ 5\ e\9b¹Ô\f&°¹\8c\87\fífw\11Ð:\83Q¿\7fPw\16O»p\13?+\11ü\94<±ö_Â4\a\98Õ\ 1\ es\80\14\88\95\98ø=å~\e\14\82­Âvж\90õ\86½\80Ý\8eÆòFp\8b ¥ÁuÌIûÙd\13\1a¨pÙF\9edzØÁ°j\87Óî,­3Ô\95ÖA\1d¸|þãø)|#ìð\95\11ç\14\7f\ e3\13­\9c{\8fð/Ã\\ 63^!<ò6ýÉC´ÏT\88n;\9aôð"Í\12]Ül\97\15å©S£\14ë \12R:Ô§\r=öãA\85ø#\82Ï\e\1a¾r\91\eý\85èKG\83\95ì\12ì§\88]ÿõ*¼F\8c9ðű\13W:\86Ü#pk*àcDW\b"\13ê³{ì`\ 4\93CkU/c5a+°Î8\ 2\0>\11´5¸N»\b\9e=&tü ×\1aHp\15º
\f\11ljØBÜxÐSá\ 1\8f\b\ eyëûjÈ©·M¨½¢ÞÖ\96\8cç±\ f¼yõæ:2\ 6õ>ï»Dµìaß²ÖƬ\1aG\1d\88\Pën\1a${Êð\96!gm\80\84@SÍÊùr\9cÛ:Á\15Öñ\eª¼UdÏèñ\98\896\1e@\90`¶D\97\91δúQtM±\a\99ïÑÁê$£Ì¶É8µÛ\9d\8b\84u\84¶þ\19/ü:¸KÄ|&4\9a\8bËL¤ÐöÆa NB0VvØÔ¡ïßÛ\1a\vô\92õ)Ѻ@A{Ç¡@[Mem¥KRᮬ\a\17ÝÕÓ68Ú¥L\10Ç 6|«±t¯L_`\96C.-H\8e\1eÞsQ<\f'\ f]\1c£\ 5¾¤Ú\96ü\93óú\büc\ 3ÄÈ.ý³\10\14e%ùÅZ³ª$\1fè\1cUß)I\r\82\v'ûñìá Õ\90\15`æ'\9cÏÆqÁ_¹xÉÄ\9b²êt\93ºt\97\fÒF]U\r¸\80\1et\97¤K&\9b\90âNîW8ì\11\9e\86\9fÃO¬ýþEq\flÏ.H¡\13CN\9cî\1f»}æMv\ eËM\8dZ\95´»½SL\94\90\8dè\9cpwrà&\17\8f±s\85¯ñs\8b\9a\8fI&^EG}¾\1eñ½N6û\97\v8\9b°\82ó×ÃxÞMn\1f9¬ÁÙ\13\17ØlÍ]ÔÛdÌ\91üò*R\98-
+âõ¨90!\ epð Ñô·ù¬á\97M¼+üǬùAãõ\0çÑ].\1e\ eêýÛ\11<3òÖ6ÔÔT·¸\9ak<@\1fr\9böK\82\8bpn©®¨ÄTb.O¯$\15<ìG««\8a<ð>Íü\88\82\9en2í78øâ].£ÂÏ\b-µYq\96\92Ý bKùx5\8eüæþ\89\9bp[ô_oÜzN\1c\ fIú¬\8cýrÓ~c䡲°Áÿìï¹
+ôø¹¸\15\85¯X.a7±ÛyÅÌÓhNA\80I\fàø\0ÿÈ\8c;3\8fÔÏ\9au§eÖl\8aú_S\12Råendstream
+endobj
+3951 0 obj
+3605
+endobj
+3927 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.552 495.896 167.242 505.246]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canqueue1) >>
+>> endobj
+3936 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [347.986 73.912 396.154 83.262]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canends1) >>
+>> endobj
+3919 0 obj <<
+/D [3917 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3920 0 obj <<
+/D [3917 0 R /XYZ 71.731 768.009 null]
+>> endobj
+3921 0 obj <<
+/D [3917 0 R /XYZ 282.273 627.478 null]
+>> endobj
+3922 0 obj <<
+/D [3917 0 R /XYZ 387.044 614.526 null]
+>> endobj
+3923 0 obj <<
+/D [3917 0 R /XYZ 119.552 588.623 null]
+>> endobj
+3924 0 obj <<
+/D [3917 0 R /XYZ 197.515 575.672 null]
+>> endobj
+3925 0 obj <<
+/D [3917 0 R /XYZ 303.342 562.72 null]
+>> endobj
+3926 0 obj <<
+/D [3917 0 R /XYZ 134.945 536.818 null]
+>> endobj
+3476 0 obj <<
+/D [3917 0 R /XYZ 71.731 495.896 null]
+>> endobj
+3928 0 obj <<
+/D [3917 0 R /XYZ 71.731 489.253 null]
+>> endobj
+3929 0 obj <<
+/D [3917 0 R /XYZ 71.731 283.202 null]
+>> endobj
+3930 0 obj <<
+/D [3917 0 R /XYZ 437.524 270.251 null]
+>> endobj
+3931 0 obj <<
+/D [3917 0 R /XYZ 226.652 218.445 null]
+>> endobj
+3932 0 obj <<
+/D [3917 0 R /XYZ 160.007 205.494 null]
+>> endobj
+3933 0 obj <<
+/D [3917 0 R /XYZ 477.915 205.494 null]
+>> endobj
+3934 0 obj <<
+/D [3917 0 R /XYZ 281.156 192.542 null]
+>> endobj
+3935 0 obj <<
+/D [3917 0 R /XYZ 119.552 179.591 null]
+>> endobj
+3477 0 obj <<
+/D [3917 0 R /XYZ 71.731 60.961 null]
+>> endobj
+3937 0 obj <<
+/D [3917 0 R /XYZ 71.731 54.318 null]
+>> endobj
+3916 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R >>
+/XObject << /Im2 3913 0 R /Im3 3914 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3954 0 obj <<
+/Length 2454      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YK\93ܸ\r¾Ï¯èÚ\93ºÊ-\8bz+7g¼Þuv\13{w§j\ fI*Å\96ØÝ\8aõ²(Í#¿>xQ­\9eéñÉåq       \ 4A\90\ 2\81\ f\80Zm\ 2ø§6\99ò³Hmò ôó,ß\94íM°9ÂÌO7J$v"²[Éüõîæí\87\14~\91F\9b»Ã&Ìs?\8e\93úq\9alîª\7fz·'=LfÜîÂ,÷\94ÏÏ_ën~|ûûÝV\ 5\81·\83ÑVyó#Ïݾû\a\13ïÇúÞ-üW\90\ 4 \ 6s@©í¿ïþvóãÝr¸$T>\9cã[Ç\8f\92\ 2Î\1fmv¡Ê|¥2\14Ú|Ý\ 4~\9c\90ÈB0ß­\13Î×\9bg\8c·\1fÛxó¾¿ùífC\7fË>*U~\92g\9b]\92'~\96ªÅNáÊN*+@h\93\1f)Efú°U¹W\1fçÑÀ\vç\99§v±Ï\14Û\ 3\88\93\1e«\a=\82©D¦í+Ó0   \16¤çt\9296\16Ó\15\e\12\8c\ 6ÇÈÎÇØ¥\81\1f\849Ø$÷£"¢sÜ¡\82(OÀâAx\9ca38Ñ3s+ð\85<)6I\1cù\85ºno'³[ ±\1d²µ\1d.\15\89!\ 2g\88(\8fÑ\10Ï÷\ fÃÀOUøÍý\9dÌ7÷\ fÃ\18ü5¾Ø¿¶üþæQ·\ 3¼~#öè\ fòÜÿ×\94\13\9f­îl]É<\1a\1cï\10\8d\8esbt\9a\eÍ0\1akº        ôÕÝ\91\99öÉN¦Åw\ 3k\ 5±\9f\17pZ\15úE\12ÒA\1eêé´ÝÅAâM\ f=\12©·ïÁ\ 5ì6L¼72s\1a\8da²Ü\82\87Ô\83eIÝUÌnûÑ0«ìÛ\16ì«K=Õ}Ç\~\1dÒéó\8a?úVTâ+£\f8\95u,\11ÇS\ar\v`MûÄ\997[\83{ǹ·\7fbNßÉT?òS\ e\ 5"z\18\1a>\ f\1c­[\8e\ 1\88´H\fNô`:\9e\ 6Ó£5uW\1a+ªÜ\ 1\16kó92O[öýx\15\82Á\85­KÝÁ±ÇÿL/\83$Iý$Í@\1eåì4Îå\ 4¾)'eé\10\1cÙ\ fUB1\85W\19å\10TQæg9«\aH\90`^0\rè\9fk;õã\13\ fèÂ\90øØ\ e\8diáôrIijv6öåÙâÌÏC\ 2\1d\88ßä\1c¿1 jeîMÓ\ f¨     ü­(ä6\ 3\86\b$\16w%qÄ\15<\9båñ\81î
+\b\82j&OÚ²ª¦G'&\96¼\83\13x\7fnÓÀ3n\ 5Fó½áe{C·\87Úu  \97óÒ\89öæ@®\11Å\ 1{}\14Á2më\92\81\81\8d\v\ 3dÛI\8f\13\v\81yÃØK Âà0ö­\88\96ø¢z¢pa\16¾)>g+;[\8a\0\9a\ 2Y°×x©ò\8aó[\ eú=¼¯gk\191dÀs&\1c\88Öwâó\14d@ï$H\87\88;Z\81\16\b\8c\11w×î À+û¹©\98l\8c®XçAÛ\89q&ö¦\9ey\1c_ȱ5º\13sÑÅÖG\17×\aý \8d.&\84°"\ 378\82ÍGF\95É\90Ó³È~\9eDV\9e\ f|,$[\83\ 6\10]S¿è\1cûj.e=Ý\10\12\ e!q'\av!\1ay¯÷ÍÓ\15\1d\0·¿§W\ 2?Âãb\8aB\7f\f\81¬\97yòb$t3\82Å\9ex`\1ek¼¦\89¡\18g\17\14\bÙ\9c\v\81°ó0ôèa¡Ä\112[Ý=]±çô4 "E\10\ 4$\99*@\17Dmb\91k¤èT¼9°\1eNµ»c\9c@\ 3~1"Æ\81\86RSM>       <-ª\1eLÓøÌú;ßwJ¯æÞ+]\1cV\94iPQ\89¶þ\8ay/\10\ 3\8b.<?>õªhC2;C\aò«U\9dF\10\81\ 4Ç:­\ 6wzú\9f©þ²l\99úaÆÕƧ±>Öän´Áû÷¿H\r\9f]è_\85àEE¢  \82\v\88âÐ\ f¡\92¹R\11\84P\8d\15\¼¹©çÏsñ\12Ba\86ÀºÒ÷²x\89
+?βeÏsõ\14\ 5çì\1f\16+$\82       ½\aG¢k\80\19ÄwdNnÙ\17\b>,épÒÜ÷ÍÌ9\80\16b\82@\ 2¬\ 4\v\ fÊ\1e\12à@h\129\87\85µdÉ+¾9Ö´5dK\82\8a\18\rj\ 6Í\90\8bIõ0Â\ 5\82\17J\9ac6G\11\10\979%f\ f!m'\11]^\0hL&\18\ 6¤½2\90¿+\ýÒû(\ 6ô¨KB³8.p·\9a@#qö´<ñ0ÖÓD©$ ¨òEfk t\88SBY¼U\ 5å£D\8c\82Ä\11ÏBÐ\ 6\83\aô0-
+§~Ø\8dºû\82\81\15\880ÐÁt=]±%Üê9        qé­1nò\9c"\93yËI\91ýÃí\ fÌmtw\9cõÑ0»Z\95\ 4¥\16ÙýRâ\8f"\86\0ÄÀ&\9b\89ä¹â\7f~çb×\1e3\80ôV|ÁËí\82  |)@Á­Ã\ 4\9e\11\14-ÊÕDq\83!¿\vüB\82ú\89\9f\9f?AëF±ùS»ÿùµ`\fÓÐ\ f¾c0®ô½\1a\8cN\86\83±&0\8a<÷$\8f¤¢
+\ 6\8cn\91\180\8b14凉\82\91\ 3£h\85?\90Y5¤\1cø\8fa\84c¶Hä}ÞFXÞN<B«øLÞ±ö\88\92\80l\b\19âZvC\98\8eSjó\98««\e##ظgJ¢-=£\fÐx\12|ZÓ\0ظE\95Áª¢3¢\9bA\ 4\88¾kDþó©n¨mÀA\1e\96a\10Èx¥ÖGG\90ÄhªknÄqr«»\ fÛ\ 4ú)ÈK÷\10}¯9K\0år\91}?g9ë{ÝYDæ\7GPÞÔXÚF\90.«{\rw}\14>\95Ï\11enË\9c¥~\ 1®ãQ\1d\15q\1du\1c1\97s\17\ 2¬¥\88À\ 1\97פNô¯>\86Ì\8fox\12\11èJ\9e\9e\ 14=ë\16\88gùyª\8f'ºå\1c1q\1e\1a\8aÇäJYÁ­\19\12è\9e>\93Ü\0ò*Ê.¢\8fÀ\1e\9eì~@\9c¿+<ÃÆÅ?¨\9c4R\91\10\82ÌR[HÔe׫\a\99Í)\18v\bè\15\8f»¹Ý;iW\9e´ÆZFS\18|ÅO\16f^5h¯\81\eÀZæ«K`{\aµï,[A\1f£ÐkM\a;\1e_ó[\95D~\12¨ïæ·+}¯ú­\939\83\1cv>g0p\9dZ\84©K\88±ï\89\8c9c"Kª\ e©\16\96\ e\aíçú&§ÆÕ\9aÀZ:\16ê\9c\ù¶R\ 3\94øÍ\15Ï \83ÅJ¹^P\85\9e\16\94p\9c(Å        \1dø\1c\19ÀXâ\f\98\16z©Røü\8dCaGQ\82\v\84Ý4rt¥\a\17\12(JÁ{EçËàâZ§\88Å:\ 5À\7f}8\80\13s\e\1d»*\18g\96b\aØ\92Z,\8fèN@\82»·\1aʦ\8a'\b¥I;g\1a¤ÁZР5\8d´-Àq^\8e*àè/͸\86õ$\17X\a\ 2TU5¾6Ý  10\85\90%|æ\0ÐQ]\ad-Ë¥]L\\89\86-\Å/Ì:¡n\84ÀíÇ¥9b=WÌ\87ù\11Áa\ 5\9f\96Ç\8c\1eÊ¡G¸\82\80\81Ä\ 2\92ë%ÔiÑ\1a×I\ 1ó¡\1f¿p£\93±Ïà\13JYÝ4¦yÃÃ\8f\9f®\81\13\19+EÜhéóK\94f\9e\1d¸\83\ 4¶ä=æÃË\83w  ¶¦ùê|)\9a\1d\94I\v\96\9f»½L\1aÀüÂ\85`¸´\88\ð]û\fÂ\15ó:\97ÃvRt·ÐL7"ÑôÚ\15ôØ RAGCwÍ@ROè\96:&~î²¢·s\e\f\94#\96N\98\98Ürï®\15,ì¯Ø\8aR÷Î}­°\96ÛM\15g\ 1jÑå|0ÿ¾¶\17\1e²j\97E\87Â\ f3°Ø!\f0\96úíR¼¶\17{>Cjùá"\8cý"ȾùÓÆYÄý²\91ùX\1e\1c\9eé ÎõöÇßßɯ\19\1fÿ¸c"JT\10ògºõÏ"q\94û\89\rQ\ 5¯ü|ñò\84ÿ\aÂU¶\82endstream
+endobj
+3953 0 obj <<
+/Type /Page
+/Contents 3954 0 R
+/Resources 3952 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+/Annots [ 3958 0 R ]
+>> endobj
+3915 0 obj <<
+/Type /XObject
+/Subtype /Form
+/FormType 1
+/PTEX.FileName (/home/cvs/ocera/ocera-pc104/doc/WP07/D7.4/lincandoc/img/lincan_canhardware1.pdf)
+/PTEX.PageNumber 1
+/PTEX.InfoDict 3974 0 R 
+/Matrix [1 0 0 1 0 0]
+/BBox [0 0 706 405]
+/Resources <<
+/ProcSet [ /PDF /Text ]
+/ExtGState <<
+/R4 3975 0 R
+>>/Font << /R10 3976 0 R >>
+>>
+/Length 3977 0 R
+/Filter /FlateDecode
+>>
+stream
+x\9cí\9d[\8fe»qßßçSô[\12\ 3\1eó~y\r\90·¼Ø\12à\87 \b\1c\91qZ\8e¤$þúY«þźí=\13\8cÎxº\r4\f\9fù\89½ö"\8b,\16\8bd\91+}Îå%Ýÿwà7¯\9fþøéoþ®½üÓ\9f?ýí\85wÚëõßZg\7fùùS_«:N\17üôéï_þð)}î/ÿú)¿üþSÿ¼j-ý\85þí×ÏCÂÏ\9f~u=½[~ù§Omåñ¹Ö\97ë¿ô·\9czzé׳\7fúݧ\7fü«Où~ç×\9eùÕ§:¾ú\86¯ýùW\9fJûê\8f¿öç_}ÊåëeÿÊ\9f¯\1fß\7fûòo¿üWýi\1a÷\9f¿ôÓ'\7f5EþÂo¿ògSYÏ\7füµ?\9bfzþã¯ýùWª\ 1Ï\7füµ?_?.;Ó_Wo÷¿;]ê|ý?ÿöË\7f½%þÚO¿ò×_}\9a\83ÛáéO¿ò׫\91Z£÷\96:7½¿vûÛ¯ýùªç½¿öã¯ýù\92·P¹®\ 4\14+¯«§\e\81¿òç«K_ݹgêã/cãß«ï\97Ê)¤Ë·Ý¨Å=s¥\\ 2!¥HÊFÊ\9a'¥£ÆÆÊ'ed¤Ì&)\1d)cÒ¿w
+r\1d}KÊä\94$¿âg\9a¾\99Ë\ëùU_H)]R
+òÊKÊ̲gùU]x&m\91=q\8aÈUXö$eÎ\?i\9d\94ÄåÉ\99SÚæÚȧ\ eÛâ\1a+å<³\1a§lII,×8)\93åj§\ eï\14zs¯òÌæZÍ\92\17Ë>\93¤p\1dÎS\e\8dÛr¬.eæ\12î$rAæ±\9bÈîõçgê,4²|¨Ö\87j}_Õúé6\97\13ïº\f0kU\1d(ïÞ'¿Êm\96\8bI)ù¤Ü¢Ü)}ñ°«)ý<S\90R\16Þ¸ë)ea\1dÜå´¢¦,\93R)e<<Ó$\85ß\NÍ\16®\89-mVyÈY{H
+Þ³¤FêLñ\99\999eÊ3\85S¶<Sø=Û<ck\95ºñGUÿ\98ª¾ÕZ:ú\84D\97±Ìl\f\96t\91<£Ù;\ 6c\89ùd\99´«Ý)x¦Ê3õáÍ>wjþ÷V$_M\8bËÔ&Þ:ÕÖMTõ,j\ fñ«YÅfrÎS\94ëI¹\1fe\v¹\87jz\1fE¢j*íN¾ÞUeè¥1îJÉÒ\b4\8e½Ì,\83\r{\8b3ë3\93zõLMSîÂØ\ 1»PÖvx.pUÇÜú«I¿\9a9¾g\14ý\15å5º\fáeà\99¦oîÈ«\15\95"QJ\95\ 1²Ð\1f¯\14-a­ô\9ej\14°\9f\14©ë\19ßC#µË\vÖj4y&\931¸ÊÜ5¥@®ª)(áÔ6[R?K\9f¹\7fµV|\8fX\eÊ+´EB+gÓù\12ZPÛ4ÏØî\ 5­\LçkHÑ\9a÷ú\ 3EÿPª\ f¥ú®Ju\9bªh\1aoó98EL#;\ 5SÚ¬ñ¼aªgÊí0»x\9d\8f&öÁ\fßë     oZ\0²Ö\95f-/;·3ÐÖJjrùG¤R÷d¡NNYð\98®\94;Ã;eË3\85S\96¤$N\19\9cRh0¹òÒnDãò\95¢\1dBSÌ3ô+Uö5ðLÕ\94\89gTµi\1e\88\81\14\9dòTtP\97B^âNKS°æ\92\93Má¼bÊQäÛb}Tì¿AÅR¯\rêÿú¤\8bÔ£þC&\vìÈÌY%eq\8aÌK\1f»ÑCW»{í\9b\16\0>\16Íÿ/Ó9e8¤5\ 2*Ái¨\93¢\ 3\0\9bŦ^^ÝH\11£\h\ 6~¥¨RT6Ón°1¹ó\bý¾\8aDóõÐ\b×$²±£»¥\11\1a\9b¤dN\91ÉVc£¬SO.ï\92±ë±1\9f5xT\8a{¦ûî\v     \8dó\ru7/áõKãºÐr±¾ëJAÓÉ»®\14üj¨£Bâ^oVÇéQ\ 5¢\9a\90ƽ¯"\91Æ\85\1a\93\12ϬòJÝ\92Õ¯;¥rÊ
+)Ò\98¥I
+ÿ\8a×ÓV;C|í\99\e¼|E)¢âÜ:øï°ØÐJß\98¯O\e|b¢°ÔÄ`X\99fQ`bê°\92*\ 5\rÉs¨s\1a\15\87tð-\v@\1a\17ªüjºÂKL©J\95ã­[ìe-#>SËïØ|\98¦{hÌ\87\ 6¿µé\9d\15    \9aâ\eán¨M\8eÕʲìS0ùYI\fAÅÊâJê\92¤\84gòW\9aîIó\ 6\15 Ýy_E"m
+\8dðú´¡Ð\81u¹´6~¦\88\99\7f\95¿Ø¼·¦üÀì \ 5\98\96®tÖËzÅ\ 4s©sQiíÿJ\91A¤ÒdÌX¬\8eb^:¶¿Ü,\8fM\17rg-x_E"\ f\9b÷¯v9«¯­\ f®rqUÛY4?oo\\96]u¢ÊïÑ]\9dÊM×åW\85\17Í\87ìá\9c¦\13;×x\89}Ëzlãeø-Ë\93í\18\vÙÃi\\ eÚ\1eà\12\9329\85Ë\91Sæ-\84Æå¸R:?3 ó\9528\85ËAÏàWël*äÊ)ûlN 5¯ºfå¼roxæì;Ý[\1aÜ\8a<«Ú:VdÞö0Ë®\?:Âð\fn\ f]µ©\Ïâ{óÞßnâ÷$~³èPãÍ\84-ëJílWTÝaã\12\16ie.\87vǨ?\985}(Õ\87R}W¥ºMÕ\90]\89ÎZ5x?mÈ\1e×\18¨\89.5r6\8cû\9e\92R9åH2x'eÈ\982ÓÙ\14>\9a§)Ã<C¿\92¼ÎòæLIR\8a¤\9c÷\80¦ä5x\1cÔP\84Á\1eùØg\10\10Ù·ü*óö÷\12)$eÄ_\89+puÎ\8fjüåÕ\88åT?Rߣ9VòV\93\8eUi\11\9aVÇdìæ\154\8dMÁ:à\9dòå\11?z\ 5´ìø\96\ 5À¢úröù\95Â=(E\16\11Ûl\9c\1cl\ fw\92±\80\16gXSôWlÃ\9bØç\90;/³¿¯"AS|\95¿>o\16¬\7f\8aë{5\v­|i`ÂÓ\86
+\8dIzñã²#ñ\1aF¨³\0}å×°Ù´uã¦näWô]´_dÆÿ+\ 5\vÇM\97\89\17ÞÜd±»bºcÆ¥\93¢K:\95æBv|«\v\vÐ:\ 6Vlcí¥oÞ\90Ö\84\88!\8eä\1ao\13\8f·\r£¼F\98ôVÎ\ 2}\97\94ÅÏ\9cQºÕ\11\7f\85eÎ-Ñ\1a½u,£\8b¡¼R \97n«µ\81úÑ©^æçÖE°6°\88?ª>\83\14Ýæ;¿ÒÅÚF;\99W[Hm´\8e_ÕlKHmªïi(O\11\1dj5n<À\19£\8d\87ó\9e¼\1eR\9cþ@\89?\94êC©¾«RÙ]`³SÇ&qɦKO¼D)Ñ\9aÇ­]²"ÜØ\vZmÈ3\1cÚ%û\1d\94Çq'\94Çí\14¿ßBò*\e\96Ò\93\84ÝÖ\8cm\7fyîJiH1~\ 4B\15\v\v\86\94">\vB\15Ìæ \8d½\97Û¦\1dk`\91\87\14Í\v¿\9a².Ô\11nGa\bòfÞ^R\132ÚIágÊB\8a\96§¬ò\90\82¥`\13Î\033\93Y
\1a\9b\ f)&Pà£bÿ-*\96T\96ÿ×êgæÓ¹³¬¬6\93C+u§\9cí\97Y©å\ 5è\95¿Üù\1e;hÌ\1d\8dýÎ\8a\ 4\7f\8eÍk­R&(ÎNj¸O\8a\9aé\fÿ1é°\91ÓI\11£\8c\8a"\87¼xì\7fË\ 2p\15¸*\7f¥H{JÑqi\9fm*\19\15yT\9d:þ/\9eÉ.í\17\ fM÷м¨\827,\0W\81«`rÀ¨».Ý*mtJÀÍ\13É\92\)jªvýìõP\9aE\eá±ébó¢RÞU\91¨\9aB#¼~\1a\95·ôûéÀ£¶\87\14Þ\8aï²¾rÂJ¤+\ e\9cÚ]\1f\eó±Á\1f\94⮸w_Hh\9coºW8ïËZµ\8e\90\85\97e\8e·ÀU_Y\1dóÉ¿Ò\15\ eZÔ½Þ¬AJ\ fJñ 8¤qï«H´\f\1a\9aŬß\89çoSª¤,J\99òÌY/;e:\91 z6f\94£\14²¦ö¨\ 2\ fjr/2¾ûBbaÆ7Ýݼ\ 3AÃ:Aª\98´LYD¼Rà¤è¤®v\ 4\91\98\ 3\84]\1a\94÷D)¢âÐâÍû*\12i\h\84ק\rŧº¦¤ôs>KÖQ9:Z×~\1f\9b÷Ö\9d\1f\98\1d´\0\13Õc\9fî*ç  nÖÂàòjhtå\0·¡#+BµÏ\19Þ/4ËCÓùÜY\vÞW\91~¢ÓåXü;+å¯WJÅ\9cC~\99GCL¹tÎ<:ÇÜ\9f\81yÀØU\9e\99\98ßȦUÆ\ 1\9d+E\7f\85xU\8dËÏ\83ãΧæ\ e\9b:\86þ
+qç£wMA\99eR\9c\aÖh\86l;æ±\11Í_4¯\85_\15Í\vó\12=\r\99q(ÔÌÉ2ôÖ\9c¼¼j\ 3g\0\92þªa\ 6&A\10W­¢\9e\93\96°r^I\9e)íä~R°\ 2rvA(¥"EsçS\ 1U\7f\95p¶¡5\9brÿªkë$DüËi\87<x>:M^ø\95\1c\ fÊ£p\9bVyÆëÏϸ\94àC©>\94ê{*\15\rX'& ÈDaÉÞ9ïÁw>6l\82íç¹!C\ 2òg=)'h\7fÊ©Óó\9e\85Ì J¿²Áí'Å,\15ãWê4¶\137§K³'ÒI\17>y§\Zqð!\17Íë\1c\17×ÀþÁ»è;7y\86ë'ë{N    Å×\97\94mÞck\15\83õGUÿ\90ª\86£ÂÑñ|ô\99Î\99ðZ\98¹é\80WÙÔ[Ì뤬\90b|\89GÏáÁ»ð¹³£ò¾\8a\ 4G\ 5Ï\r   Ô͸·Á\1c"¸R\10Ò-Ó¸\8c\9b\1c®\94¡)ã¤ÈHTÏx!VÔåÅ\83Ú[\16\80w\9c]\95ÛfÑF(0Áf·\8a\r®Þ\96ð¤¡bcbÇù\87e\87cA\89GàÂ\15Ü*6ÑFÓx®ÌÇ$%æ«â8áén&E:\9eüJ·ýÏâ»,\ 4\93\89ê»k
+-\ru\91­\15ò¯_ºø\1a\r\97\b\)\1a§\86éW×\v,
+\96Ú]J\8a¿ê\9c\97\9c\b,´4øÒe\82Øø\bCßú\f\8e0h\88Ï\95\ 2O'i^Ød\1c2A\94\14\89â_Õj\ e\9f¶s@UbN®\14ÔªîMñ!\8b3G#)\90»^ðÁGzÇÐ7cSa\f\84Æ\98\94Õã¯6ò\12Ï¢Ulµ\8e®íîõ\87\8fz}(Õ\87R}O¥¢Á(Øy\1a\v\96½²Ü\1a\9e©2\11h¨ý)G\1d(åþ\95ÔÈÓñ"\8c)tSÞ[\16\0\97i C¬-qj¹!\10@\8f\86\r|s\88¼a\ 1~ËBkF)·.Tä\86eû-Î^â\80\82nRÒIá_%\1c\1dÛf\1f\fó%\17Û\8aòh8\83<#e>onz\\1e³\9ae¢o±±°d~r¥`óÁ¦ôó«ó\1eD
+/#;¶#\96\ 4.ÆZåKB>ªúGTõO¸\8dÏu\91×gÝ\88­Ä\94\15ÁäSb\8d2\9fÝP·öIW{è\8e¸ïï\r\v@~\18\1f4?\97JÜC&¯!l\1d \v¯Ì\98;\rxõÆ\9c|æ0\ 41÷ìý«ox\99`¼¹é\0àsÇ(þÎ\8atWSY\85\172Î~vÁYKI¹¯\8fÂTF\17\9e
+¢}®1gK
+f\11Câ°®\14^X\99òÌD\8c\87ô¸+¥\9f±T\9e\99g¼5)4&\ fM\19\96\94êÇö+w^xÊZBø\11²0W\10[`¼\98²\1aû,\9a\17\16§ÎÖ!¥¤\98RØCÑ2£w÷¥åÁm\vê¡\94¹Ùg\91˽&·\99Ìô¯\14\8cä2g/\93ï8)ES \r\ 6ý\8aÛ^Rêi{É\võ#\1eJÁùlãG\Rdï\8f\)Èkj­zý!EÿPª\ f¥ú¾JE\83Z\18\1d^\9f\8d \99·¢äÊË\9cy\1df\16}\ 6ã\85L:\9e\8c2\ f#Ñ=¨½i\ 1ÈZ#dM"?®\8e\85\1dj\13Y[pX\ 5\17\v.Ná«\86O\84nÁA\14\9frâz9f·ð\82ö\96\ 1ûJAÌ®*\85¤Hç\e\85£fw|F/(<o\96ÈÚÂËû»\88úc/\9e.\16\86\1aY²AZ&Ç Øg°\8f¼U%ÑE42Fë0?¤\18wõ£ª\7fLUóU:ÎÅy½O3fß\8d®\94rRÖIá\15Ö¢Ï`»¸«;UamÖ×\9c§è`ár\9dwU$2\80Á\92¼>±6g.5W\91\94Á)ˤܿ×\10§'\16éÁjÝ\ 6ðM\vÀî*Æ\9c~¢Å®\14¾ÞNÇ\93ÂË1:\ 2W¾<NG!M\91gØûP?\82\97\90\8c¯ás?Îλ*\12u¨ \87¯ÏtµcËY\83-\e¶ÇÌE=W
+9!SÎ?^ïAì´®l=èüÝ}Þ´\0w\15D­{}¢\99ç\ e\19½ñeñ\9eø\92\1dìs\7f\87\ 6"=jï£\86_Uð¶\ 5àÎ\ 2\8dê'Zÿrë8\16^\1d½Í\v\9cân\es[å\95¿Òk\88\1fµ÷QÃ}¼«"Qg  Z÷úL3'.öZæªp\ 4g/==>\v\16gäºÇ'Úû áwgyÓ\ 2ÜU\10õðõÓLçâ%=çÌz(ù\9d¥T½\9ciò9Ö%wÇ?jï3\r\8f½àª\94÷V$¸ß^3_eæ4\8d\87\83ÙÞ¬ªÏX \9c\12oS&\aº5£ó\8f\1a\1ez\ 19¥oY\0\9cRóZ÷úL3\17î\97]2þ5\9e¶/\99'5\9eJ/Ý¿zÔÞ\a\r§\13hoY\80»
+¢Ö½~:QIKâ\83Îq(\9b\82ª^²ÞqV\1a°\\81\14¾WjÉ%\ 5\1c¾¡aÖO4ü¡\17Üß\9f\85D\87ò\9aùúT{\13G\97\9a\89Æ<\ 3þIÉÁ7\7f¦á±\17P\87\ 2P\87
+ºúz\7f\18\827\vÄ\vÚ|!\97ù\9c\ 4\8e\17/Y!¹R0C\13\7fù\89\86\ 5¡§Ð§\89ÞW\91ì\ 5+G\ f_\9fèjç=Q\9dþvþ\16Ê®\1aóÄ\aÍ$JåQÃÍE$?";^Øq:v¯6ðÑFqéÊà£\8dºþ7øh£,û\17,\99\99\80é\82¯\a\98`ûgºú¨ÏQç±$òÎ\vI\1d
\v]º*w´§Å×GHC%>\r¯çõ\13tÕÜT\9c°¼iÎv'\84Én\89yzªó\ fýÂ\97\a]ìÝ\17\92:\1dO4NðßÕ\vÎ%"R\82³ZoB\ 6Çù¶\88\f+ýÜ«$g^Úé)ò\f_\18·%|e<Ü°5Ø&ï.ÃÓ¹qo$ó\fýjØÓc\94\8e\13v¹$ðñ\94G¦T\837\8auµoØo¸,H*¡¢\1c\ 6\19Ò[¸N<°^\93}.\ 1¢\15Á\8aÁñÜË\95ÒIá K\89+?\83ì\96Ï\ 1Ln\ 3½\1eaòмÅà\9eûÛ·\ß9ÏÍ\86rþhæs1Ì0y¡-ôÚ#~FÖ#\8fùå\1e÷\13ñ¾Ë1åQ\7f`Z?\94êC©¾«RÑÚèì\1c\ 5uNCæÅ«g2ÓÍ\98!PdÛ:)Øø\92Û\ 22\9cX{`\ 13G³\r\98y³NgFy\9d\90Òi\9f¡\14  RZEÂ\88%\ 5KY\1ag»8¤Ô¦`¬Ô£\10³ó\96\9aÄÙ²«ynF£\14Þd\e\ f)MSÂzc\9eg\ 3\9b]­b\15ø£ª\7fHU\93_\18\9c§Ûåj\b.ª²'Î'jVÕ\1d\9d\93"+h8ph&deàºq½±¸\f¾®W÷²\9f8jÑ\99»ýÂw_HÜ°áÝ)r¹ø\8e&\8dåÂ\97FõÆ\85\9ea=Õ"=s¢£F·gü¸ìì·\18Î\90y_ãÌ\17\ f\99\ fÒdÞgÔ\8b\9d\13_J%ah\ 5\17;móq ìômYq§g\16\ 6\80åß#\83\ 4åU1\90\9c¼2\87û\89¯Zx/Râ\17zÁgFöÖg`%ÌÕQüi"\1dØÎ'\97ì3\83Ã\ 6õ=\88æ°yñµYæ\ 3Küá\11YÚ8\17\13[¹¸=Ì\85è\88°0\17N\15öÊ\9bÖ\18¿ÇÔ3ûûUóZ¼{«µz><²¢\zÝNá\8b«Ì%4\1c¢h>7Õø©\12ëÙ¼Çë\8fû\9aÆ\87R}(Õ÷Qª3­\84ßwâhÆù\88¥\8c\17çó~z\1f\9bÌ\12$6ÿ|\17Q¯ë\1dó\å,^9/³¨v\ eY¤Ñ¼|yd\9aò¾\v  ÿÀ\ f¢÷ÐÛù>M\1dhOJ\1cVwÒáyð}\9a\12I\86\19\97\1f\8c\1f\86ç8\84\937ð¾\8a\84\0\93)ÇuWEäíä0=Ù=«tðó¥Ëµ\r­â\v|]\96êZÅîY\9fz\12\ 6w®t¹Ú¡ñM\82\96o6Ô/*_)p\86åÊZJ¡g\9aM¡gÌ\9b\11^§Wäáîr\13\82×øæDZô4È\92\83ÉRf>l®)ðªô£\9aTc\94¢ç\82η\ 6·}ÆÔ*\aÎ|Tõ\8f¨j\18Òc%Îm$ç\ e\99%wÇO¾idé\84¾\9f\95l\99¬ó²ÄÒûI\1eíØ£­\v¹³Ù|_E\82\91ô¶åõ©ýá»Få]eð\97áÄp«EÒg¢Õ"\ 3øã²ã/Ýò¼âô¸óa2s¬¼T\8e»ÓA¿r´\9e\1cµ)\15ïÑ\83æ\ 5÷0X7\0\81iv\88Çq83\87    å9_N}ç\85Ä6\fß¿[$è\13\1fñ²á\92ø\14\92m¨;\16©Ú·\9f­¾m\82¥qlE=à2ù6Y  F¹Rà«\rÍ\vß\UOñJ\91\9b\19ö\80·æ\8e7\9bÝ\94q¼Û\13¨:Ç     ]å5ÅKR\ e]=\1fu(¸'\r\1f\90à\94\13Ì\9aù\86à\82Ïý\98»\11ÊÂé'\13ðºø¾º\1d\ 3q¶Ü\87\7fB¾·\9c\1f½R ìS\83ɹ¥å<ù       \9bß#é\9bá§Ê~â\95Âs\ f=D\90ñf]yXq\ eC¡õÔÊÚ:\9b7hb\90¼®MFýám³\ f¥úPªï©T\14\85\12\ 6Ñ{ \1d\9crd[\1c\9bë\8bo+Ó\røÅ»ØK´êÙ`\1c\aì;ÂäM\v@Özó1\11¹à£lv5µyñ]\9d\97³5\7f§ :»Ü\96~¥Tïj\16h\8cqP+\7f2G¯\0ªü\81\1cýþ´¦\94\87_\9dÎWù#:z\15Ü\95\82\ 3\ 1 Ê\9dESÊæ³ë²\10]6Ç\8cëa)©\8d©ÏÀe\95³â\ 5×ÑÛ\ 3UòL}x\8f¹K壪\7fLUË7N\8d\8bs\1f\94Æå\ 1K?O\9by\81]?\14À\87©Wo\9a\82k<%þõr\8cxYG\97\90\1e\9d§è`\9do\9c¾£"QÌj°$¯O¬ÍÙ\1f]r\ 3ÆÙU]z±\19\7f\a[ï?}´H\8f\8eP}Ó\ 2p<*»µçBÎ2ù£\ e&v\9a?\94­s\8f¹x6R\1fRÌ3ù¼ù¼ÇçuâQß°\0¸ÀÁëØë3=L\95£©5\90\ 6\17þ,\136S\10\99Vt+\ 6ÎÕ\127àQ\9féZ\83·,\0m}\a\8dz}¦u\19óÍ%\9dJRt÷5ã,ë\92ó[\8f\9aù¨½÷\86ð\9b\16\80;\ 2[\88³OAgp¨\11ô@-ߦÐÔ\89C\8cÙÒ¸h´\90Ýo\ü\15LѺ§Úû á¾<§³¼óBb\9bÔkæë\13ím¸\7fâeÊ\89æ¶p¦Q7aÛâÀtýþߣ\86\ 2Ú8}Ë\ 2à\9c\9d×Ì×gÚË'ôôí\94âJ\90Ï\ 5aRÊ'\1aþÐ\vè\9cÝ[\16\80\8f\ e¡Ê\9b,âc̦3\12GëpÒ]?ìz¥\84ã&eñg¨õ\94è3}~Ðy\9fû9:ô®\8a\84àm¯u¯Ï4\13\1fk7ßuoó\1c\9a\82HVý\bè\83ö>j8\85j¿e\ 1p*ßkÝë3ÍlðúõàÛ\95\82f\11ß<7þ\98\8aÞ±ú¨½\ f\1aN§òß²\0è,^ëH3±\v\95t\82\90B\ 5\97\85c×zÀõJA¹ÍRÄ\13í\r\1aN]ã-\v\80cA^£^\9fi\1dº^¦îÍðÝ»S®Wj¸\16ØÜ\97ÿD3\1f´\97\8e\ 5½e\ 1\92ר×gZ7X\7fä¦ô<8èL\ºÌÇú§l4=ÑÌ\aí¥;\97Þ²\0X\90ñ:v¯\12ðÙ\õLö¹­IgÓÜPêÏà\8bxW\8a®\12`³`ê}\bOtõA\9f\1ft\9e\962Þ{!ñís¯«÷\ 1j\ 4ík(dk\88ÿÐïOµ\86;\17õÚ»+\ 5ïÉ_Ñðg½ ô\14úröû*\12_üïôùÒùÉ7ñÊÍ>y"Peʪk\9e¸Ç}êÝáhÅ«LzSøC/xÖSBoµñïªHè\98^{yùnù\85¯\93b\16ô°\84e\16ë&/\97É\84\ 5ßå¶×8mìÙMݸxÒSbo¢\8eùÞ\v\89«\15°\f1e)¬5¾0Uµ·ñ½ózéGã{\90dáKRdvßø\83Q\1a\ 1|¥ð\1a¢Æ.<ö¦Ç\1eçKÈ\172üû+6âú}¿x}Öwxú;dw \9fk§¦éMx{þr\8f£Øö\1f\97\1d:¦×Õ×çúÌ·jéJ2.ßÖo\16\94Íß\980:\1f{\ 1\1f\97\1d:\8b×(Ò:tE\89k$=¬>Ô\ 6Û\7f£«þ<Ñ૤ä?.»[¼¿ýôÇOé%]ù¤\97Zg¿\92ûº\9e²\9cèÙ\92Óx)cµ»Ê\99©Úr\9a\91\eqN\91;¸F\1eà\11y\82wäE\Jä\rî\81w\ 2¯È\99¸æÈ\ 5Ü"CÆ:#CÆ\96"CÆV#CÆ6"Cƶ#CÆ^"CÆÞ=Ï\ 4\19û\8a\f\19G\8e\f\19G\8b\f\19Ç\8c\f\19g\8a\f\19g\8d\f\19ç\88\f\19ç\8e\f\19W\89\f\19W\ f\9c!ãZ\91!ãÎ\91!ãn\91\9e\91\92\ e®\91\axD\9eà\1d\99\94\ 6÷À%\81Wd\92ñú\1f\91\8b¾ÓqVY\1c\9b\8c2 í\1c£\8dF\8d\8c6í92t îÈÐ\99:"ã·uE^æ·\96\96\ 3³,­D\86\16\19ºÑzdèF\9b\91\9bôYÏ\90¥§ÈCú²g®«\1ayi\1fwÌ}\7f\ 4®¦ï;\86\8c}G.j\13\1cWmSÇMm\85cÈ8Fä¡6Ä1d\1c;òRÛâ\98\ 4n\90q¶È\90qöÈ\90qÎÈ\90q®È\90q¥È\90qåÈ\90qÕÈ\90qµÈlëFä­}Ðrç¾¹#\e\98m]\89\ 6:\86\8c»Gîj\e\1dCƽ"Oµ-\8eaëR\89¼Õ\96Z\1e°u©GÎjc\1dÃÖ¥\15¹\9agêãó5²±\8d\8e\93Ên\19eæ:´¼L[X\9e¦M-³ÎôȬc%2\8fÅ;rU[í\98u¾FÎÚ×\1c'í³\96Y'©ï;^jC\1cOµE\8e\87Ú4Ç]m£ccc\1d³M\1e\91Ù\86×ÈlóSdÈXg`¶9µEæ1(G\86\8ceE\86\8c·\8fê\192\96\12\99\1d\19\11\19\1a\19\14\19\19\98Ç\94Ô"CÆ\94#\93\8c\89ú¾ã\ 1î\91;¸D®à\1a9\81[`ø\0x§c~ç\88\À30|K\94Ù1\97yGæ¹O\8a\9c´N\f\1fß>\95ÈhÓT#g©sÇ<÷I=2t\ 6s4Ë÷;\7fúô÷\7fõò\87OW=üë§üòûO5ã8dM\88»¥Ù\1d­,\9dÛp\7fþ¦yâßß/¿Þ{ù\984\ 3-ؽ ÷"8¾`I\81ì(¶³ïæý\fÍ\r¿â\8f¬\eý^ïû¶Yo»;\ 2Ïz\ fÓlúîP\81\e¸F^à\16\98f\96íîà\81'xxÆ\8c­M²@\8e\ax\ 5¦\99P\9bð\88-£l-EÞà\1c¸@ÆV"\ f}§ã)²xfÙSdäUFà\8a2ÃòY\86ìyFF\1dªµ;\8c2ÓÈï\18²§\16ùV\816¨g;\1eà\1ey\82sd\92q\90\açx\83K`\1a\983r\ 6×È$ã\18+2ö\1a0\ 2[&\19\91\8e´\87!cÏ\91!#FTË\90\91tÃ1d¬3p\87\8cÔ9\1dCF\1a!\1dCÆÒ"CÆR"\7féy~ç\88\9cL^\86O\99SdÈXKdÔIm\91Q\87Ô\97\1d£Î©Ï:F\eµ\14¹\9aºµ\f\19iæê8\9b\f\19Û
+Ì:ÙSdÈH\9e\97cÈØ[dÖ\99\11\99ulE\86\8c#Ef\1d.\91\8bê¶cÈ\88\19§å¤}Ä2lÎ\98)2d¤\99¥cÈH3KÇ\90\91<kÇ\90\91f\90\8e!#Í \1dWµ     \8e!ãj\91³Ú\16Ç\90QWq\98aÛï\85ÐÀ\90q\97ÈlÓZd¶\81#2ÛÌ\15\99ml\8aÌm\97#C\16¬~\19N(3y¾\8e\97öqÇSû²ã¡6ÇqW\eå¸i_s\µO9.Úw\1cgµ±\8e\93ÚdÃXÙ\85n{^¢Ã\9eY'kdÖÉ\19¹\8b\8eyn¢K\9e«è\8cgȸ{dȸwd\8céðj\r\0÷\18í\19>C®\91ácä\19\19>ɽ\ 2ê¹\83Gä§Þ1\7frQ½ãÛkùåÞq\eéø®   ÞlãosÜ\9d\0ï½ô\9a\9féí¤ø_©wü½Þ÷mÞq.w\ f¸\17\ f_\85ï\96¹¸FÞà\19\98ÖM®io\8e\9cÁ=r\ 1ïÈ´CYîuIÏ\r<#wâ\99#\ fp\8f<Á;2d\52d\3ð\84\8c·\87è\192Þ=Æ3d¼{\8cg\92±ÞóCÏ\r<#\93\8c×d/ò\0÷È\13¼#\93\8c\88¼Á3ð"\19ë½\ eâ9\83\ 2Þ\91!#é\92cÈHºä\182\92.9\86\8c¤K\8e!#é\92c´é=Â{Þª\e\967Úô\1eù=£Mï\91ß3Úô\1eù=C\87oKì\19:|\8fü\9e¡ÃkD\86\ e¯\15\19:|¯\17{^ª\93\8e!ã½þb¹¤$ºê\99uxFV\1döÌ:\9c\ e\97ÈhÓ{Äð\8c6½×;<£Mï\91Ä3tø^ÿò\f\1dÎ%p\86\ eç\169Kßñ\f\1d¾G$ÏUú\94gÈx\8fT\9e»ô5Ï\90±ôÈSú gî³+2d¼g6\8e\v÷Ù\12\99ûl\8bÌ}vD\86\8c÷ÌÆs\93\192Þ+\10\9e\87ô}Ï\90ñÞ\9fó¼Ä&x\86\8cm\a®Il\85çl\9eÉ\ fÏS^\96Ï;sd\94¡ÎÈ(s­\91¹Mwä®míØè\8c㪺ç\98u²F\86\8ciG\86\8c©\af\9d¡>ëxißw<Õ\868\1eb\8b<³Më\91Ù\ 6æÈ°\99sF\86Í\9952lÔØ\91aÓF\ f\f\9bPF\8e\f\19û\8c\f\19{\8d\f\19I\97\1cCFÒ%Ç\90±åÈ\90\91tÉ1d$]r\f\19kö|l{-\91»üÖ3ÿ¶\ 5Æ\18Zj\8fÌe\e\81ç\962{æ¼VdÎk\afßì^)ñ\¥®\1c\93/\1a½þ\8cÛð^®¢-xý·\17K)y¥¿Üë¿l    üí\82/ý¼\927A³\89\8c\88â»ßàs\ 26ÅÿJ½þïõ¾o\8c\ 4Û5\1f¯ÿ0í>ìZ\ 3c·t\93F8\1eà\1e\98<â;\b=r\aÏÈ\e¼\ 2#êlÃs´\8cgH#,#\9ak\93F8\86,4³1\8c\1e\83wz."\8b\93FTÇ([\19\91!#YnǨ+²Ü\8e'¸DF\99ÕÓ9\fÙS\r\8c詵Wä\fn\91\ 5\v\82\ 6N\91IÆu{Ê\9e\a8G&\19×\98\91\17¸D&\19W_\81±{¸È\12;\86\8cmG\86\8c­E\86\8c-E\86\8cµG\86\8cð°,CFÒ\ 1Ç\90±ÔÈüL\8f\8cw\92Çç\18e(;2Ê\sdÈXkäld±\8c:\84Gc\98ë\9cú\88c´QË\91!c«\91!cë\91!#yv\8e\9b\9dcÈØsä¢:à\18\1e\99uf\ 6N¬c;2ëd\8eÌ:\#CFx\1c\96»ê¼cÈH\9e\8bãª}Ç1d\9c52d\9c=2d$OÊ0<\85\8bwdȸrdÈH\ 3\95ã!¶Â3d¤\15\14ÇMl\8egȸsdÈ\88Y¬e¶i=2ÛÀ\19\18cÇÚ;2ÛØ\14yJ[x\86\8cäa9\86\8c¹F\86\8cyF\86\8c¥D.bC<géã\9e¹Ï\8eÀ\18[ɦy^Ò\a=Oék\9e!ã½?ä¹\8bMöܤ/x®¢ó\9eY\87KdÖá\119©NZ\1e[uÏ1dÜ)òT\9dq<T7\1ccLO-2|\80{\8cö\f\9f!×Èð1H\a\1cÃ'!\1dp\f\9f\8atÀòS/ø²8Ë{Áçf¡_æ\ 5\97Å«Î\99¾&Jg}y­:ãK\9a¤×\88A)¸Þàç\87_\99È\90ïô¾oó\82ûÕa®z\9b÷í\ eÀ»}ûåÞz\9c\843à"Ü\ 1ïVè\97\83iq\90\9díW·ò\98     gÀ[\azO\ 1+a       Ø\b{@\12óê|\1e\91\ 2\92@\97>z$\81.m÷H\ 2\8då\91ÆÌ~õH\8f$ÐÕß=\92@s\ 4$\81.\9bä\91\ 4Z% \9a°\ 5$\81Ö\fH\ 2í\14\90\ 4Ú%    ´»Gò\7fîæõx\vt7¤ÇBX\ 3\11°\11®\80·@wuy\1c\845à$\1c\ 1\17á\ ex\vt\17Õ!­tÝÙ{$\81Ê\fH\ 2\95\1d\90\ 4ª%  T{@\12¨Î\80$PK\ 1I V\ 3\92@Ôq,\92@u\ 5¤\aj
+H/+% VªE*dê\ 1I\11÷\fXaV\ 2\92\82¯\14\10\9d¡\ 4LÒõ\f\16t²ì\11?ó\ 6)\8bÑ\ 2RqF\ fHE\1f3`\97.m\91ºÓL\ 1§tt\8bÔ\9df\r¸¥û\el0\15= ªd\ 6\84©X\ 1«TªE\98\8a\1c\10¦¢\ 6\1cb@,\92\a\bV,nin\83=\89±±H\ 2í\1c\90\ 4Ú5  ´[À&\86Éb\17E´8Ä\Y\9cb®,R\17I9à\16#f\90<\8e{°ñ\98Å´Y\84\19\9c\ 1«\18<\8bd*r
+¨fТvS\8b0\83\12ãh\91\ 4ÊÓ#y\8f÷ à\11f0\ 5,bH-\92\ 6lb^-\92@e\ 4\1cbt-Â\­\80jÚ,Â\ff\8f4\13À\ 3\ 6ñ\0^¶Ã{K\ f¨&ÓâÐ*1صR\r¢a{@ª¨\\ 2BavÀ,jdQ\15Ñ \1a\96TÙ"\86ü\1d\10îÁ\b8¤CZìÒy-6éþ\16«\18\10\8bEL\90Å,FÌb\12\83g°o1\99\16atK@\18è\14\10\f\bÃß\ 2b\90(\ 1á\86î\80pYG@\12¨·\80$PÏ\1eaHÛ
+H\ 2µ\11\90\ 4"÷À"     Ôr@\12\88Ü\ 3\8b$\10¹(\16I Z\ 3\92@Ôq,\92@e\ 6$\81\88\ 1\10n\87A\12\88\5\8b$\10u\1c\8bTH2L\16³þL\11N\ 3uH\8bT%%\a¬R\1c\8b\10¨z\84ÛLFÌb\171-RE\95\110IE\19Ä\ 4\84L\90E\12\93\1cN\8bÚ\0\8a<åÂTÎàý²\9f>\8dÆ\róÊ\b\87±-\8f\8dgº~7)cÖ\9c×\89!ëüyÏ»\ e0÷üKæÑ\83¿£\93ñù\8eû½|\81ÅÝf\98÷\9e\v\ f2>0BÆÛÿJçÑßë}ß\18CvGßñDú0í\83ÞA·\81\17x{Æ´8O4¨å\ 2Î\91\e¸DF^$\8cã\rn\81±O<©×;®à\11¹\83gä ^\91\1d\18ûô³¥È\90\85,\96cÈB«     \8eQ\87d÷,#\8eá\ e:\ fÌyõÈ\90\85¬ªãa~kyj\19\1c/\95ÑñÖº²Ü\92Ö¹ã¬mçØè\80㪺ä\18uHVÇ1d$Ëå\98uµD\86\8cdA\1dCƼ"CFò6-wÈH\1e«cÈ\98sdÈ\98vdÈHþ\8f\98zdÈ\bwÞ2d\84Ço\99d\1c:k8¼À#ò\ 6·À\88\a\1d´Æâ8\83Sd\92qÀ{²\Á=r\ 3×È\1d\9c#\93\8c\83V\98\1cCF\9ao:\86\8cä_9\86\8cäaYF<è \1fË1d\1c+2d¤õ5Ç\90\91ü/Ç\90\91<0Ç\90\91|0Ç\90±ÏÈ\90±÷È\90±×È\90±çÀ\88\a½U<0d$\eâ\182\92\rq\f\19É\868\86\8cd\e\1dCF²±\8e!#ÙjÇ\90\91l\8bã/=Ïï\9c\91\9bÉËr5e³Ì2æÈÙÈh\99ë°\ 6æ:'[íxiÝ:\86\8cmF\86\8cäé8f\9dI\91\9biwË\90±\97ÈÅè\8cåltÌ2d¤Y\82eîS}Ff\9d\\91§ê¼cÈ8rä®}Ç1÷©\1aÙôAǦÏ:æ>>#'íû\96Ùf\8e\1d\99mN\8e<Õæ8f\9bV#CÆÙ"CFZ\87w\Õ\ 6:\86\8c\98\85ZÎjK\1d'µ½\961&\ eZÓw¼Ô\86;\86\8cºBw\18\11\99\8cÌcÄ\8aÌcÊ\8e\f\19w\8aÌcV\89Ìc\\r\98è\98ÇÐ\1e\99ÇÜ\19\19\15\192Òj\86\ 1Rdö\19Jäl\9e±\LÙ,W­\13ÇMÛÈqWÝp<T'\1d\v\8e\97öMÇ[m\82en\8b^#gµ\81\8e\8bÚdÇ\90\11¾«e\1e\vJdÈXfdÈhüÌaüL¬<:ægRän~k\19e\80Ok\19e\86\ fl\192\96\15\19u\ 2\1fÛ2ê°ÖÀ\çµG^ZW\8ey,Þ\91ylÊ\91!ck\91Ù7\18\91«¶©c\1e\9bRd\1e\9bJdÖ\99\16¸\98±É1\8fM;2ëp\8e<T\87\1dóØÔ#óØ4#³­N\91ÙV\97ÈYû\9acö]Gà¼Õæ;f[\9d"Oµá\8eÙV÷ÈÆV;nj\93\1d³ÍÉ\91\8bÚ^ÇYm\97㤶Ô2¯\15\90\rt¼Ôf:ÆÜ\90\1dóÜjDæ¹Ø\8a\f[\9dsdØj\9a3:ÆÜ\90\1dó\rFæ¹çö\8ce³|\9f²\fÌk5-2ÖÖ2Öò¯®õ*ÌÖkD^/OÖ×86[××2\9fÑüeëkw£á-ø\1aÎ+Ío?ÃTe\8e¥\1eø²Ö=r}f\eá\7fe¢µ¿Óû¾5Z»ñÚÁëaD0nD4(óÝAûî\e\8eqçϾ}\1dÏ\88\ºû\98g¼óö¥\1c#\92sß}Õ3çÕ\ 2sdò-¼gΫDæ¼²g¾cg\93Mq\8c¼È\87°Ì\91ád\9b\1c#¯9##¯9\ 2#òmÏ\1e\99ój\81\açU#s^%2ç\95\ 3wÎ+EF^cGF$ØX\91\11Q6fdD\9eÓ\Å2G\94Ñ\18ã\18\91l\98óXF\84$æH\86'çU"s^9ðâ¼RdäEc§cäE¾\9deD\84n\1a\83\1d#/\9a[\1aæ;\9dö=\17õÌyµÈ\9cW\r\9c\12\99óÊ\81\vç\95"#¯¶#óÉ\85\15\18w\82í{nï\19yݶÂ2tã!Jpó\17SÅúJÊ/²¾ô\ 1\ 3êî\8dO´ë{ûùÊêÆ\15Üç\99\9f\1f~e¢\ 4¿Óû¾õþ¨6\10cþÊ\8c8Ö6)nÔpÁ\9d\f\93ÎO8.à\15\98ï@¸ã =ã\9d÷é_Ï        Ü\ 3OΫEæ¼jàÁy\95È\9cW\8eÌy¥À\1dyÝqâ\9e\91×}:Ú1îØ\99\14\18yÑy\11ÇÈ\8bâÖ-WΫEæ¼j`¾«j\96È\9cW\8eÌy¥À¸#e\8e\1d¹\82Wd¼sÌÈ(Ã\18\81q'̤ó\ 1\8e\16\98ïÔ¢s\ 6\8e\12\99óÊ\81\eç\95"#/:÷`\19w+M:\7fã\18yÑù     ÇÈë¾;Èñ@^t\ eÃ1çÕ\ 2OΫFæ¼JdÎ+\a^\9cW\8a\8c¼è|\89e¾Û¤­ÈÈ\8bΩ8F^d7,çúÄú¶\19c´%å\17Åh7þ.÷¥\195¼÷*Èg¾G\rÖò<óóïÌý$ßé}ßh}ïà}Þ[>L-s\1f\ e\b<Á-ò\ 2ÏÈ\e¼=c>Ôò*\913¸E.à\19¹\82wdÒ\94¼Kä\ en\91!#­ÿ9\86\8c´Îç\98d,:7=¼Á-0n\16,iFÎà\1d\99d,9G®à\16¹\81\ eÞ\91IÆBq)\8e'¸E\86\8c\88\f\19Ë\ e\f\8b^h\1dË1d¬-2d¤}!Ç\90\11ûù\96!£îá\1f\86\8c´^å\182\92\7fæ\18\1d\192Ò>\8ccȨëRÌ\18\19
+ù¾\8e!cß\91!#¢\8d-CF\8d,>\f\19Ç\88\f\19Ç\8e\f\19g\8e\f\19uÝ÷0d¤ù\98cÈ8w`x
+eåÈ\90\11û\ 6\96\8by¦<<?[d¼sÌÀ\\ 6\9a·8æ6ª\91§¶µã¡ºä\18u\88({˨óÒ#s\1f\\91M\9fu\9cÕ&8\86\rÄ>\83å¬6Ç1Þ©û\ 6\87«Ú"Ç(3Å#8î¦\f\96Q'iD\9e\1c³\r\\91ÑF9\ 5æ6Í92ê$×ÈEm\9dc®ó\1e\99\8cܵ\8d\1c\ fµ\8d\8e§ÚFÇl\ 3Kä­6Ó2<8è\8c㬶Ô1d,+rU\eë\182R<\97c£Ã\8eYçkdÈHû  \8e\97ÚdÇ\90\91ö\19,\8f¤}Ê1dl)rQ\eî\18\1a¹©mwܵ\8f;f\9b?#³MX\91Ù\86¤ÈlósàÉ6¿Df\9bß"CFìÏ[\86\8c\88\1f±\f\19iýÅ1dÔ\98\94Ã\90\80\ eCÆQ"CÆQ#³\8dí\81\17Ûä\11\19\98å8i^\96ù\9d(³åed·<M\1dZ\1e¦Î-³\ eìÈMuÀqU]rÌ:Y"gÕmÇIû\82\99Ú"/í\9b\8e§öqÇì³ÍÈ]m\8eã¦6ÊqU[縨Ít\9cÕö:66Ü2Û\84´#ó\181"ó\98Ò"ó\18\94\ f¿#³Ï?"c\8e Ç~\ ecN¡ç\85\ eó\1cdGæ9Ë\b\f\9b\8f9\8b\89V\8eÌs¨\1d\99ç\#2d\9c-2d\9c92d\1c;2d\1c#2d\1c-2d\1c90ÆôÜwdÈØGdÈØ[d\94¹÷ÈÅüÖpá¼fd~ç\8aÜ´l\8e\14\18s\19Èè\18ï$Ûå\18ï$\9béØÔ¡åÄïì\91\87\85c~ç\8cÌï\\9eÏ\{ìÈØKdoú\9ar¿
+³µ^\91Ë˳õ\94\18«\7fçûËW³/ï\1f{\94c5¾\9f5o~oå\9d¾kæpvúÎúGø\95YOùNïûÖ3ïeê¡w0\1d\ 3©eGƱv\9c¬Pæ#ì\15\96ù¨L\89\8cã6\88÷Ìïl\813¿³GÆA\8f:"ó;gd\1cÖ×\98üÃ8\1a¢1ùÌ\ 5ïÔ\98üÃ8\18¤óùÃx'âð-ã\9d\88É7\8c£9µµÈüÎ\1ey\98g,\9b¼\1c/-³ã­ub¹\99ºu\9cµ\8d\1c\17Õ\ 1Çhë²"C\16\8d½?\8c6*52ë^\8e\f\19uÎs\182jTÁa>úÓ\ 2ã\90Y¥ó\85\8e!cÚ\91ù`Ñ\8c\f\19\11Wo\192"®Þ2dL)2\8e_\99CºEãí{Ù#2\ e\84°e\1cîÚ90\ e\f\96µ#ã(×\1a\91q@kµÈ8\10¶Jd\1cÇBü¼e\1cÿ\9a32dDü¼eÈ8KdÈ8SdÈ\88\18\132\8e\1e\192\8e\1a\99\ f¤åÈ\90\11s\18Ë\90\11±Ê\96ù¸[\8b\f\19{\8e\f\19áë[æÃt32dÔØoæ\ 5\195nü0dDü¹eÈXWdÈ\88xxË\90\91l²ã/=Ïï\1c\91³ÉË2Ê\wà#c\8a¼TFÇ\\8752ê¼µÈÝÔ§åfêÜ2dl+r1mg9\9b¶¶Ì\aAK`Öá^#CÆÞ#OÕ=Ǭc32ëä\8e\f\19G\8a\µ/8æ>R"s\9fj\91M\1f´Ì6j\8cÈKû²cÈ\888\17ËCm\82ã®6Ä1Û¨\1a\19\16\19\119«Ms\f\19ç
+\8c1¨à~
\90Qç]\87§ÚXÇ\90ÑÜ]QÌ\95\16\ 5÷TXnjÛ\1d³\r\9f\91ÙæïÈ\90QãÞ\ f\9d\ 3óÑf\8d{?ÌcV\8bÌc\\8fÌcâ\8c\f\195îý0\1f\ fÞ\91y\8cN\91yLÏ\91\11¹¨ì\8e¹\ e[ä¦:àØè¤ã¡}ÁñÔ>ëx©­p¼ÕvYæ6j9rV\eî\182\96\1d\192Âg³\f\19u]»\9buíÎkß\96¿ô<Þ\99wd.C\89\8c2\97\16\192Âç4|\8eÞïȨC\9aË8F\9d×\1a\19mTGdÈXWd\1eSRd\1eSjd\1eSzälÚ×2\8f))0\1fþï%2ëL\8bÌ:6#\ fÕ=Ç\90qäÈ<¦´ÈUuÛqQ\9bï\98ml\8e\9cÔ\86\9c\ e¾¥ã¥}ÐñT\9bìx¨íull¬ã¦¶ÔqU[ê\98mH\89\9cÕ6:Nj\8b,§­¶ÎñR\9bæ\18s(\9a\9b\9cKcÔ\ fó\9ceEÆ\1c\87öÌ\1cÃÆj\8cúaØX\8dQ?\8c9\97ƨ\1fÆ\1c­$Ïçj\87R"CF\8dQ?\8c\8eUë«©^\85\9böfÇýåɺÒÂ×\82ì\1d\10ß#F½\97ÄñâmÈÝ\12üÞ\9a?³E(\ 3)ç6Äø+]Wú^ïûÖ8\9d«ëß7e¿\1eÄJàe(\1cb]ø2+\ e±\9ax\19!\87XüL\99C¬Ø^\86Ï!Ö\11¯\82[äÕà+\7f\87X\8b¼òw\88\15Ö+'\87X\97¾rr\b\81®\9c\1cB ë\9d\ e!ÐõN\87\10¨5\8f\10¨u\8f\10èúµE^Ù¿\9es\b\81®ç\1còêtö\b\81®\14\87¼\ 2]=B ë\1f\87\10¨\ f\8f²¶í\90WÚ·G^ÿM\ e\a¯â\17\8f¼\86\=òÊx÷Èû    Ã£¬N;\84\9cÂ!ïl$\8f¼\ fR<rTYõÈ1eÍ!vÜî\1d\13\87\10è\9aG8\84@×$Ø!Ç\92%\8f\10è\9aA8\84@W7u\b\81\b\81ÖðÈ;BÓ#ï\1f-\87\8b£C\92G\8e\rÉ\1ey'«x\94}/\87¼KÖ=ò\9eÚôÈ\11rË£ÄÇ9äݽì\91÷\ 2\8bÃÍ\91qÍ#ÇÉt\8f\1cõ2<rÌËòÈ\11/Û#Ç\7fd\8f\1cýQ<b/ò\1ac\1dB Ü=r\9cË°\98SâmÑ\15\99·Qwd\ eûH\919ì£DæmÝ\1a\81=\ fó\8cåiÞi\99Ã\r`\ eg¤²96²8Ö0)Ï\1a¦ã¹k\1d:\9e§Æ\ 3sK´À\1c\86x»I\9eóiåÀ\1a¶å\99Ë\96"÷£Y\81çÑÃÀÜ\efä}´Ùs\15Ý\ f\NO     ¬a^\9eûéo\81u[Ý3\97-EÞ§\8f{f/à^Fp|\9e\19\91×±6\81Ù\86ÔÈãX²ÀýXÃÀl©wäzljàrìr`Þþï\91yû¿\ 5æméU"ëö¿gÝþ÷Ì#ã\8aÌÛÿ32oÿ÷È\90q¶È<ê\95È<FæÈ<¢¦Àg\9b|E\86\8ccFæíó\1e\99·½[dö\ejdö2rdöIRdöÎVdÈØgdÈØG`Þ¶ï-2{^52ûi92{u)2û·;2d¼\97#<CÆ6"CÆÖ"³ïZ#³§[\1cóP\96¯\1eí\90§\aÛ#O%¦G\bW\87G\88vO\ f,²Ë_=òô xä©Dö\b\91Êö\b\81î©\8fA¸ 4y²\b\81î\89\96E\bT\9aG\9eR\15\8f<ýÊ\1e!PÞ\1e!P^\1e!P\9e\1e!ÐílX\84@¹9d×ñvb,B Ûá±\b\81\b\81nGÊ"\ 4JÓ#\ 4º\1d4\8b\10èvæ,B T=B ÛI´\b\81RrÈ.ÿí:\1a<\ f4\8fY\vi\90\1e«V\94Á¦\95j°K³X\1cÒ°\16§¨\86EU.\8b¬\88Ó!7lM\1e³t\ 6\8b\93Å*\1dÒb\93.m±K÷·ÈSìîq\1eSäp\1d\83æp\1f³h\91;ä=éµÈ¦xy\94X-\87læ«G\1e\14ºG\1eB\96G\9d\86Zäá¸zäih÷ÈÓÐeQ,éJ\8eå\87ÛãÔw\18ä\ 2M\8f\ f\8fM\vdP\86}\87YE2ÈC{qÈÍ5³Ç%Ue\91\aõíqHe[Ô¥\ 2\8bº¬`Q\97 ,Jt\9dÃ$j`\90;Ô(\1e¹\90Ùã\10õ²È\v4Ûc\13\ 5µÈ\v?Ó£D3:TÅ78Ľp(Î\85Cv-\8aGv,²Ç.]Ò";\ fÛ#»\ eËc\96®n\91Ý\86á\90\17\9fnca\91\17á\9aG6,Õ£\1a!\8bl°²Ç*fÌ"\eÂí\91\8dæò\98Ä<\1aäEÃÛu±8ÅÀZd7§yd7§zd7§xd\13\9d=r!\93Gvh¶C\9ejÑb¯A\1eh¦G\1e\94\86GvhºG¬ß·t/ý\8cû#\97\8côºt/ýXÜ/\8f«ýuc\95\7fñ=ϯ4¥¥\15òô\8b¢H/×é~˦Kb\10õ9éV\98M\1f<ª(\16ÝÃ|)þI      ¿2Q¤ßé}߸Ú\7f\7f\9bï¶\18¯\aIa×Ýí,Öó4\fÐëA*Ãý]>\87\r8=\92\1a.2\82\ 6\apx$Ÿ¿\8bçp\ 1»GR¸EK§\8a0Ä÷\97Â\1cfàö\bAi\81Ò \ 4ÚË#    t\7f¡Óa\aN\8f$ÐýõO\87\138<\92@»d\8f\eØ\1db¨¼¿Zê0\ 3\9bÇ\ 2Ü\1eI »·;\84@my\84\81·\b\81úô\b\81î!Í"\ 4º\eÖ"\ 4º\87`Å3K¤Kl<#\17\9a½[Ælycön\19e53yfΫ\ 4Æj\ 5]bã\99K\9c\ 2\86.±ñ\f¹i¶o\196\94.\93ñ\9cNM{\86\1dÝ4\8bv¼N+\ 6F^µG\1eGC\ 2£NÊ\88Ü\8eö\ 5F\9dÐj©ãr4;0d¤UHÇ\901µÀX½Z´ºç\18=\9d\1cÃ.Ðê\9bcX\11ZMs\f\9b\83U0Ë°PfU\8b\19}~ÖÈ°\10´êä\18ö\84tÏ1¬\ fé\86eèÞýéÒÀ\90\91Vg\1cCÆ6"CÆ\96#CÆ:#CF³ªÅ\8c6M)r9v'0Ú\94\1d£Mi5ßrbû\95"C\87±KaYlc`¶¤-rWÝs\f\1d¦ÕsÇUuÒ1dL#rV]uÌ:\\1c\1f\93\96\92GVàå\91ÕwxDcÞC\91E4å.\1eÛé\0\ e¡¶ky,§S8äá°y䡳8\f\985ÈCòòÈÃ÷ð\b\81\b\81fñÈJº=B \9dÀ\ 1¹Cv\8fù¨¹C\bt\ fP\ 6Ù\85 \89\96\88Óã<ÝÖ!\ 4êÕ#\ 4êÙã-Ð\97<Ö¹ñ}\8f×{¨ø\1e\1eëe\18È\9f\9cIÞ[\1a\9dAºz0\9fJZ\88,¹mÀg®Xÿ+ã±~§÷}\9bÇZÓí
+\96;;Æ»¡/,\1e+0{lÀäq\10Þjeq\ 1\97Ç\r\9c\ ei\80»pxDÆ·
+ZDÆ÷Â\81Eθzä\8c\8bGÎ8;l\9c\88\8co%¶\88\8cûò\88\8coÕ¶\88\8cûð\88\8c{wØ\91ñ½p`\91\1e9ãâ\91\1e9ãä\11\19·íp cY8`DÆ´p`\10\19·á\11\19ß\v\a\16\91qk\1e9ãêprÆÅ#g\9c=rÆÉ#2®Û#2¾\17\ e,"ã:\1d.d|/\1cXDƲHËØ\81Í#g\=rÆÅ!\r\ f5Ѧ\88AÎ8yDÆe{DÆey\1cú3\83]36ؤ\90\16UL\8bE*Êb\96\98¤Y\f®-\rkq\89\12X\9c¢F\16\87(¢Å.Jk±\89Ú[¬Òq,\16éd\16³tS\8bI:ºAV£¾<.1+\16§\18&\8bjÄ,v1\83\16\9b\18R\8bU\8c®E6ñÉ#\ 4\9aÅ#\ 4\9aÕ!wÓÙ=B {±Û"\ 4º\1d\19\8b\10h%\8f\10èv\90,B Z´1\b\81\b\81î°,\8b\10h-\8f\10h'\87l\ 6o\97Ð"\ 4ÚÕ#\ 4º\ 3°,B ;\0Ë"\ 4º\17Ù,\92@´If±\ 2\8bÇ\ 2¬\1e\9f?Ë/Ë\1e»faphq\f²@ËãR\81\frE\r\87§R»G4Àí\88[,R©\16«4\80E(Á\1d8g±kk\1adåÚ\1e§*\81Á¥
+c\10\ 2Ý\ e¾Aî\f«{dåj\1e\8b(­Å*
+n\91\15<{ìÒE,B ¹=j'³¨\1dÒ"wÞá\90\8dØì\1eÙ(4\8fE\8c\82Å*\ 6Ä"»\8bÙc\17\13dQ\9dH\8bS\8c\98Å%\ 6Ï"»uÃ!\ f>£{dg¯y,bt-²!-\1eÙèf\8f\93GvʶG\bÔ\97GvÕ¦G\1eP\86E\9e\98\14XüÈÀ2²\ 5\96q00\8f\9a92dÓh\98Ã<"ïÈ<~¯È<ÚÏÈì\e\8cÀ\99=\89\1e\99ýÅ\16\192Rô\8ccö$Kdö%sdö)Rdñ2\ 3Cƺ"³ï7#³\a:\ 2\17ö
+{dö³ZdöÊjdöáJdöørdö\ fSdÈXvdÈXVdÈXfdÈXFà
+\19K\8f\f\19i­Ì1d¤èXÇì!\97È\90Q×i\ f³ï\9c"CF\8a\8eu\f\19ó\8a\f\19±Æk\19\11\99\9fé\91ù\9d-2\97¡FF\99s\89\f\19s\8e\8c:¡5=Ǩô#£Îu]ú0Ú\88¢c-s\9b¦\11\19\1e\192bMÛ2d¤èXÇ\90\91Ö\ f\1d\94#CFZ\9bu|ËX6ÖÌ-gð\8a\9cÀ30õÙ²÷\88¼À=ò\ 4·È\ 3\#wp\89ÜÀ9r}9\1fÅð\f\19)ÊÖ1d\+2d\3ðù\98Å\88<Í3\96\87¾Óq×28nZfÇUet\´N\1cg­CÇIë\\19C+5\91Ãu\1aÔá<Íïp\1ceqØ\8fj9lG\11\1dÖ£¶\ eËQr\87ùt      \87ét \8bì\12¥îq\9dÎép\9e®ìp\9c\8eï°\1f3á°\1d£â°\1e\13ä°\1c\83å0\1fóæ0\1dch\91]ÙÜ=®ch\1dÎc\96\1d\8e\1d²)Ý\1eyàH\1ey\98É\1eyP*\1ey\b«\1eyÀk\ ey
+RºG\1eL\87G\1ez§G\1e¨\97G\1eæ¶Gv\ 2\92Gv\19²Gv0\8aGvGªGv^\9aC\9e:Öî\91\1d£á\91ݨé\91\9d®å\91]\96íQ\17
+-ꢢEv\16\8bGv-«GvD\9bC^à\95#\8c\8cìä\ e\8fì\12O\8fì@/\8fì~n\8fº¼e\91]ùì\91\1dÿâ\91§   Õ#O*\9aê\8b×\16u¡Û"Om¦G\9e\ 6-\8f<\95Ø\1eyz\95<òT,{äi[ñÈS¼ê\91§\83ÍáÙ è\1ey\9a9<ò\94tzäéëòÈÓÁíñùÞ
+vxÂ\ eWÞ!&ë6á¿|\87«æD¿¾TOÞ\8box]\83\15ï6ÝË\ 4ôLî\1c1\15\7f¥;\ßë}߶Ã\95çÀ\9aýëÁ;=ϱ<f~º#\84éõ`Æ#Ýc\ 1V\8f\15\98<6¾<v`÷8\80Õã\ 4&\8f\8b°-\8f\e8\1cn\bÚªG\bÔ²G\bT\97G\bT\87G\b${\ 4\8c\10¨f\8f\10H¶!\18!P\19\1e!Ð=ÌY\84@÷ði>Â\97Ì\87ú<C¦<"CªÜ"C®\9c#C²´#C6Ä3X\86t©E\86|©D& éô\9e7x\ 6>\1fbl\913¸D&\19\87úö\87ëËù\90¤çf\9e±Üµl\8e\15\19\a^§õ\ 3£MuÝ\83¹°Æ>0Ú´?0÷È\11\19mª'ë\ e·c\ 5\ 2£MG\8eÌ=³E\9e¦l\96¹w¦Èûô\18Ïø\90êÔu\8fÃYuÛ1ëp\89\f\19qâÔ2Ú\94æ­\8e¹Msä\ 1\1dh\91IFú\0¶gèðÌ\91¡Ã£\ 5>\1f\1e\9e\91¡Ã\1aãÇ|>`\9c#C·{
\1f\88m;0\7f¨µ­Èø-µ\9dåÄ¿\1d\8eÙ@\8d¶<¢Bè8\8cATß(\1eñ29×Â\88¦\91ó \8cÜQ\8bGéÖ\ eÙ\b\f\8fP©T\1dò`\91\93G¨k\9e\1e§\98d\8bè
+·©·È\ 3Àò\88nÖºG(©ì¿2Þ\ 2}ÉçѨ\9e»\82\7f¹Ïs\99\ 4Ü,|Y\bþ\92\ 5£17×3\1517'J<þÊ|\19õ;½ïÛ|\1e\8a\99£\e}@w\15o\9a¿+u¢êh\10eGw\ 3/¹+\ 2´\88º£MT,\91z!vNéVĵ¦£BÔ\1cU¢ìè.ý\9aÛQ'\1a\8e\ 6QuD¥\9fÙ\11\95~,GTúÑ\r±W±F        H\ 2Pø²E\12\81\f\98E\12¢·\80$\86n¨0\92 z\88xé®     \82T-\92\ 6$qZ\ eH\ 2Ñv\83Aò Ví\ 1\ e>S$\81j
+H\ 2\95\19\90\ 4Bp«A\12¨\8c\80C³0\b\81R@\b4\ 3n©T\83\ 5\8d\95\ 3fnl\8f$\10\1c\ 2\83\12\90\ 4"§È"     ´GÀÁÝËã-\10Bg-.î\9e\1e·¾L\91<\83µf@\12\80$ÐØ\ 1«(­E(bÄ.jd\11\8dU\ 2Rc\95\1a\90\1a+G$\81RóH^À¤\ 5q\8b·@s-\8fTô¹¦Ç\ 2\1c\1e3°{LÀf\11Vbîâ\88dLÙ\11ÕFN\8e¨Þòv\84\9e±\1c\15î\85\962ë´%jß>,-±S\86¨^i/^i\1e\8bj\88J¿«£»ô_\1ce{ç\19û\19o\7fÙ(»óø\8c>^&îø¿¬Ãy/ßß¿s¡\94küçQ1þJGÙïõ¾{\94ýãË-Øýä-\93åß¼¾üç_\7fú\9b¿»\9aø^¶xùõ?^ÂÜ\7f¸ºB\9e\9fçK©íúï¯_?ýÇßüôûÿõ?þ÷\7fúõ?\7f\1aãs¹ï\89ìës\7fùõo¯?ýÃ\1f~û»ÿûûßü\ e\7fÏy\7f¾\8dÞêú÷\9fþáO¿ý×\7føÓyb~.ý*Þ_ߧ,é     yùå6}¾/ïüÒË[þ<ï\99þ_ë\ 3òÛ¿îe|¾¯\10øëYèO¯\7fþ§\7fù\9fÿÌ\7fÌ\9fû¸\17Y¯LÍ»ÿÏ\9f\7f÷'<\80\9f\8b­\85K|l\97×ÎõðÇßýá·\7f¾\9fßí~Ë\7f=)ÿá\vÕØÛçD\97@\16~Á//T¾¼ªz[\95ÇB}½0e¯ï^\98ZÊ_V\98ÖÊw/L»tó/*L_ãÿ_\98þm\85\199ýe\85©ëê\ 3\97\97s\95© ,¿ÿÿüé¿ý÷û\97ÿå×/\7f{\99§ÿ\aÜn$(endstream
+endobj
+3974 0 obj
+<<
+/Producer (AFPL Ghostscript 7.0)
+/Title (lincan_canhardware1.fig)
+/Creator (fig2dev Version 3.2 Patchlevel 4)
+/CreationDate (Sat Oct  4 15:43:39 2003)
+/Author (pisa@kotik \(Pavel Pisa\))
+>>
+endobj
+3975 0 obj
+<<
+/Type /ExtGState
+/Name /R4
+/TR /Identity
+/OPM 1
+/SM 0.02
+>>
+endobj
+3976 0 obj
+<<
+/Subtype /Type1
+/BaseFont /PPOXLX#2BTimes-Roman
+/Type /Font
+/Name /R10
+/FontDescriptor 3978 0 R
+/FirstChar 32
+/LastChar 251
+/Widths [ 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 500 500 167 500 500 500 500 180 444 500 333 333 556 556 250 500 500 500 250 250 453 350 333 444 444 500 1000 1000 250 444 250 333 333 333 333 333 333 333 333 250 333 333 250 333 333 333 1000 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 889 250 276 250 250 250 250 611 722 889 310 250 250 250 250 250 667 250 250 250 278 250 250 278 500 722 500]
+>>
+endobj
+3977 0 obj
+16874
+endobj
+3978 0 obj
+<<
+/Type /FontDescriptor
+/FontName /PPOXLX#2BTimes-Roman
+/FontBBox [ -168 -281 1000 924]
+/Flags 34
+/Ascent 924
+/CapHeight 676
+/Descent -281
+/ItalicAngle 0
+/StemV 111
+/MissingWidth 250
+/XHeight 461
+/CharSet (/bracketleft/bracketright/underscore/a/b/c/d/e/g/h/i/j/m/n/o/p/q/r/s/t/u/v/w)
+/FontFile3 3979 0 R
+>>
+endobj
+3979 0 obj
+<<
+/Subtype /Type1C
+/Filter /FlateDecode
+/Length 3980 0 R
+>>
+stream
+x\9c\9dV{pSe\16¿éë»( 6F\1a\81Ü;¬"
+bUTpP@^²ÔÒ\96¾h©¥\8f4MI\93\90GÓ¤I\9bÐ$}\9c6m\1e}¥-¡\ fú / \16,¶[ÐRAe\15\PÔ±8®/tvtÇ\9dïÖ\8b;û¥8ëÎìþµ3\99LrϹçw\7fçüîï;\ 2*,\84\12\b\ 4¸¸=©1©«\13å\85Ríã ªÂ,eðòjn©\80[\16Â-\ få7òC¿\98\7f\89\ e_NÅ´\87.â$\v©£Ë\16¾\1d9÷ø}Ü?ïᾺ÷N¡ZA¯`\0·*)!åÑÕ«×lU©\8d\1a¹,_Ç>¹aÃ\ 66ÛÈþ\16a·Iµr\99\92]I~\14I\15*u¡T©[Ëî\95JY]¾\94Í\93+¤ìÖ=qûvÅîdWí\8cMbwJ\95RM\96\82\8dÓg+ä9l\8c<GªÔJ\1feóT\1aVqç\ f\9b£RæÊur\95\96Ý¢e³X­Z\9a#'7I\8bs¤ê``\r«\96j
+åZ-ùÍʵ¬L\93¥ÔIsY\9d\8a\95+s\14úÜ <¹\9e§RêXµFEâ\85$BJÅ©´:m\8eF®Ö±\ 41nÛ\8e;ϨËÏÒ\ 5qµr\12fUy$3W\95£\ f²ùwL\97%WjY\9d´X\17ÄÉ\96²¹r­Z\91e$¸¤\94Z#\9f\7f\ 4½V®\94ý\8e¾\86ÕHeY\9a\\85T;_7Ø\95ßù±ÿÁ:K­V\18çïUÍgý\e_®ÓJ\15ykcå\85Ùz-;?S6Vµ\81\8da\13¤2½"Kóß\91ßçõÿM\90¢¨%Ê\1cU®ZzH#Óæëäú\82"CVavzF&Eí¡¶QqÔv*\9eÚA%P{©\97©Dj\17\95\91J¦vS)T*õ\12\15Km¥6R/R\9b©("'*\8c*¦®\b\96\vÚB$!e!84%,:ì\9dð\97Â{#Â#\f\11? WÐ\97\82õ\v\1a\17\9c[ðÝ\82_°k1W      ~îÁ7\ 5ïÎâm³¡­Ü
+\91ÛÕPÓ\bt¯Ï\9cÆð5\b\12¬\96Ô
\8cóý(µÎÜ\ 4#4\1eBo¼ÞÑ4\bôD\97b\17ÃK\11Ä\94\9aö\ 5\93rý(­¾¬        &hlDße¾µE\92\ 1
+ÓÎÝô'È^\9bf\94[\13\8b¹8Û\87\x\9f\0>\ eåVàhQúv\996\ 1èèÝ\9fbô÷7¯~6ÒlÍk`Üz¯ªÝx\14ÄÇ:\8et¾µýìsi©\ 6Y6³/Sµ\136Òü\ 3\9f¬Å¡\92×a´uäxO×\91\9eþ\19\9a\90±õrOõ
+à+ÜòU(vq\a\ 3Ñ«y        ¿ôÛ\958\12G~ÿ\ f,ÁK\9e¸ÅßÏ\94ªD³3«ùå|ø«;7çæu\8d\161ª©\92+p\95¾uöÒUI°Ö\14´rw\91j_`Ãl(þÁ&Â\8fL\85·"cu\15T\ 2-+o\1cg¸w\91³6Ý\94oÛm\12\97 o\8d\e¼@\9fðÙ²\19>\1aI\aÔ\8d9@óh-\1fίà￾\ e\87¼u2pv\88Ù\8d° \fìö2\9bÕhÐØ\94@¯Oü\14ß\83Ã'®}tnb\7f2CàùÂ6S»\11\17Ú\ 6¸ÅoG^\99Åú/\96\b\9d>n¹ÈWã\ 1\1fÐC\1eÛ~æv>\82\14«5ÎA\vW\9a°\13      _mG\9bkJ\eá\1d\1a?\89\86\vºlc@㻾Áaøa|ïö¿>¶7S\93\94É|\8c\1cµIEù¥\89&1~l³¨ÿ­\91ñk\13\9bx\9a\ fMÛ¼u\7fÂH¿$8¥\ f°r\0£\11\ 1·\ 6¯\17¥o: Ü\r       p O9m<i\1f¬ºHã\8b\11åïÙú4\ 3\85#\19GS`\1fì7Jåû³ÕÛ`\ 3ÍK>|\ 6#É-¸>3\86)\9a¿\81×\88\1ao\f\9d¸\b\17¡KÕ¼\8e\9e§Øbià      \17¹ÈÞHÒå\92Ù%B3¾Í½ Êè)ôå\92ÎÝ·\9a\ fã\1fâ#/?õÝ\857\8f½q\86áã\10ì5\9a·9iá\84    [[PbS¹\17Æhî\96\15½Ä\7f.\ 2mE©­\_\P¦\0\ 5¨\e\f\81\83}EïÁeÒ\82s×n^:^ð²d1þ\82\85\80àêl¨\87{PÔâòÕ4\ 1Ýí+Édx\17\82}vûî2"e»\1fít\99ü0Mc=\1a8=Ù#q\83ÏÙhkµ4:\9a\81îò·õ\ e\16\ 5äÄ\10·¥1ß\10\19$ëe¥qÅâ /å4~:\80\97\82SõD@WpÉÇ=½¡\\ 1\17%:õ"2\80Ùeðè½Qê\ 6uý! ×nÙ\1a\1dÓ#½\À\14\e\8d&\87³@Yj\0\ 3\145\95½fØ\96¢.\80<:ùFæ-Éu¸qljìäñ¶\ 18       \97ö\8fmqñ"wTr­Æ\a­\10\18\1cîñúª=Õ.8RÕ\í\86\130ê?Þ3Øë\1f\86IèsvZ\ 6hÞ~ûAÑ ýSÇ\ 4Ð_\ f\96Êâ7åòáOÇ÷\9déô4\8fM2õø[ÑLïð¸ä8\1c\16¶ç7e@.½W\99\9f±'ë½ï\89"Ķ\8e²\0·6PÚ\11  \97ð\86+K\84kðûøÏ¢
+¼,Ü\1aQUuØ^]]\ 1b\aØj­õ´°Í«××\1dZº1!uëÞ\81\9c\9béÌ\85\82aC\9b\16\14âÌ\83ªT\89\1c\14ÍÅ\1d\87;K§é\12>º9ÂÓPWKF!\8cñAKU'\91t\9b£·§¢}éÇï^¸2©\1dÜ3ÂðÔ»ªVs7ô\88G\8f÷\8eK¦¡_Þù\14}ÇÅ\96\9e\ fºX,yU\9fÄß\8bÆÆûÛN\ 1=Ù-ÛÎði\bvÚJã\1dwl,©Áá\85\ fh\9c\8e~Î:ÿ¼$\ e²´\19{h<\8d\9c.y\99¦|o\89X]\1e^\82êj\P\ fôioù\ 1æöA\ 4Û\1d\87ãËI\ 5\85\1fÅ»mM¤Âb|Ü6Å-\1c\88\ 4ìä_!ê½\89½\²HøÁJLG4T»\1c\12ûaÇa»M\9ax ½¤\82\16Þ´Ú\1d\83PYS媢\85\1f\9cãÏG<×\7f`F2\ 1\ 6§J\e£\8a4&\9b\1eè<sÏ;\f>\85\847\7f\8c  \84ÜÝþá\0^ôSä¥\9f\9e%8?ã­Ao{"1ÜLL§©¶¹Æ\aâ®y\ 5\9b\11lµYw\ 4ÍØæG»êË\eàC\1ac$äRq\91H­Ó©T\1dºÞ¾Î\8e¾^]§2h4¶\v     \ 1îù6KKä¥Y¼\83T_Æi'EÎ\88\f+18ü=ÿ\14\12\ e\9aÐ¥Ê&\eì£ù2\ 4*§ÅbUë\15e\85\1e\1c\1ac\84\13\ 5½QÙb\86\f\9a¯G\eßHý\8bä\ 4\9cjíé9}:j=\12ÆÔUM\ 6F\1aÿÔ"&|xåÐ\Ø<\1düì<\9foq\12\97!rºâtÒÒ8#qÒú\1a\7f­¿¦\ 1Ä\9d>\13éþ=\b6Uj¬\ 6\87ÍRn\ 13Ø<¦£ÆN\8b¯\ 4h\9dѤ?8ª;\8fCf>Â+\18á\8f©s\9bþ'MK\80Û\18\10p\87È\80\1c1Pé·A1تl\15¶U|SÔÃØçh©l\ 1\9f\18Ú\e=Ã.Úϧ\9aÑÉ*\8fmü!¼\90\1f\8dªu¸ì®r·Ñ]î\ 67x\9aý'ðýøZTßûnO¿\8b^<\97÷\eÀû\ 4À\8c\86ì\rv0\81Ù¡µª\9fä5QÏa\9di\1c\0\9aÅÐÑè9ë!å3ÍèDE\935\90ä)ö\14»\8dÑ|zÔ*ÜRÑPÕ\0\rb8Úä\1dª#Y/\9bQg\95×Ö\91\8a\97ò·¢\9a
\167Q¥·¹é\18±t{Ô×¼µ%¯Îá\ 6±\aê}­£ä|û[Tû\98«>@ PÐħ\13.pQ]\91G>Ç«>["|\9d\8b½,2YÊ\9cfÒ:{Ë\19\ 6§ \98\99»ô#\a\8eÄ\ 1ýø\96´\18]ÀÐÙu4ÐQW]_íaª|Õ^ðÐ=\ 3\1d£\13=Ê$I,â×¾b*? Õ\e,r( \85©1g2/JÎÀkG/NÑÂæ\94úö¢×\96\ e\11\ 6Ã'I\90\7f\82زÂy¸¨LkQ\1d.\ 2:_5t\9a©C0óÚ\b^t\86\bÑ÷ò)\ 19âb\82\9fÐ#d\vivy\83[È1_I:û\11$YÌ{«\89¦5~\94\kn\84S4\1eFPëmðxº;O·\r\ 3}¦#\9f¼é\85ä|°Z\13\82ò×ùQB\8d¹\r.Ѹ\1eõ\9f\1el\1f\azº]½\9eáed«)/\8f·\93$\95\1f\1dª-¬-m\87Sb\9c\8dð]¹o¿(\89\87ÔCIñÆiyO\12d\82ʲ>\86¾Nö\97Ôb²¿\98\83\ 6OÎä»ß\11\\9eÅ\86/Cñãs/\88\9cµYfuùþR±2è\1cî\9a\0=ê;\9cÅÜnE\8a\9b\ 5\9fâ¨\9fp\bþ\ 3¾gÓw\8fHb!^fH£\93ÃN\9d\1d\99º1ù\ 2¿\98\ fMß½!åÕÎîàñÄGwÏùº\ 5ðQ(\9eâ\97\88\9e\89((i\efæÖ¡ãÍÍ\ 3\92¯ºyÙ¯3X\16ñ{&^úQè\10ÉÔ`ÙÜ\f/Ó|\81\ 6[Mù̯ë\90ÂRª\bî2ü}\93\82à·hòvå>´Ø\10à\92\ 381\10Ñ\7f×Í»û½\v\17Þl_¸\88¢þ\ 5\1a\18á\83endstream
+endobj
+3980 0 obj
+2917
+endobj
+3958 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [171.859 541.85 220.612 551.2]
+/Subtype /Link
+/A << /S /GoTo /D (cap:lincan_canhardware1) >>
+>> endobj
+3955 0 obj <<
+/D [3953 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3956 0 obj <<
+/D [3953 0 R /XYZ 71.731 814.833 null]
+>> endobj
+3957 0 obj <<
+/D [3953 0 R /XYZ 71.731 556.869 null]
+>> endobj
+3959 0 obj <<
+/D [3953 0 R /XYZ 119.552 505.063 null]
+>> endobj
+3097 0 obj <<
+/D [3953 0 R /XYZ 71.731 502.237 null]
+>> endobj
+194 0 obj <<
+/D [3953 0 R /XYZ 484.709 467.281 null]
+>> endobj
+3960 0 obj <<
+/D [3953 0 R /XYZ 71.731 460.145 null]
+>> endobj
+3961 0 obj <<
+/D [3953 0 R /XYZ 71.731 371.111 null]
+>> endobj
+3962 0 obj <<
+/D [3953 0 R /XYZ 71.731 367.789 null]
+>> endobj
+3963 0 obj <<
+/D [3953 0 R /XYZ 71.731 354.838 null]
+>> endobj
+3964 0 obj <<
+/D [3953 0 R /XYZ 139.477 342.293 null]
+>> endobj
+3965 0 obj <<
+/D [3953 0 R /XYZ 71.731 287.59 null]
+>> endobj
+3966 0 obj <<
+/D [3953 0 R /XYZ 71.731 274.638 null]
+>> endobj
+3967 0 obj <<
+/D [3953 0 R /XYZ 139.477 262.093 null]
+>> endobj
+3968 0 obj <<
+/D [3953 0 R /XYZ 71.731 233.293 null]
+>> endobj
+3969 0 obj <<
+/D [3953 0 R /XYZ 71.731 222.295 null]
+>> endobj
+3970 0 obj <<
+/D [3953 0 R /XYZ 139.477 207.797 null]
+>> endobj
+3971 0 obj <<
+/D [3953 0 R /XYZ 71.731 178.997 null]
+>> endobj
+3972 0 obj <<
+/D [3953 0 R /XYZ 71.731 166.046 null]
+>> endobj
+3973 0 obj <<
+/D [3953 0 R /XYZ 139.477 153.501 null]
+>> endobj
+3952 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R >>
+/XObject << /Im4 3915 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+3983 0 obj <<
+/Length 3002      
+/Filter /FlateDecode
+>>
+stream
+xÚ\8dZYsã¸\11~\9f_¡G¹j\85á%\91Ê\9bÇ;³ñf³ãØÞÍTeò@\8b\90Å\1a\8aäòð\91_\9fnt\83\ 4\ 5RTÙUÄÑ@·¾>ÐhÒ]8ðç.BW\84¾»\88\1cODa´Ø\1d?8\8bg\98ùå\83Ë\14+&Y\194\9f\1e?|üâ{\8b­ØnüÅã~áE\91\b\82\rì³\11Áf½xLþ³¼9Äe#««\95\17FKWÐó·4oß>Þ?^¹\8e³\AïÊ]¶o4wsý;5~®Ò\17½ð»³v\80\fæ å^ý÷ñ×\ f\9f\1f;áÖ\9e+@\8esâ3\89\17öâ»þV\ 4\b×\91pàg øq%¯V\81\e.ó"_\15%ÈÙ¤Ç8£±4ßWqÝTí®i\81Î\8d\96?áÄF\11\97EÕÄO\19/?Æ?$ÍÕïu#\8f4\1aç   \rfñî*\þ ÑbOÏæ \97ÈLî\1aüÕðcV®'¶kWIW·%²\11jjåÂ/ñÖð\fÄÆõ\14Á#ná\aβ\92uYäuª\ 4Â\81¯7\9fﯡéo\97\89|\91YQʪ¦)b'\13ê¡\14'xûÁFD\9bÍ"ô\1d\11D>\82é.`\ 6þ«ç\85\eðë\15+c\89\85ÿé¶ø\ 3vq¾rD(,\9dû`kþÖ\14ÁÒ9\93\9cç¹\ 5»F\9d\e<\136<üõ1c\12Óã)®\19?T\12Ã\93V\1aÇ\15\v=á)M ªH\13
+â£Ì\e2è}Á\96\9dË7\1eª$0s\97 ¥¿\9dþX\17\86\8d6[xnÃÑ_«iV\ 6\91þ¹¡\80>ZøÉ>(Øw\90Ôâç\ 5Â\8f\9d>{þ¼f\8c\7fïb\1e̹Á@\80O²f\ 4Ø\9cO\10:\16è\83ØÚÅ\15\0\94ÔÔ\83¨A«È¡¦ \8b\ 2±\8dÖ3\90õD\93\901É,d6¿\v ³ùÛ\90\19\ 2<\10Põ)RqþN­æ½\94<[\0\ e?\0o
+¨Ð\11~èÏ\0Õ\13M\ 2Å$³@Ùü.\0Êæo\ 3e\b â\1f\19\v\1cB9\ 6nìÅO\10µã]\93\16Ê\86(ä*Ü4=Dô<Ȫ[±ÛÉ\9a\11=ÊæP$<\9e''+1\90\1fÒ\92m\13\ f62j\15\19PXÏ\8eÐdæÚ\rÒ£:;ºP\ 1\18O\18æ\1f'\89d®O¬o\8eæØähÞ\87\9aFÆG^XÉéÐâ\87"òæBKO4©~&\99U¿Íï\ 2õÛümõ\e\ 2\÷HuúáÃÔ\f\1d¬7w\19gÙ0\12M\81åùÂsç\82JO4    \16\93Ì\82eó»\0,\9b¿\r\96!\0å
+\9eÛ\87aßs(¸àhÑrã(!"¿s;.K\95(\0åíÃ5\rb\98¡\96²Ô\9fhúõ\90*× \99²*^$SÕ`ðYºK\9bw¢TG«Z½\1aä<ä0IªÝ6²Ývü\ 4ÁôR¾ö\91q¸ø\ 6\137\9dt\9e\r\91ëíZl õ:«v\83hJí\9adNí#üæÕ>ÂßR»)\80á#\10:öõE\ e°\8e\á@nu\1e\89\9eh\12 &\99EÂæw\ 1\126\7f\e     C\80\92Öò4°?µÏ«ï\8eã½Y\91ä\16Ìêþ_#\86§3\93\8e\12×W:¼\97\aL"§\80ÝÀÕi.\f\eD\93À2É,°6¿\v\80µùÛÀ\1a\ 2\18&6î \9eØ\b¾þÁ5É]V¹Ì¦½pí\8ah.ø\1aD\93\101É,D6¿\v ²ùÛ\10\19\ 2Ü˧6Í0æ®éÊ¥\1atkÄ\96>©Ôt\81O\88³Å±L3&(J\f\8b5uöm\96½s³È²âõdߪÍó4\7f¦Î\ f\89p\ fwñÖp\95µcï®*êzE|c\ eÃ\ 1\ 4ð&U\agà-K  K&ö^\ f\92\15`HsÃvVìº]<ð8Lî©Í?­¢^ZÓ³.å.E_\ 2kr\97\82\ 6\1fé~zr3N\8câ\81:v¤º`k3|M\9bÃðv\11\82\11zâí'm\90\816È.\10\f\8c\94,tHp\80³ã\15\ f\93¸»°`ò\9d£ÄÏm\15\8aIÓv]1\93\81w$\93\bf\8dú\94Ó\ 5&}ÊÙ6è\8eõM&ã\&«\16òà \ 4\v\95\16ª"OÿÇ:ÇñJþÕ¦\15j%\b=eØ\8aZ\a        ì0ì8ÿðÏ;\1aëðÇ\ e\15Q !óC\9cï`3Ûp\r}\ et\ai>\ 4¡#.\9bÒI\10ù"ô7çµb\10MéE\93Ìif\84ß¼nFø[Ú1\ 5 [\87\8bG¾,\95\9f¸!(\83c\10N¨ìH\17¡\14¥ö(W\1dpp©4k_j\18õ\87O\99Ç0OQ\0º¨K\15mz\9a\9d«\93ð\9a\86±Ð§nB¶\ e\8dk\91\1fn\96\10}¬}à )Êd¡\91Ç 35¿Ü~\ 1º¯ÔÁ\84\r\89M\11Ç\ eªÔ\13®\97ORòP%Ë,Þ©4\15zx×Âùªxjë±j\\97Hú`«\7fµ²\95\1c\80L\9eeMMD'Ox8Ox\14ð<Ê×¢ú!¨Ï¿Â[>¥Ï¼.y\81\9f\1f?ó¸Ê\93C\f\96yC \14-ïÅ\97ÀÕ\88\94ýÅ0Õ\ 1ì)ÍTò­r\96\89\8b\11\84c\80ʤ3"hWu äy\18\14á\82\0¹=â\8c\12N\1eê\81ï\bo3\93P\1aD\93^Æ$³^fó»ÀËlþ¶\97\19\ 2\90\ 6#ç´P¬Æ*ùZ¥\rwÀcÀ]\12ê¨ó\1d\9eý=\f\16ðË\9a´ÌxIQJ>Ã#¾2Eú\84ǵ0¥)\8fi\ e\89ÖÈ\19 ùî\99¸çx"tæâ^O4©\11&\99Õ\88Íï\ 2\8dØüm\8d\18\ 2<\8c¦\9fi\9e¤/iÒêb\ fø.ÖmdWï©kåtº\10T6êÀèRû¬Qµó¾63\ 1)\16¤\9dmp\1eR\83h
+RM2\aé\b¿yHGø[\90\9a\ 2\90\91û~_6÷!S\93\r\1eý8¼oó\9dNMaæX$:\85SÓÊØá\89\1e\80\16Î\9bÝÝÜRC\ 5\12\øÇÃ'\1a\19¦Y8u(\9aUMCe\89>a\1f\1e]<ºËït¹}W<çF1¡¿µa¹\80M¤U\ e;¥Ï\8d#Ö3ùZO3©M¢\98U¦Åì\ 2]ZÌmUöÜg¯iÿøó*\f\96×\ f\9fï)cVJ:  üûø\98ÂÝc
+±`-¶n4\ 3YO4\89\19\93Ì\82fó»\05\9b¿\r\9b!\0ã\86¥«±Ò\99³|I«F\ 5\17ììâ\9c\1aO\ 5×É\f\8a°ÅÉÄG~b´çõp\16«×Dp\8e×4¤\8aÛ\989\8cÕË(óRuàºé:Úèõ9A·\95#l\¶ÝëZ<ã\8b\7f=\95\8d\14Ì\ 6Þ\b\8fÉ»\8dïFÂ_Ï\ 5¿\9ehRõL2«z\9bß\ 5ª·ùÛª7\ 4à\1c\rµ\92SaR©9t\96\83\ f·\13\b|LKÚ\86\86õ\1a\1cß\81ãDoFÐáÄÔí\12S\87N\19Aíó÷ßµ»Å\ 4--[\90\ 5\ f4\1c Üm\8dÆD/+x\\ 5Il(ÓäÁ}\ 5\88O\ 4ÅÉ\832al¡y¬\9aô(\99\ 5X£¬F̱9\0\1d\ 4¡
+¹øl\ eqC­\ e6eâ4¦\90S¦¥º
+slÜ}}¸ýFMNeT[\9dÈR3\0cÞÇ4µQ\19/\ ecõ9UN\8b½ýhvtòkéd`ÙÍã¢\8c+Ìç³LfÃ\fº/JCº\90( ºo\1fºzkº3_P)IÏ9\91·       D\14ÍÄO\83\89\9c\13\8dð\9b\11þ\96\13\99\ 2üûj\ 3\19lõã$2\8d\1eAF%µ\7fk\87ØeYúÜÝlF\83çÉA¥ÜJ\15\9e\ 5Eañ±á\12ÂàmÝÉûD£ÎÕ§        ª-ñn¬
+\11G\15¡§4é{Â\ f¼\19MöD\93\9ad\92YMÚü.ФÍßÖ¤!\80*û¨ÄÏõ8ss»º\f\8dÞ?ÞS\ 3|\10_©â\89¤Jb\8a\14\8eR\9a­\8b#/èc!ÌSè\84QyT\ 1-\19lêêMÏ\9e\83\9d-=üªÌ\ 3¼Ü\19¼º\9dÖ\99\13\880\9có¾\9ehRgL2«3\9bß\ 5:³ùÛ:3\ 4ø¬µãy\81B ÃØKÉ\ 5\ e]ßÝRCÅ5Ï_>Ç*ôÁ\b\96\99i¬«Lð"å\99ðTn\82µ ]9èö       ðÈÌéM,lÀå \18î³\v\18æ*\8a­Í¾ü\90¤û½¬:×/«´\80{uJ\97·Ð\8eÆ\908Q£­u\9e\ 3~ßt±Z_Ò'lÀ\rCá¹3i\8cA4e\ 3\9a\ 6FøÍÛÀ\b\7fË\ 6L\ 1\94Û]ò\ 5\8e\91ú\85£å\9e>¡Ð\9fíEÞͶs0ðêzxJ\1eáò=öM_\87ÓÆ\13\eg&N\1aD\93x3É,Þ6¿\vð¶ùÛx\e\ 2P\98\vÍà\86\ 5\vÝå·Ûßn\7fÿF\83_î~¹æ2`\K^¦¯\ e@\9bæ\83\8a\1fU÷T±\90\9f7\8f\7f¨Dƨ*bÝ\9d\892ÌhÞGÒ\1fù\96Öú\ 3£?ÿþóol\1fE[é\8c¥3\8f\ 6\ f¼±¯_vE÷U$uµÃã\99Ý\fíàîfå:\81~åzjVô\89èàâÁ\19î\94Ùøkáø3¡Ú \9a4\e&\995\e\9bß\ 5fcó·ÍÆ\10àçâô\9bÁº\91e=ñÒ\99\ 3?\1dø·
+ö|`\ f\89\9d«\1ao¿êwü¬iæK\ 1þ^\18~êÖ     Ï~QÜ\93è\ f\8aµ\12\86\ 2ê;'þ\88øöá\91\1aþÚu<ä?ü\1a9ð#@\10ÙáJwê«a[Âÿ\ 37/ÉÍendstream
+endobj
+3982 0 obj <<
+/Type /Page
+/Contents 3983 0 R
+/Resources 3981 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 3816 0 R
+>> endobj
+3984 0 obj <<
+/D [3982 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3985 0 obj <<
+/D [3982 0 R /XYZ 71.731 715.464 null]
+>> endobj
+3986 0 obj <<
+/D [3982 0 R /XYZ 71.731 713.803 null]
+>> endobj
+3987 0 obj <<
+/D [3982 0 R /XYZ 129.514 699.597 null]
+>> endobj
+3988 0 obj <<
+/D [3982 0 R /XYZ 71.731 697.53 null]
+>> endobj
+3989 0 obj <<
+/D [3982 0 R /XYZ 129.514 684.985 null]
+>> endobj
+3990 0 obj <<
+/D [3982 0 R /XYZ 71.731 682.918 null]
+>> endobj
+3991 0 obj <<
+/D [3982 0 R /XYZ 129.514 670.373 null]
+>> endobj
+3992 0 obj <<
+/D [3982 0 R /XYZ 71.731 666.645 null]
+>> endobj
+3993 0 obj <<
+/D [3982 0 R /XYZ 71.731 653.694 null]
+>> endobj
+3994 0 obj <<
+/D [3982 0 R /XYZ 71.731 652.033 null]
+>> endobj
+3995 0 obj <<
+/D [3982 0 R /XYZ 129.514 637.827 null]
+>> endobj
+3996 0 obj <<
+/D [3982 0 R /XYZ 71.731 635.76 null]
+>> endobj
+3997 0 obj <<
+/D [3982 0 R /XYZ 129.514 623.215 null]
+>> endobj
+3998 0 obj <<
+/D [3982 0 R /XYZ 71.731 608.196 null]
+>> endobj
+3999 0 obj <<
+/D [3982 0 R /XYZ 129.514 595.651 null]
+>> endobj
+4000 0 obj <<
+/D [3982 0 R /XYZ 71.731 593.584 null]
+>> endobj
+4001 0 obj <<
+/D [3982 0 R /XYZ 129.514 581.039 null]
+>> endobj
+4002 0 obj <<
+/D [3982 0 R /XYZ 71.731 578.972 null]
+>> endobj
+4003 0 obj <<
+/D [3982 0 R /XYZ 129.514 566.427 null]
+>> endobj
+4004 0 obj <<
+/D [3982 0 R /XYZ 71.731 564.36 null]
+>> endobj
+4005 0 obj <<
+/D [3982 0 R /XYZ 129.514 551.815 null]
+>> endobj
+4006 0 obj <<
+/D [3982 0 R /XYZ 71.731 523.845 null]
+>> endobj
+4007 0 obj <<
+/D [3982 0 R /XYZ 129.514 511.3 null]
+>> endobj
+4008 0 obj <<
+/D [3982 0 R /XYZ 71.731 496.281 null]
+>> endobj
+4009 0 obj <<
+/D [3982 0 R /XYZ 129.514 483.736 null]
+>> endobj
+4010 0 obj <<
+/D [3982 0 R /XYZ 71.731 442.814 null]
+>> endobj
+4011 0 obj <<
+/D [3982 0 R /XYZ 129.514 430.269 null]
+>> endobj
+4012 0 obj <<
+/D [3982 0 R /XYZ 71.731 417.203 null]
+>> endobj
+4013 0 obj <<
+/D [3982 0 R /XYZ 129.514 402.706 null]
+>> endobj
+4014 0 obj <<
+/D [3982 0 R /XYZ 71.731 400.639 null]
+>> endobj
+4015 0 obj <<
+/D [3982 0 R /XYZ 129.514 388.094 null]
+>> endobj
+4016 0 obj <<
+/D [3982 0 R /XYZ 71.731 373.075 null]
+>> endobj
+4017 0 obj <<
+/D [3982 0 R /XYZ 129.514 360.53 null]
+>> endobj
+4018 0 obj <<
+/D [3982 0 R /XYZ 71.731 358.463 null]
+>> endobj
+4019 0 obj <<
+/D [3982 0 R /XYZ 129.514 345.918 null]
+>> endobj
+4020 0 obj <<
+/D [3982 0 R /XYZ 71.731 330.899 null]
+>> endobj
+4021 0 obj <<
+/D [3982 0 R /XYZ 129.514 318.354 null]
+>> endobj
+4022 0 obj <<
+/D [3982 0 R /XYZ 71.731 277.433 null]
+>> endobj
+4023 0 obj <<
+/D [3982 0 R /XYZ 129.514 264.888 null]
+>> endobj
+4024 0 obj <<
+/D [3982 0 R /XYZ 71.731 261.16 null]
+>> endobj
+4025 0 obj <<
+/D [3982 0 R /XYZ 71.731 248.208 null]
+>> endobj
+4026 0 obj <<
+/D [3982 0 R /XYZ 71.731 246.547 null]
+>> endobj
+4027 0 obj <<
+/D [3982 0 R /XYZ 129.514 232.342 null]
+>> endobj
+4028 0 obj <<
+/D [3982 0 R /XYZ 71.731 217.323 null]
+>> endobj
+4029 0 obj <<
+/D [3982 0 R /XYZ 129.514 204.778 null]
+>> endobj
+4030 0 obj <<
+/D [3982 0 R /XYZ 71.731 189.759 null]
+>> endobj
+4031 0 obj <<
+/D [3982 0 R /XYZ 129.514 177.214 null]
+>> endobj
+4032 0 obj <<
+/D [3982 0 R /XYZ 71.731 175.147 null]
+>> endobj
+4033 0 obj <<
+/D [3982 0 R /XYZ 129.514 162.602 null]
+>> endobj
+4034 0 obj <<
+/D [3982 0 R /XYZ 71.731 147.583 null]
+>> endobj
+4035 0 obj <<
+/D [3982 0 R /XYZ 129.514 135.038 null]
+>> endobj
+3098 0 obj <<
+/D [3982 0 R /XYZ 71.731 131.31 null]
+>> endobj
+3981 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4038 0 obj <<
+/Length 1076      
+/Filter /FlateDecode
+>>
+stream
+xÚµW[\8f\9b8\14~\9f_ÁcR        \ f6\18\83ú4\9déngÕ\9b2\91v¥¶B\1eâ$l\13 \98t2ªö¿ï16\ eC`Ò®²ÊC\8c}Îñ÷\1d\9f\8b\8d\1d\ f~Øa\181\1f;\91GPÄ"'Ý^xÎ
+V~¿ÀFÂ5"nGæÕüâò7\9f81\8a\99/\1d\12E(\b\13¢ ¤Î|ñir½æe-ª©KX4ÁHÿ¿ÍòÝþr6\9f\9b¸ð5Å\93Ý^¯]_½×\83\9b*ûÞ*~ö¨\a\ 6#<ý2ÿãâõÜ\82£\ 4#Àñ\1c|#r\ 4\9f\10\a3D0Uø\rGF)¢1kàc\14\11\9bèíõØB\83ñm\ eôr¾\91
+\956\18 \1f¼\0\ 6=Çõa?ê[[ØX{Åe\96\1e\e»á5×£»ºÚ¥õ®\12\1d»\16¨²\e!\1câÆ®lDµZÊó5¯\16\ f¼\12I=\80(`("à\ f?D$\ e\eõ÷|+´dÐ9KØ\ 2ÓF¶»E\bç5´\ 5;(bBÀÓÊñJñ3!L\1f¡l éÏJ\94ÀMäusø+=Y\16\99ò¦Ô_u¡ÿùfcBc\8a£I\e\1e÷\ 5\80è8\a£\986Îq[\ 4.¡È÷£\ 6ÇÝc^\942\93\96(C\98\ 5\1a/\8a±\ fÂ\18y\ 1=Á¶\99ú¡\8c8\11
+½ØqcØJ\87
+@×ëy\95hp/\eA¯+Ô5]ÕU\92-ôøÅaêÛNìÄ\80* Id\99å\9b\9atL¨ï\13;\81êB|ÏRKáEoþÓ»«¿\927\7f&×W³\9b»/Ú\9a{Äð\9f\97Ãî6\ e\84è\ eµ·ß\89í½:Æ£àPQÅ ÉtBXGõ\13\1aã\18QJ\9c òPìÓ¡\8c&\88\851\8c:Ký\7f\9bü6 :ötöwã6 \88@\92´2\rÀ\9dâ¡ã­X\9a\18ÕaÛ\ fBàOP\18\a°\9b\8fXD\1a}{\9c£\ 4)A4Àç#x°7NÐÈ(\80³ùL\13qÛ¬Ü\16µÉкâ¹ÜfRf\90 EÞ
+\0\1fiØkj¶@\8b})R³$\8b­YI§l²æùJ´Y½\16\95h«xÏkØz\r\82\1aô¾\8eú\8d\ 4\b\aÑùüv°7î7#£ \1axYn
+ײ0Qb\1dj\8f}00\8e\13¯)m3ð4äß\18k?¦\88Ñàl¬;öFY·2
+5¯*\ e-{òØË\88Áªý¤X/\80XÃW^öë¶mj.ó\10\85¡K1¢a0ÔÚl\11;ÑØè\7fml½\rºþÀ\1eòÃð¨­=¥Ù¨k\8a\ 3æmã\e*\9eÆì¹zÕÓ2?Ò©RèhOúÀú!\a_\r4\11ÛÓ´ihWû\ 1©].³U.L+Û\14*+Ô(+\12¾XT¿ \ 1µõWU\14¬{.ÅÏéYBË\r_Éç\18Cs\82\8bG\92®³ò\94\D(a?%)ÿæpåõFe{§©Äú-\e¦lÑxsû±íÖ£fÖ\ f\12Ê2\ 4\90\9d?\r£\7f\ 1j-\14²¶Kå ë3Õ7\94¬|\94pPe]ýÿw\v]9tH\8fUR\1aÂ\r?>[!=\98\e­£FDA«Å¾¶wbÛB\1e²zݹT\98\bå£<¢a\1e\90b\8f=û\;\88´¯5\86ÔÓfÙ³¡p}¸~=»2/´Û»¹\1eø\14{D;»ûÔ\vàýAq{ËÇdäIv\8cð_°~¢{endstream
+endobj
+4037 0 obj <<
+/Type /Page
+/Contents 4038 0 R
+/Resources 4036 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4039 0 obj <<
+/D [4037 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4040 0 obj <<
+/D [4037 0 R /XYZ 71.731 814.833 null]
+>> endobj
+198 0 obj <<
+/D [4037 0 R /XYZ 328.824 755.597 null]
+>> endobj
+3099 0 obj <<
+/D [4037 0 R /XYZ 71.731 755.39 null]
+>> endobj
+202 0 obj <<
+/D [4037 0 R /XYZ 329.716 722.744 null]
+>> endobj
+3100 0 obj <<
+/D [4037 0 R /XYZ 71.731 722.572 null]
+>> endobj
+4041 0 obj <<
+/D [4037 0 R /XYZ 71.731 706.791 null]
+>> endobj
+206 0 obj <<
+/D [4037 0 R /XYZ 265.438 684.583 null]
+>> endobj
+4042 0 obj <<
+/D [4037 0 R /XYZ 71.731 675.683 null]
+>> endobj
+4043 0 obj <<
+/D [4037 0 R /XYZ 71.731 675.683 null]
+>> endobj
+210 0 obj <<
+/D [4037 0 R /XYZ 162.317 648.287 null]
+>> endobj
+4044 0 obj <<
+/D [4037 0 R /XYZ 239.103 632.466 null]
+>> endobj
+4045 0 obj <<
+/D [4037 0 R /XYZ 71.731 630.399 null]
+>> endobj
+214 0 obj <<
+/D [4037 0 R /XYZ 174.677 607.128 null]
+>> endobj
+4046 0 obj <<
+/D [4037 0 R /XYZ 71.731 602.173 null]
+>> endobj
+4047 0 obj <<
+/D [4037 0 R /XYZ 71.731 537.779 null]
+>> endobj
+218 0 obj <<
+/D [4037 0 R /XYZ 176.446 513.28 null]
+>> endobj
+4048 0 obj <<
+/D [4037 0 R /XYZ 71.731 513.137 null]
+>> endobj
+4049 0 obj <<
+/D [4037 0 R /XYZ 71.731 508.355 null]
+>> endobj
+4050 0 obj <<
+/D [4037 0 R /XYZ 71.731 494.341 null]
+>> endobj
+4051 0 obj <<
+/D [4037 0 R /XYZ 139.477 480.935 null]
+>> endobj
+4052 0 obj <<
+/D [4037 0 R /XYZ 71.731 478.038 null]
+>> endobj
+4053 0 obj <<
+/D [4037 0 R /XYZ 71.731 465.086 null]
+>> endobj
+4054 0 obj <<
+/D [4037 0 R /XYZ 139.477 452.541 null]
+>> endobj
+4055 0 obj <<
+/D [4037 0 R /XYZ 71.731 449.644 null]
+>> endobj
+4056 0 obj <<
+/D [4037 0 R /XYZ 71.731 437.554 null]
+>> endobj
+4057 0 obj <<
+/D [4037 0 R /XYZ 139.477 424.148 null]
+>> endobj
+4058 0 obj <<
+/D [4037 0 R /XYZ 71.731 421.251 null]
+>> endobj
+4059 0 obj <<
+/D [4037 0 R /XYZ 71.731 409.161 null]
+>> endobj
+4060 0 obj <<
+/D [4037 0 R /XYZ 139.477 395.754 null]
+>> endobj
+3101 0 obj <<
+/D [4037 0 R /XYZ 71.731 379.482 null]
+>> endobj
+4061 0 obj <<
+/D [4037 0 R /XYZ 71.731 366.571 null]
+>> endobj
+222 0 obj <<
+/D [4037 0 R /XYZ 235.776 344.19 null]
+>> endobj
+4062 0 obj <<
+/D [4037 0 R /XYZ 71.731 335.29 null]
+>> endobj
+4063 0 obj <<
+/D [4037 0 R /XYZ 71.731 335.29 null]
+>> endobj
+226 0 obj <<
+/D [4037 0 R /XYZ 162.317 307.895 null]
+>> endobj
+4064 0 obj <<
+/D [4037 0 R /XYZ 227.148 292.074 null]
+>> endobj
+4065 0 obj <<
+/D [4037 0 R /XYZ 71.731 290.908 null]
+>> endobj
+230 0 obj <<
+/D [4037 0 R /XYZ 174.677 266.736 null]
+>> endobj
+4066 0 obj <<
+/D [4037 0 R /XYZ 71.731 261.781 null]
+>> endobj
+4067 0 obj <<
+/D [4037 0 R /XYZ 71.731 113.443 null]
+>> endobj
+234 0 obj <<
+/D [4037 0 R /XYZ 176.446 88.945 null]
+>> endobj
+4068 0 obj <<
+/D [4037 0 R /XYZ 71.731 88.801 null]
+>> endobj
+4069 0 obj <<
+/D [4037 0 R /XYZ 71.731 84.019 null]
+>> endobj
+4070 0 obj <<
+/D [4037 0 R /XYZ 71.731 71.097 null]
+>> endobj
+4071 0 obj <<
+/D [4037 0 R /XYZ 139.477 56.599 null]
+>> endobj
+4036 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4075 0 obj <<
+/Length 1969      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YYoÛF\10~ϯУ\T\eîE.Û'×Íá"N\ÇE\v$\81@S\94Å@"\19\1e\8e\8dþùÎìÁC\14å\16\15ôÀårvv¾\99Ù9VtæÁ\8fÎ\ 2J\ 2NgÊcD\ 5j\16ï^x³{øòæ\ 5µ\14\vK²èÑürûâåkÎf!      }>»]Ï\98RD\b\1føøDørv»ú4¿ØDE\9d\94g\v\16¨9%æù.Í\9aÇ\977·gÔóæ\vx;£óæÑ|»8\7fo\ 6¿\96é\83[øÙ\93\1e\90Á7\18ѳ/·¿½xuÛ
+'\19% Ç1ñ-ÉH|\16tâS\1a\12)Ù,\90\8ax\0\ 3Å\8f£l\95<,ÓÕãþ¦-µàDpqhWF\ 2?\84QïÓþ³\15\902\ 6\ 2¢¢;~c       \ 5#\f$s4(á]\1e\95+£¥\14d}tCó\ 4ù7ðýû\19Uó¨L@ÏË\9a\18Pi\9c\82¨f\vØÛ\ f\ 5\bÁI ¨f\9bæËhµ*'QS        :¢§CÝñ\9bFmiP¼Ë\ f/\8bÍS\95ÆÑÖ\0½zue\ 6(uRU\a\80\12>\1eEæ+\9fø"8\19²\1e¿Id\8e\ 6åË\8b:Í3\a\v¤Mj7¼O«ö(\15y       Æ¬'í\87^{\17UÉq¬àéL\9eÎw{ü¦±Z\1a\1d\1c®ÿ0hê2ʪmT'Ö\93Á¼\ fiY7\11`ü¯\ 6þìy<º¯&1³\90(ÿt\90[v\a\10\vÂ\82ÐíØ;¬B1'æO(çË×¢\17F}\8fP_À>¸âúæÃ\9b\9bó««ó_Þ½Z^ÞünÈ\aÛx\1eD]jé      1ìÓ\f\¥l\8aÚ¼fÍî\ e]\aÇ1j53ã»Ä<\8b2¿/£Ý.YµËs£aêK"¼\0!\93\1e\fó\19ä`r`\80¬\FÛí2>\væ\9b´\984\84\84l!©<\99%zü&\9dÏÑh1­JЧòµ\r\97NfsÆðôeöøå:¢\ 6óz\93\98\89\9e\12\ e\9c?P\82b\92\ 5Ï«\ 1ÍÍØéÔÐñ\9bV\83¥\99RÃ%8\8f=v\0"ØÓÍÔÁ\ 3ÈÕ×\bÜÑ{\1e4\87r\82©Ó\81îøM\83¶4S ¯7é¶5ýÇß0c\9e\ 3\18cõ#à\8d½-Á§«ó¿\96oÿ\^¼½¼þøe\12¾Ç   ?aÍÐã7\rßÒ °QYB\fðæOC\r\14¹\8e\1aV\ 5\10\0ÌÓ9¼\86\b¡#-Ì{U\97M\7pH&µ²ù^\15I\9cO;\82\b\ 4     OXGôøMjÂÑ \80\16ò\10q¯¤BñS\bÕ,¶ª*@\ 1I\19a\8e>\ 2;¯ê~Ùµ,&ñ\v\9fÈ\13V\e=~Óø-Í$þÖâe\9eÛè×C\83
+Øs\80IETO\15\14"E=Y\81\bª\b=a\ 5Òã7\81?h÷D\ 1\9b,ͳ®Ô*\1f\\ 5²ÎËÁ¡Øó\90¦:ì\1f¦®nÕ\83}\8dÑPÛÆÄP\94\99$\ eÉ´k\9dB\90\8d*\9bÄ\8b8\ 5FãTÏCÈôÌ\12¥V\84¦êˬ-\ 1ç\1cú\ 3\9b²Mp¾¾¸ìKX¹>
+6``\r \93¸C\9bÏ\99OÂÐ\ 4Ë_\93*.S]\96\8eEò`\89$\1cvCÒ[ô\1c_\ 6=×Яe\82¹\14=\aÓ)ÎÄy\86j»oÌY2\93Ð\97¸åP\v\9a!\ 6'ý­ªò85%"¾ß\ 17<§Ä¼¶;¯LÛ\88\ 6EK\9a­Ë¨'\17W\143|\11¡dú­Þ¤v´G¦åÂ\ 1´\e[Kb\83\84^÷TXÂ\9e;\8cÊ:\ enç)g=½|ÙÖô#½.\1c\88ë&\8bQ[\80Y2a0KÆ\9d,8W5\ 5´\ 6µy\81ªî\ 1<É~²\9b\81ÞJ3áØ\997\14[£Ó´éý¦î¨°Õh      Û4qHÇc×\ 6\8fò¨\83=H\bCÄ>'RIK×\19\0b\ eÀ\r¡&\ 5¸\99\19Y\eë1ôGM\81Cî¬\83³\ eZ5¶\ 3\83²Ü\ f\9cfi½Ü|_®¢:\1aËdo=\fé\8fc^\v\1e*8'á\9e\12\80e\fÅÀ\ 4SÅ 4|ÓL\ 3\81xÿ\93W\9fU~÷u\8a\13#Nùèîcµ1B¹ãeÛ\85eZ~;`HI\ 2éú\17Ý\8eÐùkçj\aT(\19Qj\18­\9e±\8a$\8c\8b£ÂzD\89ðßê0 T9â\8d.\8c\1eð<K¦ã=\97ö\¯\9f̤+\1eñ\83\89\fH  1 2s\18±p
+B\\96Ä\18°L§\ 4¶b\ 1\e¸J×oð\80Í1åèçÝWXg'!:Áæ58üöé\8c2\89\1aÅy}øq\0ñß.[\1f8|Ðð(êÀ¹ÎÌU²#µ
+\1eö²\v2\85\b¹\86F\12c\88ÞC\9f»ýmõ\13ãG²]Uc! \99@',ÕÀÄ]\83tX\1a¼Kl¥i\8d\99\8cx¡ê µÍÇa\86Ø'óP´N\ 1\8eéÚ9\1c¸Ö\1c\86Y\9e\89\1dçº\80bL\80sh\82\ 3`©GBN\87!¡»M\e
+\ 5¥Xà©£()QÒ\85\83Ñ­Îø\f\a¢gA!\99\8d뺱\97|¾Æð\9fïÌË._5ÛÄ\90A\1e\8cv\89)ÿ\85u}ýÔ
+\ 2â
\rvöå!Ú666\eç\96\14ÂÃð\10\e\ få\98x¾5IU/S<M\¢.\81\95M=8\11G\99¡DY\1f\17MqÀ\91}À¦þ­\1e(XÚù\8eõK³Aº6;\9aÛ¥­\99t7J\86¢2\14«t\r\8e\8fÙ2s·l\82\93P\rì
+U~¶W\11:fÚMÚ\ 2+\80êÎ\14X" J÷l\14B³è%;X®\ 2T\85\ eUu·V@yåkg±K¹OXh.\94Þ\83ÍÆáÏ\14e¶-wÜ}Ï\eqïé\f\12\99 N¿\9f\19³]ÿ\85î\83ß\ f®\0\y«k4\8d9[ÙË\11]    \99\vh¨FwQ¯h\1c\94\99\ 5\83Ú\91\9b2óãS\ 6uAÚel\bËàÌh{P8åx²\88\11Púõom-E|\ fÒr\bm\81étbha\fÁ\ fv\99^\ 3\ 2ÿì
+\99\8e8Íê\1eQºz|\9e¦üöó~\93\a\ 6í¦\17\1cýW¥#q\7fª\ 4$\fz\15\88%À}?\¼º9·\7f¤\~¼5\ 3È;\1e3\9aëÿ##8Þw9«R>ñÏÉXÂ\7f\0H¡uÎendstream
+endobj
+4074 0 obj <<
+/Type /Page
+/Contents 4075 0 R
+/Resources 4073 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4076 0 obj <<
+/D [4074 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4077 0 obj <<
+/D [4074 0 R /XYZ 71.731 768.009 null]
+>> endobj
+4078 0 obj <<
+/D [4074 0 R /XYZ 71.731 756.841 null]
+>> endobj
+4079 0 obj <<
+/D [4074 0 R /XYZ 139.477 743.434 null]
+>> endobj
+4080 0 obj <<
+/D [4074 0 R /XYZ 71.731 728.447 null]
+>> endobj
+4081 0 obj <<
+/D [4074 0 R /XYZ 139.477 715.041 null]
+>> endobj
+4082 0 obj <<
+/D [4074 0 R /XYZ 71.731 712.144 null]
+>> endobj
+4083 0 obj <<
+/D [4074 0 R /XYZ 71.731 700.054 null]
+>> endobj
+4084 0 obj <<
+/D [4074 0 R /XYZ 139.477 686.647 null]
+>> endobj
+4085 0 obj <<
+/D [4074 0 R /XYZ 71.731 683.75 null]
+>> endobj
+4086 0 obj <<
+/D [4074 0 R /XYZ 71.731 671.66 null]
+>> endobj
+4087 0 obj <<
+/D [4074 0 R /XYZ 139.477 658.254 null]
+>> endobj
+4088 0 obj <<
+/D [4074 0 R /XYZ 71.731 657.309 null]
+>> endobj
+4089 0 obj <<
+/D [4074 0 R /XYZ 71.731 642.405 null]
+>> endobj
+4090 0 obj <<
+/D [4074 0 R /XYZ 139.477 629.86 null]
+>> endobj
+4091 0 obj <<
+/D [4074 0 R /XYZ 204.443 629.86 null]
+>> endobj
+4092 0 obj <<
+/D [4074 0 R /XYZ 71.731 615.964 null]
+>> endobj
+4093 0 obj <<
+/D [4074 0 R /XYZ 71.731 601.06 null]
+>> endobj
+4094 0 obj <<
+/D [4074 0 R /XYZ 139.477 588.515 null]
+>> endobj
+4095 0 obj <<
+/D [4074 0 R /XYZ 71.731 585.618 null]
+>> endobj
+4096 0 obj <<
+/D [4074 0 R /XYZ 71.731 572.667 null]
+>> endobj
+4097 0 obj <<
+/D [4074 0 R /XYZ 139.477 560.122 null]
+>> endobj
+4098 0 obj <<
+/D [4074 0 R /XYZ 71.731 557.224 null]
+>> endobj
+4099 0 obj <<
+/D [4074 0 R /XYZ 71.731 544.273 null]
+>> endobj
+4100 0 obj <<
+/D [4074 0 R /XYZ 139.477 531.728 null]
+>> endobj
+4101 0 obj <<
+/D [4074 0 R /XYZ 71.731 528.831 null]
+>> endobj
+4102 0 obj <<
+/D [4074 0 R /XYZ 71.731 515.88 null]
+>> endobj
+4103 0 obj <<
+/D [4074 0 R /XYZ 139.477 503.334 null]
+>> endobj
+4104 0 obj <<
+/D [4074 0 R /XYZ 71.731 500.437 null]
+>> endobj
+4105 0 obj <<
+/D [4074 0 R /XYZ 71.731 487.486 null]
+>> endobj
+4106 0 obj <<
+/D [4074 0 R /XYZ 139.477 474.941 null]
+>> endobj
+4107 0 obj <<
+/D [4074 0 R /XYZ 71.731 472.044 null]
+>> endobj
+4108 0 obj <<
+/D [4074 0 R /XYZ 71.731 459.092 null]
+>> endobj
+4109 0 obj <<
+/D [4074 0 R /XYZ 139.477 446.547 null]
+>> endobj
+4110 0 obj <<
+/D [4074 0 R /XYZ 71.731 443.65 null]
+>> endobj
+4111 0 obj <<
+/D [4074 0 R /XYZ 71.731 430.699 null]
+>> endobj
+4112 0 obj <<
+/D [4074 0 R /XYZ 139.477 418.154 null]
+>> endobj
+4113 0 obj <<
+/D [4074 0 R /XYZ 434.465 418.154 null]
+>> endobj
+4114 0 obj <<
+/D [4074 0 R /XYZ 71.731 402.336 null]
+>> endobj
+238 0 obj <<
+/D [4074 0 R /XYZ 192.609 378.204 null]
+>> endobj
+4115 0 obj <<
+/D [4074 0 R /XYZ 71.731 373.248 null]
+>> endobj
+4116 0 obj <<
+/D [4074 0 R /XYZ 437.634 349.91 null]
+>> endobj
+4117 0 obj <<
+/D [4074 0 R /XYZ 138.564 324.007 null]
+>> endobj
+4118 0 obj <<
+/D [4074 0 R /XYZ 446.82 324.007 null]
+>> endobj
+4119 0 obj <<
+/D [4074 0 R /XYZ 119.552 311.056 null]
+>> endobj
+4120 0 obj <<
+/D [4074 0 R /XYZ 210.799 311.056 null]
+>> endobj
+4121 0 obj <<
+/D [4074 0 R /XYZ 302.045 311.056 null]
+>> endobj
+4122 0 obj <<
+/D [4074 0 R /XYZ 406.681 311.056 null]
+>> endobj
+4123 0 obj <<
+/D [4074 0 R /XYZ 119.552 298.104 null]
+>> endobj
+4124 0 obj <<
+/D [4074 0 R /XYZ 215.635 298.104 null]
+>> endobj
+4125 0 obj <<
+/D [4074 0 R /XYZ 308.371 285.153 null]
+>> endobj
+4126 0 obj <<
+/D [4074 0 R /XYZ 119.552 272.201 null]
+>> endobj
+4127 0 obj <<
+/D [4074 0 R /XYZ 230.089 272.201 null]
+>> endobj
+4128 0 obj <<
+/D [4074 0 R /XYZ 119.552 259.25 null]
+>> endobj
+4129 0 obj <<
+/D [4074 0 R /XYZ 188.111 259.25 null]
+>> endobj
+4130 0 obj <<
+/D [4074 0 R /XYZ 282.133 246.298 null]
+>> endobj
+3102 0 obj <<
+/D [4074 0 R /XYZ 71.731 217.075 null]
+>> endobj
+4131 0 obj <<
+/D [4074 0 R /XYZ 71.731 204.163 null]
+>> endobj
+242 0 obj <<
+/D [4074 0 R /XYZ 217.286 181.783 null]
+>> endobj
+4132 0 obj <<
+/D [4074 0 R /XYZ 71.731 171.205 null]
+>> endobj
+4133 0 obj <<
+/D [4074 0 R /XYZ 71.731 171.205 null]
+>> endobj
+246 0 obj <<
+/D [4074 0 R /XYZ 162.317 145.487 null]
+>> endobj
+4134 0 obj <<
+/D [4074 0 R /XYZ 215.193 129.667 null]
+>> endobj
+4135 0 obj <<
+/D [4074 0 R /XYZ 71.731 127.6 null]
+>> endobj
+250 0 obj <<
+/D [4074 0 R /XYZ 174.677 104.329 null]
+>> endobj
+4136 0 obj <<
+/D [4074 0 R /XYZ 71.731 99.373 null]
+>> endobj
+4073 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F51 3667 0 R /F22 2958 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4139 0 obj <<
+/Length 1880      
+/Filter /FlateDecode
+>>
+stream
+xÚ­Y[oâ8\14~ï¯@Ú\17:Z<±\13ÇÉîSKiË\f\94
+¨¦\9a\8b¢4qKf(a\92ÐiWÚÿ¾Ç±\ 3\ eĽ̢JÅv\8e¿sñ¹9Á-\vþp\8baÄlÜò,\82<æµ¢û\ 3«u\a\ e°¢è(\92\8eFs<=x\7fj\93\96\8f|×nMo[Äó\90ã¸\80ã"Ç¥­iü¥Ý\9d\85Ë\82g\87\1d¼6Fòw\90,V\8fïÇÓClYí\ eÌ\ eq{õ(\9fu\8f.äà$K\1eª\8d_-j\ 1\19<\83\11>ü6ýpÐ\9b®\85£\ 4#\90ã9ñ\15É\8eø\ ei1\84\99#ÄÇ\ eF\16\f\19õ\90\ 5j\bñW\8b<¹[ðø°ã\82¨ótq'GÑ,Y\ 67aÎ\830\8e³¿\85DÀ¨ã\ 3\13Ö°1Y\14rp;\ fïò\ 6r\ry\9eF?\9e¥¸     Wq\16\16¼\81è!M\14Ga±wrø+K
+\1edü.Éá$J\ 3®IêbÆa\11þiRY(Êó\ì\7fQ_\8d{ÆÃøUÌ_Ëi£ã;í,\84è/\8a\95ÏÒL\1dDþ=\f¢8\13\92½u[\1a½y\e\9c\7f\10-W¿µmþãw¶Ý¬rö¼ÈV\91¢¼ÏïÒ\9bïAQ³§\ü2<º\ e\86\93³Ññ\87É·\17`Ä   äK\1e¥Ë|\vK{ò\12\88ùC\12ñ-\84Y\9a\17òA\ 3À:®îÃÇ\0\84æQÑÄ\a°\83|\99,Dh\ 5\9aÌÁ&Ö:\1er-_ßôGr\eó[I\f\89'øÔ\9f\9e\aãé $ß¡^\16³ÒÓ\15ú¯4ûÁ³@.¾xv\e×_òE\1chI¢A, Hnw\11ÿ-7¼?%¤\851ò)\15\83 ò±Ýê\10\17a×+       \87üþ\86g¹¢f\9bô\rp\98A\96·¥Í\ eY[\98¨xZòí\84\8b±\8f(%-jÙÈ\85\90q      b®\ f#íÑöï:9cB@\r\91¥7xevÖ¥Ã\ eA\ 4²rE#d,øc!\v\ 4xR"l(Æ1Ï£,¹YÏ¥&Pb\96r^i\ 4V!Èõ\1d\10ÀFÌÃ5µ\93øѤµÃ("\8cìMk\rϨuE#\9d>æªX¦·J¥\19×uU\8aB]\95\8b2´À\ 2\90¢ùòM>\r³,\84BÜ~j°        ©Û$ûi´\89ã\9ajïïÙd\83\89¢ÑD¬ô\86R\93­\96Ê7\16+áðê\912\18hÜ^<½è\ 5ë
+oÔ\eCËãí/\ 24<³Þ\8afGo!­ROVк\e¬\9d¤\vÊ_^Éq\7f¤<I\19è!É\8aU8\97\93{~\9ffO*Â\96\8d.òÕ²lHZ&3Ù¾\85,\1fïÍL\1a\99|×Yó¬\99ɦV%ë_2\ 3:Z\ 3K-ä\12!LÙ¹\9e÷/\83îèâ´\7fv5î\9dìæKßF\98*b\84$v\8dQ\92«Åt\ 1<ÉÝ*ãñ\9f»\}\ 6]³­s\9dôÎ\86½\8bi\13SO´«d\8bk\18Eåi\8bq\91ÊC²m\8c<\ fË\12\19\fiBùIÎïî9\84N¼é¹ïÁSB¨\9bÊ\an+/I<B   «aåUg\ e\1cAZBwR\b\14[øÿÃè#\8e\87\18¸÷Þ|d\83g\f¥\8aæ\99PÒ%\97FÈøÏ\15_DÊ&"­ª\0;ÿÇ\98\9eݨ<±\90Míý)¿Á3+¯hÊN\8cÏ¡wª\8e\14Jt-\99°f]åY×ï\e&\8d\89\14\7fo\1akxF\8d+\9aµ\94\rê®å\96\87½ZD\858â´ª¥éÒ\6jw\1d£â®\8d¨»??×ðÌ\8a+\9aJÈWê\9dªÃ6(]ï\ eÄ\r̨³MË´µ7\9d7xf\9d\15\9d§eO°\95ÅÒ¥P±*v5kä¢]äQ"òv¤ÚJ¡_9\82®\93Cÿ\ eÖ19\82v»4\9aÄr\11c{ôÿ\r^\83I(²\98»æ)D\9c|8Ä^ûè°C]ÒÎ5]©\8b5g\10O;òg\96Îã\\rÃ,þ%ö\87\19oB Ê¶\8a¼´¸\18\94\ 5H0è®SªX>I\1e\92XF\f\\ 2\10õ}U¶\88òX%\8dx]T\96\1eUø6u¡ã\17\9cE"\16\19\884%ÈJ\86b\ 1N\ 4v[h&×\ 5ý\9c\0\ 4®@¶S\95õîÉ8è\ e>\8e®¦Áðhò±¡\1cûp\19q\14uCmw\91\8dq\1d,\18\9d\9eî\ 2¹\14\fPÇf~ùvJ¯ç\ 2q|Ý¿¸ì]\18\10m3"ØÙöuÑ\8e/wA\1ch"\9c7\80\ 6\ 6o\a\b¢ÃS\a»I\1dÚÛ\14S\98`J ÙÝ_æÐð\9a;G\88ä\8a¦\16&P)kN.æ\9b0\11³\8eü\11a¢Fµ(i\ 2\80(\ 1¯­\1cÙ\96\81"\ 6ÊoíöhU,W\85\1cwÓE\91¥ó5ï\8eêô\10Ŭæ\17õhÁz´à*Zd¨À³2T`Y²\84\ 5=T`Ý\18*Ø÷\91W9÷¨;\ e\86£\93^pÜ¿<?\9aô\1aÚe\8a\\a?çJ>v¶Ñ¦½Ét\17\8a1Ä,ÿÕÁBê\98\17£ñðhðöXÖ}}\rÖ\1d\8cºMyÁF®ç¾\1ekzm\ 5\83ó]\1cêCÂ~\13\ e\ e>\7f~\ 1\a)¿!>\<ê\85K{Qi\8aHßCØÛ_û²\81k\88G\aQË®8
+ùúPÆ!\0¨åÔ+\8e\9a\ 5O;rq\96B|ɲ%fõ²Õ\0¢\a¤\98ËÊ\ 5\84²rÁJWÜ\9cÅ\8a\10%»]_\8a¡Â\12÷Ù²å¸\1e\ 4"À«X\14s-\16ÅTÄ¢ã2É­\(/Z"\14ÅÌ\µ \95ß$û\ 4d\fºM5ÁaÈ#fo\82\8bh\rcxuý¿1&\83K\ 3\ 6~cµ+á.?\9d¼\1dN\8f\92\12ådØ}³b» \93î\1eD\197%¸\1a
\8eDõ-\8e8ȷس_ë6$ÕÇ:\86|V\1eS\r\8fÞøH} ë\83PåÀ¦\18\1a«R>ýK\9f#\8aùº±Á\8eá\8bÜ®\84ÿ\ 1r´ñÍendstream
+endobj
+4138 0 obj <<
+/Type /Page
+/Contents 4139 0 R
+/Resources 4137 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4140 0 obj <<
+/D [4138 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4141 0 obj <<
+/D [4138 0 R /XYZ 71.731 560.51 null]
+>> endobj
+254 0 obj <<
+/D [4138 0 R /XYZ 176.446 536.011 null]
+>> endobj
+4142 0 obj <<
+/D [4138 0 R /XYZ 71.731 535.868 null]
+>> endobj
+4143 0 obj <<
+/D [4138 0 R /XYZ 71.731 531.086 null]
+>> endobj
+4144 0 obj <<
+/D [4138 0 R /XYZ 71.731 516.21 null]
+>> endobj
+4145 0 obj <<
+/D [4138 0 R /XYZ 139.477 503.665 null]
+>> endobj
+4146 0 obj <<
+/D [4138 0 R /XYZ 71.731 500.768 null]
+>> endobj
+4147 0 obj <<
+/D [4138 0 R /XYZ 71.731 487.817 null]
+>> endobj
+4148 0 obj <<
+/D [4138 0 R /XYZ 139.477 475.272 null]
+>> endobj
+4149 0 obj <<
+/D [4138 0 R /XYZ 71.731 472.375 null]
+>> endobj
+4150 0 obj <<
+/D [4138 0 R /XYZ 71.731 459.423 null]
+>> endobj
+4151 0 obj <<
+/D [4138 0 R /XYZ 139.477 446.878 null]
+>> endobj
+4152 0 obj <<
+/D [4138 0 R /XYZ 71.731 443.981 null]
+>> endobj
+4153 0 obj <<
+/D [4138 0 R /XYZ 71.731 431.03 null]
+>> endobj
+4154 0 obj <<
+/D [4138 0 R /XYZ 139.477 418.485 null]
+>> endobj
+4155 0 obj <<
+/D [4138 0 R /XYZ 71.731 415.588 null]
+>> endobj
+4156 0 obj <<
+/D [4138 0 R /XYZ 71.731 402.636 null]
+>> endobj
+4157 0 obj <<
+/D [4138 0 R /XYZ 139.477 390.091 null]
+>> endobj
+4158 0 obj <<
+/D [4138 0 R /XYZ 193.593 390.091 null]
+>> endobj
+4159 0 obj <<
+/D [4138 0 R /XYZ 384.186 390.091 null]
+>> endobj
+4160 0 obj <<
+/D [4138 0 R /XYZ 71.731 374.243 null]
+>> endobj
+4161 0 obj <<
+/D [4138 0 R /XYZ 71.731 363.244 null]
+>> endobj
+4162 0 obj <<
+/D [4138 0 R /XYZ 139.477 348.746 null]
+>> endobj
+4163 0 obj <<
+/D [4138 0 R /XYZ 71.731 345.849 null]
+>> endobj
+4164 0 obj <<
+/D [4138 0 R /XYZ 71.731 334.85 null]
+>> endobj
+4165 0 obj <<
+/D [4138 0 R /XYZ 139.477 320.353 null]
+>> endobj
+4166 0 obj <<
+/D [4138 0 R /XYZ 71.731 317.456 null]
+>> endobj
+4167 0 obj <<
+/D [4138 0 R /XYZ 71.731 304.504 null]
+>> endobj
+4168 0 obj <<
+/D [4138 0 R /XYZ 139.477 291.959 null]
+>> endobj
+4169 0 obj <<
+/D [4138 0 R /XYZ 71.731 289.062 null]
+>> endobj
+4170 0 obj <<
+/D [4138 0 R /XYZ 71.731 276.111 null]
+>> endobj
+4171 0 obj <<
+/D [4138 0 R /XYZ 139.477 263.566 null]
+>> endobj
+4172 0 obj <<
+/D [4138 0 R /XYZ 71.731 260.669 null]
+>> endobj
+4173 0 obj <<
+/D [4138 0 R /XYZ 71.731 247.717 null]
+>> endobj
+4174 0 obj <<
+/D [4138 0 R /XYZ 139.477 235.172 null]
+>> endobj
+4175 0 obj <<
+/D [4138 0 R /XYZ 71.731 232.275 null]
+>> endobj
+4176 0 obj <<
+/D [4138 0 R /XYZ 71.731 219.324 null]
+>> endobj
+4177 0 obj <<
+/D [4138 0 R /XYZ 139.477 206.779 null]
+>> endobj
+4178 0 obj <<
+/D [4138 0 R /XYZ 356.822 193.827 null]
+>> endobj
+4179 0 obj <<
+/D [4138 0 R /XYZ 452.797 193.827 null]
+>> endobj
+4180 0 obj <<
+/D [4138 0 R /XYZ 139.477 180.876 null]
+>> endobj
+4181 0 obj <<
+/D [4138 0 R /XYZ 210.769 180.876 null]
+>> endobj
+4182 0 obj <<
+/D [4138 0 R /XYZ 258.151 180.876 null]
+>> endobj
+4183 0 obj <<
+/D [4138 0 R /XYZ 71.731 178.178 null]
+>> endobj
+4184 0 obj <<
+/D [4138 0 R /XYZ 71.731 165.027 null]
+>> endobj
+4185 0 obj <<
+/D [4138 0 R /XYZ 139.477 152.482 null]
+>> endobj
+4186 0 obj <<
+/D [4138 0 R /XYZ 339.287 139.531 null]
+>> endobj
+4187 0 obj <<
+/D [4138 0 R /XYZ 440.842 139.531 null]
+>> endobj
+4188 0 obj <<
+/D [4138 0 R /XYZ 139.477 126.579 null]
+>> endobj
+4189 0 obj <<
+/D [4138 0 R /XYZ 234.68 126.579 null]
+>> endobj
+4190 0 obj <<
+/D [4138 0 R /XYZ 323.905 126.579 null]
+>> endobj
+4191 0 obj <<
+/D [4138 0 R /XYZ 389.22 126.579 null]
+>> endobj
+4192 0 obj <<
+/D [4138 0 R /XYZ 71.731 123.882 null]
+>> endobj
+4193 0 obj <<
+/D [4138 0 R /XYZ 71.731 110.731 null]
+>> endobj
+4194 0 obj <<
+/D [4138 0 R /XYZ 139.477 98.186 null]
+>> endobj
+4195 0 obj <<
+/D [4138 0 R /XYZ 360.23 85.234 null]
+>> endobj
+4196 0 obj <<
+/D [4138 0 R /XYZ 415.48 85.234 null]
+>> endobj
+4197 0 obj <<
+/D [4138 0 R /XYZ 470.73 85.234 null]
+>> endobj
+4198 0 obj <<
+/D [4138 0 R /XYZ 139.477 72.283 null]
+>> endobj
+4199 0 obj <<
+/D [4138 0 R /XYZ 192.837 72.283 null]
+>> endobj
+4200 0 obj <<
+/D [4138 0 R /XYZ 246.196 72.283 null]
+>> endobj
+4201 0 obj <<
+/D [4138 0 R /XYZ 299.556 72.283 null]
+>> endobj
+4137 0 obj <<
+/Font << /F32 3079 0 R /F42 3513 0 R /F22 2958 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4204 0 obj <<
+/Length 2038      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YYsÛ6\10~ϯУܩ\10â"Èv¦3ñÑN\1a'nleÒNÓáÐ"l±\96H\85\87\8föÏw\97\0xH\94Ý$\1e=\10\0\17\8b½¾Å®H'\1eüèDQ¢8\9d\ 4\1e#\81
+&\8bõ\vor\ro~yA-ÅÌ\92Ìz4\87ó\17/\7fæl\12\92Ðç\93ùÕ\84\ 5\ 1\11Â\a>>\11¾\9cÌ\93?§GËxSéâ`ÆT0¥Ä<OÓ¬¾\7fy>? \9e7\9dÁì\80Në{óîèÕ;38.Ò[·ñ\93'= \83w0¢\a\7fÍ\7f}q2o\85\93\8c\12\90ã1ñ-É\8eøLuâS\1a\12)ÙDÉ\80\ 6\8a\9ffU´8PÓÕMTèëí\83Û\1d\82\13ÁÅØÉ\8c(?\84QïÕö³\15\922\ 6B¢±;~»R
+`\19òöL\94òuVéÕÁ\8cs>-7z\91~ò<¶À9\9b\82ÔiÙ8\0ßÎÌc\99¯\92Ò\ eã"\ 1ëß\1dÐ`\1a\17z\8c  \9fæ\9b*Í3»ã*/\fëjiÉ\8fV9ÚèÆÌÎêÊ\fÐ`tjNGG\134ßdÆ  §>*KBI\eñÏZö\8cM\13\8d\ag:Á)\9f¦À"3Cs\1e\90¤\ 1\93L\91¥\99!ùJÿ\80Ì_þ,záHý\90\ 4àGÏxòèôMttì\19º¾E\85"\ 1£\96ìû]>\92\84\ 1\1dr¡_Ç\85\r¹°=\¾\88     ÿrQf\\85ÄSÂ:\81uì.N¿Ê>\92\87}¡.Néã\9aÙH \0JêI\18\ 2Ú\ 2î².\1fC\9b\1f\84\84òàÙÐÖã7\8a¶0ôÛ3ûh\93[@\91¼\8f6iÐ&;´I1\826Xl\99À\9b\85\0'\1dà¤\ 3\0\f\ ekûê(Ïpãu]ĸÁ\ 1LÒpàÛV,\ 3Ã\99ð\ 3\0\1d\1cgOÁy\ fw8\85\9c\fOeÎl\16ZÐál/è\18ó\88\92Ü\85Ãá\87\8bèøÜûâ@W\90Û\86<è·ó\98ÓoÆ
+íØývvú\8dXA.G\87\7f|5VÖåu~ù÷\9fo_ý\1e½½øåìð×\vpé_{aÃ\ 5¤Cú|°éø\8dÂ\86Aêu4(m\\141\ 4àôÁ\éù\95ynr\80¼.J3«róL³$½ÅÜ\9fÔñÊ,-òõºÎÒ\85\89tÃãòo½¨Jc!\90Ë\ fÅÀ@x+-Ó\r\ 2\94{\r\83å\8axÆ|ÒñÛo\18K\83RZ\v\f\rÐà\ e\a¥®\86\ 6³JÙ·`¢^\ eê\8câê&\80é
+1\8d³Ë\87\11¼\82\11\82\ e¯Y
\ ep\8f\92¸\8aw\ 33\0©¥»Q¯êlÑË:\fpâñ\81ý\97yY%ú6]è}¶\97
+j-ù|\95S\8fß^Û;\9a½¶\1fX\18uH³kkÁ\1cBx
+9|_Ä­ãû¨\17\95£*\8b\90øþóá°Ço¿Ê\96Æ\8a\98®\1d¨²z}éÔo\ 3\f\80\86\ 5ù8Ö,I\96ÁÌ\ 5V\17´i94á®\9dX\1f\99\91«\1c÷Ù
\1eóÕóÙªã7j«\80«öLsq\96º¸mjQ®\嫦åCÖ(PäYú\8fµ\11®£\ 59\ f\e¬ºHjvÕ\9bM^\98`Ây\91×0Ñ¥\99a\8b\93å\95\99Ô¥9ÓÜøұ¬\8b\ 3xÌÚbzXK\17:³ØOzý\13\fÊ\14k\ 5Ó<Á\ eP\9b\ro\93»¼¸ÑET-\v\1d\1c"\14ndÏæ\90\1e¿½Áëhzqc´2\12»ÐkÄnƯ\8f»®±i2iÓdº\ e³ÜJ\988Ô«¤3Î\b®7:K" äñõ^`\vI\89dáóÙ¦ã7b\eJÂöD\93k\9b*\93   è\992\88ÔµÃ.,Ä\9796e8DEL:k\b\15õƾ\8b³dì\82ðA;\97ó«ûè.¾Ñ#%\8b\0Ð8ª|£MAj\ 5j\1dáu\8e\10MõlÃ\98ù\1c\-\aEk¯°öú>"fåm\Þ\94fx\e¯jHXº\1ck\ 2¡\1e\95\81\13Ì\94IÑü÷èüäý\87\93\8bù®"Pd5\85\96­¾ìie¾ÖfÔ`\1c\9e\18÷¦k]\961vº\8eÀ%J\9c\14­\86LBPÑ\ 1V?×)$\98]\999#BÉ'-\8eµ¤²T\8bxµú~¬\1a'Ê£Cå_\9f¿\7fD{
+É/\bûÚ+ÚKcÊë\a\r¾Û\14ù\ 2,`²\9aB\8d\eµF"iÆ@wðãÀËV¨\8fgçoNΣ\8f¯Þ\9c\8c\vE\85\1a¸Ä\87\80\0`\12Êl\98c\86\8c+óÆå\ 5\1c»¼\80\14å\12¼\94×+;½Ô\96¼éÆn´]¶í\96ßúÜG\9f\9b¬i\ 5é;\11°ukK58©Ä\987
+0\90\e¨d£ºË·Ì\87\0öX\97\8b"ݸ
+j¨²\a[$áÂ\18i\8e±æ3î``\8f\0    ºÆBÀ\ 5ïʸ»"­tÔv};ÜC\8f@3g\89[Ô÷Ù1h"¥\v\1c´à#Ü\ 2\80¾rG7]-\8a
+\15w\8a&ÅñU\91¯Ýj\81\ 5\94.7¹ÉC\ 6\1c\12â\94\ f{ÖVU°º/\81\ 5ún½+©\1fB¶t§/ïzµþPJ_\12á9\9d˪¨\17U\8d²\ 2wÑ$(\eä³\9fºª\15Æ\8eáì§]£â\r!\88br\18\10\19j­øô)\86\ 3³6·O³\r\8b)_áß\ 2\98StRoF2\84ç\ 1\92D\vþ,j¥\eõ\8f á¶·\87M.Ò0>Ð\ 3¹:\11w\99*AäV\1fÐ\80\91tѯ\b£6úÛú\vî+_ô\\0À   \94md£ªÛ+ öý^C=ã>a¡ùOö]¼Ö»:\18Ä m\9f»\ f\16÷>\ e Ñr\17;\9f\18S¶@è¢Ãt\0«¤í\0 8\ 6·\8c7¢nw\é±\1c`O\83h'Üþ\95\90A(¤Ý\1d \bUÂÜ[$¤HL\89'ä~\9d\9aÙ¿M4\ 6Ä÷\0C\88\aS½ÖY\99^7ÿè Ñ*G\1dp\84;/ãRGq\92\14?6{½ýûÒÌ\9d\99\17\90\e\9b<I?\14ëj\ 5\ 5ÖÈ\9e\96k¡ÇXöM\ 3qû¹Ö\11Ô9¥³Ïwæñ\19×þçîäZoí\86\8bø3.ÿ?\ 6å*¯v\19àêcÚ\ 1    (X<D\8bì)5«t\rÕú
+\92\15\97 Ð{Z@\88\1e'[q\1fÁìé-Í\9f\ 2C}0­áò\8fÛ\ 5±ýVÄ\ 4  =õèפ\8eÄ}LR$TM~\19ðh¾\12\1c\9d\9c¿²\1f\90^CíÒ\f¸¤\9eý\e½ÿ%Jð\80Hêî/*÷|1Ú\95ð?úRÌ5endstream
+endobj
+4203 0 obj <<
+/Type /Page
+/Contents 4204 0 R
+/Resources 4202 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4205 0 obj <<
+/D [4203 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4206 0 obj <<
+/D [4203 0 R /XYZ 71.731 768.009 null]
+>> endobj
+4207 0 obj <<
+/D [4203 0 R /XYZ 71.731 755.979 null]
+>> endobj
+4208 0 obj <<
+/D [4203 0 R /XYZ 139.477 743.434 null]
+>> endobj
+4209 0 obj <<
+/D [4203 0 R /XYZ 309.323 730.483 null]
+>> endobj
+4210 0 obj <<
+/D [4203 0 R /XYZ 363.125 730.483 null]
+>> endobj
+4211 0 obj <<
+/D [4203 0 R /XYZ 416.928 730.483 null]
+>> endobj
+4212 0 obj <<
+/D [4203 0 R /XYZ 470.73 730.483 null]
+>> endobj
+4213 0 obj <<
+/D [4203 0 R /XYZ 139.477 717.531 null]
+>> endobj
+4214 0 obj <<
+/D [4203 0 R /XYZ 192.837 717.531 null]
+>> endobj
+4215 0 obj <<
+/D [4203 0 R /XYZ 71.731 714.833 null]
+>> endobj
+4216 0 obj <<
+/D [4203 0 R /XYZ 71.731 701.683 null]
+>> endobj
+4217 0 obj <<
+/D [4203 0 R /XYZ 139.477 689.138 null]
+>> endobj
+4218 0 obj <<
+/D [4203 0 R /XYZ 360.23 676.186 null]
+>> endobj
+4219 0 obj <<
+/D [4203 0 R /XYZ 415.48 676.186 null]
+>> endobj
+4220 0 obj <<
+/D [4203 0 R /XYZ 470.73 676.186 null]
+>> endobj
+4221 0 obj <<
+/D [4203 0 R /XYZ 139.477 663.235 null]
+>> endobj
+4222 0 obj <<
+/D [4203 0 R /XYZ 192.837 663.235 null]
+>> endobj
+4223 0 obj <<
+/D [4203 0 R /XYZ 71.731 660.537 null]
+>> endobj
+4224 0 obj <<
+/D [4203 0 R /XYZ 71.731 647.386 null]
+>> endobj
+4225 0 obj <<
+/D [4203 0 R /XYZ 139.477 634.841 null]
+>> endobj
+4226 0 obj <<
+/D [4203 0 R /XYZ 71.731 631.944 null]
+>> endobj
+4227 0 obj <<
+/D [4203 0 R /XYZ 71.731 618.993 null]
+>> endobj
+4228 0 obj <<
+/D [4203 0 R /XYZ 139.477 606.448 null]
+>> endobj
+4229 0 obj <<
+/D [4203 0 R /XYZ 362.099 606.448 null]
+>> endobj
+4230 0 obj <<
+/D [4203 0 R /XYZ 71.731 603.551 null]
+>> endobj
+4231 0 obj <<
+/D [4203 0 R /XYZ 71.731 592.552 null]
+>> endobj
+4232 0 obj <<
+/D [4203 0 R /XYZ 139.477 578.054 null]
+>> endobj
+4233 0 obj <<
+/D [4203 0 R /XYZ 71.731 575.157 null]
+>> endobj
+4234 0 obj <<
+/D [4203 0 R /XYZ 71.731 562.206 null]
+>> endobj
+4235 0 obj <<
+/D [4203 0 R /XYZ 139.477 549.661 null]
+>> endobj
+4236 0 obj <<
+/D [4203 0 R /XYZ 71.731 546.764 null]
+>> endobj
+4237 0 obj <<
+/D [4203 0 R /XYZ 71.731 533.812 null]
+>> endobj
+4238 0 obj <<
+/D [4203 0 R /XYZ 139.477 521.267 null]
+>> endobj
+4239 0 obj <<
+/D [4203 0 R /XYZ 71.731 506.28 null]
+>> endobj
+4240 0 obj <<
+/D [4203 0 R /XYZ 71.731 493.329 null]
+>> endobj
+4241 0 obj <<
+/D [4203 0 R /XYZ 139.477 479.922 null]
+>> endobj
+4242 0 obj <<
+/D [4203 0 R /XYZ 71.731 477.025 null]
+>> endobj
+4243 0 obj <<
+/D [4203 0 R /XYZ 71.731 464.074 null]
+>> endobj
+4244 0 obj <<
+/D [4203 0 R /XYZ 139.477 451.529 null]
+>> endobj
+4245 0 obj <<
+/D [4203 0 R /XYZ 358.456 451.529 null]
+>> endobj
+4246 0 obj <<
+/D [4203 0 R /XYZ 260.063 438.577 null]
+>> endobj
+4247 0 obj <<
+/D [4203 0 R /XYZ 171.952 425.626 null]
+>> endobj
+4248 0 obj <<
+/D [4203 0 R /XYZ 240.19 425.626 null]
+>> endobj
+4249 0 obj <<
+/D [4203 0 R /XYZ 139.477 412.674 null]
+>> endobj
+4250 0 obj <<
+/D [4203 0 R /XYZ 71.731 397.948 null]
+>> endobj
+258 0 obj <<
+/D [4203 0 R /XYZ 192.609 372.724 null]
+>> endobj
+4251 0 obj <<
+/D [4203 0 R /XYZ 71.731 367.769 null]
+>> endobj
+4252 0 obj <<
+/D [4203 0 R /XYZ 174.215 357.382 null]
+>> endobj
+4253 0 obj <<
+/D [4203 0 R /XYZ 288.018 357.382 null]
+>> endobj
+4254 0 obj <<
+/D [4203 0 R /XYZ 188.875 344.43 null]
+>> endobj
+4255 0 obj <<
+/D [4203 0 R /XYZ 419.556 331.479 null]
+>> endobj
+4256 0 obj <<
+/D [4203 0 R /XYZ 119.552 318.528 null]
+>> endobj
+3103 0 obj <<
+/D [4203 0 R /XYZ 71.731 302.256 null]
+>> endobj
+4257 0 obj <<
+/D [4203 0 R /XYZ 71.731 289.344 null]
+>> endobj
+262 0 obj <<
+/D [4203 0 R /XYZ 209.625 266.964 null]
+>> endobj
+4258 0 obj <<
+/D [4203 0 R /XYZ 71.731 256.385 null]
+>> endobj
+4259 0 obj <<
+/D [4203 0 R /XYZ 71.731 256.385 null]
+>> endobj
+266 0 obj <<
+/D [4203 0 R /XYZ 162.317 230.668 null]
+>> endobj
+4260 0 obj <<
+/D [4203 0 R /XYZ 209.215 214.847 null]
+>> endobj
+4261 0 obj <<
+/D [4203 0 R /XYZ 71.731 212.78 null]
+>> endobj
+270 0 obj <<
+/D [4203 0 R /XYZ 174.677 189.509 null]
+>> endobj
+4262 0 obj <<
+/D [4203 0 R /XYZ 71.731 184.554 null]
+>> endobj
+4202 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4265 0 obj <<
+/Length 1715      
+/Filter /FlateDecode
+>>
+stream
+xÚ­XK\93Û6\f¾ï¯ð©cOk®H\8a¢Ô\9e\92í&\934\8ffãÌd¦éhd\9b\91%¯$ïl\ eýï\ 5øÐÃ\92\17\8f\ f"i\10\ 4À\ f \0:óàGg\92\12Éé,ô\18 e8Û\1c®¼Ù\ eþy}E-ÅÒ\92,;4/WWׯ8\9bE$
+ølu?caH|?\0>\ 1ñ\ 31[mÿ\9aßì\93c­ÊÅ\92ÉpN\89ù¾KóÓÓõÝjA=o¾\84Ù\82ÎOOæ¿\9b\17\1fÌà÷2}t\e¿yÂ\ 3\ fFtñ÷êíÕíª\11N0J@\8eçÄ·$\ 3ñ}6\93\84J\1fŧ>%\1e\f¥\b\89\aj ø§¼Jw¹Ú.\96\ 1\88\9a\15ùÎ\8cʧøXªM\91ߧ»8Ýþ\86"ÁIË\bN\91zgR\17\87t\13×\86¾Xÿ\13\9f*5FXÕåicɲ´ªã½J¶½]ee¶-C\12xQwï¿ú\8fëW\8cÍ(%\91\10¨Ç\922\12Q>[²\80РÔ\84ïÕa\r|,µlï\f\12®\96k2<p\9dT*N¶ÛòÜÌ\94FD\b6\v\0\vø\1d±3#2\88`ÔùëüÛ\ e\fô\80A\87\9f¾\93®xÍ\99\ 2\844:\1fÒ¼\98\96Íç\84\8aðr²µü\86²ù\8c\89£Ñ·^UÅ&MjD\f\ 2\1eÓ\8d2c#¸\1ejÀã\8d\98{\85Ó\82È\87c9\91!u7¡\0\15SjR\1f´\11\97S³å7­¦¥éHgt1\8aè1x²þn\92\90ó}z\8c5\95´(?\95Ö\16\11ÍY\83Áo\9eÇ\93]5¥¾\b\ 3Â%½\98ú\1d~£êG¡hÎÔ\10TU\95ì@\15.Xc\v\1cWGµIAx¶1s§\a\13sbVÞ'Õ÷Ê\f\1f\93줪_\8dOúÝ8
+ñS\ 2Ú=ãº\9f_\7f|ù6^}\8dïn?}¹ý¼\1a:1õ\ 4¡,°\e\88=ªÞ[  \9d¸Úâ\9c
+âSj¢\84è\81mÉ=6/Õ\ 3HUWf¶új¾ üMçécR§E>\94\98rI\84Ç\ 6\12¿ûxóÇP\°d\10\89®´pBU\1c\94\19½¹ûdE)Nu\9aëU:G×ÁÅM\92\ 4ÑõÝ,\18y\10J>¡\91´\8a\19,\19¦úYùó\8b\85he¾å)ÏS\fçz\11\94\83H¿µÄ¨5~Ak§²\9e\1fËb\ 3¶l¶m\8a­µ*\03b¢çÁ¥\9at_Á\19¼4\97\ e¿I÷u4(\1a"Te6Dí\8blÛhTÕI}²\16*îÍWã\b}8K*ëó+ûX\17GU6\90\18õæ\a\95o§ýØã$\b/èÇ-¿i;X\1a\14îX¤y\93\9cÔ\85\rÓιµ\82\93pÛe©ªc\91·æÒÊYùø6\15Ñë§øAm\8d\e\8e\19Ã\97\82@\ 6u1ctøM\1aÃÑ |Z6\vë\81¢Î8u\99ä\158Ë!­\9b\17^F \0\8aWY1é\f\901\92\10¶\Lï\96ߨÞA\184gê\18\81²-9c­'àDkêÔÄ\ 5§&\rç¿\98\95v'\ 6\15½)ù®0\94à\8cÏïË\ 2M5\12à}A\ 2êÂ%<\96\10\1a¢n\f\11ÏÙê<\11\827!äÍ\96,³á<\0V\9eß\vçI¾íǺûR¹ËZÿ\18\8a#=â\87¢/\rny^\1aî;i\V\ 3 Ñ¯¾Ú\9e28oì\1c\8fÉþ9É.Ióé\83\80/ê}\8e'\88­å\8fx\93O\83
+^DáG\97\ 3UËoÚ\99,\8d\96Ñ \aÞ
+÷v$\80¤Ã±v\1e\86      \8e\84\8b:=(°Ì\94\8e\Bé"\82\8béØá7©££±7h1eã\ 6\168\rÊ\8c\9e&        ´¹pSÐÉ&\9e\18¼Ø×\CÕ\81ɾ:á\88);v\19\r8P\9c\1dªÝ¤Ùü\10¬s¹ò¥Ãoh6Á\9bóô¥\ 2\ 4\8a2)Á<\94\vÌ\8aa\86aWÏÐ(00O²]\83"S\81ÙÜÔ\ 6¡ÊN×
+ì¥ì.\f
+:|9f\ 3\aD#       Æ{ÁÂù{\9a\ 1\1aÑn\f\1f\82\91\9fã\18}öEU»;\9e2·'!ß\94\973wËo\1a¥\96\8doÀõÓÿV*õÞEÑnѳVØ\v¨\1a®S^Üô    0åÂNÁ\94\99\98\8c 8^î\15ìð\e5\13çí\99ÚLY¢ëÔ00F
+\r8\95\19ÞA¸új\86mz\ 4¤\901çµ.x´\85áoã¿ð\97M½a©\r\ 2ÈüÇ\11Ñ\8bëõ>©Íb© tØC\93\83åÝ\98Ûr5&&¡\10½\14\1frõ©\fÜ5]&m\ eUK /÷Htø\8dØ\9c\1c\8dv½âd¡É©É¶á«û=f\88]¯^CA¯y,SfÜ ÕÒ\eÛs¦ûkpcOf¦9\1e¡d¢seVðF²\14®®Òí´Þù\16ï¸Ò´ 4´\19\8b\ 6\11vʼ^\ 4Éååª\9c\ e¿IÏw4( 6Óú\95\f\8a{\96®÷j\1d©áÙF\ 6¤\8fkÒöØ$aÔôØ \97\110\
+JDÀ{\8d<\8dy·¹ÝëCÆ\14à^_\92PG²\80°È<¥\1f\10õ\83p\8d½9¡iÏû\84çì;\96\88B]Þ\9b\ecò¼>\19\16}7\v\1aÍ]Û\15ù^7\0i«ÂAÝb;ÂPuG\9e|¶gÜ\92¸\96±$P¨cFØã\81\12\7f¼¹½{aÛÄo>¯Ì\80\vê1£j·ßìó\10.ÁéJ\83\89¾ðPÂÿ\0ý¤\93\84endstream
+endobj
+4264 0 obj <<
+/Type /Page
+/Contents 4265 0 R
+/Resources 4263 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4266 0 obj <<
+/D [4264 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4267 0 obj <<
+/D [4264 0 R /XYZ 71.731 728.396 null]
+>> endobj
+274 0 obj <<
+/D [4264 0 R /XYZ 176.446 703.897 null]
+>> endobj
+4268 0 obj <<
+/D [4264 0 R /XYZ 71.731 703.754 null]
+>> endobj
+4269 0 obj <<
+/D [4264 0 R /XYZ 71.731 698.972 null]
+>> endobj
+4270 0 obj <<
+/D [4264 0 R /XYZ 71.731 684.097 null]
+>> endobj
+4271 0 obj <<
+/D [4264 0 R /XYZ 139.477 671.552 null]
+>> endobj
+4272 0 obj <<
+/D [4264 0 R /XYZ 71.731 670.722 null]
+>> endobj
+4273 0 obj <<
+/D [4264 0 R /XYZ 71.731 657.656 null]
+>> endobj
+4274 0 obj <<
+/D [4264 0 R /XYZ 139.477 643.158 null]
+>> endobj
+4275 0 obj <<
+/D [4264 0 R /XYZ 71.731 642.214 null]
+>> endobj
+4276 0 obj <<
+/D [4264 0 R /XYZ 71.731 627.31 null]
+>> endobj
+4277 0 obj <<
+/D [4264 0 R /XYZ 139.477 614.765 null]
+>> endobj
+4278 0 obj <<
+/D [4264 0 R /XYZ 71.731 611.868 null]
+>> endobj
+4279 0 obj <<
+/D [4264 0 R /XYZ 71.731 598.916 null]
+>> endobj
+4280 0 obj <<
+/D [4264 0 R /XYZ 139.477 586.371 null]
+>> endobj
+4281 0 obj <<
+/D [4264 0 R /XYZ 349.762 586.371 null]
+>> endobj
+4282 0 obj <<
+/D [4264 0 R /XYZ 276.979 573.42 null]
+>> endobj
+4283 0 obj <<
+/D [4264 0 R /XYZ 71.731 557.571 null]
+>> endobj
+4284 0 obj <<
+/D [4264 0 R /XYZ 71.731 546.572 null]
+>> endobj
+4285 0 obj <<
+/D [4264 0 R /XYZ 139.477 532.075 null]
+>> endobj
+4286 0 obj <<
+/D [4264 0 R /XYZ 71.731 529.178 null]
+>> endobj
+4287 0 obj <<
+/D [4264 0 R /XYZ 71.731 516.226 null]
+>> endobj
+4288 0 obj <<
+/D [4264 0 R /XYZ 139.477 503.681 null]
+>> endobj
+4289 0 obj <<
+/D [4264 0 R /XYZ 71.731 500.784 null]
+>> endobj
+4290 0 obj <<
+/D [4264 0 R /XYZ 71.731 487.833 null]
+>> endobj
+4291 0 obj <<
+/D [4264 0 R /XYZ 139.477 475.288 null]
+>> endobj
+4292 0 obj <<
+/D [4264 0 R /XYZ 71.731 472.391 null]
+>> endobj
+4293 0 obj <<
+/D [4264 0 R /XYZ 71.731 460.301 null]
+>> endobj
+4294 0 obj <<
+/D [4264 0 R /XYZ 139.477 446.894 null]
+>> endobj
+4295 0 obj <<
+/D [4264 0 R /XYZ 388.298 446.894 null]
+>> endobj
+4296 0 obj <<
+/D [4264 0 R /XYZ 209.962 433.943 null]
+>> endobj
+4297 0 obj <<
+/D [4264 0 R /XYZ 396.332 433.943 null]
+>> endobj
+4298 0 obj <<
+/D [4264 0 R /XYZ 71.731 431.046 null]
+>> endobj
+4299 0 obj <<
+/D [4264 0 R /XYZ 71.731 418.094 null]
+>> endobj
+4300 0 obj <<
+/D [4264 0 R /XYZ 139.477 405.549 null]
+>> endobj
+4301 0 obj <<
+/D [4264 0 R /XYZ 71.731 402.652 null]
+>> endobj
+4302 0 obj <<
+/D [4264 0 R /XYZ 71.731 390.562 null]
+>> endobj
+4303 0 obj <<
+/D [4264 0 R /XYZ 139.477 377.156 null]
+>> endobj
+4304 0 obj <<
+/D [4264 0 R /XYZ 71.731 374.259 null]
+>> endobj
+4305 0 obj <<
+/D [4264 0 R /XYZ 71.731 361.307 null]
+>> endobj
+4306 0 obj <<
+/D [4264 0 R /XYZ 139.477 348.762 null]
+>> endobj
+4307 0 obj <<
+/D [4264 0 R /XYZ 139.477 335.811 null]
+>> endobj
+4308 0 obj <<
+/D [4264 0 R /XYZ 71.731 333.417 null]
+>> endobj
+4309 0 obj <<
+/D [4264 0 R /XYZ 71.731 319.962 null]
+>> endobj
+4310 0 obj <<
+/D [4264 0 R /XYZ 139.477 307.417 null]
+>> endobj
+4311 0 obj <<
+/D [4264 0 R /XYZ 71.731 304.52 null]
+>> endobj
+4312 0 obj <<
+/D [4264 0 R /XYZ 71.731 291.569 null]
+>> endobj
+4313 0 obj <<
+/D [4264 0 R /XYZ 139.477 279.024 null]
+>> endobj
+4314 0 obj <<
+/D [4264 0 R /XYZ 71.731 265.242 null]
+>> endobj
+4315 0 obj <<
+/D [4264 0 R /XYZ 71.731 250.224 null]
+>> endobj
+4316 0 obj <<
+/D [4264 0 R /XYZ 139.477 237.679 null]
+>> endobj
+4317 0 obj <<
+/D [4264 0 R /XYZ 71.731 234.782 null]
+>> endobj
+4318 0 obj <<
+/D [4264 0 R /XYZ 71.731 221.83 null]
+>> endobj
+4319 0 obj <<
+/D [4264 0 R /XYZ 139.477 209.285 null]
+>> endobj
+3104 0 obj <<
+/D [4264 0 R /XYZ 71.731 193.013 null]
+>> endobj
+4320 0 obj <<
+/D [4264 0 R /XYZ 71.731 180.102 null]
+>> endobj
+278 0 obj <<
+/D [4264 0 R /XYZ 217.286 157.722 null]
+>> endobj
+4321 0 obj <<
+/D [4264 0 R /XYZ 71.731 148.821 null]
+>> endobj
+4322 0 obj <<
+/D [4264 0 R /XYZ 71.731 148.821 null]
+>> endobj
+282 0 obj <<
+/D [4264 0 R /XYZ 162.317 121.426 null]
+>> endobj
+4323 0 obj <<
+/D [4264 0 R /XYZ 215.193 105.605 null]
+>> endobj
+4324 0 obj <<
+/D [4264 0 R /XYZ 71.731 103.538 null]
+>> endobj
+4263 0 obj <<
+/Font << /F32 3079 0 R /F42 3513 0 R /F22 2958 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4327 0 obj <<
+/Length 1440      
+/Filter /FlateDecode
+>>
+stream
+xÚµX[oÛ6\14~ϯУ=T\fI](¡O]Ö\ e\1dº\16hý¶\f\86"Ñ67[R(9\17\14ýï;¼éâXNÛ9\b\10ÑÔá¹ñ;\87\1fE<\f\7fÄc\ 4±\80x      ¦(a\89\97ï.°·\867¿_\10+á[\11\7f óëââò]@½\14¥qà-V\1eM\12\14\86\89Q\18GÞ¢økvµÉê\96˹OY2#È<?\88rÿpùy1'\18Ï|ø5'³ý\83ywõæ£\19ü&Å\9d[x\8d#\f\ eFdþ÷â\8f\8b·\8bι\88\12\ 4~\9c\8a<q\9fR\8f\10\94F\91ò\9f\90\14E\11õX\94 \fq(ÿ¿<\96\88FÙ¼|\17ÂKDX¨¥)JIàù \19\87&ئ\95û¼\9dû1\84\95gå¾ári\7f~U
\ 4Å8õü\14|azžlĺä\85\11ÚVåÚ\8cVÛlݼÖkðP~ha+\9av¹á\99]\s.\9f[\ 2NÝîù\92\97\1cûÅ<nÕÜ3«wͺºùç`¡\99üN»Å\9a\1f,\97\ fz\16\1fQ°/EUÚì}3O\95QQ®ª#Ò¢t^fk\91\e\ 1ÿI¾¿½6\e9Úw¿ÛÊ\18\91\82\7fòÝ\räÓJ³\1eä`\94\85@\8b]c\1cÀN\1d"Ò!)Æ\ 1À\8d\1e\83$E,Na4xuøìÐK(\85\b`0Ðgà;p\8c\84\14Q@­\93Ñ)l\14´T\ 5µ\95y\16\0\1aQ®÷¢Ù\fj\11êoX\8e®\16ÛÇ\9a\9bD\82\ 3q\1a\82'\ 1b\89Ñ­ñ6\15xÄ"\14\1e¯Å\9f
+| o2p'£\9c[U¶säUYò¼ÕHR¿\ 1&6\13ª|̨Z©'\9b\ 1\8eynç\14Ò\9a\13­^WËdì!C8  Ï\17{¯o:v+£7¦\82 ]çtѶ\en\ 6Ús=²\ 5
+­Wr\97,)ySWe!T#RS]"Û\8dhúÔLfÆ´\83ÉÔ\10¨È\94\9c/5½¾éÔX\19å]^ívÐVò¬\aÄpÓm\92\98     Ñà¥\19áhPNS\19p\1dm*\aa\8a\11MÙÙr0Ð7\99\ 3'£ü+ø*ÛomÄ\92ç\1c\8e\ 3\9e\1fl;48º\ 5\8ct\80zÿéjña2x× '\83\8f¡ëâóÕÆ@ß\91à\ 3\ 42NÄ\9cI\15\0\a,²{\1c°PímË\1fZ3ÝÔ<\17*êܼTÑÈ\9d\ 6\f2\12\v\85\12õJIñmaÎ\88\88\f\88P\10¡\88\84à«îEbË]NÆ\1eBÑ&\94X1¤SÍ\8d\8dMµ-\1ac¥+g5ßá.\81z\87£J\1f]\91iÈUÍ-¦\v~'r>Ø@î*>k»!lªªÿ®ø\a\95Î\87GC_ó\ 1\9bùM\9d9Íù\9cA\13å¥\85RV×[¨,\85\15È\95í\9d°í)\8dÆ\1dB\9dÏ\93ø \18\9eéùðÑë;Z\1cê¸w2½s\10\ f\9e\95\0ÌØtQ¬CÞpõÿ_;\ 1\91Â9ÂËüÑLÜCòÈLï\ 3\81­\83\8c±m&@zx+\ 5¿3Í\ 4È\9e¬vfÔo\16ð9à¿v»ð\18j\8a¼0\80¶!/\f£0`ª\17¢(\ e\vP2ÛÜ+D\ 3\87\ 5âÕ­\ eQ øm\87@?\88¡?\18Æû1Ûñ\8eí\8ehO\84ìÑ?¤vOõ\ fSL0
+âØ"ü\9aRf°²Édq?'\0\1aÉ/o*øeQ©\8a\ frfëO÷ç\9aˬCÔ\13æf\rø4BA\90ü?Ê>\få\14i都º\968\1eË¡{\ 2\1f\17\95¾¡t¯\ fX°©Ì\8e\ 3\9b\19µâ\14£\1d\99Ùò¬á/o¦áí\8bZ\10¥\80ËËý²ÈÚìå\rå\eQÿ¤©WN\8d\93\ 3U¥üQ\aÔ½éYûÚËÎ:ü8´\rZ~Èt-«µÌvK!oÏ\96ã»J\14O\fÝKÑò¥äkÕ\våØÖø\8a«\92ðjêÖ\9b\15\ 5 ¯\99°<^5BkV|\97ñ\13\96^òªh\9arß!¦\ e?\ 2L\95\91óÝ\16\aú&\99¡\931\1eÂ)ïÈ °\17\aÇ
+v|WÉGË\1a³rm\99r\7fÑÊ,ù0í|\92\1dw\rl*\v@U\ 3\9bc¯n2\aVDs5ɹcÆ:\19Å8\eã,¨\93~ÍOÄ
+]tòÓ\0ÑÌèl_\ 6:uÓ\1f\ 6\8c\88òlxþöáº;AµoEÉ\ f\1d·_\0i\bl\9a\9düFØ\8b¸O\84\f©ËÇê@\87òäÓÕÛÏoìgÁ÷_\16f\10D\ 4SSOÃï\8ba\90 `ó\96M\10\1dð©\87ÿ\ 1ßR7äendstream
+endobj
+4326 0 obj <<
+/Type /Page
+/Contents 4327 0 R
+/Resources 4325 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4072 0 R
+>> endobj
+4328 0 obj <<
+/D [4326 0 R /XYZ 71.731 802.878 null]
+>> endobj
+286 0 obj <<
+/D [4326 0 R /XYZ 174.677 758.046 null]
+>> endobj
+4329 0 obj <<
+/D [4326 0 R /XYZ 71.731 753.091 null]
+>> endobj
+4330 0 obj <<
+/D [4326 0 R /XYZ 71.731 660.716 null]
+>> endobj
+290 0 obj <<
+/D [4326 0 R /XYZ 176.446 636.217 null]
+>> endobj
+4331 0 obj <<
+/D [4326 0 R /XYZ 71.731 636.074 null]
+>> endobj
+4332 0 obj <<
+/D [4326 0 R /XYZ 71.731 631.292 null]
+>> endobj
+4333 0 obj <<
+/D [4326 0 R /XYZ 71.731 616.417 null]
+>> endobj
+4334 0 obj <<
+/D [4326 0 R /XYZ 139.477 603.872 null]
+>> endobj
+4335 0 obj <<
+/D [4326 0 R /XYZ 71.731 600.974 null]
+>> endobj
+4336 0 obj <<
+/D [4326 0 R /XYZ 71.731 588.023 null]
+>> endobj
+4337 0 obj <<
+/D [4326 0 R /XYZ 139.477 575.478 null]
+>> endobj
+4338 0 obj <<
+/D [4326 0 R /XYZ 71.731 572.581 null]
+>> endobj
+4339 0 obj <<
+/D [4326 0 R /XYZ 71.731 559.629 null]
+>> endobj
+4340 0 obj <<
+/D [4326 0 R /XYZ 139.477 547.084 null]
+>> endobj
+4341 0 obj <<
+/D [4326 0 R /XYZ 71.731 544.187 null]
+>> endobj
+4342 0 obj <<
+/D [4326 0 R /XYZ 71.731 531.236 null]
+>> endobj
+4343 0 obj <<
+/D [4326 0 R /XYZ 139.477 518.691 null]
+>> endobj
+4344 0 obj <<
+/D [4326 0 R /XYZ 71.731 515.794 null]
+>> endobj
+4345 0 obj <<
+/D [4326 0 R /XYZ 71.731 502.842 null]
+>> endobj
+4346 0 obj <<
+/D [4326 0 R /XYZ 139.477 490.297 null]
+>> endobj
+4347 0 obj <<
+/D [4326 0 R /XYZ 71.731 487.4 null]
+>> endobj
+4348 0 obj <<
+/D [4326 0 R /XYZ 71.731 476.402 null]
+>> endobj
+4349 0 obj <<
+/D [4326 0 R /XYZ 139.477 461.904 null]
+>> endobj
+4350 0 obj <<
+/D [4326 0 R /XYZ 378.724 461.904 null]
+>> endobj
+4351 0 obj <<
+/D [4326 0 R /XYZ 71.731 446.055 null]
+>> endobj
+4352 0 obj <<
+/D [4326 0 R /XYZ 71.731 433.104 null]
+>> endobj
+4353 0 obj <<
+/D [4326 0 R /XYZ 139.477 420.559 null]
+>> endobj
+3105 0 obj <<
+/D [4326 0 R /XYZ 71.731 404.287 null]
+>> endobj
+4354 0 obj <<
+/D [4326 0 R /XYZ 71.731 391.375 null]
+>> endobj
+294 0 obj <<
+/D [4326 0 R /XYZ 243.436 368.995 null]
+>> endobj
+4355 0 obj <<
+/D [4326 0 R /XYZ 71.731 358.416 null]
+>> endobj
+4356 0 obj <<
+/D [4326 0 R /XYZ 71.731 358.416 null]
+>> endobj
+298 0 obj <<
+/D [4326 0 R /XYZ 162.317 332.699 null]
+>> endobj
+4357 0 obj <<
+/D [4326 0 R /XYZ 227.148 316.879 null]
+>> endobj
+4358 0 obj <<
+/D [4326 0 R /XYZ 71.731 314.812 null]
+>> endobj
+302 0 obj <<
+/D [4326 0 R /XYZ 174.677 291.541 null]
+>> endobj
+4359 0 obj <<
+/D [4326 0 R /XYZ 71.731 286.585 null]
+>> endobj
+4360 0 obj <<
+/D [4326 0 R /XYZ 71.731 175.556 null]
+>> endobj
+306 0 obj <<
+/D [4326 0 R /XYZ 176.446 151.058 null]
+>> endobj
+4361 0 obj <<
+/D [4326 0 R /XYZ 71.731 150.914 null]
+>> endobj
+4362 0 obj <<
+/D [4326 0 R /XYZ 71.731 146.132 null]
+>> endobj
+4363 0 obj <<
+/D [4326 0 R /XYZ 71.731 131.257 null]
+>> endobj
+4364 0 obj <<
+/D [4326 0 R /XYZ 139.477 118.712 null]
+>> endobj
+4365 0 obj <<
+/D [4326 0 R /XYZ 71.731 115.815 null]
+>> endobj
+4366 0 obj <<
+/D [4326 0 R /XYZ 71.731 103.725 null]
+>> endobj
+4367 0 obj <<
+/D [4326 0 R /XYZ 139.477 90.318 null]
+>> endobj
+4368 0 obj <<
+/D [4326 0 R /XYZ 71.731 87.421 null]
+>> endobj
+4369 0 obj <<
+/D [4326 0 R /XYZ 71.731 76.423 null]
+>> endobj
+4370 0 obj <<
+/D [4326 0 R /XYZ 139.477 61.925 null]
+>> endobj
+4325 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4373 0 obj <<
+/Length 1743      
+/Filter /FlateDecode
+>>
+stream
+xÚÅY[oÛ6\14~ϯðÓ`\17\8b(J(0 íÚ¢C/[\9a·u\10\18\99¶ÕØ\92+QMºaÿ}\87")˱\95Ö\81ÝÂ\ fæåè\9cï\1c\9d\eE2Àð#\ 3A\90`d\10a\8a"\11\rÒÕ\19\1eÌaçÕ\19q\14\13G2éÐ<»:;\7fÉè FqÈ\ 6\ 1\8d"\14\ 4!ð        Q\10òÁÕô¯áó\85\kU\8e&TDC\82ìÿ\9b,¯ïÎ/¯F\ 4ãá\ 4f#2¬ïìÞó\8bwvð[\99\ f\1c\ 3\19ìÁ\88\8cþ¾úýìÅU\v\8eS\82\0ÇCð\1dÉ\ e|*6ð       \89\11çt x\840¨aàgy¦\93Åm2\95\17ÛÒ\a\f\ 5,Ø'\97"\11Æ0êlÝÿo!\12J\ 1¢1õ\86ß.Æ\80#\1añV¦Á\98ÊåRMG\13\1e±¡.ì¿Á\9dÉeö\8f2s:ü%\95ùT}ÉR\95hKQé²Nu]ª\11\89\86c»¶\92Y¾üjô<\7fÉIçÅr\8c\ 4 \ 1§\91Wª*\91Ó©%ë\82\v\ 1qTã]6\11â`z»\9d\97    ÀNÒE¶®v99oëå4a"FX\ 4Æj(\86\1dÇ2¢\9c\8a\11Ca\14ö3å\88³x\ 3¯ú$Á=q\1f·\18|\9dx\88`Ü=VÃ\88\90ÀQÌ\96\87\v£(äÞ&\1f1¦j9mÈ\ 6\13\1a\18\ 3\15\19\12\11ݸc:\12CÀô°O\82\9fã(>\9eOnøíú$\ f\90À¼\95ÙõIÂi´å\8c°\10\ f\95ltpÛÆ7½NÚ­Ý÷Îæ1ã\9e\90)öy(#\18bV8C¦\r«¯kµkp\ eÆ\8cã\ 3=«áw-+eü¾ÜãY\ 1\bçýL\ 5\12\9cylË"½Ùã\b\10׸ëN\13\ e¹Ñ\99ÅNªµJ3ã#©\9d\97j\9eU\90\11åCdÖÈðµ¶{Yåiªu\91WÙõRÙ\85&A\18fJ×këh\84\86(\ 6\9bX\8d­£m½\93ɯ»*\85\ 4\85m07!\ 2è\8a}\81\12Fàp^ûY\9d§:\ 3D£     Ãt8+J;È\8b|RiÐ[\96S»Òªn&æ]ºGL)h^m3+ôB9\16z!s§\10ÃP\87ÈÖ+üH)Ë\9aô\0£`ìÊ
+,º07«v±hj\8eèn®Í®¯<À\16t£Ü\ 5\ 4fqýéÁ \fY\80"Àu¬ ìðÛS(L2\ e[\99Ý 4ZvcÒÌÛ\904\93_V\10fÕÜè£íÊýx4k½Õ\ 2\92\1ae>Ñ\1a&\ f\85\ eF\11\13Û  \10Y33\88   \11\8a-;¯Ëb^ÊU\92\95\9f{­lº\8f :\9e\957üöZ\99@èx\9a\ eDc#S\87!@Ëz­ít®rUJ\13\0\0w¿5&\95¥²+ÅÌþ\83_\9bA0¼.\9a\90h\98¹=0\13\93skË Û\7f  \860öÆüãòý«Ë\8b·o/\9e½y\91¼¾üso cmdf®ì0\ 1É,¦[Ù`\riDåÎ\15f\85kÊÚ|ä}Ê4\18à8©:· û\82å¶Ì´J|úê{\8f\88`v´÷Øá×\e-\9eÆ \\16·V­¥ú¢\96vØ ·Ã\16¾\9d\81ÞE­³\¹â\ru=\ e¶´.\95\9c~[i\16B-=^ÝîðëWÚÑô)m\80ïÕ¹¨Ak¯3ð¦\ 3"\10%¼©£\ 2#\ eà     '\88\87Ö¢6\89ÀÃ\91è\96\fÈ1íó\ 1b¦ó\86^R È(\0Øhl{ñwr¥v\9d\1e\83¶¼¡í\8a\bMñÜ#¢«¾³\11öõAXµ ò¹A\91ë²\80\94éôm+Rãü z§\1e7\85cíb»ÚèC \86¬=ÚWB9´u6U|ø\9a\ 3¸¬jµ\12\88@ëÑ\80C1\81Þ\ f\8e-¦³xXµféßÆñ"\14Â\9b\9cÄ J¸ÂäöMÝ|²y:\ 1ífÙ¼)jíþ\96\bh\0\Gf¦OÌÄP?mäàoɸ\965x»Ôê0       c;n9\1a\ e÷×\9a\ eêþbõév¼\99\98ô\vïg\99¬õ}¦\11?@\11ß\95$+YÝ<J\99\1aú¯yn\92dÃoQ\94þ\99bªÆ;»\ 6¹§ð2¿\13«ºÓ
+\8eyGú,òy/T¿I\ eE¹RU%ç\8að\1f\ 5ÓXtþ(\83¦K%KÓשTW'\8b\15\e\8a¦§©\1ee\8d\8eKy\1eß)\19
+{ÒÔ¥Çd\ 3/½C¶j\9bÆ\86
\a\82±­ÁÉÐ\8c·¸\18¿\909Pµ$0>$5@°%î\91\93\ 2í\80$\87\82,Õªhº­ÏµªôÏ}ÃéB¥7\89¾K ©ê\93\85Ó­¼Q5<}÷s\95\9deK\9d.\92òóÏ\85¡r      \87\7f\17RµmPNfúiVý@i\95Òɵ\86¦´:n]\ 6\9exܳKÌ.9\0¤ÔZ\82\eè"ñÚ\9dÄ\16¥\82R\ 5§ì\93
+\81°-õ©E\14ëÓJ\80\12\99, §\83¾~[FK\f\14{¢ð\bbe\9aªµ>¢ÔÉN¿ÿßÓý\87\ fw\9c\b\11      íÙã­Z]\9bo\87;ç"s \12HøË\ 5÷\1105q\8cé¼ïàJp\80ht¼K\90\ e¿Þ\83«§iî\99ÌW\14\7fu´uRóÈ]6ê=\9f·'\96ÞoêpÌ<â\17uÏ­W=KÑ\1cý\94öº¬Vu\9e¥í'¤h¸\96æc\13\19*íÞf\17º»G¡\ 1\8a±xð^oCâ¯õ\ 4\8aEç.Æ\11\18\9f¿¸¼pWy¯?\Ù\ 1ã\ 4SëMÝ;Á\80E\88·÷$$ê¹»ÛEø?\a\96gàendstream
+endobj
+4372 0 obj <<
+/Type /Page
+/Contents 4373 0 R
+/Resources 4371 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4374 0 obj <<
+/D [4372 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4375 0 obj <<
+/D [4372 0 R /XYZ 71.731 814.833 null]
+>> endobj
+4376 0 obj <<
+/D [4372 0 R /XYZ 71.731 768.009 null]
+>> endobj
+4377 0 obj <<
+/D [4372 0 R /XYZ 71.731 756.841 null]
+>> endobj
+4378 0 obj <<
+/D [4372 0 R /XYZ 139.477 743.434 null]
+>> endobj
+4379 0 obj <<
+/D [4372 0 R /XYZ 396.001 743.434 null]
+>> endobj
+4380 0 obj <<
+/D [4372 0 R /XYZ 446.82 743.434 null]
+>> endobj
+4381 0 obj <<
+/D [4372 0 R /XYZ 139.477 730.483 null]
+>> endobj
+4382 0 obj <<
+/D [4372 0 R /XYZ 228.702 730.483 null]
+>> endobj
+4383 0 obj <<
+/D [4372 0 R /XYZ 347.227 730.483 null]
+>> endobj
+4384 0 obj <<
+/D [4372 0 R /XYZ 71.731 727.785 null]
+>> endobj
+4385 0 obj <<
+/D [4372 0 R /XYZ 71.731 714.634 null]
+>> endobj
+4386 0 obj <<
+/D [4372 0 R /XYZ 139.477 702.089 null]
+>> endobj
+4387 0 obj <<
+/D [4372 0 R /XYZ 464.752 702.089 null]
+>> endobj
+4388 0 obj <<
+/D [4372 0 R /XYZ 139.477 689.138 null]
+>> endobj
+4389 0 obj <<
+/D [4372 0 R /XYZ 231.275 689.138 null]
+>> endobj
+4390 0 obj <<
+/D [4372 0 R /XYZ 201.155 676.186 null]
+>> endobj
+4391 0 obj <<
+/D [4372 0 R /XYZ 139.477 663.235 null]
+>> endobj
+4392 0 obj <<
+/D [4372 0 R /XYZ 183.601 663.235 null]
+>> endobj
+4393 0 obj <<
+/D [4372 0 R /XYZ 241.552 663.235 null]
+>> endobj
+4394 0 obj <<
+/D [4372 0 R /XYZ 71.731 660.338 null]
+>> endobj
+4395 0 obj <<
+/D [4372 0 R /XYZ 71.731 647.386 null]
+>> endobj
+4396 0 obj <<
+/D [4372 0 R /XYZ 139.477 634.841 null]
+>> endobj
+4397 0 obj <<
+/D [4372 0 R /XYZ 374.482 634.841 null]
+>> endobj
+4398 0 obj <<
+/D [4372 0 R /XYZ 71.731 631.944 null]
+>> endobj
+4399 0 obj <<
+/D [4372 0 R /XYZ 71.731 618.993 null]
+>> endobj
+4400 0 obj <<
+/D [4372 0 R /XYZ 139.477 606.448 null]
+>> endobj
+4401 0 obj <<
+/D [4372 0 R /XYZ 415.206 606.448 null]
+>> endobj
+4402 0 obj <<
+/D [4372 0 R /XYZ 71.731 590.599 null]
+>> endobj
+4403 0 obj <<
+/D [4372 0 R /XYZ 71.731 577.648 null]
+>> endobj
+4404 0 obj <<
+/D [4372 0 R /XYZ 139.477 565.103 null]
+>> endobj
+4405 0 obj <<
+/D [4372 0 R /XYZ 71.731 562.206 null]
+>> endobj
+4406 0 obj <<
+/D [4372 0 R /XYZ 71.731 549.254 null]
+>> endobj
+4407 0 obj <<
+/D [4372 0 R /XYZ 139.477 536.709 null]
+>> endobj
+3106 0 obj <<
+/D [4372 0 R /XYZ 71.731 520.437 null]
+>> endobj
+4408 0 obj <<
+/D [4372 0 R /XYZ 71.731 507.526 null]
+>> endobj
+310 0 obj <<
+/D [4372 0 R /XYZ 255.556 485.146 null]
+>> endobj
+4409 0 obj <<
+/D [4372 0 R /XYZ 71.731 474.567 null]
+>> endobj
+4410 0 obj <<
+/D [4372 0 R /XYZ 71.731 474.567 null]
+>> endobj
+314 0 obj <<
+/D [4372 0 R /XYZ 162.317 448.85 null]
+>> endobj
+4411 0 obj <<
+/D [4372 0 R /XYZ 239.103 433.029 null]
+>> endobj
+4412 0 obj <<
+/D [4372 0 R /XYZ 71.731 430.962 null]
+>> endobj
+318 0 obj <<
+/D [4372 0 R /XYZ 174.677 407.691 null]
+>> endobj
+4413 0 obj <<
+/D [4372 0 R /XYZ 71.731 402.736 null]
+>> endobj
+4414 0 obj <<
+/D [4372 0 R /XYZ 71.731 161.128 null]
+>> endobj
+322 0 obj <<
+/D [4372 0 R /XYZ 176.446 136.63 null]
+>> endobj
+4415 0 obj <<
+/D [4372 0 R /XYZ 71.731 136.486 null]
+>> endobj
+4416 0 obj <<
+/D [4372 0 R /XYZ 71.731 131.704 null]
+>> endobj
+4417 0 obj <<
+/D [4372 0 R /XYZ 71.731 116.829 null]
+>> endobj
+4418 0 obj <<
+/D [4372 0 R /XYZ 139.477 104.284 null]
+>> endobj
+4419 0 obj <<
+/D [4372 0 R /XYZ 71.731 101.387 null]
+>> endobj
+4420 0 obj <<
+/D [4372 0 R /XYZ 71.731 89.297 null]
+>> endobj
+4421 0 obj <<
+/D [4372 0 R /XYZ 139.477 75.89 null]
+>> endobj
+4371 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F51 3667 0 R /F42 3513 0 R /F22 2958 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4425 0 obj <<
+/Length 1575      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YÛnã6\10}ÏWøÑ\ 1\1a®H](=f³I³EÑ.²\ 2Z -\fÙ¢m5¶¤\90T6û÷\1d\8a¤L9¦½\ 5\84\0\11e\rGs\ eçF
\ 2øÃ3\8a\11\rñ,\r\bJi:[í¯\82Ù\ 6\9eü|\85\8dÄ\8d\11¹qd>æW\1f\1eB2ËP\96\84³|=#i\8a¢(\ 1=  \8a\92x\96\97\7fÍï¶E+\19¿¾!4\9dc¤¯¿Vu÷öá)¿ÆA0¿\81»k<ïÞô³»Ûßôà\13¯^íÄ¿\838\01x\ 6#|ýOþËÕ}>\18\17\13\8cÀ\8e\e\91\13z0\1fã\fÅ1\99Ñ8E\ 1ÀPæ\vYÔeÁËž\10ÏÇï\1d&D!\8aÂèÔ\8b     ¢I\ 6#çÑñu°\11\13\ 26*®\ fúÞ\e\19\11DÀ8+Ó\eÉd×j¢\9aµ¾öæö£uc8Ü3!\8a\r0Í,§\ 1ÙÁÒTõF\ 1\9bÝÀë\93,\ 2;BDSÜkfo\92Õ%»\0\1fÇÀ\17\9e\ eþA\9f\1f¾\91ñÀ·v{È \86\8c\1fb\82ô/1\13p|\96\8a$MP\12Ñɨpôy©°2\86\8a\96\92*%1¡\aW\0G\18\bh\96ÿ²\95\99\89c¯7¬®é|Ç
+¾ÐòÂË\ 2\ 4\10\89§\8b\aG\9f\9f\ 5#ãÚ)4"\88aÉÆd\14»\9d\13\14@Å)&8\13U©|BóWë«R¾­Z¯£¬\9aZùÓfQñ\17?C$Ci2\1dA\83:??ZDY(»\9a\891\98þf\vyîÛ5\ 6v8³\98!*¸Jέá¤d;\95\95¿{}¤ålÁYQ.,\ f^
+\ 2\fEbÂP9èó\93`d\8c¡-\0\15nr<á\ 4ë\ 6àó\13B\9c­X+«¦öz\82¢â\e¯$»ÈELC\14Ðp2.\1c}^.¬Ì\14\H^Ôb_      q\9a\ e\9b¦k¨#ÂOB\14¡\84\91pÐç'ÁÈ(ûªº\92Õ\90)Nà\ 3ð\17 r¶o¤òÿ\97\8e   é\ 5\8a\13D&\8c~G\9f\1f¨\91q3TwyÅUj¬M\15\85\8a"\8eZ\8a§üi¬à\åØ2õÿy!ß\16*#ûØ\89R\8aÒ\8c\8e£ÏË\8e\9592Õ_?¬Ã\ 3=½C覣ÞTµ\9f\ 3\9dZ\9f\ 2\ 5^ôq\86¢lº pôùÑ\e\99±\91\1aSþ§¾¶¼YÁ\1a\9fë\15u\17ÕÓ·à/^\80!F8\88§\ 3xÐç\ahd\94\95M\9f³\vSþyÓIµfc·\ 6°m±Q¾/\87ŵ+\ f\136ÍÐ\14°rccÈ6\91æV6úúø\87¿¹®\8båîP\1c:^Ørr\928عP<a\\1côù\8932\akO´\rÇöë\84\0ä5¥?\18ÊJü\1fð!\8dP\88ÓÉÀ;ú¼à­\8c\8f¡\87ÝÅ9èУ/\96\92³\8d·;\f£\18edº\18qôùÑ\1a\99Ó\ 5bYAÆ\93C糩\84ÚÓCòó6?\85\94\85Î\ 5²Y8=óI¼\98¢8\9cn\ 3éèóã52#[ÙQðÊíÑ\92CrüÉ\14\ 5Øt\ 2\ 1­\18sbn\v[4Û\ 6\92ær÷ý]%©jH7ûÞgÄ\99~\ 2¶1\82\8f¤\19ÂátÑáèóògez\7f\81í\94Ýk/\19à:\15(Bòn%;~8\80PÝÒ«ÍÄÕZ¡ûð\109çI\98Â\1aAY\ eôIÒãç/\8bÛ<¿½{¼ÿ¤\85]ÃÒ\0E45²\95\18\90\v\8fi2vQX\r./r\9bÀÄhº½¬£ÏÏ­\91\19\8c<µ[\eõl}yVñx¶B\vÙ´\17ñ\86`h<],:úüx\8d\8cµñÇàêæëÌ\91\r\17[\88Ä\1d¤*\1fÚ DY<Ý&ÔÑçGkdô\9eCm°\87ݵ`üµZ±qoâ[M\ 5¯X©M¨\ f\1d¦1\8a\93é|×ÑçEgeÞ÷ZëB\18\98`¹I\93Ú|\rWu\fN7\ 6µ§\85ÜX\rewhÏ\96»¦oÏ\87.lÝqÈÔÜ=³\80þ\15º7aÒ\ 4P\ 1µ\\1dé®g74@1\8e¡\ 1Jàª=\ 5\1d©³é\94Î?6\ 5/õðk׶\r\97úæ¡«WC¶\1ec\8f`÷Ðó\13÷W¥1ï+G\8aÁ6u¸mf\92¸/\1fðó·mÕ»·º\væbÛt»R?Y\9a\89վݩ\90Þ3\0d\9ei
+`À
+w¶6Ó
+-{\0ؾI\1fæÀ dbÅ«¥\16\vÔy\96ò¬@­/ø£6»/xaJæ5{\93z$Ôf\10Ìij¤\7fÈ­Ìz`¤¿í_¤\ 6-gª}xSo
+\95Aßõï½au±gª\8c\1e\934»`ÎÀn\18\ 4\91Éì\92\ 1\8a¾[\85\18V\11\1a\18-¶-LU\rSðG\92\8dP.\19«mÀí\0\9e­]\83\87iôýy\97*W\8a·Þ\95Ñq¤\99¯"$\ 2\véÙï&\a\11ûÙ\84¢\8c*»Ç:\94}¿ßÝ?Ý\9aO%\9f¿æz\0   2 \1aµûÍ%
+Spcl`ãÌómä½\85ÿ\ 1¯z/Äendstream
+endobj
+4424 0 obj <<
+/Type /Page
+/Contents 4425 0 R
+/Resources 4423 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4426 0 obj <<
+/D [4424 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4427 0 obj <<
+/D [4424 0 R /XYZ 71.731 768.009 null]
+>> endobj
+4428 0 obj <<
+/D [4424 0 R /XYZ 71.731 756.841 null]
+>> endobj
+4429 0 obj <<
+/D [4424 0 R /XYZ 139.477 743.434 null]
+>> endobj
+4430 0 obj <<
+/D [4424 0 R /XYZ 71.731 728.447 null]
+>> endobj
+4431 0 obj <<
+/D [4424 0 R /XYZ 139.477 715.041 null]
+>> endobj
+4432 0 obj <<
+/D [4424 0 R /XYZ 71.731 712.144 null]
+>> endobj
+4433 0 obj <<
+/D [4424 0 R /XYZ 71.731 699.192 null]
+>> endobj
+4434 0 obj <<
+/D [4424 0 R /XYZ 139.477 686.647 null]
+>> endobj
+4435 0 obj <<
+/D [4424 0 R /XYZ 71.731 683.75 null]
+>> endobj
+4436 0 obj <<
+/D [4424 0 R /XYZ 71.731 670.799 null]
+>> endobj
+4437 0 obj <<
+/D [4424 0 R /XYZ 139.477 658.254 null]
+>> endobj
+4438 0 obj <<
+/D [4424 0 R /XYZ 71.731 655.356 null]
+>> endobj
+4439 0 obj <<
+/D [4424 0 R /XYZ 71.731 642.405 null]
+>> endobj
+4440 0 obj <<
+/D [4424 0 R /XYZ 139.477 629.86 null]
+>> endobj
+4441 0 obj <<
+/D [4424 0 R /XYZ 71.731 626.963 null]
+>> endobj
+4442 0 obj <<
+/D [4424 0 R /XYZ 71.731 614.012 null]
+>> endobj
+4443 0 obj <<
+/D [4424 0 R /XYZ 139.477 601.467 null]
+>> endobj
+4444 0 obj <<
+/D [4424 0 R /XYZ 71.731 598.569 null]
+>> endobj
+4445 0 obj <<
+/D [4424 0 R /XYZ 71.731 585.618 null]
+>> endobj
+4446 0 obj <<
+/D [4424 0 R /XYZ 139.477 573.073 null]
+>> endobj
+4447 0 obj <<
+/D [4424 0 R /XYZ 71.731 570.176 null]
+>> endobj
+4448 0 obj <<
+/D [4424 0 R /XYZ 71.731 557.224 null]
+>> endobj
+4449 0 obj <<
+/D [4424 0 R /XYZ 139.477 544.679 null]
+>> endobj
+4450 0 obj <<
+/D [4424 0 R /XYZ 71.731 541.782 null]
+>> endobj
+4451 0 obj <<
+/D [4424 0 R /XYZ 71.731 528.831 null]
+>> endobj
+4452 0 obj <<
+/D [4424 0 R /XYZ 139.477 516.286 null]
+>> endobj
+4453 0 obj <<
+/D [4424 0 R /XYZ 71.731 513.389 null]
+>> endobj
+4454 0 obj <<
+/D [4424 0 R /XYZ 71.731 501.299 null]
+>> endobj
+4455 0 obj <<
+/D [4424 0 R /XYZ 139.477 487.892 null]
+>> endobj
+4456 0 obj <<
+/D [4424 0 R /XYZ 71.731 484.995 null]
+>> endobj
+4457 0 obj <<
+/D [4424 0 R /XYZ 71.731 472.044 null]
+>> endobj
+4458 0 obj <<
+/D [4424 0 R /XYZ 139.477 459.499 null]
+>> endobj
+4459 0 obj <<
+/D [4424 0 R /XYZ 71.731 456.602 null]
+>> endobj
+4460 0 obj <<
+/D [4424 0 R /XYZ 71.731 443.65 null]
+>> endobj
+4461 0 obj <<
+/D [4424 0 R /XYZ 139.477 431.105 null]
+>> endobj
+4462 0 obj <<
+/D [4424 0 R /XYZ 71.731 428.208 null]
+>> endobj
+4463 0 obj <<
+/D [4424 0 R /XYZ 71.731 415.257 null]
+>> endobj
+4464 0 obj <<
+/D [4424 0 R /XYZ 139.477 402.712 null]
+>> endobj
+4465 0 obj <<
+/D [4424 0 R /XYZ 71.731 399.815 null]
+>> endobj
+4466 0 obj <<
+/D [4424 0 R /XYZ 71.731 386.863 null]
+>> endobj
+4467 0 obj <<
+/D [4424 0 R /XYZ 139.477 374.318 null]
+>> endobj
+4468 0 obj <<
+/D [4424 0 R /XYZ 71.731 371.421 null]
+>> endobj
+4469 0 obj <<
+/D [4424 0 R /XYZ 71.731 358.47 null]
+>> endobj
+4470 0 obj <<
+/D [4424 0 R /XYZ 139.477 345.925 null]
+>> endobj
+4471 0 obj <<
+/D [4424 0 R /XYZ 71.731 343.028 null]
+>> endobj
+4472 0 obj <<
+/D [4424 0 R /XYZ 71.731 330.076 null]
+>> endobj
+4473 0 obj <<
+/D [4424 0 R /XYZ 139.477 317.531 null]
+>> endobj
+4474 0 obj <<
+/D [4424 0 R /XYZ 71.731 314.634 null]
+>> endobj
+4475 0 obj <<
+/D [4424 0 R /XYZ 71.731 301.683 null]
+>> endobj
+4476 0 obj <<
+/D [4424 0 R /XYZ 139.477 289.138 null]
+>> endobj
+4477 0 obj <<
+/D [4424 0 R /XYZ 319.838 289.138 null]
+>> endobj
+4478 0 obj <<
+/D [4424 0 R /XYZ 71.731 286.241 null]
+>> endobj
+4479 0 obj <<
+/D [4424 0 R /XYZ 71.731 273.289 null]
+>> endobj
+4480 0 obj <<
+/D [4424 0 R /XYZ 139.477 260.744 null]
+>> endobj
+4481 0 obj <<
+/D [4424 0 R /XYZ 71.731 257.847 null]
+>> endobj
+4482 0 obj <<
+/D [4424 0 R /XYZ 71.731 244.896 null]
+>> endobj
+4483 0 obj <<
+/D [4424 0 R /XYZ 139.477 232.351 null]
+>> endobj
+4484 0 obj <<
+/D [4424 0 R /XYZ 71.731 229.454 null]
+>> endobj
+4485 0 obj <<
+/D [4424 0 R /XYZ 71.731 216.502 null]
+>> endobj
+4486 0 obj <<
+/D [4424 0 R /XYZ 139.477 203.957 null]
+>> endobj
+4487 0 obj <<
+/D [4424 0 R /XYZ 71.731 201.06 null]
+>> endobj
+4488 0 obj <<
+/D [4424 0 R /XYZ 71.731 188.109 null]
+>> endobj
+4489 0 obj <<
+/D [4424 0 R /XYZ 139.477 175.564 null]
+>> endobj
+3107 0 obj <<
+/D [4424 0 R /XYZ 71.731 159.292 null]
+>> endobj
+326 0 obj <<
+/D [4424 0 R /XYZ 302.487 129.052 null]
+>> endobj
+4490 0 obj <<
+/D [4424 0 R /XYZ 71.731 123.106 null]
+>> endobj
+4491 0 obj <<
+/D [4424 0 R /XYZ 453.456 100.28 null]
+>> endobj
+3108 0 obj <<
+/D [4424 0 R /XYZ 71.731 85.261 null]
+>> endobj
+4423 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4494 0 obj <<
+/Length 1493      
+/Filter /FlateDecode
+>>
+stream
+xÚå\18MoÛ6ô\9e_a`\87ÉCÍ\90\94(JÛ)kÓ"Ã\90\0©ÑË:\ 4\9aDÛêl+\93ä$ݯß{|¤>,7é\80m\97Á\a\91OïûÛ\123\ e?1Ó\82éPÌ\12.Y¢\93Y¾;ã³5¼yw&\1cÆ¡,\ 68?.ÏÎß\86r\96²4\ egËÕL&        \8b¢\18øÄ,\8aÕlYü\12¼Þd÷­©ç\v©\93@0zþ\î\ fOç·Ë¹à<XÀm.\82Ã\13½{}qM\877uùà   ?rÅ\ 1\rÞÁIÌ\7f]þtv¹ì\94SR0Ðã9õ\1dÊD})gB3)\14êïlÔJ1\95j«~kv÷Û¬5wµùã`\9aö®¬P:\11F,\ 4k\810Ò,\91 %\8c\99LcKx\9dí\faF\ 3\ fñÙB(\8bû<sÝ\93\b\11\83\98\10H\91ä£\94\9a\R\9bÆÔ\ f\86.@h\9f\95ó×Îìªú³C\ 4çfûµÃ\y\94<ÛÓá·*«\8bÞ(ÁRe½±ð\92\17R±0L¬ü÷\9f÷Õ}S6\9di\9a      \1dyÓbFA/÷-!(Þ#X?'Î\8e/\9a>d\99Ä\8c'©·\1cR iëCÞÎ\17\rè_\98\8727w\ eð\9d\13)z\ 6iÄâÔ\8b$\82©\14 ÉÊ\93^\8aøá\94\8cX$À\19\84H-òE½>ì̾m:É£@kȦèHô0m\81\rSJÎTÊA\17}*o%Ó1:`ðêøÙ¥¸\90\12R\1cs½çG9>̦\bX\86½LÔî¾\82xa¥\85R\am\85ϸwï9å\87}ù¸)ó¹\ e6\84\925¿7\ 4·I\85\a\88¢H\ 2F\97·PÞA Ùg¶ÅÔC\12\8aEÇÒù½¬î²¢¨§é\1f)\16)í°ªÕ\94\ fÄHA\8c¦1\1er\81 ¥ÒǸtZ\1f\1aS\90\80\80\ 4b\v:¥ \r|  O*Ò]Õ´¾b\1aÓбuõV\98\8f\9c˽«-@\84\1d:(K¸\e÷º¶UxªÐP;\ 59\ 6ÒSJ­7¦Éëò¾-«ýÔ\1aê"X\9a\88ºDþa\12\ 5«Ã>ï      \86m'\ eY¨Ò\97JoÜu4\vÓtè1\90à<\ 6'\9b&IØw!\vô\9a\94ÕÂu !\95M\a\0\88äsu¨       ²\81ÄZ\90çEÂ\99VÉÈó\8f\98KY\8dÞ\8bS\94\8dÎ\8f\ 1D\80Â\14e\ ev\14\ 4íZ\1e¼ª]¿Cä\86@(kÌ0¯öm]m ­6ë²\81"pØ #Á\1fËíÖ3Àt~pÄ6\ 1\90}aSÛ\86¤×Ü9\ 2\9aTU¸\139L\90àMÈg\ 2Pɹ¼3\0Ï\99\83=\9aí\96Mã)RÅx\17Ы\9b»Û\8bëw\97Ó(*Áb>J{ÔÄ+×GÉ^\9dÓH©¬%àÚPw\83ä\8cb\16Ǿ6¤eé¢_¼\ 2ä(\rî·\ 6J\84ÎYñéÐ\80\9d­»æyU\17å~MW\97\ 3ÑQ\\ï\0ðåS\ 6Yj¾§Û7}\9dáõê\ 6\18;\9b-\80?Á"q"\ eÝ°+\13©üà´\1d¬¼oÆ\13ó\9b\ 2\eÕ°\9a;·Ú\e\7f\92üh\826\9f2\10ËOq-ýlÍ\1al\80¹[mÐ@¿Þì05¬ÁÓ\8eÀG½àÖ´\87\1a\19&:ø0×Q\90m\ f櫺\82U×w\ 5·5 /§å\9fhríW\a\87Ñ\1còÜ4½w¦É\97\80\83Sá²jqy}óæòÃ\89Æ\r³WøµÅ3_eåöP\9bÓ\ 3VC²FÎrÚ6Þ¢\83Êí\8bÆ6u~îÛ\9aõiÞK趻\85ßÒ *T\1c\1e÷B\9b»ÿÖzwÄü+Ö»UmÌhÑ+Æ\9b^¿áég\ 6Ë\7f³Á\8d­û\1fnp"\11\96õ?µÁ\rø\9dÜà \17w2G\eÜp7\99lp\98\ 6G©eC×t©uÒm\10\81èï/'r°\9chùür"dôRV\1d/'2\11ù\ 6\12Ür\ 2';kQ¦­!<õ5\84·éz\ 2À«==s\1aapÂ% [N"®F£o°\ eèÐþÇ\1a\94i\bÝÝ®\19V\98\83ô\12_\11¤\80e9Ø\7fÛÒ\rÆ
+\f[:S\b\ 4 l    ²1Ý\98DðpFIë      K¾éd{C§³Ñ\8dû(ÕnÜGi\12¬Ñ\ e¨\ 6{q!Àé\8eX~ºãÙN÷Ö\9dûÑ\8eT4ÚñÅ\89Ñ\8eà~´ã­\1fíC\15åx±YDaâ\86<\1cS\1aÁ\bós\1d\81ý\ 4Æ7\841Z\1dðJ,ÁJâ\9aº¹\8e\14+OÒÍõ)W÷GaìI\1cò/NøaÛpß\19 \1f¥\?ûµ¥Gñ\1f[4Ã/\13«#\1e¨ÆÍëËÛ\v÷\81åêý\92\ e¡\12\R\ 5\r¿Ô\80-L       _A\92\7fá\8bÊTÿ\00΢aendstream
+endobj
+4493 0 obj <<
+/Type /Page
+/Contents 4494 0 R
+/Resources 4492 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4495 0 obj <<
+/D [4493 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4496 0 obj <<
+/D [4493 0 R /XYZ 71.731 814.833 null]
+>> endobj
+4497 0 obj <<
+/D [4493 0 R /XYZ 71.731 768.009 null]
+>> endobj
+330 0 obj <<
+/D [4493 0 R /XYZ 252.492 755.597 null]
+>> endobj
+4498 0 obj <<
+/D [4493 0 R /XYZ 71.731 745.018 null]
+>> endobj
+4499 0 obj <<
+/D [4493 0 R /XYZ 71.731 745.018 null]
+>> endobj
+334 0 obj <<
+/D [4493 0 R /XYZ 162.317 719.301 null]
+>> endobj
+4500 0 obj <<
+/D [4493 0 R /XYZ 233.126 703.48 null]
+>> endobj
+4501 0 obj <<
+/D [4493 0 R /XYZ 71.731 701.413 null]
+>> endobj
+338 0 obj <<
+/D [4493 0 R /XYZ 174.677 678.142 null]
+>> endobj
+4502 0 obj <<
+/D [4493 0 R /XYZ 71.731 673.187 null]
+>> endobj
+4503 0 obj <<
+/D [4493 0 R /XYZ 71.731 670.796 null]
+>> endobj
+4504 0 obj <<
+/D [4493 0 R /XYZ 136.77 661.642 null]
+>> endobj
+4505 0 obj <<
+/D [4493 0 R /XYZ 222.859 661.642 null]
+>> endobj
+4506 0 obj <<
+/D [4493 0 R /XYZ 317.557 661.642 null]
+>> endobj
+4507 0 obj <<
+/D [4493 0 R /XYZ 71.731 647.861 null]
+>> endobj
+342 0 obj <<
+/D [4493 0 R /XYZ 187.959 622.523 null]
+>> endobj
+4508 0 obj <<
+/D [4493 0 R /XYZ 71.731 619.958 null]
+>> endobj
+4509 0 obj <<
+/D [4493 0 R /XYZ 71.731 615.176 null]
+>> endobj
+4510 0 obj <<
+/D [4493 0 R /XYZ 71.731 615.176 null]
+>> endobj
+4511 0 obj <<
+/D [4493 0 R /XYZ 71.731 604.58 null]
+>> endobj
+4512 0 obj <<
+/D [4493 0 R /XYZ 139.477 590.177 null]
+>> endobj
+4513 0 obj <<
+/D [4493 0 R /XYZ 379.494 590.177 null]
+>> endobj
+4514 0 obj <<
+/D [4493 0 R /XYZ 436.506 590.177 null]
+>> endobj
+4515 0 obj <<
+/D [4493 0 R /XYZ 71.731 573.498 null]
+>> endobj
+346 0 obj <<
+/D [4493 0 R /XYZ 192.609 550.227 null]
+>> endobj
+4516 0 obj <<
+/D [4493 0 R /XYZ 71.731 545.272 null]
+>> endobj
+4517 0 obj <<
+/D [4493 0 R /XYZ 182.911 534.884 null]
+>> endobj
+4518 0 obj <<
+/D [4493 0 R /XYZ 314.611 508.982 null]
+>> endobj
+4519 0 obj <<
+/D [4493 0 R /XYZ 71.731 479.351 null]
+>> endobj
+350 0 obj <<
+/D [4493 0 R /XYZ 202.018 456.08 null]
+>> endobj
+4520 0 obj <<
+/D [4493 0 R /XYZ 71.731 453.546 null]
+>> endobj
+4521 0 obj <<
+/D [4493 0 R /XYZ 302.543 440.737 null]
+>> endobj
+4522 0 obj <<
+/D [4493 0 R /XYZ 71.731 438.868 null]
+>> endobj
+354 0 obj <<
+/D [4493 0 R /XYZ 143.462 413.739 null]
+>> endobj
+4523 0 obj <<
+/D [4493 0 R /XYZ 71.731 411.204 null]
+>> endobj
+3109 0 obj <<
+/D [4493 0 R /XYZ 71.731 382.124 null]
+>> endobj
+4524 0 obj <<
+/D [4493 0 R /XYZ 71.731 369.213 null]
+>> endobj
+358 0 obj <<
+/D [4493 0 R /XYZ 248.67 346.833 null]
+>> endobj
+4525 0 obj <<
+/D [4493 0 R /XYZ 71.731 336.254 null]
+>> endobj
+4526 0 obj <<
+/D [4493 0 R /XYZ 71.731 336.254 null]
+>> endobj
+362 0 obj <<
+/D [4493 0 R /XYZ 162.317 310.537 null]
+>> endobj
+4527 0 obj <<
+/D [4493 0 R /XYZ 233.126 294.716 null]
+>> endobj
+4528 0 obj <<
+/D [4493 0 R /XYZ 71.731 292.649 null]
+>> endobj
+366 0 obj <<
+/D [4493 0 R /XYZ 174.677 269.378 null]
+>> endobj
+4529 0 obj <<
+/D [4493 0 R /XYZ 71.731 264.423 null]
+>> endobj
+4530 0 obj <<
+/D [4493 0 R /XYZ 71.731 262.032 null]
+>> endobj
+4531 0 obj <<
+/D [4493 0 R /XYZ 136.77 252.878 null]
+>> endobj
+4532 0 obj <<
+/D [4493 0 R /XYZ 222.859 252.878 null]
+>> endobj
+4533 0 obj <<
+/D [4493 0 R /XYZ 317.557 252.878 null]
+>> endobj
+4534 0 obj <<
+/D [4493 0 R /XYZ 71.731 239.097 null]
+>> endobj
+370 0 obj <<
+/D [4493 0 R /XYZ 187.959 213.759 null]
+>> endobj
+4535 0 obj <<
+/D [4493 0 R /XYZ 71.731 211.194 null]
+>> endobj
+4536 0 obj <<
+/D [4493 0 R /XYZ 71.731 206.412 null]
+>> endobj
+4537 0 obj <<
+/D [4493 0 R /XYZ 71.731 206.412 null]
+>> endobj
+4538 0 obj <<
+/D [4493 0 R /XYZ 71.731 195.816 null]
+>> endobj
+4539 0 obj <<
+/D [4493 0 R /XYZ 139.477 181.413 null]
+>> endobj
+4540 0 obj <<
+/D [4493 0 R /XYZ 71.731 177.685 null]
+>> endobj
+374 0 obj <<
+/D [4493 0 R /XYZ 192.609 154.414 null]
+>> endobj
+4541 0 obj <<
+/D [4493 0 R /XYZ 71.731 149.459 null]
+>> endobj
+4542 0 obj <<
+/D [4493 0 R /XYZ 182.676 139.072 null]
+>> endobj
+4543 0 obj <<
+/D [4493 0 R /XYZ 71.731 85.491 null]
+>> endobj
+4492 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4546 0 obj <<
+/Length 998       
+/Filter /FlateDecode
+>>
+stream
+xÚÅV[oÛ6\14~ϯÐÛ¤\ 1fx\93H¢OY\92\ e\19\86tH\85¾,C Ê´EÌ\91\f]Ò´¿~\87"i)±\9d\14k\86Á\80yÑ9\1f¿sx.$\11\86\1f\89\ 4A\82\91Hb\8a¤\90Qy\7f\82£5|ùõ\84x\89\85\17YÌd~ÉONß3\1a)¤2\16å«\88J\89\0'C<K£|ùg|^\15Û^·É\82
+\19\13äÆßM=<\9eÞä    Á8^À*!ñðè¾\9d\9f]»ÉEk\1e\82â-N1\88Á7\98\91ä¯ü·\93Ë|G.¥\ 4\ 1\8f\97è{\91\94F\84 \95¦\96?!
+¥)\8dD*\11\ 6;,ÿ\eÝ\ fm\r\88?%\82ÇÅfÐ\96\0è\8aÉt\1c-H\8a\18§£R^iÇ{5Ôeo\9aÚ­\8aÍ\97\84À\0fÇ_;·×j°Ý\1eá×ßtÛxø95À§\19RJ\8døï-\8cټʣkËÓ^ßo7E¯­
+*'h\81(\19¡\17\ I­\8f\bJ3>*\ 6¥»Vwº\9f\948@gV)è°\fQå<u]Ü{B\9c>'de\8fâÎèK\b\1c0\18\8f·\94
\94ªh\97Îu­\ en³únÚ\f½©õ\ 1§-<Ü\82\82K\98\1cA?~­\9bmgº\1dS\81\88à\81i\86\9aÚ\93Kñ$0ºLzr\87,\99£e\1c\9c\99\ 5K |»¾\1d\9c\97E½Ô\ f¦Ôw~ãg\7f\1a\99\0\14G\19\ 3p
+û§@Lp,¦SÈ»Cn 6è\15\\96B\10â£ìY»\1eîuÝw»\83\9fÜ\98\80dgÏN\9eg\È\14.\19bB\1dJ9\8aDféÏ>=\1fwÙI(\85ì\84É\fÏ¥ç,6\b§\88\ 5\19Ëî\8f\84\89¸\81Û
+\85¢oܸóðéç\ 6\82Çn\8aØ]ÁÐ\1e\8c\15 \90)îÓÌÅÊ\85îÊÖlÇ\ 4>\9ail\96ñd\96ñ{\99\90a\84SþBø<I\ 4È\99\9aé\1cöÐé¥\9b\8df¸\86\12éf\85\el¦@A\99%\vñÉ\82Ü<¯\ 2Z\18Û¢¯F÷\91g\89\ 6¤ÀF\9e"E¨½#p\95Ëân«Ks\8b1-AKɸkÜxå\86j,p\ fºþ©w\e¦.\13\11o\86åH\1f6ôc\ 1æk·(\eËØÕ'»£â\vX7;íUÓ®µ\9f÷þ$\8bWiûÿ·ÿPy´P\18,­¾è\87ÎÍ\9bÕ$gíÂÞ W'G8³u¡óYÃ\89»2cK³©×      M\81Ýñº,ÿM³`/5\vwtè
+ÖC­\8fí Ñ\re©;/Ñ´û\11G$\98¨\88\8f¢Ååõ\87\8bËOût8T\1a¼T\0_\15fs4S\ 4Ê0ÿ\9f:\92©M\7fW}¹[\16\16\8déUôy   ¢\12På^\7fº\ 2-SlÌ7}¬_\95E\vW¸ì\ eù3 þ§mjß°9èØlä\8fv+ù=ÝJ¾Ú­\18C\18¶ÆvEß²[\11Â\10\17oÖ¬&¸£½Ê\8bü`«\9aÛâßá\94#\85Å\8b/õI$<Ô\ 5R²{\8aaÉ}8¿¼9ó\8fó«\8f¹\9b°\94`ê<>\7fås&QJBU¡Ç^ãû\fÿ\ 1¢\90\1e9endstream
+endobj
+4545 0 obj <<
+/Type /Page
+/Contents 4546 0 R
+/Resources 4544 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4547 0 obj <<
+/D [4545 0 R /XYZ 71.731 802.878 null]
+>> endobj
+378 0 obj <<
+/D [4545 0 R /XYZ 202.018 758.046 null]
+>> endobj
+4548 0 obj <<
+/D [4545 0 R /XYZ 71.731 755.512 null]
+>> endobj
+382 0 obj <<
+/D [4545 0 R /XYZ 143.462 715.705 null]
+>> endobj
+4549 0 obj <<
+/D [4545 0 R /XYZ 71.731 713.171 null]
+>> endobj
+3110 0 obj <<
+/D [4545 0 R /XYZ 71.731 684.091 null]
+>> endobj
+4550 0 obj <<
+/D [4545 0 R /XYZ 71.731 671.179 null]
+>> endobj
+386 0 obj <<
+/D [4545 0 R /XYZ 204.048 648.799 null]
+>> endobj
+4551 0 obj <<
+/D [4545 0 R /XYZ 71.731 638.22 null]
+>> endobj
+4552 0 obj <<
+/D [4545 0 R /XYZ 71.731 638.22 null]
+>> endobj
+390 0 obj <<
+/D [4545 0 R /XYZ 162.317 612.503 null]
+>> endobj
+4553 0 obj <<
+/D [4545 0 R /XYZ 203.238 596.682 null]
+>> endobj
+4554 0 obj <<
+/D [4545 0 R /XYZ 71.731 595.118 null]
+>> endobj
+394 0 obj <<
+/D [4545 0 R /XYZ 174.677 571.344 null]
+>> endobj
+4555 0 obj <<
+/D [4545 0 R /XYZ 71.731 566.389 null]
+>> endobj
+4556 0 obj <<
+/D [4545 0 R /XYZ 71.731 563.998 null]
+>> endobj
+4557 0 obj <<
+/D [4545 0 R /XYZ 136.77 554.844 null]
+>> endobj
+4558 0 obj <<
+/D [4545 0 R /XYZ 201.336 554.844 null]
+>> endobj
+4559 0 obj <<
+/D [4545 0 R /XYZ 296.035 554.844 null]
+>> endobj
+4560 0 obj <<
+/D [4545 0 R /XYZ 71.731 541.063 null]
+>> endobj
+398 0 obj <<
+/D [4545 0 R /XYZ 187.959 515.725 null]
+>> endobj
+4561 0 obj <<
+/D [4545 0 R /XYZ 71.731 513.161 null]
+>> endobj
+4562 0 obj <<
+/D [4545 0 R /XYZ 71.731 508.379 null]
+>> endobj
+4563 0 obj <<
+/D [4545 0 R /XYZ 71.731 508.379 null]
+>> endobj
+4564 0 obj <<
+/D [4545 0 R /XYZ 71.731 497.782 null]
+>> endobj
+4565 0 obj <<
+/D [4545 0 R /XYZ 139.477 483.379 null]
+>> endobj
+4566 0 obj <<
+/D [4545 0 R /XYZ 71.731 481.604 null]
+>> endobj
+402 0 obj <<
+/D [4545 0 R /XYZ 192.609 456.381 null]
+>> endobj
+4567 0 obj <<
+/D [4545 0 R /XYZ 71.731 451.425 null]
+>> endobj
+4568 0 obj <<
+/D [4545 0 R /XYZ 179.606 441.038 null]
+>> endobj
+4569 0 obj <<
+/D [4545 0 R /XYZ 71.731 411.407 null]
+>> endobj
+406 0 obj <<
+/D [4545 0 R /XYZ 202.018 388.137 null]
+>> endobj
+4570 0 obj <<
+/D [4545 0 R /XYZ 71.731 385.602 null]
+>> endobj
+4571 0 obj <<
+/D [4545 0 R /XYZ 302.543 372.794 null]
+>> endobj
+4572 0 obj <<
+/D [4545 0 R /XYZ 71.731 370.924 null]
+>> endobj
+410 0 obj <<
+/D [4545 0 R /XYZ 143.462 345.795 null]
+>> endobj
+4573 0 obj <<
+/D [4545 0 R /XYZ 71.731 343.261 null]
+>> endobj
+3111 0 obj <<
+/D [4545 0 R /XYZ 71.731 314.181 null]
+>> endobj
+4574 0 obj <<
+/D [4545 0 R /XYZ 71.731 301.269 null]
+>> endobj
+414 0 obj <<
+/D [4545 0 R /XYZ 275.439 278.889 null]
+>> endobj
+4575 0 obj <<
+/D [4545 0 R /XYZ 71.731 268.31 null]
+>> endobj
+4576 0 obj <<
+/D [4545 0 R /XYZ 71.731 268.31 null]
+>> endobj
+418 0 obj <<
+/D [4545 0 R /XYZ 162.317 242.593 null]
+>> endobj
+4577 0 obj <<
+/D [4545 0 R /XYZ 245.081 226.773 null]
+>> endobj
+4578 0 obj <<
+/D [4545 0 R /XYZ 71.731 225.209 null]
+>> endobj
+422 0 obj <<
+/D [4545 0 R /XYZ 174.677 201.435 null]
+>> endobj
+4579 0 obj <<
+/D [4545 0 R /XYZ 71.731 196.479 null]
+>> endobj
+4580 0 obj <<
+/D [4545 0 R /XYZ 71.731 194.088 null]
+>> endobj
+4581 0 obj <<
+/D [4545 0 R /XYZ 136.77 184.935 null]
+>> endobj
+4582 0 obj <<
+/D [4545 0 R /XYZ 231.468 184.935 null]
+>> endobj
+4583 0 obj <<
+/D [4545 0 R /XYZ 326.166 184.935 null]
+>> endobj
+4584 0 obj <<
+/D [4545 0 R /XYZ 71.731 171.153 null]
+>> endobj
+426 0 obj <<
+/D [4545 0 R /XYZ 187.959 145.815 null]
+>> endobj
+4585 0 obj <<
+/D [4545 0 R /XYZ 71.731 143.251 null]
+>> endobj
+4586 0 obj <<
+/D [4545 0 R /XYZ 71.731 138.469 null]
+>> endobj
+4587 0 obj <<
+/D [4545 0 R /XYZ 71.731 138.469 null]
+>> endobj
+4588 0 obj <<
+/D [4545 0 R /XYZ 71.731 127.873 null]
+>> endobj
+4589 0 obj <<
+/D [4545 0 R /XYZ 139.477 113.47 null]
+>> endobj
+4590 0 obj <<
+/D [4545 0 R /XYZ 71.731 111.694 null]
+>> endobj
+4544 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4593 0 obj <<
+/Length 2492      
+/Filter /FlateDecode
+>>
+stream
+xÚ­Z]sÛ6\16}ϯÐ[¨\9d
+!\0\12$w\9fdIiÜÊ\96*)Ý´Û\1d\ e\16\eJÔPTÚä×÷^|ðC¤ìØãÉL\b\80ÀÁ\ 5pî¹\17´hÏ\86\7f´çQâqÚómF|Ïï­woìÞ\ 3¼ùñ\rÕ=\ 6ºË ÖçjõæÝ{Îz\ 1  \ 4ï­î{Ì÷\89ã\bÀ\11Ä\11noµù\9f5ÚF\87"Îû\ 3æù\16%ê9Mö§¿ß-V}jÛÖ\0j}j\9dþVïFÃ[U\18çÉ\17\ fÛµ¡\e¼\83\12íÿ\7fõÓ\9bɪ4Îe\94\80\1d\8f\99¯»´Ìg¬G)  \\17í§4 ®Ëz\9eë\13\eÖ\81ö\8fãã:O\ eE\92íqZ\18áU\v¶{\ 3ê\12î0Ùuµ\8dû\ 3Ç¡Öýi¿®\ 6\1d\12\ eq\ 2\ fÆaÿ"Þ\1dÒ¨\88Ãd\9f\14áö¯p\13\15Q{\12Ê \bvªAÉQÍq:Æ\eU*2õD\94$J\93
+Û*\8c9Û(ßüÕ§¾\15åºåXä§uq\82\ 6k\bÀ,\1a@\81ÁV¨Å¬³}\11\ 1äþ¡?à\94\ 1ú}\96ï"¹,h Vt\97\9d
+õNΤ:\1d\8b(MÑ2¬\8epÒáíà.\ 3\vH{7\98ë\11\v[L\96\93U8\1c\8f\17í-\10ph¾£;æñ!\8f\8fñ¾8\9eÏ\9e\rÔz8³\89ã9z=T\8e\8a6\e\18uD:q+»WO9\14\vµ-\ 2*êF\9c¥0Å\87ä\884FÂv¬\84z\ 1Xȵ\85·\8bÐg.óÚ\vqmâv­£aÌþ´»SÄg¥¥×û"NU±\84î\r\18\87\852ÞXèºïYÛä\80 \81mái1?ÐàÐpé,\ 2@r*û\97?\ra©vçQ\bÁ»\96P\9f¥\\ 2\9ap¯^ηIZÚuü3\92ø²R3\19úI\93\ 3Å_EO\97\13\ 6=õ2\ 6\xÊï¸@\95°yôpT­`UþUµ¯£½j[\9fò\1cÚSÝ\9eíUɳîâ\ ev\8200Û,\15¤g<ù5\9c/f?.\8677ëé$¼^üÒá®\ e%Ôq\8d\8fgj*)q\9bd\rî®9ê2\10\ e¿qtÅ6*\94Þi.øg¾\8b-àø\920\9euȳ\87<Úí¢»T¿K\80%y~:Ày0×ð´!q XL\90 \b\94ÏÅ \ 2\92!\9eõkßs¬(=Å\97e\8eW2\87³\952'kQªì\ 4\17±¾\1eU\eØ\fú\ 4Sèú·8Ï\1e\97øï\11&I\9f´ã\98¯ß\19   Å!d]A{\84Q        =p<â3\f\0\94¸\82wèî\1a\98WW^\18íÀ\1c\ 2G\9bÁ\\10\16¨xp\eí:¸¢,þOOÐà\8aMX)\b\7f0ðk¹O×5)Çzé í½\e\18\8c\ 1\83­áj\v\97_÷Ùá\98\1cKC=BA\ fµ¡\82¨Ð\flQ\1d\»ê ·Îï\8cPg\v©Ã\82{\12n\9bÀ\86ÑZ\85\98þ@\80`\82ÿmâ/É:\ euÿô¼´B\80\10$\ 2\1aÐ\9e\ 6XâئÓ\ f
+«ZE\r\8dáa\b\83\ 6vïóN4Ûw+\9bé\7fºö\97\ 5\1c4\eR\a\1e\10H\10dçaþpÚIÙ337\98àAªä\9c\9e¯\98<\83{À+\9fv%,\8cx\ 2#cíÕù³Ìm(\ 3)\914­ðTrÓ \1a#\fXmú uó>÷¬L\8a\86\96\9dLóÍ\1cØ;©³Jn\1aICsÑ\ 3°@\ 4\18p9ñ4xµë\9dKG×ò½×[z\85wyéº\8ftã2Æú:ÆÖDWç-\rßÓ]÷j/\1eÑç5nX\17\8fô\16Õ\94î»rË\9aèB\86ñHné¡\v:ßã¹ÍÍQ|¨²K\9cEe\97XBJàSf\97 æZ\95ä+cSc\13Tb\82Ç\f¾U\8fn\15\7f\ 6®Ã\e &Öe\82    \13\98\1c\13Ût\8e\89E9\19\16ÊÃ\91 F\18«p×\bá°'.5©óèÃõ<\ý6\9ftäe\ 1\84z·#«1S«\98Í\81\9bÔk$"Å×\ 3\ 1\954Âgi S¥62>u$]T\86â§Íó\89ð½J\1cÕDwzb\88\e<\91Y!\94\1c5/leùNçZø\92¨ÖÕ¶Ã\89©ð\b\ fê¢\19ÞEÇ8Ä̹m\12dÜpIòYã\88uÎåú¢¹\89PWç\a\ 5¸!ä\85\8e5Þ½Íî!\87ck\88}oUË\ eÓñ]fPwÑáÂÐÚÕ\ 3«\8d}\97-×Å[d\89\94lé\\95Ùiò9ÆL\10·Få`ª$ïZP2Ou£\82Â\11\93\0Y\8aj¯Ú;
\13¢¼¹e\17\12\ e\8cãF:´è\89N\87C\9aÈ\9b\1eN¦[wÙæ\94j\ 3Ò,ÚÈäòA{\1eÜ}<W49\9aìb³\13¶ß}ú\90\1f\81z\99ÃO³õ綡ܭõ1g\r\80Û,Ý\1cUQ\9d\87]\93MS\ 1Høÿ³jø"\13MYLöêùá[Í<YP3´,eN@\9còÚ\bä\ e×\9b<\84\eZ\17I!s³iS\87\8cµÂ=SoW8Öñ\10¯\13ÉAÕ#\93ꬻ£@É\82Z%\14À×k\v\83\86qò%ÙĺÛÙ­Q¶Í*@ÇÚÄ8Õ^\92\16Þ%û\ 69õám»î&\fr\11¿Ú\82î»\1aÜD|Ç\`ȶ?ð\98\8d\97$\96ÆÿncB\1eIË@\0\98£ñ"\1cM\7f\9e}\\857ÃåÏ\1d¡ÃÆë»W¦cmy#A9}\ 5\18ÎÞ¿o\83ù¼&qß\87µøt};\9fÜ>\1f\vR9_
+o#<i\ 3¯æ\9dáÁóÄcÆQî7\8d\9bO¦×ø)«\85\ 5\17mÛ5\9a ¹.xp\89ë®K¨¨!\87Ùú\ 2Õ=L/tGÍpÄm2\1c[j\fW\82á\vÈ\95\9d\ 6çJÖ\aà\86\92õ\81ñm,ÌNÅ\ 1ã2\96G\10Æó,U\15Mxp\8a\92ó\81\1dX3h¨#Öh\1fh\ 50ø­­å L¶x6ÕU¼\ e`I\946\8eù"ýA)|!ªyf£Ex3\eO«ëù\87á²#*SÈv]ϹL\v\ 4í\80\M\96«\ ef¸D8ô ¸\ e´ÛÙâf8}\81\7f\9eù\ 1k!\8f¦³Q§ãS"hp\19Ø'\ eõ\9a\96®>ÙáôC\aoá²d?\17\8a\86¿ÿþ\ 4\94\94[ýmÈ-?\aµ\1cL\80\90\96ß½à&\14®ÓÏ/\88%\9c\9fÇ\12hiÄ\12¨W±\ 4**\96p\93ØrÇ\1a¥\19ø\89\89%Ð0\93¹/çí8\ 2m³:X=\8ep®B*çÝ\ eÕL}\92\v\1f*!Ôû­\85\ e\979\8fú\ e3\87\94 Ä\8fÆvg\9e\83_H.\1eµG\ 2ÿ\f\85¾\fÅo¢°WAá\17P\9e\ 1²\9cÚ¯`ÊrúÔ¶\10£\7fm÷V\7f¤ðÙÅ\88Ã\88ÍEÍ!îNÇ\v\11\87\12Ê\9cfÈAà³?7@KÝ\11°^:\ 2V¤#`¡0\96]\9dô+\88-8êá\84\ 1%2·^\\ e\87°Øàñ¹\8b\bô\1f\86,ZÕk^\82\12|vz       \15\9c\94\97éïv\12\84»ì$ eå\97óäêã2\1c/^@\87\0n]N\13\85¾\ 6Êê\ 5(\9d\f\93póÙôùp\10ÿÊ\8fv\12etõÛ\93L\97\1f¯Õ7i¸å]b5\87\ 4\8eÖeþpêfµ\80\®¼ãhVã\fí¿\10Ac\9dØX/\89\8d¦Hbckùý\0/à¬ü~ ?\93\1dNxÛ\11êÛý}´\8eUµ¥ùÐVi>Tê\9a/\87«ç\85ë\ 2¬¿ÌD\1e¥³¨k>à]¦³\v¹U¥Kó\8fá¨+\17\7fZÝüò\ 3\8dD¹ùøéµ\88\88pËéü%DtyP7jþßñ³Õ¿\ 5\19½\82)ãåk ,º\12Ðú\82Èù\97\ 3\0 p`{\8fþD êb~!\0!ÌÓ!£\86\81ÓÌF\93ÅPÿ*à\1al\92\ 5Èùm\1d³ë?/p@A]jVÉØ\85\9f\ 1´-ü\a\98JN]endstream
+endobj
+4592 0 obj <<
+/Type /Page
+/Contents 4593 0 R
+/Resources 4591 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4594 0 obj <<
+/D [4592 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4595 0 obj <<
+/D [4592 0 R /XYZ 71.731 814.833 null]
+>> endobj
+430 0 obj <<
+/D [4592 0 R /XYZ 192.609 758.046 null]
+>> endobj
+4596 0 obj <<
+/D [4592 0 R /XYZ 71.731 753.091 null]
+>> endobj
+4597 0 obj <<
+/D [4592 0 R /XYZ 184.049 742.704 null]
+>> endobj
+4598 0 obj <<
+/D [4592 0 R /XYZ 377.142 729.752 null]
+>> endobj
+4599 0 obj <<
+/D [4592 0 R /XYZ 299.434 716.801 null]
+>> endobj
+4600 0 obj <<
+/D [4592 0 R /XYZ 209.992 703.85 null]
+>> endobj
+4601 0 obj <<
+/D [4592 0 R /XYZ 330.754 690.898 null]
+>> endobj
+4602 0 obj <<
+/D [4592 0 R /XYZ 71.731 674.219 null]
+>> endobj
+434 0 obj <<
+/D [4592 0 R /XYZ 202.018 650.948 null]
+>> endobj
+4603 0 obj <<
+/D [4592 0 R /XYZ 71.731 648.414 null]
+>> endobj
+4604 0 obj <<
+/D [4592 0 R /XYZ 71.731 631.878 null]
+>> endobj
+438 0 obj <<
+/D [4592 0 R /XYZ 143.462 608.607 null]
+>> endobj
+4605 0 obj <<
+/D [4592 0 R /XYZ 71.731 606.072 null]
+>> endobj
+3112 0 obj <<
+/D [4592 0 R /XYZ 71.731 576.992 null]
+>> endobj
+4606 0 obj <<
+/D [4592 0 R /XYZ 71.731 564.081 null]
+>> endobj
+442 0 obj <<
+/D [4592 0 R /XYZ 287.559 541.701 null]
+>> endobj
+4607 0 obj <<
+/D [4592 0 R /XYZ 71.731 531.122 null]
+>> endobj
+4608 0 obj <<
+/D [4592 0 R /XYZ 71.731 531.122 null]
+>> endobj
+446 0 obj <<
+/D [4592 0 R /XYZ 162.317 505.405 null]
+>> endobj
+4609 0 obj <<
+/D [4592 0 R /XYZ 257.036 489.584 null]
+>> endobj
+4610 0 obj <<
+/D [4592 0 R /XYZ 71.731 487.517 null]
+>> endobj
+450 0 obj <<
+/D [4592 0 R /XYZ 174.677 464.246 null]
+>> endobj
+4611 0 obj <<
+/D [4592 0 R /XYZ 71.731 459.291 null]
+>> endobj
+4612 0 obj <<
+/D [4592 0 R /XYZ 71.731 456.9 null]
+>> endobj
+4613 0 obj <<
+/D [4592 0 R /XYZ 136.77 447.746 null]
+>> endobj
+4614 0 obj <<
+/D [4592 0 R /XYZ 240.077 447.746 null]
+>> endobj
+4615 0 obj <<
+/D [4592 0 R /XYZ 334.775 447.746 null]
+>> endobj
+4616 0 obj <<
+/D [4592 0 R /XYZ 369.791 447.746 null]
+>> endobj
+4617 0 obj <<
+/D [4592 0 R /XYZ 387.009 447.746 null]
+>> endobj
+4618 0 obj <<
+/D [4592 0 R /XYZ 71.731 433.965 null]
+>> endobj
+454 0 obj <<
+/D [4592 0 R /XYZ 187.959 408.627 null]
+>> endobj
+4619 0 obj <<
+/D [4592 0 R /XYZ 71.731 406.062 null]
+>> endobj
+4620 0 obj <<
+/D [4592 0 R /XYZ 71.731 401.28 null]
+>> endobj
+4621 0 obj <<
+/D [4592 0 R /XYZ 71.731 401.28 null]
+>> endobj
+4622 0 obj <<
+/D [4592 0 R /XYZ 71.731 390.684 null]
+>> endobj
+4623 0 obj <<
+/D [4592 0 R /XYZ 139.477 376.281 null]
+>> endobj
+4624 0 obj <<
+/D [4592 0 R /XYZ 71.731 375.337 null]
+>> endobj
+4625 0 obj <<
+/D [4592 0 R /XYZ 71.731 375.337 null]
+>> endobj
+4626 0 obj <<
+/D [4592 0 R /XYZ 71.731 360.936 null]
+>> endobj
+4627 0 obj <<
+/D [4592 0 R /XYZ 139.477 347.887 null]
+>> endobj
+4628 0 obj <<
+/D [4592 0 R /XYZ 71.731 344.16 null]
+>> endobj
+458 0 obj <<
+/D [4592 0 R /XYZ 192.609 320.889 null]
+>> endobj
+4629 0 obj <<
+/D [4592 0 R /XYZ 71.731 315.933 null]
+>> endobj
+4630 0 obj <<
+/D [4592 0 R /XYZ 192.856 305.546 null]
+>> endobj
+4631 0 obj <<
+/D [4592 0 R /XYZ 393.064 292.595 null]
+>> endobj
+4632 0 obj <<
+/D [4592 0 R /XYZ 211.551 279.643 null]
+>> endobj
+4633 0 obj <<
+/D [4592 0 R /XYZ 306.59 279.643 null]
+>> endobj
+4634 0 obj <<
+/D [4592 0 R /XYZ 364.361 279.643 null]
+>> endobj
+4635 0 obj <<
+/D [4592 0 R /XYZ 437.634 279.643 null]
+>> endobj
+4636 0 obj <<
+/D [4592 0 R /XYZ 293.214 253.741 null]
+>> endobj
+4637 0 obj <<
+/D [4592 0 R /XYZ 170.83 240.789 null]
+>> endobj
+4638 0 obj <<
+/D [4592 0 R /XYZ 455.567 240.789 null]
+>> endobj
+4639 0 obj <<
+/D [4592 0 R /XYZ 141.67 214.886 null]
+>> endobj
+4640 0 obj <<
+/D [4592 0 R /XYZ 223.694 214.886 null]
+>> endobj
+4641 0 obj <<
+/D [4592 0 R /XYZ 341.234 214.886 null]
+>> endobj
+4642 0 obj <<
+/D [4592 0 R /XYZ 434.864 214.886 null]
+>> endobj
+4643 0 obj <<
+/D [4592 0 R /XYZ 119.552 201.935 null]
+>> endobj
+4644 0 obj <<
+/D [4592 0 R /XYZ 188.466 201.935 null]
+>> endobj
+4645 0 obj <<
+/D [4592 0 R /XYZ 333.686 201.935 null]
+>> endobj
+4646 0 obj <<
+/D [4592 0 R /XYZ 470.62 188.983 null]
+>> endobj
+4647 0 obj <<
+/D [4592 0 R /XYZ 156.418 176.032 null]
+>> endobj
+4648 0 obj <<
+/D [4592 0 R /XYZ 292.653 176.032 null]
+>> endobj
+4649 0 obj <<
+/D [4592 0 R /XYZ 410.954 176.032 null]
+>> endobj
+4650 0 obj <<
+/D [4592 0 R /XYZ 119.552 163.08 null]
+>> endobj
+4651 0 obj <<
+/D [4592 0 R /XYZ 229.588 163.08 null]
+>> endobj
+4652 0 obj <<
+/D [4592 0 R /XYZ 315.714 163.08 null]
+>> endobj
+4653 0 obj <<
+/D [4592 0 R /XYZ 455.567 163.08 null]
+>> endobj
+4654 0 obj <<
+/D [4592 0 R /XYZ 119.552 137.178 null]
+>> endobj
+4655 0 obj <<
+/D [4592 0 R /XYZ 191.687 137.178 null]
+>> endobj
+4656 0 obj <<
+/D [4592 0 R /XYZ 247.495 137.178 null]
+>> endobj
+4657 0 obj <<
+/D [4592 0 R /XYZ 303.304 137.178 null]
+>> endobj
+4658 0 obj <<
+/D [4592 0 R /XYZ 359.113 137.178 null]
+>> endobj
+4659 0 obj <<
+/D [4592 0 R /XYZ 414.921 137.178 null]
+>> endobj
+4660 0 obj <<
+/D [4592 0 R /XYZ 470.73 137.178 null]
+>> endobj
+4661 0 obj <<
+/D [4592 0 R /XYZ 171.588 124.226 null]
+>> endobj
+4662 0 obj <<
+/D [4592 0 R /XYZ 282.592 111.275 null]
+>> endobj
+4663 0 obj <<
+/D [4592 0 R /XYZ 356.92 111.275 null]
+>> endobj
+4664 0 obj <<
+/D [4592 0 R /XYZ 413.825 111.275 null]
+>> endobj
+4665 0 obj <<
+/D [4592 0 R /XYZ 470.73 111.275 null]
+>> endobj
+4666 0 obj <<
+/D [4592 0 R /XYZ 119.552 98.323 null]
+>> endobj
+4667 0 obj <<
+/D [4592 0 R /XYZ 172.999 98.323 null]
+>> endobj
+4668 0 obj <<
+/D [4592 0 R /XYZ 274.591 98.323 null]
+>> endobj
+4669 0 obj <<
+/D [4592 0 R /XYZ 343.313 85.372 null]
+>> endobj
+4670 0 obj <<
+/D [4592 0 R /XYZ 415.097 85.372 null]
+>> endobj
+4671 0 obj <<
+/D [4592 0 R /XYZ 470.73 85.372 null]
+>> endobj
+4672 0 obj <<
+/D [4592 0 R /XYZ 119.552 72.42 null]
+>> endobj
+4673 0 obj <<
+/D [4592 0 R /XYZ 172.911 72.42 null]
+>> endobj
+4674 0 obj <<
+/D [4592 0 R /XYZ 226.271 72.42 null]
+>> endobj
+4675 0 obj <<
+/D [4592 0 R /XYZ 279.631 72.42 null]
+>> endobj
+4676 0 obj <<
+/D [4592 0 R /XYZ 332.99 72.42 null]
+>> endobj
+4677 0 obj <<
+/D [4592 0 R /XYZ 71.731 68.892 null]
+>> endobj
+4591 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4680 0 obj <<
+/Length 1291      
+/Filter /FlateDecode
+>>
+stream
+xÚåWK\93Û6\f¾ï¯ð­r'â\8a\14)\8aÓSºI:Ûé¤\9d\8dÛK·ã\91eÚ«Ô\96\JJ²ùõ\ 5       R\96WÞÇ¡9u|0Aâñ\ 1\ 4@\88Î\12øÑ\99¤D¦t\96'\8cä2\9f\95û\8b\85\93\9f.¨ç\88=K<âùqqqù.e3ET\96Î\16\9b\19ËsÂy\ 6z2Â31[¬ÿ\8c®î\8aC§Í<f2\8f(Áÿ_ªºÿry³\98Ó$\89b æ4ê¿àÙÕë÷¸xcªOAð6\11       °Á\19¬èü¯ÅÏ\17o\17\ 38Á(\ 1\1cOÁ÷,\13ø\8cÍ(%J\b\8b\9fRE\84`3)r\92\80\1f\16ÿ\8dîzS\ 3\8a\F\7fÌ%\8f\8a]¯-\0\90\95\93YL\ 5I9sB\8b;\8d¸7}]vUS#Uì>Ï)ü\81ÛÑ}\8b{F\83ïÖ\84§¿jÓxõch \9feD)åô¿³jªÝ³8ZS^vz\7fØ\15\9d¶"¤<ª\96\84Q§:æ\92äÌÆ\88\12\91q'\18\84\96U]uËfõq¹.ºâ(ÌÁDf\85\83l\9a\11¦0bï\8b½\aÆÙC`\96÷Yý#whÊ     \93\19H[©[Æ$Fé\1aĪbW}õqÞë¶-¶\9eXÙlÚl´iÏ\ 42\ e*c\ 6qJs§øÃ}Ý\1cÚª\1d`KB%\ f°3\82©\Õ\1d2\88äÈàâ\98{\80O¹5Öª\14I\12\16¼\82Ün;Ó\97Ý<Π\1eÊ¢.ïªÃÒ\93ß{\9bô(\9eg$É\95\17·¼S\v\16\96à\9eå\15j:â\1féböR¤g\ 4ĵ\99*\83Ú\91ù\11-ýá\\Yfù!\13\14\81:r¼¯Í¶ßëºk\a³'é ¡£¤'>\8c\8b:\14#ÏS\92Ju®ª\19\91\99\rÃèèáÿÐ\0(cÐ\0`1Ò\87\1d`\9cn\9c\11\ 6\89\1dx,¶ßæ©\8c\1a\88]èE]\83ÿå\F\16·#Ú\83.«[¸ÔÒÓ\1d$¡½ÓÞè©÷1\80É\14·É\b\91¥§±?\e\ 4Á\89ʳÿ.\bG}\8f\aÁó¸\9aî÷«à\7f³ñq¸;[|=8n\8bïl\8ex·G­ì\8dnKS\1d\\93|IWM¡\ 5\ f]uÒe²\94ÐL½ \1aO\9b\8c ,\15^
\803Ò·z\8d+{á©\14Q5j:n?à¹+Ì\1a;»ñ;XÏþîÁ       \ 5\ fcbï\9bA,Ð\9b²©»\ 2TÖ[\10QÐÎëMcö\ 5¾\16v£X5}\87\ 4\8bueC\v%\85ä\10yK\80\83ºìZO8%ê(yeñÙ§Õ\12!uí\93\80;×ÞhY´\889ñ`}rÂ\9ds.P\1dçààÇ\ 2ÞîdØ5ú»9\13Q\8b§M½»Ç£¦ö\ 2\ 3T·ë âÁªï\ 2+nx\e\10ï\9c      Ûðíº\9cçXl\83=\\16Æë\87<9Á=N\19Å!ÚkÈKO¬ô®ù\8cKwÛ*\8d ö¸Q \1dl;ÙPèxN£zí\85\87\84ðZº`.8è¬Ù\90ºãb½6\10\ 6äæ\ 1\\1aé:>\13óÎÜO;\a<F©\12Çv½´Ú\97Vñ4¯ó\84ä4ð\1a}\0Û®\19C\9d\8aP½Yd\9b\96\81\88½Þ7`Öqx´x\80E\9f\ 511.úÌ»KðäºÆÍ!\95beßÈ\93{Au4¨£C>M\1cÎ2\92%/wXÊQ\19;\vÅߺ~hÌN(nU8.\ 6G\98\1dví¯ÛËãí9^\1f\ fHs\82;¿×;\1f T\8eµ\ e#\11t\8b\93«<m\10¶Mö.\vÜPè\1f\f½ÝÛQ\10Þ\99uh«á.`]¸b}\15¦á$-¶^\1eÆ\ 5ßyuÐÔ\8dFIWâÏÍ\93ÿó!÷`\9a­)öËÊüó\rFÜ©öñÛã_ä\87\ 3®\17\r\1f¦?tç\aÚð¨\7fË\81vâÄÉ8\9b@SJ\1f\1fg×úSUê'\ 6ZÅa.\b6QàÌ\14
+\1f\95Éd\f\1dOKþ\e\95ÁÜ\92È'¿b\8f,á#V\12\95S\1dÖÔ¯Woo^û\ f×ë\ f\v\82&\f1\8e¿\80y\9a\13AÃu²ô\91/Õ)Â\7f\ 1\1avôÙendstream
+endobj
+4679 0 obj <<
+/Type /Page
+/Contents 4680 0 R
+/Resources 4678 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4422 0 R
+>> endobj
+4681 0 obj <<
+/D [4679 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4682 0 obj <<
+/D [4679 0 R /XYZ 71.731 814.833 null]
+>> endobj
+462 0 obj <<
+/D [4679 0 R /XYZ 202.018 758.046 null]
+>> endobj
+4683 0 obj <<
+/D [4679 0 R /XYZ 71.731 755.512 null]
+>> endobj
+466 0 obj <<
+/D [4679 0 R /XYZ 143.462 715.705 null]
+>> endobj
+4684 0 obj <<
+/D [4679 0 R /XYZ 71.731 713.171 null]
+>> endobj
+3113 0 obj <<
+/D [4679 0 R /XYZ 71.731 684.091 null]
+>> endobj
+4685 0 obj <<
+/D [4679 0 R /XYZ 71.731 671.179 null]
+>> endobj
+470 0 obj <<
+/D [4679 0 R /XYZ 276.076 648.799 null]
+>> endobj
+4686 0 obj <<
+/D [4679 0 R /XYZ 71.731 638.22 null]
+>> endobj
+4687 0 obj <<
+/D [4679 0 R /XYZ 71.731 638.22 null]
+>> endobj
+474 0 obj <<
+/D [4679 0 R /XYZ 162.317 612.503 null]
+>> endobj
+4688 0 obj <<
+/D [4679 0 R /XYZ 251.059 596.682 null]
+>> endobj
+4689 0 obj <<
+/D [4679 0 R /XYZ 71.731 594.615 null]
+>> endobj
+478 0 obj <<
+/D [4679 0 R /XYZ 174.677 571.344 null]
+>> endobj
+4690 0 obj <<
+/D [4679 0 R /XYZ 71.731 566.389 null]
+>> endobj
+4691 0 obj <<
+/D [4679 0 R /XYZ 71.731 563.998 null]
+>> endobj
+4692 0 obj <<
+/D [4679 0 R /XYZ 136.77 554.844 null]
+>> endobj
+4693 0 obj <<
+/D [4679 0 R /XYZ 235.772 554.844 null]
+>> endobj
+4694 0 obj <<
+/D [4679 0 R /XYZ 321.861 554.844 null]
+>> endobj
+4695 0 obj <<
+/D [4679 0 R /XYZ 347.724 554.844 null]
+>> endobj
+4696 0 obj <<
+/D [4679 0 R /XYZ 364.942 554.844 null]
+>> endobj
+4697 0 obj <<
+/D [4679 0 R /XYZ 71.731 541.063 null]
+>> endobj
+482 0 obj <<
+/D [4679 0 R /XYZ 187.959 515.725 null]
+>> endobj
+4698 0 obj <<
+/D [4679 0 R /XYZ 71.731 513.161 null]
+>> endobj
+4699 0 obj <<
+/D [4679 0 R /XYZ 71.731 508.379 null]
+>> endobj
+4700 0 obj <<
+/D [4679 0 R /XYZ 71.731 508.379 null]
+>> endobj
+4701 0 obj <<
+/D [4679 0 R /XYZ 71.731 496.428 null]
+>> endobj
+4702 0 obj <<
+/D [4679 0 R /XYZ 139.477 483.379 null]
+>> endobj
+4703 0 obj <<
+/D [4679 0 R /XYZ 71.731 480.482 null]
+>> endobj
+4704 0 obj <<
+/D [4679 0 R /XYZ 71.731 480.482 null]
+>> endobj
+4705 0 obj <<
+/D [4679 0 R /XYZ 71.731 468.034 null]
+>> endobj
+4706 0 obj <<
+/D [4679 0 R /XYZ 139.477 454.986 null]
+>> endobj
+4707 0 obj <<
+/D [4679 0 R /XYZ 71.731 451.258 null]
+>> endobj
+486 0 obj <<
+/D [4679 0 R /XYZ 192.609 427.987 null]
+>> endobj
+4708 0 obj <<
+/D [4679 0 R /XYZ 71.731 423.032 null]
+>> endobj
+4709 0 obj <<
+/D [4679 0 R /XYZ 182.721 412.645 null]
+>> endobj
+4710 0 obj <<
+/D [4679 0 R /XYZ 135.947 360.839 null]
+>> endobj
+4711 0 obj <<
+/D [4679 0 R /XYZ 186.157 347.887 null]
+>> endobj
+4712 0 obj <<
+/D [4679 0 R /XYZ 71.731 331.208 null]
+>> endobj
+490 0 obj <<
+/D [4679 0 R /XYZ 202.018 307.937 null]
+>> endobj
+4713 0 obj <<
+/D [4679 0 R /XYZ 71.731 305.403 null]
+>> endobj
+4714 0 obj <<
+/D [4679 0 R /XYZ 71.731 288.867 null]
+>> endobj
+494 0 obj <<
+/D [4679 0 R /XYZ 143.462 265.596 null]
+>> endobj
+4715 0 obj <<
+/D [4679 0 R /XYZ 71.731 263.062 null]
+>> endobj
+3114 0 obj <<
+/D [4679 0 R /XYZ 71.731 233.982 null]
+>> endobj
+4716 0 obj <<
+/D [4679 0 R /XYZ 71.731 221.07 null]
+>> endobj
+498 0 obj <<
+/D [4679 0 R /XYZ 271.962 198.69 null]
+>> endobj
+4717 0 obj <<
+/D [4679 0 R /XYZ 71.731 188.111 null]
+>> endobj
+4718 0 obj <<
+/D [4679 0 R /XYZ 71.731 188.111 null]
+>> endobj
+502 0 obj <<
+/D [4679 0 R /XYZ 162.317 162.394 null]
+>> endobj
+4719 0 obj <<
+/D [4679 0 R /XYZ 239.103 146.573 null]
+>> endobj
+4720 0 obj <<
+/D [4679 0 R /XYZ 71.731 144.506 null]
+>> endobj
+506 0 obj <<
+/D [4679 0 R /XYZ 174.677 121.235 null]
+>> endobj
+4721 0 obj <<
+/D [4679 0 R /XYZ 71.731 116.28 null]
+>> endobj
+4722 0 obj <<
+/D [4679 0 R /XYZ 71.731 113.889 null]
+>> endobj
+4723 0 obj <<
+/D [4679 0 R /XYZ 136.77 104.735 null]
+>> endobj
+4724 0 obj <<
+/D [4679 0 R /XYZ 227.163 104.735 null]
+>> endobj
+4725 0 obj <<
+/D [4679 0 R /XYZ 321.861 104.735 null]
+>> endobj
+4726 0 obj <<
+/D [4679 0 R /XYZ 71.731 90.954 null]
+>> endobj
+4678 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4729 0 obj <<
+/Length 1348      
+/Filter /FlateDecode
+>>
+stream
+xÚµWYoÛF\10~÷¯Ð[( ZïE.\89\ 2\ 5\14\1f\81\8bÄN\1d!@Q\17\ 6M®$\ 2\12©òðÑ_ß\99Ý%E\9ar\9c´.ôÀ=æøfv.±       \85\1f\9b(F\94`\93\90r\12ªp\92l\8fèd\ 57\1f\8e\98£\989\92Y\8fæýâèø\ðID¢@L\16Ë     \ fC"e\0r\ 2"\ 3\7f²HÿðNÖñ®ÖåtÆUè1b¿\1f³¼y<¾^L\19¥Þ\fvSæ5\8föîd~i\17§evß2ÞP\9f\ 2\19ÜÁ\8aMÿ\üzt¶èÀù\9c\11Àñ-ø\8ed\ 4\9fó    c$ò}ÄÏXD|\9fO\94\1f\12
+v þy¹j¶:¯+Tz|î³½¹t2c
+¼"\fa\12穾\7f\ e­\13É}¢(;\84\8d\13\15D°ê]=ÿvf0ÎÁ\f|\8e½<k\87Úãb\92\13\ eð[\1aD÷y*\94Wdy÷\14ua¿\16v\96èã»".S<T^U\97MR7¥¶F\ f\9c4\ 3\bA$á\e\90(\8a\8côS]%e¶«³"w\1cjè&\9f\biÝ´XëéL(î-\9b<\ 1\ 6xyÇ#{\91\14\bÂX\b¬ÈRëín\13×úvW\16«2ÞÞfå_c5\8c\vÂ\ 1¢åÉ*«¥©t\8a+æ-\8bÒ\1e­ÁÌ\87)\v½¸tPêu\f\8eÃñ:uÛønc\1c\ 1v\84\ 1\11Jà;\80;¬g\8dOËf\a\11Â}\8f kä],í÷©hJ»2*\86\8a#/-t\95¿«í\ 6\14ÛÅ@¯9éé\80}\88bíEµ.\9aMj×yá\ 4Uº6pé\0g½Öã\10f!      ©r>ëB¡º­Çþu\ 5À\92Î~¹¡TÄ+Ä\13\86\1eäGù\84K\85q5zM\15Àk:NHáÓ³¯·\9f¯¯>\Ï?}\9a¿ÿxv{qýÛ\81÷\94\90±²Å\ 6Ьª\8d\ 6GRï^Ûm\r^]g\ e\ 6\86Ô̾\94 
+¢Ów\1eàÖ\ 3\18\9e\9b\§Y­SW\8eæ«8s7õ\1a\ 4¢<ܸ\10uWíé0~ð¤Úé$\ 3\87ðÄí\8bV\98.õ;\f\vÇ\9a\176¿ôc\f!í¸\93"Õ(\8e\1cH6:H³k\r9\89hÀÏ÷ñ¦Ñ/'\eß'ÛØ\92ÒÈq\98þ\ 6\83\10·\14U\93@\188
+H\9cÑ\93²\10ü\1auápvy\ 5¯:\86#%    \98pT­ðe\9cm^¬-\8a\ 4tX\ÎÑ9ÙæUc«29nK\85ñg²× \bgV\83T$Ä\ 2ê3â\arX_\1eJ\b\8aÛR¯²
+ëdÇ-AG`ÌqÌ" <²ýá2Þê±{,2¤}]Á æ)Ô0éüu\ 3Þpý²x°\8b\8d¾×\e»4²Ú÷\\99¨í\8a{Y4u\96\1fôp«b\ 6ÍA\88Ð(úò\94\17»*«:;\14aJ¶v\ 4Ävòû"K]\ 5¡{
+è«>h ¯\eÚ\97˨ ¢+<ØÝ\9b¼ÊV\90\96]\8dêh¥\80fÜÖõ4®ã\ 3âð}ÛvñÓt\16ÀXÑ      4»M\91¯Æ¢\ 3(\7fª\râ8MK\8cù\91tA   ë*\1fÎ\1f?\1f\fÝP\12\8a}QDPí¢\1f\e\1e\ e\8d\ e\10ß$\14Ñ\9b\8d\ e=y/\8e\ e-M\87m03Üé}\bÖ:\1f\e×Í\bL\10\15²çî=h%d\19Î\8eofå^ÞËV:\1a\84·ÕÛ\ 2{\18ÚÕB\1d\18Ýå۾ǽÍ\Ô/ÕÒß\97êñPD\89\1f}Wª\r\8c\85x\8cx\7f.B-v.Â\95±\ f¾­}Ý\91|Þéà¦Uã¤\98\8a\8e\fk7 q
+\18\99\1a´Ý\13\94`\86z\9f\14\1ah¶³ýÎ\9cünþ\ 4à@\83»v á>\9cå\9b'{ºîz>\9e\exp\8a\9d\98\11\0Ïz\8d\ ev\19\94Å¥]ÚIÌ
+\eX\ 5ìvä3ê\8b­;ëõôñ,Õ«½0¬\99Nif¿\1fià_§Jzÿ¡\89ãìØN\15µ+ûØÊ\9d\ 6\fcûéO
+/C{½Ë\8a\7fÛeÅ0`K\1d§ÿg\93=$\7f\90\ f\92p\15|W\8fEQ]\8bEy8Ã\8fZl¿\9c¹)\99K\12A{ûÖ\1fé=Iû?\1a&VÕ\9b´\1d\ 1¢¼:9»\9e»aõâËÂ.\84Ï(·öõÿ\84K\11B
+¶í\8aË\17þ,\8f\11þ\ 3åÝ\13ðendstream
+endobj
+4728 0 obj <<
+/Type /Page
+/Contents 4729 0 R
+/Resources 4727 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+4730 0 obj <<
+/D [4728 0 R /XYZ 71.731 802.878 null]
+>> endobj
+510 0 obj <<
+/D [4728 0 R /XYZ 187.959 758.046 null]
+>> endobj
+4731 0 obj <<
+/D [4728 0 R /XYZ 71.731 755.482 null]
+>> endobj
+4732 0 obj <<
+/D [4728 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4733 0 obj <<
+/D [4728 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4734 0 obj <<
+/D [4728 0 R /XYZ 71.731 740.104 null]
+>> endobj
+4735 0 obj <<
+/D [4728 0 R /XYZ 139.477 725.701 null]
+>> endobj
+514 0 obj <<
+/D [4728 0 R /XYZ 192.609 698.702 null]
+>> endobj
+4736 0 obj <<
+/D [4728 0 R /XYZ 71.731 693.747 null]
+>> endobj
+4737 0 obj <<
+/D [4728 0 R /XYZ 182.67 683.359 null]
+>> endobj
+4738 0 obj <<
+/D [4728 0 R /XYZ 138.359 657.457 null]
+>> endobj
+4739 0 obj <<
+/D [4728 0 R /XYZ 286.2 657.457 null]
+>> endobj
+4740 0 obj <<
+/D [4728 0 R /XYZ 71.731 640.777 null]
+>> endobj
+518 0 obj <<
+/D [4728 0 R /XYZ 201.133 617.506 null]
+>> endobj
+4741 0 obj <<
+/D [4728 0 R /XYZ 71.731 614.972 null]
+>> endobj
+4742 0 obj <<
+/D [4728 0 R /XYZ 302.543 602.164 null]
+>> endobj
+4743 0 obj <<
+/D [4728 0 R /XYZ 71.731 600.294 null]
+>> endobj
+522 0 obj <<
+/D [4728 0 R /XYZ 143.462 575.165 null]
+>> endobj
+4744 0 obj <<
+/D [4728 0 R /XYZ 71.731 572.631 null]
+>> endobj
+3115 0 obj <<
+/D [4728 0 R /XYZ 71.731 543.551 null]
+>> endobj
+4745 0 obj <<
+/D [4728 0 R /XYZ 71.731 530.639 null]
+>> endobj
+526 0 obj <<
+/D [4728 0 R /XYZ 286.302 508.259 null]
+>> endobj
+4746 0 obj <<
+/D [4728 0 R /XYZ 71.731 497.68 null]
+>> endobj
+4747 0 obj <<
+/D [4728 0 R /XYZ 71.731 497.68 null]
+>> endobj
+530 0 obj <<
+/D [4728 0 R /XYZ 162.317 471.963 null]
+>> endobj
+4748 0 obj <<
+/D [4728 0 R /XYZ 257.036 456.142 null]
+>> endobj
+4749 0 obj <<
+/D [4728 0 R /XYZ 71.731 454.075 null]
+>> endobj
+534 0 obj <<
+/D [4728 0 R /XYZ 174.677 430.804 null]
+>> endobj
+4750 0 obj <<
+/D [4728 0 R /XYZ 71.731 425.849 null]
+>> endobj
+4751 0 obj <<
+/D [4728 0 R /XYZ 71.731 423.458 null]
+>> endobj
+4752 0 obj <<
+/D [4728 0 R /XYZ 141.074 414.304 null]
+>> endobj
+4753 0 obj <<
+/D [4728 0 R /XYZ 244.381 414.304 null]
+>> endobj
+4754 0 obj <<
+/D [4728 0 R /XYZ 287.426 414.304 null]
+>> endobj
+4755 0 obj <<
+/D [4728 0 R /XYZ 313.252 414.304 null]
+>> endobj
+4756 0 obj <<
+/D [4728 0 R /XYZ 373.515 414.304 null]
+>> endobj
+4757 0 obj <<
+/D [4728 0 R /XYZ 71.731 400.523 null]
+>> endobj
+538 0 obj <<
+/D [4728 0 R /XYZ 187.959 375.185 null]
+>> endobj
+4758 0 obj <<
+/D [4728 0 R /XYZ 71.731 372.621 null]
+>> endobj
+4759 0 obj <<
+/D [4728 0 R /XYZ 71.731 367.839 null]
+>> endobj
+4760 0 obj <<
+/D [4728 0 R /XYZ 71.731 367.839 null]
+>> endobj
+4761 0 obj <<
+/D [4728 0 R /XYZ 71.731 357.242 null]
+>> endobj
+4762 0 obj <<
+/D [4728 0 R /XYZ 139.477 342.839 null]
+>> endobj
+4763 0 obj <<
+/D [4728 0 R /XYZ 71.731 341.895 null]
+>> endobj
+4764 0 obj <<
+/D [4728 0 R /XYZ 71.731 341.895 null]
+>> endobj
+4765 0 obj <<
+/D [4728 0 R /XYZ 71.731 328.849 null]
+>> endobj
+4766 0 obj <<
+/D [4728 0 R /XYZ 139.477 314.446 null]
+>> endobj
+4767 0 obj <<
+/D [4728 0 R /XYZ 71.731 310.718 null]
+>> endobj
+542 0 obj <<
+/D [4728 0 R /XYZ 192.609 287.447 null]
+>> endobj
+4768 0 obj <<
+/D [4728 0 R /XYZ 71.731 282.492 null]
+>> endobj
+4769 0 obj <<
+/D [4728 0 R /XYZ 180.144 272.105 null]
+>> endobj
+4770 0 obj <<
+/D [4728 0 R /XYZ 71.731 242.474 null]
+>> endobj
+546 0 obj <<
+/D [4728 0 R /XYZ 202.018 219.203 null]
+>> endobj
+4771 0 obj <<
+/D [4728 0 R /XYZ 71.731 216.669 null]
+>> endobj
+4772 0 obj <<
+/D [4728 0 R /XYZ 71.731 202.085 null]
+>> endobj
+550 0 obj <<
+/D [4728 0 R /XYZ 143.462 176.862 null]
+>> endobj
+4773 0 obj <<
+/D [4728 0 R /XYZ 71.731 174.327 null]
+>> endobj
+3116 0 obj <<
+/D [4728 0 R /XYZ 71.731 145.247 null]
+>> endobj
+4774 0 obj <<
+/D [4728 0 R /XYZ 71.731 132.336 null]
+>> endobj
+554 0 obj <<
+/D [4728 0 R /XYZ 279.296 109.956 null]
+>> endobj
+4775 0 obj <<
+/D [4728 0 R /XYZ 71.731 99.377 null]
+>> endobj
+4776 0 obj <<
+/D [4728 0 R /XYZ 71.731 99.377 null]
+>> endobj
+558 0 obj <<
+/D [4728 0 R /XYZ 162.317 73.66 null]
+>> endobj
+4777 0 obj <<
+/D [4728 0 R /XYZ 251.059 57.839 null]
+>> endobj
+4778 0 obj <<
+/D [4728 0 R /XYZ 71.731 55.772 null]
+>> endobj
+4727 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4782 0 obj <<
+/Length 1293      
+/Filter /FlateDecode
+>>
+stream
+xÚµW[o£F\14~ϯà\11Wõdn0 >e³\9bª«j[%V¥ª[E\ 4Æ6\95\rh\804þ÷=sÃ`ãl¢¶²df\863çú}3\a\12\91@\10$\18 \12LQ"\92 ß_á`\ 3o~¼"NbéD\96#\99\ f««ë;F\83\14¥1\v\80&   â<\ 6=1âq\14¬\8a?ÂÛmÖtR-\96T$!AöùsYõ/×÷«\ 5Á8\ÂlAÂþž»½ùb\a\1fUùì7~Å\11\ 61x\a#²øsõùêÓjp.¢\ 4\81\1f¯¹ïDÎܧ4 \ 4¥Q¤ý'$EQD\ 3\11%\bC\1cÚÿ\87CU7mÙj\9b×w\1c^""¸\96ÆÁ\92ÄÈFÙWm¹©da¥"|\94b        \82\ 16R\9dÜ7»¬\93\8fJf\ 5ümÊV§æLs\9a"\8c©Û¤C\1fÔ/cHØ®®6Î\109n\8a9\8abá6eE¡d;ã4Ã\88°\91\83\95\99äaI\19\85BBÚX\8a )FøFmú½¬ºv0=Ô]gB\0<ø©íq\91|rc\81\11NÈ\\95(\12q
+£Ñ«ÓçPPB)\14\14\ 6#}¶¢âè\18á\14Q(¤\97Ñîíå¾V\a\v+ïª\99tµ}êâØÑZ\ 1.ëýl\86(\8aS\ eÏ\18¥©MÐGÙæªlº²®Ü\ e1MQ\84\18\94B\8b®¶r±d\89\b×}\95\1f\11\97b\868%o\0Î$^\ 66b_^\0­1Ò·\1a9z¤CÔO\e¢q@A|0\8aÃm¦\8a¿\17\ 4\92¢¤\97²v\9c\1aë%Ä\91\ 2¤\13¦K\0é°IíL@\82\87·Z\83\9eä\v\11nËF/!»ò»a|ÝÛY»­û]aÇuµ;ØÑ6\ 3¡ðÙ)4.ÃS\16eçV¶&0\18­{¨\8fK Y(×öy¨{å\95\82\15È\86ÛÞÖ{iBÂ.\16[\9c\91\15\b\98\9fâ¡Qu®áB#\88ç\1c\14x\ 2\87{Ùõ
+ü¢\90ºß\16`.ÛõòMÀ0ÐóÀp.h]\1e§\10´\17{6JÍ°íj%\9d£euNR\92\bà4\9f; ¦Ðö\82ã`ît
+ËÝ7ýoU~íÁjÊ\9e\1f-p\90\8a\8d\ 5.P¢©Ëáø$v#A1bÈfëVcÆ\8c\1eú¦©Ug'w.%í¹\13^!x¢\9f#\8aÅa^W\9dªw;}\95\98¹\ 3¥\99\8ck­çëÁ\86\99\ eT(\03$\ 4z?y*\95\95\15é¼\9dJ¾tN©4:\90\9d\r\8e¬Çþ\ f\98³Þ\ eL`Qø¤åY\fh\93Ú³\17é×\ f\18\0,v\87Fz~Á»\ fà¥Ì3À¸\9d\17un\ eíÌq\ 4vÔë±\1a\90oì|\1c:\88m³Ö®?Iév*¹\9cq½S¥|\96Ã\89©\8f\13\83R\ fÑ,ïz`t¸³Ó\87Ïæ\84\80c\0Û\85_\17L\84rW\ e'\87\ 1³-ü÷'º¦¬ð   Ò3\11\963\17\13cÜ@Ób¾ý+Óf\9byüø«sÄl\81\9càpob\ 6g\1e\ 3NDl¢îQVÙÓN>\ 2д;\9b^e£;`\f|\ fSPBSÛ^|ÉöòüðÇ\ eÊ\97ì¬K°\ 29Íæ/\e"bsm»[\9eRa\13f\15Øñ\80"3\19»®ï<\97á}]ÈÙ#Â\19XR >KÞÖ(a\8b\97²êλ$\93êä¤N§\ 1g\93\9bò¸\97B\93\ 2µ9¶Km§ú¼³ÍR\9eU9Äùè¦ß\9d7NI\8c°Ï\95\16\9d±\0ÞEì\9bM\13OmOð¾¦\89M\fÏuL\14\ eâ\88'ÿYÇ4Òw±cò2Ú·¦\86\9aùNÜwI\13ü´\9d>ïÝPé[\19H¯ä\1c\93 \13\8b\8c\b´«|Zï¢lÿ/&\91\8b\964´Àau\89K     \ 5x\883.9\r¯\92i`èëdr\16ÞE¦÷Ré$à\8b\bÐv²ä_q)y\ 3\99ø)\99Ƹw\9f\9a\94£\14\8bW?F\8f"þ[T È$X\99êЦ~¹ýt\7fã¾?\7fzXÙ\ 1\8b\b¦ÖÇñ\87\0Pê»o\1a]øà<÷ð\1f\a\fæ¹endstream
+endobj
+4781 0 obj <<
+/Type /Page
+/Contents 4782 0 R
+/Resources 4780 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+4783 0 obj <<
+/D [4781 0 R /XYZ 71.731 802.878 null]
+>> endobj
+562 0 obj <<
+/D [4781 0 R /XYZ 174.677 758.046 null]
+>> endobj
+4784 0 obj <<
+/D [4781 0 R /XYZ 71.731 753.091 null]
+>> endobj
+4785 0 obj <<
+/D [4781 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4786 0 obj <<
+/D [4781 0 R /XYZ 158.292 741.546 null]
+>> endobj
+4787 0 obj <<
+/D [4781 0 R /XYZ 257.294 741.546 null]
+>> endobj
+4788 0 obj <<
+/D [4781 0 R /XYZ 321.861 741.546 null]
+>> endobj
+4789 0 obj <<
+/D [4781 0 R /XYZ 71.731 727.765 null]
+>> endobj
+566 0 obj <<
+/D [4781 0 R /XYZ 187.959 702.427 null]
+>> endobj
+4790 0 obj <<
+/D [4781 0 R /XYZ 71.731 699.863 null]
+>> endobj
+4791 0 obj <<
+/D [4781 0 R /XYZ 71.731 695.081 null]
+>> endobj
+4792 0 obj <<
+/D [4781 0 R /XYZ 71.731 695.081 null]
+>> endobj
+4793 0 obj <<
+/D [4781 0 R /XYZ 71.731 684.484 null]
+>> endobj
+4794 0 obj <<
+/D [4781 0 R /XYZ 139.477 670.081 null]
+>> endobj
+4795 0 obj <<
+/D [4781 0 R /XYZ 71.731 666.353 null]
+>> endobj
+570 0 obj <<
+/D [4781 0 R /XYZ 192.609 643.082 null]
+>> endobj
+4796 0 obj <<
+/D [4781 0 R /XYZ 71.731 638.127 null]
+>> endobj
+4797 0 obj <<
+/D [4781 0 R /XYZ 182.973 627.74 null]
+>> endobj
+4798 0 obj <<
+/D [4781 0 R /XYZ 71.731 598.109 null]
+>> endobj
+574 0 obj <<
+/D [4781 0 R /XYZ 202.018 574.838 null]
+>> endobj
+4799 0 obj <<
+/D [4781 0 R /XYZ 71.731 572.304 null]
+>> endobj
+4800 0 obj <<
+/D [4781 0 R /XYZ 306.996 559.496 null]
+>> endobj
+4801 0 obj <<
+/D [4781 0 R /XYZ 71.731 557.626 null]
+>> endobj
+578 0 obj <<
+/D [4781 0 R /XYZ 143.462 532.497 null]
+>> endobj
+4802 0 obj <<
+/D [4781 0 R /XYZ 71.731 529.963 null]
+>> endobj
+3117 0 obj <<
+/D [4781 0 R /XYZ 71.731 500.883 null]
+>> endobj
+582 0 obj <<
+/D [4781 0 R /XYZ 292.646 470.643 null]
+>> endobj
+4803 0 obj <<
+/D [4781 0 R /XYZ 71.731 464.697 null]
+>> endobj
+4804 0 obj <<
+/D [4781 0 R /XYZ 453.894 428.92 null]
+>> endobj
+3118 0 obj <<
+/D [4781 0 R /XYZ 71.731 426.852 null]
+>> endobj
+4805 0 obj <<
+/D [4781 0 R /XYZ 71.731 412.28 null]
+>> endobj
+586 0 obj <<
+/D [4781 0 R /XYZ 345.885 391.967 null]
+>> endobj
+4806 0 obj <<
+/D [4781 0 R /XYZ 71.731 381.388 null]
+>> endobj
+4807 0 obj <<
+/D [4781 0 R /XYZ 71.731 381.388 null]
+>> endobj
+590 0 obj <<
+/D [4781 0 R /XYZ 162.317 355.671 null]
+>> endobj
+4808 0 obj <<
+/D [4781 0 R /XYZ 292.902 339.851 null]
+>> endobj
+4809 0 obj <<
+/D [4781 0 R /XYZ 71.731 337.783 null]
+>> endobj
+594 0 obj <<
+/D [4781 0 R /XYZ 174.677 314.513 null]
+>> endobj
+4810 0 obj <<
+/D [4781 0 R /XYZ 71.731 309.557 null]
+>> endobj
+4811 0 obj <<
+/D [4781 0 R /XYZ 71.731 307.166 null]
+>> endobj
+4812 0 obj <<
+/D [4781 0 R /XYZ 136.77 298.013 null]
+>> endobj
+4813 0 obj <<
+/D [4781 0 R /XYZ 265.903 298.013 null]
+>> endobj
+4814 0 obj <<
+/D [4781 0 R /XYZ 351.993 298.013 null]
+>> endobj
+4815 0 obj <<
+/D [4781 0 R /XYZ 71.731 284.231 null]
+>> endobj
+598 0 obj <<
+/D [4781 0 R /XYZ 187.959 258.893 null]
+>> endobj
+4816 0 obj <<
+/D [4781 0 R /XYZ 71.731 256.329 null]
+>> endobj
+4817 0 obj <<
+/D [4781 0 R /XYZ 71.731 251.547 null]
+>> endobj
+4818 0 obj <<
+/D [4781 0 R /XYZ 71.731 251.547 null]
+>> endobj
+4819 0 obj <<
+/D [4781 0 R /XYZ 71.731 239.596 null]
+>> endobj
+4820 0 obj <<
+/D [4781 0 R /XYZ 139.477 226.548 null]
+>> endobj
+3119 0 obj <<
+/D [4781 0 R /XYZ 71.731 210.276 null]
+>> endobj
+4821 0 obj <<
+/D [4781 0 R /XYZ 71.731 197.364 null]
+>> endobj
+602 0 obj <<
+/D [4781 0 R /XYZ 350.671 174.984 null]
+>> endobj
+4822 0 obj <<
+/D [4781 0 R /XYZ 71.731 164.405 null]
+>> endobj
+4823 0 obj <<
+/D [4781 0 R /XYZ 71.731 164.405 null]
+>> endobj
+606 0 obj <<
+/D [4781 0 R /XYZ 162.317 138.688 null]
+>> endobj
+4824 0 obj <<
+/D [4781 0 R /XYZ 298.879 122.867 null]
+>> endobj
+4825 0 obj <<
+/D [4781 0 R /XYZ 71.731 120.8 null]
+>> endobj
+610 0 obj <<
+/D [4781 0 R /XYZ 174.677 97.529 null]
+>> endobj
+4826 0 obj <<
+/D [4781 0 R /XYZ 71.731 92.574 null]
+>> endobj
+4827 0 obj <<
+/D [4781 0 R /XYZ 71.731 90.183 null]
+>> endobj
+4828 0 obj <<
+/D [4781 0 R /XYZ 136.77 81.029 null]
+>> endobj
+4829 0 obj <<
+/D [4781 0 R /XYZ 270.208 81.029 null]
+>> endobj
+4830 0 obj <<
+/D [4781 0 R /XYZ 356.297 81.029 null]
+>> endobj
+4831 0 obj <<
+/D [4781 0 R /XYZ 71.731 67.248 null]
+>> endobj
+4780 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4834 0 obj <<
+/Length 1121      
+/Filter /FlateDecode
+>>
+stream
+xÚ½WY\8fÛ6\10~ß_¡G¹\88¹<ÄCÈÓv\93-Z\14)°1úÒ\r\16\8aL{ÕØ\92¡c»ù÷\1d^:Ör\9c\0\a\93Ô\1cß7\9cá\90$Âð#\91$H2\12)L\91\92*Ê÷W8ÚÂ\97\88\97Xz\91åHæçÕÕõ\1d£Q\8aRÁ¢Õ&¢J¡$\11`G Dðhµþ+¾}Ê\ e­®\17K*UL\90ûÿ½(»\97ëûÕ\82`\1c/a¶ q÷â¾ÝÞ|p\83wuñ\1c\14\1f0Ç \ 6ß`D\16\9fV¿]½_õà8%\bp|\v¾\179\82OiD\bJ97ø I\11ç4\92\!\f<\fþ\9bzÛíuÙ6Æéõ\1d'\ 3]\1c-\89\84¨0+\98?\15\87×Àz\83\94#\89É\1c2\8a¤Ha4úôú¿'A(\ 5\12f3\ 6{\8e\85\1cP\91\84"
\83\8cÁv¨\8a²ß\84¶rÿùBÆ\ 6³\9d4mÖê0¬;Ø\8f¼íjíH\9b ID\89\rÒRbÄa¸ä\ 4q\91XûÍß\19ì$><\9a <æUù\80\ eÊ  b&\9c\9b(\91H\19\ 2\9aº\0\7fÈöÞMB§±åVvÖþ¦\bÖÇÌ}x°Õy Tz¢Y9Ã8 ìê¬-ªr\0Û§Ã\10o\b%cÊ\9aýøµ¬\ eMÑô\90%"2     \90\ 5rY\ fáöù\82\a\ 1\eCåá\9d¦4¶\99bÄR\16\18A\11\98ÍÉÛÅR@á\0/«ì§?õ\19Ú«+\81°J½zHЩ\a\ 3\8a'\83\aòv.\12\94`\18'°q)\82¤¾\ep¬\90$òb\951²w²2\82Ì\85*c\14%\8aD
+A¢\ 2¥©K\97wºÉëâ0Ê0ù:ÉYâ´z\82¬Z²\84Ç\9b®Ì­\ 6Ì\84ITpêsU7~1@4òY¹v«\a\10¬õ!ëÅ\8aÖ[¬j·\0µFâ¦É¶ÚÍÛ:+\9b}Ñ4Þ]o\8c\83¡\[àÈ ·`)P%\1e,\18\10\8c\8e°
+Æ@§Ñ\90\10öK\80HTü&|5ν\0\8b÷YóÅ\e1ðÌR\96\e\9f\90×Þzµñë ¸Ûy5mñ{/\9f¿ºÕ<sß©ÙÅÙãÄ\80§ÓÚÓ/­.×zýh¡\1c\1f\1d\®8\ 6¦Tù0\99Aû¤ýR^í\ 1æ¡k\r\89\8cãlF\9f³n]»\84\82Ù?EûäF]ã\97\80±\89ö2ø\1e\a½GpÄ/ÁP,âõÑb\9c=ZoÇÔ°D<\95^\ 3Í\9e~\89B\f¤]:»\9a¿×\90û\96®\8cÿ\È$Îv\9d>\9dØ.Ü¥ÞÂ\11ûì\8bèÙªØ!¤jUÛÈH\19ëº\86,0\17\8294x\ 2ãÎ$U±ÓçJª©óë\10\r£\82ò¹\86\16\9a\92mhì|\86\²¡}G\ 6R)\8eZ\1a$TçÏ'S"æ?Xr30\a¹øÅMlyÙUíKßÝ©0ÝÁÙW\94ÛÙí÷®ÿÓæ7C\7fÒþR\ 4 ÿ·ö÷ÆYêʦØ\96&\92f¶«B|Ʀ\85\82kd¸jäÕZÏ\9bî\19ÿ¨é@z>.`:9ß´Y
+c¸ëþ`ÓNÎ6m\ 2)¡¸¸XÓ\1eÙ;Ù´\83Ì\ 5\9aö\98tß³        CR\91ÉvÎQO!ò y)æ\83¹\93Ľ\88\ 5\16\93:\1e÷Lw±\ 5ºë³\é$¿æ¸
+¨> t)®\83¹\93\½È÷s5\rw\86\81\7f¬Ò\ 4¥X~ó9;\88\84׬\84\9a1\98¦6\f¤?nßßßø\17ì¯\1fWnÀ8ÁÔÅzü\14N\98\82WR8 ¨8ñd=Fø/\8f\93Ô3endstream
+endobj
+4833 0 obj <<
+/Type /Page
+/Contents 4834 0 R
+/Resources 4832 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+4835 0 obj <<
+/D [4833 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4836 0 obj <<
+/D [4833 0 R /XYZ 71.731 814.833 null]
+>> endobj
+614 0 obj <<
+/D [4833 0 R /XYZ 187.959 758.046 null]
+>> endobj
+4837 0 obj <<
+/D [4833 0 R /XYZ 71.731 755.482 null]
+>> endobj
+4838 0 obj <<
+/D [4833 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4839 0 obj <<
+/D [4833 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4840 0 obj <<
+/D [4833 0 R /XYZ 71.731 738.749 null]
+>> endobj
+4841 0 obj <<
+/D [4833 0 R /XYZ 139.477 725.701 null]
+>> endobj
+3120 0 obj <<
+/D [4833 0 R /XYZ 71.731 709.429 null]
+>> endobj
+4842 0 obj <<
+/D [4833 0 R /XYZ 71.731 696.517 null]
+>> endobj
+618 0 obj <<
+/D [4833 0 R /XYZ 258.552 674.137 null]
+>> endobj
+4843 0 obj <<
+/D [4833 0 R /XYZ 71.731 663.558 null]
+>> endobj
+4844 0 obj <<
+/D [4833 0 R /XYZ 71.731 663.558 null]
+>> endobj
+622 0 obj <<
+/D [4833 0 R /XYZ 162.317 637.841 null]
+>> endobj
+4845 0 obj <<
+/D [4833 0 R /XYZ 239.103 622.02 null]
+>> endobj
+4846 0 obj <<
+/D [4833 0 R /XYZ 71.731 619.953 null]
+>> endobj
+626 0 obj <<
+/D [4833 0 R /XYZ 174.677 596.682 null]
+>> endobj
+4847 0 obj <<
+/D [4833 0 R /XYZ 71.731 591.727 null]
+>> endobj
+4848 0 obj <<
+/D [4833 0 R /XYZ 71.731 589.336 null]
+>> endobj
+4849 0 obj <<
+/D [4833 0 R /XYZ 136.77 580.182 null]
+>> endobj
+4850 0 obj <<
+/D [4833 0 R /XYZ 227.163 580.182 null]
+>> endobj
+4851 0 obj <<
+/D [4833 0 R /XYZ 313.252 580.182 null]
+>> endobj
+4852 0 obj <<
+/D [4833 0 R /XYZ 71.731 566.401 null]
+>> endobj
+630 0 obj <<
+/D [4833 0 R /XYZ 187.959 541.063 null]
+>> endobj
+4853 0 obj <<
+/D [4833 0 R /XYZ 71.731 538.499 null]
+>> endobj
+4854 0 obj <<
+/D [4833 0 R /XYZ 71.731 533.717 null]
+>> endobj
+4855 0 obj <<
+/D [4833 0 R /XYZ 71.731 533.717 null]
+>> endobj
+4856 0 obj <<
+/D [4833 0 R /XYZ 71.731 521.765 null]
+>> endobj
+4857 0 obj <<
+/D [4833 0 R /XYZ 139.477 508.717 null]
+>> endobj
+4858 0 obj <<
+/D [4833 0 R /XYZ 71.731 504.989 null]
+>> endobj
+634 0 obj <<
+/D [4833 0 R /XYZ 192.609 481.719 null]
+>> endobj
+4859 0 obj <<
+/D [4833 0 R /XYZ 71.731 476.763 null]
+>> endobj
+4860 0 obj <<
+/D [4833 0 R /XYZ 119.552 440.473 null]
+>> endobj
+4861 0 obj <<
+/D [4833 0 R /XYZ 160.318 427.522 null]
+>> endobj
+4862 0 obj <<
+/D [4833 0 R /XYZ 71.731 424.297 null]
+>> endobj
+638 0 obj <<
+/D [4833 0 R /XYZ 202.018 400.523 null]
+>> endobj
+4863 0 obj <<
+/D [4833 0 R /XYZ 71.731 397.989 null]
+>> endobj
+4864 0 obj <<
+/D [4833 0 R /XYZ 71.731 381.453 null]
+>> endobj
+642 0 obj <<
+/D [4833 0 R /XYZ 143.462 358.182 null]
+>> endobj
+4865 0 obj <<
+/D [4833 0 R /XYZ 71.731 355.647 null]
+>> endobj
+3121 0 obj <<
+/D [4833 0 R /XYZ 71.731 326.567 null]
+>> endobj
+4866 0 obj <<
+/D [4833 0 R /XYZ 71.731 313.656 null]
+>> endobj
+646 0 obj <<
+/D [4833 0 R /XYZ 294.584 291.276 null]
+>> endobj
+4867 0 obj <<
+/D [4833 0 R /XYZ 71.731 280.697 null]
+>> endobj
+4868 0 obj <<
+/D [4833 0 R /XYZ 71.731 280.697 null]
+>> endobj
+650 0 obj <<
+/D [4833 0 R /XYZ 162.317 254.98 null]
+>> endobj
+4869 0 obj <<
+/D [4833 0 R /XYZ 251.059 239.159 null]
+>> endobj
+4870 0 obj <<
+/D [4833 0 R /XYZ 71.731 237.092 null]
+>> endobj
+654 0 obj <<
+/D [4833 0 R /XYZ 174.677 213.821 null]
+>> endobj
+4871 0 obj <<
+/D [4833 0 R /XYZ 71.731 208.866 null]
+>> endobj
+4872 0 obj <<
+/D [4833 0 R /XYZ 71.731 206.475 null]
+>> endobj
+4873 0 obj <<
+/D [4833 0 R /XYZ 136.77 197.321 null]
+>> endobj
+4874 0 obj <<
+/D [4833 0 R /XYZ 235.772 197.321 null]
+>> endobj
+4875 0 obj <<
+/D [4833 0 R /XYZ 321.861 197.321 null]
+>> endobj
+4876 0 obj <<
+/D [4833 0 R /XYZ 347.724 197.321 null]
+>> endobj
+4877 0 obj <<
+/D [4833 0 R /XYZ 407.986 197.321 null]
+>> endobj
+4878 0 obj <<
+/D [4833 0 R /XYZ 433.813 197.321 null]
+>> endobj
+4879 0 obj <<
+/D [4833 0 R /XYZ 494.076 197.321 null]
+>> endobj
+4880 0 obj <<
+/D [4833 0 R /XYZ 71.731 183.54 null]
+>> endobj
+658 0 obj <<
+/D [4833 0 R /XYZ 187.959 158.202 null]
+>> endobj
+4881 0 obj <<
+/D [4833 0 R /XYZ 71.731 155.637 null]
+>> endobj
+4882 0 obj <<
+/D [4833 0 R /XYZ 71.731 150.855 null]
+>> endobj
+4883 0 obj <<
+/D [4833 0 R /XYZ 71.731 150.855 null]
+>> endobj
+4884 0 obj <<
+/D [4833 0 R /XYZ 71.731 138.904 null]
+>> endobj
+4885 0 obj <<
+/D [4833 0 R /XYZ 139.477 125.856 null]
+>> endobj
+4886 0 obj <<
+/D [4833 0 R /XYZ 71.731 122.959 null]
+>> endobj
+4887 0 obj <<
+/D [4833 0 R /XYZ 71.731 122.959 null]
+>> endobj
+4888 0 obj <<
+/D [4833 0 R /XYZ 71.731 111.866 null]
+>> endobj
+4889 0 obj <<
+/D [4833 0 R /XYZ 139.477 97.463 null]
+>> endobj
+4890 0 obj <<
+/D [4833 0 R /XYZ 71.731 94.566 null]
+>> endobj
+4891 0 obj <<
+/D [4833 0 R /XYZ 71.731 94.566 null]
+>> endobj
+4892 0 obj <<
+/D [4833 0 R /XYZ 71.731 83.472 null]
+>> endobj
+4893 0 obj <<
+/D [4833 0 R /XYZ 139.477 69.069 null]
+>> endobj
+4894 0 obj <<
+/D [4833 0 R /XYZ 71.731 65.341 null]
+>> endobj
+4832 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4897 0 obj <<
+/Length 1213      
+/Filter /FlateDecode
+>>
+stream
+xÚÕX]oÛ6\14}ϯÐË\0{\9d\19ñ\9bÂ\9e\924麥I\10\e{Y\aC\91\15G©-yúH\9bþú]\8a\94DGrâvÙ\80!@$\99÷\1eÞ{xyx%ìùð\87=\89\91¤ØS>AJ*/Z\1føÞ\12\1d`k1±&\13ÇæxvpxF\89\17 @Povë\11¥\10c\ 2p\ 4b\82{³Å\1f£\93»pSÆùxB¤\1aad®çIZ}9¼\9e\8d±ï\8f&ð4Æ£ê\8b\19;9º07oóä¡qüès\1fÌ`\fîðøÏÙ¯\a§³68N0\828\9e\vß\9aôÂ'ÄÃ\18\ 5\9cëø1\ e\10çÄ\93\!\1fòÐñ_Çe\95§\10\85\92£ßÇ\92\8dÂU\15ë\0ÀWv©ûÞ\ 4sD\19©\9dÒx\19\96\10½    þ¡v©oóx\93åe¡\1fä(Îó,¯)@\16Ð\r\ 6\10\89@A\10Ô\88gc¬FÉêÅ\99\8b<:,îC\0õ7Ú\ 5E\1d´D\ 4×Ð\13&\91"\9a\15\8c¸`ÆÑ:ÍoÂj1ÏÃ2î\1c\19À\víØøQ\81H`ø¹\b×Ö\92\91§AiÛg±\9d40ö\11\15\ 2<µÇGB¤a¬\88Ks\13eëu\95&\11\10\9b¥\86ÀM\98ÃìP]Å\98ðA\12'\rì\84\0GTÕàÓÇ4Û\14\86-\11\96¬    [ S¸IZ\1a\ 3îw\ 65\87Ê\ 6¹+-\17QÁ¶Q¬É
+ª¸(ó*\82\94\ 4,{\14¦Ñ]²\99ÛÇ\1fí|Øq\17È\ f¬·6íO #âÔ\9aüd\80ºÐ\1d(¢×CZÃá`·²Û\e+Zeѧ>\18l8É\83}ÁDËéç\81¸(â\ 1ÿÖ¸\8ap½YÍ7e\1f\8f2Ĩhñ`\1cJ: H×I\02!\9f\14\0ÞAÑí*\\16\83\99s¨ÂvÍñÏC\95I\15\ 2s\98\17\81ìÔ¦Gù²ZÇiY´Óní'    \ 2L·*ÁÕÀF»\98\87ë\80\b\12$\85^\10gèéµÕKL\b\10\81µT´xF0Ý=Ë\b\f\8d\8d\8em\93\ 1o\8dl\97\99Ý»c9Ò1\9b\1d]êâ³·y\ 5Ò\1f\81ÄÆý¤'\10\83\b\80#X\7f©ðVá\ e¦Î8\12Pr¯\96z\87·;uk£cÓ2`e¾Í0IÍõ\97¯ûå×n¦Á\ 4uõÁ¹új     vx»\13´6u½çñ_U\9cF\8f&§ìÖ®¢ÑÁn©!\aøÿÉ\88´Ã@{\94¿\9f\1eY\88"²<\15¶C`\14+\0k\8eù\97\19³\8a\17\85~DÉ×Û\v\ eÞN¾\1a\9b:´Ç´®ü<K\93¯í¹¥F÷ÕÚî\85ÏÉ¢\84\rp×QãOh\9d{ýÃ&\8f\8b(\Å\8bAná\87Çú§¸x\89*ÒSÄA¾\84\8fØp\ 3õ}|ux»ù²6m|vãÔ:²½\87~pY¶Fê\1a\83&¡è\ 6gÓÓwø\rÖÃ\87ݳþOÞ\90\8eÜ\¯È~5Ö
+ý k\94 _½Þ®tðv³fmÌ       ã\93xµ(ú]\18\91\88úÍau<»ÆóéÑ\87~ëUwuîi¸\8dÂ\11§Í9~yòáòíi\1f\82ÂÁ+ľ\18W\97ç}\b\12 ¥Ô¾\10³«\ 1\ 4\8a\ 2¼7ÀÅ?\ 289ÿm~yv6@&F\8a±=A\8e¯\86:\ 3\ 2]\1fÓ½\81Óÿÿo^Cè÷¾\86Ðí\9e:\8fÃÅ¿ð\ 6âÀ:Á+£AOß=´±Õ\95\1a¼H iIn*-Û±\1dÌRËkfû\9eu\96·LG1¬\80u^ÇE\11.\e¹Þ^u\e÷¿¨<dÉ¢ÿ¦²Õ\84\ e¤ï¢\81\ 4\13Aþã\97\14w\8eu±Ìnî÷\9c\ 2,\af °uéÓ\9eÛ\95\ 1\830\14øòÙO\1c\9d\85C¢@êY¶1\8c\90\9c^\1fÙ¯\1aï§3sC9ö\89\89Ñý< åg¢\11\18(²áÏ\18ý\bÿ\ 6\90Î-\96endstream
+endobj
+4896 0 obj <<
+/Type /Page
+/Contents 4897 0 R
+/Resources 4895 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+4898 0 obj <<
+/D [4896 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4899 0 obj <<
+/D [4896 0 R /XYZ 71.731 814.833 null]
+>> endobj
+662 0 obj <<
+/D [4896 0 R /XYZ 202.018 758.046 null]
+>> endobj
+4900 0 obj <<
+/D [4896 0 R /XYZ 71.731 755.512 null]
+>> endobj
+666 0 obj <<
+/D [4896 0 R /XYZ 143.462 715.705 null]
+>> endobj
+4901 0 obj <<
+/D [4896 0 R /XYZ 71.731 713.171 null]
+>> endobj
+3122 0 obj <<
+/D [4896 0 R /XYZ 71.731 684.091 null]
+>> endobj
+4902 0 obj <<
+/D [4896 0 R /XYZ 71.731 671.179 null]
+>> endobj
+670 0 obj <<
+/D [4896 0 R /XYZ 246.759 648.799 null]
+>> endobj
+4903 0 obj <<
+/D [4896 0 R /XYZ 71.731 638.22 null]
+>> endobj
+4904 0 obj <<
+/D [4896 0 R /XYZ 71.731 638.22 null]
+>> endobj
+674 0 obj <<
+/D [4896 0 R /XYZ 162.317 612.503 null]
+>> endobj
+4905 0 obj <<
+/D [4896 0 R /XYZ 227.148 596.682 null]
+>> endobj
+4906 0 obj <<
+/D [4896 0 R /XYZ 71.731 594.615 null]
+>> endobj
+678 0 obj <<
+/D [4896 0 R /XYZ 174.677 571.344 null]
+>> endobj
+4907 0 obj <<
+/D [4896 0 R /XYZ 71.731 566.389 null]
+>> endobj
+4908 0 obj <<
+/D [4896 0 R /XYZ 71.731 563.998 null]
+>> endobj
+4909 0 obj <<
+/D [4896 0 R /XYZ 136.77 554.844 null]
+>> endobj
+4910 0 obj <<
+/D [4896 0 R /XYZ 218.554 554.844 null]
+>> endobj
+4911 0 obj <<
+/D [4896 0 R /XYZ 304.643 554.844 null]
+>> endobj
+4912 0 obj <<
+/D [4896 0 R /XYZ 330.506 554.844 null]
+>> endobj
+4913 0 obj <<
+/D [4896 0 R /XYZ 347.724 554.844 null]
+>> endobj
+4914 0 obj <<
+/D [4896 0 R /XYZ 373.551 554.844 null]
+>> endobj
+4915 0 obj <<
+/D [4896 0 R /XYZ 390.769 554.844 null]
+>> endobj
+4916 0 obj <<
+/D [4896 0 R /XYZ 421.136 554.844 null]
+>> endobj
+4917 0 obj <<
+/D [4896 0 R /XYZ 438.354 554.844 null]
+>> endobj
+4918 0 obj <<
+/D [4896 0 R /XYZ 460.558 554.844 null]
+>> endobj
+4919 0 obj <<
+/D [4896 0 R /XYZ 477.776 554.844 null]
+>> endobj
+4920 0 obj <<
+/D [4896 0 R /XYZ 119.552 545.517 null]
+>> endobj
+4921 0 obj <<
+/D [4896 0 R /XYZ 136.77 545.517 null]
+>> endobj
+4922 0 obj <<
+/D [4896 0 R /XYZ 71.731 531.736 null]
+>> endobj
+682 0 obj <<
+/D [4896 0 R /XYZ 187.959 506.398 null]
+>> endobj
+4923 0 obj <<
+/D [4896 0 R /XYZ 71.731 503.834 null]
+>> endobj
+4924 0 obj <<
+/D [4896 0 R /XYZ 71.731 499.052 null]
+>> endobj
+4925 0 obj <<
+/D [4896 0 R /XYZ 71.731 499.052 null]
+>> endobj
+4926 0 obj <<
+/D [4896 0 R /XYZ 71.731 487.1 null]
+>> endobj
+4927 0 obj <<
+/D [4896 0 R /XYZ 139.477 474.052 null]
+>> endobj
+4928 0 obj <<
+/D [4896 0 R /XYZ 71.731 471.155 null]
+>> endobj
+4929 0 obj <<
+/D [4896 0 R /XYZ 71.731 471.155 null]
+>> endobj
+4930 0 obj <<
+/D [4896 0 R /XYZ 71.731 460.062 null]
+>> endobj
+4931 0 obj <<
+/D [4896 0 R /XYZ 139.477 445.659 null]
+>> endobj
+4932 0 obj <<
+/D [4896 0 R /XYZ 71.731 444.714 null]
+>> endobj
+4933 0 obj <<
+/D [4896 0 R /XYZ 71.731 444.714 null]
+>> endobj
+4934 0 obj <<
+/D [4896 0 R /XYZ 71.731 431.668 null]
+>> endobj
+4935 0 obj <<
+/D [4896 0 R /XYZ 139.477 417.265 null]
+>> endobj
+4936 0 obj <<
+/D [4896 0 R /XYZ 71.731 414.368 null]
+>> endobj
+4937 0 obj <<
+/D [4896 0 R /XYZ 71.731 414.368 null]
+>> endobj
+4938 0 obj <<
+/D [4896 0 R /XYZ 71.731 401.92 null]
+>> endobj
+4939 0 obj <<
+/D [4896 0 R /XYZ 139.477 388.872 null]
+>> endobj
+4940 0 obj <<
+/D [4896 0 R /XYZ 71.731 385.975 null]
+>> endobj
+4941 0 obj <<
+/D [4896 0 R /XYZ 71.731 385.975 null]
+>> endobj
+4942 0 obj <<
+/D [4896 0 R /XYZ 71.731 373.526 null]
+>> endobj
+4943 0 obj <<
+/D [4896 0 R /XYZ 139.477 360.478 null]
+>> endobj
+4944 0 obj <<
+/D [4896 0 R /XYZ 71.731 357.581 null]
+>> endobj
+4945 0 obj <<
+/D [4896 0 R /XYZ 71.731 357.581 null]
+>> endobj
+4946 0 obj <<
+/D [4896 0 R /XYZ 71.731 345.133 null]
+>> endobj
+4947 0 obj <<
+/D [4896 0 R /XYZ 139.477 332.085 null]
+>> endobj
+4948 0 obj <<
+/D [4896 0 R /XYZ 169.554 332.085 null]
+>> endobj
+4949 0 obj <<
+/D [4896 0 R /XYZ 222.913 332.085 null]
+>> endobj
+4950 0 obj <<
+/D [4896 0 R /XYZ 264.318 332.085 null]
+>> endobj
+4951 0 obj <<
+/D [4896 0 R /XYZ 299.745 332.085 null]
+>> endobj
+4952 0 obj <<
+/D [4896 0 R /XYZ 329.194 332.085 null]
+>> endobj
+4953 0 obj <<
+/D [4896 0 R /XYZ 358.644 332.085 null]
+>> endobj
+4954 0 obj <<
+/D [4896 0 R /XYZ 406.026 332.085 null]
+>> endobj
+4955 0 obj <<
+/D [4896 0 R /XYZ 71.731 328.556 null]
+>> endobj
+686 0 obj <<
+/D [4896 0 R /XYZ 202.018 305.086 null]
+>> endobj
+4956 0 obj <<
+/D [4896 0 R /XYZ 71.731 302.552 null]
+>> endobj
+4957 0 obj <<
+/D [4896 0 R /XYZ 71.731 286.016 null]
+>> endobj
+690 0 obj <<
+/D [4896 0 R /XYZ 143.462 262.745 null]
+>> endobj
+4958 0 obj <<
+/D [4896 0 R /XYZ 71.731 260.21 null]
+>> endobj
+3123 0 obj <<
+/D [4896 0 R /XYZ 71.731 231.13 null]
+>> endobj
+4959 0 obj <<
+/D [4896 0 R /XYZ 71.731 218.219 null]
+>> endobj
+694 0 obj <<
+/D [4896 0 R /XYZ 197.351 195.839 null]
+>> endobj
+4960 0 obj <<
+/D [4896 0 R /XYZ 71.731 185.26 null]
+>> endobj
+4961 0 obj <<
+/D [4896 0 R /XYZ 71.731 185.26 null]
+>> endobj
+698 0 obj <<
+/D [4896 0 R /XYZ 162.317 159.543 null]
+>> endobj
+4962 0 obj <<
+/D [4896 0 R /XYZ 197.26 143.722 null]
+>> endobj
+4963 0 obj <<
+/D [4896 0 R /XYZ 71.731 141.655 null]
+>> endobj
+702 0 obj <<
+/D [4896 0 R /XYZ 174.677 118.384 null]
+>> endobj
+4964 0 obj <<
+/D [4896 0 R /XYZ 71.731 113.429 null]
+>> endobj
+4965 0 obj <<
+/D [4896 0 R /XYZ 71.731 111.038 null]
+>> endobj
+4966 0 obj <<
+/D [4896 0 R /XYZ 141.074 101.884 null]
+>> endobj
+4967 0 obj <<
+/D [4896 0 R /XYZ 201.336 101.884 null]
+>> endobj
+4968 0 obj <<
+/D [4896 0 R /XYZ 287.426 101.884 null]
+>> endobj
+4969 0 obj <<
+/D [4896 0 R /XYZ 313.288 101.884 null]
+>> endobj
+4970 0 obj <<
+/D [4896 0 R /XYZ 390.769 101.884 null]
+>> endobj
+4971 0 obj <<
+/D [4896 0 R /XYZ 71.731 88.103 null]
+>> endobj
+4895 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+4974 0 obj <<
+/Length 960       
+/Filter /FlateDecode
+>>
+stream
+xÚÅW[oÛ6\14~ϯУ]Ì\f\ f\82=¥Y3l\18º!5ö²\14\81ªÈ®\8aê2Iκ\7f¿C\91ºÄ\96â\ eUPøÁ\14t.ßwxø\1d\11\ 2\8a?\b\14\10Å!Ð\94\11­t\10g\174Øã\9b\9f/À[l¼Éfdóz{qyÃY`\88\91<Øî\ 2¦5\11Bb\1cI\84\f\83íÃ_«ë\8fQÙ$ÕzÃ\94^\ 1qÿ¿¥ùáËåív\r\94®6ø´\86Õá\8b{w}õÖ-~ªÒÇÎñ\8e\86\14Íð\1d®`ý~ûëÅ\9bm\ f.d@\10Çsð½É |Æ\ 2\0bÂÐâ\a0$\fY BM(ò°ø¯ªý!Kò¦¶I/oB\18èÒ`\ 3
+«Â[ÃøcZ\1e\ 3ë\ 3²\90(
+SÈ\18QÒàjôêø¿'\ 1\8c!        »\19C<ÇB\r¨@0Â\10|gc±\95E\9a÷\9bÐ\14î?^«\95ÅÜ>ÔMÔ$ݲ:à~ÄÍ¡JNIo\10\834\ 2Áp¢4kÃ\17\1f>Í1\97F\11NÕbÌGñf\99w6-ó   â×kЫ®Ë²¤®£½§þ·%\9e\1cüS\9aï\8a*\8b\9a´È]\1d\9e4K_\b&\891¦Ívc#§\9f}ÙÆØl¯\84\84\vW°º\8a/ëO\11v?-­\v\89\87\ 4\8a0p       \84"Úr\ e\81\84R8Gït_VÉ}\95D\ f÷q\91ßQÊöC\0\81\rÐùsI\98qÝü6Ê<8Á\8eÁùÍ\9cL±K÷§\9c@``n÷ÈúÝ1¦\Ýб\8cª¤\9e(0vJ\12c\8d\e÷\88õ\9d\928)çªÞ%Ý`{s®ÛÔïþÍ\8b²Në\9e\99" DÇL\12§DØ        ¾\9dé`Ð\96[{
+ÏS\1fÇ\ 5ª\88\84\9e\93=51Ò\92¨hq\94[5¸÷\8f¯úSÔûkI¨6Þ½S\8e£\14\88,\14Þä\a\17i\9c$«÷XͯÍá\8fèQ
+F\f\88\81\ 4ü8UqάC\88\vC\80-'\8a\82+b4_L\1aFñf¥¡³ù¾¢((þãÖ,Æ|\887ÏÜÛÌ2?=§í!UÇU\18\95à¬\1eÞ&h\9c£¯V«?×J¬¢Ï\87³â\98'{ÔÜG\9fò±uñºP\16US;TIU¡xØï\aÿMñÇ\9a«UQ§\93®iþ\90ÆHÃkR\9aeÉCÚÓ²\82\83\9bë4Çñß=-\8aÕè       Îô;ªÿ?UÚ$\8bÊ?<\93d\97b\81¦f@\88íEÍÿ\9b\ 1\18ªk¯¹\19ÐTQ^gi]Ï\8d\ 1\9f÷ÅÇÀ¨\ 2SsÀB\ 2ùâs\80\7fã\1c8?\ 6¦3 -6\10\a"\14ÖڠܸÏ*d\86y\9fI\8aÍÇE\97\15M'²r\8cÆÎ\r\1fI\89Tàf\ f\98å\86\8fÑ$ÄC±\94\ 2\ fáf\ 5Ø\9b¼èä\81s\93GQ<5Ë\8dÜ!Üü5Ä\99,7vÆ´ü¥\94        b¦ï\18ýµu0én­ø! ,Ч1,Î߯ßÜ^ù©òË»­[ð\10(sõ\1f_y\ 5Çmí?\ 4\99\9e¹\9a\9e\ fö,ÅJendstream
+endobj
+4973 0 obj <<
+/Type /Page
+/Contents 4974 0 R
+/Resources 4972 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+4975 0 obj <<
+/D [4973 0 R /XYZ 71.731 802.878 null]
+>> endobj
+4976 0 obj <<
+/D [4973 0 R /XYZ 71.731 814.833 null]
+>> endobj
+706 0 obj <<
+/D [4973 0 R /XYZ 187.959 758.046 null]
+>> endobj
+4977 0 obj <<
+/D [4973 0 R /XYZ 71.731 755.482 null]
+>> endobj
+4978 0 obj <<
+/D [4973 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4979 0 obj <<
+/D [4973 0 R /XYZ 71.731 750.7 null]
+>> endobj
+4980 0 obj <<
+/D [4973 0 R /XYZ 71.731 738.749 null]
+>> endobj
+4981 0 obj <<
+/D [4973 0 R /XYZ 139.477 725.701 null]
+>> endobj
+4982 0 obj <<
+/D [4973 0 R /XYZ 71.731 710.355 null]
+>> endobj
+4983 0 obj <<
+/D [4973 0 R /XYZ 139.477 697.307 null]
+>> endobj
+4984 0 obj <<
+/D [4973 0 R /XYZ 71.731 693.579 null]
+>> endobj
+710 0 obj <<
+/D [4973 0 R /XYZ 143.462 670.308 null]
+>> endobj
+4985 0 obj <<
+/D [4973 0 R /XYZ 71.731 667.774 null]
+>> endobj
+3124 0 obj <<
+/D [4973 0 R /XYZ 71.731 638.694 null]
+>> endobj
+4986 0 obj <<
+/D [4973 0 R /XYZ 71.731 625.782 null]
+>> endobj
+714 0 obj <<
+/D [4973 0 R /XYZ 299.06 603.402 null]
+>> endobj
+4987 0 obj <<
+/D [4973 0 R /XYZ 71.731 592.823 null]
+>> endobj
+4988 0 obj <<
+/D [4973 0 R /XYZ 71.731 592.823 null]
+>> endobj
+718 0 obj <<
+/D [4973 0 R /XYZ 162.317 567.106 null]
+>> endobj
+4989 0 obj <<
+/D [4973 0 R /XYZ 263.014 551.286 null]
+>> endobj
+4990 0 obj <<
+/D [4973 0 R /XYZ 71.731 549.219 null]
+>> endobj
+722 0 obj <<
+/D [4973 0 R /XYZ 174.677 525.948 null]
+>> endobj
+4991 0 obj <<
+/D [4973 0 R /XYZ 71.731 520.992 null]
+>> endobj
+4992 0 obj <<
+/D [4973 0 R /XYZ 71.731 518.601 null]
+>> endobj
+4993 0 obj <<
+/D [4973 0 R /XYZ 136.77 509.448 null]
+>> endobj
+4994 0 obj <<
+/D [4973 0 R /XYZ 244.381 509.448 null]
+>> endobj
+4995 0 obj <<
+/D [4973 0 R /XYZ 330.47 509.448 null]
+>> endobj
+4996 0 obj <<
+/D [4973 0 R /XYZ 356.333 509.448 null]
+>> endobj
+4997 0 obj <<
+/D [4973 0 R /XYZ 433.813 509.448 null]
+>> endobj
+4998 0 obj <<
+/D [4973 0 R /XYZ 71.731 495.666 null]
+>> endobj
+726 0 obj <<
+/D [4973 0 R /XYZ 187.959 470.328 null]
+>> endobj
+4999 0 obj <<
+/D [4973 0 R /XYZ 71.731 467.764 null]
+>> endobj
+5000 0 obj <<
+/D [4973 0 R /XYZ 71.731 462.982 null]
+>> endobj
+5001 0 obj <<
+/D [4973 0 R /XYZ 71.731 462.982 null]
+>> endobj
+5002 0 obj <<
+/D [4973 0 R /XYZ 71.731 451.031 null]
+>> endobj
+5003 0 obj <<
+/D [4973 0 R /XYZ 139.477 437.983 null]
+>> endobj
+5004 0 obj <<
+/D [4973 0 R /XYZ 71.731 435.086 null]
+>> endobj
+5005 0 obj <<
+/D [4973 0 R /XYZ 71.731 435.086 null]
+>> endobj
+5006 0 obj <<
+/D [4973 0 R /XYZ 71.731 422.637 null]
+>> endobj
+5007 0 obj <<
+/D [4973 0 R /XYZ 139.477 409.589 null]
+>> endobj
+5008 0 obj <<
+/D [4973 0 R /XYZ 71.731 405.861 null]
+>> endobj
+730 0 obj <<
+/D [4973 0 R /XYZ 202.018 382.59 null]
+>> endobj
+5009 0 obj <<
+/D [4973 0 R /XYZ 71.731 380.056 null]
+>> endobj
+5010 0 obj <<
+/D [4973 0 R /XYZ 71.731 363.52 null]
+>> endobj
+734 0 obj <<
+/D [4973 0 R /XYZ 143.462 340.249 null]
+>> endobj
+5011 0 obj <<
+/D [4973 0 R /XYZ 71.731 337.715 null]
+>> endobj
+3125 0 obj <<
+/D [4973 0 R /XYZ 71.731 308.635 null]
+>> endobj
+5012 0 obj <<
+/D [4973 0 R /XYZ 71.731 295.723 null]
+>> endobj
+738 0 obj <<
+/D [4973 0 R /XYZ 306.066 273.343 null]
+>> endobj
+5013 0 obj <<
+/D [4973 0 R /XYZ 71.731 262.764 null]
+>> endobj
+5014 0 obj <<
+/D [4973 0 R /XYZ 71.731 262.764 null]
+>> endobj
+742 0 obj <<
+/D [4973 0 R /XYZ 162.317 237.047 null]
+>> endobj
+5015 0 obj <<
+/D [4973 0 R /XYZ 268.991 221.226 null]
+>> endobj
+5016 0 obj <<
+/D [4973 0 R /XYZ 71.731 219.159 null]
+>> endobj
+746 0 obj <<
+/D [4973 0 R /XYZ 174.677 195.888 null]
+>> endobj
+5017 0 obj <<
+/D [4973 0 R /XYZ 71.731 190.933 null]
+>> endobj
+5018 0 obj <<
+/D [4973 0 R /XYZ 71.731 188.542 null]
+>> endobj
+5019 0 obj <<
+/D [4973 0 R /XYZ 136.77 179.388 null]
+>> endobj
+5020 0 obj <<
+/D [4973 0 R /XYZ 248.686 179.388 null]
+>> endobj
+5021 0 obj <<
+/D [4973 0 R /XYZ 334.775 179.388 null]
+>> endobj
+5022 0 obj <<
+/D [4973 0 R /XYZ 360.637 179.388 null]
+>> endobj
+5023 0 obj <<
+/D [4973 0 R /XYZ 438.118 179.388 null]
+>> endobj
+5024 0 obj <<
+/D [4973 0 R /XYZ 459.64 179.388 null]
+>> endobj
+5025 0 obj <<
+/D [4973 0 R /XYZ 166.901 170.061 null]
+>> endobj
+5026 0 obj <<
+/D [4973 0 R /XYZ 71.731 156.28 null]
+>> endobj
+750 0 obj <<
+/D [4973 0 R /XYZ 187.959 130.942 null]
+>> endobj
+5027 0 obj <<
+/D [4973 0 R /XYZ 71.731 128.378 null]
+>> endobj
+5028 0 obj <<
+/D [4973 0 R /XYZ 71.731 123.596 null]
+>> endobj
+5029 0 obj <<
+/D [4973 0 R /XYZ 71.731 123.596 null]
+>> endobj
+5030 0 obj <<
+/D [4973 0 R /XYZ 71.731 111.644 null]
+>> endobj
+5031 0 obj <<
+/D [4973 0 R /XYZ 139.477 98.596 null]
+>> endobj
+5032 0 obj <<
+/D [4973 0 R /XYZ 71.731 95.699 null]
+>> endobj
+5033 0 obj <<
+/D [4973 0 R /XYZ 71.731 95.699 null]
+>> endobj
+5034 0 obj <<
+/D [4973 0 R /XYZ 71.731 83.251 null]
+>> endobj
+5035 0 obj <<
+/D [4973 0 R /XYZ 139.477 70.203 null]
+>> endobj
+4972 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5038 0 obj <<
+/Length 1127      
+/Filter /FlateDecode
+>>
+stream
+xÚÍWKoÛF\10¾ûWðH\15Ñ\9aûâ.Ñ\93k'E\8a"\ 5\1c¡\97¦\10hj)1\91H\81K%οïì\8b¢DÊ\ fÀ\87Â\80¹ÔÎÎ|3óíÌ\10G     üáH`$(\8edB\90\142*vWI´\86\9d߯°\97\98{\91ù@æ·ÅÕõ\a\fe)\8d\16eD¤D\8c¥ 'E,åÑbõO|»É÷\9djgs"d\8c\91{þYÕ\87ÇëûÅ\f'I<\87·\19\8e\ f\8fnïöæ\93[ܵÕ÷pðKÂ\13\10\83=XáÙ¿\8b?®Þ/zp\9c`\ 48\9e\82ïEFð9>ÂÇ8C\9c\93Hp\89\12pÃÀßéõ¹µ^\8cQÄ(\9b2G\90H3X\r¶Î\9f=2L\b 3\11>ê³Ð\88\18@c\ 4\11\80\14d\f´}SÕ}d»ÆGo\86e\1c"¸SZçke\1c\0u\ 4\90£\8cs£o\ e\8cÁ3EY\96Y}wJ\17mµïª¦ö'\ 6\0\12\0Ê\11\8a.6\95\9eÍ© qy¨\v{¾í[µÏ[e÷X¬Õ\16òª\8aN­Ü\ f\ 1\8f\95m\1e¾Â\96×Ò´A]wh\95\93®êª«ò\ eTxý,nJ'v¢¨kóZÏ\rd\8b\92\80\8f\ eå®ÒÚ\1e%BÄ\ f?\9dSlÀW\8e\91d&\11FZ\7fÍ\81\8dÉ~©U½Zú¼\9fe!a\88\ f\ 4×\913°Ø(·\98L\81ÝYå]îVy½r\8bÁ¾\8c?ÞùÝÖæÌ\84<E\84\15¶f­»¥jÕÊ\1d*Ûfç \ e¹,8J\84ðH'\9d\81\vA\82\80Þ6\9dÓ\ 6\94òL*f"ÞT{÷òp(Ë@µªö\94\83ÌX\1eX\14}0&È\96¥À\1cqB¶{\ 5\896\8a¤\88ÿ\9eAjóíA=G»Z­ó\ e\8a\823ùÝ\1e±K ]ÓvÚEOµ-ÐÉT\96)0É      \8c\ f&WÕöY˺-®\ 3\11T\1cU\vD°ó\93 $ÍM\ 6\94=É*8\a\2E¦\8cÂ1
+ÉÎ\Ùù\94ïÔ\98¯\ e\93\91}\15a¥Ïò\17BDH¡½ZjÄQiè\ 5y­u¸<\13é\f\ 4\ 2D¥ÕýùgÝì5°!\80\16\b\v\16@§È5\ 3`\97§jr\14°\ 1\94Oß¡B!\10ë]\82¾ »ö`
+I
+\19/òº\0Ò.ýë/ýÅèOË\14%2óÇ\8dìØ\80\ 1Ä\99\17yç4\r\8d\0*(^/µ\ 1¢\13&à>czÙ\ 4ø\ 1V\9e01'\99\80&\ 5¥!\83î!N¯ù\89%
+ûä\18.üëdJ\9dÔ\9cf\bÚ\9b\95½i×\87\9dª;=..&¥\ 2Æ\ 1v\12Ä©\1eIS\86p&Þ¬G\ eô]ì\91Aæb\8f<©lºëï\81I\0p¿°-hätß2!VBâan'=§pS\93·\9b\ e\ 6ú.{îe.z~rÓC\ 365ó,
+/
+\ 1yn@¢  ÜTüv\11èÕ]\ e\80\13ù\7fLG\\f§#\9eÆá×"ßníH\ 4ë¼4 G\95\1eS
+%d4\9aÀ|µüÑV\9dZ\16M]VS\15\9fCeÉøÙ\88òÎ\19û±©,÷\1d\9c~X³£\ 61EK¤'£F\98W\8e=\7fj(xY§}eçoÞðå\v\e>}£\86_lTñmÙ=.ÍÝz®ëó×wý)ýC"P\ 6ó]:jý6\83Êüÿ¦G\15ÐÌ×~\b¨5\94ÂÁ\ 4-cU¯«Z\9d_vÿ]H\18Ê\12ñä\97ãQ$|8
+dÊty¦Ãàýëöýý\8dÿXüøyá\16\94ã\848O\87_\9d\8cJÄq¸+$»ðu8Fø\1fùþµ©endstream
+endobj
+5037 0 obj <<
+/Type /Page
+/Contents 5038 0 R
+/Resources 5036 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 4779 0 R
+>> endobj
+5039 0 obj <<
+/D [5037 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5040 0 obj <<
+/D [5037 0 R /XYZ 71.731 768.009 null]
+>> endobj
+5041 0 obj <<
+/D [5037 0 R /XYZ 71.731 768.009 null]
+>> endobj
+5042 0 obj <<
+/D [5037 0 R /XYZ 71.731 756.482 null]
+>> endobj
+5043 0 obj <<
+/D [5037 0 R /XYZ 139.477 743.434 null]
+>> endobj
+754 0 obj <<
+/D [5037 0 R /XYZ 192.609 716.435 null]
+>> endobj
+5044 0 obj <<
+/D [5037 0 R /XYZ 71.731 711.48 null]
+>> endobj
+5045 0 obj <<
+/D [5037 0 R /XYZ 171.393 688.141 null]
+>> endobj
+5046 0 obj <<
+/D [5037 0 R /XYZ 194.629 675.19 null]
+>> endobj
+5047 0 obj <<
+/D [5037 0 R /XYZ 71.731 671.462 null]
+>> endobj
+758 0 obj <<
+/D [5037 0 R /XYZ 202.018 648.191 null]
+>> endobj
+5048 0 obj <<
+/D [5037 0 R /XYZ 71.731 645.657 null]
+>> endobj
+5049 0 obj <<
+/D [5037 0 R /XYZ 71.731 629.121 null]
+>> endobj
+762 0 obj <<
+/D [5037 0 R /XYZ 143.462 605.85 null]
+>> endobj
+5050 0 obj <<
+/D [5037 0 R /XYZ 71.731 603.316 null]
+>> endobj
+3126 0 obj <<
+/D [5037 0 R /XYZ 71.731 574.236 null]
+>> endobj
+5051 0 obj <<
+/D [5037 0 R /XYZ 71.731 561.324 null]
+>> endobj
+766 0 obj <<
+/D [5037 0 R /XYZ 242.611 538.944 null]
+>> endobj
+5052 0 obj <<
+/D [5037 0 R /XYZ 71.731 528.365 null]
+>> endobj
+5053 0 obj <<
+/D [5037 0 R /XYZ 71.731 528.365 null]
+>> endobj
+770 0 obj <<
+/D [5037 0 R /XYZ 162.317 502.648 null]
+>> endobj
+5054 0 obj <<
+/D [5037 0 R /XYZ 221.171 486.827 null]
+>> endobj
+5055 0 obj <<
+/D [5037 0 R /XYZ 71.731 484.76 null]
+>> endobj
+774 0 obj <<
+/D [5037 0 R /XYZ 174.677 461.489 null]
+>> endobj
+5056 0 obj <<
+/D [5037 0 R /XYZ 71.731 456.534 null]
+>> endobj
+5057 0 obj <<
+/D [5037 0 R /XYZ 71.731 454.143 null]
+>> endobj
+5058 0 obj <<
+/D [5037 0 R /XYZ 136.77 444.989 null]
+>> endobj
+5059 0 obj <<
+/D [5037 0 R /XYZ 214.25 444.989 null]
+>> endobj
+5060 0 obj <<
+/D [5037 0 R /XYZ 300.339 444.989 null]
+>> endobj
+5061 0 obj <<
+/D [5037 0 R /XYZ 326.202 444.989 null]
+>> endobj
+5062 0 obj <<
+/D [5037 0 R /XYZ 403.682 444.989 null]
+>> endobj
+5063 0 obj <<
+/D [5037 0 R /XYZ 425.204 444.989 null]
+>> endobj
+5064 0 obj <<
+/D [5037 0 R /XYZ 119.552 435.662 null]
+>> endobj
+5065 0 obj <<
+/D [5037 0 R /XYZ 71.731 421.881 null]
+>> endobj
+778 0 obj <<
+/D [5037 0 R /XYZ 187.959 396.543 null]
+>> endobj
+5066 0 obj <<
+/D [5037 0 R /XYZ 71.731 393.979 null]
+>> endobj
+5067 0 obj <<
+/D [5037 0 R /XYZ 71.731 389.197 null]
+>> endobj
+5068 0 obj <<
+/D [5037 0 R /XYZ 71.731 389.197 null]
+>> endobj
+5069 0 obj <<
+/D [5037 0 R /XYZ 71.731 377.245 null]
+>> endobj
+5070 0 obj <<
+/D [5037 0 R /XYZ 139.477 364.197 null]
+>> endobj
+5071 0 obj <<
+/D [5037 0 R /XYZ 71.731 361.3 null]
+>> endobj
+5072 0 obj <<
+/D [5037 0 R /XYZ 71.731 361.3 null]
+>> endobj
+5073 0 obj <<
+/D [5037 0 R /XYZ 71.731 348.852 null]
+>> endobj
+5074 0 obj <<
+/D [5037 0 R /XYZ 139.477 335.804 null]
+>> endobj
+5075 0 obj <<
+/D [5037 0 R /XYZ 71.731 332.907 null]
+>> endobj
+5076 0 obj <<
+/D [5037 0 R /XYZ 71.731 332.907 null]
+>> endobj
+5077 0 obj <<
+/D [5037 0 R /XYZ 71.731 320.458 null]
+>> endobj
+5078 0 obj <<
+/D [5037 0 R /XYZ 139.477 307.41 null]
+>> endobj
+5079 0 obj <<
+/D [5037 0 R /XYZ 71.731 303.682 null]
+>> endobj
+782 0 obj <<
+/D [5037 0 R /XYZ 192.609 280.411 null]
+>> endobj
+5080 0 obj <<
+/D [5037 0 R /XYZ 71.731 275.456 null]
+>> endobj
+5081 0 obj <<
+/D [5037 0 R /XYZ 252.633 265.069 null]
+>> endobj
+5082 0 obj <<
+/D [5037 0 R /XYZ 71.731 248.39 null]
+>> endobj
+786 0 obj <<
+/D [5037 0 R /XYZ 202.018 225.119 null]
+>> endobj
+5083 0 obj <<
+/D [5037 0 R /XYZ 71.731 222.584 null]
+>> endobj
+5084 0 obj <<
+/D [5037 0 R /XYZ 71.731 206.048 null]
+>> endobj
+790 0 obj <<
+/D [5037 0 R /XYZ 143.462 182.778 null]
+>> endobj
+5085 0 obj <<
+/D [5037 0 R /XYZ 71.731 180.243 null]
+>> endobj
+3127 0 obj <<
+/D [5037 0 R /XYZ 71.731 151.163 null]
+>> endobj
+5086 0 obj <<
+/D [5037 0 R /XYZ 71.731 138.252 null]
+>> endobj
+794 0 obj <<
+/D [5037 0 R /XYZ 277.695 115.872 null]
+>> endobj
+5087 0 obj <<
+/D [5037 0 R /XYZ 71.731 105.293 null]
+>> endobj
+5088 0 obj <<
+/D [5037 0 R /XYZ 71.731 105.293 null]
+>> endobj
+798 0 obj <<
+/D [5037 0 R /XYZ 162.317 79.576 null]
+>> endobj
+5089 0 obj <<
+/D [5037 0 R /XYZ 251.059 63.755 null]
+>> endobj
+5090 0 obj <<
+/D [5037 0 R /XYZ 71.731 61.688 null]
+>> endobj
+5036 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5093 0 obj <<
+/Length 972       
+/Filter /FlateDecode
+>>
+stream
+xÚÅWYs¤6\10~÷¯à\11RAV\v     AåÉqÖ©¤R\9b\94w*\ f9j\8aÅÚ\19\12\ fL$Øxÿ}ZH\sØ9f³5\ f\bèþº¿>\a\b(þ \90@d\ 2AF\19Éd\16\94»+\1alðÍ×Wà%b/\12Ïd¾\]]ß%,ÈI\9e&Áê]À²\8cp\9e"NJx*\82ÕÃÏáí¶Ø·JG1\93Y\bÄ]¿«êîéú~\15\ 1¥a\8cw\11\84Ý\93{w{óÚ\1d¾ÒÕûAñ\17*(\8aá;<AôëêÛ«W«Ñ9Á\80 \1fϹïE\8eÜg,\0 ¹\10Ö\7f\80\9c\bÁ\ 2)2B\91\87õÿÍ\87ºÙ\9bÊX\9b×w\1c_\12\90ÜJÓ \86\948\96UÝ:\ 1A'\ 1\90\84A\86rVÂüV Yº_\97[Uþ¾n\9fÖ¦-ÚcÔ<'\942¯di\9bVwe\eÅ)\86ª,êr[í×þö3o\13&õ,%4˽º\95=¶`Ý\12\0_8\99E(bfc\81i\8d\93\9c`\zá\e½évªnÍhwL½\r\86Ä
\vÃó$\rÁM%E\17áT\96\18\91©õ}öêð:&\14\18Ã\84âa\86ç2*'¯\803Â0\91\83\8cõmß`²\86ºj\ew-#\19Z\9fû\e\9b\185\1cu\87µY¶\9dV'£ÄH\9as¼¦$Ï]\90î\15
+ר\9eÉðÇHò°xì\ 6\f\98       &Æ*ÕjS´XîQÌ\81\86ï{\95þ¨Õ¾Ñ\18\81PiÝè¾g\88{ûC\94È°1Õ¤ª½õ\ 5\f`}>T¥e\ 5¡ÇjuQ\9b]eLÕxñ®~°a±Ç?#ÈÂ\ 2-\85\1f¬ç½³\f\bÚøt&b"ôíü\93Ò>\8eÞ¤=¢I´Ö[5C\13SVWf[Õ\e÷ yç®Åã£×1¦S\ f>5\v\aí\13¤\1eª?:eZoü8!t\91\8a;K£z|&ú\89#¤Ëë¡?­
+)'hÛÃ.×\\92Ì\16\9c\80¾1\16MmT»~Ûjµ1\93&GüÔj\ e\8aIJXî¦Êëb§ÆÎ<ðÊÊ>\ f>¯p\1cA\96\86ïfƤ/覶áÞ`Ýúè¿­0¢C]#\18\8e\ 2¥Í©º\1e`c\86QJ²\8f3       \ fyÍ!\17sìã\8fÁÏ\1dRW\9bjSÛ
+´wf\8b­w\8c-\13<     ¯\88þÓÓØ#ß\7f\8c\9dNØð\ 2öÙñ\9dd\92ðD^~|'Bànç\17\eß3¼³ã{\90¹Àø\9e\93\1e§7$Dúí0äó$u&      \95\97Û\3¼óÔ½LïÛQ\a\8f\81 /±c\8b\8a\8eå\19I¥¼\18»\19ÞYv\83Ì\vìàÿY½\a\vl\½LÊÅêýïk\87ýÛµÃ\ f&h[èv=Í·Ë®\9dCð¿±vz\1ds¢)wÊ\98bã#\8blCÝ\94øÈþ\15ødëç\80ß'\?ã\18\9f7¦ÿâb\9cäT>ûM6\89\f\9fd\92ä²ß'\v\fkêûÛW÷7þ\7fÛ7oVî\90\b Ìù8ÿ\9eãIF\ 4\80w2¡g¾»\8e\v{Q\84\85endstream
+endobj
+5092 0 obj <<
+/Type /Page
+/Contents 5093 0 R
+/Resources 5091 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5094 0 obj <<
+/D [5092 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5095 0 obj <<
+/D [5092 0 R /XYZ 71.731 814.833 null]
+>> endobj
+802 0 obj <<
+/D [5092 0 R /XYZ 174.677 758.046 null]
+>> endobj
+5096 0 obj <<
+/D [5092 0 R /XYZ 71.731 753.091 null]
+>> endobj
+5097 0 obj <<
+/D [5092 0 R /XYZ 71.731 750.7 null]
+>> endobj
+5098 0 obj <<
+/D [5092 0 R /XYZ 136.77 741.546 null]
+>> endobj
+5099 0 obj <<
+/D [5092 0 R /XYZ 235.772 741.546 null]
+>> endobj
+5100 0 obj <<
+/D [5092 0 R /XYZ 321.861 741.546 null]
+>> endobj
+5101 0 obj <<
+/D [5092 0 R /XYZ 71.731 727.765 null]
+>> endobj
+806 0 obj <<
+/D [5092 0 R /XYZ 187.959 702.427 null]
+>> endobj
+5102 0 obj <<
+/D [5092 0 R /XYZ 71.731 699.863 null]
+>> endobj
+5103 0 obj <<
+/D [5092 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5104 0 obj <<
+/D [5092 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5105 0 obj <<
+/D [5092 0 R /XYZ 71.731 683.129 null]
+>> endobj
+5106 0 obj <<
+/D [5092 0 R /XYZ 139.477 670.081 null]
+>> endobj
+5107 0 obj <<
+/D [5092 0 R /XYZ 71.731 666.353 null]
+>> endobj
+810 0 obj <<
+/D [5092 0 R /XYZ 202.018 643.082 null]
+>> endobj
+5108 0 obj <<
+/D [5092 0 R /XYZ 71.731 640.548 null]
+>> endobj
+5109 0 obj <<
+/D [5092 0 R /XYZ 71.731 611.061 null]
+>> endobj
+814 0 obj <<
+/D [5092 0 R /XYZ 143.462 587.79 null]
+>> endobj
+5110 0 obj <<
+/D [5092 0 R /XYZ 71.731 585.255 null]
+>> endobj
+3128 0 obj <<
+/D [5092 0 R /XYZ 71.731 556.175 null]
+>> endobj
+5111 0 obj <<
+/D [5092 0 R /XYZ 71.731 543.264 null]
+>> endobj
+818 0 obj <<
+/D [5092 0 R /XYZ 247.396 520.884 null]
+>> endobj
+5112 0 obj <<
+/D [5092 0 R /XYZ 71.731 510.305 null]
+>> endobj
+5113 0 obj <<
+/D [5092 0 R /XYZ 71.731 510.305 null]
+>> endobj
+822 0 obj <<
+/D [5092 0 R /XYZ 162.317 484.588 null]
+>> endobj
+5114 0 obj <<
+/D [5092 0 R /XYZ 233.126 468.767 null]
+>> endobj
+5115 0 obj <<
+/D [5092 0 R /XYZ 71.731 466.7 null]
+>> endobj
+826 0 obj <<
+/D [5092 0 R /XYZ 174.677 443.429 null]
+>> endobj
+5116 0 obj <<
+/D [5092 0 R /XYZ 71.731 438.474 null]
+>> endobj
+5117 0 obj <<
+/D [5092 0 R /XYZ 71.731 436.083 null]
+>> endobj
+5118 0 obj <<
+/D [5092 0 R /XYZ 136.77 426.929 null]
+>> endobj
+5119 0 obj <<
+/D [5092 0 R /XYZ 222.859 426.929 null]
+>> endobj
+5120 0 obj <<
+/D [5092 0 R /XYZ 308.948 426.929 null]
+>> endobj
+5121 0 obj <<
+/D [5092 0 R /XYZ 334.811 426.929 null]
+>> endobj
+5122 0 obj <<
+/D [5092 0 R /XYZ 399.377 426.929 null]
+>> endobj
+5123 0 obj <<
+/D [5092 0 R /XYZ 425.204 426.929 null]
+>> endobj
+5124 0 obj <<
+/D [5092 0 R /XYZ 489.771 426.929 null]
+>> endobj
+5125 0 obj <<
+/D [5092 0 R /XYZ 71.731 413.148 null]
+>> endobj
+830 0 obj <<
+/D [5092 0 R /XYZ 187.959 387.81 null]
+>> endobj
+5126 0 obj <<
+/D [5092 0 R /XYZ 71.731 385.245 null]
+>> endobj
+5127 0 obj <<
+/D [5092 0 R /XYZ 71.731 380.463 null]
+>> endobj
+5128 0 obj <<
+/D [5092 0 R /XYZ 71.731 380.463 null]
+>> endobj
+5129 0 obj <<
+/D [5092 0 R /XYZ 71.731 368.512 null]
+>> endobj
+5130 0 obj <<
+/D [5092 0 R /XYZ 139.477 355.464 null]
+>> endobj
+5131 0 obj <<
+/D [5092 0 R /XYZ 71.731 352.567 null]
+>> endobj
+5132 0 obj <<
+/D [5092 0 R /XYZ 71.731 352.567 null]
+>> endobj
+5133 0 obj <<
+/D [5092 0 R /XYZ 71.731 341.474 null]
+>> endobj
+5134 0 obj <<
+/D [5092 0 R /XYZ 139.477 327.071 null]
+>> endobj
+5135 0 obj <<
+/D [5092 0 R /XYZ 71.731 324.173 null]
+>> endobj
+5136 0 obj <<
+/D [5092 0 R /XYZ 71.731 324.173 null]
+>> endobj
+5137 0 obj <<
+/D [5092 0 R /XYZ 71.731 313.08 null]
+>> endobj
+5138 0 obj <<
+/D [5092 0 R /XYZ 139.477 298.677 null]
+>> endobj
+5139 0 obj <<
+/D [5092 0 R /XYZ 71.731 294.949 null]
+>> endobj
+834 0 obj <<
+/D [5092 0 R /XYZ 202.018 271.678 null]
+>> endobj
+5140 0 obj <<
+/D [5092 0 R /XYZ 71.731 269.144 null]
+>> endobj
+5141 0 obj <<
+/D [5092 0 R /XYZ 71.731 252.608 null]
+>> endobj
+838 0 obj <<
+/D [5092 0 R /XYZ 143.462 229.337 null]
+>> endobj
+5142 0 obj <<
+/D [5092 0 R /XYZ 71.731 226.803 null]
+>> endobj
+3129 0 obj <<
+/D [5092 0 R /XYZ 71.731 197.723 null]
+>> endobj
+5143 0 obj <<
+/D [5092 0 R /XYZ 71.731 184.811 null]
+>> endobj
+842 0 obj <<
+/D [5092 0 R /XYZ 247.086 162.431 null]
+>> endobj
+5144 0 obj <<
+/D [5092 0 R /XYZ 71.731 151.852 null]
+>> endobj
+5145 0 obj <<
+/D [5092 0 R /XYZ 71.731 151.852 null]
+>> endobj
+846 0 obj <<
+/D [5092 0 R /XYZ 162.317 126.135 null]
+>> endobj
+5146 0 obj <<
+/D [5092 0 R /XYZ 233.126 110.314 null]
+>> endobj
+5147 0 obj <<
+/D [5092 0 R /XYZ 71.731 108.247 null]
+>> endobj
+850 0 obj <<
+/D [5092 0 R /XYZ 174.677 84.976 null]
+>> endobj
+5148 0 obj <<
+/D [5092 0 R /XYZ 71.731 80.021 null]
+>> endobj
+5149 0 obj <<
+/D [5092 0 R /XYZ 71.731 77.63 null]
+>> endobj
+5150 0 obj <<
+/D [5092 0 R /XYZ 136.77 68.476 null]
+>> endobj
+5151 0 obj <<
+/D [5092 0 R /XYZ 222.859 68.476 null]
+>> endobj
+5152 0 obj <<
+/D [5092 0 R /XYZ 308.948 68.476 null]
+>> endobj
+5153 0 obj <<
+/D [5092 0 R /XYZ 71.731 54.695 null]
+>> endobj
+5091 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5157 0 obj <<
+/Length 758       
+/Filter /FlateDecode
+>>
+stream
+xÚÝVMoÓ@\10½çWøh#¼Ùï\ fq*¥E T¤6âBQd¹&1jlËvªòï\99õ®c§uZ$R\84\90\ fÞÕÎ̾\997ó´$Àð\91@\11¤\18 4¦H+\1d¤\9b\19\ eVpò~F¼EìMâ\91ÍÛÅl~Îh`\90\91,X|\ f¨Ö\88s  q$âR\ 4\8b\9b¯áé:©Ú¬\8ebªtH\90û\7fÊ\8bíýür\11\11\8cÃ\18v\11     ·÷îìôäÂ-ÞÕù]ïx\8d\ 5\ 638\83\15\89¾->ÎÎ\16;p\82\12\ 48\9e\82ïM\1eÁ§4 \ 4\19!,~B\f\12\82\ 6Jh\84!\ f\8bÿ¤^m7YÑ6öÒù¹ Cº8\88\89\82ª°Î0]çÕC`»\80\85É\142\8a\94\1a\1d=üï\92 \94B\12\96\8c!\9eËB\r¨\b§\88\ 2øÞÆb«Ê¼Ø\91Ð\96î\9fF*´\98»MÓ&mÖ/ë-ð\91¶Û:sIï\15)\ 6\10ÒpøKd\8céâ_f`\\80»Vá\97Hñ0¹Ýö¾j¿`\ 2
+Vd«¤\ 5\8aÝ­w\9dK·¬³ª¬¡à°QaV×eÝõ     \9a\0\83=\fÝE<\8f\88\ eóÛgonêtÞüH (®¬\vJ\87Ð
+Qâòä
+i[lA\90\90ÞÑ;-\9b¶¬\96=ãÎ\91Cxi\1d{?&\11\89.\92\8d\aÅéCPÖöÉØcn    FLJð´\1e×\94ª\9e²²j&XÝdM\93¬2Wɪ.SØçÅj\8aÕ>t\f\98«çÕÏ\ 2âæÍ\ eºBDñ\1eºDn¡µülàÁ «£ö@\ f¥6\8e¨A_4ï3\83q·m\98¶Q,\81ú4)¬×Òo_ífqp\97\b\eï=}\81E$Øp\ 1y3ÙÜ \ f\8c\v`Ï \98Þß\95\0þ¬\ 4\11fâh\120\8awP\ 2z\9b\7fP\ 2èÑ%Àüe        HÚ6I×˶|)\1d\98¼`\8fe\f\1dÍ\1f\89Açg\89Í\9a}¶Ûu¶O;1ákO8°×+H\9d­ò\ 6ZÅo\93âfÜ\1fSÒá\81¼¨tLUco¼1C\f«?\12\10}\14\ 5¡\f\8e¯ Ýè\83P\1cKAFñ\ e*Hoó\7f)ȸºþ]\vJi {\9e\ e&ýÃW!£,¤ý\18\16ÖçÓ³Ë\13ÿØýpµp\v&\b¦.¡ñ«\993\8d\ 4!¾¯Ø¡×íc\84¿\0æGÝòendstream
+endobj
+5156 0 obj <<
+/Type /Page
+/Contents 5157 0 R
+/Resources 5155 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5158 0 obj <<
+/D [5156 0 R /XYZ 71.731 802.878 null]
+>> endobj
+854 0 obj <<
+/D [5156 0 R /XYZ 187.959 758.046 null]
+>> endobj
+5159 0 obj <<
+/D [5156 0 R /XYZ 71.731 755.482 null]
+>> endobj
+5160 0 obj <<
+/D [5156 0 R /XYZ 71.731 750.7 null]
+>> endobj
+5161 0 obj <<
+/D [5156 0 R /XYZ 71.731 750.7 null]
+>> endobj
+5162 0 obj <<
+/D [5156 0 R /XYZ 71.731 738.749 null]
+>> endobj
+5163 0 obj <<
+/D [5156 0 R /XYZ 139.477 725.701 null]
+>> endobj
+858 0 obj <<
+/D [5156 0 R /XYZ 202.018 698.702 null]
+>> endobj
+5164 0 obj <<
+/D [5156 0 R /XYZ 71.731 696.167 null]
+>> endobj
+5165 0 obj <<
+/D [5156 0 R /XYZ 71.731 679.631 null]
+>> endobj
+862 0 obj <<
+/D [5156 0 R /XYZ 143.462 656.361 null]
+>> endobj
+5166 0 obj <<
+/D [5156 0 R /XYZ 71.731 653.826 null]
+>> endobj
+3130 0 obj <<
+/D [5156 0 R /XYZ 71.731 624.746 null]
+>> endobj
+5167 0 obj <<
+/D [5156 0 R /XYZ 71.731 611.835 null]
+>> endobj
+866 0 obj <<
+/D [5156 0 R /XYZ 242.3 589.455 null]
+>> endobj
+5168 0 obj <<
+/D [5156 0 R /XYZ 71.731 578.876 null]
+>> endobj
+5169 0 obj <<
+/D [5156 0 R /XYZ 71.731 578.876 null]
+>> endobj
+870 0 obj <<
+/D [5156 0 R /XYZ 162.317 553.159 null]
+>> endobj
+5170 0 obj <<
+/D [5156 0 R /XYZ 227.148 537.338 null]
+>> endobj
+5171 0 obj <<
+/D [5156 0 R /XYZ 71.731 535.271 null]
+>> endobj
+874 0 obj <<
+/D [5156 0 R /XYZ 174.677 512 null]
+>> endobj
+5172 0 obj <<
+/D [5156 0 R /XYZ 71.731 507.045 null]
+>> endobj
+5173 0 obj <<
+/D [5156 0 R /XYZ 71.731 504.654 null]
+>> endobj
+5174 0 obj <<
+/D [5156 0 R /XYZ 136.77 495.5 null]
+>> endobj
+5175 0 obj <<
+/D [5156 0 R /XYZ 218.554 495.5 null]
+>> endobj
+5176 0 obj <<
+/D [5156 0 R /XYZ 304.643 495.5 null]
+>> endobj
+5177 0 obj <<
+/D [5156 0 R /XYZ 71.731 481.719 null]
+>> endobj
+878 0 obj <<
+/D [5156 0 R /XYZ 187.959 456.381 null]
+>> endobj
+5178 0 obj <<
+/D [5156 0 R /XYZ 71.731 453.816 null]
+>> endobj
+5179 0 obj <<
+/D [5156 0 R /XYZ 71.731 449.034 null]
+>> endobj
+5180 0 obj <<
+/D [5156 0 R /XYZ 71.731 449.034 null]
+>> endobj
+5181 0 obj <<
+/D [5156 0 R /XYZ 71.731 437.083 null]
+>> endobj
+5182 0 obj <<
+/D [5156 0 R /XYZ 139.477 424.035 null]
+>> endobj
+5183 0 obj <<
+/D [5156 0 R /XYZ 71.731 420.307 null]
+>> endobj
+882 0 obj <<
+/D [5156 0 R /XYZ 202.018 397.036 null]
+>> endobj
+5184 0 obj <<
+/D [5156 0 R /XYZ 71.731 394.502 null]
+>> endobj
+5185 0 obj <<
+/D [5156 0 R /XYZ 71.731 377.966 null]
+>> endobj
+886 0 obj <<
+/D [5156 0 R /XYZ 143.462 354.695 null]
+>> endobj
+5186 0 obj <<
+/D [5156 0 R /XYZ 71.731 352.161 null]
+>> endobj
+3131 0 obj <<
+/D [5156 0 R /XYZ 71.731 323.081 null]
+>> endobj
+5187 0 obj <<
+/D [5156 0 R /XYZ 71.731 310.169 null]
+>> endobj
+890 0 obj <<
+/D [5156 0 R /XYZ 287.887 287.789 null]
+>> endobj
+5188 0 obj <<
+/D [5156 0 R /XYZ 71.731 277.21 null]
+>> endobj
+5189 0 obj <<
+/D [5156 0 R /XYZ 71.731 277.21 null]
+>> endobj
+894 0 obj <<
+/D [5156 0 R /XYZ 162.317 251.493 null]
+>> endobj
+5190 0 obj <<
+/D [5156 0 R /XYZ 257.036 235.672 null]
+>> endobj
+5191 0 obj <<
+/D [5156 0 R /XYZ 71.731 233.605 null]
+>> endobj
+898 0 obj <<
+/D [5156 0 R /XYZ 174.677 210.334 null]
+>> endobj
+5192 0 obj <<
+/D [5156 0 R /XYZ 71.731 205.379 null]
+>> endobj
+5193 0 obj <<
+/D [5156 0 R /XYZ 71.731 202.988 null]
+>> endobj
+5194 0 obj <<
+/D [5156 0 R /XYZ 136.77 193.834 null]
+>> endobj
+5195 0 obj <<
+/D [5156 0 R /XYZ 240.077 193.834 null]
+>> endobj
+5196 0 obj <<
+/D [5156 0 R /XYZ 326.166 193.834 null]
+>> endobj
+5197 0 obj <<
+/D [5156 0 R /XYZ 71.731 180.053 null]
+>> endobj
+902 0 obj <<
+/D [5156 0 R /XYZ 187.959 154.715 null]
+>> endobj
+5198 0 obj <<
+/D [5156 0 R /XYZ 71.731 152.151 null]
+>> endobj
+5199 0 obj <<
+/D [5156 0 R /XYZ 71.731 147.369 null]
+>> endobj
+5200 0 obj <<
+/D [5156 0 R /XYZ 71.731 147.369 null]
+>> endobj
+5201 0 obj <<
+/D [5156 0 R /XYZ 71.731 135.417 null]
+>> endobj
+5202 0 obj <<
+/D [5156 0 R /XYZ 139.477 122.369 null]
+>> endobj
+5203 0 obj <<
+/D [5156 0 R /XYZ 71.731 118.641 null]
+>> endobj
+906 0 obj <<
+/D [5156 0 R /XYZ 202.018 95.37 null]
+>> endobj
+5204 0 obj <<
+/D [5156 0 R /XYZ 71.731 92.836 null]
+>> endobj
+5205 0 obj <<
+/D [5156 0 R /XYZ 71.731 76.3 null]
+>> endobj
+5155 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5208 0 obj <<
+/Length 858       
+/Filter /FlateDecode
+>>
+stream
+xÚÝVMs\9b0\10½ûWpÄ\9d¢h%\81Äôä:I\93N'í8L/MÇC\1cÅqj\83\v8\93þû.H\18\1c\9dqzèä\0D»ûÞ~=\v\1c\8a\7fàH \92\83£(#J*g²èQg\8a'\1fz`-<kâµlÞG½\93\9c\90\84\ 1w¢{\87)E\84\b0N@Dà;ÑÝ7wø\10/\v\9dõ=&\95\vÄ<?Í\92ÕóÉ(ê\ 3¥®\87_}pWÏæl8¸2/§Ùì©v¼¡>E3<Ã7è\7f\8f>ö΢59\9f\ 1A\1eûè[\93\8c9\0$ôý\92?@H|\9f9ÒW\84b\1e%ÿó>(w6×%&\9aË&[êxà\13.Xe\97g\93\93ü1Æ\84è²t!\13ë\81\0\92\0<!\89b%\1d ~ \8c£u\1agz®ã\\8f'\ f³eã+\10!(}kW\1e\10\16\1anWñÂò\12ì%/Å\ eFoå\ 2LaT\85¾¥Ó\rcÒÔ}\12Ïçúμßêû4Óöÿ}é\96\81ª\8f¼ÈV\13ì`±ª\8f3½H\9fâ¹ù\98Ýos\84\90b;\84Å\e^\~\19\ f¢h0¼8;Ý&çqP$ÀbxÀ°U&±YnÁuÑ\14kÝI¬\ 1ÃÞpUÙ^ÿJÒe\8e\1e5\ fI@\8aºV\ 11\93:Kl$\9f6\ 6Uïêºì)f;h(HÐÔ\12'·*PÑ÷\ 2\9cöI\9c\94^cûùÆBBã®\ 2BUhÝ»\11JV¾h\10à]G\r<\1c:4\v±~!ÁÑ®\8c\aÙtµÐI\91¯q7æFâ\92\8b\ràö\9eÕûác\1fd\10v-\9a9 í£\97ÏõN\ 2c8\ 4Õ6¬ã\99¥lO¦`\84á\ 6Ô6%·e\8a½ª¥¡H;G2.t3\9d8\9c\93j:»ªÄ°[\ 2\9f\ 1        C\13\7f¤Ñ8Aw%ݯ})Üx¾:(\0\89\9eÆ\ 5*\96A}ª\ì2,Ó¬¨ÆUº:ËÒ¬\92=²cl\e\1aÿRz\16i¡ññs¥óâ\18â\ 3\7f\0°ÑeÚ\9eèF\7fÒä\86R6ÅÞÙ}_è<\8f§¶´)6ööQ\97»U~Æ\89\95ª8ÿaÍQ²ÌË(\1am\ 6è\18\85\9aÅ+kÇv)6v\9br©|uùàÖä­\89Ô\ 6YäÓôöñ\0F\r\81\96\1d\b(ÔÀ\ f  \14\8fñßê\13?¨O\f\8cGÓ§V¼\9dúTÛ\1cA\9fÚI¯å 8\91
\15ïÊ\1c\14&\bGK¼    ·3ok²3íÍ}]/«´\ 3÷\1f\8a2ß#Êí\9eÙ\e5\13$ÄußwçnLê+·$¡,17c\94¸\9f\87\81½f_^Gæ\85û@\99aܾ¯\v®\88\ f\94³\1d÷êm\86¿\ 1ØHû\86endstream
+endobj
+5207 0 obj <<
+/Type /Page
+/Contents 5208 0 R
+/Resources 5206 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5209 0 obj <<
+/D [5207 0 R /XYZ 71.731 802.878 null]
+>> endobj
+910 0 obj <<
+/D [5207 0 R /XYZ 143.462 758.046 null]
+>> endobj
+5210 0 obj <<
+/D [5207 0 R /XYZ 71.731 755.512 null]
+>> endobj
+3132 0 obj <<
+/D [5207 0 R /XYZ 71.731 726.432 null]
+>> endobj
+5211 0 obj <<
+/D [5207 0 R /XYZ 71.731 713.52 null]
+>> endobj
+914 0 obj <<
+/D [5207 0 R /XYZ 268.124 691.14 null]
+>> endobj
+5212 0 obj <<
+/D [5207 0 R /XYZ 71.731 680.561 null]
+>> endobj
+5213 0 obj <<
+/D [5207 0 R /XYZ 71.731 680.561 null]
+>> endobj
+918 0 obj <<
+/D [5207 0 R /XYZ 162.317 654.844 null]
+>> endobj
+5214 0 obj <<
+/D [5207 0 R /XYZ 245.081 639.024 null]
+>> endobj
+5215 0 obj <<
+/D [5207 0 R /XYZ 438.174 639.024 null]
+>> endobj
+5216 0 obj <<
+/D [5207 0 R /XYZ 71.731 625.958 null]
+>> endobj
+922 0 obj <<
+/D [5207 0 R /XYZ 174.677 600.734 null]
+>> endobj
+5217 0 obj <<
+/D [5207 0 R /XYZ 71.731 595.779 null]
+>> endobj
+5218 0 obj <<
+/D [5207 0 R /XYZ 71.731 593.388 null]
+>> endobj
+5219 0 obj <<
+/D [5207 0 R /XYZ 136.77 584.234 null]
+>> endobj
+5220 0 obj <<
+/D [5207 0 R /XYZ 231.468 584.234 null]
+>> endobj
+5221 0 obj <<
+/D [5207 0 R /XYZ 317.557 584.234 null]
+>> endobj
+5222 0 obj <<
+/D [5207 0 R /XYZ 71.731 570.453 null]
+>> endobj
+926 0 obj <<
+/D [5207 0 R /XYZ 187.959 545.115 null]
+>> endobj
+5223 0 obj <<
+/D [5207 0 R /XYZ 71.731 542.551 null]
+>> endobj
+5224 0 obj <<
+/D [5207 0 R /XYZ 71.731 537.768 null]
+>> endobj
+5225 0 obj <<
+/D [5207 0 R /XYZ 71.731 537.768 null]
+>> endobj
+5226 0 obj <<
+/D [5207 0 R /XYZ 71.731 525.817 null]
+>> endobj
+5227 0 obj <<
+/D [5207 0 R /XYZ 139.477 512.769 null]
+>> endobj
+5228 0 obj <<
+/D [5207 0 R /XYZ 71.731 509.041 null]
+>> endobj
+930 0 obj <<
+/D [5207 0 R /XYZ 202.018 485.77 null]
+>> endobj
+5229 0 obj <<
+/D [5207 0 R /XYZ 71.731 483.236 null]
+>> endobj
+5230 0 obj <<
+/D [5207 0 R /XYZ 71.731 466.7 null]
+>> endobj
+934 0 obj <<
+/D [5207 0 R /XYZ 143.462 443.429 null]
+>> endobj
+5231 0 obj <<
+/D [5207 0 R /XYZ 71.731 440.895 null]
+>> endobj
+3247 0 obj <<
+/D [5207 0 R /XYZ 71.731 411.815 null]
+>> endobj
+5232 0 obj <<
+/D [5207 0 R /XYZ 71.731 398.903 null]
+>> endobj
+938 0 obj <<
+/D [5207 0 R /XYZ 295.857 376.523 null]
+>> endobj
+5233 0 obj <<
+/D [5207 0 R /XYZ 71.731 365.944 null]
+>> endobj
+5234 0 obj <<
+/D [5207 0 R /XYZ 71.731 365.944 null]
+>> endobj
+942 0 obj <<
+/D [5207 0 R /XYZ 162.317 340.227 null]
+>> endobj
+5235 0 obj <<
+/D [5207 0 R /XYZ 257.036 324.407 null]
+>> endobj
+5236 0 obj <<
+/D [5207 0 R /XYZ 71.731 322.339 null]
+>> endobj
+946 0 obj <<
+/D [5207 0 R /XYZ 174.677 299.069 null]
+>> endobj
+5237 0 obj <<
+/D [5207 0 R /XYZ 71.731 294.113 null]
+>> endobj
+5238 0 obj <<
+/D [5207 0 R /XYZ 71.731 291.722 null]
+>> endobj
+5239 0 obj <<
+/D [5207 0 R /XYZ 136.77 282.568 null]
+>> endobj
+5240 0 obj <<
+/D [5207 0 R /XYZ 240.077 282.568 null]
+>> endobj
+5241 0 obj <<
+/D [5207 0 R /XYZ 326.166 282.568 null]
+>> endobj
+5242 0 obj <<
+/D [5207 0 R /XYZ 352.028 282.568 null]
+>> endobj
+5243 0 obj <<
+/D [5207 0 R /XYZ 429.509 282.568 null]
+>> endobj
+5244 0 obj <<
+/D [5207 0 R /XYZ 71.731 268.787 null]
+>> endobj
+950 0 obj <<
+/D [5207 0 R /XYZ 187.959 243.449 null]
+>> endobj
+5245 0 obj <<
+/D [5207 0 R /XYZ 71.731 240.885 null]
+>> endobj
+5246 0 obj <<
+/D [5207 0 R /XYZ 71.731 236.103 null]
+>> endobj
+5247 0 obj <<
+/D [5207 0 R /XYZ 71.731 236.103 null]
+>> endobj
+5248 0 obj <<
+/D [5207 0 R /XYZ 71.731 224.152 null]
+>> endobj
+5249 0 obj <<
+/D [5207 0 R /XYZ 139.477 211.103 null]
+>> endobj
+5250 0 obj <<
+/D [5207 0 R /XYZ 71.731 208.206 null]
+>> endobj
+5251 0 obj <<
+/D [5207 0 R /XYZ 71.731 208.206 null]
+>> endobj
+5252 0 obj <<
+/D [5207 0 R /XYZ 71.731 195.758 null]
+>> endobj
+5253 0 obj <<
+/D [5207 0 R /XYZ 139.477 182.71 null]
+>> endobj
+5254 0 obj <<
+/D [5207 0 R /XYZ 71.731 178.982 null]
+>> endobj
+954 0 obj <<
+/D [5207 0 R /XYZ 202.018 155.711 null]
+>> endobj
+5255 0 obj <<
+/D [5207 0 R /XYZ 71.731 153.177 null]
+>> endobj
+5256 0 obj <<
+/D [5207 0 R /XYZ 71.731 136.641 null]
+>> endobj
+958 0 obj <<
+/D [5207 0 R /XYZ 143.462 113.37 null]
+>> endobj
+5257 0 obj <<
+/D [5207 0 R /XYZ 71.731 110.836 null]
+>> endobj
+3248 0 obj <<
+/D [5207 0 R /XYZ 71.731 81.756 null]
+>> endobj
+5206 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5260 0 obj <<
+/Length 865       
+/Filter /FlateDecode
+>>
+stream
+xÚåW[o\9b0\14~ï¯à\11¦áÚÆÆF{êºvÚ4mR\eíe\9d"FHJ\97\0âRuÿ~ÇØæÒ\90\93"õaÊ\ 3¶8\97ï;WB\1c\f\b\82D@\1c\89)\92B:Éî\ 4;\exóñ\84\18 ß\88ø#\99÷\8b\93ÓË\80:\11\8aÂÀY¬\1d*%b,\ 4;!b!w\16«\1fîùm\6iåùTH\97 ýü\92åíÃéÕÂ#\18»>Ü<â¶\ fúÝùÙW}øPe÷Vñ\ 6s\f\ eNÄû¹ø|r±èÁqJ\10àx
\11Ù\83O©C\ 4¢\84\86£à\1cñHtðë»\180ârY7q¾\8a«Õr\17׿\15\0­ËP\0\84A\97 $)8
+BD£°Óý\1aïR-ÉFAÂ\8eOx'û¬}1h\91\80!*BÐVZ7\94
+\1d\98:mÚR\1f\8bµ~v\ 6ºÓº0á\ 3\1cÄ­ëx\93Úpbº\85¬dùf BPÄ»0øÖ\99O9
+\ 2Ù¹¼þ\93\17e\9dÕ=!\81\88`\96P\88t¶³¼Ñ\ 2\1c\ f\ 2]\80¥\81þ\14á±Õ(B\0Òò\85ô×MÕ&\8dç\87P2I\9c'·Y¹4×7Æ'\19Ôe\88°\8c\8cº\92Ý÷ `qfDÞjKm^g\9b<]é[}[T;m\11Àɦ")Vé¼í\9eò¿Øö\ 3\f9çÂñ#¨W]\83ó\ 1\ 2\17¬\87¯ºâÝl*µ\94\1fD\88\90¨\93=«6í.Í\9bº÷>©M\ 1=À&a\e·\1a\18A\9cS\87K\8c$\9fk5\8a\ 2?zõøÙw%¡\14XªöìÍé®\1cW>£\88B\8f\19\11\ 5¬, Îìhh
+ýL<á*Àº-\9a¸Ií±j¡ú\93¦­Ò}Æ> \b#¦j\1e  I&)\9dåÍ)\ 4T\1c\8fø`ï0s#Óa\8bsÛÒ£~\8e\93$-¡\9f\12sO
+`¼z\96.\9d\94×,]Ê\10\ 6Õ£Ñ\1dì\1d¦kd^Nw\al'Sy¨\7fË\97\86(\8atý_ÁȬ\94Y)Üï\9e`n¼mÓý\89«çtÀt\90òt\13\8f´ÃûN¥;Vi   \8d\8bpÓª\82\91«\96\1a\9a\ 1\83'0.="Ýlû¬çºJNíÐT*(\19\9bË·ë\87\13ÄC6\9d´É6\8d«eñë.MlÓ\1fuuÍÙ\7fÁêR\r«4ë½\96µ\9b,Þn\87\ 4\8f\v@û²   ¨³\95ZdÝ-˧Ó൶ÛLL^q»\1d\\ fTõ9¤éèû\81ª\8e\8f\8e7'Gö\ e\ e\ e+s\84\15ñ\7f\f\91qâÌ·/ÌÞ\b\8b'ÿ\ 1\f\ f\80@*êëG6\94ßoç\17Wgæ£ÿÓõB\1f\ 2N0Õ\88Çÿ\1e\11\94l\10\1cøÊßGø\17\18\81endstream
+endobj
+5259 0 obj <<
+/Type /Page
+/Contents 5260 0 R
+/Resources 5258 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5261 0 obj <<
+/D [5259 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5262 0 obj <<
+/D [5259 0 R /XYZ 71.731 768.009 null]
+>> endobj
+962 0 obj <<
+/D [5259 0 R /XYZ 293 755.597 null]
+>> endobj
+5263 0 obj <<
+/D [5259 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5264 0 obj <<
+/D [5259 0 R /XYZ 71.731 745.018 null]
+>> endobj
+966 0 obj <<
+/D [5259 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5265 0 obj <<
+/D [5259 0 R /XYZ 251.059 703.48 null]
+>> endobj
+5266 0 obj <<
+/D [5259 0 R /XYZ 71.731 701.413 null]
+>> endobj
+970 0 obj <<
+/D [5259 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5267 0 obj <<
+/D [5259 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5268 0 obj <<
+/D [5259 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5269 0 obj <<
+/D [5259 0 R /XYZ 136.77 661.642 null]
+>> endobj
+5270 0 obj <<
+/D [5259 0 R /XYZ 235.772 661.642 null]
+>> endobj
+5271 0 obj <<
+/D [5259 0 R /XYZ 321.861 661.642 null]
+>> endobj
+5272 0 obj <<
+/D [5259 0 R /XYZ 347.724 661.642 null]
+>> endobj
+5273 0 obj <<
+/D [5259 0 R /XYZ 412.291 661.642 null]
+>> endobj
+5274 0 obj <<
+/D [5259 0 R /XYZ 438.118 661.642 null]
+>> endobj
+5275 0 obj <<
+/D [5259 0 R /XYZ 119.552 652.315 null]
+>> endobj
+5276 0 obj <<
+/D [5259 0 R /XYZ 71.731 638.534 null]
+>> endobj
+974 0 obj <<
+/D [5259 0 R /XYZ 187.959 613.196 null]
+>> endobj
+5277 0 obj <<
+/D [5259 0 R /XYZ 71.731 610.631 null]
+>> endobj
+5278 0 obj <<
+/D [5259 0 R /XYZ 71.731 605.849 null]
+>> endobj
+5279 0 obj <<
+/D [5259 0 R /XYZ 71.731 605.849 null]
+>> endobj
+5280 0 obj <<
+/D [5259 0 R /XYZ 71.731 593.898 null]
+>> endobj
+5281 0 obj <<
+/D [5259 0 R /XYZ 139.477 580.85 null]
+>> endobj
+5282 0 obj <<
+/D [5259 0 R /XYZ 71.731 577.953 null]
+>> endobj
+5283 0 obj <<
+/D [5259 0 R /XYZ 71.731 577.953 null]
+>> endobj
+5284 0 obj <<
+/D [5259 0 R /XYZ 71.731 566.86 null]
+>> endobj
+5285 0 obj <<
+/D [5259 0 R /XYZ 139.477 552.457 null]
+>> endobj
+5286 0 obj <<
+/D [5259 0 R /XYZ 71.731 549.559 null]
+>> endobj
+5287 0 obj <<
+/D [5259 0 R /XYZ 71.731 549.559 null]
+>> endobj
+5288 0 obj <<
+/D [5259 0 R /XYZ 71.731 538.466 null]
+>> endobj
+5289 0 obj <<
+/D [5259 0 R /XYZ 139.477 524.063 null]
+>> endobj
+5290 0 obj <<
+/D [5259 0 R /XYZ 71.731 520.335 null]
+>> endobj
+978 0 obj <<
+/D [5259 0 R /XYZ 202.018 497.064 null]
+>> endobj
+5291 0 obj <<
+/D [5259 0 R /XYZ 71.731 494.53 null]
+>> endobj
+5292 0 obj <<
+/D [5259 0 R /XYZ 71.731 477.994 null]
+>> endobj
+982 0 obj <<
+/D [5259 0 R /XYZ 143.462 454.723 null]
+>> endobj
+5293 0 obj <<
+/D [5259 0 R /XYZ 71.731 452.189 null]
+>> endobj
+3249 0 obj <<
+/D [5259 0 R /XYZ 71.731 423.109 null]
+>> endobj
+5294 0 obj <<
+/D [5259 0 R /XYZ 71.731 410.197 null]
+>> endobj
+986 0 obj <<
+/D [5259 0 R /XYZ 273.236 387.817 null]
+>> endobj
+5295 0 obj <<
+/D [5259 0 R /XYZ 71.731 377.238 null]
+>> endobj
+5296 0 obj <<
+/D [5259 0 R /XYZ 71.731 377.238 null]
+>> endobj
+990 0 obj <<
+/D [5259 0 R /XYZ 162.317 351.521 null]
+>> endobj
+5297 0 obj <<
+/D [5259 0 R /XYZ 251.059 335.7 null]
+>> endobj
+5298 0 obj <<
+/D [5259 0 R /XYZ 71.731 333.633 null]
+>> endobj
+994 0 obj <<
+/D [5259 0 R /XYZ 174.677 310.362 null]
+>> endobj
+5299 0 obj <<
+/D [5259 0 R /XYZ 71.731 305.407 null]
+>> endobj
+5300 0 obj <<
+/D [5259 0 R /XYZ 71.731 303.016 null]
+>> endobj
+5301 0 obj <<
+/D [5259 0 R /XYZ 136.77 293.862 null]
+>> endobj
+5302 0 obj <<
+/D [5259 0 R /XYZ 235.772 293.862 null]
+>> endobj
+5303 0 obj <<
+/D [5259 0 R /XYZ 321.861 293.862 null]
+>> endobj
+5304 0 obj <<
+/D [5259 0 R /XYZ 71.731 280.081 null]
+>> endobj
+998 0 obj <<
+/D [5259 0 R /XYZ 187.959 254.743 null]
+>> endobj
+5305 0 obj <<
+/D [5259 0 R /XYZ 71.731 252.179 null]
+>> endobj
+5306 0 obj <<
+/D [5259 0 R /XYZ 71.731 247.397 null]
+>> endobj
+5307 0 obj <<
+/D [5259 0 R /XYZ 71.731 247.397 null]
+>> endobj
+5308 0 obj <<
+/D [5259 0 R /XYZ 71.731 235.445 null]
+>> endobj
+5309 0 obj <<
+/D [5259 0 R /XYZ 139.477 222.397 null]
+>> endobj
+5310 0 obj <<
+/D [5259 0 R /XYZ 71.731 218.669 null]
+>> endobj
+1002 0 obj <<
+/D [5259 0 R /XYZ 202.018 195.399 null]
+>> endobj
+5311 0 obj <<
+/D [5259 0 R /XYZ 71.731 192.864 null]
+>> endobj
+5312 0 obj <<
+/D [5259 0 R /XYZ 71.731 176.328 null]
+>> endobj
+1006 0 obj <<
+/D [5259 0 R /XYZ 143.462 153.057 null]
+>> endobj
+5313 0 obj <<
+/D [5259 0 R /XYZ 71.731 150.523 null]
+>> endobj
+3250 0 obj <<
+/D [5259 0 R /XYZ 71.731 121.443 null]
+>> endobj
+5258 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5316 0 obj <<
+/Length 1095      
+/Filter /FlateDecode
+>>
+stream
+xÚ½WMsÛ6\10½ûWð(u*\98ø\ 6§'×I:ítÒ©¢é%Îhh\92\92\98\91H\ 6 \9døßwñA\89\92(ÛiÝ\8e\ e\ 4ÈÝ·û\16\8b\a\ 1G1üp$1\92\14G*&HI\15e»«8ZÃ\97_®p°\98\ 5\93ÙÀæçÅÕõ;J¢\ 4%\82F\8bUD\94B\8c       À\11\88     \1e\8f\93ÛMÚ´\85\9eÎ\88T\13\8cüó÷²ê¾]Ï\17S\1cÇ\93\19̦xÒ}óßnoÞûÁ\e]>ô\8ew1\8fÁ\f¾Á\bO?-~»z»Ø'Ç       F\90ÇSé\a\93³ô       \89°D\ 4s\9b\7fà(9G<\91.}ó9\85\1cãf\99ÕÕ]\1c\93õ²Ô_\8cMÀû2D\810ø2\89\14\81@T \92\bçû>Ý\15Þ\92\r\8a\14G3Ì\9dí)þª<B\97\a\1fL\bdoÉX\9f;B¤/KÛU\85ñÃl*'\9b²ñ\93Mªó¯S¬&©.ì\e9)+X\ 4Ý5­7È\8b­-îã\81\bF   wE\98õÁf\84#J\95\vùᱪ\eS\9a=\1d\89°d=\1d\81üZC\10oÀã\83\81
+©_¦;ÄLbD\13Ú³\85¥7­î2H]@»di\95\ 1Ñe\98þ\10\83»\12(VIp·¶ç\11lR\9c\ 5\93\1f=\92ÙÔº=G£\f1*\82éx¾G\14m\83þ4VW"\b\12±\82\16I\10Æ\893¾ÑënWT­ÙÇ=ê\13        ýÈ\8eh\fÛ\1e@\10ç$âP/,åXß\13$\85­ÄàÓés¿Eöë>Àó{dØ\89\8c \ 2\1dßÛØÜ\9aÚuWhÉz¤\1fM\9b¶E?Ô\1dìö¬ítqNz\ 69\88\84A2\14I\85\8fj>J]À\96Uìõ¨\1fð.S\ f667]|é
\16ù\bé_ç\7f\86·A::\rÄÓ¶¬«Ñö\bÌ\89@Iâ»c^@\95*\0Qrò×T²Iºí\8asuð\8aB\19uNU±\86\18\ f¡Ü\ fÎÅ\ruÑ@\83\e¯\a \ 6µvò\8bF\92\89C\1a~ó¿³JRn\9f\8dltvÝopë\82²\ 3ô^cg½Pr\8c¸`Ǫ\0K½üªË¶XnÒ*ßBO=#´üû\85ö$\ 6,É>Ìp±¹BX\893ÅmR\1d$´^\85eþ0ï\979ßWÚ4ue\0º¼ß\86w«ºß :­Ì®\f(ÅÃa÷\9fÈpÈàûeø¡.ós\1d\86\ 3\90C\84øE\15?R7\0Þ;þ35~\81\18Ó\131\1eÄØ\99u}ÿù\85!Àr$\ 2A  ¦Ï      4e1\1c\1cÿ\81@\13\ 1b\89Õ«©Ô\0ï¢Jõ6ÿ\83@\87\92\8f2§ \95äõôy\80w\99y°¹È<mÛÔ±ïe\e\17ÉÜê\81ÉtÙ¼H§}}ß\9cy\ÔÈÅ\ 6\ 2q\ 1M\9d¿^7j:\rr9©Møb\85Å>Û\rlt7ZuUæÀݬ\7fkép\9e\80Ú¤yÀ,\8c\ 1f¥ë\9d\1f\1dñµ\1e\8eo@\81]osviÂ.á~I\9dH­lá¸b\ 3\\98ÀiÖº\ráfPÞÚ\8fn­äÛÿî½\91®·Û\1e¡o6{*Ø7\1c
+Q\ 2iã'¦»×u×\96U\88Q\ 6ô,\ 5\88Ü\8fï\1fÇ%Þ&Mþ½Ä?­Ï\84\8f\9e\93\ 3\91>\9cÚÏ\1f\97ä\89ãr¸\8bÂ}\840\94ÄòÉ[ÙÁ¤¿\94Ido0«\13\f\e÷\8fÛ·ó\eÔ\1f^\v\1cÇÄg<¼Ñ1ª\10ÇýÅ\83²\v7¯ó\fÿ\ 6Oÿ\8c&endstream
+endobj
+5315 0 obj <<
+/Type /Page
+/Contents 5316 0 R
+/Resources 5314 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5317 0 obj <<
+/D [5315 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5318 0 obj <<
+/D [5315 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1010 0 obj <<
+/D [5315 0 R /XYZ 254.403 755.597 null]
+>> endobj
+5319 0 obj <<
+/D [5315 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5320 0 obj <<
+/D [5315 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1014 0 obj <<
+/D [5315 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5321 0 obj <<
+/D [5315 0 R /XYZ 239.103 703.48 null]
+>> endobj
+5322 0 obj <<
+/D [5315 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1018 0 obj <<
+/D [5315 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5323 0 obj <<
+/D [5315 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5324 0 obj <<
+/D [5315 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5325 0 obj <<
+/D [5315 0 R /XYZ 136.77 661.642 null]
+>> endobj
+5326 0 obj <<
+/D [5315 0 R /XYZ 227.163 661.642 null]
+>> endobj
+5327 0 obj <<
+/D [5315 0 R /XYZ 313.252 661.642 null]
+>> endobj
+5328 0 obj <<
+/D [5315 0 R /XYZ 339.115 661.642 null]
+>> endobj
+5329 0 obj <<
+/D [5315 0 R /XYZ 364.942 661.642 null]
+>> endobj
+5330 0 obj <<
+/D [5315 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1022 0 obj <<
+/D [5315 0 R /XYZ 187.959 622.523 null]
+>> endobj
+5331 0 obj <<
+/D [5315 0 R /XYZ 71.731 619.958 null]
+>> endobj
+5332 0 obj <<
+/D [5315 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5333 0 obj <<
+/D [5315 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5334 0 obj <<
+/D [5315 0 R /XYZ 71.731 603.225 null]
+>> endobj
+5335 0 obj <<
+/D [5315 0 R /XYZ 139.477 590.177 null]
+>> endobj
+5336 0 obj <<
+/D [5315 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5337 0 obj <<
+/D [5315 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5338 0 obj <<
+/D [5315 0 R /XYZ 71.731 574.832 null]
+>> endobj
+5339 0 obj <<
+/D [5315 0 R /XYZ 139.477 561.784 null]
+>> endobj
+5340 0 obj <<
+/D [5315 0 R /XYZ 71.731 558.056 null]
+>> endobj
+1026 0 obj <<
+/D [5315 0 R /XYZ 202.018 534.785 null]
+>> endobj
+5341 0 obj <<
+/D [5315 0 R /XYZ 71.731 532.25 null]
+>> endobj
+5342 0 obj <<
+/D [5315 0 R /XYZ 71.731 515.714 null]
+>> endobj
+1030 0 obj <<
+/D [5315 0 R /XYZ 143.462 492.444 null]
+>> endobj
+5343 0 obj <<
+/D [5315 0 R /XYZ 71.731 489.909 null]
+>> endobj
+3251 0 obj <<
+/D [5315 0 R /XYZ 71.731 460.829 null]
+>> endobj
+5344 0 obj <<
+/D [5315 0 R /XYZ 71.731 447.918 null]
+>> endobj
+1034 0 obj <<
+/D [5315 0 R /XYZ 318.495 425.537 null]
+>> endobj
+5345 0 obj <<
+/D [5315 0 R /XYZ 71.731 414.959 null]
+>> endobj
+5346 0 obj <<
+/D [5315 0 R /XYZ 71.731 414.959 null]
+>> endobj
+1038 0 obj <<
+/D [5315 0 R /XYZ 162.317 389.242 null]
+>> endobj
+5347 0 obj <<
+/D [5315 0 R /XYZ 274.969 373.421 null]
+>> endobj
+5348 0 obj <<
+/D [5315 0 R /XYZ 71.731 371.354 null]
+>> endobj
+1042 0 obj <<
+/D [5315 0 R /XYZ 174.677 348.083 null]
+>> endobj
+5349 0 obj <<
+/D [5315 0 R /XYZ 71.731 343.128 null]
+>> endobj
+5350 0 obj <<
+/D [5315 0 R /XYZ 71.731 340.737 null]
+>> endobj
+5351 0 obj <<
+/D [5315 0 R /XYZ 141.074 331.583 null]
+>> endobj
+5352 0 obj <<
+/D [5315 0 R /XYZ 257.294 331.583 null]
+>> endobj
+5353 0 obj <<
+/D [5315 0 R /XYZ 343.384 331.583 null]
+>> endobj
+5354 0 obj <<
+/D [5315 0 R /XYZ 369.246 331.583 null]
+>> endobj
+5355 0 obj <<
+/D [5315 0 R /XYZ 446.727 331.583 null]
+>> endobj
+5356 0 obj <<
+/D [5315 0 R /XYZ 71.731 317.801 null]
+>> endobj
+1046 0 obj <<
+/D [5315 0 R /XYZ 187.959 292.464 null]
+>> endobj
+5357 0 obj <<
+/D [5315 0 R /XYZ 71.731 289.899 null]
+>> endobj
+5358 0 obj <<
+/D [5315 0 R /XYZ 71.731 285.117 null]
+>> endobj
+5359 0 obj <<
+/D [5315 0 R /XYZ 71.731 285.117 null]
+>> endobj
+5360 0 obj <<
+/D [5315 0 R /XYZ 71.731 273.166 null]
+>> endobj
+5361 0 obj <<
+/D [5315 0 R /XYZ 139.477 260.118 null]
+>> endobj
+5362 0 obj <<
+/D [5315 0 R /XYZ 71.731 257.221 null]
+>> endobj
+5363 0 obj <<
+/D [5315 0 R /XYZ 71.731 257.221 null]
+>> endobj
+5364 0 obj <<
+/D [5315 0 R /XYZ 71.731 244.772 null]
+>> endobj
+5365 0 obj <<
+/D [5315 0 R /XYZ 139.477 231.724 null]
+>> endobj
+5366 0 obj <<
+/D [5315 0 R /XYZ 71.731 227.996 null]
+>> endobj
+1050 0 obj <<
+/D [5315 0 R /XYZ 192.609 204.726 null]
+>> endobj
+5367 0 obj <<
+/D [5315 0 R /XYZ 71.731 199.77 null]
+>> endobj
+5368 0 obj <<
+/D [5315 0 R /XYZ 119.552 163.48 null]
+>> endobj
+5369 0 obj <<
+/D [5315 0 R /XYZ 71.731 160.255 null]
+>> endobj
+1054 0 obj <<
+/D [5315 0 R /XYZ 143.462 136.481 null]
+>> endobj
+5370 0 obj <<
+/D [5315 0 R /XYZ 71.731 133.947 null]
+>> endobj
+3252 0 obj <<
+/D [5315 0 R /XYZ 71.731 104.867 null]
+>> endobj
+5314 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5373 0 obj <<
+/Length 1238      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WMoã6\10½çWè(\17+F¤DQBOi6)¶(¶hÖ-
+4E Ð´¥­-i)ÊÉþû\ e¿,9¶\93\ 60|\10I\ f\1fß<\ egH\1cÄðÃ\ 1Ã\88%8Èc\82r\96\a|s\11\a+øçç\vì,"g\12Ml~\9a_\Þ&$(P\91%Á|\19\90<Gi\9a\ 1N\86Ò\8c\ 6óÅßáuUvJÈYDX\1ebd¿¿ÖÍð|y7\9fá8\ e#èÍp8<Ûÿ®¯>ÛÆGYoýÄû\98Æ`\ 6ÿA\vÏþ\99ÿrq3ß\91£\ 4#àñ\1a}gr@\9f\90\03D0Õü\9d\8f\8cRD\vfè÷_Kà\18w\ fµüöP\95Íb\r\94`y;3E  ¸\v3S\86r\ 2Ë$\19"Eff~.7ÂZ¦\13\89â ÂÔؾ\81ÎÆ9\98\10à®]Ñsî        aV\94º\ 1aåÐ)Ûí\85ÜÖ\Ø\8el\aÐTÕ\8d\18ÙbTPãgä\11#BQ\92ä\ 6÷Ë÷¦íúºßqf\b³ÔsÎ\90ÝNXÓ\1aÐx40
\8eßi\9f¦\98E\8c\92"ñ.Áî\8eÀx´\82M£Ä[\ 1Þ!\ eN\10\8d½4\1ffQ\ 6\ 1Õ+9peÛ¼lxUw\ f®ûÃá\1a\86\10´í\91EÀ?:!\8b\7f<&*¡1"9ÄXR \8c\vc|%WÃF4ªß­»\17 \fâ-\9d:7\8djÀ@\94\92\80\ 2CÌر°&\88e\ 5´&\7f½üîNÀnÏ'xö\bLC-%\88@H{\e·åÓ0Û
+®Zw,\9b\b»«Oñ\a;¢ ê*\b"kZ®\a\17\8f~¨ÿÞ+±qíNðú>\8e        ?T'\ 2\19lK\ 4\eÌr¼·9GEÊàìæéùD\1añN\8bäl4·®529\11Zûå3\16jÎÖ[U*á\9bR\9f\ 6yôxzßI\86\8aÂ\ 6ÒGÑsYwªn\9bÃ\ 4a\93J\92&ÆôÓd¿r\12ú#\b\1d\ 1\ 6K®ê-ðYØîS%\1aÛò,¡Ù.í\9cë\19ÎC\93\94a\90·\8d\92íÚ\ 1\92\89\8b¾S6+ÑÏ\b5\11\ 1\83ª\12à«t \9eÀFô\91vÄp'à¹K\88å
+\f\93¼0\1aêï£ëKQ.lK\a\9f±¨\84FM\8aØ ê¡M+\9d\95Ü5\97~B#\9e\9c\99èõBý>\1e\88æ\9b\834N ;0¯v4¸\80²´G\9d\18êbkÎy\94P\ 2Vý°ö\1d¨nn°\ÔÍÊv´¸ú«\f0%\9e\93í,e»±­\9døºÃ[PrÔß\fyýu\avÚ6\165\84Xý8\98pñë\1dª½[Ó\ 4m\ 55cUÙN©TÉgyX\99\b\81\81=Óo\83\18\84\93ç0|ã½À½Õ\ eÔkq:j­|½ä\97¾tè)\88\8fл\ 2\1dù:K¡0dé~½y*ÿ\15\ 3dúçsÔçס§É\0CýȲ\83âü¤\9d0Ó\æ\9bÿe¿\9dl9\88  ;©\83áXqv\88ï*Î1~oy~áÓ\143·ym,Î﫨y\86ââÿ\17Ô#U{Ó¯Úǯo,\91û5ÀôÈ\12\10æ8}«f'1\\vÓü½5;y³\1e\11¸º\90ì|õh\82\1ey\9b3Ô£Ó¥\98L%?æ9.ô\rûl\8e\8fp'ýv&'ÝÞË]À\ps\95a.äÎ\\84­@·CÃmö\1do?L×\85®múúqíØ,ýMªnjU\97ªÖ       ~u\84\92eÓoj\r\89,Ö'µ\7f³:Ä\ 6,\ f¯w~-JéRÎ\8bÒe*ý\9e6:]=ÜÝüþÇÍ\97¹]\ eîiI¹z%ÝÛDu'@Os\97\9f3\96\86æ
+øÆ\8d¥\11+p}+\ en\8dRt­TN<[\9fõ]\13½\8c=÷p#)*böêóu4ñ¯W\86ôSoù\ 2CÓúíúæîʽX?Y\1dò0¡8&Ö¡éÓ7MrD±\7f\88$ôÄ\13õ\90á\7fQæßæendstream
+endobj
+5372 0 obj <<
+/Type /Page
+/Contents 5373 0 R
+/Resources 5371 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5154 0 R
+>> endobj
+5374 0 obj <<
+/D [5372 0 R /XYZ 71.731 802.878 null]
+>> endobj
+3254 0 obj <<
+/D [5372 0 R /XYZ 71.731 814.833 null]
+>> endobj
+5375 0 obj <<
+/D [5372 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1058 0 obj <<
+/D [5372 0 R /XYZ 262.064 755.597 null]
+>> endobj
+5376 0 obj <<
+/D [5372 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5377 0 obj <<
+/D [5372 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1062 0 obj <<
+/D [5372 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5378 0 obj <<
+/D [5372 0 R /XYZ 239.103 703.48 null]
+>> endobj
+5379 0 obj <<
+/D [5372 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1066 0 obj <<
+/D [5372 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5380 0 obj <<
+/D [5372 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5381 0 obj <<
+/D [5372 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5382 0 obj <<
+/D [5372 0 R /XYZ 136.77 661.642 null]
+>> endobj
+5383 0 obj <<
+/D [5372 0 R /XYZ 227.163 661.642 null]
+>> endobj
+5384 0 obj <<
+/D [5372 0 R /XYZ 248.686 661.642 null]
+>> endobj
+5385 0 obj <<
+/D [5372 0 R /XYZ 270.796 661.642 null]
+>> endobj
+5386 0 obj <<
+/D [5372 0 R /XYZ 352.581 661.642 null]
+>> endobj
+5387 0 obj <<
+/D [5372 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1070 0 obj <<
+/D [5372 0 R /XYZ 187.959 622.523 null]
+>> endobj
+5388 0 obj <<
+/D [5372 0 R /XYZ 71.731 619.958 null]
+>> endobj
+5389 0 obj <<
+/D [5372 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5390 0 obj <<
+/D [5372 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5391 0 obj <<
+/D [5372 0 R /XYZ 71.731 603.225 null]
+>> endobj
+5392 0 obj <<
+/D [5372 0 R /XYZ 139.477 590.177 null]
+>> endobj
+5393 0 obj <<
+/D [5372 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5394 0 obj <<
+/D [5372 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5395 0 obj <<
+/D [5372 0 R /XYZ 71.731 574.832 null]
+>> endobj
+5396 0 obj <<
+/D [5372 0 R /XYZ 139.477 561.784 null]
+>> endobj
+5397 0 obj <<
+/D [5372 0 R /XYZ 71.731 558.056 null]
+>> endobj
+1074 0 obj <<
+/D [5372 0 R /XYZ 192.609 534.785 null]
+>> endobj
+5398 0 obj <<
+/D [5372 0 R /XYZ 71.731 529.829 null]
+>> endobj
+5399 0 obj <<
+/D [5372 0 R /XYZ 71.731 476.86 null]
+>> endobj
+1078 0 obj <<
+/D [5372 0 R /XYZ 143.462 453.589 null]
+>> endobj
+5400 0 obj <<
+/D [5372 0 R /XYZ 71.731 451.055 null]
+>> endobj
+3253 0 obj <<
+/D [5372 0 R /XYZ 71.731 421.975 null]
+>> endobj
+5401 0 obj <<
+/D [5372 0 R /XYZ 71.731 409.063 null]
+>> endobj
+1082 0 obj <<
+/D [5372 0 R /XYZ 253.456 386.683 null]
+>> endobj
+5402 0 obj <<
+/D [5372 0 R /XYZ 71.731 376.104 null]
+>> endobj
+5403 0 obj <<
+/D [5372 0 R /XYZ 71.731 376.104 null]
+>> endobj
+1086 0 obj <<
+/D [5372 0 R /XYZ 162.317 350.387 null]
+>> endobj
+5404 0 obj <<
+/D [5372 0 R /XYZ 227.148 334.567 null]
+>> endobj
+5405 0 obj <<
+/D [5372 0 R /XYZ 71.731 332.499 null]
+>> endobj
+1090 0 obj <<
+/D [5372 0 R /XYZ 174.677 309.229 null]
+>> endobj
+5406 0 obj <<
+/D [5372 0 R /XYZ 71.731 304.273 null]
+>> endobj
+5407 0 obj <<
+/D [5372 0 R /XYZ 71.731 301.882 null]
+>> endobj
+5408 0 obj <<
+/D [5372 0 R /XYZ 136.77 292.729 null]
+>> endobj
+5409 0 obj <<
+/D [5372 0 R /XYZ 218.554 292.729 null]
+>> endobj
+5410 0 obj <<
+/D [5372 0 R /XYZ 304.643 292.729 null]
+>> endobj
+5411 0 obj <<
+/D [5372 0 R /XYZ 330.506 292.729 null]
+>> endobj
+5412 0 obj <<
+/D [5372 0 R /XYZ 407.986 292.729 null]
+>> endobj
+5413 0 obj <<
+/D [5372 0 R /XYZ 71.731 278.947 null]
+>> endobj
+1094 0 obj <<
+/D [5372 0 R /XYZ 187.959 253.609 null]
+>> endobj
+5414 0 obj <<
+/D [5372 0 R /XYZ 71.731 251.045 null]
+>> endobj
+5415 0 obj <<
+/D [5372 0 R /XYZ 71.731 246.263 null]
+>> endobj
+5416 0 obj <<
+/D [5372 0 R /XYZ 71.731 246.263 null]
+>> endobj
+5417 0 obj <<
+/D [5372 0 R /XYZ 71.731 234.312 null]
+>> endobj
+5418 0 obj <<
+/D [5372 0 R /XYZ 139.477 221.264 null]
+>> endobj
+5419 0 obj <<
+/D [5372 0 R /XYZ 71.731 218.366 null]
+>> endobj
+5420 0 obj <<
+/D [5372 0 R /XYZ 71.731 218.366 null]
+>> endobj
+5421 0 obj <<
+/D [5372 0 R /XYZ 71.731 205.918 null]
+>> endobj
+5422 0 obj <<
+/D [5372 0 R /XYZ 139.477 192.87 null]
+>> endobj
+5423 0 obj <<
+/D [5372 0 R /XYZ 71.731 189.142 null]
+>> endobj
+1098 0 obj <<
+/D [5372 0 R /XYZ 192.609 165.871 null]
+>> endobj
+5424 0 obj <<
+/D [5372 0 R /XYZ 71.731 160.916 null]
+>> endobj
+5425 0 obj <<
+/D [5372 0 R /XYZ 71.731 133.849 null]
+>> endobj
+1102 0 obj <<
+/D [5372 0 R /XYZ 202.018 110.579 null]
+>> endobj
+5426 0 obj <<
+/D [5372 0 R /XYZ 71.731 108.044 null]
+>> endobj
+5427 0 obj <<
+/D [5372 0 R /XYZ 71.731 91.508 null]
+>> endobj
+5371 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5430 0 obj <<
+/Length 1457      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WIsÛ6\14¾ûWè(eF0\ 1. Ç§Ô\89;é¤I\1akzi:\1e\88\82d´$È\10¤cµÓÿÞ\a<\90ÔB%9dt\10\96·|oÅ#\9d\ 5ð£3N  \ fé,\r\18Iy:ËË«`¶\83\9b\9f¯¨§Xz\92å\ 1ÍO««ë»\90Í2\92%álµ\9d±4%Q\94\80\9c\84DI<[mþ\98ß>\8aº\95ÍbÉx:§\ 4ÿß*Ý=_\7f\-h\10Ì\97°[Ðy÷\8cw·/ßáâU£\9ezÆOA\1c\0\19ÜÁ\8a.þ\ýrõz5\80\8b\19%\80ãkð=É\19|Æf\94\92,\8e-~J3\12ÇlÆã\94\ 4`\87Å\7f· é\\15Òê\ 4r>Z\eÌ\964&aÄ\1c\9diòkó\97\0\83\82Ú²\90Üs\80\ 2N\18u
+\96\11')³p(\89\93\b\19=Óç `Eñ\90?ªÚÔ2¯j3J\88@Ob%ô\ 2Â\84°\f\11¾\13¥G\17±St);Ö±UG\1aÀíæÜ0\1a\82\fDXÞO\8cñ>\b\16 ÁM¾às\90\83\e+MÙë\1c÷U-At#ZUé\ 3+\ 6G/{\15K\ 6\1e\fS§è~¯Áfe\ 6[8¡<êmI\bæ\93Ò-\12ÄÁHà<\9c\97\8c\9d\10L-$\9aô\96B\92\99¶éòv±L 1s¡-÷\83ß¾ðzéÈ\9f&$H{GYÚ    \15\0-\ eG\rôfÊ\1f,d$â  Ä5#\14cö²Ùu¥Ô­\19Ô\1eÅ\96C9\86Gz\ f+¢Ïä\18üË!_&J\82\11\9e\aW§ÿCõPÆ z\\19\rò°|\ eÓ&\82\98B\96ö4\16[]A¼ú"n«\89ÔidÝH\ 3v\8a\16R\ 6òÅg\94\8bC×ÈIo1\92d\11ü'$Ë2§è\954y£j\9bp\97+\15ýµz\94¨cÛé¼\1d4^Ên>\95Ý}j£\9cÊ\eè3olY\1f\16!\9fËBÝÚ\8eà{×\91|Û(&,\f¼mX\18\1f%8¢Lùü÷\ 5\8fæ¢èä·¬l\1c\93G¨å\ e\0?y»uW®Á×}X\94w@Ûû%\17Ưª­·P¨b¢\19\rí,\82ê¤\18qJ ÷\13\ 4\8b­\1c\16¿u²\93Æ\1fVeYykîû(û;¡7¸¸ó¡\99èN½N×ݨ\8f(t\r(\9d`^\8b\ 6ª5L3\aÝ\9e8«ìbã\9f\13»Ve]H,.G¼\16FåxåC\85\9bÏ\1e·¥QzÛ\881-]ä\1cÑ\9bÖ\võ\84_\1aÕ¶Rã¡p\16¸Ø0\88.\96vÙ¹ø\83©,\9cï¤\96\8dÕÎXdÉÝa]\19£Ö\85Ä\1dº\ 5®Á\18\8dG.'E¡þ\11>\83á\fó\10Ȥ8\90\9f\8bVîªf\8f;\17\19Ì´\87½\99\8e\1c8\vÕ÷\9d\ 18:Ú\99\18E£ÿäÆ\1fXs£xn$D\0\14â©éÖfoZY\12ܻʳd\95\9e\1dÖ¦Ò\83-ö¼\94îXheJ<iäçN5 ð\1cÖ¶©,\11\83h\8bf'[\\eÈq§\1d·¢\91þ¼VzYTVþßþä\18\87\1c\97u½[´Uér\ 4ÖkåU\94\80¯î
+`pР   \9e¾EÙ'PýK,}^/Ã0\ 6\ eq­EÓT_\9cCag{e\18F>}áÀ<V.µayÐ\7fXì²\10\b_?¹\94\83kx¶pQJcÄNâ}\8agë}+½ò²z\ 2ß\80~í媩\90Ëg\97\11ÝÆ"s½À9û¨axgÚ7ß\13\8df\1e\91±ÃT\eyÒûÎg$\18\18\9bYÿ*ÛÖ\0æA¾>\98¢j\1fÚ\1f7!\1d¿ûg\1a\ eß9ÿ\18\9e\8eG\95öÖ\8dµ\ 5\9b!\bÎ-E\ 5>j/ôÝ#¾»7wïqåªsr\88ê_åï\1a¢lLi\bÄ\14fÛø\eF»£\7f]:¤$±\83Z\ 6ªø÷p½À?-\9fÛ\9b>\9fFæN\eµÓ6\97,QQé\1d®\9c\84m!vf\82éDciv½2X"ýò\fæ\7f7Ó>ó^H\bMÐe¿Êr-\e3ý Ú1\vçtkÐ¥1+\85\81\84Ç?lÊ\1aÅ]\1c²<ÉÅ\19kH*\vûz_uz\87$ܹ\1a}ÖÏQ4$<Årwq\80Y'\84H\\1c*# l~ØL9\88»<R"\89\ 3X\8b\\9eÌ]=^·ÁÇÒ\8d\ 5        (¸¢ï:e9ÜnÜÀ¸V6\ 1\1dÛÁ((\8c©àumû\96÷Eµ\8f\a¾C~Ñ\8aS\aùod\16\91,à_ý\8a\1e\8fhN2nM>\96a-~\7fûúãKÿáüæ~\85\8b\ 1Ã\94\ 2\8fÂÔMbØ\9bÂäÂ\97ò9Âÿ\ 1î¾\1d{endstream
+endobj
+5429 0 obj <<
+/Type /Page
+/Contents 5430 0 R
+/Resources 5428 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5431 0 obj <<
+/D [5429 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5432 0 obj <<
+/D [5429 0 R /XYZ 71.731 814.833 null]
+>> endobj
+1106 0 obj <<
+/D [5429 0 R /XYZ 143.462 758.046 null]
+>> endobj
+5433 0 obj <<
+/D [5429 0 R /XYZ 71.731 755.512 null]
+>> endobj
+5434 0 obj <<
+/D [5429 0 R /XYZ 71.731 713.52 null]
+>> endobj
+1110 0 obj <<
+/D [5429 0 R /XYZ 298.422 691.14 null]
+>> endobj
+5435 0 obj <<
+/D [5429 0 R /XYZ 71.731 680.561 null]
+>> endobj
+5436 0 obj <<
+/D [5429 0 R /XYZ 71.731 680.561 null]
+>> endobj
+1114 0 obj <<
+/D [5429 0 R /XYZ 162.317 654.844 null]
+>> endobj
+5437 0 obj <<
+/D [5429 0 R /XYZ 268.991 639.024 null]
+>> endobj
+5438 0 obj <<
+/D [5429 0 R /XYZ 71.731 636.956 null]
+>> endobj
+1118 0 obj <<
+/D [5429 0 R /XYZ 174.677 613.686 null]
+>> endobj
+5439 0 obj <<
+/D [5429 0 R /XYZ 71.731 608.73 null]
+>> endobj
+5440 0 obj <<
+/D [5429 0 R /XYZ 71.731 606.339 null]
+>> endobj
+5441 0 obj <<
+/D [5429 0 R /XYZ 136.77 597.186 null]
+>> endobj
+5442 0 obj <<
+/D [5429 0 R /XYZ 248.686 597.186 null]
+>> endobj
+5443 0 obj <<
+/D [5429 0 R /XYZ 334.775 597.186 null]
+>> endobj
+5444 0 obj <<
+/D [5429 0 R /XYZ 71.731 583.404 null]
+>> endobj
+1122 0 obj <<
+/D [5429 0 R /XYZ 187.959 558.066 null]
+>> endobj
+5445 0 obj <<
+/D [5429 0 R /XYZ 71.731 555.502 null]
+>> endobj
+5446 0 obj <<
+/D [5429 0 R /XYZ 71.731 550.72 null]
+>> endobj
+5447 0 obj <<
+/D [5429 0 R /XYZ 71.731 550.72 null]
+>> endobj
+5448 0 obj <<
+/D [5429 0 R /XYZ 71.731 538.769 null]
+>> endobj
+5449 0 obj <<
+/D [5429 0 R /XYZ 139.477 525.721 null]
+>> endobj
+5450 0 obj <<
+/D [5429 0 R /XYZ 71.731 521.993 null]
+>> endobj
+1126 0 obj <<
+/D [5429 0 R /XYZ 192.609 498.722 null]
+>> endobj
+5451 0 obj <<
+/D [5429 0 R /XYZ 71.731 493.766 null]
+>> endobj
+5452 0 obj <<
+/D [5429 0 R /XYZ 71.731 479.651 null]
+>> endobj
+1130 0 obj <<
+/D [5429 0 R /XYZ 202.018 456.381 null]
+>> endobj
+5453 0 obj <<
+/D [5429 0 R /XYZ 71.731 453.846 null]
+>> endobj
+3255 0 obj <<
+/D [5429 0 R /XYZ 71.731 424.766 null]
+>> endobj
+1134 0 obj <<
+/D [5429 0 R /XYZ 471.556 394.527 null]
+>> endobj
+5454 0 obj <<
+/D [5429 0 R /XYZ 71.731 388.903 null]
+>> endobj
+3256 0 obj <<
+/D [5429 0 R /XYZ 71.731 313.834 null]
+>> endobj
+5455 0 obj <<
+/D [5429 0 R /XYZ 71.731 299.262 null]
+>> endobj
+1138 0 obj <<
+/D [5429 0 R /XYZ 252.027 276.996 null]
+>> endobj
+5456 0 obj <<
+/D [5429 0 R /XYZ 71.731 266.417 null]
+>> endobj
+5457 0 obj <<
+/D [5429 0 R /XYZ 71.731 266.417 null]
+>> endobj
+1142 0 obj <<
+/D [5429 0 R /XYZ 162.317 240.7 null]
+>> endobj
+5458 0 obj <<
+/D [5429 0 R /XYZ 239.103 224.88 null]
+>> endobj
+5459 0 obj <<
+/D [5429 0 R /XYZ 71.731 222.813 null]
+>> endobj
+1146 0 obj <<
+/D [5429 0 R /XYZ 174.677 199.542 null]
+>> endobj
+5460 0 obj <<
+/D [5429 0 R /XYZ 71.731 194.586 null]
+>> endobj
+5461 0 obj <<
+/D [5429 0 R /XYZ 71.731 139.519 null]
+>> endobj
+1150 0 obj <<
+/D [5429 0 R /XYZ 176.446 115.021 null]
+>> endobj
+5462 0 obj <<
+/D [5429 0 R /XYZ 71.731 114.877 null]
+>> endobj
+5463 0 obj <<
+/D [5429 0 R /XYZ 71.731 110.095 null]
+>> endobj
+5464 0 obj <<
+/D [5429 0 R /XYZ 71.731 97.173 null]
+>> endobj
+5465 0 obj <<
+/D [5429 0 R /XYZ 139.477 82.675 null]
+>> endobj
+5466 0 obj <<
+/D [5429 0 R /XYZ 71.731 79.778 null]
+>> endobj
+5467 0 obj <<
+/D [5429 0 R /XYZ 71.731 66.827 null]
+>> endobj
+5468 0 obj <<
+/D [5429 0 R /XYZ 139.477 54.282 null]
+>> endobj
+5428 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5472 0 obj <<
+/Length 1734      
+/Filter /FlateDecode
+>>
+stream
+xÚ­XKoÜ6\10¾ûWìq]Ø\8cH\89¢\88\9c\12?\8a´N\8\9b\ 2ES\18²Äõ
+ÖJ\e\18Eÿ{\87\1cRÒZ\92]\ 4\v\1dDQCÎÌ7O\92.<xèBP"|º\88<F"\11-\92í\91·¸\87??\1fQKqjIN\a4ïWGo.}¶\90D\86þbµ^°("A\10Â>!      B¾X¥\7f.Ï6ñ®QÕñ)\13Ñ\92\12|_eEûýÍÍê\98zÞò\14¾\8eé²ý\8eÿÎÞ}ÂÁy\95ýí\16~õ¸\a\ fFôø¯Õ/G\17«N8Î(\ 19^\12ß\92\8cÄg¢\17\9fRI8g\vÁ#â\81\1aZüm}ÿ\9c[G\16ø$ð\83)v\8c\88PÂhðëù»\93\8c2\ 6\92i\84ûýÆ¢\ 5\8c0\10ÉÑhÑê]\9c(\84g]Z\9cÊÂÎ\9c\1dÓhé\90ܪº\8eï\ 1c¥u\81\9d\19(A$çzëSà\1fÊ\0Þ!\91R\9a­ÏU\9dTÙ®ÉÊ®\18Èâ\81Ì\9cø\ 13¤«MV#\97º©Ú¤i++\81\9bnk\ 5\9cSühJG[Vó\92\14ü\ 2Wm¦h/?\^ãè[«uk\95þKz\15\ 5a\14U\f\ 4\89\9c\12\1e\8c´°>\12Ë$.¾µêö«ç±uyÛô;\ 4 f¨wp\eø!a\12=ãS¼µp\ 6ì98\11Ûã\11\82\97[\1eëlÀah`ë\ 5\9e\95\8aÆZ]3¬Ô®Òêתhâ\81ÅölÜ9\19\ 3Ëù\91aòù©(w5\98É)!\b\15\ 1
+C$õ\81\98B\1cðWT1SÿèM\16\11      =¹8\95ÀJ\98UmQg÷\85J\91(/\8b{\1c\99¥ë<¾¯ß\9a\85ÞÿY¤ªª¬n\932U\13\8b&ä«ó²qòý\84¯\8d\8aÓ\1fXlW7q\96ÿ0ëu\9eÕÍ\ f¯\ 6ÛVO\13«aÅm½Ë\8a¼L\1eÜ\12\ 3®\9e\98 Ï
+K¤yÔE\85$§#ÃýûvÚ\8b¬_\84\84\86èD\1fÕöNUõt\96\10P20ÚlhÁË\a£ÏeÔÀ\8b\b\17þÁ2ê`¿\89\8cê\13¨S\1dO-ecr\19äW#¯ÊSýÁ\97\9b2Oíü}^ÞÅyGc\9414©É\98w\99vVý³\86XTø«\84è\ãÐ$2ýÛD²/\¶\1af\10&8\11\82ÙL\0\15ïV\13_Þ^ÜÜ\ß\8cq\96>dm\9770\98!M\89\80x\92¡Å¸MF
+Lïó`ù¸Q\ 5\8ej-\1ad1óaÂ\v\87IY¤\99I%æ³L\92\16LÌø\94¸4ò\80\15\9f\12\97½¿º>ûu"×\81cxRÚ%©Ò`\17Ê08A\8eÍ&6ÂúV*£\14\93\90 t¡2JQTjS¶ÚL¾¤Ë\1c\82\eGºÊ\98·\86[\ f0qúÒ[ÞA`\1c\8bå\ 3Σ\95úª±§\18Ø\81s9RlF)°\ 3ç\91¥¶Ö×,\1cÃ\1a?³¢V\95\85\16>˵Õ-\94\ 4`ÙÓ\r¥§tY¨ï\r\8eºò8m\véA\1cG#\89¯\7f\ac|ù4a\b\9d§ÅM£¶;ËÈ \bï8ùÖfU'Ç£\1e0\93<NpÎ:\13µ\18\e\84"â=ï3Ý@À\97ë6Ï'$÷¡Ò\88±ä\97_®®ÆbG\90~Xà\\1e\5\ 1´íþ¶D\ 6\81á\84s/Z\19|\91Ó1ç\8b\8f¿­þ\98°2#ÔcÓ¬\8bÒ\ 6\1f¤Ç\88±=[Æ9¸\ 1\90ê6È\97\ 6@=²-\ eÌ`\8b\ 3\83\172\ 3\85z̽qf8¿xw>\89\92\17º¸\1cD´fb$\87Ø7ý\ 2Á¹/µ\93\ emª¥ëmÊ<À)\14c\9bB\a\94É{z\fy°©Ê'\95\12ç\vD2\ eo\9f\88\b±èëø\\1dð¡I\ f\ 4=X\1d\18ì7ÛY;\1a-áº\ 5sT\9dB]+\8c\1aß6_2!\ 6è"V¶¡6:#Tºñ\98Ó\96éd-ÄÁ´\1dì7«­£Ñ²íJè
+\9cº®AïZî¾çÔ:\9c ÂP\10Áζ\95×¾<ÖÛæ0h\99\ e8      £Ã\9d\9f\ 6ûÍëmi^×ÛÄ+\98ô\ 4?\1f!ZÀ'ìÏÉ¥\90\1eó'wpÑY^¥\ 3\84pdË\15F\r¾c}:JU:ë;ºÏ\80Þq\16F}Î\91\87C±Ûn\1eD$\99ÅPwºû±Ò¡º®\94B\172\r¨E ®Ë$\8b\1e³f3<æÌ9\97i\8aç`¡QD"y¸¨\1aì7\v\8c£yÝ»¶j[VÖY 6\80\vtåax\9cï½1\e\86[_ÿç\1c\86á\11Àt:s\0\85\1eT\93Ã5Û\83ýæ\ 1²4]{c#\r;²!Rª¨»\9b\84¸)·Y\92\ 1HÍÓ¾_õ\91µ\8d\8bl×æñ OïTe>gѲ-$\9e\84faò¡ä\1f®\14õÛÍ\83\84$Z¶¢Õ§«}\9d\87­Dç\ f\a¼Öñ\87×:2Ø»Ö\81O}Ý`î\1aÌo>¸ \90\81+\160ÂÈ5=\97!ûÐà¼Û5Ûîrµ\85m\8c\1e0\11ÛýbË\15:\8a\áT®M_< %w±\0D¶{öö\8f\ 4}b\ 1Iwq5\8aª]U&æÆD3Aç0ó+ç\91º\ f~\1aÂ\8bÀ;\7f4\97Wéþ\15U'¯vècÝç?8\92>võ-&\ 2\ f²ö½/\87s\8dï:5sO0¶\ e\93$\8a\\9bªï@És\87µ\17´, Ò\13/^áö$î\ 6W\10\9dµÖÏöЬ®Ï.nÞY|>|^áÀçÐ\ 4£\8cÃëßÀ\8fH\10º³¨/f®iÇ\12þ\aÝ!\94iendstream
+endobj
+5471 0 obj <<
+/Type /Page
+/Contents 5472 0 R
+/Resources 5470 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5473 0 obj <<
+/D [5471 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5474 0 obj <<
+/D [5471 0 R /XYZ 71.731 768.009 null]
+>> endobj
+5475 0 obj <<
+/D [5471 0 R /XYZ 71.731 755.979 null]
+>> endobj
+5476 0 obj <<
+/D [5471 0 R /XYZ 139.477 743.434 null]
+>> endobj
+1154 0 obj <<
+/D [5471 0 R /XYZ 192.609 716.435 null]
+>> endobj
+5477 0 obj <<
+/D [5471 0 R /XYZ 71.731 711.48 null]
+>> endobj
+3257 0 obj <<
+/D [5471 0 R /XYZ 71.731 684.821 null]
+>> endobj
+5478 0 obj <<
+/D [5471 0 R /XYZ 71.731 671.909 null]
+>> endobj
+1158 0 obj <<
+/D [5471 0 R /XYZ 248.515 649.529 null]
+>> endobj
+5479 0 obj <<
+/D [5471 0 R /XYZ 71.731 638.95 null]
+>> endobj
+5480 0 obj <<
+/D [5471 0 R /XYZ 71.731 638.95 null]
+>> endobj
+1162 0 obj <<
+/D [5471 0 R /XYZ 162.317 613.233 null]
+>> endobj
+5481 0 obj <<
+/D [5471 0 R /XYZ 239.103 597.413 null]
+>> endobj
+5482 0 obj <<
+/D [5471 0 R /XYZ 71.731 595.346 null]
+>> endobj
+1166 0 obj <<
+/D [5471 0 R /XYZ 174.677 572.075 null]
+>> endobj
+5483 0 obj <<
+/D [5471 0 R /XYZ 71.731 567.119 null]
+>> endobj
+5484 0 obj <<
+/D [5471 0 R /XYZ 71.731 465.417 null]
+>> endobj
+1170 0 obj <<
+/D [5471 0 R /XYZ 176.446 440.919 null]
+>> endobj
+5485 0 obj <<
+/D [5471 0 R /XYZ 71.731 440.775 null]
+>> endobj
+5486 0 obj <<
+/D [5471 0 R /XYZ 71.731 435.993 null]
+>> endobj
+5487 0 obj <<
+/D [5471 0 R /XYZ 71.731 421.118 null]
+>> endobj
+5488 0 obj <<
+/D [5471 0 R /XYZ 139.477 408.573 null]
+>> endobj
+5489 0 obj <<
+/D [5471 0 R /XYZ 419.578 408.573 null]
+>> endobj
+5490 0 obj <<
+/D [5471 0 R /XYZ 319.572 395.621 null]
+>> endobj
+5491 0 obj <<
+/D [5471 0 R /XYZ 315.036 382.67 null]
+>> endobj
+5492 0 obj <<
+/D [5471 0 R /XYZ 230.085 369.719 null]
+>> endobj
+5493 0 obj <<
+/D [5471 0 R /XYZ 170.555 356.767 null]
+>> endobj
+5494 0 obj <<
+/D [5471 0 R /XYZ 374.197 356.767 null]
+>> endobj
+5495 0 obj <<
+/D [5471 0 R /XYZ 260.979 343.816 null]
+>> endobj
+5496 0 obj <<
+/D [5471 0 R /XYZ 71.731 327.967 null]
+>> endobj
+5497 0 obj <<
+/D [5471 0 R /XYZ 71.731 315.878 null]
+>> endobj
+5498 0 obj <<
+/D [5471 0 R /XYZ 139.477 302.471 null]
+>> endobj
+5499 0 obj <<
+/D [5471 0 R /XYZ 71.731 299.574 null]
+>> endobj
+5500 0 obj <<
+/D [5471 0 R /XYZ 71.731 288.575 null]
+>> endobj
+5501 0 obj <<
+/D [5471 0 R /XYZ 139.477 274.077 null]
+>> endobj
+5502 0 obj <<
+/D [5471 0 R /XYZ 71.731 271.18 null]
+>> endobj
+5503 0 obj <<
+/D [5471 0 R /XYZ 71.731 260.181 null]
+>> endobj
+5504 0 obj <<
+/D [5471 0 R /XYZ 139.477 245.684 null]
+>> endobj
+5505 0 obj <<
+/D [5471 0 R /XYZ 71.731 242.787 null]
+>> endobj
+5506 0 obj <<
+/D [5471 0 R /XYZ 71.731 231.788 null]
+>> endobj
+5507 0 obj <<
+/D [5471 0 R /XYZ 139.477 217.29 null]
+>> endobj
+5508 0 obj <<
+/D [5471 0 R /XYZ 71.731 214.393 null]
+>> endobj
+5509 0 obj <<
+/D [5471 0 R /XYZ 71.731 201.442 null]
+>> endobj
+5510 0 obj <<
+/D [5471 0 R /XYZ 139.477 188.897 null]
+>> endobj
+5511 0 obj <<
+/D [5471 0 R /XYZ 71.731 186 null]
+>> endobj
+5512 0 obj <<
+/D [5471 0 R /XYZ 71.731 173.91 null]
+>> endobj
+5513 0 obj <<
+/D [5471 0 R /XYZ 139.477 160.503 null]
+>> endobj
+5514 0 obj <<
+/D [5471 0 R /XYZ 71.731 157.606 null]
+>> endobj
+5515 0 obj <<
+/D [5471 0 R /XYZ 71.731 146.607 null]
+>> endobj
+5516 0 obj <<
+/D [5471 0 R /XYZ 139.477 132.11 null]
+>> endobj
+5517 0 obj <<
+/D [5471 0 R /XYZ 71.731 130.334 null]
+>> endobj
+1174 0 obj <<
+/D [5471 0 R /XYZ 192.609 105.111 null]
+>> endobj
+5518 0 obj <<
+/D [5471 0 R /XYZ 71.731 100.155 null]
+>> endobj
+5519 0 obj <<
+/D [5471 0 R /XYZ 476.687 76.817 null]
+>> endobj
+3258 0 obj <<
+/D [5471 0 R /XYZ 71.731 60.545 null]
+>> endobj
+5470 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5522 0 obj <<
+/Length 1120      
+/Filter /FlateDecode
+>>
+stream
+xÚÕWIoÛF\14¾ûWð(\15ådV\ e\89\9e\7.R\14     à\b½Ô\85ASC\99¨D2\\9c¸¿¾o83\DÊJ
+åPè \8aóÖï-\9f\86x\18\93\ 4IF¼\10S\14ÊÐK\ eWØÛÁɯWÄJøVÄ\1fÉü¼¹zs˨\17¡(`Þ&õh\18\ 3°\13 \1e\bo³ýsuó\14\97\8dªÖ>\95á\8a óý{\96·_ÞÜmÖ\ 4ã\95\ f¿ÖdÕ~1g7×ïÍÃ/Uöì\14ï±À \ 6gðDÖ\7fm~»z»é\83\13\94 \88ãµð­È,|J="\11%BÇos\94\11É.ü$Î?µêá\1ec\9a\16\ f;Õ<dy½/\1a\1d\82Ñæ\88AÊ Í%
+)¸b\ 1¢QÐi¿\8f\ fÊHò\11LØó\89èdG\1eÒlɾ\1c´\bã\88Ê\0´µÖ=¥Ò@\13ï÷E\127Êüêt»§´°Ø5OÝ\99\eyÙÚÃ"µß¹Õ»Y\93\90?¨º\8ewjÈ\91 Ht\bù.
+\9f
+ÄXØÅòñ%/Ê:«ûL%"\92»L\ 3d\1a!ËmR\ 2\ f\ 2\1dö¡Íé5$ÆV£\bA9\1c\10Ð\19uSµ       d\16@7\8d\8dØW?X¿dä\173Ä°´6´ðÜÍ$¶\1f\8d©\ 5O:ÆÞÓ\92+\8d\1equÓÒåÜ\17\10\ 6ÀFÖ|&1\84\15y~\ 4ýl{ô°]\88\9e¡\11Dä§åb\82\8cÏ"DÀ \96¼®víAåMÝ;\9e\84ñà\13ÄÆS\bF      ê\89\10£P,M!E2\88àittüÝ\ f\14\12Ô\93Û\9b3\ 3;\1e  N\11\85á³":°²\0ØÜÖh\8aÉ\ 4\84«Ûw·\1fì\9cèBÂÖiÚJÍ\93õÁy\10ñ\ e!\19\92\16s\16\14q!/\97ô`ïtÖVædÚÝ^È\8a|ú¶n`1\90\95Eäu¼ÜnÙ\ eË\ 5\9dC\8b\8e{r\11\11\ 6Í\8ba5Ø;\8d\95\95Ñ¡\15¥\ 6\9b\9c\92âp\88s\9b`\×E\92ź/\Î\9f³æé\1c\18Ó©rhÐ\0E\91\99«;\ 5}¦ë\10ÊÕ\1fkÉÁV«æ+Þ\10\ 3ã\ 6Â\8d«BÚæÉPǪ³U\9b\1f\9a\ eªüle\9f;ËÝc\96öÕ¬Ü+§f\v\9dVjÆ\eY>\1f\1aðbç\ 66\1eØ\a®\18¥Þó§ï(PÀ:\vø\ 2\81\ 2\ 1]\90@g¬13ÿ\15üY©½\8akU\1fãà\86!m+è\0\80Ù\ eIY\15     ðc\96ï.Æ\8f\98ü\a\86<Îõ\7fÂ\90K\9e$
+\b\1d\11ä   Oò\1c\9f±\0ú\ e\14¾\91ÒØYJ£\ 1\a¹ðb+kdïäÊr2ß\9fÕNf\r\83Èøå\98|dïtÖVæ|Öä\96\95\8a\16ò®÷/vW'\9fÚ¬r«úñe¾CH\ 4½B¿â\9fçt\87\80R?\14\8bÛ\1f\82GÒÔø\12ë\9f2XÖù?ªÒéSn·¿9p»\1e^gù6ÓÜT¯©Ð\93¨\8f\9b§¸1§f\7f\99g³À;\81Ïz\8fǵy¯\ eeóbÞ?*¸;Xñ\ 4\9a+\9c1«îh©\83¡\v\9e\ 2
+GÜ¥õ]  ë§¢Ý;Zí|ÿ­ãòÛÒ^FÚ¦¿ ÔÙVM¯*}á¿\81\82Ø\ 2\ 5Å\8fEõ}oq\v\1e&\9d\ e\96\199ÅC¶\7fû\7f$ÚÖ¨á\8fFÕÞXáßM\84å«÷öAÄ]Û%ÒwÜôÈ\86\ eêÃÍÛ»k{U\7f÷qc\1e\98 \98\9atÆw~ÎB$\88K\87\85'îæó\bÿ\ 5¬É\1c*endstream
+endobj
+5521 0 obj <<
+/Type /Page
+/Contents 5522 0 R
+/Resources 5520 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5523 0 obj <<
+/D [5521 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5524 0 obj <<
+/D [5521 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1178 0 obj <<
+/D [5521 0 R /XYZ 269.69 755.597 null]
+>> endobj
+5525 0 obj <<
+/D [5521 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5526 0 obj <<
+/D [5521 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1182 0 obj <<
+/D [5521 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5527 0 obj <<
+/D [5521 0 R /XYZ 251.059 703.48 null]
+>> endobj
+5528 0 obj <<
+/D [5521 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1186 0 obj <<
+/D [5521 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5529 0 obj <<
+/D [5521 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5530 0 obj <<
+/D [5521 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5531 0 obj <<
+/D [5521 0 R /XYZ 136.77 661.642 null]
+>> endobj
+5532 0 obj <<
+/D [5521 0 R /XYZ 235.772 661.642 null]
+>> endobj
+5533 0 obj <<
+/D [5521 0 R /XYZ 339.079 661.642 null]
+>> endobj
+5534 0 obj <<
+/D [5521 0 R /XYZ 364.906 661.642 null]
+>> endobj
+5535 0 obj <<
+/D [5521 0 R /XYZ 468.213 661.642 null]
+>> endobj
+5536 0 obj <<
+/D [5521 0 R /XYZ 498.38 661.642 null]
+>> endobj
+5537 0 obj <<
+/D [5521 0 R /XYZ 119.552 652.315 null]
+>> endobj
+5538 0 obj <<
+/D [5521 0 R /XYZ 71.731 638.534 null]
+>> endobj
+1190 0 obj <<
+/D [5521 0 R /XYZ 187.959 613.196 null]
+>> endobj
+5539 0 obj <<
+/D [5521 0 R /XYZ 71.731 610.631 null]
+>> endobj
+5540 0 obj <<
+/D [5521 0 R /XYZ 71.731 605.849 null]
+>> endobj
+5541 0 obj <<
+/D [5521 0 R /XYZ 71.731 605.849 null]
+>> endobj
+5542 0 obj <<
+/D [5521 0 R /XYZ 71.731 595.253 null]
+>> endobj
+5543 0 obj <<
+/D [5521 0 R /XYZ 139.477 580.85 null]
+>> endobj
+5544 0 obj <<
+/D [5521 0 R /XYZ 71.731 577.953 null]
+>> endobj
+5545 0 obj <<
+/D [5521 0 R /XYZ 71.731 577.953 null]
+>> endobj
+5546 0 obj <<
+/D [5521 0 R /XYZ 71.731 565.505 null]
+>> endobj
+5547 0 obj <<
+/D [5521 0 R /XYZ 139.477 552.457 null]
+>> endobj
+5548 0 obj <<
+/D [5521 0 R /XYZ 71.731 549.559 null]
+>> endobj
+5549 0 obj <<
+/D [5521 0 R /XYZ 71.731 549.559 null]
+>> endobj
+5550 0 obj <<
+/D [5521 0 R /XYZ 71.731 538.466 null]
+>> endobj
+5551 0 obj <<
+/D [5521 0 R /XYZ 139.477 524.063 null]
+>> endobj
+5552 0 obj <<
+/D [5521 0 R /XYZ 71.731 520.335 null]
+>> endobj
+1194 0 obj <<
+/D [5521 0 R /XYZ 202.018 497.064 null]
+>> endobj
+5553 0 obj <<
+/D [5521 0 R /XYZ 71.731 494.53 null]
+>> endobj
+3259 0 obj <<
+/D [5521 0 R /XYZ 71.731 465.45 null]
+>> endobj
+5554 0 obj <<
+/D [5521 0 R /XYZ 71.731 452.538 null]
+>> endobj
+1198 0 obj <<
+/D [5521 0 R /XYZ 272.565 430.158 null]
+>> endobj
+5555 0 obj <<
+/D [5521 0 R /XYZ 71.731 419.579 null]
+>> endobj
+5556 0 obj <<
+/D [5521 0 R /XYZ 71.731 419.579 null]
+>> endobj
+1202 0 obj <<
+/D [5521 0 R /XYZ 162.317 393.862 null]
+>> endobj
+5557 0 obj <<
+/D [5521 0 R /XYZ 251.059 378.042 null]
+>> endobj
+5558 0 obj <<
+/D [5521 0 R /XYZ 71.731 375.974 null]
+>> endobj
+1206 0 obj <<
+/D [5521 0 R /XYZ 174.677 352.704 null]
+>> endobj
+5559 0 obj <<
+/D [5521 0 R /XYZ 71.731 347.748 null]
+>> endobj
+5560 0 obj <<
+/D [5521 0 R /XYZ 71.731 345.357 null]
+>> endobj
+5561 0 obj <<
+/D [5521 0 R /XYZ 136.77 336.203 null]
+>> endobj
+5562 0 obj <<
+/D [5521 0 R /XYZ 235.772 336.203 null]
+>> endobj
+5563 0 obj <<
+/D [5521 0 R /XYZ 339.079 336.203 null]
+>> endobj
+5564 0 obj <<
+/D [5521 0 R /XYZ 364.906 336.203 null]
+>> endobj
+5565 0 obj <<
+/D [5521 0 R /XYZ 463.909 336.203 null]
+>> endobj
+5566 0 obj <<
+/D [5521 0 R /XYZ 71.731 322.422 null]
+>> endobj
+1210 0 obj <<
+/D [5521 0 R /XYZ 187.959 297.084 null]
+>> endobj
+5567 0 obj <<
+/D [5521 0 R /XYZ 71.731 294.52 null]
+>> endobj
+5568 0 obj <<
+/D [5521 0 R /XYZ 71.731 289.738 null]
+>> endobj
+5569 0 obj <<
+/D [5521 0 R /XYZ 71.731 289.738 null]
+>> endobj
+5570 0 obj <<
+/D [5521 0 R /XYZ 71.731 279.142 null]
+>> endobj
+5571 0 obj <<
+/D [5521 0 R /XYZ 139.477 264.738 null]
+>> endobj
+5572 0 obj <<
+/D [5521 0 R /XYZ 71.731 261.841 null]
+>> endobj
+5573 0 obj <<
+/D [5521 0 R /XYZ 71.731 261.841 null]
+>> endobj
+5574 0 obj <<
+/D [5521 0 R /XYZ 71.731 250.748 null]
+>> endobj
+5575 0 obj <<
+/D [5521 0 R /XYZ 139.477 236.345 null]
+>> endobj
+5576 0 obj <<
+/D [5521 0 R /XYZ 333.766 236.345 null]
+>> endobj
+5577 0 obj <<
+/D [5521 0 R /XYZ 71.731 232.617 null]
+>> endobj
+1214 0 obj <<
+/D [5521 0 R /XYZ 202.018 209.346 null]
+>> endobj
+5578 0 obj <<
+/D [5521 0 R /XYZ 71.731 206.812 null]
+>> endobj
+3260 0 obj <<
+/D [5521 0 R /XYZ 71.731 164.78 null]
+>> endobj
+5579 0 obj <<
+/D [5521 0 R /XYZ 71.731 151.869 null]
+>> endobj
+1218 0 obj <<
+/D [5521 0 R /XYZ 290.417 129.489 null]
+>> endobj
+5580 0 obj <<
+/D [5521 0 R /XYZ 71.731 118.91 null]
+>> endobj
+5581 0 obj <<
+/D [5521 0 R /XYZ 71.731 118.91 null]
+>> endobj
+1222 0 obj <<
+/D [5521 0 R /XYZ 162.317 93.193 null]
+>> endobj
+5582 0 obj <<
+/D [5521 0 R /XYZ 263.014 77.372 null]
+>> endobj
+5583 0 obj <<
+/D [5521 0 R /XYZ 71.731 75.808 null]
+>> endobj
+5520 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5586 0 obj <<
+/Length 1133      
+/Filter /FlateDecode
+>>
+stream
+xÚíXKoÛF\10¾ûWð(\15Õ\9aû^¢'×\8d\8b\14E\ 28B/I!ÐÒJ& \91
+\1fn\94_ßÙ\aÉ\95H©)*\17(PðÀ!w^ßÌìÌ\928\8aáÂ\91ÄHR\1c©\98 %U´ÜÝÄÑ\ 6V~¾Á\9ecæYf\ 1Ï\8fó\9bÛ\a\ 4%\82FóuD\94B\8c     Ð#\10\13<\9a¯>Nî\9fÓ}­Ëé\8cH5ÁÈÝ\7fÍòæËíã|\8aãx2\83§)\9e4_ÜÚýÝ;GüTf/­à§\98ÇÀ\ 6k@áéïó_nÞÌ;ç8Á\bü¸ä¾g\19¸OH\841J87þc\9c ÎI$¹B1à0þ\7f8äžÊ*cóö\81Á"Â\92\19î8\9aa\81\1cÊ,¯\1d\ 3\8f{\ 6,\11Á
\fÇ2Í?7z±ÎÖÅ"}*Êz\91åÕ¶¨\87zq,\91ÀØË\19äU]6Ëz:\13\10­P\8f\7fõ\9d7\8dC\1d\14ÑXz\1d\86yÄNèÞ÷NÕ\88%ãäEK¡·g\10\85\96L\ 2\7fp<GÁ\9fQ\19#¬(\10     \82LXæ»rÓìt^W\9dá®ØLø%Ô$;\82\18\96E\9bN\ 1\8ac\85Çê\82 )\12 \82¥Ó{WB\98\10(! \ 2\86\15f\ 4\11(\9d\96Çø¶/ <ÚJ®\v\7f\7fÖ\8exxûðÞQ6ø°\13ê¦ÔC¼30/\12\ 6~P$½æ6Ü£¨\19FB©ë¡îõ\9dGíyþ\1aµõÜRûR¿dE\ 3¸«íÁ½J\97\9f\9b¬Ô+÷ôtè*ª7\98`\ 4\18\87[k£\8f\91\97\14\84ºM\81Fk\90q$\rZ"P\92¸\1a\90\90\1c|QròÛT²IºmôP»©G\8e(£VhÞ\ 2Í\8bü«.=ü\17+jÉ,_e&Ùi­«)áf\ 3º\0¥uÛòb²ör\7fL1D¥r\ fëf»í}7[ËùÎ$RÆu\ e(\ 5\r#ãT-ÀR½(\9a:\88\ e(`à³0
+Zy*\10I\ó{\97îô0ø\ e©á=\8dþ\88\85£*\ 1Í´kl\84H\8f\19¤|âs\9fsH£#J\9d®\ eÇ%#'ë²Ø\8dí¢\91\84¶6g\ 4rCÕ«µô!òÿJK\1f3e\ 2\88EÐÓ÷C[0P9ÿ\86¦® RÔõ\9b:UÐ\97@èZí-Ðw¶½µ<¯ßÔ÷gas\8a\12y=Ô\9dºó \1dËYÌÛb\99ÖY\91\1f¿­ê¢\ 4Ô>\1c\97\83UlW]\aèç¹MNåxën#y\9dÎ-ä$×\e\0öâ\9fÚÖ-|ë\ eû6,û¾\r\14l°ÆËd\95\13л}}\98bàFn¡³±/ª¬·Q\94\8eß\ f\8cЪ\84N\b\93²j·\8du\9a\0\84\8bÝÎ6O.°\8d½¶tlºXáßÚÈ\1a
+\ 6ª½Û¸\1aÂÎ!\18*îmq²ºnò¥Mð`\10\80[\88%W\18æ=(\9b\10\94\8d\92b|R5Ë¥®*3ø\ eîM\7fB0On·)Æ&Ð\81÷Mí¥,`C=\9bÑi\b\83ÍÜ\9f¼âRouZµj\9e¼òºµ»LÛI{:þ\8c\93d\80z]jý­ã\ fr=<Õ\10Û\G>\186i\96\9cÀw×ð\Ó\9f\r(çH\bqáp0âû\95\ f\a\7f':ýáÀHµ\aÅÂTA{,\f\16ê7ôúß\1fÿClÿ\7fѽâ\17\1dT³L®÷A׫;;\ 5=Ë?\99ü!\10ÿ7\850\94Äòâÿ\96\9e¥ýÝ"í8^\9fè0\9e½¿\7fóxç\7f±¼ý0w\ 4å8&.Øá¿\1aF\15â]\96iræ\9fÊÐÃ?\ 1#\e\93
+endstream
+endobj
+5585 0 obj <<
+/Type /Page
+/Contents 5586 0 R
+/Resources 5584 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5587 0 obj <<
+/D [5585 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5588 0 obj <<
+/D [5585 0 R /XYZ 71.731 814.833 null]
+>> endobj
+1226 0 obj <<
+/D [5585 0 R /XYZ 174.677 758.046 null]
+>> endobj
+5589 0 obj <<
+/D [5585 0 R /XYZ 71.731 753.091 null]
+>> endobj
+5590 0 obj <<
+/D [5585 0 R /XYZ 71.731 750.7 null]
+>> endobj
+5591 0 obj <<
+/D [5585 0 R /XYZ 136.77 741.546 null]
+>> endobj
+5592 0 obj <<
+/D [5585 0 R /XYZ 244.381 741.546 null]
+>> endobj
+5593 0 obj <<
+/D [5585 0 R /XYZ 347.688 741.546 null]
+>> endobj
+5594 0 obj <<
+/D [5585 0 R /XYZ 373.515 741.546 null]
+>> endobj
+5595 0 obj <<
+/D [5585 0 R /XYZ 472.517 741.546 null]
+>> endobj
+5596 0 obj <<
+/D [5585 0 R /XYZ 71.731 727.765 null]
+>> endobj
+1230 0 obj <<
+/D [5585 0 R /XYZ 187.959 702.427 null]
+>> endobj
+5597 0 obj <<
+/D [5585 0 R /XYZ 71.731 699.863 null]
+>> endobj
+5598 0 obj <<
+/D [5585 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5599 0 obj <<
+/D [5585 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5600 0 obj <<
+/D [5585 0 R /XYZ 71.731 684.484 null]
+>> endobj
+5601 0 obj <<
+/D [5585 0 R /XYZ 139.477 670.081 null]
+>> endobj
+5602 0 obj <<
+/D [5585 0 R /XYZ 71.731 667.184 null]
+>> endobj
+5603 0 obj <<
+/D [5585 0 R /XYZ 71.731 667.184 null]
+>> endobj
+5604 0 obj <<
+/D [5585 0 R /XYZ 71.731 656.091 null]
+>> endobj
+5605 0 obj <<
+/D [5585 0 R /XYZ 139.477 641.688 null]
+>> endobj
+5606 0 obj <<
+/D [5585 0 R /XYZ 333.766 641.688 null]
+>> endobj
+5607 0 obj <<
+/D [5585 0 R /XYZ 71.731 637.96 null]
+>> endobj
+1234 0 obj <<
+/D [5585 0 R /XYZ 202.018 614.689 null]
+>> endobj
+5608 0 obj <<
+/D [5585 0 R /XYZ 71.731 612.155 null]
+>> endobj
+3261 0 obj <<
+/D [5585 0 R /XYZ 71.731 583.075 null]
+>> endobj
+5609 0 obj <<
+/D [5585 0 R /XYZ 71.731 570.163 null]
+>> endobj
+1238 0 obj <<
+/D [5585 0 R /XYZ 286.595 547.783 null]
+>> endobj
+5610 0 obj <<
+/D [5585 0 R /XYZ 71.731 537.204 null]
+>> endobj
+5611 0 obj <<
+/D [5585 0 R /XYZ 71.731 537.204 null]
+>> endobj
+1242 0 obj <<
+/D [5585 0 R /XYZ 162.317 511.487 null]
+>> endobj
+5612 0 obj <<
+/D [5585 0 R /XYZ 263.014 495.666 null]
+>> endobj
+5613 0 obj <<
+/D [5585 0 R /XYZ 71.731 493.599 null]
+>> endobj
+1246 0 obj <<
+/D [5585 0 R /XYZ 174.677 470.328 null]
+>> endobj
+5614 0 obj <<
+/D [5585 0 R /XYZ 71.731 465.373 null]
+>> endobj
+5615 0 obj <<
+/D [5585 0 R /XYZ 71.731 462.982 null]
+>> endobj
+5616 0 obj <<
+/D [5585 0 R /XYZ 136.77 453.828 null]
+>> endobj
+5617 0 obj <<
+/D [5585 0 R /XYZ 244.381 453.828 null]
+>> endobj
+5618 0 obj <<
+/D [5585 0 R /XYZ 347.688 453.828 null]
+>> endobj
+5619 0 obj <<
+/D [5585 0 R /XYZ 373.515 453.828 null]
+>> endobj
+5620 0 obj <<
+/D [5585 0 R /XYZ 476.822 453.828 null]
+>> endobj
+5621 0 obj <<
+/D [5585 0 R /XYZ 71.731 440.047 null]
+>> endobj
+1250 0 obj <<
+/D [5585 0 R /XYZ 187.959 414.709 null]
+>> endobj
+5622 0 obj <<
+/D [5585 0 R /XYZ 71.731 412.145 null]
+>> endobj
+5623 0 obj <<
+/D [5585 0 R /XYZ 71.731 407.363 null]
+>> endobj
+5624 0 obj <<
+/D [5585 0 R /XYZ 71.731 407.363 null]
+>> endobj
+5625 0 obj <<
+/D [5585 0 R /XYZ 71.731 396.766 null]
+>> endobj
+5626 0 obj <<
+/D [5585 0 R /XYZ 139.477 382.363 null]
+>> endobj
+5627 0 obj <<
+/D [5585 0 R /XYZ 71.731 379.466 null]
+>> endobj
+5628 0 obj <<
+/D [5585 0 R /XYZ 71.731 379.466 null]
+>> endobj
+5629 0 obj <<
+/D [5585 0 R /XYZ 71.731 367.018 null]
+>> endobj
+5630 0 obj <<
+/D [5585 0 R /XYZ 139.477 353.97 null]
+>> endobj
+5631 0 obj <<
+/D [5585 0 R /XYZ 71.731 350.242 null]
+>> endobj
+1254 0 obj <<
+/D [5585 0 R /XYZ 202.018 326.971 null]
+>> endobj
+5632 0 obj <<
+/D [5585 0 R /XYZ 71.731 324.437 null]
+>> endobj
+5633 0 obj <<
+/D [5585 0 R /XYZ 387.044 298.677 null]
+>> endobj
+5634 0 obj <<
+/D [5585 0 R /XYZ 119.552 272.774 null]
+>> endobj
+5635 0 obj <<
+/D [5585 0 R /XYZ 277.957 272.774 null]
+>> endobj
+3262 0 obj <<
+/D [5585 0 R /XYZ 71.731 256.502 null]
+>> endobj
+5636 0 obj <<
+/D [5585 0 R /XYZ 71.731 243.591 null]
+>> endobj
+1258 0 obj <<
+/D [5585 0 R /XYZ 288.833 221.211 null]
+>> endobj
+5637 0 obj <<
+/D [5585 0 R /XYZ 71.731 210.632 null]
+>> endobj
+5638 0 obj <<
+/D [5585 0 R /XYZ 71.731 210.632 null]
+>> endobj
+1262 0 obj <<
+/D [5585 0 R /XYZ 162.317 184.915 null]
+>> endobj
+5639 0 obj <<
+/D [5585 0 R /XYZ 263.014 169.094 null]
+>> endobj
+5640 0 obj <<
+/D [5585 0 R /XYZ 71.731 167.027 null]
+>> endobj
+1266 0 obj <<
+/D [5585 0 R /XYZ 174.677 143.756 null]
+>> endobj
+5641 0 obj <<
+/D [5585 0 R /XYZ 71.731 138.801 null]
+>> endobj
+5642 0 obj <<
+/D [5585 0 R /XYZ 71.731 136.41 null]
+>> endobj
+5643 0 obj <<
+/D [5585 0 R /XYZ 136.77 127.256 null]
+>> endobj
+5644 0 obj <<
+/D [5585 0 R /XYZ 244.381 127.256 null]
+>> endobj
+5645 0 obj <<
+/D [5585 0 R /XYZ 347.688 127.256 null]
+>> endobj
+5646 0 obj <<
+/D [5585 0 R /XYZ 373.515 127.256 null]
+>> endobj
+5647 0 obj <<
+/D [5585 0 R /XYZ 472.517 127.256 null]
+>> endobj
+5648 0 obj <<
+/D [5585 0 R /XYZ 71.731 113.475 null]
+>> endobj
+1270 0 obj <<
+/D [5585 0 R /XYZ 187.959 88.137 null]
+>> endobj
+5649 0 obj <<
+/D [5585 0 R /XYZ 71.731 85.572 null]
+>> endobj
+5650 0 obj <<
+/D [5585 0 R /XYZ 71.731 80.79 null]
+>> endobj
+5651 0 obj <<
+/D [5585 0 R /XYZ 71.731 80.79 null]
+>> endobj
+5652 0 obj <<
+/D [5585 0 R /XYZ 71.731 70.194 null]
+>> endobj
+5653 0 obj <<
+/D [5585 0 R /XYZ 139.477 55.791 null]
+>> endobj
+5584 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5656 0 obj <<
+/Length 1235      
+/Filter /FlateDecode
+>>
+stream
+xÚíWMoã6\10½çW\bèE.V\8cHQ¢\84=¥iÜn\91Ý-²j\8b¢)\fƦl¢²¤ÕGºAÑÿÞ¡HÚ²%'Ù ÇÂ\a\eÎ{£ù\90°ãÃ\ f;\f#\16`'ö        \8aYì,·g¾³\86;?\9ca\83ð\fÄ\e`¾KÏÎç\ 1q\12\94D\81\93f\ e\89cDi\ 4çD\88\93®þp/7¼jE=ó\b\8b]\8côÿµ,º/ç7é\fû¾ëÁÕ\f»Ý\17}ïòâ\83^|_Ë{kxë\87>Àà\1e¬ðìÏô§³«tG.$\18\ 1\8fÇè\eÈ\88~\88÷ô1NP\18\12\87\851òA\86¢ßäe{ìn\87£\ 1¢\ 1\9dòG\10\8b\12X\rn\1dÿï¨aB\80\9a
+ñþ¼\9e\ea\ 3n\94 \ 2\9c,Fq«JYìBÛ\96æ\7f#ô¢gÞ¯ªZÜ˲\83\18\83ÞâËÏ\9d¬ÅJ_Ý=(\89çs:x\96\b4ú½§%/>wb\91ɬ\´¢i\17e×ÚÈ\1có\ 4~\91µC\ 6@ f( C\85ð\82\90¡\88E\8eG"\94$I\ f¼\11mW\17À&fî¯3F]\9ewb|º\ fÑ
+Q\0<\95Qª¤\ 6ÄwëÞZ©\818º÷½m\7fC\16YYo\e}Áï\80µ\86Ì!\16ïæ\1fõEÓòÖà\973ænx±\163\1c\ 3ù~ÏxÁî\967\7f\8dã\14@B\ 5\94\19Á\90 \8b9\9c<_Ì\7f¹¾\1e\v\88£>û4X\16\9eB@Dâ\ 4\11\12ªT\80(iq+¹\ 4\8c\84î\eðOÕ\93å\8a>Mô3V[s-\ 2¶þV\8cy£·³.Ïõö\9d\80\0\bk/ôfÖ\15ËV\96\10\83Bo,y\9e#\rJ-è\84Z`\88}:R{õþçô÷±\Ïâµ2ldë\87¢\95é\9cå&UsÞ\98\15°Æ._=\1c'óF\89ì\93V\88Âæw¹\14M#V\83tc\88`\9dn\94¡XUW\bù\1cÑa:ßú>\81\84æk.\8b£\8c\86\13(<ÖH\9d`\ f\b"D\12Ý\15>ð­\18\aGggLF%3ô\0ª¦Ê&\84òö\13\13×[B\98\96Ö\17xÝUF</LÅVeÓV¥j\9bâ \ 6²Xëë2\9bj\a\13Õh={\ 4
++\88{ÿ\9f\1e\8a²jd³\93È\10fÔJ\8cPh\9e£90ô÷\80>ðñDÛ\98\88òð`¬(áÈ\ 6\0Ú}ÓÖÝ\12tG0"\ eú\8fÞúÖøÆ\83\0\ 5¾-E\ 5\9eð£øYÈ\e\84'EòQOаír'\14\r#¡¦ÖÛÉfÈ(¢q\f\8b\ 4a\9d9\17õºÛ\8a¢mv~\ f2\8cÁ\1c\ e\ e\14NÍ&
+3\8c@,^k6\rÎ;9\9b,æéÙ¤ûV\9f\96*öª&ºZ\8cõzà>JTû\b\103\85õØD¦$A1\ e^Oõþ¼Óª\ræÿ\89l&²âoF\8ciÐ@¶°Ò3.Av\8e\9eÛ«mq*\1eF´X­Åâõ:õDù\1fx\18ÆÒ$Æq\9b¾TÓ×¾·n¡\ fóµ     ÄJäý[,ví$ëî\9a\87¦\15[}¹®yµÑKåt²CÛl|V\87V\83\16²Ñ\83÷]\9f\86O\bì·þé_Bb\14©)\90\80+vÊjØ\7fÕºïh*\98{«®häº\7f\15S ¼TóHÃóV®¾Ò@½\83L\98\f\99å\12r\7f#¸±\97E%DÝ|\9d\11\94Î\v¬8$ø½x\8e¡\8dy±jö3ÅÐU\9b/6\aâ'ìy[nåÒÂû§ÝÁ\vÒ\ 4RMñ=¨ªeù$¨è¶\1aã\8d\92æ\e\99­D¦±êíð·wé\8f\8b\9bôúé\14;\8an\ 5Âàefq*¾§ÒÆÚIU\1f\83\90î\f'ä)T6<U\97ã¿o\8f'\92ù\&\14%ÓSx÷A½\87Øïi\86\12¦Jùð\fåçãåÕÍ\85ù\86~÷)Õ\8b Ä>Ñ\8d`ø1N\83\18\85Øö*ê\9føh\1e\ fBè&<endstream
+endobj
+5655 0 obj <<
+/Type /Page
+/Contents 5656 0 R
+/Resources 5654 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5657 0 obj <<
+/D [5655 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5658 0 obj <<
+/D [5655 0 R /XYZ 71.731 814.833 null]
+>> endobj
+5659 0 obj <<
+/D [5655 0 R /XYZ 71.731 768.009 null]
+>> endobj
+5660 0 obj <<
+/D [5655 0 R /XYZ 71.731 768.009 null]
+>> endobj
+5661 0 obj <<
+/D [5655 0 R /XYZ 71.731 757.837 null]
+>> endobj
+5662 0 obj <<
+/D [5655 0 R /XYZ 139.477 743.434 null]
+>> endobj
+5663 0 obj <<
+/D [5655 0 R /XYZ 333.766 743.434 null]
+>> endobj
+1274 0 obj <<
+/D [5655 0 R /XYZ 202.018 716.435 null]
+>> endobj
+5664 0 obj <<
+/D [5655 0 R /XYZ 71.731 713.901 null]
+>> endobj
+5665 0 obj <<
+/D [5655 0 R /XYZ 421.899 701.093 null]
+>> endobj
+5666 0 obj <<
+/D [5655 0 R /XYZ 431.656 688.141 null]
+>> endobj
+3263 0 obj <<
+/D [5655 0 R /XYZ 71.731 658.918 null]
+>> endobj
+5667 0 obj <<
+/D [5655 0 R /XYZ 71.731 646.006 null]
+>> endobj
+1278 0 obj <<
+/D [5655 0 R /XYZ 303.157 623.626 null]
+>> endobj
+5668 0 obj <<
+/D [5655 0 R /XYZ 71.731 613.048 null]
+>> endobj
+5669 0 obj <<
+/D [5655 0 R /XYZ 71.731 613.048 null]
+>> endobj
+1282 0 obj <<
+/D [5655 0 R /XYZ 162.317 587.331 null]
+>> endobj
+5670 0 obj <<
+/D [5655 0 R /XYZ 268.991 571.51 null]
+>> endobj
+5671 0 obj <<
+/D [5655 0 R /XYZ 71.731 569.443 null]
+>> endobj
+1286 0 obj <<
+/D [5655 0 R /XYZ 174.677 546.172 null]
+>> endobj
+5672 0 obj <<
+/D [5655 0 R /XYZ 71.731 541.217 null]
+>> endobj
+5673 0 obj <<
+/D [5655 0 R /XYZ 71.731 538.825 null]
+>> endobj
+5674 0 obj <<
+/D [5655 0 R /XYZ 136.77 529.672 null]
+>> endobj
+5675 0 obj <<
+/D [5655 0 R /XYZ 248.686 529.672 null]
+>> endobj
+5676 0 obj <<
+/D [5655 0 R /XYZ 351.993 529.672 null]
+>> endobj
+5677 0 obj <<
+/D [5655 0 R /XYZ 377.819 529.672 null]
+>> endobj
+5678 0 obj <<
+/D [5655 0 R /XYZ 476.822 529.672 null]
+>> endobj
+5679 0 obj <<
+/D [5655 0 R /XYZ 71.731 515.89 null]
+>> endobj
+1290 0 obj <<
+/D [5655 0 R /XYZ 187.959 490.552 null]
+>> endobj
+5680 0 obj <<
+/D [5655 0 R /XYZ 71.731 487.988 null]
+>> endobj
+5681 0 obj <<
+/D [5655 0 R /XYZ 71.731 483.206 null]
+>> endobj
+5682 0 obj <<
+/D [5655 0 R /XYZ 71.731 483.206 null]
+>> endobj
+5683 0 obj <<
+/D [5655 0 R /XYZ 71.731 472.61 null]
+>> endobj
+5684 0 obj <<
+/D [5655 0 R /XYZ 139.477 458.207 null]
+>> endobj
+5685 0 obj <<
+/D [5655 0 R /XYZ 71.731 455.31 null]
+>> endobj
+5686 0 obj <<
+/D [5655 0 R /XYZ 71.731 455.31 null]
+>> endobj
+5687 0 obj <<
+/D [5655 0 R /XYZ 71.731 444.216 null]
+>> endobj
+5688 0 obj <<
+/D [5655 0 R /XYZ 139.477 429.813 null]
+>> endobj
+5689 0 obj <<
+/D [5655 0 R /XYZ 333.766 429.813 null]
+>> endobj
+5690 0 obj <<
+/D [5655 0 R /XYZ 71.731 426.085 null]
+>> endobj
+1294 0 obj <<
+/D [5655 0 R /XYZ 202.018 402.814 null]
+>> endobj
+5691 0 obj <<
+/D [5655 0 R /XYZ 71.731 400.28 null]
+>> endobj
+3264 0 obj <<
+/D [5655 0 R /XYZ 71.731 371.2 null]
+>> endobj
+5692 0 obj <<
+/D [5655 0 R /XYZ 71.731 358.288 null]
+>> endobj
+1298 0 obj <<
+/D [5655 0 R /XYZ 261.272 335.908 null]
+>> endobj
+5693 0 obj <<
+/D [5655 0 R /XYZ 71.731 325.33 null]
+>> endobj
+5694 0 obj <<
+/D [5655 0 R /XYZ 71.731 325.33 null]
+>> endobj
+1302 0 obj <<
+/D [5655 0 R /XYZ 162.317 299.612 null]
+>> endobj
+5695 0 obj <<
+/D [5655 0 R /XYZ 239.103 283.792 null]
+>> endobj
+5696 0 obj <<
+/D [5655 0 R /XYZ 71.731 281.725 null]
+>> endobj
+1306 0 obj <<
+/D [5655 0 R /XYZ 174.677 258.454 null]
+>> endobj
+5697 0 obj <<
+/D [5655 0 R /XYZ 71.731 253.498 null]
+>> endobj
+5698 0 obj <<
+/D [5655 0 R /XYZ 71.731 77.18 null]
+>> endobj
+5654 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5701 0 obj <<
+/Length 1771      
+/Filter /FlateDecode
+>>
+stream
+xÚÍYÛ\8eÛ6\10}ÏWø©ð\ 2\9bn/\ 5ÒͦH\91nÚ­óÔ\14\vÙ¦½BmÉÕ%Íþ}gÈ¡.¶´M\16\ 6ZøA\944\1aÎ\1c\1e\1e\ ei1ãð\13³H°H\89YÌ%\8b£x¶>¼à³\1d¼ùñ\85 \8b\ 5\99,z6?,_¼z«ä,aI¨fËíLÆ1Ó:\ 4?!Óa0[n~\9f_?¤ÇÚ\94W\v\19ÅsÁÜõ}\967_^Ý-¯\ 4çó\ 5Ü]\89yóŽ»~}ë\1aoÊì³ÿð\13\ f8\98Á;h\89«?\96?½¸Y¶Á\ 5R0\88ã©ðÉä,|)gB°$\b0~!\12\16\ 4r\16\ 5\90\aÆÿ³9¬LYa\97`\1duÉòÙBD\80\89²f\9f8\97Ûâ4°Ö¡\fXÄÅXd\92Ea\ 2­Þ«Ók\9b\84\90\12\92ÀÁèü¹,zq   -\99\84à½\rFwܧkã\90üûÁ\94Ô<\96Ù!«\ 1d\97\ zN\0¦$PÐ-~^Õe³®Ï!P1\vU@Fë4ÿ«1÷\ e\88ûÚuñöÝÛ\ f®\95Uîº/`¬×im6\f\1dBR¡f2\86¡\11\8aEpõhîël3\85g\98DLñèbxöüMâém0¾úÁCXTU¶ÚÓÝõ\95\88ç\9e¾\aSUé\ e\92¥\97ÙÆäu\86\99!\9d\88Õ\98&p\1c§\ 1Á\ 1!\85\89&4D\ f\8dCZý9\89G\18³DèËáÑù\eÁC1\99¨¶Ï\16\ f\15«.#{\87!¿tM²\90óuq8¦eV\15¹{±.ò
+ AHð¶È÷\8fçt\94\10\18\8f51m\9byn\f\9cñ(!£UVW¾\87²4Õ±È7Y¾£h
+w­\f\8cOMÀ\87\ 1Kàs@\ 1¨/{Nìèåî\8ay\9c\85§\13\16\8bÎ\8fÕ0¾\80\ 3`>>K\84}; $g:\8e\ 6Ã\9eåGCÊ3:æ2b\ 1\fíÅƼó7:æ\ 1ïúlÇ\s=ßg\15¢\84Íbë®é~ï\1a.\ 3ÛD) &\8cynÖ \ 1îvõè®à1+]\13rÇ%¡vwH\10×Âu`\84\1eQ\f\19Ç\84l\96\9b|3"Ø*`q\18¶ðÃ2âz-ÚÞ©·ô`ܨ(\ 1\ 2\17\f)\ 1ä>dyºïÖ¥\11>\84LÈð\19â\89\81ß×\18\9bç\ 5×,\8cÃ\ 1/\8a¦~\92\18A\1c2)/'\ 6=\7f£â\18IÕöÙ\89\81\f=1\94\f,1ð\91%\ 66\88\18ø\8e\88\81O{ÄÀ[$\ 6Z\10\11&\8f´À¶£\ 5\1a\ 2f4÷\13\ e¾\1cç\85\16,ng¯ã\ 5\1a\81W ¢Ï¨G\r\98°I\12ÿϨ\91®q9\7f\9a\1dZC\ 1t9Ùèù\e\95\8d\b@ò6\9dl¨N6\94r²¡:µP\9dZ(5P\vEj¡:µÀï\89\14ø\98´BMk\85`!,ãßN
+Ûiázl³è\8b\ 5T\83\91ø/\18A\95]V?¸\16\ 4ÕÕ\1d\15eV?º»4ßPÃR\85ìk¨Ç°vy\82Z\9dª\8e²\8aÃ\ 2¡.¨9\9d¿É\82ÌÛ\9c\14dYÞn7p´ü¢}Z\8eâ\96Ã\92Æ\ 2`IcM¿bÄ$\a]\11Á%&±\f#ÈE\ f\8aß\1e'Ç Ö j\17,õ:w\93@\93ɳp.\1a¬°\9e\v4lÍB¥/\ 2t$­}\9fÒf³3÷Me&·\19°\97e\91¾Ü6£ço\1a\19 \9dÖÅ![»v\ 3»
+z¼.\9aÜo\1f^â£\b\f+h²44Ù·Eé\95aKßn\8cÃ3+¨²E\11\1e\f"ÂÓ\13\85ÁÆDv\0¢¾L\ 2\b\ 5\94\82mäÅ\0ìüM\ 3H6C\0a\9b¶Ë=\1cÀ\90\8e@R\ 2m[\16\87\13 Ê4÷\88ó\96ð\96\86º\7fø\ 19'Ê/\19ׯo\7fýxóñæþ\97»w\1fîoï\16â\9c¸\v       !CI}Nʼ9LAªbüþb\88vî&\ 1%\13\1f\1c\11É\0\88°\9fõ\13\18"^y9°Ú\8a\1avF¿\8dY5»\9dÝ\86\9b\12\86¶X~ë7Jµ£±Û·û'k\e\15
\9e\\10\9cÎß4:dãá©N\17c\8aÜ\ 3°OaºÎ\1f\1d4ÑÜ|\ 6\14«N\ 4ï\96ï\17ßÛã1\9aâP1WþÌkôtÀ#\93åÅq\1a\19¥\98\88.7\11{þ¦\91!\eÚHÛ=ñ@i\ 6È\14GS¦8\ fA\90ª\7f¥\ 1¬\91Oe\võKtÁ\1a·ço:[²yf¶''\91mî2\84m\86óúÆTë2;ZÅ\1e=\8d\f\98Ò\ e¦åCf\ f?\ 4,\9aР  ê|S\1a÷¤4ÇÒT\8eu*æ0íèÅ&+\r­\ax\8be7V\91½GN\e±\85\87[ð2µ|·ý\14M¹&Gã\8b¹Ò¨\8fá×lÒ\83áf\f\:ÁE¹\82÷|Xd»\836Ô%\9dØã¤æ`\95\bîÆ#I ªhO\v¾e\aà\Ú\83^Û¶\1fÚÖC³rK¥½[>P4¤\97\ 1Ǹp$`u®Ü\83ï\10?WÑ8\ 3Ð\85ùé    *¸@ítE9L§@øÔÅIêt\9a¸¥J,;\1c÷æ`¬\10§8\80¬#\19T\9cÂ\91LG,¶Õ6J\98î\17Y\v\19GÃZªû^\ 3ÍB\8b\10}®`ïO\vÄ-m\87\86K£#'MaßCÈùh\ fý¹E\13\90Æ@Êhò\9cµ­jööO\83v9¯\9aUõXÕ\86Öô]\99\1eI\97Á¬6_:åµ5+\1dÆѼï\91\fC\1cûë\81þ\16\91\9a%ãçÑí\1f'\9d\89ÿß$bI\84i\ e}`o\1f®oî^Ó\7f%ï~[º\86
+\ 4\97\ e¤þ\9f.\1aê_ä\85\ 3IOý9r\1eá?"âQ²endstream
+endobj
+5700 0 obj <<
+/Type /Page
+/Contents 5701 0 R
+/Resources 5699 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5469 0 R
+>> endobj
+5702 0 obj <<
+/D [5700 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1310 0 obj <<
+/D [5700 0 R /XYZ 176.446 758.046 null]
+>> endobj
+5703 0 obj <<
+/D [5700 0 R /XYZ 71.731 757.903 null]
+>> endobj
+5704 0 obj <<
+/D [5700 0 R /XYZ 71.731 753.121 null]
+>> endobj
+5705 0 obj <<
+/D [5700 0 R /XYZ 71.731 740.198 null]
+>> endobj
+5706 0 obj <<
+/D [5700 0 R /XYZ 139.477 725.701 null]
+>> endobj
+5707 0 obj <<
+/D [5700 0 R /XYZ 245.199 725.701 null]
+>> endobj
+5708 0 obj <<
+/D [5700 0 R /XYZ 71.731 711.805 null]
+>> endobj
+5709 0 obj <<
+/D [5700 0 R /XYZ 139.477 697.307 null]
+>> endobj
+5710 0 obj <<
+/D [5700 0 R /XYZ 71.731 694.41 null]
+>> endobj
+5711 0 obj <<
+/D [5700 0 R /XYZ 71.731 683.411 null]
+>> endobj
+5712 0 obj <<
+/D [5700 0 R /XYZ 139.477 668.914 null]
+>> endobj
+5713 0 obj <<
+/D [5700 0 R /XYZ 365.377 668.914 null]
+>> endobj
+5714 0 obj <<
+/D [5700 0 R /XYZ 189.12 655.962 null]
+>> endobj
+5715 0 obj <<
+/D [5700 0 R /XYZ 71.731 654.923 null]
+>> endobj
+5716 0 obj <<
+/D [5700 0 R /XYZ 71.731 640.114 null]
+>> endobj
+5717 0 obj <<
+/D [5700 0 R /XYZ 139.477 627.569 null]
+>> endobj
+5718 0 obj <<
+/D [5700 0 R /XYZ 422.27 627.569 null]
+>> endobj
+5719 0 obj <<
+/D [5700 0 R /XYZ 185.603 614.617 null]
+>> endobj
+5720 0 obj <<
+/D [5700 0 R /XYZ 71.731 611.72 null]
+>> endobj
+5721 0 obj <<
+/D [5700 0 R /XYZ 71.731 598.769 null]
+>> endobj
+5722 0 obj <<
+/D [5700 0 R /XYZ 139.477 586.224 null]
+>> endobj
+5723 0 obj <<
+/D [5700 0 R /XYZ 418.632 586.224 null]
+>> endobj
+5724 0 obj <<
+/D [5700 0 R /XYZ 185.603 573.272 null]
+>> endobj
+5725 0 obj <<
+/D [5700 0 R /XYZ 71.731 570.375 null]
+>> endobj
+5726 0 obj <<
+/D [5700 0 R /XYZ 71.731 557.424 null]
+>> endobj
+5727 0 obj <<
+/D [5700 0 R /XYZ 139.477 544.879 null]
+>> endobj
+5728 0 obj <<
+/D [5700 0 R /XYZ 415.405 544.879 null]
+>> endobj
+5729 0 obj <<
+/D [5700 0 R /XYZ 185.603 531.927 null]
+>> endobj
+5730 0 obj <<
+/D [5700 0 R /XYZ 71.731 529.03 null]
+>> endobj
+5731 0 obj <<
+/D [5700 0 R /XYZ 71.731 518.031 null]
+>> endobj
+5732 0 obj <<
+/D [5700 0 R /XYZ 139.477 503.534 null]
+>> endobj
+5733 0 obj <<
+/D [5700 0 R /XYZ 348.161 503.534 null]
+>> endobj
+5734 0 obj <<
+/D [5700 0 R /XYZ 71.731 500.637 null]
+>> endobj
+5735 0 obj <<
+/D [5700 0 R /XYZ 71.731 489.638 null]
+>> endobj
+5736 0 obj <<
+/D [5700 0 R /XYZ 139.477 475.14 null]
+>> endobj
+5737 0 obj <<
+/D [5700 0 R /XYZ 353.88 475.14 null]
+>> endobj
+5738 0 obj <<
+/D [5700 0 R /XYZ 71.731 472.243 null]
+>> endobj
+5739 0 obj <<
+/D [5700 0 R /XYZ 71.731 459.292 null]
+>> endobj
+5740 0 obj <<
+/D [5700 0 R /XYZ 139.477 446.747 null]
+>> endobj
+5741 0 obj <<
+/D [5700 0 R /XYZ 71.731 443.85 null]
+>> endobj
+5742 0 obj <<
+/D [5700 0 R /XYZ 71.731 430.898 null]
+>> endobj
+5743 0 obj <<
+/D [5700 0 R /XYZ 139.477 418.353 null]
+>> endobj
+5744 0 obj <<
+/D [5700 0 R /XYZ 362.179 418.353 null]
+>> endobj
+5745 0 obj <<
+/D [5700 0 R /XYZ 71.731 415.456 null]
+>> endobj
+5746 0 obj <<
+/D [5700 0 R /XYZ 71.731 402.505 null]
+>> endobj
+5747 0 obj <<
+/D [5700 0 R /XYZ 139.477 389.96 null]
+>> endobj
+5748 0 obj <<
+/D [5700 0 R /XYZ 71.731 387.063 null]
+>> endobj
+5749 0 obj <<
+/D [5700 0 R /XYZ 71.731 374.111 null]
+>> endobj
+5750 0 obj <<
+/D [5700 0 R /XYZ 139.477 361.566 null]
+>> endobj
+5751 0 obj <<
+/D [5700 0 R /XYZ 71.731 358.669 null]
+>> endobj
+5752 0 obj <<
+/D [5700 0 R /XYZ 71.731 345.718 null]
+>> endobj
+5753 0 obj <<
+/D [5700 0 R /XYZ 139.477 333.173 null]
+>> endobj
+5754 0 obj <<
+/D [5700 0 R /XYZ 71.731 330.276 null]
+>> endobj
+5755 0 obj <<
+/D [5700 0 R /XYZ 71.731 317.324 null]
+>> endobj
+5756 0 obj <<
+/D [5700 0 R /XYZ 139.477 304.779 null]
+>> endobj
+5757 0 obj <<
+/D [5700 0 R /XYZ 71.731 301.051 null]
+>> endobj
+1314 0 obj <<
+/D [5700 0 R /XYZ 192.609 277.78 null]
+>> endobj
+5758 0 obj <<
+/D [5700 0 R /XYZ 71.731 272.825 null]
+>> endobj
+5759 0 obj <<
+/D [5700 0 R /XYZ 469.488 262.438 null]
+>> endobj
+5760 0 obj <<
+/D [5700 0 R /XYZ 211.22 249.486 null]
+>> endobj
+3265 0 obj <<
+/D [5700 0 R /XYZ 71.731 220.263 null]
+>> endobj
+5761 0 obj <<
+/D [5700 0 R /XYZ 71.731 207.351 null]
+>> endobj
+1318 0 obj <<
+/D [5700 0 R /XYZ 261.272 184.971 null]
+>> endobj
+5762 0 obj <<
+/D [5700 0 R /XYZ 71.731 174.393 null]
+>> endobj
+5763 0 obj <<
+/D [5700 0 R /XYZ 71.731 174.393 null]
+>> endobj
+1322 0 obj <<
+/D [5700 0 R /XYZ 162.317 148.675 null]
+>> endobj
+5764 0 obj <<
+/D [5700 0 R /XYZ 239.103 132.855 null]
+>> endobj
+5765 0 obj <<
+/D [5700 0 R /XYZ 71.731 118.698 null]
+>> endobj
+5699 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F51 3667 0 R /F42 3513 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5768 0 obj <<
+/Length 2183      
+/Filter /FlateDecode
+>>
+stream
+xÚ­\19]oã6ò}\7f\85\1f\9d\15\vÅ-\90ËÇ]\8a6Ùs¼\ fE[\ 4\8aDÇÂÚ\92\9bM\ fýï7Ã!%Ù\96\92[Àð\83ÈápÈù\9e¡ùÌ\85\1f\9f\85\9c\85\1e\9fE®`Q\18ÍÒí;wö\ 4+ÿzÇ\r\86cP\9c\ 1Î?\97ï>\{b\16³8ðfËÕLD\11\932\0:\ 1\93\81?[f¿Í/ÖIÕªúÌ\11a4ç\8c¾?çÅîÛ\87Åò\8c»îÜ\81Ù\19\9fï¾ÑÚÅù-\r.ëü«Ýø»ë»\80\ 6k0âg\7f,\7fzwµì.ç\vÎà\1e¯]ß \1c]_\88\19ç,ö}¼?ç1ó}1\vý\88¹À\aÞÿþ¥(«&oðÌ\ f×\12\16\19\ f¥Æ\16,æÞÌ\ 1Ê®$f\9b¶Þ¥í\99\13\0[iRü¹S\ fªÈ\9a\a\ 3ú/\12\99E,pã\99\13Ã}B½kW4ùS¡2BÚ\94Å\13\8dôÖÕ&yj~Ô\eÝá¦áQ\9b¼i\1fÖ*1\14\92´\ 5Éý\ 6ÂúÏç«ÏW\ f\9f\167w\ f·\8b\8fJ\9emÔwî(\10ð}{Ê];±    ä÷ÐT@³L¿X\ 1j\89 `\ 4ÿk\99\e\9ah,?а(Û|õ¢m¦[zCI?ü\89³÷4\19ÃÍ\9eÔ\0\17fï-û\1aÊçÏë¤Å#_½¤¹`Z\16­ú6Æÿ®ÈËÂØÍß\1dûy±*¿OÂ\19\8c\1e*¥jcEÎ\91ýýý#\19÷\9e/8\9dy\a\8c\a\91FüEm\1f\81\8eÁ\ e\87»ð\10â\83§Ñ´4\7fw]\ f,÷ÐU­\8bù¡Ï¢xÌU\ 5\v\83\18F\83¥ÃoçÕ\\bà\ 2Ý»#G^=¸\e\97\82        pf\83\82\17l×àÏ&®¸Bm2\9a¬ËMÖÃõíõ$SM
+\ 1ªÎ\1fstM\ 45mÒ*\1a\96+ú¶k\ 3¸º½¼·X¨\95]­Îx4g$}¸q\10K¸ºÇÂ\88ëëX\7fE¬ÞgáDrÛI\11Ê\90É8<\9d\f{z#BôX\14tG\92\10\81_)!ÜÔu\ 2\81|þBS\94\87ôâ~\1dí±\19¬I\e¡h\8c\1ed\96³¼V(é\16c!\ 2ÚÒ|--4-\1aõ²ÕÓç¼\85\8dk\9aÔ`ò/$nɼÈ#c\ 6\91á½·ªi\12<Røs\93\8e\96Vu\ 3VpJV\12\82ggê\9b2Vòør oÃ\0\ e«:/ë¼Í-u}\ 5PW,ü=\8dcl\9dT+$O\ eß\93©µ§7í\e\ 6§Ó+2\83z\9b\ 1Ë{:ÓHå!ra½j 3\9c\82ÎÖ\ 6e[µF¬×7×wCé\8dø\vå\99)ùÉ\10"\91\1f\9dL~\ 3z\93ò³8oÈ\ f\92ÝSÙÅ\90N\88h`ÕÎà6y¦ÞàßäÌI\ 1H\bíP}\9dL\0=½Q\ 1D\10U-N'\0O
+#\0OzZ\0\bI6\e\ 2äEZnµ$\10l$¡1wèÇZ\1a8\1dHCc^%éY\88n>¤
+\aÖ\8a@\1d\9d×Þ\ 2mSï(\bV\16ª#¡\93\99Ï{\9e\1c\8fI.öb\86\89WGyÏ\83\êù /­\96ú\98\16ÐÀjÑÝóú}\1a\90_!½\12\ 6\85Ê^ù1\84[¾¯|[\ 2\81\18¾LZ\80\võëé"HOnÚ\ 1\beßþÍ%ɬ_
+­¹º,ò¿:\17(+(ðù<i¡Ô11âQµÏJ\156\86`(7+I\9aBèîSp²=\ e0\18\88þ¯\9cK\85á\94\0½0f\81\bN&Á\ 1½c\11ú.Ô%qw&Þ®\82\9b&Îe #*\fB{i\82Vu\99ª¬c\94\80:\93\11.T\95\ 6h\8a\15=ÖJH
+í%\1a/©í\12R×õPƺf§w
\f¥°^A2ì\1a\8cÛ»åÍõ¯\ fW¿|Zþzlà\@Wè\aÆı\ 2\a'w>æ¨ãXBY½ÙP\81.boî\10P\a
+\1c4\9b\12\8b\a\rÃ\1aLÑX3ß4:çÀTçdøbò :¥\8e§H\0"Hg
+\87<\99\9b½ÆÔý§ó\8b«\11¦<\17ê]1Æ\94\80)_h¦\10¸Ú!W\b@\8d\07\8af\85zJt\88\7f|$     j\bÂH¦wUè+©2e\85¹Á0N­ \ 692à@ò\19\a®­v&$\10\ 5,òBÃÄ!ç\9f\16w\17\94\8cË\ 1ßyá|ÔÒÆs{¾ñp\87\80&»ãÐ\98".Z®ÉC¹Ëâ0ÜÓ\ 4J"àF\95\ 17ªÔ \94\b~k\ 5\1d\19\85w\9c¢£ ¢±\ e\ 2\92\ 5Ù\98ºÏ¿\80\88\10øñ\84\0nï>ß/ÆTÏ!ê\87\ 3\11<\96íÚô\98\1cµ­Yò¤ÏD\1cìéÇ80\87Û@Ó(Cðmè\15\9b\1a\17@\9b¤ii´k0\ 6àâ:i\b\8dJ´ÝÓnEë\98÷ì\9eÄ\ eQ\19\84é\9bZ\v¡M¹µ\aÙ\0­\8f/mW9PAU«¯
+ÛZ?tÍ\198Êò&©*\95ÔúýfD®\¸ ×)ú¼:¿\1c3,\90\977*U<\13}(\ 4[ÊÀ\aè\1e\9c\1c#ÄÎ\9b¾ ÷§\1a\15O6\ 5
+\88¢pO\ 1X2\ 4¡\80\96n£0é\8cÜ=àPÉ\88\89«\9f/Ï/þ=f\12\90\ 6\ 5\1f7  8Ρ\8föJ\1c\90(q¤\15\8b\83G\9dôp\94´-U9Ö9xì1¿ëbH3ÚÔ¡Ë\82Ü7Â\83äPÎO°p}óór\9c\87\90EáhDÃ\83zÏÆ\99cN'>`\84\89c£SV\80\rØ\ e´´Á\1c\83³.ç\00\e\vÃ\90ùÜ·rËbq·\18Ï-"\8eGs\vÔ\ 3\83Ü\ 2\94\vu]\9a\1cndP»¶Ð4r¥-6\ 6\8d\9c\84Ã\84­#È ÌûÍT!!<É\82Óµè=¹ÉJÌ èG¡
+\93Å^SÖ´e}T5Q\98±õS¥R]\ 6¤FD\ 5$\95­®Ð&\8b)ó.5)\ 4è.Exºjj@oD\fø\82\15tg\ eå c\92\ 3|u¡H¢À\99\ e\898*1íÒÐÈGF6¤jÌ¡t`>\90\8eAÞ&Ð\9e¾ÐªNÇ8xÆü\9b|\ 1srv\15á=\9a\a
+Ád\18ﻶ- m¹g-ù\8dG\85þ¡oJ\11<\90,öN×\18\fèMÚ£ÅÑO\9aÍá#\ 1\85\ 6뮽I\92À\8aVÿ3`
\95õÚªlÚª,,-è\10uÍo,ôð\1dÓÚ+ôYqLï\7f\97ªIë¼\1aì8xËô\194\87ôü?|²\90\90~!%6\90\12\e\9aW\eãbÒ°$1"\14*miÒõøýºaCÎÍ{\9fݵ\ 5N·»"OÉ×h;H ¥z\81\11Ä<UÉù_ª.\91Àû\91´­Û[Ý_\19\89m;¯ï\eoÝRaüË^}\9c@Ó+lkf\0Äáñ\83O>xç\ 1ÊûmØРÍ\9fIPJÆnøêßM=\8aý·)dø\0¹: \81lß]\-ÎÍ\93ÞÍý\92\ 6\9eÏ]AZ\1eþU%¡u÷¹ÍØRLü¥t|Ãÿ\ 1¶4Ô³endstream
+endobj
+5767 0 obj <<
+/Type /Page
+/Contents 5768 0 R
+/Resources 5766 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+5769 0 obj <<
+/D [5767 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1326 0 obj <<
+/D [5767 0 R /XYZ 174.677 758.046 null]
+>> endobj
+5770 0 obj <<
+/D [5767 0 R /XYZ 71.731 753.091 null]
+>> endobj
+5771 0 obj <<
+/D [5767 0 R /XYZ 71.731 632.735 null]
+>> endobj
+1330 0 obj <<
+/D [5767 0 R /XYZ 176.446 608.236 null]
+>> endobj
+5772 0 obj <<
+/D [5767 0 R /XYZ 71.731 608.093 null]
+>> endobj
+5773 0 obj <<
+/D [5767 0 R /XYZ 71.731 603.311 null]
+>> endobj
+5774 0 obj <<
+/D [5767 0 R /XYZ 71.731 588.435 null]
+>> endobj
+5775 0 obj <<
+/D [5767 0 R /XYZ 139.477 575.89 null]
+>> endobj
+5776 0 obj <<
+/D [5767 0 R /XYZ 71.731 572.993 null]
+>> endobj
+5777 0 obj <<
+/D [5767 0 R /XYZ 71.731 560.241 null]
+>> endobj
+5778 0 obj <<
+/D [5767 0 R /XYZ 139.477 547.497 null]
+>> endobj
+5779 0 obj <<
+/D [5767 0 R /XYZ 71.731 531.648 null]
+>> endobj
+5780 0 obj <<
+/D [5767 0 R /XYZ 71.731 520.65 null]
+>> endobj
+5781 0 obj <<
+/D [5767 0 R /XYZ 139.477 506.152 null]
+>> endobj
+5782 0 obj <<
+/D [5767 0 R /XYZ 71.731 503.255 null]
+>> endobj
+5783 0 obj <<
+/D [5767 0 R /XYZ 71.731 492.256 null]
+>> endobj
+5784 0 obj <<
+/D [5767 0 R /XYZ 139.477 477.758 null]
+>> endobj
+5785 0 obj <<
+/D [5767 0 R /XYZ 71.731 474.861 null]
+>> endobj
+5786 0 obj <<
+/D [5767 0 R /XYZ 71.731 463.863 null]
+>> endobj
+5787 0 obj <<
+/D [5767 0 R /XYZ 139.477 449.365 null]
+>> endobj
+5788 0 obj <<
+/D [5767 0 R /XYZ 139.477 436.413 null]
+>> endobj
+5789 0 obj <<
+/D [5767 0 R /XYZ 190.286 436.413 null]
+>> endobj
+5790 0 obj <<
+/D [5767 0 R /XYZ 71.731 435.374 null]
+>> endobj
+5791 0 obj <<
+/D [5767 0 R /XYZ 71.731 421.427 null]
+>> endobj
+5792 0 obj <<
+/D [5767 0 R /XYZ 139.477 408.02 null]
+>> endobj
+5793 0 obj <<
+/D [5767 0 R /XYZ 71.731 405.123 null]
+>> endobj
+5794 0 obj <<
+/D [5767 0 R /XYZ 71.731 392.171 null]
+>> endobj
+5795 0 obj <<
+/D [5767 0 R /XYZ 139.477 379.626 null]
+>> endobj
+5796 0 obj <<
+/D [5767 0 R /XYZ 139.477 366.675 null]
+>> endobj
+5797 0 obj <<
+/D [5767 0 R /XYZ 139.477 353.724 null]
+>> endobj
+5798 0 obj <<
+/D [5767 0 R /XYZ 226.314 340.772 null]
+>> endobj
+5799 0 obj <<
+/D [5767 0 R /XYZ 353.136 327.821 null]
+>> endobj
+5800 0 obj <<
+/D [5767 0 R /XYZ 260.134 301.918 null]
+>> endobj
+5801 0 obj <<
+/D [5767 0 R /XYZ 200.839 288.966 null]
+>> endobj
+5802 0 obj <<
+/D [5767 0 R /XYZ 180.627 276.015 null]
+>> endobj
+5803 0 obj <<
+/D [5767 0 R /XYZ 139.477 263.064 null]
+>> endobj
+5804 0 obj <<
+/D [5767 0 R /XYZ 71.731 260.166 null]
+>> endobj
+5805 0 obj <<
+/D [5767 0 R /XYZ 71.731 249.168 null]
+>> endobj
+5806 0 obj <<
+/D [5767 0 R /XYZ 139.477 234.67 null]
+>> endobj
+5807 0 obj <<
+/D [5767 0 R /XYZ 71.731 231.773 null]
+>> endobj
+5808 0 obj <<
+/D [5767 0 R /XYZ 71.731 220.774 null]
+>> endobj
+5809 0 obj <<
+/D [5767 0 R /XYZ 139.477 206.276 null]
+>> endobj
+5810 0 obj <<
+/D [5767 0 R /XYZ 71.731 190.428 null]
+>> endobj
+5811 0 obj <<
+/D [5767 0 R /XYZ 71.731 177.477 null]
+>> endobj
+5812 0 obj <<
+/D [5767 0 R /XYZ 139.477 164.932 null]
+>> endobj
+5813 0 obj <<
+/D [5767 0 R /XYZ 71.731 161.204 null]
+>> endobj
+1334 0 obj <<
+/D [5767 0 R /XYZ 192.609 137.933 null]
+>> endobj
+5814 0 obj <<
+/D [5767 0 R /XYZ 71.731 132.977 null]
+>> endobj
+3266 0 obj <<
+/D [5767 0 R /XYZ 71.731 93.367 null]
+>> endobj
+5766 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5818 0 obj <<
+/Length 785       
+/Filter /FlateDecode
+>>
+stream
+xÚÝWMOÛ@\10½çWø\98Tõ°\9fÞ]õD)­ZUT\ 2ß\9a
\89\ 1\1f°ClSø÷\1d{×_8!\ 5\99"!\ eÞà·oÞÌÎ<y©Gð\8fz\8a\82âÔÓ\84\81VÚ[^O\88w\89o¾L¨Cø\ eâw0\1fÃÉÁgÎ<\ 3&à^xá1­A\88\0y\ 2\10\81ôÂÕÏéÑÕb\9dG\9b\99Ï\94\9eR°ÏïqRÜ\1d\9c\863JÈÔÇ_3:-î컣Ã\13»ø´\89\8ds"    Âð\1d®èìWømr\1c6â$£\80:\1e\93ï \ 3ù\8cyT\ 1£²ÔïrTR\82\92¿\$7Et\9e¤y|q\7f\1e'Q²ÊÊðv§\0\8eéâN¡@3\fÃ\ 3`&¨v\9e,®#\8b\14\9d\12\11ϧ²ÂîaWí\1eÊ\18j/S)÷Ì\19S¶(\9b\b7g¹ý\91§ö\99!\87]\95¬sB\18Öv¹Èã4é\ 3ó«È.âd]8\92~v\14\8c¬êâ×
+|&\81s]é8»OÒu\16gM\8e
\12u\8e\ 1Øã¿Mã\95EHÒ"ð0$F {\8aÐ%5\ 4¸\11u\r°\1d²|S,Qw\80-ä(¢ÕetîþõÎE¥-\ 5%\1c8Q\8eã¦D\ fãô¤½·\q\92\ fÙXy\8c\9f«E>äª:K·\9aé\87mÅeÊ\802Ø;\ 6(5\15öpsY\GI\9e5a{\r¤°ME?\89î8 \vHÉ<\895£Jm\9b\a\ 6*0¸ê¼zølF§9ü\ e\9f\9d\9dn\8f
+\ 6\fg¡Æ\94âÖ)\16®\9eàAÛUÊmËV'Y`\9fn¢aÂ>\86\ fðä}ÊAiÚ+÷Ö¬\ 3\9cb-Æ˺åÛ\9dµÃ\94Úê±ëÍÜý:j\8f¾ñ\e_\11\90¸ô%6] ¶LCZä/é8}ú\9eåh¤Õϵ\9cå\ 2\ fó\11ËÁ¸ÿà9VÂ\7fð\9c^\19z¦#°õô\9b4\1d-\80\94S5ºëp!@\8f6}\rÛÎÙ³\88×ó\e\8e}'Èx.ÛáÛ\9d³Ã\8cî7¿S¬×H\86³\9f¾\9b\19\17ÀTðRß8eà=vã\ 4<Én\b}\9eáôëÐs\1c\ 3\84ð·é8\1a¿à\9eü\9dÃ÷;\ eÖL0>Ú\0¶t;çÏA^Ïtð¦BÆ˸aÛ\99°Eì³\9b®Rw\97b\ 2Ìvsln\94-¤¾P*(o_\17\ f8Êè?\8e\8eO\ fÝ%òëYh\17\Rt\80ª¦ÝÛ¨à\1aÝ®¾6   ¾ãÖ8Tø\171\95¬ßendstream
+endobj
+5817 0 obj <<
+/Type /Page
+/Contents 5818 0 R
+/Resources 5816 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+5819 0 obj <<
+/D [5817 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5820 0 obj <<
+/D [5817 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1338 0 obj <<
+/D [5817 0 R /XYZ 266.815 755.597 null]
+>> endobj
+5821 0 obj <<
+/D [5817 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5822 0 obj <<
+/D [5817 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1342 0 obj <<
+/D [5817 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5823 0 obj <<
+/D [5817 0 R /XYZ 239.103 703.48 null]
+>> endobj
+5824 0 obj <<
+/D [5817 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1346 0 obj <<
+/D [5817 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5825 0 obj <<
+/D [5817 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5826 0 obj <<
+/D [5817 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5827 0 obj <<
+/D [5817 0 R /XYZ 141.074 661.642 null]
+>> endobj
+5828 0 obj <<
+/D [5817 0 R /XYZ 231.468 661.642 null]
+>> endobj
+5829 0 obj <<
+/D [5817 0 R /XYZ 334.775 661.642 null]
+>> endobj
+5830 0 obj <<
+/D [5817 0 R /XYZ 364.906 661.642 null]
+>> endobj
+5831 0 obj <<
+/D [5817 0 R /XYZ 382.124 661.642 null]
+>> endobj
+5832 0 obj <<
+/D [5817 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1350 0 obj <<
+/D [5817 0 R /XYZ 187.959 622.523 null]
+>> endobj
+5833 0 obj <<
+/D [5817 0 R /XYZ 71.731 619.958 null]
+>> endobj
+5834 0 obj <<
+/D [5817 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5835 0 obj <<
+/D [5817 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5836 0 obj <<
+/D [5817 0 R /XYZ 71.731 603.225 null]
+>> endobj
+5837 0 obj <<
+/D [5817 0 R /XYZ 139.477 590.177 null]
+>> endobj
+5838 0 obj <<
+/D [5817 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5839 0 obj <<
+/D [5817 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5840 0 obj <<
+/D [5817 0 R /XYZ 71.731 576.187 null]
+>> endobj
+5841 0 obj <<
+/D [5817 0 R /XYZ 139.477 561.784 null]
+>> endobj
+3267 0 obj <<
+/D [5817 0 R /XYZ 71.731 545.512 null]
+>> endobj
+5842 0 obj <<
+/D [5817 0 R /XYZ 71.731 532.6 null]
+>> endobj
+1354 0 obj <<
+/D [5817 0 R /XYZ 278.298 510.22 null]
+>> endobj
+5843 0 obj <<
+/D [5817 0 R /XYZ 71.731 499.641 null]
+>> endobj
+5844 0 obj <<
+/D [5817 0 R /XYZ 71.731 499.641 null]
+>> endobj
+1358 0 obj <<
+/D [5817 0 R /XYZ 162.317 473.924 null]
+>> endobj
+5845 0 obj <<
+/D [5817 0 R /XYZ 245.081 458.103 null]
+>> endobj
+5846 0 obj <<
+/D [5817 0 R /XYZ 71.731 456.036 null]
+>> endobj
+1362 0 obj <<
+/D [5817 0 R /XYZ 174.677 432.765 null]
+>> endobj
+5847 0 obj <<
+/D [5817 0 R /XYZ 71.731 427.81 null]
+>> endobj
+5848 0 obj <<
+/D [5817 0 R /XYZ 71.731 425.419 null]
+>> endobj
+5849 0 obj <<
+/D [5817 0 R /XYZ 141.074 416.265 null]
+>> endobj
+5850 0 obj <<
+/D [5817 0 R /XYZ 235.772 416.265 null]
+>> endobj
+5851 0 obj <<
+/D [5817 0 R /XYZ 339.079 416.265 null]
+>> endobj
+5852 0 obj <<
+/D [5817 0 R /XYZ 369.21 416.265 null]
+>> endobj
+5853 0 obj <<
+/D [5817 0 R /XYZ 386.428 416.265 null]
+>> endobj
+5854 0 obj <<
+/D [5817 0 R /XYZ 71.731 402.484 null]
+>> endobj
+1366 0 obj <<
+/D [5817 0 R /XYZ 187.959 377.146 null]
+>> endobj
+5855 0 obj <<
+/D [5817 0 R /XYZ 71.731 374.582 null]
+>> endobj
+5856 0 obj <<
+/D [5817 0 R /XYZ 71.731 369.8 null]
+>> endobj
+5857 0 obj <<
+/D [5817 0 R /XYZ 71.731 369.8 null]
+>> endobj
+5858 0 obj <<
+/D [5817 0 R /XYZ 71.731 357.848 null]
+>> endobj
+5859 0 obj <<
+/D [5817 0 R /XYZ 139.477 344.8 null]
+>> endobj
+5860 0 obj <<
+/D [5817 0 R /XYZ 71.731 341.903 null]
+>> endobj
+5861 0 obj <<
+/D [5817 0 R /XYZ 71.731 341.903 null]
+>> endobj
+5862 0 obj <<
+/D [5817 0 R /XYZ 71.731 330.81 null]
+>> endobj
+5863 0 obj <<
+/D [5817 0 R /XYZ 139.477 316.407 null]
+>> endobj
+3268 0 obj <<
+/D [5817 0 R /XYZ 71.731 300.135 null]
+>> endobj
+5864 0 obj <<
+/D [5817 0 R /XYZ 71.731 287.223 null]
+>> endobj
+1370 0 obj <<
+/D [5817 0 R /XYZ 289.453 264.843 null]
+>> endobj
+5865 0 obj <<
+/D [5817 0 R /XYZ 71.731 254.264 null]
+>> endobj
+5866 0 obj <<
+/D [5817 0 R /XYZ 71.731 254.264 null]
+>> endobj
+1374 0 obj <<
+/D [5817 0 R /XYZ 162.317 228.547 null]
+>> endobj
+5867 0 obj <<
+/D [5817 0 R /XYZ 251.059 212.727 null]
+>> endobj
+5868 0 obj <<
+/D [5817 0 R /XYZ 71.731 210.659 null]
+>> endobj
+1378 0 obj <<
+/D [5817 0 R /XYZ 174.677 187.389 null]
+>> endobj
+5869 0 obj <<
+/D [5817 0 R /XYZ 71.731 182.433 null]
+>> endobj
+5870 0 obj <<
+/D [5817 0 R /XYZ 71.731 180.042 null]
+>> endobj
+5871 0 obj <<
+/D [5817 0 R /XYZ 141.074 170.888 null]
+>> endobj
+5872 0 obj <<
+/D [5817 0 R /XYZ 240.077 170.888 null]
+>> endobj
+5873 0 obj <<
+/D [5817 0 R /XYZ 343.384 170.888 null]
+>> endobj
+5874 0 obj <<
+/D [5817 0 R /XYZ 373.515 170.888 null]
+>> endobj
+5875 0 obj <<
+/D [5817 0 R /XYZ 390.733 170.888 null]
+>> endobj
+5876 0 obj <<
+/D [5817 0 R /XYZ 71.731 157.107 null]
+>> endobj
+1382 0 obj <<
+/D [5817 0 R /XYZ 187.959 131.769 null]
+>> endobj
+5877 0 obj <<
+/D [5817 0 R /XYZ 71.731 129.205 null]
+>> endobj
+5878 0 obj <<
+/D [5817 0 R /XYZ 71.731 124.423 null]
+>> endobj
+5879 0 obj <<
+/D [5817 0 R /XYZ 71.731 124.423 null]
+>> endobj
+5880 0 obj <<
+/D [5817 0 R /XYZ 71.731 112.472 null]
+>> endobj
+5881 0 obj <<
+/D [5817 0 R /XYZ 139.477 99.423 null]
+>> endobj
+5882 0 obj <<
+/D [5817 0 R /XYZ 71.731 96.526 null]
+>> endobj
+5883 0 obj <<
+/D [5817 0 R /XYZ 71.731 96.526 null]
+>> endobj
+5884 0 obj <<
+/D [5817 0 R /XYZ 71.731 85.433 null]
+>> endobj
+5885 0 obj <<
+/D [5817 0 R /XYZ 139.477 71.03 null]
+>> endobj
+3269 0 obj <<
+/D [5817 0 R /XYZ 71.731 54.758 null]
+>> endobj
+5816 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5888 0 obj <<
+/Length 1201      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WKoÛF\10¾ûWð(\15å\86û&Ñ\93k;A
+7\ 1l\1d
\85AS\94´¨H*|¸É¿ïì\8bZ\99´]\14\82\ e;"gçµ3ß·ÄQ\ 2?\1cI\8c$ÅQ\9a\10\94Ê4*ª\8b$ÚÂ\9bO\17ØiÄN%\ et~]]|øHI\94¡LÐhµ\89H\9a\ 4Ø\11\88   \1e­Ö\7f.®vù¡/ÛeLdºÀÈ®·ª\1e¾\7f¸[-q\92,bø·Ä\8bá»}wuùÅ
+×­zö\e\1f\12\9e\80\1a¼\ 3   /ÿZývq³\1a\83ã\ 4#\88ã­ð\9dÊ$|B",\11Á\Çïr\94\9c#\9eI\13~\91×ß\86ò1/zõ\9c÷åc¹Þ\96Ú½ÝÉ\10\85ta'\93(%à\86
+D2av~É+§É\82\12%Q\8c¹Ñ}Ǻ<îÁ\84@ì:\15½ç\81\10i\8bRåíßVj\86þ0ôV.ëµ{¸±k\ fÅÝ\95î¥v`¤¼s«ö\1d¤\84QÆM1bï6&\1cQ\9a\1aç÷?êæЩnLL",\99OL {æÏ\8dZ[\r\9e\1c\ 48xHÞÉ<4\9a%\88fÌ'\ e=ÐõíP@¢\ 2úÆ\99\80|»G÷è'ç\15\1f\84"\9aHgCÕZ}ê\88è3ñJ?[cs¾ Ê7}I$°?¨oó9\9d\94Awó/sŧ2A8¥ d\bãÌ(_¶Û¡*ë¾\e=\9f´\95\84æe/²\f§\ 4Ì ÎIÄ¡ªXʹ1!H\8a\f¤àÕËu\9c¨±=\ 2{v¤ÂÖe\ 4\11\18\11¯c£\e{µSëòE³\9etê$Ï\18\9c
\88\18S$S|ZçÙd\ 5ÌtÊÎ\97ìÑÞëÉ:\1d\1dÜ¡Qõ\b\7f}3\97¤­\84\ 1\9d\1dF\9f7\11(Ël;\\97]ѪC¯\9az\8a\19\16g(£FõãP\17F/&\94,
\92ï÷öOÕ<\97\9d\15G\14¡Ø\9f\8c~º±«\r\1a^¹ áѦm*+©õÞ½mj\93%<sÈ2îq^öªë\91\15W;ÕÙ÷\e\1f $bb'\90¹=Þ\9dF*J\99©\9e^\9f\16\90C¹¶ò?ªßYÉF§¥¶Ü\94mY\17\19êÞ\8a»r¿FÎè.w\ f\95sÓiÜ6\92w¼iZ+TMç\94uQÌ
+Ui\ 3ÇaøÄ\84ï3ë\96\84/ÐñhGÒ\89=wp\0\ 6ACt|H\12²ïÕ\9a\98\1eªóýÙ\99g£æì\87=M\19"RL¸§hj çÞ\91HUv]î[ùóµ^å"÷DdÓ8RyBó­Û¨j?\13a\bz¼­Û°\11à\18*8¬ép$ÿ\83¢\86ºSÛZ·\8fÆrp>å+¸\ 5d<=å«Ùz\9d0V\86 Û\80±N\1dí\9bz;å\rÁàäG\8aZO­¦(ÍÄ);\1dCƯÐ\98\8eu³×¥\9eØ£)\92ì=
+"\19Ô>³\fDþ+\ 1Ñ \879<&\82"\91ð³áq`ïU<ö:æ:ºÄéÂß0OÚ\16cÇD®OIf×'ÕÛ~\ 6D¬{¥\9b\19\1df"Ó\13\98­\ 6å\0\ 3ø|Õ8Ú{½\1aNçíjø)=#\15Ù\9a\97\ 1æ\9b\7fU~pÏ\83\ 3\13lÀd\ 2iXHÄ2?¢¿ß\7fz¼[ÝM\ 3`\18¥@\84~|&f8b\12\aFnþXÍ\18\81\19e~ff£!     J\98\bìÜ~½º¼\9d\1a\83üuÔÂ\9f¦M\970%vÕmg \90Âye\0)!\14ÖCõä\9bð\r2a!t\99»«ª\v Å³ÓÈÔvØx\18nñbJ!FßÂÉ\8bË\90fns\132äméf°x\17N\91û\#\fê#ßüh=ªøoV\89ô\aÞæ\85\r\1dà׫\9b»K÷\9dúù~e\ 5ÊqBljá\a/\ 3 åã\85\9f±W>L§\11þ\vüÝÓìendstream
+endobj
+5887 0 obj <<
+/Type /Page
+/Contents 5888 0 R
+/Resources 5886 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+5889 0 obj <<
+/D [5887 0 R /XYZ 71.731 802.878 null]
+>> endobj
+5890 0 obj <<
+/D [5887 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1386 0 obj <<
+/D [5887 0 R /XYZ 267.469 755.597 null]
+>> endobj
+5891 0 obj <<
+/D [5887 0 R /XYZ 71.731 745.018 null]
+>> endobj
+5892 0 obj <<
+/D [5887 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1390 0 obj <<
+/D [5887 0 R /XYZ 162.317 719.301 null]
+>> endobj
+5893 0 obj <<
+/D [5887 0 R /XYZ 239.103 703.48 null]
+>> endobj
+5894 0 obj <<
+/D [5887 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1394 0 obj <<
+/D [5887 0 R /XYZ 174.677 678.142 null]
+>> endobj
+5895 0 obj <<
+/D [5887 0 R /XYZ 71.731 673.187 null]
+>> endobj
+5896 0 obj <<
+/D [5887 0 R /XYZ 71.731 670.796 null]
+>> endobj
+5897 0 obj <<
+/D [5887 0 R /XYZ 141.074 661.642 null]
+>> endobj
+5898 0 obj <<
+/D [5887 0 R /XYZ 231.468 661.642 null]
+>> endobj
+5899 0 obj <<
+/D [5887 0 R /XYZ 334.775 661.642 null]
+>> endobj
+5900 0 obj <<
+/D [5887 0 R /XYZ 369.21 661.642 null]
+>> endobj
+5901 0 obj <<
+/D [5887 0 R /XYZ 468.213 661.642 null]
+>> endobj
+5902 0 obj <<
+/D [5887 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1398 0 obj <<
+/D [5887 0 R /XYZ 187.959 622.523 null]
+>> endobj
+5903 0 obj <<
+/D [5887 0 R /XYZ 71.731 619.958 null]
+>> endobj
+5904 0 obj <<
+/D [5887 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5905 0 obj <<
+/D [5887 0 R /XYZ 71.731 615.176 null]
+>> endobj
+5906 0 obj <<
+/D [5887 0 R /XYZ 71.731 604.58 null]
+>> endobj
+5907 0 obj <<
+/D [5887 0 R /XYZ 139.477 590.177 null]
+>> endobj
+5908 0 obj <<
+/D [5887 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5909 0 obj <<
+/D [5887 0 R /XYZ 71.731 587.28 null]
+>> endobj
+5910 0 obj <<
+/D [5887 0 R /XYZ 71.731 574.832 null]
+>> endobj
+5911 0 obj <<
+/D [5887 0 R /XYZ 139.477 561.784 null]
+>> endobj
+5912 0 obj <<
+/D [5887 0 R /XYZ 71.731 558.056 null]
+>> endobj
+1402 0 obj <<
+/D [5887 0 R /XYZ 192.609 534.785 null]
+>> endobj
+5913 0 obj <<
+/D [5887 0 R /XYZ 71.731 529.829 null]
+>> endobj
+3270 0 obj <<
+/D [5887 0 R /XYZ 71.731 477.267 null]
+>> endobj
+5914 0 obj <<
+/D [5887 0 R /XYZ 71.731 464.356 null]
+>> endobj
+1406 0 obj <<
+/D [5887 0 R /XYZ 270.654 441.976 null]
+>> endobj
+5915 0 obj <<
+/D [5887 0 R /XYZ 71.731 431.397 null]
+>> endobj
+5916 0 obj <<
+/D [5887 0 R /XYZ 71.731 431.397 null]
+>> endobj
+1410 0 obj <<
+/D [5887 0 R /XYZ 162.317 405.68 null]
+>> endobj
+5917 0 obj <<
+/D [5887 0 R /XYZ 251.059 389.859 null]
+>> endobj
+5918 0 obj <<
+/D [5887 0 R /XYZ 71.731 376.793 null]
+>> endobj
+1414 0 obj <<
+/D [5887 0 R /XYZ 174.677 351.57 null]
+>> endobj
+5919 0 obj <<
+/D [5887 0 R /XYZ 71.731 346.614 null]
+>> endobj
+5920 0 obj <<
+/D [5887 0 R /XYZ 71.731 344.223 null]
+>> endobj
+5921 0 obj <<
+/D [5887 0 R /XYZ 175.51 335.07 null]
+>> endobj
+5922 0 obj <<
+/D [5887 0 R /XYZ 274.512 335.07 null]
+>> endobj
+5923 0 obj <<
+/D [5887 0 R /XYZ 339.079 335.07 null]
+>> endobj
+5924 0 obj <<
+/D [5887 0 R /XYZ 356.584 335.07 null]
+>> endobj
+5925 0 obj <<
+/D [5887 0 R /XYZ 373.802 335.07 null]
+>> endobj
+5926 0 obj <<
+/D [5887 0 R /XYZ 71.731 321.288 null]
+>> endobj
+1418 0 obj <<
+/D [5887 0 R /XYZ 187.959 295.95 null]
+>> endobj
+5927 0 obj <<
+/D [5887 0 R /XYZ 71.731 293.386 null]
+>> endobj
+5928 0 obj <<
+/D [5887 0 R /XYZ 71.731 288.604 null]
+>> endobj
+5929 0 obj <<
+/D [5887 0 R /XYZ 71.731 288.604 null]
+>> endobj
+5930 0 obj <<
+/D [5887 0 R /XYZ 71.731 278.008 null]
+>> endobj
+5931 0 obj <<
+/D [5887 0 R /XYZ 139.477 263.605 null]
+>> endobj
+5932 0 obj <<
+/D [5887 0 R /XYZ 71.731 260.708 null]
+>> endobj
+5933 0 obj <<
+/D [5887 0 R /XYZ 71.731 260.708 null]
+>> endobj
+5934 0 obj <<
+/D [5887 0 R /XYZ 71.731 248.259 null]
+>> endobj
+5935 0 obj <<
+/D [5887 0 R /XYZ 139.477 235.211 null]
+>> endobj
+5936 0 obj <<
+/D [5887 0 R /XYZ 71.731 231.483 null]
+>> endobj
+1422 0 obj <<
+/D [5887 0 R /XYZ 192.609 208.212 null]
+>> endobj
+5937 0 obj <<
+/D [5887 0 R /XYZ 71.731 203.257 null]
+>> endobj
+5938 0 obj <<
+/D [5887 0 R /XYZ 287.05 192.87 null]
+>> endobj
+5939 0 obj <<
+/D [5887 0 R /XYZ 334.364 192.87 null]
+>> endobj
+5940 0 obj <<
+/D [5887 0 R /XYZ 398.954 192.87 null]
+>> endobj
+3271 0 obj <<
+/D [5887 0 R /XYZ 71.731 163.647 null]
+>> endobj
+5941 0 obj <<
+/D [5887 0 R /XYZ 71.731 150.735 null]
+>> endobj
+1426 0 obj <<
+/D [5887 0 R /XYZ 248.67 128.355 null]
+>> endobj
+5942 0 obj <<
+/D [5887 0 R /XYZ 71.731 117.776 null]
+>> endobj
+5943 0 obj <<
+/D [5887 0 R /XYZ 71.731 117.776 null]
+>> endobj
+1430 0 obj <<
+/D [5887 0 R /XYZ 162.317 92.059 null]
+>> endobj
+5944 0 obj <<
+/D [5887 0 R /XYZ 227.148 76.238 null]
+>> endobj
+5945 0 obj <<
+/D [5887 0 R /XYZ 71.731 74.171 null]
+>> endobj
+5886 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+5948 0 obj <<
+/Length 1110      
+/Filter /FlateDecode
+>>
+stream
+xÚåWKsÛ6\10¾ûWðHuB\18\ f\82 §'×\89;ît\92\19GÓK\92ñÐ$hq*\11*\1fN\9c\ 5\16\94HIvÓÔ9utÀb±Ø÷~\14X@áÇ\ 2Å\88\12,H)'©J\83bsF\83{8ùõ\8cy\89È\8bD\13\99_\96gçW\82\a\19É\12\11\80§)\89ã\ 4ô$$Nd°,?\84\97«|Ûëv\11q\95\86\8càú{Ý\f_Îo\96\vFi\18ÁnÁÂá\v\9e]^¼Eâu[?\8c\17?RIA\fÎ\80b\8bOËßÎÞ,wÎIÎ\bøñ\9cû^äÈ}Î\ 3ÆH&¥õ\9f±\8c\ 3%SB!\ eëÿûÇÆl»º³6ϯb8$LÅV\9a\ 6\11K\bFù`ê\12%$ÝK\80M   \ 6¨\13)òæ¯Aßêò^ßÖMÑêêXe
+IN¥¿`cîúv(úE\94@\9e¦
+<ë'o\93íU0*\88 Êë°ÂÇf\98"\9c¥{3ìg\94\99%#â\\90ÔæLd\ 4\84/Úûa£\9b¾Û\19Þ\15ߦCA\8fÄ3ÃÓ2\8déM\14%4e§êÄ\89J2 &G\87뮤\8cs()\10\13}XSµ÷\8aÅ\9cp(å(c}Û\9aºÙµdoüºÒH8Ï\1d\85É\1f 7[½O\90Í\1d&\bTJ #   e¶Ö\ e\8a\ê}\91íÅ\98\bÛSU\10+\92Z¿EBx\86]ö6ßìë4K©t²Ïê\9e\86Ë(\11I2\96\96s\85¡8y,ÜA\90 \ 6RÁBÝ\14\9eS\98¡éO5Ĩ<â\92\b\91þ¸ñ\98F÷ÿ\e\8fX
+B³ôÅÆc¢ïÉñ\18eþûxL\13D\92,\865!Y\86ùy­»¢­·}m\9aãÞÅn\17P      +º\Õ¶WS\1aVCS¸\en·Ê=Ûy\96²ðNã¾È×k]"ý¹îWfèq³6ÅB\85\7fúëz]â½Ê´Èº3ý
+)Ý\94^¹©PÈEËÒ\90 ûºÂÕ\r\8d\9f\18kz\9c\18\17\ 3\87\f`\fe\v³1Ï#}\85ë.¨£¡Ï\18¤M\9e\9a
+\ 3\83\91\97§\86>\81´      \7f¥ö\161\1fä\14pq      ¨"³SÈõ\91R^\19»\88¡[Ývk36ó\vBXU\83\89j}h`Ö\97\94p\19\1fáXÕjß}\10Ý\b`yùè;Ò)\ 3R\81 Ù\1ctîÕõÕ»\93°æmý{X«G\9c\9c¢Ú\f=\9e\rx\8693\z\ 2Û\9c\9aoÅ6+üÝØ\163Bå÷AÛh÷\14´±\94B/ð\17\83\89¾'¡m\94ùghs\r²\876\0¶~ø1Ð\ 6\ 6\85\88qD[KË°\ 3À²Ðdùw\1ayÛVoóV{®õ×rWyS®½\86®î\87ÜÚì\16\\86¯\90ùy¥\e¯ÔlFA\1c\rË\ 4\8dÈC,´¬»GäÔÍv8\ 5d\16*\ 5\8fCcѾ·2nÛÕ¥ö\14ð½\ 5Øm[S讫\9b\15±La£îFéQTØÎn\8cWçÂ\ 6\9e\a\1f\17·5Ú"\eêT·G\ 6Ü\11VU¨0\9a9\8f Ó\ eð\0\99\ 2á®\8etVÁ\e\råv_\19\15þ±P1@Ì ¿©\96¶e\1aÓ|Õ­o©\a\91uSÖ¶\95ò^\8f5¦Ë{¤`°GYü¶9eþðNÛRºïîfÛ?\8eLøvéYóªéWÒ\83?9\9cBÿ\84ã1É\0%\9e{äíEÆ7\9e"\99²ÑÏuØ\f¼»|ssáßu×ï\97H\bÉ(ÇÜM\1f\88±Há/3óð\13Ë'\1e\1eþ\r\ 2Ѳvendstream
+endobj
+5947 0 obj <<
+/Type /Page
+/Contents 5948 0 R
+/Resources 5946 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+5949 0 obj <<
+/D [5947 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1434 0 obj <<
+/D [5947 0 R /XYZ 174.677 758.046 null]
+>> endobj
+5950 0 obj <<
+/D [5947 0 R /XYZ 71.731 753.091 null]
+>> endobj
+5951 0 obj <<
+/D [5947 0 R /XYZ 71.731 750.7 null]
+>> endobj
+5952 0 obj <<
+/D [5947 0 R /XYZ 141.074 741.546 null]
+>> endobj
+5953 0 obj <<
+/D [5947 0 R /XYZ 222.859 741.546 null]
+>> endobj
+5954 0 obj <<
+/D [5947 0 R /XYZ 326.166 741.546 null]
+>> endobj
+5955 0 obj <<
+/D [5947 0 R /XYZ 71.731 727.765 null]
+>> endobj
+1438 0 obj <<
+/D [5947 0 R /XYZ 187.959 702.427 null]
+>> endobj
+5956 0 obj <<
+/D [5947 0 R /XYZ 71.731 699.863 null]
+>> endobj
+5957 0 obj <<
+/D [5947 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5958 0 obj <<
+/D [5947 0 R /XYZ 71.731 695.081 null]
+>> endobj
+5959 0 obj <<
+/D [5947 0 R /XYZ 71.731 683.129 null]
+>> endobj
+5960 0 obj <<
+/D [5947 0 R /XYZ 139.477 670.081 null]
+>> endobj
+3272 0 obj <<
+/D [5947 0 R /XYZ 71.731 653.809 null]
+>> endobj
+5961 0 obj <<
+/D [5947 0 R /XYZ 71.731 640.898 null]
+>> endobj
+1442 0 obj <<
+/D [5947 0 R /XYZ 251.872 618.518 null]
+>> endobj
+5962 0 obj <<
+/D [5947 0 R /XYZ 71.731 607.939 null]
+>> endobj
+5963 0 obj <<
+/D [5947 0 R /XYZ 71.731 607.939 null]
+>> endobj
+1446 0 obj <<
+/D [5947 0 R /XYZ 162.317 582.222 null]
+>> endobj
+5964 0 obj <<
+/D [5947 0 R /XYZ 227.148 566.401 null]
+>> endobj
+5965 0 obj <<
+/D [5947 0 R /XYZ 71.731 564.334 null]
+>> endobj
+1450 0 obj <<
+/D [5947 0 R /XYZ 174.677 541.063 null]
+>> endobj
+5966 0 obj <<
+/D [5947 0 R /XYZ 71.731 536.108 null]
+>> endobj
+5967 0 obj <<
+/D [5947 0 R /XYZ 71.731 533.717 null]
+>> endobj
+5968 0 obj <<
+/D [5947 0 R /XYZ 141.074 524.563 null]
+>> endobj
+5969 0 obj <<
+/D [5947 0 R /XYZ 222.859 524.563 null]
+>> endobj
+5970 0 obj <<
+/D [5947 0 R /XYZ 326.166 524.563 null]
+>> endobj
+5971 0 obj <<
+/D [5947 0 R /XYZ 71.731 510.782 null]
+>> endobj
+1454 0 obj <<
+/D [5947 0 R /XYZ 187.959 485.444 null]
+>> endobj
+5972 0 obj <<
+/D [5947 0 R /XYZ 71.731 482.879 null]
+>> endobj
+5973 0 obj <<
+/D [5947 0 R /XYZ 71.731 478.097 null]
+>> endobj
+5974 0 obj <<
+/D [5947 0 R /XYZ 71.731 478.097 null]
+>> endobj
+5975 0 obj <<
+/D [5947 0 R /XYZ 71.731 466.146 null]
+>> endobj
+5976 0 obj <<
+/D [5947 0 R /XYZ 139.477 453.098 null]
+>> endobj
+5977 0 obj <<
+/D [5947 0 R /XYZ 71.731 449.37 null]
+>> endobj
+1458 0 obj <<
+/D [5947 0 R /XYZ 192.609 426.099 null]
+>> endobj
+5978 0 obj <<
+/D [5947 0 R /XYZ 71.731 421.144 null]
+>> endobj
+5979 0 obj <<
+/D [5947 0 R /XYZ 211.247 397.805 null]
+>> endobj
+3273 0 obj <<
+/D [5947 0 R /XYZ 71.731 381.533 null]
+>> endobj
+5980 0 obj <<
+/D [5947 0 R /XYZ 71.731 368.622 null]
+>> endobj
+1462 0 obj <<
+/D [5947 0 R /XYZ 276.387 346.242 null]
+>> endobj
+5981 0 obj <<
+/D [5947 0 R /XYZ 71.731 335.663 null]
+>> endobj
+5982 0 obj <<
+/D [5947 0 R /XYZ 71.731 335.663 null]
+>> endobj
+1466 0 obj <<
+/D [5947 0 R /XYZ 162.317 309.946 null]
+>> endobj
+5983 0 obj <<
+/D [5947 0 R /XYZ 257.036 294.125 null]
+>> endobj
+5984 0 obj <<
+/D [5947 0 R /XYZ 71.731 292.058 null]
+>> endobj
+1470 0 obj <<
+/D [5947 0 R /XYZ 174.677 268.787 null]
+>> endobj
+5985 0 obj <<
+/D [5947 0 R /XYZ 71.731 263.832 null]
+>> endobj
+5986 0 obj <<
+/D [5947 0 R /XYZ 71.731 261.441 null]
+>> endobj
+5987 0 obj <<
+/D [5947 0 R /XYZ 136.77 252.287 null]
+>> endobj
+5988 0 obj <<
+/D [5947 0 R /XYZ 240.077 252.287 null]
+>> endobj
+5989 0 obj <<
+/D [5947 0 R /XYZ 343.384 252.287 null]
+>> endobj
+5990 0 obj <<
+/D [5947 0 R /XYZ 71.731 238.506 null]
+>> endobj
+1474 0 obj <<
+/D [5947 0 R /XYZ 187.959 213.168 null]
+>> endobj
+5991 0 obj <<
+/D [5947 0 R /XYZ 71.731 210.603 null]
+>> endobj
+5992 0 obj <<
+/D [5947 0 R /XYZ 71.731 205.821 null]
+>> endobj
+5993 0 obj <<
+/D [5947 0 R /XYZ 71.731 205.821 null]
+>> endobj
+5994 0 obj <<
+/D [5947 0 R /XYZ 71.731 195.225 null]
+>> endobj
+5995 0 obj <<
+/D [5947 0 R /XYZ 139.477 180.822 null]
+>> endobj
+5996 0 obj <<
+/D [5947 0 R /XYZ 71.731 177.094 null]
+>> endobj
+1478 0 obj <<
+/D [5947 0 R /XYZ 192.609 153.823 null]
+>> endobj
+5997 0 obj <<
+/D [5947 0 R /XYZ 71.731 148.868 null]
+>> endobj
+5998 0 obj <<
+/D [5947 0 R /XYZ 71.731 108.85 null]
+>> endobj
+1482 0 obj <<
+/D [5947 0 R /XYZ 202.018 85.579 null]
+>> endobj
+5999 0 obj <<
+/D [5947 0 R /XYZ 71.731 83.045 null]
+>> endobj
+3274 0 obj <<
+/D [5947 0 R /XYZ 71.731 53.965 null]
+>> endobj
+5946 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6002 0 obj <<
+/Length 1240      
+/Filter /FlateDecode
+>>
+stream
+xÚµWÝoÛ6\10\7fÏ_¡Gy¨Y~\88"\85=ei3d\18Z 5ö²\f\81\8eVKrõQ4ûëw\14I\89¶d§è2øA4y¼;þîîw$      0üH \b\12\8c\ 4\12S$\85\f²â
+\a;Xùõ\8aX\89¥\15Yz2¿¬®ÞÞ2\1a$(\89Y°Ú\ 6TJ\14E1è\89Q\14ó`µù3¼yJ\ f­ª\17K*dH\90ùþ\9e\97Ý··÷«\ 5Á8\¿\ 5  »ofíæú\83\19¼«ó¯nã\ 3æ\18Ä`\rFdñ×ê·«÷«Á9N        \ 2?.¹oE&îS\1a\10\81(áÚ\7f{FÁ9â\89èÝÏÒòK§\1e\1f0¦Ûê1/óö±ÙWm£]0»#ÄàÈ°;\12HR0ÅbD\93¸ßý!-\94\91\8c<\98p°$¼\97õ,ló9ýbÜEX\84¨\88a·Þõ@©0Ðè=yºÏÿQ\8d\99ÐûÍ([\88ð)Í\ 1ÜÒLT[û-\95\ 5{Adè\0¿½»ý8\9e\8b \84÷¨,\9då%å\881ÙÛÿô\V\87&o\86Ó DDäN\17#\13ü¼l\8d\0Ç£@\8f·´ç¸tz_k\92 \b\81;<dCÓÖ]\ 6ç\8c!\83|%vê'k\97xv1C\f\v«C\v\1cù¦Síç9@(\84XD\1cB\9d B\92^øºÞu\85*\9dï`ø(Þ\ 22+:2ì'0(A\9cÓ\80'\18<\11s\19L\91\88\13\18yK§ß!Ù ¥\90ì:ëG}&Ûý|\8a\90¹NFûv¨ b®æÚÊ~\9f\94\97\1f&Å4ø\90VmW«Y\80(\8a\93\b¾1J\12\83Ͻ\ 2a\9d\86R\84\7f,D\14¦ûNM³ÜÔ\ 6\83\98èM«Þ4\13a©vi\v\ 6\81\11ÌÄ×~{?ÌËM\9e¥-¤?åá\e=\17\83ÏikVÁûZ\99ɼ±Ê*ó-TQÕÏv\83\9dK÷ûJ+3³Í!ͬ\95mU\ f
+Íb­ é\9aVmô)zÇ)\0`\1c/»bíptE7àhR\1c\9cE#v\ 3\a-\1d\8dp\82¸Æd,\92\9dj¡Fúò~mö\99¨ö\13\ 5\83\11)'Ä£9±Ü4'\8cRuí\ e²hgþ©Í®\9f\a\8d\99r\bOØj[W\85¥´v\96\86¬\1fÿ#\r\9dÂà+\14\ 2Eò2\ 1)\80ã»        è\8b\96\9e\9a\81>Å©#º7F×\9c)\0v05gK\ 3GâÁ\16\88\1ff\8cA"@\90ç\8cé\9c^2.Àc`þ\ 4øä¨!j\8c\17\fFμ\16\1f\95Ëcëc¨È±\9bÔ)Ë\8aÍ\fo3D1y\89·  cÀ¢äÇx{\88×\1cq3,\11\aW^\8b¸=}g\89ÛÉhçÔP\88&|]mËq­öU¹\eêQs¨¥õ\f
+q\98Ϫ¢èJM£yåî
+ë¿UÖNQ\19È\1d0\17\92\9cä×\1c8TB\87\ 1É×\ 2ÇÓw\16\1c'Ówµ½aq¯§5må\10\9aíy[\8dSç(«g±\17\80 Ç\99>\8b\ 3\90¯×Ý=}çq°2?\88C
+8X¾Þx|ý]Ia\vu\16  
+L\98¼^¹xúÎ#aez× Ý\87\86Ô>\1f,\ 4¦Ç\1f\1dòÅ{Í;Õdu~èëæìmÆ´ñÛ®ÌL}±H\86ûªúÜ衽[è¹þ\8a \aº·ÖMkþ\94\95~\1f\10\a¸Ð\7fÖ\91ÐÓc§ÕÿL§Õ£¼\9cÆ\87Æ\ 2<\96ÓÖã{\vìȸë\ 6\1e\8fh¥=ZÚ׶ÎUc½­l\97Àð¶âÄ^\80Lð½{ÔÙ&\8ff ÆÿýÒx7Þ·\nç\96\1cK\9bÖ]\93®÷vM\ 1¶ö\96\ 2\98Ö/îÝÖjrª¼<¾îHsa5·Uø\a·UýÂ=ÑX÷§S\etZ&ö\1dJ#\94`qñ5>\8a¸Ç8ÄYxoY+ qùxóþþÚ>Àï>­Ì\0â\86©AÔ\7fÉG\fz\vq\r5\8aϼ¸§\1eþ\v\18#\vSendstream
+endobj
+6001 0 obj <<
+/Type /Page
+/Contents 6002 0 R
+/Resources 6000 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+6003 0 obj <<
+/D [6001 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6004 0 obj <<
+/D [6001 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1486 0 obj <<
+/D [6001 0 R /XYZ 264.267 755.597 null]
+>> endobj
+6005 0 obj <<
+/D [6001 0 R /XYZ 71.731 745.018 null]
+>> endobj
+6006 0 obj <<
+/D [6001 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1490 0 obj <<
+/D [6001 0 R /XYZ 162.317 719.301 null]
+>> endobj
+6007 0 obj <<
+/D [6001 0 R /XYZ 251.059 703.48 null]
+>> endobj
+6008 0 obj <<
+/D [6001 0 R /XYZ 71.731 701.916 null]
+>> endobj
+1494 0 obj <<
+/D [6001 0 R /XYZ 174.677 678.142 null]
+>> endobj
+6009 0 obj <<
+/D [6001 0 R /XYZ 71.731 673.187 null]
+>> endobj
+6010 0 obj <<
+/D [6001 0 R /XYZ 71.731 670.796 null]
+>> endobj
+6011 0 obj <<
+/D [6001 0 R /XYZ 136.77 661.642 null]
+>> endobj
+6012 0 obj <<
+/D [6001 0 R /XYZ 235.772 661.642 null]
+>> endobj
+6013 0 obj <<
+/D [6001 0 R /XYZ 339.079 661.642 null]
+>> endobj
+6014 0 obj <<
+/D [6001 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1498 0 obj <<
+/D [6001 0 R /XYZ 187.959 622.523 null]
+>> endobj
+6015 0 obj <<
+/D [6001 0 R /XYZ 71.731 619.958 null]
+>> endobj
+6016 0 obj <<
+/D [6001 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6017 0 obj <<
+/D [6001 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6018 0 obj <<
+/D [6001 0 R /XYZ 71.731 604.58 null]
+>> endobj
+6019 0 obj <<
+/D [6001 0 R /XYZ 139.477 590.177 null]
+>> endobj
+6020 0 obj <<
+/D [6001 0 R /XYZ 71.731 586.449 null]
+>> endobj
+1502 0 obj <<
+/D [6001 0 R /XYZ 202.018 563.178 null]
+>> endobj
+6021 0 obj <<
+/D [6001 0 R /XYZ 71.731 560.644 null]
+>> endobj
+3275 0 obj <<
+/D [6001 0 R /XYZ 71.731 518.612 null]
+>> endobj
+6022 0 obj <<
+/D [6001 0 R /XYZ 71.731 505.701 null]
+>> endobj
+1506 0 obj <<
+/D [6001 0 R /XYZ 232.075 483.321 null]
+>> endobj
+6023 0 obj <<
+/D [6001 0 R /XYZ 71.731 472.742 null]
+>> endobj
+6024 0 obj <<
+/D [6001 0 R /XYZ 71.731 472.742 null]
+>> endobj
+1510 0 obj <<
+/D [6001 0 R /XYZ 162.317 447.025 null]
+>> endobj
+6025 0 obj <<
+/D [6001 0 R /XYZ 221.171 431.204 null]
+>> endobj
+6026 0 obj <<
+/D [6001 0 R /XYZ 71.731 429.137 null]
+>> endobj
+1514 0 obj <<
+/D [6001 0 R /XYZ 174.677 405.866 null]
+>> endobj
+6027 0 obj <<
+/D [6001 0 R /XYZ 71.731 400.911 null]
+>> endobj
+6028 0 obj <<
+/D [6001 0 R /XYZ 71.731 398.52 null]
+>> endobj
+6029 0 obj <<
+/D [6001 0 R /XYZ 136.77 389.366 null]
+>> endobj
+6030 0 obj <<
+/D [6001 0 R /XYZ 214.25 389.366 null]
+>> endobj
+6031 0 obj <<
+/D [6001 0 R /XYZ 317.557 389.366 null]
+>> endobj
+6032 0 obj <<
+/D [6001 0 R /XYZ 347.688 389.366 null]
+>> endobj
+6033 0 obj <<
+/D [6001 0 R /XYZ 450.995 389.366 null]
+>> endobj
+6034 0 obj <<
+/D [6001 0 R /XYZ 485.467 389.366 null]
+>> endobj
+6035 0 obj <<
+/D [6001 0 R /XYZ 192.728 380.039 null]
+>> endobj
+6036 0 obj <<
+/D [6001 0 R /XYZ 222.895 380.039 null]
+>> endobj
+6037 0 obj <<
+/D [6001 0 R /XYZ 240.112 380.039 null]
+>> endobj
+6038 0 obj <<
+/D [6001 0 R /XYZ 71.731 366.258 null]
+>> endobj
+1518 0 obj <<
+/D [6001 0 R /XYZ 187.959 340.92 null]
+>> endobj
+6039 0 obj <<
+/D [6001 0 R /XYZ 71.731 338.355 null]
+>> endobj
+6040 0 obj <<
+/D [6001 0 R /XYZ 71.731 333.573 null]
+>> endobj
+6041 0 obj <<
+/D [6001 0 R /XYZ 71.731 333.573 null]
+>> endobj
+6042 0 obj <<
+/D [6001 0 R /XYZ 71.731 321.622 null]
+>> endobj
+6043 0 obj <<
+/D [6001 0 R /XYZ 139.477 308.574 null]
+>> endobj
+6044 0 obj <<
+/D [6001 0 R /XYZ 71.731 305.677 null]
+>> endobj
+6045 0 obj <<
+/D [6001 0 R /XYZ 71.731 305.677 null]
+>> endobj
+6046 0 obj <<
+/D [6001 0 R /XYZ 71.731 293.229 null]
+>> endobj
+6047 0 obj <<
+/D [6001 0 R /XYZ 139.477 280.181 null]
+>> endobj
+6048 0 obj <<
+/D [6001 0 R /XYZ 71.731 277.284 null]
+>> endobj
+6049 0 obj <<
+/D [6001 0 R /XYZ 71.731 277.284 null]
+>> endobj
+6050 0 obj <<
+/D [6001 0 R /XYZ 71.731 264.835 null]
+>> endobj
+6051 0 obj <<
+/D [6001 0 R /XYZ 139.477 251.787 null]
+>> endobj
+6052 0 obj <<
+/D [6001 0 R /XYZ 71.731 248.89 null]
+>> endobj
+6053 0 obj <<
+/D [6001 0 R /XYZ 71.731 248.89 null]
+>> endobj
+6054 0 obj <<
+/D [6001 0 R /XYZ 71.731 237.797 null]
+>> endobj
+6055 0 obj <<
+/D [6001 0 R /XYZ 139.477 223.394 null]
+>> endobj
+6056 0 obj <<
+/D [6001 0 R /XYZ 71.731 219.666 null]
+>> endobj
+1522 0 obj <<
+/D [6001 0 R /XYZ 192.609 196.395 null]
+>> endobj
+6057 0 obj <<
+/D [6001 0 R /XYZ 71.731 191.439 null]
+>> endobj
+6058 0 obj <<
+/D [6001 0 R /XYZ 387.55 181.052 null]
+>> endobj
+6059 0 obj <<
+/D [6001 0 R /XYZ 71.731 166.326 null]
+>> endobj
+1526 0 obj <<
+/D [6001 0 R /XYZ 202.018 141.102 null]
+>> endobj
+6060 0 obj <<
+/D [6001 0 R /XYZ 71.731 138.568 null]
+>> endobj
+3276 0 obj <<
+/D [6001 0 R /XYZ 71.731 109.488 null]
+>> endobj
+6000 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6063 0 obj <<
+/Length 1451      
+/Filter /FlateDecode
+>>
+stream
+xÚÍXKoã6\10¾çWèè\14\11W¤(QBOi²[¤(v\81¬ÑK·\b\14\99\96ÕÈ\92£Ç¾C\ e©\87-çQ¸Eá\83\87âh\1e\1fg\86\8e\a\bJ\84O\9dÈc$\12\91\93nÏ<'\83\9d\9fϨáp\r\8b;âùiyöî\83Ï\9c\98Ä¡ï,×\ e\8b"Ây\brBÂÃÀY®~_\m\92]+ës\97\89hA       þÿ\9a\97Ý÷w·Ësêy\v\17VçtÑ}ǽ«Ë\8fH\×ùWûâ\17\80\rö\80¢ç\7f,\7f9{¿ì\8d\v\18%`Çsæ\e\96\ 3ó\19s¨ \8c\ 6Ê~ã£\b\ 2\12ÄB\9b\9f&åc'ï2ÙÞåeST-ÏWJ=¾É\89\ fîÂ\9b\\90\88\81\1a?$,\ eõ\9b\1f\93­DN>\82Ès\\1a\17¤\8bá\1dÊ\18Ø®\Qï|aLXP<V®\1a\Ü˦EªêÚ¬ÊË\fWr\ 5Øf\12\17I¹BBéBj]\19\883@»Dòæzp\91\928Ðà¸Ö\f\97\ 5Ä÷#mÌ秲Ú5yÓ;*\b\15Ü:\1a\12\8c\81¼l\91\ 6\ 6\r{d\9c:\ eÄXfì\11?ö-\ e\10\12M[w)8\12B\18\19\11\12\10¹3\8f~0ZéH«ç\13ß\13FÆ£â>Ô\ 3±\120«ç\ 2eÍ©Ze²W5§K\81GÃ^\17°ïf\94A8\84¬W\ 6û\10\ 3pbÇ\8d\ 1q\fÄ\19ý
+§gõO|UÜ»y_\83hêëp^tj'³ÂÒíÌñP\9f°© ®lò¬\84\10Ô«¢\82 <\90\eF\90\906¸çN\1döãð­\ 6îê¼\9a±p\1c\92ü8\17è,âDx\1c\8e!&\14NA1_ÖY·\95eÛôz')- pðiH\8d\v\14H\ 1\94\99\13D\1e\89\82¹\ 2Å\88\bc F[ûÿ}-ë\13q\10\87µl\38#\fj\93aQ\96ɾV`,uµ´¥C\9dL_1Z(\18\15\92iR\14ýó´Ún»2O\936¯L¡¨îÿ\94i{\b\89\v\16\86\b!!"º\17ÿ³È\ 4\8cð@\9c\ e\9aAÞql\f\8f\8e\97"I\r\1cmeQª,B;¨§ý%f÷×
+§ÎVTåÝK@°i"ÎâÀ8ñàÝ\93á0È;\8e\83áù\878$\80CQT\10\17r|»¼*(L\1d\99C\82Ç\ 1      ÁáS!1\92w\14        Ë£M\83pïïËöi'÷îË×;\99\1f÷1\84\82$ÂÓù8È;î£á±>î¥4Üý\98ÚküßÊ\ 6ηI²ý¨\90\16\e\b\89êõ9@'åy\16\14\1f*>äÊÉ@\19ä\1d\aÅð(Ûª\9dB#)LÈ\83¥uÞ>\1d Ò$ØXÍ] Æa\16\928ÆFéZ6i\9d\87\r\1e6\85\14üÐ\95)\9e\87Ï8\\9aÕC\83¤\ e=E´\e\89DY\95î=¤Þ¹X<¨äSÏ\86öÏgÁÐþ©E\92¦\12LÀ=\8eNdÒHÿ\96·\e¤L'¨H\88\ 6_,\88Y¬uw¢¬eà+\9e¤>s×çÁ"oð\7f­\8aâ\ 5ÒØgB\93Üï&C©ÐÌuµEªÝ$-RZ$\8d´ZX.µ· \ 2\1e.Vh/¬\8c½À PøKÖ\15®¶Ió`TÕƲ]-Ý\89éxÐkY׺dÅPÈqÔ\0
+ýp§;b t\84Ã?X\8fD\8f\1dÀJðÑÍÚla¹\9c\8a\ 2kÁú\8dZ°Å\16Hm¥\16©\ fÅ°Ù&|Ð0\ 39\1eÊ\85ÉÇ\8d\1c%\9f¦\10\19Emòl\ 3ºúÑ`\1aÌêÞÿfâÚ\145ùØÙÀ·I]󼶥},AèCÅbP@\1f Wd&\e<\93\aXUo%ô\1dÊÃH,~;\17\1c\10íäñ\8cÀ\83ºY÷¾Ú\9bÈj.\8d\95]\93Ü\17\16   \8c\93©gϼ»®¥Ü\1f\8bòr\1fÕRfP&¿\9aÕW\80       fÖ=\89µön\82C?\ºvF\f ã\ eùxìÙuvì9ùhy z\ü<P\12E\ase£êÉF®ºB6äY\14òpxT-Pm#£J!dsÛãï\r\8fF׿8<î»:\16(\ 4áÑ\7f48²·\r\8e\ 4   )\eÏ\8doR\85#$\8f \95¡ã\11rnl|a\1e\9bGóucT\14\12/\8aß:Eù/OQQL<ÿtSÔ îh{`Xþ/SÔ1`B\8f\84üt\8dÓ î(0\86eh\ 4¦õ\ 11éï\93=³Íç6\98>bO<ûÑq`±ß\1c\ 5Q\1fèÖ{2\94\1d\9f®Þß^\9aï\8c7\9f\97\ 1õ\18"<þ`©Ú>\1eÚ`çâÈ\87ÅC\vÿ\ 6*´>ºendstream
+endobj
+6062 0 obj <<
+/Type /Page
+/Contents 6063 0 R
+/Resources 6061 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 5815 0 R
+>> endobj
+6064 0 obj <<
+/D [6062 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6065 0 obj <<
+/D [6062 0 R /XYZ 71.731 814.833 null]
+>> endobj
+6066 0 obj <<
+/D [6062 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1530 0 obj <<
+/D [6062 0 R /XYZ 259.808 755.597 null]
+>> endobj
+6067 0 obj <<
+/D [6062 0 R /XYZ 71.731 745.018 null]
+>> endobj
+6068 0 obj <<
+/D [6062 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1534 0 obj <<
+/D [6062 0 R /XYZ 162.317 719.301 null]
+>> endobj
+6069 0 obj <<
+/D [6062 0 R /XYZ 239.103 703.48 null]
+>> endobj
+6070 0 obj <<
+/D [6062 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1538 0 obj <<
+/D [6062 0 R /XYZ 174.677 678.142 null]
+>> endobj
+6071 0 obj <<
+/D [6062 0 R /XYZ 71.731 673.187 null]
+>> endobj
+6072 0 obj <<
+/D [6062 0 R /XYZ 71.731 670.796 null]
+>> endobj
+6073 0 obj <<
+/D [6062 0 R /XYZ 136.77 661.642 null]
+>> endobj
+6074 0 obj <<
+/D [6062 0 R /XYZ 227.163 661.642 null]
+>> endobj
+6075 0 obj <<
+/D [6062 0 R /XYZ 330.47 661.642 null]
+>> endobj
+6076 0 obj <<
+/D [6062 0 R /XYZ 360.601 661.642 null]
+>> endobj
+6077 0 obj <<
+/D [6062 0 R /XYZ 463.909 661.642 null]
+>> endobj
+6078 0 obj <<
+/D [6062 0 R /XYZ 119.552 652.315 null]
+>> endobj
+6079 0 obj <<
+/D [6062 0 R /XYZ 222.859 652.315 null]
+>> endobj
+6080 0 obj <<
+/D [6062 0 R /XYZ 253.026 652.315 null]
+>> endobj
+6081 0 obj <<
+/D [6062 0 R /XYZ 270.244 652.315 null]
+>> endobj
+6082 0 obj <<
+/D [6062 0 R /XYZ 292.053 652.315 null]
+>> endobj
+6083 0 obj <<
+/D [6062 0 R /XYZ 352.315 652.315 null]
+>> endobj
+6084 0 obj <<
+/D [6062 0 R /XYZ 369.82 652.315 null]
+>> endobj
+6085 0 obj <<
+/D [6062 0 R /XYZ 387.038 652.315 null]
+>> endobj
+6086 0 obj <<
+/D [6062 0 R /XYZ 71.731 638.534 null]
+>> endobj
+1542 0 obj <<
+/D [6062 0 R /XYZ 187.959 613.196 null]
+>> endobj
+6087 0 obj <<
+/D [6062 0 R /XYZ 71.731 610.631 null]
+>> endobj
+6088 0 obj <<
+/D [6062 0 R /XYZ 71.731 605.849 null]
+>> endobj
+6089 0 obj <<
+/D [6062 0 R /XYZ 71.731 605.849 null]
+>> endobj
+6090 0 obj <<
+/D [6062 0 R /XYZ 71.731 593.898 null]
+>> endobj
+6091 0 obj <<
+/D [6062 0 R /XYZ 139.477 580.85 null]
+>> endobj
+6092 0 obj <<
+/D [6062 0 R /XYZ 71.731 577.953 null]
+>> endobj
+6093 0 obj <<
+/D [6062 0 R /XYZ 71.731 577.953 null]
+>> endobj
+6094 0 obj <<
+/D [6062 0 R /XYZ 71.731 565.505 null]
+>> endobj
+6095 0 obj <<
+/D [6062 0 R /XYZ 139.477 552.457 null]
+>> endobj
+6096 0 obj <<
+/D [6062 0 R /XYZ 71.731 549.559 null]
+>> endobj
+6097 0 obj <<
+/D [6062 0 R /XYZ 71.731 549.559 null]
+>> endobj
+6098 0 obj <<
+/D [6062 0 R /XYZ 71.731 537.111 null]
+>> endobj
+6099 0 obj <<
+/D [6062 0 R /XYZ 139.477 524.063 null]
+>> endobj
+6100 0 obj <<
+/D [6062 0 R /XYZ 71.731 521.166 null]
+>> endobj
+6101 0 obj <<
+/D [6062 0 R /XYZ 71.731 521.166 null]
+>> endobj
+6102 0 obj <<
+/D [6062 0 R /XYZ 71.731 510.073 null]
+>> endobj
+6103 0 obj <<
+/D [6062 0 R /XYZ 139.477 495.669 null]
+>> endobj
+6104 0 obj <<
+/D [6062 0 R /XYZ 71.731 492.772 null]
+>> endobj
+6105 0 obj <<
+/D [6062 0 R /XYZ 71.731 492.772 null]
+>> endobj
+6106 0 obj <<
+/D [6062 0 R /XYZ 71.731 481.679 null]
+>> endobj
+6107 0 obj <<
+/D [6062 0 R /XYZ 139.477 467.276 null]
+>> endobj
+6108 0 obj <<
+/D [6062 0 R /XYZ 71.731 464.379 null]
+>> endobj
+6109 0 obj <<
+/D [6062 0 R /XYZ 71.731 464.379 null]
+>> endobj
+6110 0 obj <<
+/D [6062 0 R /XYZ 71.731 451.931 null]
+>> endobj
+6111 0 obj <<
+/D [6062 0 R /XYZ 139.477 438.882 null]
+>> endobj
+6112 0 obj <<
+/D [6062 0 R /XYZ 71.731 435.154 null]
+>> endobj
+1546 0 obj <<
+/D [6062 0 R /XYZ 192.609 411.884 null]
+>> endobj
+6113 0 obj <<
+/D [6062 0 R /XYZ 71.731 406.928 null]
+>> endobj
+6114 0 obj <<
+/D [6062 0 R /XYZ 71.731 353.959 null]
+>> endobj
+1550 0 obj <<
+/D [6062 0 R /XYZ 202.018 330.688 null]
+>> endobj
+6115 0 obj <<
+/D [6062 0 R /XYZ 71.731 328.154 null]
+>> endobj
+3277 0 obj <<
+/D [6062 0 R /XYZ 71.731 299.074 null]
+>> endobj
+6116 0 obj <<
+/D [6062 0 R /XYZ 71.731 286.162 null]
+>> endobj
+1554 0 obj <<
+/D [6062 0 R /XYZ 234.949 263.782 null]
+>> endobj
+6117 0 obj <<
+/D [6062 0 R /XYZ 71.731 253.203 null]
+>> endobj
+6118 0 obj <<
+/D [6062 0 R /XYZ 71.731 253.203 null]
+>> endobj
+1558 0 obj <<
+/D [6062 0 R /XYZ 162.317 227.486 null]
+>> endobj
+6119 0 obj <<
+/D [6062 0 R /XYZ 221.171 211.665 null]
+>> endobj
+6120 0 obj <<
+/D [6062 0 R /XYZ 71.731 209.598 null]
+>> endobj
+1562 0 obj <<
+/D [6062 0 R /XYZ 174.677 186.328 null]
+>> endobj
+6121 0 obj <<
+/D [6062 0 R /XYZ 71.731 181.372 null]
+>> endobj
+6122 0 obj <<
+/D [6062 0 R /XYZ 71.731 178.981 null]
+>> endobj
+6123 0 obj <<
+/D [6062 0 R /XYZ 136.77 169.827 null]
+>> endobj
+6124 0 obj <<
+/D [6062 0 R /XYZ 214.25 169.827 null]
+>> endobj
+6125 0 obj <<
+/D [6062 0 R /XYZ 317.557 169.827 null]
+>> endobj
+6126 0 obj <<
+/D [6062 0 R /XYZ 347.688 169.827 null]
+>> endobj
+6127 0 obj <<
+/D [6062 0 R /XYZ 446.691 169.827 null]
+>> endobj
+6128 0 obj <<
+/D [6062 0 R /XYZ 476.822 169.827 null]
+>> endobj
+6129 0 obj <<
+/D [6062 0 R /XYZ 188.423 160.5 null]
+>> endobj
+6130 0 obj <<
+/D [6062 0 R /XYZ 71.731 146.719 null]
+>> endobj
+1566 0 obj <<
+/D [6062 0 R /XYZ 187.959 121.381 null]
+>> endobj
+6131 0 obj <<
+/D [6062 0 R /XYZ 71.731 118.817 null]
+>> endobj
+6132 0 obj <<
+/D [6062 0 R /XYZ 71.731 114.035 null]
+>> endobj
+6133 0 obj <<
+/D [6062 0 R /XYZ 71.731 114.035 null]
+>> endobj
+6134 0 obj <<
+/D [6062 0 R /XYZ 71.731 102.084 null]
+>> endobj
+6135 0 obj <<
+/D [6062 0 R /XYZ 139.477 89.035 null]
+>> endobj
+6136 0 obj <<
+/D [6062 0 R /XYZ 71.731 86.138 null]
+>> endobj
+6137 0 obj <<
+/D [6062 0 R /XYZ 71.731 86.138 null]
+>> endobj
+6138 0 obj <<
+/D [6062 0 R /XYZ 71.731 73.69 null]
+>> endobj
+6139 0 obj <<
+/D [6062 0 R /XYZ 139.477 60.642 null]
+>> endobj
+6061 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6142 0 obj <<
+/Length 1195      
+/Filter /FlateDecode
+>>
+stream
+xÚÅXÛr£F\10}÷Wð\88R«YæÆ@åɱ×)§R»)¯\92\978åÂh$\93\92@fÀYý}zn\$¤ì&v¥ü\0#\9aîÓ§»g\ eÆA\ 4\7f8\10\18        \8a\83$"(\11I\90o/¢`\rO~¼ÀÎbîLæ\ 3\9b\1f\16\17ïo(  R\94Æ4X¬\ 2\92$\88±\18üÄ\88Å<X,\7f\ f¯\9e²]#ëÙ\9c\88$ÄÈ^\7f.ÊöËû»Å\fGQ8\87Õ\f\87í\17ûìêò£½¹®\8b\17ÿâ}Ä#0\83gp\87g\7f,~ºø°èÀq\82\11à8\aß\99\1cÁç¸\87\8fq\8a8'\81à   \8a \r\r_mªæ0\gÇ(b\94MÅ#HÄ)Ü\r\1e\1d^;h\98\10\80¦)îý\19lD\f°1\82\b`ò6\1aÛ®*Ê\8eÚ¦r×'iovµÜeµ\Ú\15ä\ 1\1c\9bTÀ1\81\1cPʹö<\87ðqÊà\1a£4M\8dçk©òºØ5EUº7\ 6P"\80Ì\11\98þÒ6j6çPG\ 5\ 14[f\ 1Ñ_\8aªU\9b½]gð0\7fn\v\ 3Hÿð¸·\9eÙ \7fp\8c\11¡\ 2"hÏyV>·òa-\9b\87¢ôu8`\ 5\1a\8d§þ\85ª\9e\10MÈ)\8f¬X\1e;\9d\93\ 4¸Æ±®\f\90dÓ\µenè0læÙfcï \ 2\8eø\9bÛ\eÈñ\93]@\98ÖÕ!+] 2pð\925RÙ¥\®»JU¹Tª(×ÎçÊ^K)\97r\89&j\16¹j%\ 6Û\9dlÚZ#KDøÛL°0Û@ð\93u£¶n3*ÂJ\15\80ÉÁx1¯¹¬VU½U3\12\87ï|[eÍ(\8d\8e\8bÊ¡­Úf×:\eés~Ê\¶\8fR\96>+\9d,P\95Õû>5\ 1\8cÛvd\ 2%z\1a8F<¦Ãºe\8fU}Ð\vÄ\14XÏê*ð/Ò\18\91ÔNïÇl+\8f\12¡mÏ;\1f6\1a\8e\r\8fî  \11\8e\fý\96\1a\ eÜ\ 43\r$ë§r\v¹gë\8eæ\83\99\1d\8f¨\ f?'P@j«þy_V;U¨.?\81°`>?\98\vc\ 5ýi\r\e\18\93ñP\1cç?t\99Ä(JR\9f>lƪ©Û\1cª\1dÃ(;\ fPtõà~úÎ\ 5Å\83 \11E4ò³ú¬­\8fãÀ.Í\89\1f×wÖ×T(\98\9d³¡\ 4\8a1éBéIû\96P`\v\81%\11ÌSØ\9cÅ\90)ÍÐ\99àq\ 2\a\fv~§Ù\1cñ¯\ f´ï§\8aî8\9fÓ\14Á\89cl/ëu»\95e£º°£¦\16pD³1½Sç\16\83+K_íØêÝ\9d\9c\89Ff\80Ùf7d·µô;Ħ*×Ý&¨\87¦êwÛî÷¼ÚnÛ²È\87söø§Ì\9bcJº\93\rS$\12<n\86)bh\8aQ\ 4[Çk13ðw\92\1aoc¸é\8e\ 4Ó7\ 3Zº3þ«\92<'Zh\f©Dôõrìý\9dÎÑÙ|\95héd\83Ù_µ¦ØTPí\81\90y\ 3\15\ 3Gw\14ÖR\9fÍ\8c\94Ñ\8b!&½\1eI\19ýô\94!\88   ò-R\86£T¤ç¤\f\14\18\eH\19§Ê\7fU\9eä¿Ì\89UN\1cYyµÛ÷B¥\13?}¿®²b\ 3Â\81\87çtKúot\vùoºe ÉV­\97\81Î:#UÖºñÐ?Ê\146¬É}\14\91\r´øÃV­\89\1e\1abe\18aULú\1fM^\84\bgGzEõÛï\81\12±\95\14a§l­gÛ\ eOE>\13á\93\17\80¹Ü9R\v/~n¯'u\8b\83ñ\86ºe\9a\8bÑi;\12\1eÿ¯x\ 1\98\8cT\16\98\ 2\10\9dr\18îóî;\9d0\94\ 2Þs_ò½\89ÿ\90\17°\ 3é(c\1f:Ô§«\ fw\97n\9b¸ý¼°7\94ã\88X\8cÃÿ\ 2À\96\88
+\88%'¾Ö\8f\11þ\rø\b0\1cendstream
+endobj
+6141 0 obj <<
+/Type /Page
+/Contents 6142 0 R
+/Resources 6140 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6143 0 obj <<
+/D [6141 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6144 0 obj <<
+/D [6141 0 R /XYZ 71.731 814.833 null]
+>> endobj
+6145 0 obj <<
+/D [6141 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6146 0 obj <<
+/D [6141 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6147 0 obj <<
+/D [6141 0 R /XYZ 71.731 757.837 null]
+>> endobj
+6148 0 obj <<
+/D [6141 0 R /XYZ 139.477 743.434 null]
+>> endobj
+1570 0 obj <<
+/D [6141 0 R /XYZ 192.609 716.435 null]
+>> endobj
+6149 0 obj <<
+/D [6141 0 R /XYZ 71.731 711.48 null]
+>> endobj
+6150 0 obj <<
+/D [6141 0 R /XYZ 280.789 701.093 null]
+>> endobj
+6151 0 obj <<
+/D [6141 0 R /XYZ 401.768 701.093 null]
+>> endobj
+6152 0 obj <<
+/D [6141 0 R /XYZ 71.731 684.414 null]
+>> endobj
+1574 0 obj <<
+/D [6141 0 R /XYZ 202.018 661.143 null]
+>> endobj
+6153 0 obj <<
+/D [6141 0 R /XYZ 71.731 658.608 null]
+>> endobj
+3278 0 obj <<
+/D [6141 0 R /XYZ 71.731 629.528 null]
+>> endobj
+6154 0 obj <<
+/D [6141 0 R /XYZ 71.731 616.617 null]
+>> endobj
+1578 0 obj <<
+/D [6141 0 R /XYZ 252.802 594.237 null]
+>> endobj
+6155 0 obj <<
+/D [6141 0 R /XYZ 71.731 583.658 null]
+>> endobj
+6156 0 obj <<
+/D [6141 0 R /XYZ 71.731 583.658 null]
+>> endobj
+1582 0 obj <<
+/D [6141 0 R /XYZ 162.317 557.941 null]
+>> endobj
+6157 0 obj <<
+/D [6141 0 R /XYZ 233.126 542.12 null]
+>> endobj
+6158 0 obj <<
+/D [6141 0 R /XYZ 71.731 540.053 null]
+>> endobj
+1586 0 obj <<
+/D [6141 0 R /XYZ 174.677 516.782 null]
+>> endobj
+6159 0 obj <<
+/D [6141 0 R /XYZ 71.731 511.827 null]
+>> endobj
+6160 0 obj <<
+/D [6141 0 R /XYZ 71.731 509.436 null]
+>> endobj
+6161 0 obj <<
+/D [6141 0 R /XYZ 136.77 500.282 null]
+>> endobj
+6162 0 obj <<
+/D [6141 0 R /XYZ 222.859 500.282 null]
+>> endobj
+6163 0 obj <<
+/D [6141 0 R /XYZ 326.166 500.282 null]
+>> endobj
+6164 0 obj <<
+/D [6141 0 R /XYZ 356.297 500.282 null]
+>> endobj
+6165 0 obj <<
+/D [6141 0 R /XYZ 455.3 500.282 null]
+>> endobj
+6166 0 obj <<
+/D [6141 0 R /XYZ 485.431 500.282 null]
+>> endobj
+6167 0 obj <<
+/D [6141 0 R /XYZ 188.423 490.955 null]
+>> endobj
+6168 0 obj <<
+/D [6141 0 R /XYZ 71.731 477.174 null]
+>> endobj
+1590 0 obj <<
+/D [6141 0 R /XYZ 187.959 451.836 null]
+>> endobj
+6169 0 obj <<
+/D [6141 0 R /XYZ 71.731 449.271 null]
+>> endobj
+6170 0 obj <<
+/D [6141 0 R /XYZ 71.731 444.489 null]
+>> endobj
+6171 0 obj <<
+/D [6141 0 R /XYZ 71.731 444.489 null]
+>> endobj
+6172 0 obj <<
+/D [6141 0 R /XYZ 71.731 432.538 null]
+>> endobj
+6173 0 obj <<
+/D [6141 0 R /XYZ 139.477 419.49 null]
+>> endobj
+6174 0 obj <<
+/D [6141 0 R /XYZ 71.731 416.593 null]
+>> endobj
+6175 0 obj <<
+/D [6141 0 R /XYZ 71.731 416.593 null]
+>> endobj
+6176 0 obj <<
+/D [6141 0 R /XYZ 71.731 404.145 null]
+>> endobj
+6177 0 obj <<
+/D [6141 0 R /XYZ 139.477 391.096 null]
+>> endobj
+6178 0 obj <<
+/D [6141 0 R /XYZ 71.731 388.199 null]
+>> endobj
+6179 0 obj <<
+/D [6141 0 R /XYZ 71.731 388.199 null]
+>> endobj
+6180 0 obj <<
+/D [6141 0 R /XYZ 71.731 377.106 null]
+>> endobj
+6181 0 obj <<
+/D [6141 0 R /XYZ 139.477 362.703 null]
+>> endobj
+6182 0 obj <<
+/D [6141 0 R /XYZ 71.731 358.975 null]
+>> endobj
+1594 0 obj <<
+/D [6141 0 R /XYZ 192.609 335.704 null]
+>> endobj
+6183 0 obj <<
+/D [6141 0 R /XYZ 71.731 330.749 null]
+>> endobj
+6184 0 obj <<
+/D [6141 0 R /XYZ 282.024 320.362 null]
+>> endobj
+6185 0 obj <<
+/D [6141 0 R /XYZ 401.768 320.362 null]
+>> endobj
+6186 0 obj <<
+/D [6141 0 R /XYZ 71.731 303.682 null]
+>> endobj
+1598 0 obj <<
+/D [6141 0 R /XYZ 202.018 280.411 null]
+>> endobj
+6187 0 obj <<
+/D [6141 0 R /XYZ 71.731 277.877 null]
+>> endobj
+3279 0 obj <<
+/D [6141 0 R /XYZ 71.731 248.797 null]
+>> endobj
+6188 0 obj <<
+/D [6141 0 R /XYZ 71.731 235.885 null]
+>> endobj
+1602 0 obj <<
+/D [6141 0 R /XYZ 293.62 213.505 null]
+>> endobj
+6189 0 obj <<
+/D [6141 0 R /XYZ 71.731 202.927 null]
+>> endobj
+6190 0 obj <<
+/D [6141 0 R /XYZ 71.731 202.927 null]
+>> endobj
+1606 0 obj <<
+/D [6141 0 R /XYZ 162.317 177.21 null]
+>> endobj
+6191 0 obj <<
+/D [6141 0 R /XYZ 257.036 161.389 null]
+>> endobj
+6192 0 obj <<
+/D [6141 0 R /XYZ 71.731 159.322 null]
+>> endobj
+1610 0 obj <<
+/D [6141 0 R /XYZ 174.677 136.051 null]
+>> endobj
+6193 0 obj <<
+/D [6141 0 R /XYZ 71.731 131.095 null]
+>> endobj
+6194 0 obj <<
+/D [6141 0 R /XYZ 71.731 128.704 null]
+>> endobj
+6195 0 obj <<
+/D [6141 0 R /XYZ 136.77 119.551 null]
+>> endobj
+6196 0 obj <<
+/D [6141 0 R /XYZ 240.077 119.551 null]
+>> endobj
+6197 0 obj <<
+/D [6141 0 R /XYZ 343.384 119.551 null]
+>> endobj
+6198 0 obj <<
+/D [6141 0 R /XYZ 373.515 119.551 null]
+>> endobj
+6199 0 obj <<
+/D [6141 0 R /XYZ 450.995 119.551 null]
+>> endobj
+6200 0 obj <<
+/D [6141 0 R /XYZ 71.731 105.769 null]
+>> endobj
+6140 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6204 0 obj <<
+/Length 1197      
+/Filter /FlateDecode
+>>
+stream
+xÚÅWKo¤F\10¾ûWpd¢\9d\r4('Ç^G\eENd\8frÉF\16fz\18\92\81ÆÐx×ÿ>Õ/\1ecÆk­\1cEs\98j¨çWEU5ö\ 2øa\8faÄ(ö\92\80 \84%^^\9d\ 5^\ 1o~>Ã\96cmYÖ\13\9e\9f6gç×\94x)Jcêmv\1eI\12\14\86\89Q\18GÞfû§\7f¹Ï\1aÉÛÕ\9a°ÄÇÈüÿZÖý×óÛÍ
+\a\81¿\86Ó
+ûýWóîòâÆ\10Wmùä\ 4?\aQ\0\ e(¼úkóËÙÇÍà\D0\ 2?^sß²¼p\9f\10\ fc\94F\91ò\1fã\14E\11ñX\94 \0âPþ_´E_ñZvÊèùu\84Çp\ 3o\8d\19 B5ã#¯·Ý±g\83F\12!\16à%×\bbq
+ÔäÕñÿ\10\ 5&\ 4¢PÙ\18õ\990Øè\16\ e   "à½ãQÎiß4\92\9dlû\ö-7Ç\a~\10uQÖ\859JH\840d\9e\1d\ eÃó\TU_\97y&KQ\9bGâáo\9eË\97¨¬ÁÇ8\rÁY\8aXB´ùª+N!\13§\fÑ\80½\e2\13}'\91q<ʵF\94õP\9fÒÆ~¹Â\89ïê°â]\97\15ÜD:«\97!T\12£4Mµ¾+ÞåmÙh\9c\8c\ 4\9bWL\84hhP¹³Y¡£\r8¤Æ\vx\b       0\84èe!L.à5ß\16Ü\8a墮!       |k\8eF\10\14ì¹yPÀ\17T\eRÛ"\91ÿÁ°|Ù\97ù\8aù{k)Ïy#\8f|\ 1ïµÃ\ 4Â5\ e/TÁ§«\15e>Z\0'°°$Zô\96CÍ)\99\84ù\7f¬X\bÁõü4@t"d\v·î«\a\97'±3ÿ
+
+¨Øn\9e(}Øg\9d«pn}í\0\83\83Ã\f\11\192\94¨\12\8a0\8abãA\9eÕ\8f=¿\97¼\93÷\90\85î ä(\19\82£±\92t\824F$5mã&«lx!9\ eOñ¾®|Z³8Öx\ 4Zä3!Ì\86\0R\86Ê\T-\97\9f¸;eÛgE2_kÖ\ fwÂ"è*\83ÙÊX(ngy\r}\84R\93Æ»çZ4]Ù\r¡1\84YèB\8b\91éùðEÙ¾\10\8c\f\1aèÄÆq2ô©Ê$FA\92ºÈa\ 2\98ÞµZÇ05¬\ 6åü½}ôÃÐ\8c\ 1Õ_z0oÑs;0\1a"\bÝð|0º\96LA±\r¦\96l)ìp<Ø\ 2öfÁ\18ä?¦\8bÆÔ\a\a5\14\81\96È[§ÐÏØ\14,\ 5Òkö\19\ 5Ê\99WÌÍr¨Q2B\8a\7f\Ê|\1aÂT\83¶FS\ 4mú­c0üö\18¤à#\ 5©÷jö\13}'\9b½ãù_Ç >ª\89EpÂ\10\84Ó÷\ 3gÔw\1a\1cË£'á!Ëù|\ evR8\84\16çäNáÔ»þ£»ñ\9b\80\18ªs\11\aÕG \90ß\r\87Qßi\1c,ÏwâÐ\ 2\ e<çÐS-\14óAñ^\vÃu_ç¶òHàËì\1f½\a\0¹/\8b½\99\aphÚR´¥|6§\f$ôH\0º¬¡\80M1ÃI§\v(l'\b<r\13Ī\15\87í Õ\8d\13 í8\ 1\8ajaO(åk\vAú=\v\81Q|Ã\8bÌ\86\ 3cíI\8b\0\19Cd0ÙªaÁ\81\97r\9fIGñÖJ\94nY`~-ÌÿdL jzéF¦*m{°S\93\8dS\93\rû\142ÇßÕ\1a$\94úòØÁ)>¦üKÛ\84øc\9f\1dæ\95dV7Ûj2ÐWO+êÔf\ 3=J@SrÕ÷ð|¤¬¬m` §ÜrµÝ¢on@átøìZÎÿ³\rhAù\e6 %e\91hZ\91Ãòçâ\9f'Òè\9cv\1a{\97%Ðû\96o\1eÃmwdq\97]\86R¦§íL\87òì·Ë\8f·\17ö\82ûénc\b\1aá\80\98\98¦7å\90&(ÂØÆ\14¦'n´/=ü\17c<ðBendstream
+endobj
+6203 0 obj <<
+/Type /Page
+/Contents 6204 0 R
+/Resources 6202 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6205 0 obj <<
+/D [6203 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1614 0 obj <<
+/D [6203 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6206 0 obj <<
+/D [6203 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6207 0 obj <<
+/D [6203 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6208 0 obj <<
+/D [6203 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6209 0 obj <<
+/D [6203 0 R /XYZ 71.731 738.749 null]
+>> endobj
+6210 0 obj <<
+/D [6203 0 R /XYZ 139.477 725.701 null]
+>> endobj
+6211 0 obj <<
+/D [6203 0 R /XYZ 71.731 710.355 null]
+>> endobj
+6212 0 obj <<
+/D [6203 0 R /XYZ 139.477 697.307 null]
+>> endobj
+6213 0 obj <<
+/D [6203 0 R /XYZ 71.731 693.579 null]
+>> endobj
+1618 0 obj <<
+/D [6203 0 R /XYZ 192.609 670.308 null]
+>> endobj
+6214 0 obj <<
+/D [6203 0 R /XYZ 71.731 665.353 null]
+>> endobj
+6215 0 obj <<
+/D [6203 0 R /XYZ 71.731 640.239 null]
+>> endobj
+1622 0 obj <<
+/D [6203 0 R /XYZ 202.018 615.016 null]
+>> endobj
+6216 0 obj <<
+/D [6203 0 R /XYZ 71.731 612.481 null]
+>> endobj
+3280 0 obj <<
+/D [6203 0 R /XYZ 71.731 583.401 null]
+>> endobj
+6217 0 obj <<
+/D [6203 0 R /XYZ 71.731 570.49 null]
+>> endobj
+1626 0 obj <<
+/D [6203 0 R /XYZ 248.98 548.11 null]
+>> endobj
+6218 0 obj <<
+/D [6203 0 R /XYZ 71.731 537.531 null]
+>> endobj
+6219 0 obj <<
+/D [6203 0 R /XYZ 71.731 537.531 null]
+>> endobj
+1630 0 obj <<
+/D [6203 0 R /XYZ 162.317 511.814 null]
+>> endobj
+6220 0 obj <<
+/D [6203 0 R /XYZ 233.126 495.993 null]
+>> endobj
+6221 0 obj <<
+/D [6203 0 R /XYZ 71.731 493.926 null]
+>> endobj
+1634 0 obj <<
+/D [6203 0 R /XYZ 174.677 470.655 null]
+>> endobj
+6222 0 obj <<
+/D [6203 0 R /XYZ 71.731 465.7 null]
+>> endobj
+6223 0 obj <<
+/D [6203 0 R /XYZ 71.731 463.309 null]
+>> endobj
+6224 0 obj <<
+/D [6203 0 R /XYZ 136.77 454.155 null]
+>> endobj
+6225 0 obj <<
+/D [6203 0 R /XYZ 222.859 454.155 null]
+>> endobj
+6226 0 obj <<
+/D [6203 0 R /XYZ 326.166 454.155 null]
+>> endobj
+6227 0 obj <<
+/D [6203 0 R /XYZ 356.297 454.155 null]
+>> endobj
+6228 0 obj <<
+/D [6203 0 R /XYZ 459.604 454.155 null]
+>> endobj
+6229 0 obj <<
+/D [6203 0 R /XYZ 494.076 454.155 null]
+>> endobj
+6230 0 obj <<
+/D [6203 0 R /XYZ 192.728 444.828 null]
+>> endobj
+6231 0 obj <<
+/D [6203 0 R /XYZ 71.731 431.047 null]
+>> endobj
+1638 0 obj <<
+/D [6203 0 R /XYZ 187.959 405.709 null]
+>> endobj
+6232 0 obj <<
+/D [6203 0 R /XYZ 71.731 403.144 null]
+>> endobj
+6233 0 obj <<
+/D [6203 0 R /XYZ 71.731 398.362 null]
+>> endobj
+6234 0 obj <<
+/D [6203 0 R /XYZ 71.731 398.362 null]
+>> endobj
+6235 0 obj <<
+/D [6203 0 R /XYZ 71.731 386.411 null]
+>> endobj
+6236 0 obj <<
+/D [6203 0 R /XYZ 139.477 373.363 null]
+>> endobj
+6237 0 obj <<
+/D [6203 0 R /XYZ 71.731 370.466 null]
+>> endobj
+6238 0 obj <<
+/D [6203 0 R /XYZ 71.731 370.466 null]
+>> endobj
+6239 0 obj <<
+/D [6203 0 R /XYZ 71.731 358.018 null]
+>> endobj
+6240 0 obj <<
+/D [6203 0 R /XYZ 139.477 344.969 null]
+>> endobj
+6241 0 obj <<
+/D [6203 0 R /XYZ 71.731 342.072 null]
+>> endobj
+6242 0 obj <<
+/D [6203 0 R /XYZ 71.731 342.072 null]
+>> endobj
+6243 0 obj <<
+/D [6203 0 R /XYZ 71.731 329.624 null]
+>> endobj
+6244 0 obj <<
+/D [6203 0 R /XYZ 139.477 316.576 null]
+>> endobj
+6245 0 obj <<
+/D [6203 0 R /XYZ 71.731 312.848 null]
+>> endobj
+1642 0 obj <<
+/D [6203 0 R /XYZ 192.609 289.577 null]
+>> endobj
+6246 0 obj <<
+/D [6203 0 R /XYZ 71.731 284.622 null]
+>> endobj
+6247 0 obj <<
+/D [6203 0 R /XYZ 71.731 259.508 null]
+>> endobj
+1646 0 obj <<
+/D [6203 0 R /XYZ 202.018 234.284 null]
+>> endobj
+6248 0 obj <<
+/D [6203 0 R /XYZ 71.731 231.75 null]
+>> endobj
+3281 0 obj <<
+/D [6203 0 R /XYZ 71.731 189.719 null]
+>> endobj
+6249 0 obj <<
+/D [6203 0 R /XYZ 71.731 176.807 null]
+>> endobj
+1650 0 obj <<
+/D [6203 0 R /XYZ 251.218 154.427 null]
+>> endobj
+6250 0 obj <<
+/D [6203 0 R /XYZ 71.731 143.848 null]
+>> endobj
+6251 0 obj <<
+/D [6203 0 R /XYZ 71.731 143.848 null]
+>> endobj
+1654 0 obj <<
+/D [6203 0 R /XYZ 162.317 118.131 null]
+>> endobj
+6252 0 obj <<
+/D [6203 0 R /XYZ 233.126 102.31 null]
+>> endobj
+6253 0 obj <<
+/D [6203 0 R /XYZ 71.731 100.243 null]
+>> endobj
+6202 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6256 0 obj <<
+/Length 1125      
+/Filter /FlateDecode
+>>
+stream
+xÚÝXËnã6\14Ýç+´\94\8b\8aáC$Et\95f&E\8bb
+d\8cn:E È´£V\96\1c\89J'\7fßK\91z\8då\ 4\83:EQdaR:¼\8fs\1f¼\11  0ü\91@\12$\19 \12LQ"\93 Û_à`\ao~¸ \1e\11yH4Á|¿¾¸¼a4PH  \16¬·\ 1M\12\14Ç\ 2ä\b\14\v\1e¬7¿\85×\ féÁèz\15Q\99\84\ 4¹ß\9fó²ý|y»^\11\8cÃ\bv+\12\9fÝ»ë«\ fnñ®Î\9fú\83\9f\0\83w°"«ß×?]¼_\ fÆqJ\10Øñ\92ù\1erd>¥\ 1!Hqní'D!Îi y\820øaíÿø\V\87&o¬ÎË\9b\18^""c\8bÆAD\ 4r^æ¥q\0\8eG\0\91\88\92\ 4p\16\91¥åc«ï¶µÖwUk\9a¢2Ç"\13\81p¢ü   ëscê63«H\0O^\82.7Í\9d\7fô\8dWJ&J1C\fK/ãÑ¢\8fõ\0\19\1c<w\98o\9d¬%U\9b\9d~Q\95D\82ÐA\15 ¿J\15`\83\88q`I\ 6\91\82ðÈ)S\96¡\17\94\8b\ 4âH¼Üe6güÛ¼ùÎaf1\8f\11S\bâßa¯ê]»×¥i\ 6µC\8aÛ K¨\84xNï4\eû,\12\ 2#Éã¥t¤H
+\eæÉ«/\7f\87Ì%\94\ 2\98Ès©+G³HL\11\85\8cí1ָζ®z\1cßm­Ýö^\17U¹ËË\9dÛ\1a(¾Ê-³´(\86çYµß·e\9e¥&¯J÷¨ºÿCgæ\98\95\bl\14*\ 6c\19\92   \99çÃ"7\f\9c\12ä|Ü\8còNsã1\1d7Ö6Ç\8dM\9d       -\9e\93ê5'é,ñ\16}\84JTB\9eÏÇQÞi\1f=ÆÚv¨ +õ\rÔø\b\9b\aï÷¡®2Ý4zÓÓ`³À,\15Hï6\15H)W ït\93Õù¡K\fwBÎK\84#\16;\86nÚ2s        Ä\98\bk]è´Ñ\8dÛMl°[\17
+÷B?åUÛ\19õl\1fÉ0Í\1eí%\91×=úþy¨øñ\ 2\12\ 4:\12\9b·\£\e3o¹3æ \87«¡AmÁÚÈ7&\99 Î¸\r\0\9c\19+ÁV
+Z`\v{\9e\92\ e\7f«¡êì\89D\86¿®d\1c¦E«O3Ææ\87@ÍSw [æ嶪÷¾¢sàbÛ??´>\83\9b|ãÁ\ fiÓ'µö¢ÊÊä\9f0¦}Äû\8cø³¬þr«ô¾ê%e+\19>\80\8e´ìë¤òê&\95cR£G
+l³u    \13K\94Ø\84åÐú\ 5\9b\86"Ý¥yùE,àh\f¾\v{´?É\ 4¢ÊÝ¿\1fÒ½>\ e´cÌb_\91>\8d´/$\7f\1fP*\9d\1f5$³uWoÚ¢w¶5#©E\ 5D\989i>s}\ 4üËN¿[\16©­¼\85b\1aª\99BÀYò\16\ 2\rS\99
+#¦Ø¿4c°óÌ\18ä\1fÎ\18Ð\168@ÿ\87C\ 6M0Â@ó¹.\99\89¼\93\97L\8fù¯\ f\19\14\1a\90 ê|Ü\8còNsã1ç\192È«C\ 6¥\fQ&Îçã(ï´\8f\1eóú\90\rwWßm£\ 3ä\82ë\9f6\rÞpâ \8aÏ»{ã\9ey³`5\f\1aÏn\ fS\86\1f1ìnqÄ ð¿¡\14_;bp¸\eÇ\11c4Ï\16\83oRq\8c¸"³yc`­ÑYUö\17\9fÏp@§%\92òð\8d&\92  £]ý\96å\10Ö4wcÐ47ý§\ 2\1a#\85å\8b\1f\13FHÿ-A"%­\ 1s\19Ö\88_®ßß^ùï\a?~\»\ 5ã\ 4SgþôCDÌ`v\en\r\8eO|08¶ðo\9b\81>\1aendstream
+endobj
+6255 0 obj <<
+/Type /Page
+/Contents 6256 0 R
+/Resources 6254 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6257 0 obj <<
+/D [6255 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1658 0 obj <<
+/D [6255 0 R /XYZ 174.677 758.046 null]
+>> endobj
+6258 0 obj <<
+/D [6255 0 R /XYZ 71.731 753.091 null]
+>> endobj
+6259 0 obj <<
+/D [6255 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6260 0 obj <<
+/D [6255 0 R /XYZ 136.77 741.546 null]
+>> endobj
+6261 0 obj <<
+/D [6255 0 R /XYZ 222.859 741.546 null]
+>> endobj
+6262 0 obj <<
+/D [6255 0 R /XYZ 326.166 741.546 null]
+>> endobj
+6263 0 obj <<
+/D [6255 0 R /XYZ 356.297 741.546 null]
+>> endobj
+6264 0 obj <<
+/D [6255 0 R /XYZ 455.3 741.546 null]
+>> endobj
+6265 0 obj <<
+/D [6255 0 R /XYZ 485.431 741.546 null]
+>> endobj
+6266 0 obj <<
+/D [6255 0 R /XYZ 188.423 732.219 null]
+>> endobj
+6267 0 obj <<
+/D [6255 0 R /XYZ 71.731 718.438 null]
+>> endobj
+1662 0 obj <<
+/D [6255 0 R /XYZ 187.959 693.1 null]
+>> endobj
+6268 0 obj <<
+/D [6255 0 R /XYZ 71.731 690.536 null]
+>> endobj
+6269 0 obj <<
+/D [6255 0 R /XYZ 71.731 685.754 null]
+>> endobj
+6270 0 obj <<
+/D [6255 0 R /XYZ 71.731 685.754 null]
+>> endobj
+6271 0 obj <<
+/D [6255 0 R /XYZ 71.731 673.802 null]
+>> endobj
+6272 0 obj <<
+/D [6255 0 R /XYZ 139.477 660.754 null]
+>> endobj
+6273 0 obj <<
+/D [6255 0 R /XYZ 71.731 657.857 null]
+>> endobj
+6274 0 obj <<
+/D [6255 0 R /XYZ 71.731 657.857 null]
+>> endobj
+6275 0 obj <<
+/D [6255 0 R /XYZ 71.731 645.409 null]
+>> endobj
+6276 0 obj <<
+/D [6255 0 R /XYZ 139.477 632.361 null]
+>> endobj
+6277 0 obj <<
+/D [6255 0 R /XYZ 71.731 629.464 null]
+>> endobj
+6278 0 obj <<
+/D [6255 0 R /XYZ 71.731 629.464 null]
+>> endobj
+6279 0 obj <<
+/D [6255 0 R /XYZ 71.731 618.37 null]
+>> endobj
+6280 0 obj <<
+/D [6255 0 R /XYZ 139.477 603.967 null]
+>> endobj
+6281 0 obj <<
+/D [6255 0 R /XYZ 71.731 600.239 null]
+>> endobj
+1666 0 obj <<
+/D [6255 0 R /XYZ 192.609 576.968 null]
+>> endobj
+6282 0 obj <<
+/D [6255 0 R /XYZ 71.731 572.013 null]
+>> endobj
+6283 0 obj <<
+/D [6255 0 R /XYZ 381.165 561.626 null]
+>> endobj
+6284 0 obj <<
+/D [6255 0 R /XYZ 71.731 546.899 null]
+>> endobj
+1670 0 obj <<
+/D [6255 0 R /XYZ 202.018 521.676 null]
+>> endobj
+6285 0 obj <<
+/D [6255 0 R /XYZ 71.731 519.141 null]
+>> endobj
+3282 0 obj <<
+/D [6255 0 R /XYZ 71.731 490.061 null]
+>> endobj
+6286 0 obj <<
+/D [6255 0 R /XYZ 71.731 477.15 null]
+>> endobj
+1674 0 obj <<
+/D [6255 0 R /XYZ 265.541 454.77 null]
+>> endobj
+6287 0 obj <<
+/D [6255 0 R /XYZ 71.731 444.191 null]
+>> endobj
+6288 0 obj <<
+/D [6255 0 R /XYZ 71.731 444.191 null]
+>> endobj
+1678 0 obj <<
+/D [6255 0 R /XYZ 162.317 418.474 null]
+>> endobj
+6289 0 obj <<
+/D [6255 0 R /XYZ 239.103 402.653 null]
+>> endobj
+6290 0 obj <<
+/D [6255 0 R /XYZ 71.731 400.586 null]
+>> endobj
+1682 0 obj <<
+/D [6255 0 R /XYZ 174.677 377.315 null]
+>> endobj
+6291 0 obj <<
+/D [6255 0 R /XYZ 71.731 372.36 null]
+>> endobj
+6292 0 obj <<
+/D [6255 0 R /XYZ 71.731 369.969 null]
+>> endobj
+6293 0 obj <<
+/D [6255 0 R /XYZ 136.77 360.815 null]
+>> endobj
+6294 0 obj <<
+/D [6255 0 R /XYZ 227.163 360.815 null]
+>> endobj
+6295 0 obj <<
+/D [6255 0 R /XYZ 330.47 360.815 null]
+>> endobj
+6296 0 obj <<
+/D [6255 0 R /XYZ 360.601 360.815 null]
+>> endobj
+6297 0 obj <<
+/D [6255 0 R /XYZ 459.604 360.815 null]
+>> endobj
+6298 0 obj <<
+/D [6255 0 R /XYZ 489.735 360.815 null]
+>> endobj
+6299 0 obj <<
+/D [6255 0 R /XYZ 188.423 351.488 null]
+>> endobj
+6300 0 obj <<
+/D [6255 0 R /XYZ 71.731 337.707 null]
+>> endobj
+1686 0 obj <<
+/D [6255 0 R /XYZ 187.959 312.369 null]
+>> endobj
+6301 0 obj <<
+/D [6255 0 R /XYZ 71.731 309.804 null]
+>> endobj
+6302 0 obj <<
+/D [6255 0 R /XYZ 71.731 305.022 null]
+>> endobj
+6303 0 obj <<
+/D [6255 0 R /XYZ 71.731 305.022 null]
+>> endobj
+6304 0 obj <<
+/D [6255 0 R /XYZ 71.731 293.071 null]
+>> endobj
+6305 0 obj <<
+/D [6255 0 R /XYZ 139.477 280.023 null]
+>> endobj
+6306 0 obj <<
+/D [6255 0 R /XYZ 71.731 277.126 null]
+>> endobj
+6307 0 obj <<
+/D [6255 0 R /XYZ 71.731 277.126 null]
+>> endobj
+6308 0 obj <<
+/D [6255 0 R /XYZ 71.731 264.678 null]
+>> endobj
+6309 0 obj <<
+/D [6255 0 R /XYZ 139.477 251.629 null]
+>> endobj
+6310 0 obj <<
+/D [6255 0 R /XYZ 71.731 248.732 null]
+>> endobj
+6311 0 obj <<
+/D [6255 0 R /XYZ 71.731 248.732 null]
+>> endobj
+6312 0 obj <<
+/D [6255 0 R /XYZ 71.731 237.639 null]
+>> endobj
+6313 0 obj <<
+/D [6255 0 R /XYZ 139.477 223.236 null]
+>> endobj
+6314 0 obj <<
+/D [6255 0 R /XYZ 71.731 219.508 null]
+>> endobj
+1690 0 obj <<
+/D [6255 0 R /XYZ 192.609 196.237 null]
+>> endobj
+6315 0 obj <<
+/D [6255 0 R /XYZ 71.731 191.282 null]
+>> endobj
+6316 0 obj <<
+/D [6255 0 R /XYZ 347.628 180.895 null]
+>> endobj
+6317 0 obj <<
+/D [6255 0 R /XYZ 71.731 164.215 null]
+>> endobj
+1694 0 obj <<
+/D [6255 0 R /XYZ 202.018 140.945 null]
+>> endobj
+6318 0 obj <<
+/D [6255 0 R /XYZ 71.731 138.41 null]
+>> endobj
+3283 0 obj <<
+/D [6255 0 R /XYZ 71.731 109.33 null]
+>> endobj
+6254 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6321 0 obj <<
+/Length 1174      
+/Filter /FlateDecode
+>>
+stream
+xÚ½WÛnã6\10}ÏWèQ.V\^DQB\9fÒd[lQ¤@ÖèKS\ 4\8aLÛÂÚ\92£Ë6é×wH\ e\164\80·\b\10Óù\9c3\9cá\98, ðÇ\ 2Å\88\12,H)'©J\83b{E\83\15ìürÅP#B\95h¢óÓüêãÏ\82\a\19É\12\11Ì\97\ 1OS\12Ç      øIH\9cÈ`¾ø3¼Yç»N7³\88«4dÄ}þVVýËÇûù\8cQ\1aFðmÆÂþÅíÝ\ß¹ÅmS~ó\86\ fTRP\83=X±Ù_ó_¯>Í\ap\923\ 2\82\8f*Gð9\ f\98"\9cI\83\1f9*)\89Ì\94\85_äÕs¯\1f[Ý=>PÊ7\9d\89íÌb"\80+\98Å\8a¤\1cb\88\84ð,±fwùV;Íx\92\1f\1aDLZÝ\ 3×Ërp¬Fõ\8c\93X\b°2Ú\ f\9c+\97\v0h}V\f"\9f£e\8d\8b\8bÒìAVõÂÉôb¥Gè\8cdÒ2\8e0FÄ%\11\91¾¼Võ®-Û\ 1¿"LÅ\1e\7fBܹ\96\15"\96tT°©L\11ñI~SwI
+GÁ<?8á¶kú¢\9bE   T\ 5Z\eÜ\8f\ 1\ 3²I@*\88 
+}<\8f,§qàè%°v:\1f\9c¯¾jËUe²c¾mêjuìÜâóv\86B¹8á<!\8c\89÷;\8f\ 4\95\90ú\f
+S\r1¶yûõ8\8a\88\ e(\8c'0qËM}© æå&_\9d8J\91\12X\f©g?\9e,\8e\8cp\91\ 1Ô\f8fV÷ºYõ[]uí\10z¯º\154P¼\7f\16ÓF\ 5/DJ\1eÈ\94\92T\9ejTNT\92Áj²uø9ô4ã\1cRg\9a{pçzzÒC,æ\84C\9b¢\8aA¶«!s¾iº\1a?×ú°Q¦Ü"\b\95d1Ä\14D¥ì "NR\94ÐYR]\8eãèï<IÔ1è>ßî\13\846<¸&ÞE\99\1f\15èIÒ<&\14Ì/Fzôw\9e\18|\16\9båÔ·þæ\eøú\8cló®\98©pm¾©Ð.µùÿõ¿\1fûÐT§\92\10g\92$ÀõRI\98ø;\9b\ 4¯c\06ú¹/\eOßÎ\88q\8cR1\\aû½î\99Â}\96en\10Üë®o*°LUøÇLÅa¾éõñ\98rSMÄî\bîô*ï`p»\80߬\89]\96\1að
+\83©©<Âr9)Ã=Õ²:¨Ô]S\17ºÅÝ\1aí\16z£;=ciHFbÃL\8füt\960\ 5°Lp¶\98lôíúâ\13\19½Nò¤b\18\9d\87ÃÜbÐíÚ}Ë7\e\9f¤|ñ\8a\8d»©Ý¼WÇù87Õm¨ï8Ó'\f§¾àwS&Óÿy \9f\9d^,K        ¥ò;\8c/\ eu!âËͯ\89¿³\1dîuÞ3ÁÞèp\97\8e\16M¹ëʺ:ß×îê\9f\862\14\11\85P¡ï\1f+´¥k¤°¨\8b¼3ÝmäX¾f¹lê­Ó±X\8dÈb\85ÎýàäO}\87!ÖºÑNVÔý\ 6\97²E\85¶Þâþ$@Þ¶uQF\86\8a\81»C\8fx8sà9ÅÛÆHþ^\978\ f\8c<oP\8cw\8d³£áÓ«\13\97ÕÎ\82\84¥\19,f«î»AÖ\96\v\8d\8e*\8c\b\85\1dzAç\98:\ f*ÇíníZt@ïî\95mmj\96\9c8Tºw\9cï¼°ñ`}ÝTuõ\8fnêã\8b»Z@\82\fH(\0.ÍY¹zËñ\17\ 5´µ×]ç­w\86\9bOZã­¥·»îÕ\va*뽺UᲯ
+[\89V\@\1d\91Ã\ 6Ä\a\1a\8cª7\9f©£\8a\7f¥*b\9e\ 3\1f&\ 3¿ß|º¿Æ\97éç/s·\10\92Á\ 3ÊænúÄ\8dá\87³dþÑrö)z\8cð__kÃþendstream
+endobj
+6320 0 obj <<
+/Type /Page
+/Contents 6321 0 R
+/Resources 6319 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6322 0 obj <<
+/D [6320 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6323 0 obj <<
+/D [6320 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1698 0 obj <<
+/D [6320 0 R /XYZ 204.668 755.597 null]
+>> endobj
+6324 0 obj <<
+/D [6320 0 R /XYZ 71.731 745.018 null]
+>> endobj
+6325 0 obj <<
+/D [6320 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1702 0 obj <<
+/D [6320 0 R /XYZ 162.317 719.301 null]
+>> endobj
+6326 0 obj <<
+/D [6320 0 R /XYZ 209.215 703.48 null]
+>> endobj
+6327 0 obj <<
+/D [6320 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1706 0 obj <<
+/D [6320 0 R /XYZ 174.677 678.142 null]
+>> endobj
+6328 0 obj <<
+/D [6320 0 R /XYZ 71.731 673.187 null]
+>> endobj
+6329 0 obj <<
+/D [6320 0 R /XYZ 71.731 670.796 null]
+>> endobj
+6330 0 obj <<
+/D [6320 0 R /XYZ 136.77 661.642 null]
+>> endobj
+6331 0 obj <<
+/D [6320 0 R /XYZ 205.641 661.642 null]
+>> endobj
+6332 0 obj <<
+/D [6320 0 R /XYZ 308.948 661.642 null]
+>> endobj
+6333 0 obj <<
+/D [6320 0 R /XYZ 339.079 661.642 null]
+>> endobj
+6334 0 obj <<
+/D [6320 0 R /XYZ 399.342 661.642 null]
+>> endobj
+6335 0 obj <<
+/D [6320 0 R /XYZ 434.064 661.642 null]
+>> endobj
+6336 0 obj <<
+/D [6320 0 R /XYZ 119.552 652.315 null]
+>> endobj
+6337 0 obj <<
+/D [6320 0 R /XYZ 162.833 652.315 null]
+>> endobj
+6338 0 obj <<
+/D [6320 0 R /XYZ 180.051 652.315 null]
+>> endobj
+6339 0 obj <<
+/D [6320 0 R /XYZ 71.731 638.534 null]
+>> endobj
+1710 0 obj <<
+/D [6320 0 R /XYZ 187.959 613.196 null]
+>> endobj
+6340 0 obj <<
+/D [6320 0 R /XYZ 71.731 610.631 null]
+>> endobj
+6341 0 obj <<
+/D [6320 0 R /XYZ 71.731 605.849 null]
+>> endobj
+6342 0 obj <<
+/D [6320 0 R /XYZ 71.731 605.849 null]
+>> endobj
+6343 0 obj <<
+/D [6320 0 R /XYZ 71.731 593.898 null]
+>> endobj
+6344 0 obj <<
+/D [6320 0 R /XYZ 139.477 580.85 null]
+>> endobj
+6345 0 obj <<
+/D [6320 0 R /XYZ 71.731 577.953 null]
+>> endobj
+6346 0 obj <<
+/D [6320 0 R /XYZ 71.731 577.953 null]
+>> endobj
+6347 0 obj <<
+/D [6320 0 R /XYZ 71.731 566.86 null]
+>> endobj
+6348 0 obj <<
+/D [6320 0 R /XYZ 139.477 552.457 null]
+>> endobj
+6349 0 obj <<
+/D [6320 0 R /XYZ 71.731 549.559 null]
+>> endobj
+6350 0 obj <<
+/D [6320 0 R /XYZ 71.731 549.559 null]
+>> endobj
+6351 0 obj <<
+/D [6320 0 R /XYZ 71.731 538.466 null]
+>> endobj
+6352 0 obj <<
+/D [6320 0 R /XYZ 139.477 524.063 null]
+>> endobj
+6353 0 obj <<
+/D [6320 0 R /XYZ 71.731 523.119 null]
+>> endobj
+6354 0 obj <<
+/D [6320 0 R /XYZ 71.731 523.119 null]
+>> endobj
+6355 0 obj <<
+/D [6320 0 R /XYZ 71.731 508.718 null]
+>> endobj
+6356 0 obj <<
+/D [6320 0 R /XYZ 139.477 495.669 null]
+>> endobj
+6357 0 obj <<
+/D [6320 0 R /XYZ 71.731 491.942 null]
+>> endobj
+1714 0 obj <<
+/D [6320 0 R /XYZ 202.018 468.671 null]
+>> endobj
+6358 0 obj <<
+/D [6320 0 R /XYZ 71.731 466.136 null]
+>> endobj
+3284 0 obj <<
+/D [6320 0 R /XYZ 71.731 437.056 null]
+>> endobj
+6359 0 obj <<
+/D [6320 0 R /XYZ 71.731 424.145 null]
+>> endobj
+1718 0 obj <<
+/D [6320 0 R /XYZ 189.037 401.765 null]
+>> endobj
+6360 0 obj <<
+/D [6320 0 R /XYZ 71.731 391.186 null]
+>> endobj
+6361 0 obj <<
+/D [6320 0 R /XYZ 71.731 391.186 null]
+>> endobj
+1722 0 obj <<
+/D [6320 0 R /XYZ 162.317 365.469 null]
+>> endobj
+6362 0 obj <<
+/D [6320 0 R /XYZ 191.283 349.648 null]
+>> endobj
+6363 0 obj <<
+/D [6320 0 R /XYZ 71.731 347.581 null]
+>> endobj
+1726 0 obj <<
+/D [6320 0 R /XYZ 174.677 324.31 null]
+>> endobj
+6364 0 obj <<
+/D [6320 0 R /XYZ 71.731 319.355 null]
+>> endobj
+6365 0 obj <<
+/D [6320 0 R /XYZ 71.731 316.964 null]
+>> endobj
+6366 0 obj <<
+/D [6320 0 R /XYZ 136.77 307.81 null]
+>> endobj
+6367 0 obj <<
+/D [6320 0 R /XYZ 192.728 307.81 null]
+>> endobj
+6368 0 obj <<
+/D [6320 0 R /XYZ 296.035 307.81 null]
+>> endobj
+6369 0 obj <<
+/D [6320 0 R /XYZ 71.731 294.029 null]
+>> endobj
+1730 0 obj <<
+/D [6320 0 R /XYZ 187.959 268.691 null]
+>> endobj
+6370 0 obj <<
+/D [6320 0 R /XYZ 71.731 266.126 null]
+>> endobj
+6371 0 obj <<
+/D [6320 0 R /XYZ 71.731 261.344 null]
+>> endobj
+6372 0 obj <<
+/D [6320 0 R /XYZ 71.731 261.344 null]
+>> endobj
+6373 0 obj <<
+/D [6320 0 R /XYZ 71.731 249.393 null]
+>> endobj
+6374 0 obj <<
+/D [6320 0 R /XYZ 139.477 236.345 null]
+>> endobj
+6375 0 obj <<
+/D [6320 0 R /XYZ 71.731 232.617 null]
+>> endobj
+1734 0 obj <<
+/D [6320 0 R /XYZ 192.609 209.346 null]
+>> endobj
+6376 0 obj <<
+/D [6320 0 R /XYZ 71.731 204.391 null]
+>> endobj
+6377 0 obj <<
+/D [6320 0 R /XYZ 71.731 166.326 null]
+>> endobj
+1738 0 obj <<
+/D [6320 0 R /XYZ 202.018 141.102 null]
+>> endobj
+6378 0 obj <<
+/D [6320 0 R /XYZ 71.731 138.568 null]
+>> endobj
+3285 0 obj <<
+/D [6320 0 R /XYZ 71.731 109.488 null]
+>> endobj
+6319 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6381 0 obj <<
+/Length 976       
+/Filter /FlateDecode
+>>
+stream
+xÚ½WKoÛ8\10¾çWèh\17+V|\89$zʦÝÅ.\16)\90\1a\16\81\8e\80\98r%*}üú\8eDR\ f[\8e\93Â]ø`I\9cç73ß\808Jà\87#\81\91 8\92      ARÈh¹½H¢\r\9cüy\81½DìEâ\81Ìï\8b\8b×\7fP\12)¤R\1a\11\91\121\96\82\9d\14±\94G\8bÕ\7f³«ûlgu9\8f\89\903\8cÜÿ?¹©¿¾¾YÌq\92Ìbx\9bãYýÕ\9d]]^»\87·eþ\18\14?&<\ 118\83'<ÿ´øûâÝ¢\v\8e\13\8c \8e§Â÷"\aá\13\12a\81\bæMü>GÁ9âJ´á/3ó¹Öµ¾ÕfUÝæ&··\em\9a\0\9c.C\14\12\ 6]&\90\88¦\88¨´Õ½Î¶ÚI²\ 1HI\14cÞÊ\9e´/z-L\19""\ 5íFë#!Â\ 1SÕwÕ·Êê­{ÍÍJïÀ\94n\10µî[YÔ67Ú½Ø"\bæ6Ï\1eòïþ{ãÞ[´\99Õ}\82\18\82\13\87\10\11¥²\räÃ7S쪼êÒ\14\b\v\16ÒL\91ë\81ÜX'À\93\85\84\9e\82ahU)\94$$ \0MQÙ²^B¢)4\923âLøO¯¼_<ð\9bPD\13ám|n\13\ 3ÝÂÉÀ\ f~3\85\ba\18%LAÑ\15ÂXµÂ\97å¦Þjc«Îó¨ò\ 2:\8c\8d=\ f;\19¬ ÎIÄU\ 2¡\88©V&H¤
+\9e\ 6Gûÿ]×cB ë\9böïí¹¶\1f\16#\88@\13\a\99&¸]\ 15\vÃ\17zÆÞO4K\v?Lo9Ù3à?U\fþS¤\94\ 3èFÛº4 .Åìß¹`³ì¡Ö\87\rïÆ\84BQZ\16É\8c)|?¯³ü\ 1õκé\8dÃ\br(^ÊÆ}µ,\8cÑK{«W\e}\8eé=i}\b0\91`U\1eÌ®×ò\986ªíÓ\9d¶_´6\1eó/\0n\11ä·ÛÚäËÌæ\85      \95°0Ǻ\9a\9cWïö\97Îëaæ£qeP~yb\Aó\ 5ã:ég4®¿9[?Ã\f\ 2¥8\98\ 1Ê\9c¦\86¦üiç\vΡm\ 4\8c\8e¤Q¬`ÜÜ\ 4½Üý\88Û\80³§ÝSðDO2\13&ÀH@4-3\91ç\12\13\1dc<EL´\85:=\e1\rì\1d%¦ s\94\98ú¦\18\91\ f¦Hø\89í\8b:\95\1c\ 5÷\É\rì\1dM.È\1cO®#Û\8e\7fs³«=m\14@\ fë}zº/ê\87\95\11ëèUçæ\ 4rx¿!'¡K\194\90<\1ft½½ãÐy\99\97@\aixìĬ8\vpO,<ù3\vÏ\ráµÞ\0Í?z×\8f­\8a¯ýº(·\95Ë »+êÁV\f¡\15;]¶Kâô\9a¤c:_åÕ¹7%~\8e\87QuÁ2Å\aÛ²WÜ/Öº,¶¡D0\ eÝ\924\9bg,Iïí\97.ÉÉ\9c\87vÝæÁÿó¢ì¶Çp ý\1d\88\12ñäM°\17     \17A\81\9a[ÓzÏFãêýÕ»\9bK\7fùûëÃÂ=P\8e\13âb\1cÞ"\19\95\88w`prä¶w\18á\ f
+ð·Íendstream
+endobj
+6380 0 obj <<
+/Type /Page
+/Contents 6381 0 R
+/Resources 6379 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6382 0 obj <<
+/D [6380 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6383 0 obj <<
+/D [6380 0 R /XYZ 71.731 814.833 null]
+>> endobj
+6384 0 obj <<
+/D [6380 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1742 0 obj <<
+/D [6380 0 R /XYZ 289.764 755.597 null]
+>> endobj
+6385 0 obj <<
+/D [6380 0 R /XYZ 71.731 745.018 null]
+>> endobj
+6386 0 obj <<
+/D [6380 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1746 0 obj <<
+/D [6380 0 R /XYZ 162.317 719.301 null]
+>> endobj
+6387 0 obj <<
+/D [6380 0 R /XYZ 251.059 703.48 null]
+>> endobj
+6388 0 obj <<
+/D [6380 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1750 0 obj <<
+/D [6380 0 R /XYZ 174.677 678.142 null]
+>> endobj
+6389 0 obj <<
+/D [6380 0 R /XYZ 71.731 673.187 null]
+>> endobj
+6390 0 obj <<
+/D [6380 0 R /XYZ 71.731 670.796 null]
+>> endobj
+6391 0 obj <<
+/D [6380 0 R /XYZ 136.77 661.642 null]
+>> endobj
+6392 0 obj <<
+/D [6380 0 R /XYZ 235.772 661.642 null]
+>> endobj
+6393 0 obj <<
+/D [6380 0 R /XYZ 339.079 661.642 null]
+>> endobj
+6394 0 obj <<
+/D [6380 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1754 0 obj <<
+/D [6380 0 R /XYZ 187.959 622.523 null]
+>> endobj
+6395 0 obj <<
+/D [6380 0 R /XYZ 71.731 619.958 null]
+>> endobj
+6396 0 obj <<
+/D [6380 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6397 0 obj <<
+/D [6380 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6398 0 obj <<
+/D [6380 0 R /XYZ 71.731 603.225 null]
+>> endobj
+6399 0 obj <<
+/D [6380 0 R /XYZ 139.477 590.177 null]
+>> endobj
+6400 0 obj <<
+/D [6380 0 R /XYZ 71.731 586.449 null]
+>> endobj
+1758 0 obj <<
+/D [6380 0 R /XYZ 202.018 563.178 null]
+>> endobj
+6401 0 obj <<
+/D [6380 0 R /XYZ 71.731 560.644 null]
+>> endobj
+3286 0 obj <<
+/D [6380 0 R /XYZ 71.731 531.564 null]
+>> endobj
+6402 0 obj <<
+/D [6380 0 R /XYZ 71.731 518.652 null]
+>> endobj
+1762 0 obj <<
+/D [6380 0 R /XYZ 287.56 496.272 null]
+>> endobj
+6403 0 obj <<
+/D [6380 0 R /XYZ 71.731 485.693 null]
+>> endobj
+6404 0 obj <<
+/D [6380 0 R /XYZ 71.731 485.693 null]
+>> endobj
+1766 0 obj <<
+/D [6380 0 R /XYZ 162.317 459.976 null]
+>> endobj
+6405 0 obj <<
+/D [6380 0 R /XYZ 245.081 444.156 null]
+>> endobj
+6406 0 obj <<
+/D [6380 0 R /XYZ 71.731 442.088 null]
+>> endobj
+1770 0 obj <<
+/D [6380 0 R /XYZ 174.677 418.818 null]
+>> endobj
+6407 0 obj <<
+/D [6380 0 R /XYZ 71.731 413.862 null]
+>> endobj
+6408 0 obj <<
+/D [6380 0 R /XYZ 71.731 411.471 null]
+>> endobj
+6409 0 obj <<
+/D [6380 0 R /XYZ 136.77 402.318 null]
+>> endobj
+6410 0 obj <<
+/D [6380 0 R /XYZ 231.468 402.318 null]
+>> endobj
+6411 0 obj <<
+/D [6380 0 R /XYZ 334.775 402.318 null]
+>> endobj
+6412 0 obj <<
+/D [6380 0 R /XYZ 364.906 402.318 null]
+>> endobj
+6413 0 obj <<
+/D [6380 0 R /XYZ 463.909 402.318 null]
+>> endobj
+6414 0 obj <<
+/D [6380 0 R /XYZ 119.552 392.991 null]
+>> endobj
+6415 0 obj <<
+/D [6380 0 R /XYZ 218.554 392.991 null]
+>> endobj
+6416 0 obj <<
+/D [6380 0 R /XYZ 71.731 379.209 null]
+>> endobj
+1774 0 obj <<
+/D [6380 0 R /XYZ 187.959 353.871 null]
+>> endobj
+6417 0 obj <<
+/D [6380 0 R /XYZ 71.731 351.307 null]
+>> endobj
+6418 0 obj <<
+/D [6380 0 R /XYZ 71.731 346.525 null]
+>> endobj
+6419 0 obj <<
+/D [6380 0 R /XYZ 71.731 346.525 null]
+>> endobj
+6420 0 obj <<
+/D [6380 0 R /XYZ 71.731 334.574 null]
+>> endobj
+6421 0 obj <<
+/D [6380 0 R /XYZ 139.477 321.526 null]
+>> endobj
+6422 0 obj <<
+/D [6380 0 R /XYZ 71.731 318.628 null]
+>> endobj
+6423 0 obj <<
+/D [6380 0 R /XYZ 71.731 318.628 null]
+>> endobj
+6424 0 obj <<
+/D [6380 0 R /XYZ 71.731 307.535 null]
+>> endobj
+6425 0 obj <<
+/D [6380 0 R /XYZ 139.477 293.132 null]
+>> endobj
+6426 0 obj <<
+/D [6380 0 R /XYZ 71.731 290.235 null]
+>> endobj
+6427 0 obj <<
+/D [6380 0 R /XYZ 71.731 290.235 null]
+>> endobj
+6428 0 obj <<
+/D [6380 0 R /XYZ 71.731 279.142 null]
+>> endobj
+6429 0 obj <<
+/D [6380 0 R /XYZ 139.477 264.738 null]
+>> endobj
+6430 0 obj <<
+/D [6380 0 R /XYZ 71.731 261.011 null]
+>> endobj
+1778 0 obj <<
+/D [6380 0 R /XYZ 202.018 237.74 null]
+>> endobj
+6431 0 obj <<
+/D [6380 0 R /XYZ 71.731 235.205 null]
+>> endobj
+3287 0 obj <<
+/D [6380 0 R /XYZ 71.731 206.125 null]
+>> endobj
+6432 0 obj <<
+/D [6380 0 R /XYZ 71.731 193.214 null]
+>> endobj
+1782 0 obj <<
+/D [6380 0 R /XYZ 314.02 170.834 null]
+>> endobj
+6433 0 obj <<
+/D [6380 0 R /XYZ 71.731 160.255 null]
+>> endobj
+6434 0 obj <<
+/D [6380 0 R /XYZ 71.731 160.255 null]
+>> endobj
+1786 0 obj <<
+/D [6380 0 R /XYZ 162.317 134.538 null]
+>> endobj
+6435 0 obj <<
+/D [6380 0 R /XYZ 263.014 118.717 null]
+>> endobj
+6436 0 obj <<
+/D [6380 0 R /XYZ 71.731 116.65 null]
+>> endobj
+1790 0 obj <<
+/D [6380 0 R /XYZ 174.677 93.379 null]
+>> endobj
+6437 0 obj <<
+/D [6380 0 R /XYZ 71.731 88.424 null]
+>> endobj
+6438 0 obj <<
+/D [6380 0 R /XYZ 71.731 86.033 null]
+>> endobj
+6439 0 obj <<
+/D [6380 0 R /XYZ 136.77 76.879 null]
+>> endobj
+6440 0 obj <<
+/D [6380 0 R /XYZ 244.381 76.879 null]
+>> endobj
+6441 0 obj <<
+/D [6380 0 R /XYZ 347.688 76.879 null]
+>> endobj
+6442 0 obj <<
+/D [6380 0 R /XYZ 71.731 63.098 null]
+>> endobj
+6379 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6445 0 obj <<
+/Length 936       
+/Filter /FlateDecode
+>>
+stream
+xÚÍW]OÛ0\14}çWä1\9d¨ñg\1ckO\8cÁ´ib\12T{\19S\95\8dh\93\92\ f\ 4ÿ~×±óÑ\12Ê\98ªmê\83\9däúøÜã{n\1aâaø\11O\12$\19ñBLQ(Co¾>ÂÞ\ 2\9e|:".bìBƽ\98\ f\93£\93\vF=\85TÀ¼É­GÃ\10q\1e\0N\80x ¼IüÃ?[F\9bRç£1\95¡O\90\1d¿&iõxr5\19\11\8cý1\\8d\88_=Úgg§\97vò1O\1e\9a\857X`\b\83g0#£\9f\93/Gç\93\96\9c \ 4\ 1\8f}ô]È3ú\94z\84 %\84áO\88BBPO\8a\10aÈÃð?Í\17ÕZ§ea6=¹\10¤K\17{c"A\15V\aÞëx¡w\99µ\88\89É\105\8ad `Ö{´;¶Y\10J!\vs\1a\1d\9eMCv´\b§\88\ 2û&Æ\90ÛdIÚ\9eB\99Ù±!¼£Â\186      \14\871@J©zý\95.«<\85e¡ô¿\8f$÷£UÕ¬\95Û\8a\bĸUäR/¢\12Î\10\96qå?ÔKêéZGi1¢Â?¶×å2*í¬¦TÏ\92Â\8eU¡c;\9b=Ù±ÈÖz\96Åî*+\97u^0\8dR\179\8fÒ4s\883\87\17'Å<KS=/u\8c\fó\9a,\85¤­Bß6:\a¶YjµYFŶX5\ e\8c±\86Z]EP¹þ\93C²úID\89Õ\8fK\14\9aC\12\ 4\89\80×èÀè¾Ò\95\9eÎVÙün\9a¤«¤(»µ\1c4\vÌÚf)\v\10\0/£µS\9aÓ]¥Cú*z¿0h\b¨!¬5\8bn(\95.5X5\92þ\9d½*Vµt0\8bVð §IvkFiî»\e\80ÂZtåTô#\ 1k£çÉ\rÆ\14ÎÐH>n(Xå-{\9dÆÅ@\19B\86\8c\85uÐõS\9am\8a¤h\95\90\88HÞ(\11 Ûl\1e²$v>Å]\ 4X_\04~M«>ªâà\81V*è>E\99Ws\10&\80\8ee1¦\86øÔÝz׶\87\16\82`\86\18\96\ eã¾K³¿Ï\167ÓÛÞ\ f:\92\13hH
+êB!h)¿Û\98øöÎC\8d\89s\8c¸d\akL=¼\17\eS\13órc2\84m\ 1ÕªW¹\1eò\99ÄHÀÔú\8c\r\9d.\14è¡\8cF^Çï§Ê8¢2øC«ÉÖ@­Õ\92t\9e­ßf5G¡ßäþ©Õ¶ÄÚò\9aB\18³ÿÇk \85àÖkô­ÿ\ 1öX\8d\12¨W¦\ e\1eÞ\8bVkb\ e\9dWZ}4wÉjuÀ×\1aÙ»\ 5¼\81\87<' g¬\9ey®èrÌ5à\15å¶\ 4q¢­é\9a\e{ßo\ 3\15Ólüv\13Á\81<÷P-{¸ë¡a\95ûÀÄP"Á_öѱÅê2é¡Qs\94\r\989\86\87\98³\10ÁdÇ\97}\v¹\8f\ fÊ\91\ 2rû>Oº\90æëD"%Í&Û\18õ_¾³ó«S÷Eòùzb'L\10L-Åþ§\r\a\8e\82\10GR°\17>A\9e\ 58l^òendstream
+endobj
+6444 0 obj <<
+/Type /Page
+/Contents 6445 0 R
+/Resources 6443 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6201 0 R
+>> endobj
+6446 0 obj <<
+/D [6444 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6447 0 obj <<
+/D [6444 0 R /XYZ 71.731 814.833 null]
+>> endobj
+1794 0 obj <<
+/D [6444 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6448 0 obj <<
+/D [6444 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6449 0 obj <<
+/D [6444 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6450 0 obj <<
+/D [6444 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6451 0 obj <<
+/D [6444 0 R /XYZ 71.731 738.749 null]
+>> endobj
+6452 0 obj <<
+/D [6444 0 R /XYZ 139.477 725.701 null]
+>> endobj
+1798 0 obj <<
+/D [6444 0 R /XYZ 202.018 698.702 null]
+>> endobj
+6453 0 obj <<
+/D [6444 0 R /XYZ 71.731 696.167 null]
+>> endobj
+3288 0 obj <<
+/D [6444 0 R /XYZ 71.731 654.136 null]
+>> endobj
+6454 0 obj <<
+/D [6444 0 R /XYZ 71.731 641.224 null]
+>> endobj
+1802 0 obj <<
+/D [6444 0 R /XYZ 270.654 618.844 null]
+>> endobj
+6455 0 obj <<
+/D [6444 0 R /XYZ 71.731 608.266 null]
+>> endobj
+6456 0 obj <<
+/D [6444 0 R /XYZ 71.731 608.266 null]
+>> endobj
+1806 0 obj <<
+/D [6444 0 R /XYZ 162.317 582.548 null]
+>> endobj
+6457 0 obj <<
+/D [6444 0 R /XYZ 245.081 566.728 null]
+>> endobj
+6458 0 obj <<
+/D [6444 0 R /XYZ 71.731 553.662 null]
+>> endobj
+1810 0 obj <<
+/D [6444 0 R /XYZ 174.677 528.438 null]
+>> endobj
+6459 0 obj <<
+/D [6444 0 R /XYZ 71.731 523.483 null]
+>> endobj
+6460 0 obj <<
+/D [6444 0 R /XYZ 71.731 521.092 null]
+>> endobj
+6461 0 obj <<
+/D [6444 0 R /XYZ 141.074 511.938 null]
+>> endobj
+6462 0 obj <<
+/D [6444 0 R /XYZ 235.772 511.938 null]
+>> endobj
+6463 0 obj <<
+/D [6444 0 R /XYZ 339.079 511.938 null]
+>> endobj
+6464 0 obj <<
+/D [6444 0 R /XYZ 71.731 498.157 null]
+>> endobj
+1814 0 obj <<
+/D [6444 0 R /XYZ 187.959 472.819 null]
+>> endobj
+6465 0 obj <<
+/D [6444 0 R /XYZ 71.731 470.255 null]
+>> endobj
+6466 0 obj <<
+/D [6444 0 R /XYZ 71.731 465.473 null]
+>> endobj
+6467 0 obj <<
+/D [6444 0 R /XYZ 71.731 465.473 null]
+>> endobj
+6468 0 obj <<
+/D [6444 0 R /XYZ 71.731 453.521 null]
+>> endobj
+6469 0 obj <<
+/D [6444 0 R /XYZ 139.477 440.473 null]
+>> endobj
+3289 0 obj <<
+/D [6444 0 R /XYZ 71.731 424.201 null]
+>> endobj
+6470 0 obj <<
+/D [6444 0 R /XYZ 71.731 411.29 null]
+>> endobj
+1818 0 obj <<
+/D [6444 0 R /XYZ 282.137 388.91 null]
+>> endobj
+6471 0 obj <<
+/D [6444 0 R /XYZ 71.731 378.331 null]
+>> endobj
+6472 0 obj <<
+/D [6444 0 R /XYZ 71.731 378.331 null]
+>> endobj
+1822 0 obj <<
+/D [6444 0 R /XYZ 162.317 352.614 null]
+>> endobj
+6473 0 obj <<
+/D [6444 0 R /XYZ 251.059 336.793 null]
+>> endobj
+6474 0 obj <<
+/D [6444 0 R /XYZ 71.731 323.727 null]
+>> endobj
+1826 0 obj <<
+/D [6444 0 R /XYZ 174.677 298.504 null]
+>> endobj
+6475 0 obj <<
+/D [6444 0 R /XYZ 71.731 293.548 null]
+>> endobj
+6476 0 obj <<
+/D [6444 0 R /XYZ 71.731 291.157 null]
+>> endobj
+6477 0 obj <<
+/D [6444 0 R /XYZ 141.074 282.004 null]
+>> endobj
+6478 0 obj <<
+/D [6444 0 R /XYZ 240.077 282.004 null]
+>> endobj
+6479 0 obj <<
+/D [6444 0 R /XYZ 343.384 282.004 null]
+>> endobj
+6480 0 obj <<
+/D [6444 0 R /XYZ 71.731 268.222 null]
+>> endobj
+1830 0 obj <<
+/D [6444 0 R /XYZ 187.959 242.884 null]
+>> endobj
+6481 0 obj <<
+/D [6444 0 R /XYZ 71.731 240.32 null]
+>> endobj
+6482 0 obj <<
+/D [6444 0 R /XYZ 71.731 235.538 null]
+>> endobj
+6483 0 obj <<
+/D [6444 0 R /XYZ 71.731 235.538 null]
+>> endobj
+6484 0 obj <<
+/D [6444 0 R /XYZ 71.731 223.587 null]
+>> endobj
+6485 0 obj <<
+/D [6444 0 R /XYZ 139.477 210.539 null]
+>> endobj
+3290 0 obj <<
+/D [6444 0 R /XYZ 71.731 194.267 null]
+>> endobj
+6486 0 obj <<
+/D [6444 0 R /XYZ 71.731 181.355 null]
+>> endobj
+1834 0 obj <<
+/D [6444 0 R /XYZ 302.21 158.975 null]
+>> endobj
+6487 0 obj <<
+/D [6444 0 R /XYZ 71.731 148.396 null]
+>> endobj
+6488 0 obj <<
+/D [6444 0 R /XYZ 71.731 148.396 null]
+>> endobj
+1838 0 obj <<
+/D [6444 0 R /XYZ 162.317 122.679 null]
+>> endobj
+6489 0 obj <<
+/D [6444 0 R /XYZ 268.991 106.858 null]
+>> endobj
+6490 0 obj <<
+/D [6444 0 R /XYZ 71.731 104.791 null]
+>> endobj
+1842 0 obj <<
+/D [6444 0 R /XYZ 174.677 81.52 null]
+>> endobj
+6491 0 obj <<
+/D [6444 0 R /XYZ 71.731 76.565 null]
+>> endobj
+6492 0 obj <<
+/D [6444 0 R /XYZ 71.731 74.174 null]
+>> endobj
+6493 0 obj <<
+/D [6444 0 R /XYZ 136.77 65.02 null]
+>> endobj
+6494 0 obj <<
+/D [6444 0 R /XYZ 248.686 65.02 null]
+>> endobj
+6495 0 obj <<
+/D [6444 0 R /XYZ 351.993 65.02 null]
+>> endobj
+6496 0 obj <<
+/D [6444 0 R /XYZ 382.124 65.02 null]
+>> endobj
+6497 0 obj <<
+/D [6444 0 R /XYZ 399.342 65.02 null]
+>> endobj
+6498 0 obj <<
+/D [6444 0 R /XYZ 71.731 51.239 null]
+>> endobj
+6443 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6501 0 obj <<
+/Length 1063      
+/Filter /FlateDecode
+>>
+stream
+xÚåW[oÛ6\14~ϯУ\Ä\fI\91¢\84=¥i3t\18R 5ö²\f\86b1±6]\]ºf¿~G:¤D9v³\rn÷P\ 4\88hñð;ß¹ð\13É<
+\7fÌS\8c¨\80y\11å$R\91·)Ψ÷\b3?\9e1c±4&KÇæõêìâ:à^Lâ0ðV\ f\1e\8f""D\b8!\11¡ôVé¯þÕ6Ùµº^,¹\8a|FðùsVv\9f/nW\vF©¿\84_\væw\9fqîêò\ 6\aoêì\93]xG%\ 53\98\83\11[ü¶úéìíj$'9#ÀãKô\8dÉ3ú\9c{\8c\91\9e?c1\91\92{JF\84B\1c=ÿËú±+tÙ6½Ó\8bkɦp©·d
\12\f\86\1fu\996ûÌFD.\89¢ì\105NT\18ÃÈ\99Ú\7f\8eQ0Î!\8a¾\1a\13\1e\86¡&ZLpÂ\81½µéÉíª¬\1c«ÐVø\1c\b\ f£¦­»MÛÕúy\90Kp\19Æ\ 2|\aDE|@k`åºÖM{,Ü0V$ êdá:xGõ6H0×\9bö\1c\83ûs«Û­\8d=Ék\9d¤Oö\aô]^m\92V§&\11yÕÚ\9cl«.7¯ï5>wuµÑMc­ï\rÎõ»ë÷8ªº\16 wð\1f1²Ô¤tÖgcNyHâ8\1e(ßjÈ\7f      Ë"åÿ²P\ 2Èuv­\9a÷\9c$\81ÀBÜTåò/]C=\ 3)ýOÃ\12\18
+¿ÐIÙ,¸ôÏqªÝ&-\8eʪE\93$Ïñ\8dN\1fu\83Ã\r\86Ü\ fï\rRV\14:Í Cù\13N¤Y³©Ê\12ò«S\83\8e\17 <°ä\10-²<ÔgÃÏB\17U=äPù5\94,iÌÄ6iæ­j\v\90ê<\ 1Ñð\9fÀ÷\98WE8ü
+E¢¾_$#2Äm¹IÊ\8f\9dîôºg±þ#Ëó5\14)Ï°y\11@@BÃ\1eÀ®\ fBÂcÜÿ7IaÊ ø~\19zÛ/ù\80V\18ݸ\1d\vò¢\10@úÅw\9c+\93\9d)Qµ\ 6À¦\9d'!Í´ûBa       û\17Y¹©\8a¬|4ûz(è\81¶³\8e\97 \fA\10\rî?<\95Õ®É\9a1FE\98\12\90 \8a\83z\18\93Á\90øÈ\84ñR\9e]d\ 6¸ÀÌÄ\ fÒ\8e}±X\86ð9@ \841¯^\8d²4AÐ`Øít®½s? ùÒõÃ~8¸\19!+<TPõ\98\80\80ýSÕ\17/«¾\80<Óàtªïà\1d\95AkóïUÿû\94\7fJ\948°uî(åy»\86\0~\a"YU~-\9dzȬ\eÐ)×\93ÛU*$tÜãFªÂ\bªPÀG®¯   ì\1c\7f\0)\11b\98®\1eðéè\12\98\99\13\18¤®\87­Óo(tã\96df²×\9dô\e\94\1e'73\15ã \17pøû62fý\9c\9e«\81ìq71%Al\11\ 3Ѹ\99\95\81\8a\88\8aùWÐJ\ 6\88\11\15'ÓJ\aï¨VZ\9bS\9e\90Ù,Ç\a#\85|\8aÓ}\14&¸ãq¢Éó0·Ú^¯p¯Íc\ 5Ypçóýc¯\11\81t\8eÑØÉI\13^ú¼Dÿåó\82Ç»\9b®¸·¼\aÕ9p\1a\82\81È-\87¹ÐrAâÃ7\95ñÊ;\99Ø\e¯"±ê¹Ì1z>ï¯ÞÞ^\9a[î»\ f+\1c\ 4\92Q\8e\91¸×e\11DD2fö\9c\14G®µÏ\19þ\r\86\91ö\84endstream
+endobj
+6500 0 obj <<
+/Type /Page
+/Contents 6501 0 R
+/Resources 6499 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6502 0 obj <<
+/D [6500 0 R /XYZ 71.731 802.878 null]
+>> endobj
+1846 0 obj <<
+/D [6500 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6503 0 obj <<
+/D [6500 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6504 0 obj <<
+/D [6500 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6505 0 obj <<
+/D [6500 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6506 0 obj <<
+/D [6500 0 R /XYZ 71.731 738.749 null]
+>> endobj
+6507 0 obj <<
+/D [6500 0 R /XYZ 139.477 725.701 null]
+>> endobj
+6508 0 obj <<
+/D [6500 0 R /XYZ 71.731 710.754 null]
+>> endobj
+6509 0 obj <<
+/D [6500 0 R /XYZ 139.477 697.307 null]
+>> endobj
+6510 0 obj <<
+/D [6500 0 R /XYZ 71.731 693.579 null]
+>> endobj
+1850 0 obj <<
+/D [6500 0 R /XYZ 202.018 670.308 null]
+>> endobj
+6511 0 obj <<
+/D [6500 0 R /XYZ 71.731 667.774 null]
+>> endobj
+3291 0 obj <<
+/D [6500 0 R /XYZ 71.731 625.742 null]
+>> endobj
+6512 0 obj <<
+/D [6500 0 R /XYZ 71.731 612.831 null]
+>> endobj
+1854 0 obj <<
+/D [6500 0 R /XYZ 313.692 590.451 null]
+>> endobj
+6513 0 obj <<
+/D [6500 0 R /XYZ 71.731 579.872 null]
+>> endobj
+6514 0 obj <<
+/D [6500 0 R /XYZ 71.731 579.872 null]
+>> endobj
+1858 0 obj <<
+/D [6500 0 R /XYZ 162.317 554.155 null]
+>> endobj
+6515 0 obj <<
+/D [6500 0 R /XYZ 274.969 538.334 null]
+>> endobj
+6516 0 obj <<
+/D [6500 0 R /XYZ 71.731 536.267 null]
+>> endobj
+1862 0 obj <<
+/D [6500 0 R /XYZ 174.677 512.996 null]
+>> endobj
+6517 0 obj <<
+/D [6500 0 R /XYZ 71.731 508.041 null]
+>> endobj
+6518 0 obj <<
+/D [6500 0 R /XYZ 71.731 505.65 null]
+>> endobj
+6519 0 obj <<
+/D [6500 0 R /XYZ 136.77 496.496 null]
+>> endobj
+6520 0 obj <<
+/D [6500 0 R /XYZ 252.99 496.496 null]
+>> endobj
+6521 0 obj <<
+/D [6500 0 R /XYZ 356.297 496.496 null]
+>> endobj
+6522 0 obj <<
+/D [6500 0 R /XYZ 71.731 482.715 null]
+>> endobj
+1866 0 obj <<
+/D [6500 0 R /XYZ 187.959 457.377 null]
+>> endobj
+6523 0 obj <<
+/D [6500 0 R /XYZ 71.731 454.813 null]
+>> endobj
+6524 0 obj <<
+/D [6500 0 R /XYZ 71.731 450.03 null]
+>> endobj
+6525 0 obj <<
+/D [6500 0 R /XYZ 71.731 450.03 null]
+>> endobj
+6526 0 obj <<
+/D [6500 0 R /XYZ 71.731 438.079 null]
+>> endobj
+6527 0 obj <<
+/D [6500 0 R /XYZ 139.477 425.031 null]
+>> endobj
+6528 0 obj <<
+/D [6500 0 R /XYZ 71.731 421.303 null]
+>> endobj
+1870 0 obj <<
+/D [6500 0 R /XYZ 202.018 398.032 null]
+>> endobj
+6529 0 obj <<
+/D [6500 0 R /XYZ 71.731 395.498 null]
+>> endobj
+3292 0 obj <<
+/D [6500 0 R /XYZ 71.731 353.467 null]
+>> endobj
+6530 0 obj <<
+/D [6500 0 R /XYZ 71.731 340.555 null]
+>> endobj
+1874 0 obj <<
+/D [6500 0 R /XYZ 346.212 318.175 null]
+>> endobj
+6531 0 obj <<
+/D [6500 0 R /XYZ 71.731 307.596 null]
+>> endobj
+6532 0 obj <<
+/D [6500 0 R /XYZ 71.731 307.596 null]
+>> endobj
+1878 0 obj <<
+/D [6500 0 R /XYZ 162.317 281.879 null]
+>> endobj
+6533 0 obj <<
+/D [6500 0 R /XYZ 292.902 266.058 null]
+>> endobj
+6534 0 obj <<
+/D [6500 0 R /XYZ 71.731 252.992 null]
+>> endobj
+1882 0 obj <<
+/D [6500 0 R /XYZ 174.677 227.769 null]
+>> endobj
+6535 0 obj <<
+/D [6500 0 R /XYZ 71.731 222.814 null]
+>> endobj
+6536 0 obj <<
+/D [6500 0 R /XYZ 71.731 220.423 null]
+>> endobj
+6537 0 obj <<
+/D [6500 0 R /XYZ 136.77 211.269 null]
+>> endobj
+6538 0 obj <<
+/D [6500 0 R /XYZ 265.903 211.269 null]
+>> endobj
+6539 0 obj <<
+/D [6500 0 R /XYZ 369.21 211.269 null]
+>> endobj
+6540 0 obj <<
+/D [6500 0 R /XYZ 399.342 211.269 null]
+>> endobj
+6541 0 obj <<
+/D [6500 0 R /XYZ 481.126 211.269 null]
+>> endobj
+6542 0 obj <<
+/D [6500 0 R /XYZ 71.731 197.487 null]
+>> endobj
+1886 0 obj <<
+/D [6500 0 R /XYZ 187.959 172.15 null]
+>> endobj
+6543 0 obj <<
+/D [6500 0 R /XYZ 71.731 169.585 null]
+>> endobj
+6544 0 obj <<
+/D [6500 0 R /XYZ 71.731 164.803 null]
+>> endobj
+6545 0 obj <<
+/D [6500 0 R /XYZ 71.731 164.803 null]
+>> endobj
+6546 0 obj <<
+/D [6500 0 R /XYZ 71.731 152.852 null]
+>> endobj
+6547 0 obj <<
+/D [6500 0 R /XYZ 139.477 139.804 null]
+>> endobj
+6548 0 obj <<
+/D [6500 0 R /XYZ 71.731 136.907 null]
+>> endobj
+6549 0 obj <<
+/D [6500 0 R /XYZ 71.731 136.907 null]
+>> endobj
+6550 0 obj <<
+/D [6500 0 R /XYZ 71.731 125.813 null]
+>> endobj
+6551 0 obj <<
+/D [6500 0 R /XYZ 139.477 111.41 null]
+>> endobj
+6552 0 obj <<
+/D [6500 0 R /XYZ 71.731 107.682 null]
+>> endobj
+1890 0 obj <<
+/D [6500 0 R /XYZ 202.018 84.412 null]
+>> endobj
+6553 0 obj <<
+/D [6500 0 R /XYZ 71.731 81.877 null]
+>> endobj
+3293 0 obj <<
+/D [6500 0 R /XYZ 71.731 52.797 null]
+>> endobj
+6499 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6557 0 obj <<
+/Length 923       
+/Filter /FlateDecode
+>>
+stream
+xÚÅW[OÛ0\14~çWä±\9d\16ã»\13í\891\98v\11Ó ÚË\98PHÝ\12Ñ&%\17\ 6ÿ~DZ\93º7`\130UUN\92ãsý¾c\87\ 4\18~$P\ 4)F\82\bS\14©(Hç{8\98Â\9b\8f{Äi\84N%ôtÞ\8föö\8f\19\rb\14K\16\8c&\ 1\8d"Ĺ\ 4;\12q)\82Ñøçàð*YÔº\1c\86TE\ 3\82ìõk\967wû§£!Áx\10ÂÝ\90\f\9a;ûîðàÄ
+\1fÊì¶[x\8e\ 5\ 65x\a\12\19þ\1a}Þ;\1aõÁ J\10ÄñPøNe#|J\ 3¢\10%ÂÄïrTB \11«6ü4Éo\1aÝè\v\9d\8f«\8bs\8cYS]]dù,«j\13\86µÀ\11\83´Á\ 2W(¢à\8eIDcÙZ8IæÚjr¯T8\b\89hu7½Lf\9d\ f(KïF-\17\13\11!\12I0b\16\9fSªº*µáéÊÞ&³\99\15溪\92i÷ØXÍ\9d\98§Å<˧öN\8f\8dN\9f\14A±hË\12vþB*\10cQëõì>/\16UVõ©)D\14ïR\93Èv?Ë]ø\ 2/\15Ú\82G.ú]©wyû\96       Ø\85È\Ú\0\89ª.\9b´\1e\86\12`d\rY3îÑ\eç\9bx&0C\f+gãÆhoú\ 1¬\bß\ fy·­*\14ªB¥\82\88\90¸U>(§Í\çuÕ{^é¸\ 2|ñUÏ>\8eÁ
+\12\82\ 6\10\8aÚ\ 6d\8a\94\8cAò^­_{Ì\13J\ 1ó\ 6üK{\16ô>\968E\14ÀÛé\98à\16\ 5ô­£^]8t\98\80[ÉV½)õÖªP$c\ eW\89âØ\16åT\83²A\¤\ 6?\86\8a\ 30\e½\89jK \ 6\8dhi£§I\r\ 3Àº¼m\978ÌN\8a\86¢\ 6ÉeÑÔöy\93WM\9a\ 2Ò'\8d\83}©«fæ±´çyØÑT@£%\7f\80è`ý¹\98¾\13íÆ\aP2ÛÊtÉ\11üÿ\89é
+Je\9f\82\87\ 4\9a;g¯Eó\95â®ð\9cb  \7f%¢³G\89.)\12\8aZ¢Ó§ò\9c=ÎsÆ0\8a\ 4{6\9e{övò¼Óùÿ<g/Åó\9e£=Ï9\0\95Ø­\96 \90\91\rÒ\1e5@øn YYù\8b.s=³òÙB§\19p\8d¦öþ¸ÉÓ:+òjËP\81´\18l\93rmGÏ\8b:\9bÜ_\\83Õ\178/lZ÷[îp±><Ì¢6©Ääb\9f¥0B.\93\ 6׶âWI>\9e\80Nx\a\87J\97Õ"I]»ÌÒY¶¤ÄÚhé ú×£å¶ÈÆ\9b³ee\87Þ]\rß(ìo,æ¯|xxkmms\ 5SøAW
+IB{W ý4WËQìY\ 3|\ 1xT\1c\841´Ánò¿¯\92m£×\1fÚýDô\87\97;$S\8e\1eüTXªt_
+
+\99cõdÍ\86qõíðèôÀ}\1d|:\eY\81   \82©\8dÑÿÌàÀ3Cg\e¤\10;>\a6#ü\ 3ç\9aMAendstream
+endobj
+6556 0 obj <<
+/Type /Page
+/Contents 6557 0 R
+/Resources 6555 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6558 0 obj <<
+/D [6556 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6559 0 obj <<
+/D [6556 0 R /XYZ 71.731 814.833 null]
+>> endobj
+6560 0 obj <<
+/D [6556 0 R /XYZ 71.731 768.009 null]
+>> endobj
+1894 0 obj <<
+/D [6556 0 R /XYZ 316.223 755.597 null]
+>> endobj
+6561 0 obj <<
+/D [6556 0 R /XYZ 71.731 745.018 null]
+>> endobj
+6562 0 obj <<
+/D [6556 0 R /XYZ 71.731 745.018 null]
+>> endobj
+1898 0 obj <<
+/D [6556 0 R /XYZ 162.317 719.301 null]
+>> endobj
+6563 0 obj <<
+/D [6556 0 R /XYZ 274.969 703.48 null]
+>> endobj
+6564 0 obj <<
+/D [6556 0 R /XYZ 71.731 701.413 null]
+>> endobj
+1902 0 obj <<
+/D [6556 0 R /XYZ 174.677 678.142 null]
+>> endobj
+6565 0 obj <<
+/D [6556 0 R /XYZ 71.731 673.187 null]
+>> endobj
+6566 0 obj <<
+/D [6556 0 R /XYZ 71.731 670.796 null]
+>> endobj
+6567 0 obj <<
+/D [6556 0 R /XYZ 136.77 661.642 null]
+>> endobj
+6568 0 obj <<
+/D [6556 0 R /XYZ 252.99 661.642 null]
+>> endobj
+6569 0 obj <<
+/D [6556 0 R /XYZ 356.297 661.642 null]
+>> endobj
+6570 0 obj <<
+/D [6556 0 R /XYZ 71.731 647.861 null]
+>> endobj
+1906 0 obj <<
+/D [6556 0 R /XYZ 187.959 622.523 null]
+>> endobj
+6571 0 obj <<
+/D [6556 0 R /XYZ 71.731 619.958 null]
+>> endobj
+6572 0 obj <<
+/D [6556 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6573 0 obj <<
+/D [6556 0 R /XYZ 71.731 615.176 null]
+>> endobj
+6574 0 obj <<
+/D [6556 0 R /XYZ 71.731 603.225 null]
+>> endobj
+6575 0 obj <<
+/D [6556 0 R /XYZ 139.477 590.177 null]
+>> endobj
+6576 0 obj <<
+/D [6556 0 R /XYZ 71.731 586.449 null]
+>> endobj
+1910 0 obj <<
+/D [6556 0 R /XYZ 202.018 563.178 null]
+>> endobj
+6577 0 obj <<
+/D [6556 0 R /XYZ 71.731 560.644 null]
+>> endobj
+3294 0 obj <<
+/D [6556 0 R /XYZ 71.731 531.564 null]
+>> endobj
+6578 0 obj <<
+/D [6556 0 R /XYZ 71.731 518.652 null]
+>> endobj
+1914 0 obj <<
+/D [6556 0 R /XYZ 327.706 496.272 null]
+>> endobj
+6579 0 obj <<
+/D [6556 0 R /XYZ 71.731 485.693 null]
+>> endobj
+6580 0 obj <<
+/D [6556 0 R /XYZ 71.731 485.693 null]
+>> endobj
+1918 0 obj <<
+/D [6556 0 R /XYZ 162.317 459.976 null]
+>> endobj
+6581 0 obj <<
+/D [6556 0 R /XYZ 280.946 444.156 null]
+>> endobj
+6582 0 obj <<
+/D [6556 0 R /XYZ 71.731 442.088 null]
+>> endobj
+1922 0 obj <<
+/D [6556 0 R /XYZ 174.677 418.818 null]
+>> endobj
+6583 0 obj <<
+/D [6556 0 R /XYZ 71.731 413.862 null]
+>> endobj
+6584 0 obj <<
+/D [6556 0 R /XYZ 71.731 411.471 null]
+>> endobj
+6585 0 obj <<
+/D [6556 0 R /XYZ 136.77 402.318 null]
+>> endobj
+6586 0 obj <<
+/D [6556 0 R /XYZ 257.294 402.318 null]
+>> endobj
+6587 0 obj <<
+/D [6556 0 R /XYZ 360.601 402.318 null]
+>> endobj
+6588 0 obj <<
+/D [6556 0 R /XYZ 71.731 388.536 null]
+>> endobj
+1926 0 obj <<
+/D [6556 0 R /XYZ 187.959 363.198 null]
+>> endobj
+6589 0 obj <<
+/D [6556 0 R /XYZ 71.731 360.634 null]
+>> endobj
+6590 0 obj <<
+/D [6556 0 R /XYZ 71.731 355.852 null]
+>> endobj
+6591 0 obj <<
+/D [6556 0 R /XYZ 71.731 355.852 null]
+>> endobj
+6592 0 obj <<
+/D [6556 0 R /XYZ 71.731 343.901 null]
+>> endobj
+6593 0 obj <<
+/D [6556 0 R /XYZ 139.477 330.853 null]
+>> endobj
+6594 0 obj <<
+/D [6556 0 R /XYZ 71.731 327.125 null]
+>> endobj
+1930 0 obj <<
+/D [6556 0 R /XYZ 202.018 303.854 null]
+>> endobj
+6595 0 obj <<
+/D [6556 0 R /XYZ 71.731 301.319 null]
+>> endobj
+3295 0 obj <<
+/D [6556 0 R /XYZ 71.731 272.239 null]
+>> endobj
+1934 0 obj <<
+/D [6556 0 R /XYZ 402.351 242 null]
+>> endobj
+3296 0 obj <<
+/D [6556 0 R /XYZ 71.731 238.923 null]
+>> endobj
+6596 0 obj <<
+/D [6556 0 R /XYZ 71.731 223.142 null]
+>> endobj
+1938 0 obj <<
+/D [6556 0 R /XYZ 270.654 203.839 null]
+>> endobj
+6597 0 obj <<
+/D [6556 0 R /XYZ 71.731 193.26 null]
+>> endobj
+6598 0 obj <<
+/D [6556 0 R /XYZ 71.731 193.26 null]
+>> endobj
+1942 0 obj <<
+/D [6556 0 R /XYZ 162.317 167.543 null]
+>> endobj
+6599 0 obj <<
+/D [6556 0 R /XYZ 239.103 151.722 null]
+>> endobj
+6600 0 obj <<
+/D [6556 0 R /XYZ 71.731 149.655 null]
+>> endobj
+1946 0 obj <<
+/D [6556 0 R /XYZ 174.677 126.384 null]
+>> endobj
+6601 0 obj <<
+/D [6556 0 R /XYZ 71.731 121.429 null]
+>> endobj
+6602 0 obj <<
+/D [6556 0 R /XYZ 71.731 119.038 null]
+>> endobj
+6603 0 obj <<
+/D [6556 0 R /XYZ 141.074 109.884 null]
+>> endobj
+6604 0 obj <<
+/D [6556 0 R /XYZ 231.468 109.884 null]
+>> endobj
+6605 0 obj <<
+/D [6556 0 R /XYZ 334.775 109.884 null]
+>> endobj
+6606 0 obj <<
+/D [6556 0 R /XYZ 364.906 109.884 null]
+>> endobj
+6607 0 obj <<
+/D [6556 0 R /XYZ 463.909 109.884 null]
+>> endobj
+6608 0 obj <<
+/D [6556 0 R /XYZ 494.04 109.884 null]
+>> endobj
+6609 0 obj <<
+/D [6556 0 R /XYZ 119.552 100.557 null]
+>> endobj
+6610 0 obj <<
+/D [6556 0 R /XYZ 71.731 86.776 null]
+>> endobj
+6555 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6613 0 obj <<
+/Length 1439      
+/Filter /FlateDecode
+>>
+stream
+xÚ½XK\8fÛ6\10¾ï¯ðÑ.b.I\89¢\84\9eÒ<\8a-\8a\14H|k
+C+Ó6»²¤è±\8füúÎð!ɶ¼\9bæðÁ$5\9cùæ=\12\9bQø±\99dD\ 6l\16SNb\19ϲÃ\15\9díàÉïWÌQ,\1dÉrDóÛêêúcÀg  I¢`¶ÚÎx\1c\930\8c\80ODÂHÌV\9b¿çïöiÕªz±ä2\9e3bÿÿÔE÷xýyµ`\94Î\97°[°y÷h\9f½{ûÉ.Þ×úÞ_üJ\ 5\ 52x\ 6+¶øgõÇÕ\87U\ fNpF\0Çsð\1dÉ\19|Îg\8c\91D\bÄÏXB\84à3)bBA\ fÄÿ¶Þu\a\r
+½þ(Ø .\9d-\99\ 4«\ 4\86ð\9b*6Í)²\9e#\17DR6\ 5\8d\13\19\1a=:ýïµ`\9c\83\16è\8d\81\9fUC\ e°XÈ   \aô\9e\ 6ÁU¥.z/´¥ûß+»ÈÒ<¿M³\85\9cßÙ\83F\83C6î©ÑË\1e·u\97µ]­Îm±\ 4dQ\12\ 2Ä\80È\98;\8blvê\92E¢D\92\80ÊW³È\88ßE\8bx\1a\ 4\19­\1eö\1aUßÛ\9d.îË;µ±\9b¢lõWJy\96\82=Z]\16/)n­ý°OÛ\8bzG1IXøzz\ fü.ëíh\10Û \92ÑÇ\ 6ÂSå\z\94\ e½j<"I\92\98ëïU\93Õº\1al1\96\87       !H\10Ú\84Xax\85B\9c\89Ä3u\ f9\85Ëh®\e{´O\8bM\8e\96ÇÍF×*kó'»»}²¤\18¨ö¤ÜÚÿvo¯Góm\a>*2/"\9a«ÇLU­%ËÒF-X<\7f\ f{eà\eÄ\1côµ~Cö\ 6@\9cÌ·uy°«Q\99Â\1a\15Æ\900%dÓck\9fëÂþ\1fô£¿|(1ypuVé,\8b\ 4X\1c*̲Ü\18\85ØÃ\eϲ±ÿ`¹     \98UÙ4ú6\a PÕL6ãÿ\ 6\98õFÃ\ 3k,\9±¸¼Su¡Üqó\84u×Ä~]\16ú»s\ f>ªj}Ð-ÔßÆîµ;o:\97*\82ÓÞ¨Ä>C\7f\8fÁòÉx\8bd4¯Õ·N5-n¤Ñ\15\ fA«¶*\v4!\1eC0ØóFï\8a4Wn\a\91p\96\82\\bÂ8¦\86±\ eÔ+]ìÖº(«æ<Fã\10ZTâh\ 1X\90î\9a\9eµ\91lìfî\85£Þ¶\f\ 2H`y\12/\ 5(Ò©uÝæ<×Å:Û«ìn\8dŢج\11ȹ|\96\b\12&\91\ 3°ílÄ\82       \19å\81Í\19³\82ú\ 4lü®V[U«"óû¬ì0}ÌZ\e-\ 1\98ã<¶¾.²Z\81\9b\=\83K:?Y\82©swæLwZû\10 ë\0\8afU\97\99j\801\19
+\87$\9cÙÂ\11J\12cq\12\8c\88(8¶\15\13p\8e\18\8bÃí\10
+G\84·ýå "<±MøSzPç.±å\ 6i_\16pT\15)á"ô!À¹\1c\r%Î8\8dª\9b*Í|\7f\84\98Ï1YÍ\1c`[a¥2k\9eÓ&\89\92u\9aût\9a\1eÀ\12\1at\10Ä\ 6Æ\97'\fWÝôZJÂdèµ\8c\88pîl]øÓ\81ÀØ=vê<k\851[F\ 3Ó\v}"\bj»;ä\0¥\8e\8d\8e\13ï\ 2\8f~\0:\16\ 4\83\97\0ý{9ì×ÉV\13\82-Ð&\90eÐ*\7f
+_\1e½\820$1\8c~¯ÕpGü.6\OóÓF¯ãt\93\94\bXÚt\vGq°Þ©\16\82 ÉË6Ô\9bõCú\8aY÷¬\18\1c\97.¥_Ì     MäYúa2\15®N\95Î\\ fØ^\0´Ýmýñ­i\1eXºÊ®Ý\95\1afºÔsBL®<:¹ãòØsÜA«sÃÐÍû\89ø¤?1Y\9fwÒQÎ\ 6\ 1    \83ø\7fÎÙ7\96×\94(°w/jB\16Ø\13ZR\f\91\99@îÈᥠ\9a\10 1\15½,\12­ô\9cH\86>c¾½"u5­\9e\88\8fe\rÞbÇ ¸·UvØL¹\84\9c\80î
+\9cX̼\ 2»¼\84à<ã\vóx,ý==Á\16\9e÷3Â\8b\0=!\f\ 4ÂqÄ]¬¿\ 1TK&ÅO¨¿\8c
+\9c\9b^«ü\ eì.V_GbÞò&
+¨+!è\99¾r´P°Ê¡"÷ç0¥\1fºB\8f_\96ÊÛ\7faÈþ±\17Á!Ø'?
\8f^Ï2\ 3»Ë\9f\ 4,\89   \96¼\1fo|SjÚ²\1fï¦\9aÖ\16\8dÔùÊ:õrï>\12ñ\90$Ó¯öýg¤\81Ä\7fE\92\ 4\8a3`=æ\81Pÿz÷áó[÷åèæËÊ.\ 2\ 1ïõÂø\13\14\94\85þ]@D\17>\15\9d\ fÜlÍÕendstream
+endobj
+6612 0 obj <<
+/Type /Page
+/Contents 6613 0 R
+/Resources 6611 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6614 0 obj <<
+/D [6612 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6615 0 obj <<
+/D [6612 0 R /XYZ 71.731 814.833 null]
+>> endobj
+1950 0 obj <<
+/D [6612 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6616 0 obj <<
+/D [6612 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6617 0 obj <<
+/D [6612 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6618 0 obj <<
+/D [6612 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6619 0 obj <<
+/D [6612 0 R /XYZ 71.731 738.749 null]
+>> endobj
+6620 0 obj <<
+/D [6612 0 R /XYZ 139.477 725.701 null]
+>> endobj
+6621 0 obj <<
+/D [6612 0 R /XYZ 71.731 710.355 null]
+>> endobj
+6622 0 obj <<
+/D [6612 0 R /XYZ 139.477 697.307 null]
+>> endobj
+6623 0 obj <<
+/D [6612 0 R /XYZ 71.731 694.41 null]
+>> endobj
+6624 0 obj <<
+/D [6612 0 R /XYZ 71.731 694.41 null]
+>> endobj
+6625 0 obj <<
+/D [6612 0 R /XYZ 71.731 683.317 null]
+>> endobj
+6626 0 obj <<
+/D [6612 0 R /XYZ 139.477 668.914 null]
+>> endobj
+6627 0 obj <<
+/D [6612 0 R /XYZ 71.731 665.186 null]
+>> endobj
+1954 0 obj <<
+/D [6612 0 R /XYZ 192.609 641.915 null]
+>> endobj
+6628 0 obj <<
+/D [6612 0 R /XYZ 71.731 636.959 null]
+>> endobj
+6629 0 obj <<
+/D [6612 0 R /XYZ 374.673 587.718 null]
+>> endobj
+6630 0 obj <<
+/D [6612 0 R /XYZ 119.552 574.767 null]
+>> endobj
+3297 0 obj <<
+/D [6612 0 R /XYZ 71.731 545.543 null]
+>> endobj
+6631 0 obj <<
+/D [6612 0 R /XYZ 71.731 532.632 null]
+>> endobj
+1958 0 obj <<
+/D [6612 0 R /XYZ 299.662 510.252 null]
+>> endobj
+6632 0 obj <<
+/D [6612 0 R /XYZ 71.731 499.673 null]
+>> endobj
+6633 0 obj <<
+/D [6612 0 R /XYZ 71.731 499.673 null]
+>> endobj
+1962 0 obj <<
+/D [6612 0 R /XYZ 162.317 473.956 null]
+>> endobj
+6634 0 obj <<
+/D [6612 0 R /XYZ 257.036 458.135 null]
+>> endobj
+6635 0 obj <<
+/D [6612 0 R /XYZ 71.731 456.068 null]
+>> endobj
+1966 0 obj <<
+/D [6612 0 R /XYZ 174.677 432.797 null]
+>> endobj
+6636 0 obj <<
+/D [6612 0 R /XYZ 71.731 427.842 null]
+>> endobj
+6637 0 obj <<
+/D [6612 0 R /XYZ 71.731 425.451 null]
+>> endobj
+6638 0 obj <<
+/D [6612 0 R /XYZ 136.77 416.297 null]
+>> endobj
+6639 0 obj <<
+/D [6612 0 R /XYZ 240.077 416.297 null]
+>> endobj
+6640 0 obj <<
+/D [6612 0 R /XYZ 343.384 416.297 null]
+>> endobj
+6641 0 obj <<
+/D [6612 0 R /XYZ 71.731 402.516 null]
+>> endobj
+1970 0 obj <<
+/D [6612 0 R /XYZ 187.959 377.178 null]
+>> endobj
+6642 0 obj <<
+/D [6612 0 R /XYZ 71.731 374.613 null]
+>> endobj
+6643 0 obj <<
+/D [6612 0 R /XYZ 71.731 369.831 null]
+>> endobj
+6644 0 obj <<
+/D [6612 0 R /XYZ 71.731 369.831 null]
+>> endobj
+6645 0 obj <<
+/D [6612 0 R /XYZ 71.731 357.88 null]
+>> endobj
+6646 0 obj <<
+/D [6612 0 R /XYZ 139.477 344.832 null]
+>> endobj
+3298 0 obj <<
+/D [6612 0 R /XYZ 71.731 328.56 null]
+>> endobj
+6647 0 obj <<
+/D [6612 0 R /XYZ 71.731 315.648 null]
+>> endobj
+1974 0 obj <<
+/D [6612 0 R /XYZ 358.641 293.268 null]
+>> endobj
+6648 0 obj <<
+/D [6612 0 R /XYZ 71.731 282.689 null]
+>> endobj
+6649 0 obj <<
+/D [6612 0 R /XYZ 71.731 282.689 null]
+>> endobj
+1978 0 obj <<
+/D [6612 0 R /XYZ 162.317 256.972 null]
+>> endobj
+6650 0 obj <<
+/D [6612 0 R /XYZ 298.879 241.152 null]
+>> endobj
+6651 0 obj <<
+/D [6612 0 R /XYZ 71.731 226.133 null]
+>> endobj
+1982 0 obj <<
+/D [6612 0 R /XYZ 174.677 202.862 null]
+>> endobj
+6652 0 obj <<
+/D [6612 0 R /XYZ 71.731 197.907 null]
+>> endobj
+6653 0 obj <<
+/D [6612 0 R /XYZ 71.731 195.516 null]
+>> endobj
+6654 0 obj <<
+/D [6612 0 R /XYZ 136.77 186.362 null]
+>> endobj
+6655 0 obj <<
+/D [6612 0 R /XYZ 270.208 186.362 null]
+>> endobj
+6656 0 obj <<
+/D [6612 0 R /XYZ 373.515 186.362 null]
+>> endobj
+6657 0 obj <<
+/D [6612 0 R /XYZ 403.646 186.362 null]
+>> endobj
+6658 0 obj <<
+/D [6612 0 R /XYZ 119.552 177.035 null]
+>> endobj
+6659 0 obj <<
+/D [6612 0 R /XYZ 154.023 177.035 null]
+>> endobj
+6660 0 obj <<
+/D [6612 0 R /XYZ 257.33 177.035 null]
+>> endobj
+6661 0 obj <<
+/D [6612 0 R /XYZ 287.497 177.035 null]
+>> endobj
+6662 0 obj <<
+/D [6612 0 R /XYZ 304.715 177.035 null]
+>> endobj
+6663 0 obj <<
+/D [6612 0 R /XYZ 326.524 177.035 null]
+>> endobj
+6664 0 obj <<
+/D [6612 0 R /XYZ 386.787 177.035 null]
+>> endobj
+6665 0 obj <<
+/D [6612 0 R /XYZ 404.291 177.035 null]
+>> endobj
+6666 0 obj <<
+/D [6612 0 R /XYZ 421.509 177.035 null]
+>> endobj
+6667 0 obj <<
+/D [6612 0 R /XYZ 71.731 163.254 null]
+>> endobj
+1986 0 obj <<
+/D [6612 0 R /XYZ 187.959 137.916 null]
+>> endobj
+6668 0 obj <<
+/D [6612 0 R /XYZ 71.731 135.352 null]
+>> endobj
+6669 0 obj <<
+/D [6612 0 R /XYZ 71.731 130.57 null]
+>> endobj
+6670 0 obj <<
+/D [6612 0 R /XYZ 71.731 130.57 null]
+>> endobj
+6671 0 obj <<
+/D [6612 0 R /XYZ 71.731 118.618 null]
+>> endobj
+6672 0 obj <<
+/D [6612 0 R /XYZ 139.477 105.57 null]
+>> endobj
+6673 0 obj <<
+/D [6612 0 R /XYZ 71.731 102.673 null]
+>> endobj
+6674 0 obj <<
+/D [6612 0 R /XYZ 71.731 102.673 null]
+>> endobj
+6675 0 obj <<
+/D [6612 0 R /XYZ 71.731 90.225 null]
+>> endobj
+6676 0 obj <<
+/D [6612 0 R /XYZ 139.477 77.177 null]
+>> endobj
+6611 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6679 0 obj <<
+/Length 1364      
+/Filter /FlateDecode
+>>
+stream
+xÚÍXËrÛ6\14Ýû+´¤:\11\ 2\80\ 4@NW®\9dtÜé$\1dGÓMÝñÐ\14,³¥H\9a\ fÇúû^¼ø\90HÅÉhÑÑB|\^\9c\ 3\87$\v\f\10\ 4        \9f,BLQ(ÂE²»À\8b-Üùõ\82X\8b\955Y\rl~Y_¼ÿèÓE\84"î/Ö\8f\v\1a\86(\b8øá(àl±Þüå]=Åe#«å\8a\8aÐ#Èüÿ\9eæíëûÛõ\92`ì­àlI¼öÕÜ»ºüd\ e®«ôÅ=x\87\19\ 6\aGdù÷ú·\8b\ fë\ e\1c£\ 4\ 1\8eSð­É\11|Fzø\84D\88\10,D\18ÂPðë¬hÊÃõ:ÃÀG\81\1fL-H\91à\11\1c\rn\1dþwØ\b¥\80MqÜûÓà¨\18\80\v\0ÊÙ(pe\16\10Ô\14æ¿n\8aÊ^*\8b\98w÷c`:Ë\8a$näÆ>\ 1\11ª\0Ç\¬\0\13\8f\ 2\0ç#\11\12½\²ÛÌ2A\18PFÎÇDïo\9e   k£¡\15»]\9cÛ\88\9a}i)x,ª·\aIµ§t6F\1e\ 3\18\aþfct6.Æ6O!ui\91\9b°n®Í\7fñhþw²\86üÖñö°*¤ã\ 6JÂ^\93\e°zSÞË*-fI\81^¡ì|-0ð7O\8aµQØ\8a\11g¶ä\ 1i\956û#VjU÷.^J\ 1>\8a\18\e\ 5L9\8a¢H;½\96uR¥Ú³}b\80\ 2\ 3Z\86üÀצ_â\9dæ\1a{qml\83Á@\f\b\ f\8fèüÅùs+ï·²¹OsU\90\81©µ\83 -±æ\99wÆ·|MdÙØ\93æ)nà\88G^Ú\98+_\97\ 4:;mjsj«\1e\ e*iÁéú×Gin\9eMâZªÇÆNá\b\9a(\88\93c\18úL¥\aè2Å\90Ö¶µÚ,³Óüc\9b'}M:\ 3U\89¥LÒ;\8cirÐ\8e\9bö\96U]vs,Y
+/Ke\ e±Pæ¡\89\84áQªneÓVjåPx\7f.EàÅY+ç\93fzüÆ\16Fó$Ý°t¨óÂÁ\8a\1f2{\ fxò6®¥r¹\85\ 6|±g/z¹\91\87J#\92\9b\ 1v\81(1Å\16\b\14ª2g\ 41\1e\1c\96EÑ6*Q÷_!\97÷ÿÊ*ï]\ 4\0\9eë\92²\1e|\8ehdö¨Oª\ 6\8f\84¬lO­\ 2¡\r\16\1aÖ¡À\b\1aÎÖá\1d¥Â\85\97È.|\97OW\80\ai®À»\8c7ûÁ\f\1e\e\93-\e\98PõT{:\1c+
+ùóCÓtû¼(ë´o8\81\88\b\1c\19å\ 1£ÎÎ7Ü\eè\\84Ç\1d9CýÐ7¡\ 1Ð\199F@\91ÔMÕ&\10\13\a\15c}©0îí¥\9fºñÚûÀ>ò±°>\9eû \87\v\81Tat0\ 1\94¯©¥ &»¥&Ö\826á uøb\15Ál\15vEx¨\9cX\12*\85\7f{IMÑ\89%\89J\1cáÖO§\9d\8eÃcaO#ùy2ï\f\0Þ\8f\10ÌDm|YmÛ\9d\9e\r\96\80\8f\89\9dÚ²|\1f\9a     GgÛ²\ 6þf·,g£ÀilV¬)\86[7\83\1edVäÛ4ßÚé\ 4Ýc§Q\12gYw}B\a\14\ fÿÈä\8d*®/\81Ir0Ó\19<\e9½¿yr¬Í\ fJÚGÅSë\ 4ÎÛeÍIiO\85ÐMx.\1e\ 6þfyp6?È\83\9e¶z8\1f\13\8a'ü^ų~r\9a"Þ©\15çÕ\ ftp\ 4ûÞhÖ6²î\86í\94øñ\11\83)1!~æ\15\8fº\9c;\15\fÕ\rÜïÕM·åc³aÃM³åcØÙÔVe\84\8f\80\97¬0\1a     \9f7l_Z±XI\ 4ÔLª¢ÿ\9d$2Yý4\90\975\1c¨\ 5\88;½ô;sÓ\91)z2¹\8dOX2\85%S\1fB¶ËÖ>QgªYí\89\8d]ô<\8a1\8fÂûcé\83\ 3õN\93\1e¢S\89Â\93ÒT>·î\85Àõ\86-\f3<Õ»@¾9\14%OqíÆ°Kj<~S~Ø\1f8Ks\e\18øI7ºà¾SõÕû<9¯Üû¦÷a»Qx\91\8aÂ#\8d7#ç\80\8e\9e´Ú½q\15\89\9a\ 2u­ö§\83aj¿\19\81n\8a°8ùU©7q\1f\95\ 4\8a\84Â8ö¡p~¾úp{iûìæËÚ\1cø\8c`j"\1c~\91
\10\ 5\9cØ\b\99\98ùrt\8cð?¦9¾þendstream
+endobj
+6678 0 obj <<
+/Type /Page
+/Contents 6679 0 R
+/Resources 6677 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6680 0 obj <<
+/D [6678 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6681 0 obj <<
+/D [6678 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6682 0 obj <<
+/D [6678 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6683 0 obj <<
+/D [6678 0 R /XYZ 71.731 756.482 null]
+>> endobj
+6684 0 obj <<
+/D [6678 0 R /XYZ 139.477 743.434 null]
+>> endobj
+6685 0 obj <<
+/D [6678 0 R /XYZ 71.731 729.444 null]
+>> endobj
+6686 0 obj <<
+/D [6678 0 R /XYZ 139.477 715.041 null]
+>> endobj
+6687 0 obj <<
+/D [6678 0 R /XYZ 71.731 712.144 null]
+>> endobj
+6688 0 obj <<
+/D [6678 0 R /XYZ 71.731 712.144 null]
+>> endobj
+6689 0 obj <<
+/D [6678 0 R /XYZ 71.731 701.05 null]
+>> endobj
+6690 0 obj <<
+/D [6678 0 R /XYZ 139.477 686.647 null]
+>> endobj
+6691 0 obj <<
+/D [6678 0 R /XYZ 71.731 683.75 null]
+>> endobj
+6692 0 obj <<
+/D [6678 0 R /XYZ 71.731 683.75 null]
+>> endobj
+6693 0 obj <<
+/D [6678 0 R /XYZ 71.731 671.302 null]
+>> endobj
+6694 0 obj <<
+/D [6678 0 R /XYZ 139.477 658.254 null]
+>> endobj
+6695 0 obj <<
+/D [6678 0 R /XYZ 71.731 654.526 null]
+>> endobj
+1990 0 obj <<
+/D [6678 0 R /XYZ 192.609 631.255 null]
+>> endobj
+6696 0 obj <<
+/D [6678 0 R /XYZ 71.731 626.299 null]
+>> endobj
+6697 0 obj <<
+/D [6678 0 R /XYZ 160.735 615.912 null]
+>> endobj
+6698 0 obj <<
+/D [6678 0 R /XYZ 71.731 599.233 null]
+>> endobj
+1994 0 obj <<
+/D [6678 0 R /XYZ 202.018 575.962 null]
+>> endobj
+6699 0 obj <<
+/D [6678 0 R /XYZ 71.731 573.428 null]
+>> endobj
+3299 0 obj <<
+/D [6678 0 R /XYZ 71.731 544.348 null]
+>> endobj
+6700 0 obj <<
+/D [6678 0 R /XYZ 71.731 531.436 null]
+>> endobj
+1998 0 obj <<
+/D [6678 0 R /XYZ 342.39 509.056 null]
+>> endobj
+6701 0 obj <<
+/D [6678 0 R /XYZ 71.731 498.477 null]
+>> endobj
+6702 0 obj <<
+/D [6678 0 R /XYZ 71.731 498.477 null]
+>> endobj
+2002 0 obj <<
+/D [6678 0 R /XYZ 162.317 472.76 null]
+>> endobj
+6703 0 obj <<
+/D [6678 0 R /XYZ 286.924 456.939 null]
+>> endobj
+6704 0 obj <<
+/D [6678 0 R /XYZ 71.731 454.872 null]
+>> endobj
+2006 0 obj <<
+/D [6678 0 R /XYZ 174.677 431.601 null]
+>> endobj
+6705 0 obj <<
+/D [6678 0 R /XYZ 71.731 426.646 null]
+>> endobj
+6706 0 obj <<
+/D [6678 0 R /XYZ 71.731 424.255 null]
+>> endobj
+6707 0 obj <<
+/D [6678 0 R /XYZ 136.77 415.101 null]
+>> endobj
+6708 0 obj <<
+/D [6678 0 R /XYZ 261.599 415.101 null]
+>> endobj
+6709 0 obj <<
+/D [6678 0 R /XYZ 364.906 415.101 null]
+>> endobj
+6710 0 obj <<
+/D [6678 0 R /XYZ 395.037 415.101 null]
+>> endobj
+6711 0 obj <<
+/D [6678 0 R /XYZ 119.552 405.774 null]
+>> endobj
+6712 0 obj <<
+/D [6678 0 R /XYZ 154.023 405.774 null]
+>> endobj
+6713 0 obj <<
+/D [6678 0 R /XYZ 257.33 405.774 null]
+>> endobj
+6714 0 obj <<
+/D [6678 0 R /XYZ 71.731 391.993 null]
+>> endobj
+2010 0 obj <<
+/D [6678 0 R /XYZ 187.959 366.655 null]
+>> endobj
+6715 0 obj <<
+/D [6678 0 R /XYZ 71.731 364.091 null]
+>> endobj
+6716 0 obj <<
+/D [6678 0 R /XYZ 71.731 359.309 null]
+>> endobj
+6717 0 obj <<
+/D [6678 0 R /XYZ 71.731 359.309 null]
+>> endobj
+6718 0 obj <<
+/D [6678 0 R /XYZ 71.731 347.358 null]
+>> endobj
+6719 0 obj <<
+/D [6678 0 R /XYZ 139.477 334.309 null]
+>> endobj
+6720 0 obj <<
+/D [6678 0 R /XYZ 71.731 331.412 null]
+>> endobj
+6721 0 obj <<
+/D [6678 0 R /XYZ 71.731 331.412 null]
+>> endobj
+6722 0 obj <<
+/D [6678 0 R /XYZ 71.731 318.964 null]
+>> endobj
+6723 0 obj <<
+/D [6678 0 R /XYZ 139.477 305.916 null]
+>> endobj
+6724 0 obj <<
+/D [6678 0 R /XYZ 71.731 303.019 null]
+>> endobj
+6725 0 obj <<
+/D [6678 0 R /XYZ 71.731 303.019 null]
+>> endobj
+6726 0 obj <<
+/D [6678 0 R /XYZ 71.731 290.57 null]
+>> endobj
+6727 0 obj <<
+/D [6678 0 R /XYZ 139.477 277.522 null]
+>> endobj
+6728 0 obj <<
+/D [6678 0 R /XYZ 71.731 273.794 null]
+>> endobj
+2014 0 obj <<
+/D [6678 0 R /XYZ 192.609 250.524 null]
+>> endobj
+6729 0 obj <<
+/D [6678 0 R /XYZ 71.731 245.568 null]
+>> endobj
+6730 0 obj <<
+/D [6678 0 R /XYZ 179.467 235.181 null]
+>> endobj
+6731 0 obj <<
+/D [6678 0 R /XYZ 71.731 218.502 null]
+>> endobj
+2018 0 obj <<
+/D [6678 0 R /XYZ 202.018 195.231 null]
+>> endobj
+6732 0 obj <<
+/D [6678 0 R /XYZ 71.731 192.697 null]
+>> endobj
+3300 0 obj <<
+/D [6678 0 R /XYZ 71.731 150.665 null]
+>> endobj
+6733 0 obj <<
+/D [6678 0 R /XYZ 71.731 137.753 null]
+>> endobj
+2022 0 obj <<
+/D [6678 0 R /XYZ 284.375 115.373 null]
+>> endobj
+6734 0 obj <<
+/D [6678 0 R /XYZ 71.731 104.795 null]
+>> endobj
+6735 0 obj <<
+/D [6678 0 R /XYZ 71.731 104.795 null]
+>> endobj
+2026 0 obj <<
+/D [6678 0 R /XYZ 162.317 79.077 null]
+>> endobj
+6736 0 obj <<
+/D [6678 0 R /XYZ 245.081 63.257 null]
+>> endobj
+6737 0 obj <<
+/D [6678 0 R /XYZ 71.731 61.19 null]
+>> endobj
+6677 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6740 0 obj <<
+/Length 1132      
+/Filter /FlateDecode
+>>
+stream
+xÚÅWK\8fÛ6\10¾ï¯ÐÑ*j.\1f\12)¡§í&.R\14»ÁÆè%       \fY¦mµ\16åè±Éæ×w(\92\92lËë\r°Eà\83Fäpæ\9b\a¿±\88\87áG<A\90\8b0E\91\88¼4¿ÂÞ\ 6vþ¸"VcjU¦\ 3\9dßçW×3F½\18Å\9cyóµG£\b\ 5\ 1\a;\1c\ 5<ôæ«\8f\93Ûm²¯eéO©\88&\ 4\99ç_\99j¾]?Ì}\82ñd
+o>\994ßÌÞíÍ\9d\11Þ\94Ù£;ø      \87\18Ô`\ f\7f\9eÿyõvÞ\81\v)A\80ã9øVå\ 4\1e!(\ eC\8d\9f\90\18\85!õD\18!\fqhü\1f\9eT±¯²Jû¼\9e\ 5°\89\88\b´6ö¦\84#\13e¦j£\10â^\81\bDI\ 4zZ#MÔ\97F.ª'\95.¾&Y½øW\96êÔh\1c \1e»3:êª.\9b´ö§\1c2emHµª\16\17ë\96\fÜb\86\18\16ÖÆ\17­}ê\aÒ\11BìFçWckÌÕj#\9fu%\10'´s\ 5Ú\17\éòýft\ eR?e<\84ÂÄ Ä\bêÐ*ß\94\9b&\97ª®:Ï]«éä\vèÈà0ÈaW¸jr\81\11\8eÈX[P$x\fÒ`ëøÙu\10¡\14:\b\84\81=ÓB¢\87E\ 2\8a(t\8eÓÑàZlm\17\9b\ 47¥4¯K¹+Ô&S\eóZÃ%(\8c\98&»]·\9e\16yÞ¨,Mê¬Pf©Xþ#Óú4+SÀÈã\0À2$¬û®*£¹      \bâQôz¹éí\9dÏ\8dÕÑàö\ 5Ü\1cwÉk\e}ßF\87\82£\1cűé\907²JËlßfÆ\9c\10\87=\12"\16°VuÖ¨TëÙZ|õI4\81{h_×\85\ 5!5\17¹\82Õe¢ª¬Ï;\80u\18ó}ýäª\9aÔR[C# ±\85kÂ}\90P}m+\12\93¿}\11L\92]#/\ 1\7fï31)4\8cGÝ8!\99<¶ÇZ1S+Ý\19²òi¨ï±^«·Im¤6\93F²xA¬t£iÈíÛ6©\8c°\94R\19©\94\8bÉV®\90\93\9b¤÷Þf
+\9eßeY\fñ@\18-r
\13Ë\8a\90ÖÜæ2Y\16MÝ¥Q\96e\ 30`4¬\ eëa\eÜV£¨·®;öe±ÜÉ|\90dM¯¦3\ 2\81"Ý~!P\r\ f\86|û      cº.\16\99:`\}:\80\ 4s}Ú\1df\1cÑØ\90þ]\92÷DvT\96\88\ eí¯³\11ëæ§\11\b\9dRáR\0õLvÙwË\ 5\85²Â­Î\83\e\81³w3HÒýØep\86¡\0\88±èÿ\98Uc±ýè¬jm¼tViåS7\aÐì¨êc\18\18£º8Ü*V»¢®Tyj\8eaÄâKÓHÿ\93á¡0Ó\88¾t\18±\83(Æø\96Q\81°x½Y4°w\96o\9dÎY¾\85;ÖµÛý`RAëµÃêÂ\98¡Çù\1e\v\1cZ\15q!^-ð\81½³\81;\1d\rO5ùÒÅ]¬Í³\94СUÇ@m\ 4/\9c;?Hä&Eó6Ï@æJó)d×P*,8B\añ\84Ð\19w\84\ e»\9a\ e¥YÌ*k¬0Ï\æEùd\ fØ5ø\e\86êaµÚ'©õbÆ\9d1h6ûd\fy\9c\9eM^×4&m\0ö23³\11f^\ 1ó½\1a3\93\13ú:6ÿ\ 2j^\97RVÃØÌø²©\¹ÿ\vP¿r\9c²\7f*_\1f\ 5ü³ùºcØ!)ØoI\1a \18\8bg¿6{\15÷±)P,´\97C\eÚÕýíÛ\87\eû\81ùîÃÜ\b,$\98\1a\8cÃ/Õ\80E($Ä\82\f£3_\94§\bÿ\ 3§úËíendstream
+endobj
+6739 0 obj <<
+/Type /Page
+/Contents 6740 0 R
+/Resources 6738 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6741 0 obj <<
+/D [6739 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2030 0 obj <<
+/D [6739 0 R /XYZ 174.677 758.046 null]
+>> endobj
+6742 0 obj <<
+/D [6739 0 R /XYZ 71.731 753.091 null]
+>> endobj
+6743 0 obj <<
+/D [6739 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6744 0 obj <<
+/D [6739 0 R /XYZ 136.77 741.546 null]
+>> endobj
+6745 0 obj <<
+/D [6739 0 R /XYZ 231.468 741.546 null]
+>> endobj
+6746 0 obj <<
+/D [6739 0 R /XYZ 334.775 741.546 null]
+>> endobj
+6747 0 obj <<
+/D [6739 0 R /XYZ 364.906 741.546 null]
+>> endobj
+6748 0 obj <<
+/D [6739 0 R /XYZ 463.909 741.546 null]
+>> endobj
+6749 0 obj <<
+/D [6739 0 R /XYZ 71.731 727.765 null]
+>> endobj
+2034 0 obj <<
+/D [6739 0 R /XYZ 187.959 702.427 null]
+>> endobj
+6750 0 obj <<
+/D [6739 0 R /XYZ 71.731 699.863 null]
+>> endobj
+6751 0 obj <<
+/D [6739 0 R /XYZ 71.731 695.081 null]
+>> endobj
+6752 0 obj <<
+/D [6739 0 R /XYZ 71.731 695.081 null]
+>> endobj
+6753 0 obj <<
+/D [6739 0 R /XYZ 71.731 683.129 null]
+>> endobj
+6754 0 obj <<
+/D [6739 0 R /XYZ 139.477 670.081 null]
+>> endobj
+6755 0 obj <<
+/D [6739 0 R /XYZ 71.731 667.184 null]
+>> endobj
+6756 0 obj <<
+/D [6739 0 R /XYZ 71.731 667.184 null]
+>> endobj
+6757 0 obj <<
+/D [6739 0 R /XYZ 71.731 654.736 null]
+>> endobj
+6758 0 obj <<
+/D [6739 0 R /XYZ 139.477 641.688 null]
+>> endobj
+6759 0 obj <<
+/D [6739 0 R /XYZ 71.731 637.96 null]
+>> endobj
+2038 0 obj <<
+/D [6739 0 R /XYZ 192.609 614.689 null]
+>> endobj
+6760 0 obj <<
+/D [6739 0 R /XYZ 71.731 609.734 null]
+>> endobj
+6761 0 obj <<
+/D [6739 0 R /XYZ 71.731 595.619 null]
+>> endobj
+2042 0 obj <<
+/D [6739 0 R /XYZ 202.018 572.348 null]
+>> endobj
+6762 0 obj <<
+/D [6739 0 R /XYZ 71.731 569.813 null]
+>> endobj
+3301 0 obj <<
+/D [6739 0 R /XYZ 71.731 527.782 null]
+>> endobj
+6763 0 obj <<
+/D [6739 0 R /XYZ 71.731 514.87 null]
+>> endobj
+2046 0 obj <<
+/D [6739 0 R /XYZ 265.231 492.49 null]
+>> endobj
+6764 0 obj <<
+/D [6739 0 R /XYZ 71.731 481.911 null]
+>> endobj
+6765 0 obj <<
+/D [6739 0 R /XYZ 71.731 481.911 null]
+>> endobj
+2050 0 obj <<
+/D [6739 0 R /XYZ 162.317 456.194 null]
+>> endobj
+6766 0 obj <<
+/D [6739 0 R /XYZ 245.081 440.374 null]
+>> endobj
+6767 0 obj <<
+/D [6739 0 R /XYZ 71.731 438.81 null]
+>> endobj
+2054 0 obj <<
+/D [6739 0 R /XYZ 174.677 415.036 null]
+>> endobj
+6768 0 obj <<
+/D [6739 0 R /XYZ 71.731 410.08 null]
+>> endobj
+6769 0 obj <<
+/D [6739 0 R /XYZ 71.731 407.689 null]
+>> endobj
+6770 0 obj <<
+/D [6739 0 R /XYZ 136.77 398.536 null]
+>> endobj
+6771 0 obj <<
+/D [6739 0 R /XYZ 231.468 398.536 null]
+>> endobj
+6772 0 obj <<
+/D [6739 0 R /XYZ 334.775 398.536 null]
+>> endobj
+6773 0 obj <<
+/D [6739 0 R /XYZ 360.601 398.536 null]
+>> endobj
+6774 0 obj <<
+/D [6739 0 R /XYZ 377.819 398.536 null]
+>> endobj
+6775 0 obj <<
+/D [6739 0 R /XYZ 71.731 384.754 null]
+>> endobj
+2058 0 obj <<
+/D [6739 0 R /XYZ 187.959 359.416 null]
+>> endobj
+6776 0 obj <<
+/D [6739 0 R /XYZ 71.731 356.852 null]
+>> endobj
+6777 0 obj <<
+/D [6739 0 R /XYZ 71.731 352.07 null]
+>> endobj
+6778 0 obj <<
+/D [6739 0 R /XYZ 71.731 352.07 null]
+>> endobj
+6779 0 obj <<
+/D [6739 0 R /XYZ 71.731 341.474 null]
+>> endobj
+6780 0 obj <<
+/D [6739 0 R /XYZ 139.477 327.071 null]
+>> endobj
+6781 0 obj <<
+/D [6739 0 R /XYZ 71.731 324.173 null]
+>> endobj
+6782 0 obj <<
+/D [6739 0 R /XYZ 71.731 324.173 null]
+>> endobj
+6783 0 obj <<
+/D [6739 0 R /XYZ 71.731 313.08 null]
+>> endobj
+6784 0 obj <<
+/D [6739 0 R /XYZ 139.477 298.677 null]
+>> endobj
+6785 0 obj <<
+/D [6739 0 R /XYZ 71.731 294.949 null]
+>> endobj
+2062 0 obj <<
+/D [6739 0 R /XYZ 202.018 271.678 null]
+>> endobj
+6786 0 obj <<
+/D [6739 0 R /XYZ 71.731 269.144 null]
+>> endobj
+3410 0 obj <<
+/D [6739 0 R /XYZ 71.731 227.112 null]
+>> endobj
+6787 0 obj <<
+/D [6739 0 R /XYZ 71.731 214.201 null]
+>> endobj
+2066 0 obj <<
+/D [6739 0 R /XYZ 277.041 191.821 null]
+>> endobj
+6788 0 obj <<
+/D [6739 0 R /XYZ 71.731 181.242 null]
+>> endobj
+6789 0 obj <<
+/D [6739 0 R /XYZ 71.731 181.242 null]
+>> endobj
+2070 0 obj <<
+/D [6739 0 R /XYZ 162.317 155.525 null]
+>> endobj
+6790 0 obj <<
+/D [6739 0 R /XYZ 245.081 139.704 null]
+>> endobj
+6791 0 obj <<
+/D [6739 0 R /XYZ 71.731 138.14 null]
+>> endobj
+2074 0 obj <<
+/D [6739 0 R /XYZ 174.677 114.366 null]
+>> endobj
+6792 0 obj <<
+/D [6739 0 R /XYZ 71.731 109.411 null]
+>> endobj
+6793 0 obj <<
+/D [6739 0 R /XYZ 71.731 107.02 null]
+>> endobj
+6794 0 obj <<
+/D [6739 0 R /XYZ 136.77 97.866 null]
+>> endobj
+6795 0 obj <<
+/D [6739 0 R /XYZ 231.468 97.866 null]
+>> endobj
+6796 0 obj <<
+/D [6739 0 R /XYZ 334.775 97.866 null]
+>> endobj
+6797 0 obj <<
+/D [6739 0 R /XYZ 71.731 84.085 null]
+>> endobj
+6738 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6800 0 obj <<
+/Length 1091      
+/Filter /FlateDecode
+>>
+stream
+xÚµWÛ\8eÛ6\10}߯У\1dÔ\^DQD\9f6Û¸H°Ø\0\e·/Ýb¡È´-Ô¦¼º$ë~}\87\8b%'H±\81\1fD\8bÃá\9c\993\87"      0üH \b\12\8c\ 41¦(\16q\90\1e®p°\85\99߯\88³X8\93EÏæíêêzÉh \91\8cX°Ú\ 44\8eQ\18Fà'BaÄ\83Õú¯Ùí.9Vª\98\88g\ 4Ùç]¦ë\97ë\87Õ\9c`<[À¿9\99Õ/vîöæÞ\ e~+²/~á#æ\18Ì`\ eFdþ÷êÃÕ»U\e\1c§\ 4A\1cß
\99\8c§4 \ 4IÎMü\84HÄ9\r\ 4\8f\11\ 6\1c\9bb[\1f\94®J³éõ\92\93\ e.\ e\16D@VXc¸É6ùy`­CÊ\91Àd*2\8aD$aÔ\9b:\7f¶ \b¥\0Â\14£ógQ\88.*\12RD!xocb;æ\99n\8bPåî¹Sv°|¿ühGeUÔ)Ô¢ª\v\9aü\bDI\93\9f\85À\88ÃpÁ      âQظN\13ý\«'­¾>©õV=ý£
+Ý-\r\113yÜ\ 4¡@±\89\9cE\88J\9bÙûäà6 é0©¼±ý\8e÷>d\97\17ܬy¤TX8É~\9f§Iå`\82\13;0\9e\86yi\83·y\ 3T\1c&§¡ª\1d\9aÍÕÞ\8eÓ\1c\12úRuH[\12uU\82\ 20\1671}:éüXfe\8bW "B\8f7B¶W\9aôWóE\ 4\907¨Ý«7\8e\82¸[-%Â\98\97\93ÕßPbÄdès\ 5}\ 5Ôh¹ÝZA»pê\1d\97û¼*u1öÅ\8c¯Î\15ùu*\1f4\84ÖÃ1Ô^"h\88\1fëªÞÖS\8dÅq\8c\ 4\11¯ÖX=\7f\17\eËÛ\98ð
+õ\g\85Z;\86Õ\87ϾËò\8d£\98\ 1à¸\ 5\;§\17\14k\7f\1a²u=ÁRGÑ©ìR\14A9\174BRZ²=(06\eÅböç\\84à¹Vã®±\9dÆBÖ[\ 4\91\ 29:½`\927za^öâ3\7f\r0kÐÅ×L䟫)p\F\9e\7fÜÝ\8dã¡ \11-\9b²\8du\ 6\89²~ù,sÁi¿¯Òy½ÝÙ\97\a\8b\93[Óè°!^\88bC<B!]N       \8b<U¥+H~TERe¹FSbç%k$v¦-õº|Zgå1/\7f\8eä\8d÷\0òLj\1f\9cU$\8eFÚ÷\bº \93}öo¦·CF¶Ü3\e8\86\19Í/ú:¸É\8bKú×äÖoÛÏm:\17³}Öuõ\80¨ø\7fèa§L=Ék*\14\ f$ïrAú\9e    øm%Í\bß\94Ü\1a7grÛSE\82\19H\99p>\9e\9b\ 4\8eö\19Hç/Ö×´Æ\9a¢{gåI§\131\ 3XÁ¿§°\f\83ÂBwý Â\86C\14SúJ)C¡|5yíÜ]TWgrñ«¥GÚ¡,ö\11¶ªH\18\121\19$x
+&\91\1caèÑ×ÂÙów\11¨·±\95Å,Ùú/\90u\ 62kÚ\96\1fÛ³IeGui3"f_ç\ 4\ e\ríO\17\9f û:«ÎúØ      ßH\r@Õí P\87$Ón^\80 \96e²UåÏ<s\96µN\8düºzîòzï\ e¿ÏN\86ÖÊHS¶ÕþT,k£2»>T¸DÌNÃ\1c4GD\ 3?Éöè¼êî*CC$±øæe§3ñw\1d\81¤0@\86>\f\98\8f·ï\1enÜýæý§\95\1d0N0µiè_\94B\16Ã\87´ÿ`åòÂ\85f\1cá\7fJëjTendstream
+endobj
+6799 0 obj <<
+/Type /Page
+/Contents 6800 0 R
+/Resources 6798 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6554 0 R
+>> endobj
+6801 0 obj <<
+/D [6799 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2078 0 obj <<
+/D [6799 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6802 0 obj <<
+/D [6799 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6803 0 obj <<
+/D [6799 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6804 0 obj <<
+/D [6799 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6805 0 obj <<
+/D [6799 0 R /XYZ 71.731 740.104 null]
+>> endobj
+6806 0 obj <<
+/D [6799 0 R /XYZ 139.477 725.701 null]
+>> endobj
+3411 0 obj <<
+/D [6799 0 R /XYZ 71.731 709.429 null]
+>> endobj
+6807 0 obj <<
+/D [6799 0 R /XYZ 71.731 696.517 null]
+>> endobj
+2082 0 obj <<
+/D [6799 0 R /XYZ 283.101 674.137 null]
+>> endobj
+6808 0 obj <<
+/D [6799 0 R /XYZ 71.731 663.558 null]
+>> endobj
+6809 0 obj <<
+/D [6799 0 R /XYZ 71.731 663.558 null]
+>> endobj
+2086 0 obj <<
+/D [6799 0 R /XYZ 162.317 637.841 null]
+>> endobj
+6810 0 obj <<
+/D [6799 0 R /XYZ 239.103 622.02 null]
+>> endobj
+6811 0 obj <<
+/D [6799 0 R /XYZ 71.731 619.953 null]
+>> endobj
+2090 0 obj <<
+/D [6799 0 R /XYZ 174.677 596.682 null]
+>> endobj
+6812 0 obj <<
+/D [6799 0 R /XYZ 71.731 591.727 null]
+>> endobj
+6813 0 obj <<
+/D [6799 0 R /XYZ 71.731 589.336 null]
+>> endobj
+6814 0 obj <<
+/D [6799 0 R /XYZ 218.554 580.182 null]
+>> endobj
+6815 0 obj <<
+/D [6799 0 R /XYZ 308.948 580.182 null]
+>> endobj
+6816 0 obj <<
+/D [6799 0 R /XYZ 330.47 580.182 null]
+>> endobj
+6817 0 obj <<
+/D [6799 0 R /XYZ 71.731 566.401 null]
+>> endobj
+2094 0 obj <<
+/D [6799 0 R /XYZ 187.959 541.063 null]
+>> endobj
+6818 0 obj <<
+/D [6799 0 R /XYZ 71.731 538.499 null]
+>> endobj
+6819 0 obj <<
+/D [6799 0 R /XYZ 71.731 533.717 null]
+>> endobj
+6820 0 obj <<
+/D [6799 0 R /XYZ 71.731 533.717 null]
+>> endobj
+6821 0 obj <<
+/D [6799 0 R /XYZ 71.731 523.12 null]
+>> endobj
+6822 0 obj <<
+/D [6799 0 R /XYZ 139.477 508.717 null]
+>> endobj
+6823 0 obj <<
+/D [6799 0 R /XYZ 71.731 504.989 null]
+>> endobj
+2098 0 obj <<
+/D [6799 0 R /XYZ 202.018 481.719 null]
+>> endobj
+6824 0 obj <<
+/D [6799 0 R /XYZ 71.731 479.184 null]
+>> endobj
+6825 0 obj <<
+/D [6799 0 R /XYZ 336.521 466.376 null]
+>> endobj
+3412 0 obj <<
+/D [6799 0 R /XYZ 71.731 437.153 null]
+>> endobj
+6826 0 obj <<
+/D [6799 0 R /XYZ 71.731 424.241 null]
+>> endobj
+2102 0 obj <<
+/D [6799 0 R /XYZ 334.747 401.861 null]
+>> endobj
+6827 0 obj <<
+/D [6799 0 R /XYZ 71.731 391.282 null]
+>> endobj
+6828 0 obj <<
+/D [6799 0 R /XYZ 71.731 391.282 null]
+>> endobj
+2106 0 obj <<
+/D [6799 0 R /XYZ 162.317 365.565 null]
+>> endobj
+6829 0 obj <<
+/D [6799 0 R /XYZ 274.969 349.745 null]
+>> endobj
+6830 0 obj <<
+/D [6799 0 R /XYZ 71.731 336.679 null]
+>> endobj
+2110 0 obj <<
+/D [6799 0 R /XYZ 174.677 311.455 null]
+>> endobj
+6831 0 obj <<
+/D [6799 0 R /XYZ 71.731 306.5 null]
+>> endobj
+6832 0 obj <<
+/D [6799 0 R /XYZ 71.731 304.109 null]
+>> endobj
+6833 0 obj <<
+/D [6799 0 R /XYZ 136.77 294.955 null]
+>> endobj
+6834 0 obj <<
+/D [6799 0 R /XYZ 252.99 294.955 null]
+>> endobj
+6835 0 obj <<
+/D [6799 0 R /XYZ 356.297 294.955 null]
+>> endobj
+6836 0 obj <<
+/D [6799 0 R /XYZ 386.428 294.955 null]
+>> endobj
+6837 0 obj <<
+/D [6799 0 R /XYZ 403.646 294.955 null]
+>> endobj
+6838 0 obj <<
+/D [6799 0 R /XYZ 71.731 281.174 null]
+>> endobj
+2114 0 obj <<
+/D [6799 0 R /XYZ 187.959 255.836 null]
+>> endobj
+6839 0 obj <<
+/D [6799 0 R /XYZ 71.731 253.271 null]
+>> endobj
+6840 0 obj <<
+/D [6799 0 R /XYZ 71.731 248.489 null]
+>> endobj
+6841 0 obj <<
+/D [6799 0 R /XYZ 71.731 248.489 null]
+>> endobj
+6842 0 obj <<
+/D [6799 0 R /XYZ 71.731 236.538 null]
+>> endobj
+6843 0 obj <<
+/D [6799 0 R /XYZ 139.477 223.49 null]
+>> endobj
+6844 0 obj <<
+/D [6799 0 R /XYZ 71.731 220.593 null]
+>> endobj
+6845 0 obj <<
+/D [6799 0 R /XYZ 71.731 220.593 null]
+>> endobj
+6846 0 obj <<
+/D [6799 0 R /XYZ 71.731 208.145 null]
+>> endobj
+6847 0 obj <<
+/D [6799 0 R /XYZ 139.477 195.096 null]
+>> endobj
+6848 0 obj <<
+/D [6799 0 R /XYZ 71.731 191.369 null]
+>> endobj
+2118 0 obj <<
+/D [6799 0 R /XYZ 202.018 168.098 null]
+>> endobj
+6849 0 obj <<
+/D [6799 0 R /XYZ 71.731 165.563 null]
+>> endobj
+3413 0 obj <<
+/D [6799 0 R /XYZ 71.731 136.483 null]
+>> endobj
+6798 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6852 0 obj <<
+/Length 1351      
+/Filter /FlateDecode
+>>
+stream
+xÚÍX[s£6\14~ϯàÑî\ 4-\92@\82éS\9aÝí¤ÓÙN\13O_\9a\8e\87`Ù¡ÅÀrÙ$ÿ¾G7\90mì$[?tü`$\1dÎ]ß'\84½\0~Øã\18q\8a½8 (æ±\97m/\ 2o\ 3+?_`#á\e\11ß\91ùiqñá3%^\82\12F½ÅÚ#q\8cÂ\90\81\1e\86B\16y\8bÕ\9f³ëÇ´îD3÷      \8fg\18éÿ_ó²\7fþp»\98ã \98ù0\9aãYÿ¬×®¯¾è\87\8fMþ;x\1fD\ 1\88Á\1a<áù_\8b_.>-\ 6ç"\82\11øqÊ}#rà>!\1e\ e\11\ 5§Á\7f\13#\8f8bÆ}\8c\18üÀ\89\98\eÏàá÷^ô¢ÕÏ2\b\12© T\ 40uW\8b,¿\ f\ 2\92éñç¾Ìº¼*[é·6É\11Á\914\19x>\8d\11fXYËÒò«Ô½lº\82\14y¹Ì\1eEöÏ2-WËZ\94«ñýÁå\90£\98@|\94!\92h\97¿¤[¡%C§6`\bGJö\94!¨Ã®->jÀPÝ\80\87 Ij¸'\84ëÚÔUÛÕU©\12\ 2C±Ú\býTV\9dNCÚ\81^H\80\9eÎ×ú?K\8bB¬ô󺩶Ò"8i¬ø\98 $ÒÞ:\8d\ 29\1e\92\80AÀ&\91D\88ÒXIß½\94UÝæí\90\ 3\8e0(49`(
+´Ö¼ì´H\14\8c"ª2±\89ñMåp\r\11\87 \93"hÚ¶kú¬\9bû\fü×ê\96ðf»4S?\18\ f°£# \88\ 6Üèø*¥\ f\rA7G\84\1a\99K­kÊ\14Ôâ\84)H}\82xâù       ì\rnìÉòMÛ#»öÆü9*\89ì1ëüÓcÚM$ÉM±ÜÎ?N\94Ôg!\8a\18\87ÆN\10Æ\89\92½j6ýV\94];\98ÝénH=¥»IsA\ 2´ ("^D1\ 2\80\9aB    \828KàÉYÚÿ\1f\0\ 5\13\ 2I\93È2êÓ\88ân\99\90 \ 2\eÕÊHç\9c]1l\89.m6¢3ûg(¸\e \ fæX"·\ 5E<Æ»µ\9a\f\13Ú(Äô|a\8eú\8e\87id¤s#\f¬D!\81</7\a° \13ð¦Pm'ME\1aò\b\ 5Ð"ç\8aÔÑw4R+s´ /µ\98êj\e\1aa(I4\Ý\8a®oJÍ\14\7fÌy8K\8b^\1c¢¯Æo\1aêìJ\f\r)\1e04¤\ 40\14P\16`T\r\f\1d)\99ªìÄsw©G\8d2×êA \85\ 1Ðô¸\10ëÎ,íG%çê¦ÊDÛªJÊ÷ì¼ò¢±ú}\ 5äÁ\ e\82·@\10\90\17y÷¢ø\12(\95²`v³Öÿ6\ eÊ°æ\ 2\8bûZP\aÓÎAÇ¥\9ej³9\9f=\8aU_H
+\923\96\91\8c\r@C¯\98^|Ñ£Tcøà+Q¾\ e\19R'\96   Îö-éF\80\8a\8c:T±\84]¼Ì˶¨º0_-\9fÒ¼\93Üñ\1ao³wòö¡\19¨¼kÉíXÎ\14\80¬miØ·2§¬§9\8egà³ád;ý Z3UÉsZ·©\86½<îòÔ*\93^\8d
+4§\e\1fÜ\8eØ@\1dÌf¹ùøß9ý]\8c~²L;TE\80}(ý\7fòù4¡c\84\ 1\19½\9e0    ]ÅÈ«&e\92N\99IJd\98\19=Rº\9e\ e/\8aß{|ȶ\93G,´çt\ fȲQ\9b]\8e\8a
+zó@/\8báÔoßË'ÔÂzÂÞê \15¬\9b¼úÞó\r\ 5öÂ<Ò\a\1crÆó\rf\1cE8<\e\1d\8eÒ¡\95QÄ/}ÓH º©o\84\85\11Y\9b\ 1:ä7A5~       \fóYµÝöeî²iõð·Èº×N
+d¯Ý'\93£³}¶Ü\fê\8e§f¬o]¤\99ÉEWÙ\14U6=5 êð¡l××2I½\85ÖñlþÚyiØ\87\93\ 1âä|'`Gßñ4\18\99ïÌ\83ü0-\8a
+\9aB¸4ó¦\\18\18\99ÊD\f\11Ðó\9d\91GuGó`D\94_Ðè\ 3\ 3ã.í¾=Â|uüc\a%49ã·\8eUwâSG\89Ø\0÷v2P½ÞÑæ\ e`\vG6<kÓÍ~?\b\9b\18h\86j·ûÝ8Í\8d\r      Q\ 2\14{êÞj\14±×V\1c%ܹõ1\ 2Òñß®?Ý^\99«ª\9b»\85\11\ e\88®\87\15Ò\18 \ f\e¸gÁ\91»©C\ fÿ\ 5\83XÈ´endstream
+endobj
+6851 0 obj <<
+/Type /Page
+/Contents 6852 0 R
+/Resources 6850 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+6853 0 obj <<
+/D [6851 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6854 0 obj <<
+/D [6851 0 R /XYZ 71.731 814.833 null]
+>> endobj
+2122 0 obj <<
+/D [6851 0 R /XYZ 420.987 757.665 null]
+>> endobj
+3414 0 obj <<
+/D [6851 0 R /XYZ 71.731 754.588 null]
+>> endobj
+6855 0 obj <<
+/D [6851 0 R /XYZ 71.731 738.807 null]
+>> endobj
+2126 0 obj <<
+/D [6851 0 R /XYZ 379.713 719.505 null]
+>> endobj
+6856 0 obj <<
+/D [6851 0 R /XYZ 71.731 708.926 null]
+>> endobj
+6857 0 obj <<
+/D [6851 0 R /XYZ 71.731 708.926 null]
+>> endobj
+2130 0 obj <<
+/D [6851 0 R /XYZ 162.317 683.209 null]
+>> endobj
+6858 0 obj <<
+/D [6851 0 R /XYZ 304.857 667.388 null]
+>> endobj
+6859 0 obj <<
+/D [6851 0 R /XYZ 71.731 654.322 null]
+>> endobj
+2134 0 obj <<
+/D [6851 0 R /XYZ 174.677 629.099 null]
+>> endobj
+6860 0 obj <<
+/D [6851 0 R /XYZ 71.731 624.143 null]
+>> endobj
+6861 0 obj <<
+/D [6851 0 R /XYZ 71.731 621.752 null]
+>> endobj
+6862 0 obj <<
+/D [6851 0 R /XYZ 136.77 612.598 null]
+>> endobj
+6863 0 obj <<
+/D [6851 0 R /XYZ 274.512 612.598 null]
+>> endobj
+6864 0 obj <<
+/D [6851 0 R /XYZ 377.819 612.598 null]
+>> endobj
+6865 0 obj <<
+/D [6851 0 R /XYZ 407.951 612.598 null]
+>> endobj
+6866 0 obj <<
+/D [6851 0 R /XYZ 119.552 603.271 null]
+>> endobj
+6867 0 obj <<
+/D [6851 0 R /XYZ 149.683 603.271 null]
+>> endobj
+6868 0 obj <<
+/D [6851 0 R /XYZ 166.901 603.271 null]
+>> endobj
+6869 0 obj <<
+/D [6851 0 R /XYZ 71.731 589.49 null]
+>> endobj
+2138 0 obj <<
+/D [6851 0 R /XYZ 187.959 564.152 null]
+>> endobj
+6870 0 obj <<
+/D [6851 0 R /XYZ 71.731 561.588 null]
+>> endobj
+6871 0 obj <<
+/D [6851 0 R /XYZ 71.731 556.806 null]
+>> endobj
+6872 0 obj <<
+/D [6851 0 R /XYZ 71.731 556.806 null]
+>> endobj
+6873 0 obj <<
+/D [6851 0 R /XYZ 71.731 544.855 null]
+>> endobj
+6874 0 obj <<
+/D [6851 0 R /XYZ 139.477 531.806 null]
+>> endobj
+6875 0 obj <<
+/D [6851 0 R /XYZ 71.731 528.909 null]
+>> endobj
+6876 0 obj <<
+/D [6851 0 R /XYZ 71.731 528.909 null]
+>> endobj
+6877 0 obj <<
+/D [6851 0 R /XYZ 71.731 516.461 null]
+>> endobj
+6878 0 obj <<
+/D [6851 0 R /XYZ 139.477 503.413 null]
+>> endobj
+6879 0 obj <<
+/D [6851 0 R /XYZ 71.731 500.516 null]
+>> endobj
+6880 0 obj <<
+/D [6851 0 R /XYZ 71.731 500.516 null]
+>> endobj
+6881 0 obj <<
+/D [6851 0 R /XYZ 71.731 489.422 null]
+>> endobj
+6882 0 obj <<
+/D [6851 0 R /XYZ 139.477 475.019 null]
+>> endobj
+6883 0 obj <<
+/D [6851 0 R /XYZ 71.731 471.291 null]
+>> endobj
+2142 0 obj <<
+/D [6851 0 R /XYZ 202.018 448.021 null]
+>> endobj
+6884 0 obj <<
+/D [6851 0 R /XYZ 71.731 445.486 null]
+>> endobj
+3415 0 obj <<
+/D [6851 0 R /XYZ 71.731 390.503 null]
+>> endobj
+6885 0 obj <<
+/D [6851 0 R /XYZ 71.731 377.592 null]
+>> endobj
+2146 0 obj <<
+/D [6851 0 R /XYZ 338.878 355.212 null]
+>> endobj
+6886 0 obj <<
+/D [6851 0 R /XYZ 71.731 344.633 null]
+>> endobj
+6887 0 obj <<
+/D [6851 0 R /XYZ 71.731 344.633 null]
+>> endobj
+2150 0 obj <<
+/D [6851 0 R /XYZ 162.317 318.916 null]
+>> endobj
+6888 0 obj <<
+/D [6851 0 R /XYZ 292.902 303.095 null]
+>> endobj
+6889 0 obj <<
+/D [6851 0 R /XYZ 71.731 288.076 null]
+>> endobj
+2154 0 obj <<
+/D [6851 0 R /XYZ 174.677 264.806 null]
+>> endobj
+6890 0 obj <<
+/D [6851 0 R /XYZ 71.731 259.85 null]
+>> endobj
+6891 0 obj <<
+/D [6851 0 R /XYZ 71.731 257.459 null]
+>> endobj
+6892 0 obj <<
+/D [6851 0 R /XYZ 136.77 248.306 null]
+>> endobj
+6893 0 obj <<
+/D [6851 0 R /XYZ 265.903 248.306 null]
+>> endobj
+6894 0 obj <<
+/D [6851 0 R /XYZ 369.21 248.306 null]
+>> endobj
+6895 0 obj <<
+/D [6851 0 R /XYZ 399.342 248.306 null]
+>> endobj
+6896 0 obj <<
+/D [6851 0 R /XYZ 119.552 238.979 null]
+>> endobj
+6897 0 obj <<
+/D [6851 0 R /XYZ 154.023 238.979 null]
+>> endobj
+6898 0 obj <<
+/D [6851 0 R /XYZ 257.33 238.979 null]
+>> endobj
+6899 0 obj <<
+/D [6851 0 R /XYZ 287.497 238.979 null]
+>> endobj
+6900 0 obj <<
+/D [6851 0 R /XYZ 304.715 238.979 null]
+>> endobj
+6901 0 obj <<
+/D [6851 0 R /XYZ 326.524 238.979 null]
+>> endobj
+6902 0 obj <<
+/D [6851 0 R /XYZ 386.787 238.979 null]
+>> endobj
+6903 0 obj <<
+/D [6851 0 R /XYZ 404.291 238.979 null]
+>> endobj
+6904 0 obj <<
+/D [6851 0 R /XYZ 421.509 238.979 null]
+>> endobj
+6905 0 obj <<
+/D [6851 0 R /XYZ 71.731 225.197 null]
+>> endobj
+2158 0 obj <<
+/D [6851 0 R /XYZ 187.959 199.859 null]
+>> endobj
+6906 0 obj <<
+/D [6851 0 R /XYZ 71.731 197.295 null]
+>> endobj
+6907 0 obj <<
+/D [6851 0 R /XYZ 71.731 192.513 null]
+>> endobj
+6908 0 obj <<
+/D [6851 0 R /XYZ 71.731 192.513 null]
+>> endobj
+6909 0 obj <<
+/D [6851 0 R /XYZ 71.731 180.562 null]
+>> endobj
+6910 0 obj <<
+/D [6851 0 R /XYZ 139.477 167.514 null]
+>> endobj
+6911 0 obj <<
+/D [6851 0 R /XYZ 71.731 164.616 null]
+>> endobj
+6912 0 obj <<
+/D [6851 0 R /XYZ 71.731 164.616 null]
+>> endobj
+6913 0 obj <<
+/D [6851 0 R /XYZ 71.731 152.168 null]
+>> endobj
+6914 0 obj <<
+/D [6851 0 R /XYZ 139.477 139.12 null]
+>> endobj
+6915 0 obj <<
+/D [6851 0 R /XYZ 71.731 136.223 null]
+>> endobj
+6916 0 obj <<
+/D [6851 0 R /XYZ 71.731 136.223 null]
+>> endobj
+6917 0 obj <<
+/D [6851 0 R /XYZ 71.731 123.775 null]
+>> endobj
+6918 0 obj <<
+/D [6851 0 R /XYZ 139.477 110.726 null]
+>> endobj
+6919 0 obj <<
+/D [6851 0 R /XYZ 71.731 107.829 null]
+>> endobj
+6920 0 obj <<
+/D [6851 0 R /XYZ 71.731 107.829 null]
+>> endobj
+6921 0 obj <<
+/D [6851 0 R /XYZ 71.731 96.736 null]
+>> endobj
+6922 0 obj <<
+/D [6851 0 R /XYZ 139.477 82.333 null]
+>> endobj
+6923 0 obj <<
+/D [6851 0 R /XYZ 71.731 79.436 null]
+>> endobj
+6924 0 obj <<
+/D [6851 0 R /XYZ 71.731 79.436 null]
+>> endobj
+6925 0 obj <<
+/D [6851 0 R /XYZ 71.731 68.342 null]
+>> endobj
+6926 0 obj <<
+/D [6851 0 R /XYZ 139.477 53.939 null]
+>> endobj
+6850 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6930 0 obj <<
+/Length 1305      
+/Filter /FlateDecode
+>>
+stream
+xÚµX[oÛ6\14~ϯð£<Ô,o"%ì)KÛ¡ÃÐ\r\89±\97e\b\14\99q4È\92¢K\9büû\1dÞ$Ú\96\93®HP\14"­ÃsùÎ\85_D\16\18þ\91\85$H2²H0E\89L\16ùî\f/¶ðæ×3â$VNd\15Èü²>{ÿ\89ÑE\8a\16ë»\ 5M\12Ĺ\0=\ 2q\11\9b¿£\8bû¬éU»\Q\99D\ 4ÙçïE5<¾¿\/       ÆÑ
+vK\12\r\8föÝÅù\17»øÐ\16_ýÁk\1cc\10\83w°"Ë\7fÖ¿\9d}\\8fÎÅ\94 ðã9÷\9dÈ\91û1\99Ü'$EqL\172N\10\860´ûM[Ô\87æF9Î\10g|Î\1eER¤°
+^\1d>G×\b¥à\9a\86xÒg|£2ð\8dSDÁ'/£}«\9b¾¨«¬´\10iOÛ¢\7f²»úÎ>wªë2@w«t\14 \93\82û(\8dc­t\ 5\96EÊá)P\9a¦Fé\aÕåma4»\13\81\17\18¼\8d\11ãÔ\88^e;¥­à(ë¬,\ f\8a\81\13D\12\ 6G´h\9eU\ f\83ºÙªþ¦¨º²îy±9Vï\81µgÞYÝê1WMï6ý}ÖÃJ¤QÑÛ_¾-I\12eEßÙí]ݺE«\9c\9c]A\9d\99³yÖ)}l_)¬ÀÇÁ\0\ 5q
+\f\ 5\1fëô\0\6ࢳ Þ\reé*ùÓPå\ 6+³ó\ 2\1d Þ¨¼¸Æ\98æîLÝ\ 6µo\97C§Ú®Ére·ùRFe¡*\88\85Æ\11\9aI\18v©J\8c;\97ª\1fZm9\91Ñ_KÉ£¬\1cÔé¤1sè³+\8cþ^µjßëªöne·¥{\a8E\9b­ÛTj\9bõÐ\94v÷Õ\98ÛÓÐ\1a\8fÔ&ð]"Jl±q\89\12]æ1A±`\87eQ\ f½NÔÍ7ÈåMÛ\97\93\ 6\ e¾\vSQN\ 1\13\88¦¶=¿è\12<*=\e±\96\bD6Ù      «Pp\ 4ÿ]\15^S*}p¹\1a\83÷Ùôåw\90äVé¦Û¸fô\15\18\blA\93+\1aUmº¹æô~¬(d\8fÙ\94_=UuÓ\15S»ID$÷1\vdgnQõV Æ\93\80ÉDrÜ\8fóÀ\87ª     Å(¦# 0\8a»¾\1dr\bIÀøvªt\147î§\9f\9cu\12èÀ\f1ìÍ?L1\87\86`FÇ4h\7f­kÎ\14\14ähjÆ\16ô\b\84i\9fÂ`\95Î"\1cjfLB\9d\88\97M\1a\84\9e1ItÞ\88pz´t3\1f^\9cL0\92\9f\1e\83×L@\99§\b\ 6¢\11>o·ÃÎ\f\ 6oy¯Ö%L*¾\ fìÜ}ÅáÉÓW»®&u'o+'¢=3\8eÙn0ð\ e~úܪ²®¶Eµus úÆÍ¡<+Ëñ÷¼Þí\86ªÈ³iÚÖ·ÿª¼?\86d¼Ö\bC2!\aù\9fC\86¥\ 4a\18\ 5M ï$6^Æ°\8c\ 4úÚ£T{\84\9a\1a\1aÚ3!ÿþNã4T\e7C6þ\82\7f       \88±6gq\80Æ\91\98½\1e\ e\93¾Ó88\99\1fÄ¡\ 5\1cì`Þ\ 4ÃöÕ¹ÎúÞ³\89l§-\9eæ=о)Üx{s¶WÝ8hçh\ f\83qÅçhÏi®£\7f®<\7f\84¼\ 6ÞO¼f¼ì±½ªá¥½ì±¾©à\9a²\94G\ 2·LÒ=Êó\1dW\97á*\8e\f\ 14³|è-ÉPú#dÈF÷% 4r"4\ 2 \ 5\17wÆô;ûÒ\83)'0\85\8bO:0¥\ 3Ó,!ÛÍàNt¥nV·q±Ë  G¹\8f£\8cþ\2P\0gºâÐ;\9d(ì2DöH©z\18ü\9f\ 2¾7\aØá©     Iµ9$$÷YçÇ°O*LÝ\1aƬï§Û§\ 3eEå\ 2\ 3=ÅÆ\14ÜË|\8f\87íÐ=UùÛ\11½9ía·¹átHïN09@cÂÌaÕhêXçð§\95¾\9eæîp?\0ß\8eºÍD\19êL1b){\ 5Ê&¿\83²±ÿGÙæLI$\b\19M\8d·ÙIv8Ò§ð\1asß((G)øýÜW\8c\7fÄ\90(\95Úʾ\ e\8f\8b\8f\97çnÂ}¾ZÛ\ 5\8b        ¦ÖÇð\v\b\8aÇ@Ä©/\15Ç\1eþ\aòJoóendstream
+endobj
+6929 0 obj <<
+/Type /Page
+/Contents 6930 0 R
+/Resources 6928 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+6931 0 obj <<
+/D [6929 0 R /XYZ 71.731 802.878 null]
+>> endobj
+6932 0 obj <<
+/D [6929 0 R /XYZ 71.731 814.833 null]
+>> endobj
+6933 0 obj <<
+/D [6929 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6934 0 obj <<
+/D [6929 0 R /XYZ 71.731 768.009 null]
+>> endobj
+6935 0 obj <<
+/D [6929 0 R /XYZ 71.731 756.482 null]
+>> endobj
+6936 0 obj <<
+/D [6929 0 R /XYZ 139.477 743.434 null]
+>> endobj
+2162 0 obj <<
+/D [6929 0 R /XYZ 192.609 716.435 null]
+>> endobj
+6937 0 obj <<
+/D [6929 0 R /XYZ 71.731 711.48 null]
+>> endobj
+6938 0 obj <<
+/D [6929 0 R /XYZ 160.735 701.093 null]
+>> endobj
+6939 0 obj <<
+/D [6929 0 R /XYZ 71.731 684.414 null]
+>> endobj
+2166 0 obj <<
+/D [6929 0 R /XYZ 202.018 661.143 null]
+>> endobj
+6940 0 obj <<
+/D [6929 0 R /XYZ 71.731 658.608 null]
+>> endobj
+3416 0 obj <<
+/D [6929 0 R /XYZ 71.731 629.528 null]
+>> endobj
+6941 0 obj <<
+/D [6929 0 R /XYZ 71.731 616.617 null]
+>> endobj
+2170 0 obj <<
+/D [6929 0 R /XYZ 322.627 594.237 null]
+>> endobj
+6942 0 obj <<
+/D [6929 0 R /XYZ 71.731 583.658 null]
+>> endobj
+6943 0 obj <<
+/D [6929 0 R /XYZ 71.731 583.658 null]
+>> endobj
+2174 0 obj <<
+/D [6929 0 R /XYZ 162.317 557.941 null]
+>> endobj
+6944 0 obj <<
+/D [6929 0 R /XYZ 280.946 542.12 null]
+>> endobj
+6945 0 obj <<
+/D [6929 0 R /XYZ 71.731 540.053 null]
+>> endobj
+2178 0 obj <<
+/D [6929 0 R /XYZ 174.677 516.782 null]
+>> endobj
+6946 0 obj <<
+/D [6929 0 R /XYZ 71.731 511.827 null]
+>> endobj
+6947 0 obj <<
+/D [6929 0 R /XYZ 71.731 509.436 null]
+>> endobj
+6948 0 obj <<
+/D [6929 0 R /XYZ 136.77 500.282 null]
+>> endobj
+6949 0 obj <<
+/D [6929 0 R /XYZ 257.294 500.282 null]
+>> endobj
+6950 0 obj <<
+/D [6929 0 R /XYZ 360.601 500.282 null]
+>> endobj
+6951 0 obj <<
+/D [6929 0 R /XYZ 390.733 500.282 null]
+>> endobj
+6952 0 obj <<
+/D [6929 0 R /XYZ 119.552 490.955 null]
+>> endobj
+6953 0 obj <<
+/D [6929 0 R /XYZ 154.023 490.955 null]
+>> endobj
+6954 0 obj <<
+/D [6929 0 R /XYZ 257.33 490.955 null]
+>> endobj
+6955 0 obj <<
+/D [6929 0 R /XYZ 71.731 477.174 null]
+>> endobj
+2182 0 obj <<
+/D [6929 0 R /XYZ 187.959 451.836 null]
+>> endobj
+6956 0 obj <<
+/D [6929 0 R /XYZ 71.731 449.271 null]
+>> endobj
+6957 0 obj <<
+/D [6929 0 R /XYZ 71.731 444.489 null]
+>> endobj
+6958 0 obj <<
+/D [6929 0 R /XYZ 71.731 444.489 null]
+>> endobj
+6959 0 obj <<
+/D [6929 0 R /XYZ 71.731 432.538 null]
+>> endobj
+6960 0 obj <<
+/D [6929 0 R /XYZ 139.477 419.49 null]
+>> endobj
+6961 0 obj <<
+/D [6929 0 R /XYZ 71.731 416.593 null]
+>> endobj
+6962 0 obj <<
+/D [6929 0 R /XYZ 71.731 416.593 null]
+>> endobj
+6963 0 obj <<
+/D [6929 0 R /XYZ 71.731 404.145 null]
+>> endobj
+6964 0 obj <<
+/D [6929 0 R /XYZ 139.477 391.096 null]
+>> endobj
+6965 0 obj <<
+/D [6929 0 R /XYZ 71.731 388.199 null]
+>> endobj
+6966 0 obj <<
+/D [6929 0 R /XYZ 71.731 388.199 null]
+>> endobj
+6967 0 obj <<
+/D [6929 0 R /XYZ 71.731 375.751 null]
+>> endobj
+6968 0 obj <<
+/D [6929 0 R /XYZ 139.477 362.703 null]
+>> endobj
+6969 0 obj <<
+/D [6929 0 R /XYZ 71.731 358.975 null]
+>> endobj
+2186 0 obj <<
+/D [6929 0 R /XYZ 192.609 335.704 null]
+>> endobj
+6970 0 obj <<
+/D [6929 0 R /XYZ 71.731 330.749 null]
+>> endobj
+6971 0 obj <<
+/D [6929 0 R /XYZ 179.467 320.362 null]
+>> endobj
+6972 0 obj <<
+/D [6929 0 R /XYZ 71.731 303.682 null]
+>> endobj
+2190 0 obj <<
+/D [6929 0 R /XYZ 202.018 280.411 null]
+>> endobj
+6973 0 obj <<
+/D [6929 0 R /XYZ 71.731 277.877 null]
+>> endobj
+3417 0 obj <<
+/D [6929 0 R /XYZ 71.731 235.846 null]
+>> endobj
+6974 0 obj <<
+/D [6929 0 R /XYZ 71.731 222.934 null]
+>> endobj
+2194 0 obj <<
+/D [6929 0 R /XYZ 264.611 200.554 null]
+>> endobj
+6975 0 obj <<
+/D [6929 0 R /XYZ 71.731 189.975 null]
+>> endobj
+6976 0 obj <<
+/D [6929 0 R /XYZ 71.731 189.975 null]
+>> endobj
+2198 0 obj <<
+/D [6929 0 R /XYZ 162.317 164.258 null]
+>> endobj
+6977 0 obj <<
+/D [6929 0 R /XYZ 239.103 148.437 null]
+>> endobj
+6978 0 obj <<
+/D [6929 0 R /XYZ 71.731 146.37 null]
+>> endobj
+2202 0 obj <<
+/D [6929 0 R /XYZ 174.677 123.099 null]
+>> endobj
+6979 0 obj <<
+/D [6929 0 R /XYZ 71.731 118.144 null]
+>> endobj
+6980 0 obj <<
+/D [6929 0 R /XYZ 71.731 115.753 null]
+>> endobj
+6981 0 obj <<
+/D [6929 0 R /XYZ 136.77 106.599 null]
+>> endobj
+6982 0 obj <<
+/D [6929 0 R /XYZ 227.163 106.599 null]
+>> endobj
+6983 0 obj <<
+/D [6929 0 R /XYZ 330.47 106.599 null]
+>> endobj
+6984 0 obj <<
+/D [6929 0 R /XYZ 360.601 106.599 null]
+>> endobj
+6985 0 obj <<
+/D [6929 0 R /XYZ 459.604 106.599 null]
+>> endobj
+6986 0 obj <<
+/D [6929 0 R /XYZ 71.731 92.818 null]
+>> endobj
+6928 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+6989 0 obj <<
+/Length 1093      
+/Filter /FlateDecode
+>>
+stream
+xÚÅWÛ\8e£F\10}\9f¯à\11¢uO_\80\ 6åi2»\8e6\8af£Y+/\99h\84qÛ&2´\97Ëdg¿~«o\80/Ä»\89¥\88\a\8a¦º8uªú4M<\f\17ñ8A\9c\11\14%<ñòò\ 6{\exóó\r±\1e3ë2\eùü´¸¹\9d3ê¥(\8d\99·X{4IP\18Æ\10'Fa\1cy\8bÕ\1fþý6Û·¢\ ef\94'>AæþkQu\9fo\1f\17\ 1ÁØ\9fÁS@üî³yw\7f÷`\8c·uñâ&>á\b\83\e¼\ 3\8b\ 4\7f.~¹y·èÁE\94 ÀñOð­Ë        |J=BP\1aE
+?!)\8a"êñ(A\18òPøïêMW\8aªmÔGoç\11\19ÒÅÞ\8cp`\85iÇO¢Z5ÇÈú\884B\1c\93sÐ(âq
+ÖèÕñ½Ï\82P
+Y¨j\fñL\1a|\80EB\8a( w>
+\9cƦ\99lÚºËÛ®\16æq)v²Ú\14ÕÆ<¶P\biÌ<Ûíúñ\\96eW\15\16²2Crù\97ÈÛSVf\801NC\0Ë\10O¨åfµ\11SÜÄ)G\fó«q3\8a\8dóQàö²¨ú\ emmö\ eðQ\87ôÉÑ\18¥iªç¿\15M^\17\8c\99Á\ f{$B,4<Ì»*W~¶\16\7f\a$ñ³¢µ\8fkiA\bµ\1e\ÁÚ:«\9a\1dÀ:\8cå¾}uUÍZ¡¢¡3 ñ\ 1ÜG\ 1ÕW±\12îÿ\1eðÐÏv\9d¸\ 4ü·\80q_*\18/ªq"â¿èiÚ,ª\95ê\fÑ\ 44òß\98±v\9bµÆÒL\1aËâ\ 5³Q\8d¦ ë§mÖ\18c)De¬ZdyÀý­X!3ð 6ÙðuÍ\14Ü¿\88Z\8eñ@\1a\1a9\85Ü\rò¢\ 2ZKËe¶\94]ÛÓ(êº\ 3\18 O«ÃzØ\ 6·Õ\90íÖuǾ\96Ë\9d(G$sD\89é\8c\90£Dµ_DP\14\eIȳêS'\9e\9f0¦kù\TEû\·»ar\büÆj²\9bËbDS£;\ fYi«\12Òãª(ßQüuq\1a}Üóva`=ç\89\18\80rf»â\8b\95\ 2YYã^ÑàTx\ e\f½\9f\7f\16ú\15\aBÃX¢Ã\7f|­ä¾)\9a\1e:G\84\87\ ez\8c"[\14'\1cxpÐ\&\16ætjã\98)F,e.3Ø#\8cº\ 5³\18ö\95q\b;ôC/WÃW1ÓJ`b(çÓÏ\1c {cB\r)\8c\82QU\e\17«Ùɶ©êÓp\fP'é\80\9aüxVi\12h\ f\19K\11Hå·nFáA\1eçô\96%Jî&·C¸Iµµ.\93b\v\vÌ6\9bê´a\9b\82ÖÓ;Õ\85=\86\1cÓ}6ë(Ôkëji\ fñ¦ó¶>
+^Õ\95K\97·\\9b{- A\9b^~t\ 6\177\9däߨ¸Ñ£\85æ\19\94¼Rb
\1a=\85\ 1§æ`\9e¨9\8b\9d\9aÃ[¥\85Â\f\16\8d\r&ͽ\14¥¬_í\ 4;\ 6ÿ\1027:\ f£Í>ËíWÌ^g\ 2\9a\97\ 3\19c\11'\93äõMch\ 3°\97e9<#Ë+нkÉò\89t\1d\ 5ÿ\ 6U^×B4ãÄÌÆeyÔ\9dÂ\87?\85C©¾¦NÛ\1fÇïSêÃtÿo¥\9e\96V\9a Ââï\95VvQZAç0½Þ_þ\10nRb¬Ë\7f\91Öq"ö\94GC\94\9eÿ#ïÏ\81\83\8b;\ 6r\94r\ 5í0\86BöáþÝã\9d=ú½ÿ¸0\ 6\8b\b¦\86ìñ\192d       \8a\88[\171\9d\9d
+[ý§eendstream
+endobj
+6988 0 obj <<
+/Type /Page
+/Contents 6989 0 R
+/Resources 6987 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+6990 0 obj <<
+/D [6988 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2206 0 obj <<
+/D [6988 0 R /XYZ 187.959 758.046 null]
+>> endobj
+6991 0 obj <<
+/D [6988 0 R /XYZ 71.731 755.482 null]
+>> endobj
+6992 0 obj <<
+/D [6988 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6993 0 obj <<
+/D [6988 0 R /XYZ 71.731 750.7 null]
+>> endobj
+6994 0 obj <<
+/D [6988 0 R /XYZ 71.731 738.749 null]
+>> endobj
+6995 0 obj <<
+/D [6988 0 R /XYZ 139.477 725.701 null]
+>> endobj
+6996 0 obj <<
+/D [6988 0 R /XYZ 71.731 710.355 null]
+>> endobj
+6997 0 obj <<
+/D [6988 0 R /XYZ 139.477 697.307 null]
+>> endobj
+6998 0 obj <<
+/D [6988 0 R /XYZ 71.731 693.579 null]
+>> endobj
+2210 0 obj <<
+/D [6988 0 R /XYZ 192.609 670.308 null]
+>> endobj
+6999 0 obj <<
+/D [6988 0 R /XYZ 71.731 665.353 null]
+>> endobj
+7000 0 obj <<
+/D [6988 0 R /XYZ 71.731 651.238 null]
+>> endobj
+2214 0 obj <<
+/D [6988 0 R /XYZ 202.018 627.967 null]
+>> endobj
+7001 0 obj <<
+/D [6988 0 R /XYZ 71.731 625.433 null]
+>> endobj
+3418 0 obj <<
+/D [6988 0 R /XYZ 71.731 583.401 null]
+>> endobj
+7002 0 obj <<
+/D [6988 0 R /XYZ 71.731 570.49 null]
+>> endobj
+2218 0 obj <<
+/D [6988 0 R /XYZ 245.468 548.11 null]
+>> endobj
+7003 0 obj <<
+/D [6988 0 R /XYZ 71.731 537.531 null]
+>> endobj
+7004 0 obj <<
+/D [6988 0 R /XYZ 71.731 537.531 null]
+>> endobj
+2222 0 obj <<
+/D [6988 0 R /XYZ 162.317 511.814 null]
+>> endobj
+7005 0 obj <<
+/D [6988 0 R /XYZ 239.103 495.993 null]
+>> endobj
+7006 0 obj <<
+/D [6988 0 R /XYZ 71.731 494.429 null]
+>> endobj
+2226 0 obj <<
+/D [6988 0 R /XYZ 174.677 470.655 null]
+>> endobj
+7007 0 obj <<
+/D [6988 0 R /XYZ 71.731 465.7 null]
+>> endobj
+7008 0 obj <<
+/D [6988 0 R /XYZ 71.731 463.309 null]
+>> endobj
+7009 0 obj <<
+/D [6988 0 R /XYZ 136.77 454.155 null]
+>> endobj
+7010 0 obj <<
+/D [6988 0 R /XYZ 227.163 454.155 null]
+>> endobj
+7011 0 obj <<
+/D [6988 0 R /XYZ 330.47 454.155 null]
+>> endobj
+7012 0 obj <<
+/D [6988 0 R /XYZ 356.297 454.155 null]
+>> endobj
+7013 0 obj <<
+/D [6988 0 R /XYZ 373.515 454.155 null]
+>> endobj
+7014 0 obj <<
+/D [6988 0 R /XYZ 71.731 440.374 null]
+>> endobj
+2230 0 obj <<
+/D [6988 0 R /XYZ 187.959 415.036 null]
+>> endobj
+7015 0 obj <<
+/D [6988 0 R /XYZ 71.731 412.471 null]
+>> endobj
+7016 0 obj <<
+/D [6988 0 R /XYZ 71.731 407.689 null]
+>> endobj
+7017 0 obj <<
+/D [6988 0 R /XYZ 71.731 407.689 null]
+>> endobj
+7018 0 obj <<
+/D [6988 0 R /XYZ 71.731 397.093 null]
+>> endobj
+7019 0 obj <<
+/D [6988 0 R /XYZ 139.477 382.69 null]
+>> endobj
+7020 0 obj <<
+/D [6988 0 R /XYZ 71.731 379.793 null]
+>> endobj
+7021 0 obj <<
+/D [6988 0 R /XYZ 71.731 379.793 null]
+>> endobj
+7022 0 obj <<
+/D [6988 0 R /XYZ 71.731 368.699 null]
+>> endobj
+7023 0 obj <<
+/D [6988 0 R /XYZ 139.477 354.296 null]
+>> endobj
+7024 0 obj <<
+/D [6988 0 R /XYZ 71.731 350.568 null]
+>> endobj
+2234 0 obj <<
+/D [6988 0 R /XYZ 202.018 327.298 null]
+>> endobj
+7025 0 obj <<
+/D [6988 0 R /XYZ 71.731 324.763 null]
+>> endobj
+3419 0 obj <<
+/D [6988 0 R /XYZ 71.731 282.732 null]
+>> endobj
+7026 0 obj <<
+/D [6988 0 R /XYZ 71.731 269.82 null]
+>> endobj
+2238 0 obj <<
+/D [6988 0 R /XYZ 257.278 247.44 null]
+>> endobj
+7027 0 obj <<
+/D [6988 0 R /XYZ 71.731 236.861 null]
+>> endobj
+7028 0 obj <<
+/D [6988 0 R /XYZ 71.731 236.861 null]
+>> endobj
+2242 0 obj <<
+/D [6988 0 R /XYZ 162.317 211.144 null]
+>> endobj
+7029 0 obj <<
+/D [6988 0 R /XYZ 239.103 195.324 null]
+>> endobj
+7030 0 obj <<
+/D [6988 0 R /XYZ 71.731 193.76 null]
+>> endobj
+2246 0 obj <<
+/D [6988 0 R /XYZ 174.677 169.986 null]
+>> endobj
+7031 0 obj <<
+/D [6988 0 R /XYZ 71.731 165.03 null]
+>> endobj
+7032 0 obj <<
+/D [6988 0 R /XYZ 71.731 162.639 null]
+>> endobj
+7033 0 obj <<
+/D [6988 0 R /XYZ 136.77 153.485 null]
+>> endobj
+7034 0 obj <<
+/D [6988 0 R /XYZ 227.163 153.485 null]
+>> endobj
+7035 0 obj <<
+/D [6988 0 R /XYZ 330.47 153.485 null]
+>> endobj
+7036 0 obj <<
+/D [6988 0 R /XYZ 71.731 139.704 null]
+>> endobj
+2250 0 obj <<
+/D [6988 0 R /XYZ 187.959 114.366 null]
+>> endobj
+7037 0 obj <<
+/D [6988 0 R /XYZ 71.731 111.802 null]
+>> endobj
+7038 0 obj <<
+/D [6988 0 R /XYZ 71.731 107.02 null]
+>> endobj
+7039 0 obj <<
+/D [6988 0 R /XYZ 71.731 107.02 null]
+>> endobj
+7040 0 obj <<
+/D [6988 0 R /XYZ 71.731 96.424 null]
+>> endobj
+7041 0 obj <<
+/D [6988 0 R /XYZ 139.477 82.021 null]
+>> endobj
+3420 0 obj <<
+/D [6988 0 R /XYZ 71.731 65.749 null]
+>> endobj
+6987 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7044 0 obj <<
+/Length 1085      
+/Filter /FlateDecode
+>>
+stream
+xÚµW[oÛ6\18}ϯУ=L,/¢(bOYÖ\r\e\82\14H½½4E Êt,Ô\96\1c]\92x¿~\1fEJ¢.vÓ!\85\1fDSßõððP$\1e\86\1fñ\ 4A\82\11\14E"ò\92ý\ 5ö\1eàÍ\1f\17ÄZøÖÄwl~]]¼û\9dQO"\192oµñh\14¡ \b!N\88\82\90{«õ§ÅÕ6>TªXúTD\v\82Ìó:Íê\97w·«%Áxáÿ%YÔ/æÝÕå\8d\19üV¤O­ã\1dæ\18Ìà\1d\8cÈòóê¯\8b÷«®8N \82\95oM&åSê\11\81(áº~Û£à\1cq)\9aò\938{¬Õ}¦\9eïÕúAÝ\17ÕNg7\8e\ 1bÐ-8\ 6\ 2E\14²°\10Q\196\8e7ñ^\19ËÀA\b{>á\8díùà¢w!$\844\f\µË\1d¥Â@\12ïvy\12WÊü\83\18\ 3\99QY\15\9aTuag\0çæYmí\84³\ 2-üI\9eUê¥ê\9b$Hò\ 6\1d¿­Ä§\1c1\165õ|<fù¡LË®U\81\88\bÚVCdH KIª¥\1fB2ÛtÓ°\9dúÉxsÜ{K\890¦¶é\938¹ù¢\10áH¶0\ 1_ÒÌvÁIo\ 54à´\ 5³ÜåU\99\15ÓX\f#æÆ"¿ÌáA\99\80"\ 1\ f&\11!²1¾,\1eê½Êª²K=X{\ 1\ 4\vƹ]*C\1cÄ9õ¸ÄP\8c\98ã2E"Ôµ9¯ÆÏ\8eö\84R ½æ\7f\1fÏðÞeX@\11\ 5"·6º¼B=Öi¡Ö\96]õþK»\15ó\8d¥\97nÀò
+h6¦\16,Öî8dêz\8e¡\86\9esèR\14Ê\0\9e!\92Ò\80{«ÀX'\8aÄâ\9f¥\b r­¦;Æl2\ 6\vÚ;A¥L\ 6\8bC\ e¬Ð\9d\17Un&\9dúô_Ý\981èëk^äÅtCSà¸\f[ªÜü}}=­\87\82:°Ö$Ý\98`\0\94\89Ë\17©-.kóª,¯\1f¶fr¯öyq´>¹\ e\ e\90\ 4\ 1\8a\97\17à2m\1e\8a<Q¥]\90ü \8a¸Jó\fõÈv*ç·jÅa/è
\1d¦÷X^¥\9bã\8f\90¹¹à¯\909ís\aR\904ýX\8d\82\15û\12'K±øj&¶@À8[ïZ\8enòÂ9hÌ°.UQ\1eâÄrO{ïÒ~§¾\95Ô=åéz*g\8dì\fål\ 6\8f³r6§¡Ùº\1ck¨£u\ 43Ä°°1\1eµõ4Ï@\10\7f6±^)×\83T\ 2\85\84t©ô\16\9fOE\87©fE\1a\b\ 6¦0ö%¨\97\11¤çm\MC6¬\8e¾%ÔÖê\7fét\aÛ\9cJ3\1c5u¾\95J;ñNªtkÓlúVÎ\1aéÍG\12<Ù&¥\16êµ}Ûô5'Ã.\16\9d
+\13\86DD\86«;\87\b\8dà\f\ 1÷BÄ\89w\12\91ÖF\17×\1f.ÏÛT·¾m?}\9eò¯ÝqÖi
+àÑÈÊ7\1a§\ 3
+Îö\rb*¢·;¯\9dx§û¶6º¶9\99¬\8e\a5§ÿ\ 2#\ eC£ÿÁP\92\1aII³´zÍ\11À¿ÿ\b\98\8bï¶Æ\ 2DE89\ 5æ>T{\ 17,>¨\ 4\96Ó 0¦¸Î\98Æ»ô߸_î\91FØÌ߯ø½\84á\13Ât®{7êà£÷Gk>\1d«¦Kk{\13¢\ 1\92X\9c½\ fö&íuP }wÚ\8cbèT\1f®Þß^Ú+à\9f\1fWfÀ8ÁÔÔèÞ%\ 3\ 6\9d(!;qç\9b\1f«        µæendstream
+endobj
+7043 0 obj <<
+/Type /Page
+/Contents 7044 0 R
+/Resources 7042 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+7045 0 obj <<
+/D [7043 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7046 0 obj <<
+/D [7043 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2254 0 obj <<
+/D [7043 0 R /XYZ 263.338 755.597 null]
+>> endobj
+7047 0 obj <<
+/D [7043 0 R /XYZ 71.731 745.018 null]
+>> endobj
+7048 0 obj <<
+/D [7043 0 R /XYZ 71.731 745.018 null]
+>> endobj
+2258 0 obj <<
+/D [7043 0 R /XYZ 162.317 719.301 null]
+>> endobj
+7049 0 obj <<
+/D [7043 0 R /XYZ 233.126 703.48 null]
+>> endobj
+7050 0 obj <<
+/D [7043 0 R /XYZ 71.731 701.413 null]
+>> endobj
+2262 0 obj <<
+/D [7043 0 R /XYZ 174.677 678.142 null]
+>> endobj
+7051 0 obj <<
+/D [7043 0 R /XYZ 71.731 673.187 null]
+>> endobj
+7052 0 obj <<
+/D [7043 0 R /XYZ 71.731 670.796 null]
+>> endobj
+7053 0 obj <<
+/D [7043 0 R /XYZ 218.554 661.642 null]
+>> endobj
+7054 0 obj <<
+/D [7043 0 R /XYZ 304.643 661.642 null]
+>> endobj
+7055 0 obj <<
+/D [7043 0 R /XYZ 326.166 661.642 null]
+>> endobj
+7056 0 obj <<
+/D [7043 0 R /XYZ 71.731 647.861 null]
+>> endobj
+2266 0 obj <<
+/D [7043 0 R /XYZ 187.959 622.523 null]
+>> endobj
+7057 0 obj <<
+/D [7043 0 R /XYZ 71.731 619.958 null]
+>> endobj
+7058 0 obj <<
+/D [7043 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7059 0 obj <<
+/D [7043 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7060 0 obj <<
+/D [7043 0 R /XYZ 71.731 604.58 null]
+>> endobj
+7061 0 obj <<
+/D [7043 0 R /XYZ 139.477 590.177 null]
+>> endobj
+7062 0 obj <<
+/D [7043 0 R /XYZ 71.731 586.449 null]
+>> endobj
+2270 0 obj <<
+/D [7043 0 R /XYZ 202.018 563.178 null]
+>> endobj
+7063 0 obj <<
+/D [7043 0 R /XYZ 71.731 560.644 null]
+>> endobj
+7064 0 obj <<
+/D [7043 0 R /XYZ 336.521 547.836 null]
+>> endobj
+3421 0 obj <<
+/D [7043 0 R /XYZ 71.731 518.612 null]
+>> endobj
+7065 0 obj <<
+/D [7043 0 R /XYZ 71.731 505.701 null]
+>> endobj
+2274 0 obj <<
+/D [7043 0 R /XYZ 250.891 483.321 null]
+>> endobj
+7066 0 obj <<
+/D [7043 0 R /XYZ 71.731 472.742 null]
+>> endobj
+7067 0 obj <<
+/D [7043 0 R /XYZ 71.731 472.742 null]
+>> endobj
+2278 0 obj <<
+/D [7043 0 R /XYZ 162.317 447.025 null]
+>> endobj
+7068 0 obj <<
+/D [7043 0 R /XYZ 233.126 431.204 null]
+>> endobj
+7069 0 obj <<
+/D [7043 0 R /XYZ 71.731 429.137 null]
+>> endobj
+2282 0 obj <<
+/D [7043 0 R /XYZ 174.677 405.866 null]
+>> endobj
+7070 0 obj <<
+/D [7043 0 R /XYZ 71.731 400.911 null]
+>> endobj
+7071 0 obj <<
+/D [7043 0 R /XYZ 71.731 398.52 null]
+>> endobj
+7072 0 obj <<
+/D [7043 0 R /XYZ 141.074 389.366 null]
+>> endobj
+7073 0 obj <<
+/D [7043 0 R /XYZ 227.163 389.366 null]
+>> endobj
+7074 0 obj <<
+/D [7043 0 R /XYZ 330.47 389.366 null]
+>> endobj
+7075 0 obj <<
+/D [7043 0 R /XYZ 360.601 389.366 null]
+>> endobj
+7076 0 obj <<
+/D [7043 0 R /XYZ 459.604 389.366 null]
+>> endobj
+7077 0 obj <<
+/D [7043 0 R /XYZ 489.735 389.366 null]
+>> endobj
+7078 0 obj <<
+/D [7043 0 R /XYZ 119.552 380.039 null]
+>> endobj
+7079 0 obj <<
+/D [7043 0 R /XYZ 71.731 366.258 null]
+>> endobj
+2286 0 obj <<
+/D [7043 0 R /XYZ 187.959 340.92 null]
+>> endobj
+7080 0 obj <<
+/D [7043 0 R /XYZ 71.731 338.355 null]
+>> endobj
+7081 0 obj <<
+/D [7043 0 R /XYZ 71.731 333.573 null]
+>> endobj
+7082 0 obj <<
+/D [7043 0 R /XYZ 71.731 333.573 null]
+>> endobj
+7083 0 obj <<
+/D [7043 0 R /XYZ 71.731 321.622 null]
+>> endobj
+7084 0 obj <<
+/D [7043 0 R /XYZ 139.477 308.574 null]
+>> endobj
+7085 0 obj <<
+/D [7043 0 R /XYZ 71.731 305.677 null]
+>> endobj
+7086 0 obj <<
+/D [7043 0 R /XYZ 71.731 305.677 null]
+>> endobj
+7087 0 obj <<
+/D [7043 0 R /XYZ 71.731 293.229 null]
+>> endobj
+7088 0 obj <<
+/D [7043 0 R /XYZ 139.477 280.181 null]
+>> endobj
+7089 0 obj <<
+/D [7043 0 R /XYZ 71.731 277.284 null]
+>> endobj
+7090 0 obj <<
+/D [7043 0 R /XYZ 71.731 277.284 null]
+>> endobj
+7091 0 obj <<
+/D [7043 0 R /XYZ 71.731 266.19 null]
+>> endobj
+7092 0 obj <<
+/D [7043 0 R /XYZ 139.477 251.787 null]
+>> endobj
+3422 0 obj <<
+/D [7043 0 R /XYZ 71.731 235.515 null]
+>> endobj
+7093 0 obj <<
+/D [7043 0 R /XYZ 71.731 222.603 null]
+>> endobj
+2290 0 obj <<
+/D [7043 0 R /XYZ 279.899 200.223 null]
+>> endobj
+7094 0 obj <<
+/D [7043 0 R /XYZ 71.731 189.645 null]
+>> endobj
+7095 0 obj <<
+/D [7043 0 R /XYZ 71.731 189.645 null]
+>> endobj
+2294 0 obj <<
+/D [7043 0 R /XYZ 162.317 163.928 null]
+>> endobj
+7096 0 obj <<
+/D [7043 0 R /XYZ 251.059 148.107 null]
+>> endobj
+7097 0 obj <<
+/D [7043 0 R /XYZ 71.731 146.04 null]
+>> endobj
+2298 0 obj <<
+/D [7043 0 R /XYZ 174.677 122.769 null]
+>> endobj
+7098 0 obj <<
+/D [7043 0 R /XYZ 71.731 117.814 null]
+>> endobj
+7099 0 obj <<
+/D [7043 0 R /XYZ 71.731 115.422 null]
+>> endobj
+7100 0 obj <<
+/D [7043 0 R /XYZ 136.77 106.269 null]
+>> endobj
+7101 0 obj <<
+/D [7043 0 R /XYZ 235.772 106.269 null]
+>> endobj
+7102 0 obj <<
+/D [7043 0 R /XYZ 339.079 106.269 null]
+>> endobj
+7103 0 obj <<
+/D [7043 0 R /XYZ 71.731 92.487 null]
+>> endobj
+7042 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7106 0 obj <<
+/Length 995       
+/Filter /FlateDecode
+>>
+stream
+xÚµWÛnÜ6\10}÷WèQ\eT4¯¢\84>9N\´(RÀYô%        \fY¢×Dv©\8d.iܯïP¤n»ÚuR8Ø\aqÅÑÌ\9c33G"        0üH     \92\8c\ 4     ¦(\91I\90ï.p°\81\9dß.\88·\88¼I4±y½¾¸¼a4HQ\1a³`ý\10Ð$A\9cÇà'F<\16Áºø\10^?fûFU«\88Ê$$È]ÿÔ¦ývy»^\11\8cÃ\bþ­HØ~s{×WïÜâM¥¿ö\ f\ 2\83\19ìÁ\8a¬>­ÿ¸x»\1e\92\13\94 Èã\úÞä(}J\ 3BP*\84Í\9f\90\14        A\ 3)\12\84\ 1\87ÍÿªÚ´;e\9aÚ\ 6½¼\11d\84\8b\83\88H`\85u\86_\94)êÃÌ\ 6\8f\89ÉRj\14É8\85Õdëð:  \94\ 2
+[\8dÑ\9f\83!Ç´\b§\88Bö½\8dMn_j3T¡)ýõQ¹E\9em·÷Y¾\92ágw£ÖP\90Âïv¸Üí¦jó¦­\94ãÂr'\11%\1dw\91ÄHÀ2\12\ 4\89\98wQóÌ|iU«î¬\8b»B×û²VwU³\1d\9fç\88\1f\ 2.Qb\91±\18ÑÔQÿ.ÛùH\9cÎY\17\9dí¹\10\90\7f\1feJ\8d\0j°eÛ>û\91RÙ·\17¦&Ûê\7fµÙ¸;åÃ\ 1G=\vrÂB·ñPV\93¦vËϪ2ª\8bo\93u1¡xÐg>k z«Ç®\9au!\0\84Ê1\96t¦ï\9fL¹¯u=\10!\11\91¼'"FnÊ º¾?ñhÐ\15'ñ`\9f©ÅÔ1±¹\90¸g      FÏA^E1\8c«säÜø[¯\86Ù\18}`\86\18\96ÞÇ0\eó@0\93\ 2 ;\9b_\9c¯\11ÉÄ\eµ\ 5ï\9dÕO&_H\1aÀJ1æL~] 6¢©D\18\94)b)\82ÙüÞ        çÏO8OaÚâøÅ&|âïä\84÷6''üäèNAF\102N9ÄfH&dÆñ"ÒX"&éË!\1dý\9dFêm\q1Ëü\98jSè<kìØRa[ÈÍlÖ¸U[;FdøÏ\8a$af\8b<#ÈÝÖÍÁ(ï«2Wu}¤\ 6 \93nQ©]¦\8dß\97á\ e\8c³\8dª\17[γKc\94¦n¦o\15TÂÀ£\89\fÿ^I\ e~[u¬VNé\18\97\9bÖä\8d.\8d¯çcÙn\v·¾÷JT@\ 2\e£üFÝZ¡y\9cB\857nø4çÀ\94=üLoÑ\92´÷ÚÜI;\9bË      (È\1d0Ñh+\9fê'\bûb\80Y\8b`D\ 5?Òôá\99ld­¯ãf\vD\95÷\99¯æäC¤Wðz¯rm_\v¹çFevz\16+Ügðã²ýµÔűnÏdñ,\ f3\ 1\9c)®Uíc\1dMP<¼ýÆØ\a2*ð³2J\ 4F)ôåÿ\92Ñ>ð\92¶Pl¿¼\92\17Ó\96\89¿\93ÚÒÛØÜ\8c\9f\89l\ eæû¿tl\95\8aҼȠ\9cõ<\ 5\82!F\92\9cþªY\9c\80rïÚ_þhûOëæO\ 5\94£\14Zïܹa4é\8f\r\12¥Ò¦?÷a!üuýööÊ\1f\15~\7f¿v\v&\b¦\ eüôÌÁY\ 2Õ \1e|ÌO\9c\r\8e\ f8Ì7Íendstream
+endobj
+7105 0 obj <<
+/Type /Page
+/Contents 7106 0 R
+/Resources 7104 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+7107 0 obj <<
+/D [7105 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2302 0 obj <<
+/D [7105 0 R /XYZ 187.959 758.046 null]
+>> endobj
+7108 0 obj <<
+/D [7105 0 R /XYZ 71.731 755.482 null]
+>> endobj
+7109 0 obj <<
+/D [7105 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7110 0 obj <<
+/D [7105 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7111 0 obj <<
+/D [7105 0 R /XYZ 71.731 738.749 null]
+>> endobj
+7112 0 obj <<
+/D [7105 0 R /XYZ 139.477 725.701 null]
+>> endobj
+3423 0 obj <<
+/D [7105 0 R /XYZ 71.731 709.429 null]
+>> endobj
+7113 0 obj <<
+/D [7105 0 R /XYZ 71.731 696.517 null]
+>> endobj
+2306 0 obj <<
+/D [7105 0 R /XYZ 314.984 674.137 null]
+>> endobj
+7114 0 obj <<
+/D [7105 0 R /XYZ 71.731 663.558 null]
+>> endobj
+7115 0 obj <<
+/D [7105 0 R /XYZ 71.731 663.558 null]
+>> endobj
+2310 0 obj <<
+/D [7105 0 R /XYZ 162.317 637.841 null]
+>> endobj
+7116 0 obj <<
+/D [7105 0 R /XYZ 268.991 622.02 null]
+>> endobj
+7117 0 obj <<
+/D [7105 0 R /XYZ 71.731 608.955 null]
+>> endobj
+2314 0 obj <<
+/D [7105 0 R /XYZ 174.677 583.731 null]
+>> endobj
+7118 0 obj <<
+/D [7105 0 R /XYZ 71.731 578.776 null]
+>> endobj
+7119 0 obj <<
+/D [7105 0 R /XYZ 71.731 576.385 null]
+>> endobj
+7120 0 obj <<
+/D [7105 0 R /XYZ 136.77 567.231 null]
+>> endobj
+7121 0 obj <<
+/D [7105 0 R /XYZ 248.686 567.231 null]
+>> endobj
+7122 0 obj <<
+/D [7105 0 R /XYZ 351.993 567.231 null]
+>> endobj
+7123 0 obj <<
+/D [7105 0 R /XYZ 382.124 567.231 null]
+>> endobj
+7124 0 obj <<
+/D [7105 0 R /XYZ 399.342 567.231 null]
+>> endobj
+7125 0 obj <<
+/D [7105 0 R /XYZ 71.731 553.45 null]
+>> endobj
+2318 0 obj <<
+/D [7105 0 R /XYZ 187.959 528.112 null]
+>> endobj
+7126 0 obj <<
+/D [7105 0 R /XYZ 71.731 525.547 null]
+>> endobj
+7127 0 obj <<
+/D [7105 0 R /XYZ 71.731 520.765 null]
+>> endobj
+7128 0 obj <<
+/D [7105 0 R /XYZ 71.731 520.765 null]
+>> endobj
+7129 0 obj <<
+/D [7105 0 R /XYZ 71.731 508.814 null]
+>> endobj
+7130 0 obj <<
+/D [7105 0 R /XYZ 139.477 495.766 null]
+>> endobj
+7131 0 obj <<
+/D [7105 0 R /XYZ 71.731 492.869 null]
+>> endobj
+7132 0 obj <<
+/D [7105 0 R /XYZ 71.731 492.869 null]
+>> endobj
+7133 0 obj <<
+/D [7105 0 R /XYZ 71.731 480.421 null]
+>> endobj
+7134 0 obj <<
+/D [7105 0 R /XYZ 139.477 467.372 null]
+>> endobj
+7135 0 obj <<
+/D [7105 0 R /XYZ 71.731 463.644 null]
+>> endobj
+2322 0 obj <<
+/D [7105 0 R /XYZ 202.018 440.374 null]
+>> endobj
+7136 0 obj <<
+/D [7105 0 R /XYZ 71.731 437.839 null]
+>> endobj
+3424 0 obj <<
+/D [7105 0 R /XYZ 71.731 408.759 null]
+>> endobj
+7137 0 obj <<
+/D [7105 0 R /XYZ 71.731 395.848 null]
+>> endobj
+2326 0 obj <<
+/D [7105 0 R /XYZ 277.97 373.468 null]
+>> endobj
+7138 0 obj <<
+/D [7105 0 R /XYZ 71.731 362.889 null]
+>> endobj
+7139 0 obj <<
+/D [7105 0 R /XYZ 71.731 362.889 null]
+>> endobj
+2330 0 obj <<
+/D [7105 0 R /XYZ 162.317 337.172 null]
+>> endobj
+7140 0 obj <<
+/D [7105 0 R /XYZ 257.036 321.351 null]
+>> endobj
+7141 0 obj <<
+/D [7105 0 R /XYZ 71.731 319.284 null]
+>> endobj
+2334 0 obj <<
+/D [7105 0 R /XYZ 174.677 296.013 null]
+>> endobj
+7142 0 obj <<
+/D [7105 0 R /XYZ 71.731 291.058 null]
+>> endobj
+7143 0 obj <<
+/D [7105 0 R /XYZ 71.731 288.667 null]
+>> endobj
+7144 0 obj <<
+/D [7105 0 R /XYZ 141.074 279.513 null]
+>> endobj
+7145 0 obj <<
+/D [7105 0 R /XYZ 244.381 279.513 null]
+>> endobj
+7146 0 obj <<
+/D [7105 0 R /XYZ 252.99 279.513 null]
+>> endobj
+7147 0 obj <<
+/D [7105 0 R /XYZ 71.731 265.732 null]
+>> endobj
+2338 0 obj <<
+/D [7105 0 R /XYZ 187.959 240.394 null]
+>> endobj
+7148 0 obj <<
+/D [7105 0 R /XYZ 71.731 237.829 null]
+>> endobj
+7149 0 obj <<
+/D [7105 0 R /XYZ 71.731 233.047 null]
+>> endobj
+7150 0 obj <<
+/D [7105 0 R /XYZ 71.731 233.047 null]
+>> endobj
+7151 0 obj <<
+/D [7105 0 R /XYZ 71.731 222.451 null]
+>> endobj
+7152 0 obj <<
+/D [7105 0 R /XYZ 139.477 208.048 null]
+>> endobj
+3425 0 obj <<
+/D [7105 0 R /XYZ 71.731 191.776 null]
+>> endobj
+7153 0 obj <<
+/D [7105 0 R /XYZ 71.731 178.864 null]
+>> endobj
+2342 0 obj <<
+/D [7105 0 R /XYZ 241.337 156.484 null]
+>> endobj
+7154 0 obj <<
+/D [7105 0 R /XYZ 71.731 145.905 null]
+>> endobj
+7155 0 obj <<
+/D [7105 0 R /XYZ 71.731 145.905 null]
+>> endobj
+2346 0 obj <<
+/D [7105 0 R /XYZ 162.317 120.188 null]
+>> endobj
+7156 0 obj <<
+/D [7105 0 R /XYZ 221.171 104.368 null]
+>> endobj
+7157 0 obj <<
+/D [7105 0 R /XYZ 71.731 102.301 null]
+>> endobj
+7104 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7160 0 obj <<
+/Length 1261      
+/Filter /FlateDecode
+>>
+stream
+xÚÅXÝoã6\f\7fï_áÇd\98U}X\92\8d=u½ëpÃpîyÛ\r\85ë¸\8d×ÄNm§×î¯\1f)ʱÝ8m7t\18ò`}P$\7f$ER\11\ 1\87\9f\b¬`V\89 æ\92Å6\ e²Í      \ fnaç§\13á)BO\12\ eh~\\9c\9c^(\19$,1*XÜ\ 42\8eY\14\19àcXdt°Xþ>;_¥Û6¯ç¡´ñL0úþR\94»ÇÓ/\8b¹à|\16Âl.f»GÚ;?ûL\83\ fuñÐ\1düÊ5\a\83\91\98ÿ±øùäãb¯\9c\96\82\81\1e/©ïI\ eÔ\972\10\82%Z£þB$Lk\19X\1d3\ e8Pÿ˧²Ú6E\832O/"ØdÂFHÍ\83P\18F(\1fªbI\14\9a÷\14 S\83\0îH²´¼ßå»üªn×W˪Ì\ f9ZË¢Ø\93#bÏQô\1413<ñ\14½Ì!\ fa\99æºg"~ \9a\11ÐPHÍ\840A¨\12ø&\8eø¬¾Ýmò²möb÷\8e\16ü\1f\8d\ 4\ f\99ÎXÎx,¦| \995¨û`ëùwï.!%¸\v\ 6\ 3~ä/Ûk%"É$¸©£AÝÊ\8a\ 2&\1d\83\11SèS@\ fôZè \8cÀ}\82Π  f\98Åè\8c­\8f@\18ü\86þj\9e-\9e¯\8a­_»ÜæYñ\95s\99ÑübWfmQ\95\ 3¡\96I¡½      UÌ\84\11ã`(«¶¸yºÊ\80é\84¦\91e1ZA\19&\13\8aÇÏé¦\8f\9c\91\83´£}\85ûÐ|`cÁM\17*RZ@¡Í\f\ f9P)b¡µ,]¯¯Ólngw¸`g«´\®áÖº\v
\9bª&Êó¹\88gÎVx\f\ exs\ 1M^.\eZ¯nè{O\ 6\9e\fPR\ eÈ\98\7ft\15\ fì3d\9a\92hp\1d\9b¶Þeí<4\90´\88Å\15BºòKß\1d^WÁ\15SÜz\1e÷Î\0\arFª}O¼¦D-oó\17EYf\84Ü\8b\ 2ê·\89*Êö\90\eD\1c\84\93M\820\81{h\1dý·UÚNæ\e)âWó\rQý«t³7ÛT¾\89\ 4gÆÈwË7\ 3~GóMG\83Êm+°_W¥Z\9f|ÚUN\83ñµ\81\85¦\80;³ô»þ>à²s÷®Î\ fm\11\82f\ 6Â0\14\8aY\9fäöÞ\9d²\88\8aAK\0þ^\16\19ð;j\91\8e\ 6\95sº9TßV\85K\04+Ê\87ê._Ò¤Ï1`\ f\97f^\ 1.G!8\89[+\88Xý~¸{~Çq{\1aª<ÏÒ&\ 6ÂÓ6\9fº\ e\1d4iX\92\90Ù>äMV\17ÛÞ\16Cy\94ÞUDVX¬ \a\86*\12³\e_pp&!'\831\e\1ac("Å2O×´ò­hW´¶© ÐÜh[5Mq½ö³,m \19K=ctâSÛ­\974¸Îi\ 3Ã\1a=éT¨«\r\8d\Ôãö]^\97ù\9a\16¡,\0\1a\a@\ 2|\ 2à®L½Û"\7f¥fY\ 5óG7\89¨\90à\0{DÀóH³ª\?Ñ(«6Ûbí\8d\8cDZ\98àÆ\92úEl)\19í,\9cFÈ´·\13Êsx`ùÚoïñÀ¦Ã3T\99®\\87I\1aÙë\8b\13W÷à;hf]'\vKíªÎÓåÄ\99\9bîЦxÌ=Á¦ri\ 1\1c\ 3ô        \96\ 3ðl¢É\b»\86AC¢7ѸعZU\94EûnÝÆ\eø\8f.\rgRGã~\ 3\eþ}Ç\80\19\93:\ 6\9f\16\87ý\95K\98\98=\9b.\9f\14m\91®\8b¿ÒÁ\9d\19\17\1d\9f÷\10}MäG*Ý\8b¨GõqÔ\ 2ü¿m\ 4\82\98QÃs\ 4\rØ@«I!xg\Òä\\fÛ\86Ms[]ÿù\82X\b;\15u\8f\1a \9d\90
+÷P¨×z\f\ 3Þ\86ªìz\fùÖ\16C½ÞbèÄ\15\84÷ª+=»£eÅ\93¼Þ_<ï ð\19]\1ft\ 6þé.#\96@\10½ô¸ïIº·½e\89uOÓ\11\ fÔì×ó\8f_Îü{þÓå\82\ 6J\v.ÉÚÃ?\ 6"xúàK\8b<hô\91\aü¡\86\7f\ 3py\1d\9fendstream
+endobj
+7159 0 obj <<
+/Type /Page
+/Contents 7160 0 R
+/Resources 7158 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 6927 0 R
+>> endobj
+7161 0 obj <<
+/D [7159 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7162 0 obj <<
+/D [7159 0 R /XYZ 71.731 814.833 null]
+>> endobj
+2350 0 obj <<
+/D [7159 0 R /XYZ 174.677 758.046 null]
+>> endobj
+7163 0 obj <<
+/D [7159 0 R /XYZ 71.731 753.091 null]
+>> endobj
+7164 0 obj <<
+/D [7159 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7165 0 obj <<
+/D [7159 0 R /XYZ 141.074 741.546 null]
+>> endobj
+7166 0 obj <<
+/D [7159 0 R /XYZ 218.554 741.546 null]
+>> endobj
+7167 0 obj <<
+/D [7159 0 R /XYZ 227.163 741.546 null]
+>> endobj
+7168 0 obj <<
+/D [7159 0 R /XYZ 71.731 727.765 null]
+>> endobj
+2354 0 obj <<
+/D [7159 0 R /XYZ 187.959 702.427 null]
+>> endobj
+7169 0 obj <<
+/D [7159 0 R /XYZ 71.731 699.863 null]
+>> endobj
+7170 0 obj <<
+/D [7159 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7171 0 obj <<
+/D [7159 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7172 0 obj <<
+/D [7159 0 R /XYZ 71.731 684.484 null]
+>> endobj
+7173 0 obj <<
+/D [7159 0 R /XYZ 139.477 670.081 null]
+>> endobj
+3426 0 obj <<
+/D [7159 0 R /XYZ 71.731 653.809 null]
+>> endobj
+2358 0 obj <<
+/D [7159 0 R /XYZ 433.023 623.57 null]
+>> endobj
+3427 0 obj <<
+/D [7159 0 R /XYZ 71.731 620.492 null]
+>> endobj
+7174 0 obj <<
+/D [7159 0 R /XYZ 71.731 604.712 null]
+>> endobj
+2362 0 obj <<
+/D [7159 0 R /XYZ 267.779 585.409 null]
+>> endobj
+7175 0 obj <<
+/D [7159 0 R /XYZ 71.731 574.83 null]
+>> endobj
+7176 0 obj <<
+/D [7159 0 R /XYZ 71.731 574.83 null]
+>> endobj
+2366 0 obj <<
+/D [7159 0 R /XYZ 162.317 549.113 null]
+>> endobj
+7177 0 obj <<
+/D [7159 0 R /XYZ 239.103 533.292 null]
+>> endobj
+7178 0 obj <<
+/D [7159 0 R /XYZ 71.731 531.225 null]
+>> endobj
+2370 0 obj <<
+/D [7159 0 R /XYZ 174.677 507.954 null]
+>> endobj
+7179 0 obj <<
+/D [7159 0 R /XYZ 71.731 502.999 null]
+>> endobj
+7180 0 obj <<
+/D [7159 0 R /XYZ 71.731 500.608 null]
+>> endobj
+7181 0 obj <<
+/D [7159 0 R /XYZ 141.074 491.454 null]
+>> endobj
+7182 0 obj <<
+/D [7159 0 R /XYZ 231.468 491.454 null]
+>> endobj
+7183 0 obj <<
+/D [7159 0 R /XYZ 334.775 491.454 null]
+>> endobj
+7184 0 obj <<
+/D [7159 0 R /XYZ 364.906 491.454 null]
+>> endobj
+7185 0 obj <<
+/D [7159 0 R /XYZ 463.909 491.454 null]
+>> endobj
+7186 0 obj <<
+/D [7159 0 R /XYZ 494.04 491.454 null]
+>> endobj
+7187 0 obj <<
+/D [7159 0 R /XYZ 119.552 482.127 null]
+>> endobj
+7188 0 obj <<
+/D [7159 0 R /XYZ 71.731 468.346 null]
+>> endobj
+2374 0 obj <<
+/D [7159 0 R /XYZ 187.959 443.008 null]
+>> endobj
+7189 0 obj <<
+/D [7159 0 R /XYZ 71.731 440.443 null]
+>> endobj
+7190 0 obj <<
+/D [7159 0 R /XYZ 71.731 435.661 null]
+>> endobj
+7191 0 obj <<
+/D [7159 0 R /XYZ 71.731 435.661 null]
+>> endobj
+7192 0 obj <<
+/D [7159 0 R /XYZ 71.731 423.71 null]
+>> endobj
+7193 0 obj <<
+/D [7159 0 R /XYZ 139.477 410.662 null]
+>> endobj
+7194 0 obj <<
+/D [7159 0 R /XYZ 71.731 407.765 null]
+>> endobj
+7195 0 obj <<
+/D [7159 0 R /XYZ 71.731 407.765 null]
+>> endobj
+7196 0 obj <<
+/D [7159 0 R /XYZ 71.731 395.317 null]
+>> endobj
+7197 0 obj <<
+/D [7159 0 R /XYZ 139.477 382.269 null]
+>> endobj
+7198 0 obj <<
+/D [7159 0 R /XYZ 71.731 379.372 null]
+>> endobj
+7199 0 obj <<
+/D [7159 0 R /XYZ 71.731 379.372 null]
+>> endobj
+7200 0 obj <<
+/D [7159 0 R /XYZ 71.731 368.278 null]
+>> endobj
+7201 0 obj <<
+/D [7159 0 R /XYZ 139.477 353.875 null]
+>> endobj
+7202 0 obj <<
+/D [7159 0 R /XYZ 71.731 350.147 null]
+>> endobj
+2378 0 obj <<
+/D [7159 0 R /XYZ 192.609 326.876 null]
+>> endobj
+7203 0 obj <<
+/D [7159 0 R /XYZ 71.731 321.921 null]
+>> endobj
+3428 0 obj <<
+/D [7159 0 R /XYZ 71.731 269.359 null]
+>> endobj
+7204 0 obj <<
+/D [7159 0 R /XYZ 71.731 256.447 null]
+>> endobj
+2382 0 obj <<
+/D [7159 0 R /XYZ 296.787 234.067 null]
+>> endobj
+7205 0 obj <<
+/D [7159 0 R /XYZ 71.731 223.489 null]
+>> endobj
+7206 0 obj <<
+/D [7159 0 R /XYZ 71.731 223.489 null]
+>> endobj
+2386 0 obj <<
+/D [7159 0 R /XYZ 162.317 197.771 null]
+>> endobj
+7207 0 obj <<
+/D [7159 0 R /XYZ 257.036 181.951 null]
+>> endobj
+7208 0 obj <<
+/D [7159 0 R /XYZ 71.731 179.884 null]
+>> endobj
+2390 0 obj <<
+/D [7159 0 R /XYZ 174.677 156.613 null]
+>> endobj
+7209 0 obj <<
+/D [7159 0 R /XYZ 71.731 151.657 null]
+>> endobj
+7210 0 obj <<
+/D [7159 0 R /XYZ 71.731 149.266 null]
+>> endobj
+7211 0 obj <<
+/D [7159 0 R /XYZ 136.77 140.113 null]
+>> endobj
+7212 0 obj <<
+/D [7159 0 R /XYZ 240.077 140.113 null]
+>> endobj
+7213 0 obj <<
+/D [7159 0 R /XYZ 343.384 140.113 null]
+>> endobj
+7214 0 obj <<
+/D [7159 0 R /XYZ 373.515 140.113 null]
+>> endobj
+7215 0 obj <<
+/D [7159 0 R /XYZ 455.3 140.113 null]
+>> endobj
+7216 0 obj <<
+/D [7159 0 R /XYZ 481.162 140.113 null]
+>> endobj
+7217 0 obj <<
+/D [7159 0 R /XYZ 166.901 130.786 null]
+>> endobj
+7218 0 obj <<
+/D [7159 0 R /XYZ 71.731 117.004 null]
+>> endobj
+2394 0 obj <<
+/D [7159 0 R /XYZ 187.959 91.666 null]
+>> endobj
+7219 0 obj <<
+/D [7159 0 R /XYZ 71.731 89.102 null]
+>> endobj
+7220 0 obj <<
+/D [7159 0 R /XYZ 71.731 84.32 null]
+>> endobj
+7221 0 obj <<
+/D [7159 0 R /XYZ 71.731 84.32 null]
+>> endobj
+7222 0 obj <<
+/D [7159 0 R /XYZ 71.731 72.369 null]
+>> endobj
+7223 0 obj <<
+/D [7159 0 R /XYZ 139.477 59.321 null]
+>> endobj
+7158 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7226 0 obj <<
+/Length 1102      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WM\8fÛ6\10½ï¯ÐQ.j\86\9f¢\84\9e6\9b¤h±Ø\0»n.Iah%ÚVcK\8e(åë×w(\92\92lK\e¤]ø Ò\1c\ eß<Î<\92$Àð#\81$H2\12Ä\98¢XÆAv¸ÂÁ\16F~¿"ÎbéL\96#\9b\97««\17o\18\r\12\94D,Xm\ 2\1aÇ\88ó\büD\88G"XåïÃ\9b]zlT½XR\19\87\ 4ÙïmQ¶__ܯ\16\ 4ãp     ½\ 5      Û¯vìæúÎ6^ÕÅg?ñ\ 3\16\18Ì`\fZdñ÷êϫ׫\1e\9c \ 4\ 1\8e§à;\93\vø\82\fð    I\90\104\90"F\18Â0ð³]q<_®·ã\fqƧ֣HF     ´FCçß\1e\1a¡\14 \19\8a\a\7f\1d6*GØ8E\140y\e\83íX\15eOmS¹ïNÙFVÕµÒǪÌ;z·\8eÝ\ 5\89CÏp¶\90¡\89¯ëè¦n³¦­\95    ÷\94\98\8c\12\ eP\19\92\16¯\1eÿ\99å\85\bà\8f<\1f/\83¿y^\9cÍ\7fåå ´N·Î\ 4bSY3I\v¥\ 1\91\88\12Ññ"1\12Ð\
+\82Dd7%KËO­jÕZ\95¹^çU©Ö>\87ìl\8e\98É­MÀ%\8aMx,B4±Ùv\97\1eÜ:|TV\18¸\10\9dí\8f\17\ 6#*8L7Ó>P*}-aZ¦ûâ{Qºà«Í\19\1a¨Ñç\ftÝMUϧ\92\1eâ$(\11\96%\ fdI\ 5b,îà<|+«£.t\1f­DDr\1fm\84¬xÀ>ºlÄ\83\7fìÂz\92\8d±[\82\19bXz6@Ol\\8be\ 4\1adÝX'î¯_ú:\98ññÉX_.\ 4B# þ~\1dòÛ\14'\94\ 3\17\86\13\96 ¨\9bÎøºÞ¶\aU6ú²\ 2\r)\12\ 4\98\9d®<U}<\ 1õ\12òÙªoäo¶ú¼Ílõu\80çêiÄ\8aÓ\19\1a¡$±\89r¯À¸\84¹±\fß-$\ fÓ}«.\93ÝÖ\bã\96 7m\995EUº%wU»ÏmûÑeq®4dx±-\95\eÐm\97¶óŤv
+§Søí4\8e²r²°I\8b=\9a(ꥯj\ e9LlÅ\12\14¡\18Ù\10ìé\ 6\8d\97UZw\9c@;-s7jÕ\18Z\ f\10¶kê£Ê
+S´\99íûàô\84"\ 1\r,F$ê¥\ 2ªAe\1fU¾>¤û}\95\f\1e§\aÁ\88\85\ 2\1dÔ¡ª\1d³ÝÔtج/f[\1a·\ fµÚ\16\1a\92éB©j\ 5å
+#~WÍò2ü8-?\ eÅÏËÏçªÈOÅ`$C\f#ÂÈ C\93l\8c=Çp\83\8aÅX\80\8aïjÝ\Ê\fãpÄ{Cc4¡fc\r\9c\15\19\1218\97\92\9f\15\19~²ð\94ÆP,PD\9fïæ3ò7«1Þ¦Ç6}tÍdÆ\ fÕƲóJé¬.\8e]:Îj\fíLWfE\16ápÓ\8b\8déANÁ\17®³Ú@èþq#\8d\9d@ÂÜ]lí`Ñ\14æ0N\a\17Ç]ª\9do£;f
+TH¶\88\8d<\99Þ±ÒºxÜ;\e_M¦½W©-\82\ e,\85P-ØþÐÞ´ÃI\9e\9f\°Ý¥\0ÊoT\8d~Zf\10\81&þêÙN\9bK\1fç±x\9d\ 4\97h\82\7füÿuþé\9b\9e\93\16\0\1eæ\97ÂãC»ûëöÖã?¿*vû0N³.\9c³¢p/#ÊQ\82å\93o§ÁÄ?\9d$J¤        ëÔ\87     ííÍëûk÷\úãae\eL\10L-)ãw\17\aÍ7\87\8d\95\83(\9ay\1f]"ü\17è©~1endstream
+endobj
+7225 0 obj <<
+/Type /Page
+/Contents 7226 0 R
+/Resources 7224 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7227 0 obj <<
+/D [7225 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7228 0 obj <<
+/D [7225 0 R /XYZ 71.731 768.009 null]
+>> endobj
+7229 0 obj <<
+/D [7225 0 R /XYZ 71.731 768.009 null]
+>> endobj
+7230 0 obj <<
+/D [7225 0 R /XYZ 71.731 756.482 null]
+>> endobj
+7231 0 obj <<
+/D [7225 0 R /XYZ 139.477 743.434 null]
+>> endobj
+7232 0 obj <<
+/D [7225 0 R /XYZ 71.731 728.089 null]
+>> endobj
+7233 0 obj <<
+/D [7225 0 R /XYZ 139.477 715.041 null]
+>> endobj
+3429 0 obj <<
+/D [7225 0 R /XYZ 71.731 698.769 null]
+>> endobj
+7234 0 obj <<
+/D [7225 0 R /XYZ 71.731 685.857 null]
+>> endobj
+2398 0 obj <<
+/D [7225 0 R /XYZ 308.597 663.477 null]
+>> endobj
+7235 0 obj <<
+/D [7225 0 R /XYZ 71.731 652.898 null]
+>> endobj
+7236 0 obj <<
+/D [7225 0 R /XYZ 71.731 652.898 null]
+>> endobj
+2402 0 obj <<
+/D [7225 0 R /XYZ 162.317 627.181 null]
+>> endobj
+7237 0 obj <<
+/D [7225 0 R /XYZ 257.036 611.36 null]
+>> endobj
+7238 0 obj <<
+/D [7225 0 R /XYZ 71.731 609.293 null]
+>> endobj
+2406 0 obj <<
+/D [7225 0 R /XYZ 174.677 586.022 null]
+>> endobj
+7239 0 obj <<
+/D [7225 0 R /XYZ 71.731 581.067 null]
+>> endobj
+7240 0 obj <<
+/D [7225 0 R /XYZ 71.731 578.676 null]
+>> endobj
+7241 0 obj <<
+/D [7225 0 R /XYZ 136.77 569.522 null]
+>> endobj
+7242 0 obj <<
+/D [7225 0 R /XYZ 240.077 569.522 null]
+>> endobj
+7243 0 obj <<
+/D [7225 0 R /XYZ 343.384 569.522 null]
+>> endobj
+7244 0 obj <<
+/D [7225 0 R /XYZ 71.731 555.741 null]
+>> endobj
+2410 0 obj <<
+/D [7225 0 R /XYZ 187.959 530.403 null]
+>> endobj
+7245 0 obj <<
+/D [7225 0 R /XYZ 71.731 527.839 null]
+>> endobj
+7246 0 obj <<
+/D [7225 0 R /XYZ 71.731 523.057 null]
+>> endobj
+7247 0 obj <<
+/D [7225 0 R /XYZ 71.731 523.057 null]
+>> endobj
+7248 0 obj <<
+/D [7225 0 R /XYZ 71.731 511.105 null]
+>> endobj
+7249 0 obj <<
+/D [7225 0 R /XYZ 139.477 498.057 null]
+>> endobj
+7250 0 obj <<
+/D [7225 0 R /XYZ 71.731 494.329 null]
+>> endobj
+2414 0 obj <<
+/D [7225 0 R /XYZ 202.018 471.059 null]
+>> endobj
+7251 0 obj <<
+/D [7225 0 R /XYZ 71.731 468.524 null]
+>> endobj
+3430 0 obj <<
+/D [7225 0 R /XYZ 71.731 439.444 null]
+>> endobj
+2418 0 obj <<
+/D [7225 0 R /XYZ 462.676 409.205 null]
+>> endobj
+3431 0 obj <<
+/D [7225 0 R /XYZ 71.731 406.127 null]
+>> endobj
+7252 0 obj <<
+/D [7225 0 R /XYZ 71.731 390.347 null]
+>> endobj
+2422 0 obj <<
+/D [7225 0 R /XYZ 253.8 371.044 null]
+>> endobj
+7253 0 obj <<
+/D [7225 0 R /XYZ 71.731 362.143 null]
+>> endobj
+7254 0 obj <<
+/D [7225 0 R /XYZ 71.731 362.143 null]
+>> endobj
+2426 0 obj <<
+/D [7225 0 R /XYZ 162.317 334.748 null]
+>> endobj
+7255 0 obj <<
+/D [7225 0 R /XYZ 227.148 318.927 null]
+>> endobj
+7256 0 obj <<
+/D [7225 0 R /XYZ 71.731 316.86 null]
+>> endobj
+2430 0 obj <<
+/D [7225 0 R /XYZ 174.677 293.589 null]
+>> endobj
+7257 0 obj <<
+/D [7225 0 R /XYZ 71.731 288.634 null]
+>> endobj
+7258 0 obj <<
+/D [7225 0 R /XYZ 71.731 286.243 null]
+>> endobj
+7259 0 obj <<
+/D [7225 0 R /XYZ 149.683 277.089 null]
+>> endobj
+7260 0 obj <<
+/D [7225 0 R /XYZ 231.468 277.089 null]
+>> endobj
+7261 0 obj <<
+/D [7225 0 R /XYZ 265.903 277.089 null]
+>> endobj
+7262 0 obj <<
+/D [7225 0 R /XYZ 71.731 263.308 null]
+>> endobj
+2434 0 obj <<
+/D [7225 0 R /XYZ 187.959 237.97 null]
+>> endobj
+7263 0 obj <<
+/D [7225 0 R /XYZ 71.731 235.405 null]
+>> endobj
+7264 0 obj <<
+/D [7225 0 R /XYZ 71.731 230.623 null]
+>> endobj
+7265 0 obj <<
+/D [7225 0 R /XYZ 71.731 230.623 null]
+>> endobj
+7266 0 obj <<
+/D [7225 0 R /XYZ 71.731 220.027 null]
+>> endobj
+7267 0 obj <<
+/D [7225 0 R /XYZ 139.477 205.624 null]
+>> endobj
+7268 0 obj <<
+/D [7225 0 R /XYZ 71.731 201.896 null]
+>> endobj
+2438 0 obj <<
+/D [7225 0 R /XYZ 192.609 178.625 null]
+>> endobj
+7269 0 obj <<
+/D [7225 0 R /XYZ 71.731 173.67 null]
+>> endobj
+7270 0 obj <<
+/D [7225 0 R /XYZ 71.731 146.803 null]
+>> endobj
+2442 0 obj <<
+/D [7225 0 R /XYZ 202.018 123.333 null]
+>> endobj
+7271 0 obj <<
+/D [7225 0 R /XYZ 71.731 120.798 null]
+>> endobj
+3432 0 obj <<
+/D [7225 0 R /XYZ 71.731 91.718 null]
+>> endobj
+7224 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7275 0 obj <<
+/Length 1038      
+/Filter /FlateDecode
+>>
+stream
+xÚµWÛnÛ8\10}ÏWèÑ.*\96\17\91\14±OiÚ]tQ´@ë·ma(2í\b\91%¯(\17M¿~\87\17]lÉI·H\11 \1aKÃÃ\99á9C\92D\18þH$  \92\8cD)¦(\95i\94ï¯p´\83/\7f]\91à\11\a\97xäózuõêOF#\85\94`Ñj\eÑ4EI"\0G Dðhµùgqs\97\1dZÝ,c*Ó\ 5Aþù¾¨\8eß_}Z-      Æ\8b\18~-ÉâøÝ\7f»¹þà\8d7Mñ­\eø\ 5s\f\r,²üºúûêíª\ f\8eS\82 \8eÇÂ\ f.\93ð)\8d\88D\94p\e\7fÈQr\8e¸\92.ü<«Öù\9dÎïõf½m´¶SûQ        b\90*\8cJ$J)LÁ\ 4¢J¸Q\1f²}ðLFåÁQL¸ó}\ 4Y\ eþ
+ªIl\ 6Öý\v¥Ò×Â9;k¯÷uóàí¬,ë<k¡\90zãßÜ>LC \8c \92\8a\809\ e\0\86ô\b\15%¦T¹rÄ\94#ÆR7òóCU\1fLaú\19$"2é\92\14ȯ}QµÞ\81ãÁÁ\95;\9d\89`(Â\18O2°xW\ 4 Á·º\80\ 4\ 5\10çE\0'\837KPºô²Í¦ÑƬ\ fST\96")Å\80\98Ë\9c\b\86\ 4æ°´
+\11¢\9cóu³;îuÕ\9a\93õ\95À d:û\98­\80\84\11W\18Â\91st¥H
+\ 5ÖèÓù³g6¡\14\98m)>àyj\8f¨D\12\8a(еó±\ 1\1ejX\9fN`m\1d\9ew3ܺµÌH\17÷C\8dzÉÄ\12#\ efÌ       â"é\17u£Ë5@¬Ë´Oi\86ÿ/ÍÌ ?­\99|)\17@3ø\7f\1fDT\87ÄM\9b\95CÊ \9fsE\15ueÂ\8bÖ?7'\8d Ó*+\8b\1fÎq\8eD!¢ß¥\9ei9\1eUÏT2)P\\ 5\ f§­    \bÌÉ1\7fR,6p,\7fM,ÝÄs:a6     \95<\9bNFx\17uÒùØت \8dì4\99ó&\89\ 4øÇT ¥|òo´É\9bâ0â\85<O\1fc\166IÏM³¤|ñr\193&\16ÅÖ?A\91\8döfÖ\19¦-Ê2\98õ>¼ì\14km§X\aè\a:*\ 3¹[»9¸7U0\1a]êÌh3Ũóüx(´[\17\17/\85\8b÷6HÄ\1c\9d°F]ÂÏé~f#¹Ù}é¼Ã\98\aÓ\82âfzJ×\1d\Oa=Õ\eýïQ\9bv]Ô`îNäö\1c\9bñ%ø1=h
+°é¤½\84¡þÇ»\8f!¿C\96ëîûîBwè\10\7fW{¸\90Ô\18T%@ÝtÔ#\8e\95)v\95\ e»lYW»i×\10     ,\8d\f\83 \8763Í\a\8e\\1c²õ>/=ÚOa§pDëzøLÀ°Ø};
+°94é6\98wYsñ|p\12v5&Æi     åSÝ\8eqP\83øÅ£A_¯¹v§\14¢üùN\ 5\ 3ÜÅf\17\ld½8í¾Ö\9c3úP7áM8ÜL\13í\e!aH¦dX¹Táì\90\8açkì\ 3ÜÅT\83\8b\8b긿ívñz{Ö\9b,\9ft~la£·/äå\12hs\9e]¸EÐ\ 4),\1f½K\r.ÝUJ"{ïØ\9eaØp?Þ¼ýt\1d®Oï>¯¼Á8ÁÔ/Âø\1e\96Àñ6\11\9d\82\84¼p_\9a\1fn     u`endstream
+endobj
+7274 0 obj <<
+/Type /Page
+/Contents 7275 0 R
+/Resources 7273 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7276 0 obj <<
+/D [7274 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7277 0 obj <<
+/D [7274 0 R /XYZ 71.731 814.833 null]
+>> endobj
+7278 0 obj <<
+/D [7274 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2446 0 obj <<
+/D [7274 0 R /XYZ 229.888 755.597 null]
+>> endobj
+7279 0 obj <<
+/D [7274 0 R /XYZ 71.731 746.696 null]
+>> endobj
+7280 0 obj <<
+/D [7274 0 R /XYZ 71.731 746.696 null]
+>> endobj
+2450 0 obj <<
+/D [7274 0 R /XYZ 162.317 719.301 null]
+>> endobj
+7281 0 obj <<
+/D [7274 0 R /XYZ 215.193 703.48 null]
+>> endobj
+7282 0 obj <<
+/D [7274 0 R /XYZ 349.149 703.48 null]
+>> endobj
+7283 0 obj <<
+/D [7274 0 R /XYZ 71.731 701.413 null]
+>> endobj
+2454 0 obj <<
+/D [7274 0 R /XYZ 174.677 678.142 null]
+>> endobj
+7284 0 obj <<
+/D [7274 0 R /XYZ 71.731 673.187 null]
+>> endobj
+7285 0 obj <<
+/D [7274 0 R /XYZ 71.731 670.796 null]
+>> endobj
+7286 0 obj <<
+/D [7274 0 R /XYZ 136.77 661.642 null]
+>> endobj
+7287 0 obj <<
+/D [7274 0 R /XYZ 209.945 661.642 null]
+>> endobj
+7288 0 obj <<
+/D [7274 0 R /XYZ 244.381 661.642 null]
+>> endobj
+7289 0 obj <<
+/D [7274 0 R /XYZ 71.731 647.861 null]
+>> endobj
+2458 0 obj <<
+/D [7274 0 R /XYZ 187.959 622.523 null]
+>> endobj
+7290 0 obj <<
+/D [7274 0 R /XYZ 71.731 619.958 null]
+>> endobj
+7291 0 obj <<
+/D [7274 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7292 0 obj <<
+/D [7274 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7293 0 obj <<
+/D [7274 0 R /XYZ 71.731 603.225 null]
+>> endobj
+7294 0 obj <<
+/D [7274 0 R /XYZ 139.477 590.177 null]
+>> endobj
+3433 0 obj <<
+/D [7274 0 R /XYZ 71.731 573.905 null]
+>> endobj
+7295 0 obj <<
+/D [7274 0 R /XYZ 71.731 560.994 null]
+>> endobj
+2462 0 obj <<
+/D [7274 0 R /XYZ 228.27 538.613 null]
+>> endobj
+7296 0 obj <<
+/D [7274 0 R /XYZ 71.731 529.713 null]
+>> endobj
+7297 0 obj <<
+/D [7274 0 R /XYZ 71.731 529.713 null]
+>> endobj
+2466 0 obj <<
+/D [7274 0 R /XYZ 162.317 502.318 null]
+>> endobj
+7298 0 obj <<
+/D [7274 0 R /XYZ 215.193 486.497 null]
+>> endobj
+7299 0 obj <<
+/D [7274 0 R /XYZ 71.731 484.43 null]
+>> endobj
+2470 0 obj <<
+/D [7274 0 R /XYZ 174.677 461.159 null]
+>> endobj
+7300 0 obj <<
+/D [7274 0 R /XYZ 71.731 456.204 null]
+>> endobj
+7301 0 obj <<
+/D [7274 0 R /XYZ 71.731 453.813 null]
+>> endobj
+7302 0 obj <<
+/D [7274 0 R /XYZ 136.77 444.659 null]
+>> endobj
+7303 0 obj <<
+/D [7274 0 R /XYZ 209.945 444.659 null]
+>> endobj
+7304 0 obj <<
+/D [7274 0 R /XYZ 218.554 444.659 null]
+>> endobj
+7305 0 obj <<
+/D [7274 0 R /XYZ 71.731 430.877 null]
+>> endobj
+2474 0 obj <<
+/D [7274 0 R /XYZ 187.959 405.539 null]
+>> endobj
+7306 0 obj <<
+/D [7274 0 R /XYZ 71.731 402.975 null]
+>> endobj
+7307 0 obj <<
+/D [7274 0 R /XYZ 71.731 398.193 null]
+>> endobj
+7308 0 obj <<
+/D [7274 0 R /XYZ 71.731 398.193 null]
+>> endobj
+7309 0 obj <<
+/D [7274 0 R /XYZ 71.731 387.597 null]
+>> endobj
+7310 0 obj <<
+/D [7274 0 R /XYZ 139.477 373.194 null]
+>> endobj
+7311 0 obj <<
+/D [7274 0 R /XYZ 71.731 369.466 null]
+>> endobj
+2478 0 obj <<
+/D [7274 0 R /XYZ 192.609 346.195 null]
+>> endobj
+7312 0 obj <<
+/D [7274 0 R /XYZ 71.731 341.24 null]
+>> endobj
+7313 0 obj <<
+/D [7274 0 R /XYZ 71.731 339.579 null]
+>> endobj
+3434 0 obj <<
+/D [7274 0 R /XYZ 71.731 299.968 null]
+>> endobj
+7314 0 obj <<
+/D [7274 0 R /XYZ 71.731 287.057 null]
+>> endobj
+2482 0 obj <<
+/D [7274 0 R /XYZ 271.928 264.677 null]
+>> endobj
+7315 0 obj <<
+/D [7274 0 R /XYZ 71.731 254.098 null]
+>> endobj
+7316 0 obj <<
+/D [7274 0 R /XYZ 71.731 254.098 null]
+>> endobj
+2486 0 obj <<
+/D [7274 0 R /XYZ 162.317 228.381 null]
+>> endobj
+7317 0 obj <<
+/D [7274 0 R /XYZ 245.081 212.56 null]
+>> endobj
+7318 0 obj <<
+/D [7274 0 R /XYZ 71.731 210.493 null]
+>> endobj
+2490 0 obj <<
+/D [7274 0 R /XYZ 174.677 187.222 null]
+>> endobj
+7319 0 obj <<
+/D [7274 0 R /XYZ 71.731 182.267 null]
+>> endobj
+7320 0 obj <<
+/D [7274 0 R /XYZ 71.731 179.876 null]
+>> endobj
+7321 0 obj <<
+/D [7274 0 R /XYZ 136.77 170.722 null]
+>> endobj
+7322 0 obj <<
+/D [7274 0 R /XYZ 231.468 170.722 null]
+>> endobj
+7323 0 obj <<
+/D [7274 0 R /XYZ 296.035 170.722 null]
+>> endobj
+7324 0 obj <<
+/D [7274 0 R /XYZ 326.166 170.722 null]
+>> endobj
+7325 0 obj <<
+/D [7274 0 R /XYZ 386.428 170.722 null]
+>> endobj
+7326 0 obj <<
+/D [7274 0 R /XYZ 399.342 170.722 null]
+>> endobj
+7327 0 obj <<
+/D [7274 0 R /XYZ 455.3 170.722 null]
+>> endobj
+7328 0 obj <<
+/D [7274 0 R /XYZ 71.731 156.941 null]
+>> endobj
+2494 0 obj <<
+/D [7274 0 R /XYZ 187.959 131.603 null]
+>> endobj
+7329 0 obj <<
+/D [7274 0 R /XYZ 71.731 129.038 null]
+>> endobj
+7330 0 obj <<
+/D [7274 0 R /XYZ 71.731 124.256 null]
+>> endobj
+7331 0 obj <<
+/D [7274 0 R /XYZ 71.731 124.256 null]
+>> endobj
+7332 0 obj <<
+/D [7274 0 R /XYZ 71.731 113.66 null]
+>> endobj
+7333 0 obj <<
+/D [7274 0 R /XYZ 139.477 99.257 null]
+>> endobj
+7334 0 obj <<
+/D [7274 0 R /XYZ 71.731 96.36 null]
+>> endobj
+7335 0 obj <<
+/D [7274 0 R /XYZ 71.731 96.36 null]
+>> endobj
+7336 0 obj <<
+/D [7274 0 R /XYZ 71.731 85.476 null]
+>> endobj
+7337 0 obj <<
+/D [7274 0 R /XYZ 139.477 70.864 null]
+>> endobj
+7273 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7340 0 obj <<
+/Length 1093      
+/Filter /FlateDecode
+>>
+stream
+xÚÕWK\8fÛ6\10¾ï¯ÐQ\ eb.I\91"\85\9e6\9b¤HQ$ÀÆè¥[,´2m\v\95%W\8fm6¿¾Ã\97%ÛÒº\ 1\4\81\ f\1a\923Ão\863\1fM\12\91@\10$"\12HL\91\142ȶW8XÃÊÏWÄiÌ\9dÊ| ófquý>¢A\82\928
+\16«\80J\89\18\8bÁO\8c\83Åò÷ðv\93îZUÏæTÈ\90 ûý5/»/×w\8b\19Á8\9cÃhFÂî\8b]»½ùh\85·uþä\rï1Ç \ 6\91Ù\1f\8b_®Þ-öà8%\b\ 4ß©\9cÀç¤\87OH\82\81à\12a\bCÃ/Ó­:Þn¯Ç"Ä"6¶\1fE"N@\1a,\1d\7f÷Ð\b¥\0M§¸÷g°Q1ÀÆ(¢\80Éëxl×Eú¨
+\9b¤Uå²Õn\94\15jõW§\9a\16²«\96~f\9d\8e\büS\b\ 5%\9cë\ræ\80"N\18|c\94$\89Ùà­j²:ßµ½Å\0\11\ 6ä\1cE\8c\1aÕ\85ßrÕ\95\9910£M¾T\8d\15\9bç\ 6p´jë\86;\95å÷\18ÓÌ\8eóí®P[U¶io]­\8eâY©´íj5#2D#1à\ 3ôw
+tµ')Âßf\82\85iÑ©sqÔÆ\b G,   wU\93·P\840â8|2öfA\97#1\95hV ~Í×àÔëYÚ\18\90¯ý|ÚÚ\ 5\97~3\9bU]±´Ó\8fn\8bZ5ª~RnÖ\9c\17\84¥m Ý5ÈêÜ©¹\ eÉDA!\ f6
+\1fCÄ类´\14\eÐØ\81\86\85|e§Áy­Ü\94³Éª¢È\e\v\144þÎÛ\8d]¨´²\15\1d\14£P¹¹}t0\97¥eYµvþÑùoÓ?\95[^y\9b¦²\r\8f\80\98\bÜN¶dÓ¦*\aç-\10%¶f\99@Rw\ e'\88Ƕ)`ß\87Z\15\1eòêá¸Þ\19\9ct¬m½i\14#\9aØ^ÿèzýú=£Çõ!éYïÃn¥\12¼J°ÕF÷\94
+\1f\8a\83\ f\9f|'¤\99\9dÞã\9cB­FÒøýü\V»\ 6\ eÍc\16\88\bæ1ÇÈ\12ðS\95\ 6ǽ\ 6Ð!\87\1dð¹¨\86^\13\ 6\f±\ f
+ª©+\9b|]êr\8d¡"\8bª\»\8dHo\1438\1aá\8c\9a6­ÛSÇ\a`^[oÿÊ·\ 4.÷v#\80á°1ëñ\92\9fFyOpÄ$\87JH\10±§|S¯;MEÍ~Ë\83j\10p\13F\87ñ\8c]\ fL\97M\1c_ìz\18ø\9b¼\1e¼\8e!\ 1Ï\9a\9aek¸\ 5\ eªnWÕn&].\81wFbÝ_      $BÂ5@9\15m$\ 5bp\18\97\8avào2Z¯c\80uÛGÏ\18'÷FV\95\8dÊ:ËåT\88é,¨f\8cg\ 4F\1cÄS\9e1×ëÃVmÿ\e¢\99p?LEÄ\10\15ñ\bÓØ\9bß\fÀAU?\1f±\8dx\89m\9c×og\9b¼lOÉÆdR\1e\90Íxd\al\93 ¨Û\1f\94m\9c[]w­\137im¥Wg`\97Ãê\18Ïá$\99E\1cÔÄå¹\8c@\a0\99\¬»\aþ&»ÛëLsÙ°®ûNÞmÌ?Í<K\8bK\12\9c\86\85\13\14ôþ¦Sàt¾\9dàÆSsDrÓ¹ g\1f?DëáËñýÀßt:\9cÎ÷óø\89þÇÇÏðTÜë\9c2\94`ñâû½WñÏw\81\12¡c:ô¡ãútûîîÆ=Ù?|^X!â\ 4S\9b\91áÛ\9fE\12îHâ\b*\96\13oôS\84ÿ\0q\94\14\8dendstream
+endobj
+7339 0 obj <<
+/Type /Page
+/Contents 7340 0 R
+/Resources 7338 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7341 0 obj <<
+/D [7339 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7342 0 obj <<
+/D [7339 0 R /XYZ 71.731 768.009 null]
+>> endobj
+7343 0 obj <<
+/D [7339 0 R /XYZ 71.731 768.009 null]
+>> endobj
+7344 0 obj <<
+/D [7339 0 R /XYZ 71.731 757.837 null]
+>> endobj
+7345 0 obj <<
+/D [7339 0 R /XYZ 139.477 743.434 null]
+>> endobj
+2498 0 obj <<
+/D [7339 0 R /XYZ 192.609 716.435 null]
+>> endobj
+7346 0 obj <<
+/D [7339 0 R /XYZ 71.731 711.48 null]
+>> endobj
+7347 0 obj <<
+/D [7339 0 R /XYZ 71.731 697.365 null]
+>> endobj
+2502 0 obj <<
+/D [7339 0 R /XYZ 202.018 674.094 null]
+>> endobj
+7348 0 obj <<
+/D [7339 0 R /XYZ 71.731 671.56 null]
+>> endobj
+3435 0 obj <<
+/D [7339 0 R /XYZ 71.731 616.577 null]
+>> endobj
+7349 0 obj <<
+/D [7339 0 R /XYZ 71.731 603.665 null]
+>> endobj
+2506 0 obj <<
+/D [7339 0 R /XYZ 268.107 581.285 null]
+>> endobj
+7350 0 obj <<
+/D [7339 0 R /XYZ 71.731 570.706 null]
+>> endobj
+7351 0 obj <<
+/D [7339 0 R /XYZ 71.731 570.706 null]
+>> endobj
+2510 0 obj <<
+/D [7339 0 R /XYZ 162.317 544.989 null]
+>> endobj
+7352 0 obj <<
+/D [7339 0 R /XYZ 245.081 529.169 null]
+>> endobj
+7353 0 obj <<
+/D [7339 0 R /XYZ 71.731 527.101 null]
+>> endobj
+2514 0 obj <<
+/D [7339 0 R /XYZ 174.677 503.831 null]
+>> endobj
+7354 0 obj <<
+/D [7339 0 R /XYZ 71.731 498.875 null]
+>> endobj
+7355 0 obj <<
+/D [7339 0 R /XYZ 71.731 496.484 null]
+>> endobj
+7356 0 obj <<
+/D [7339 0 R /XYZ 141.074 487.331 null]
+>> endobj
+7357 0 obj <<
+/D [7339 0 R /XYZ 235.772 487.331 null]
+>> endobj
+7358 0 obj <<
+/D [7339 0 R /XYZ 300.339 487.331 null]
+>> endobj
+7359 0 obj <<
+/D [7339 0 R /XYZ 330.47 487.331 null]
+>> endobj
+7360 0 obj <<
+/D [7339 0 R /XYZ 390.733 487.331 null]
+>> endobj
+7361 0 obj <<
+/D [7339 0 R /XYZ 71.731 473.549 null]
+>> endobj
+2518 0 obj <<
+/D [7339 0 R /XYZ 187.959 448.211 null]
+>> endobj
+7362 0 obj <<
+/D [7339 0 R /XYZ 71.731 445.647 null]
+>> endobj
+7363 0 obj <<
+/D [7339 0 R /XYZ 71.731 440.865 null]
+>> endobj
+7364 0 obj <<
+/D [7339 0 R /XYZ 71.731 440.865 null]
+>> endobj
+7365 0 obj <<
+/D [7339 0 R /XYZ 71.731 430.269 null]
+>> endobj
+7366 0 obj <<
+/D [7339 0 R /XYZ 139.477 415.866 null]
+>> endobj
+7367 0 obj <<
+/D [7339 0 R /XYZ 71.731 412.968 null]
+>> endobj
+7368 0 obj <<
+/D [7339 0 R /XYZ 71.731 412.968 null]
+>> endobj
+7369 0 obj <<
+/D [7339 0 R /XYZ 71.731 402.084 null]
+>> endobj
+7370 0 obj <<
+/D [7339 0 R /XYZ 139.477 387.472 null]
+>> endobj
+3436 0 obj <<
+/D [7339 0 R /XYZ 71.731 371.2 null]
+>> endobj
+7371 0 obj <<
+/D [7339 0 R /XYZ 71.731 358.288 null]
+>> endobj
+2522 0 obj <<
+/D [7339 0 R /XYZ 298.078 335.908 null]
+>> endobj
+7372 0 obj <<
+/D [7339 0 R /XYZ 71.731 325.33 null]
+>> endobj
+7373 0 obj <<
+/D [7339 0 R /XYZ 71.731 325.33 null]
+>> endobj
+2526 0 obj <<
+/D [7339 0 R /XYZ 162.317 299.612 null]
+>> endobj
+7374 0 obj <<
+/D [7339 0 R /XYZ 251.059 283.792 null]
+>> endobj
+7375 0 obj <<
+/D [7339 0 R /XYZ 71.731 281.725 null]
+>> endobj
+2530 0 obj <<
+/D [7339 0 R /XYZ 174.677 258.454 null]
+>> endobj
+7376 0 obj <<
+/D [7339 0 R /XYZ 71.731 253.498 null]
+>> endobj
+7377 0 obj <<
+/D [7339 0 R /XYZ 71.731 251.107 null]
+>> endobj
+7378 0 obj <<
+/D [7339 0 R /XYZ 136.77 241.954 null]
+>> endobj
+7379 0 obj <<
+/D [7339 0 R /XYZ 235.772 241.954 null]
+>> endobj
+7380 0 obj <<
+/D [7339 0 R /XYZ 300.339 241.954 null]
+>> endobj
+7381 0 obj <<
+/D [7339 0 R /XYZ 330.47 241.954 null]
+>> endobj
+7382 0 obj <<
+/D [7339 0 R /XYZ 390.733 241.954 null]
+>> endobj
+7383 0 obj <<
+/D [7339 0 R /XYZ 403.646 241.954 null]
+>> endobj
+7384 0 obj <<
+/D [7339 0 R /XYZ 459.604 241.954 null]
+>> endobj
+7385 0 obj <<
+/D [7339 0 R /XYZ 71.731 228.172 null]
+>> endobj
+2534 0 obj <<
+/D [7339 0 R /XYZ 187.959 202.834 null]
+>> endobj
+7386 0 obj <<
+/D [7339 0 R /XYZ 71.731 200.27 null]
+>> endobj
+7387 0 obj <<
+/D [7339 0 R /XYZ 71.731 195.488 null]
+>> endobj
+7388 0 obj <<
+/D [7339 0 R /XYZ 71.731 195.488 null]
+>> endobj
+7389 0 obj <<
+/D [7339 0 R /XYZ 71.731 184.892 null]
+>> endobj
+7390 0 obj <<
+/D [7339 0 R /XYZ 139.477 170.489 null]
+>> endobj
+7391 0 obj <<
+/D [7339 0 R /XYZ 71.731 167.592 null]
+>> endobj
+7392 0 obj <<
+/D [7339 0 R /XYZ 71.731 167.592 null]
+>> endobj
+7393 0 obj <<
+/D [7339 0 R /XYZ 71.731 156.707 null]
+>> endobj
+7394 0 obj <<
+/D [7339 0 R /XYZ 139.477 142.095 null]
+>> endobj
+7395 0 obj <<
+/D [7339 0 R /XYZ 71.731 139.198 null]
+>> endobj
+7396 0 obj <<
+/D [7339 0 R /XYZ 71.731 139.198 null]
+>> endobj
+7397 0 obj <<
+/D [7339 0 R /XYZ 71.731 128.105 null]
+>> endobj
+7398 0 obj <<
+/D [7339 0 R /XYZ 139.477 113.702 null]
+>> endobj
+7399 0 obj <<
+/D [7339 0 R /XYZ 71.731 109.974 null]
+>> endobj
+2538 0 obj <<
+/D [7339 0 R /XYZ 192.609 86.703 null]
+>> endobj
+7400 0 obj <<
+/D [7339 0 R /XYZ 71.731 81.748 null]
+>> endobj
+7401 0 obj <<
+/D [7339 0 R /XYZ 71.731 67.633 null]
+>> endobj
+7338 0 obj <<
+/Font << /F32 3079 0 R /F51 3667 0 R /F27 2966 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7404 0 obj <<
+/Length 1380      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WÝs£6\10\7fÏ_áGÜ        :I\b\ 4Ó§4wí\§síäܾô:\1e\8ce\9b\16#* \97ô¯ïê\v\97Þ4Ã\ 3Òjwµ\9f?Id\85á#+N\10\8fÈ*Å\14¥<]\15ç+¼:ÂÊ\ fWÄq\84\8e%\9cð|·¹zó}DW\19Ê\92hµ9¬h\9a\12Ð\93 \96Ä«Íþ÷àö\947\9d\90ò4 Èþ\7f*ëþáÍÝfM0\ eB\98­IÐ?صÛ\9b\ fvðV\95÷^ð\13\8e1°Á\1a\8cÈú\8fÍ\8fWï6\83q1%\bìø\92ù\8eef>¥+BP\16ÇÚ~B2\14ÇtÅã\14aðCÛ\7f'º^Õ`EÊ\83ßÖ\9c\ 5\vm\0ÈòÑu¼
+I\8c"F\8d\902Bí:\8cX\164²-;p\ 5f1\ eî\8d¼YÐN\11ã\8fY\81(\98\7fwrëEÞ\8a5I\83kOÏ;» Ä±\94\8e»\90}µ·ä\9dÛB\89V¨{á¨\a©¦za°·\81Õ±G\96çN\84Ú%ã\ 5\85hX/¼\ fQ\1cü#\94Ô£Ä\18\8d\9dÑ°P\1e,\19\94+áHN¦\90UU¶ÖPàø\v'» 5³\1d:S\f\83t´Á; \15y]ËÎÒwN\7f\97ÿ%ÜòÁË´ò,.< Æ\ 3·\93® %òVÖÈe\ e²Î\11%&ë!ã(¥ºF\b\8a\13f\ 4aß­\12\15È\88íY\9c·Î¦A\98\13-ìe£\ 4ÑÌVÌ\87üì
+\84ѧ\ 5\92Ò\97ÕOª\8aD\fQ\9e\80°\96úD)÷Î\18Y;\ 1\ 5R=ÚqÛä\85!óà©ÉC\95\87^kH¡b£ÔèþøX˦\85ÔyÃ9"\9c\13d\9bù^\96\11ã\91\ 3Z+\86\1dð\8b®MÕf\19Â8ò\9eAQõu[\1ek]µ  \14f%ë£Û\89\8cB       \83\fq'Ôv¹êæ\8a/¬¹¶Úþ\93î\14\80\81\ 5\83!å8\1eí%ß.\85\96ò\fñ\fÊ!CĦúF\1dû³¨»vØñ¢$8 jtéÎ\14Ù<"1\bWJ\16¡\8d"\9ed0\9a,=ý\ f(H(\ 5\14\84ÁD\9f\85ÁiÑ1\8a(T·ç1Pp\12\1e\881Um7¯¼F*GmN\8f-àyYä\95%äû=@ÒB\0B0'É\98®HÄ]kÔÏ\86\0N FÙë\85`Ô÷|\b\1c\8f1¬?ï<\98È\83ý\ fa)dÝ\8a¢·0¯»o94.\12¢]\82!\8eQ\fC\vCÑÐL;ÝIZp«cÿÐ7¯\81BdAý¡\1c\95Oc\ 1Ý\1f±h        \83d\91\8b\99îd®öc\ 1@ö¡\ 6ªy\9d\8c\11\94O"yû˯\ 6ÈC¿ï\14Ïó¢\0ÙrW9fYOC9´!þ:hÃVyYwsl3ùI'ض\18¯©Ò4A8Í&ÀÖvª/:\v= a/îËBl\1dá\9b9\10e\f\9ab²%\b\1cÜ°pú\7fQN|6þÌÕà       Á¢ä%´\8b\17µhG²¯\83»Ñ±¥f§\f\1a\ f¢øZÍ>Ñ÷l³{\1em]#¡\1a|·Ïj´Q\90CÙ·Õã\b\8aºÚ+á:Àæø\8dé\89k\87\10k\1e\9cÊÆ\95=8ï[£mó£/çÝ\9f¢è\1c\v\80,    tåôJ¼\88\9dd\96ÏŨ\ 2/\ 6|xµ¨\8eúLT§ö\rQu<O\8by\9a\ 1¨\1fÆèX\94\ eQ\86\eÎÅ\ 1rY\82      E$ÒW\99\ 4e\99ÍÝ[Ñ\16ªlºÅ\eÕå=}sÒ\97U\9aààÐ×\85\910³|\ f\8f\16·²\834XKÌÂ\88^05ç\80&W\95\1dØ^7\19»`\0 rÚ\1cLÂÐ\94\95þÃ\ 6'·l\9d¿äó\19}r;÷A¡±¹ÅG4xßÙ¿½\80S@è¿ûR\99w\0ÌÜ]\99\ 6\9dÊë¶Ê;wɦp±î>\vá&\ e¼+;3uª\a÷¥êú\81ê¶6\93sÞ4e}t\86Ìïà.Æ1\9bÆ8¶Ï\ 4M\85fjrc¥¦\9a ÀßÜ ÎMU\1e\1e\a\ 4$ÚF\14¥î¹b~ÀÑ\bÚ\81¹RzxxØê \88¶Û\96r^\f\0Õ\94ú\93mj\1d³ÑÒûÂÙeßFaD¬à4       Ã±¦£pÙýc@¦­è\9eÑ\94¡\fó/>´G\16ÿÎæ(ãÚìK\1dÚ\8c\9foßÝݸ·õû\8f\e;\88b\ 2°d\9c\9e>ÒY\94Â=Ã\1f\ 1IöÌczná¿g\v\1a¿endstream
+endobj
+7403 0 obj <<
+/Type /Page
+/Contents 7404 0 R
+/Resources 7402 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7405 0 obj <<
+/D [7403 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2542 0 obj <<
+/D [7403 0 R /XYZ 202.018 758.046 null]
+>> endobj
+7406 0 obj <<
+/D [7403 0 R /XYZ 71.731 755.512 null]
+>> endobj
+3437 0 obj <<
+/D [7403 0 R /XYZ 71.731 700.529 null]
+>> endobj
+7407 0 obj <<
+/D [7403 0 R /XYZ 71.731 687.617 null]
+>> endobj
+2546 0 obj <<
+/D [7403 0 R /XYZ 294.257 665.237 null]
+>> endobj
+7408 0 obj <<
+/D [7403 0 R /XYZ 71.731 654.659 null]
+>> endobj
+7409 0 obj <<
+/D [7403 0 R /XYZ 71.731 654.659 null]
+>> endobj
+2550 0 obj <<
+/D [7403 0 R /XYZ 162.317 628.941 null]
+>> endobj
+7410 0 obj <<
+/D [7403 0 R /XYZ 251.059 613.121 null]
+>> endobj
+7411 0 obj <<
+/D [7403 0 R /XYZ 71.731 611.054 null]
+>> endobj
+2554 0 obj <<
+/D [7403 0 R /XYZ 174.677 587.783 null]
+>> endobj
+7412 0 obj <<
+/D [7403 0 R /XYZ 71.731 582.827 null]
+>> endobj
+7413 0 obj <<
+/D [7403 0 R /XYZ 71.731 580.436 null]
+>> endobj
+7414 0 obj <<
+/D [7403 0 R /XYZ 141.074 571.283 null]
+>> endobj
+7415 0 obj <<
+/D [7403 0 R /XYZ 240.077 571.283 null]
+>> endobj
+7416 0 obj <<
+/D [7403 0 R /XYZ 304.643 571.283 null]
+>> endobj
+7417 0 obj <<
+/D [7403 0 R /XYZ 334.775 571.283 null]
+>> endobj
+7418 0 obj <<
+/D [7403 0 R /XYZ 395.037 571.283 null]
+>> endobj
+7419 0 obj <<
+/D [7403 0 R /XYZ 71.731 557.501 null]
+>> endobj
+2558 0 obj <<
+/D [7403 0 R /XYZ 187.959 532.163 null]
+>> endobj
+7420 0 obj <<
+/D [7403 0 R /XYZ 71.731 529.599 null]
+>> endobj
+7421 0 obj <<
+/D [7403 0 R /XYZ 71.731 524.817 null]
+>> endobj
+7422 0 obj <<
+/D [7403 0 R /XYZ 71.731 524.817 null]
+>> endobj
+7423 0 obj <<
+/D [7403 0 R /XYZ 71.731 514.221 null]
+>> endobj
+7424 0 obj <<
+/D [7403 0 R /XYZ 139.477 499.818 null]
+>> endobj
+7425 0 obj <<
+/D [7403 0 R /XYZ 71.731 496.921 null]
+>> endobj
+7426 0 obj <<
+/D [7403 0 R /XYZ 71.731 496.921 null]
+>> endobj
+7427 0 obj <<
+/D [7403 0 R /XYZ 71.731 486.036 null]
+>> endobj
+7428 0 obj <<
+/D [7403 0 R /XYZ 139.477 471.424 null]
+>> endobj
+3438 0 obj <<
+/D [7403 0 R /XYZ 71.731 455.152 null]
+>> endobj
+7429 0 obj <<
+/D [7403 0 R /XYZ 71.731 442.241 null]
+>> endobj
+2562 0 obj <<
+/D [7403 0 R /XYZ 257.605 419.861 null]
+>> endobj
+7430 0 obj <<
+/D [7403 0 R /XYZ 71.731 409.282 null]
+>> endobj
+7431 0 obj <<
+/D [7403 0 R /XYZ 71.731 409.282 null]
+>> endobj
+2566 0 obj <<
+/D [7403 0 R /XYZ 162.317 383.565 null]
+>> endobj
+7432 0 obj <<
+/D [7403 0 R /XYZ 233.126 367.744 null]
+>> endobj
+7433 0 obj <<
+/D [7403 0 R /XYZ 71.731 354.678 null]
+>> endobj
+2570 0 obj <<
+/D [7403 0 R /XYZ 174.677 329.455 null]
+>> endobj
+7434 0 obj <<
+/D [7403 0 R /XYZ 71.731 324.499 null]
+>> endobj
+7435 0 obj <<
+/D [7403 0 R /XYZ 71.731 322.108 null]
+>> endobj
+7436 0 obj <<
+/D [7403 0 R /XYZ 136.77 312.954 null]
+>> endobj
+7437 0 obj <<
+/D [7403 0 R /XYZ 222.859 312.954 null]
+>> endobj
+7438 0 obj <<
+/D [7403 0 R /XYZ 317.557 312.954 null]
+>> endobj
+7439 0 obj <<
+/D [7403 0 R /XYZ 352.574 312.954 null]
+>> endobj
+7440 0 obj <<
+/D [7403 0 R /XYZ 412.836 312.954 null]
+>> endobj
+7441 0 obj <<
+/D [7403 0 R /XYZ 71.731 299.173 null]
+>> endobj
+2574 0 obj <<
+/D [7403 0 R /XYZ 187.959 273.835 null]
+>> endobj
+7442 0 obj <<
+/D [7403 0 R /XYZ 71.731 271.271 null]
+>> endobj
+7443 0 obj <<
+/D [7403 0 R /XYZ 71.731 266.489 null]
+>> endobj
+7444 0 obj <<
+/D [7403 0 R /XYZ 71.731 266.489 null]
+>> endobj
+7445 0 obj <<
+/D [7403 0 R /XYZ 71.731 255.893 null]
+>> endobj
+7446 0 obj <<
+/D [7403 0 R /XYZ 139.477 241.489 null]
+>> endobj
+7447 0 obj <<
+/D [7403 0 R /XYZ 71.731 238.592 null]
+>> endobj
+7448 0 obj <<
+/D [7403 0 R /XYZ 71.731 238.592 null]
+>> endobj
+7449 0 obj <<
+/D [7403 0 R /XYZ 71.731 226.543 null]
+>> endobj
+7450 0 obj <<
+/D [7403 0 R /XYZ 139.477 213.096 null]
+>> endobj
+7451 0 obj <<
+/D [7403 0 R /XYZ 142.246 213.096 null]
+>> endobj
+7452 0 obj <<
+/D [7403 0 R /XYZ 71.731 211.226 null]
+>> endobj
+2578 0 obj <<
+/D [7403 0 R /XYZ 192.609 186.097 null]
+>> endobj
+7453 0 obj <<
+/D [7403 0 R /XYZ 71.731 181.142 null]
+>> endobj
+7454 0 obj <<
+/D [7403 0 R /XYZ 353.292 144.852 null]
+>> endobj
+3439 0 obj <<
+/D [7403 0 R /XYZ 71.731 115.628 null]
+>> endobj
+7402 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7457 0 obj <<
+/Length 1014      
+/Filter /FlateDecode
+>>
+stream
+xÚ½WÛnã6\10}ÏWèÑ.V\^E
+}JÓmÑ¢Ø\ 2Y£/M\11È2ã°±%C\97ì¦_ß¡HZtd;)\90\14\ 6,Y\9a9:3sx,\92\ 4Ã\87$\92 ÉH¢0EJª¤Ü^àd\rw~¾ >"õ!i\14óÃââãO\8c&9Ê3\96\12ª\14â<\ 3\9c\fñL$\8bÕ\9f³«ûb×éf\9eR©f\ 4¹ão¦ê¿}¼^Ì   Æ³\14~Íɬÿæî]]~v'?6æ1$Þ`\81!\fîÁ\19\99ÿµøõâÓbONP\82\80Ç9ú>dB\9fÒ\84HD\89°ü}\8dR\b$r9Ð/\8b궼×åÃíJ?ÞvÅ\83®ìÓ]"G\fª\85D.\91¢ð\14\96!\9agCâçb«]$\8f:\84\93\94\88!ö<¸\1cS\bÉà1\fRmÊ\r¥Òµ¤\9cË\19äÂ÷Cë®\98;w\öþ\ 2 \9aR\87sèq[6f×\99ºò >®Ø4ºX=¹\1f\8e\86\ 3ò\97Vn\12ûº     ÊÅа4\90K©@\8c©\81â\97§ªÞµ\80\1dª\97\88H\1eªÏ\90Ó\85©:\17 ð\180\8cBùROv'\86T\19Â*\ fÍ\ 1\95<Öf5O3ÐÕw\1e\9f\8cÑ\8c\84\8f.ª'\0\9eBR\10/V#$ùþhå\19\9a\94å\88\90|\88½lÖýVW]»\7fðÁÜ%\88\8b?{r¬b\80ABÐDä\18¨Èc2¦Hf¶ØèÖóã^ñ\84RP¼\95þ\88ç$\1f\8b\8bSDAÃ!ƲÛÕ0\9b°ðºú\99¦Ú\9d\rÆ´Ü/åhñ\1e*n\94Û\91\ 6\ 2½,çpÌP\9e»\ 6^ë®oªvº\ 6ܲa0¥8ÌYÊ¡öc\ 2NÞòPÞ}«W\87궾2'j\16|Ç«ÝZÓ\aw\ 5»CÝÝëæ«iµ\8dFcM{ÿH\83\ f\b\82DæfÝèµi¡\9d·õòïÛ¶kú²{\v\ 3y\ 1û\15þ\11\92}\1f·ºm\8bµï\1càY»\08×È*È`½©\97ÅÆ»FÓ\14Ð¥ÙÓÿm\f'Ë>k\f>p°\86m»¶¹ÝI£PðO \82Q@è\14\9fP\94\93ÐÕ\ f\ e\1eAQ;.é\ 3·¦ª\9beÑê) S\bN^p\1d\9aQ$$u¶C_ë:,.ã\98å0\86\91\12ìÍ,'Â;i9!ÆR\83\85\15\94f:SlÌ?a\91\1eÊ\124   Ê\f²\jS­\ fÅ\fi\93\9d\860\18*\9dÎáhGà=\81\8büí:2â\9dî\88\8f±\ 4¿Z\8f\87C\1f,awZõÛå¡?\ 5ó³2\87\16¥dxIr\8b´ïêmÑ\99²Øl¼ßµz\ 3-\f\9dz¥)Cª\92³?æ\92\83\9döú%\8bnb\8b®ô\1a\18\91>\90\f\7f0Æ¿kì%PÚ©¸qû²î
+³ù¯n[Þ\9bÝ»Ùí\14<\9e¦\1fù\v~;¼¾\99ÝÄ`¡5¯öØ ®÷ôØI­1&¼5°\9c\9d0Yx\7f\e\92ϸlìÑ6ö\88Í\ 2)ÁßÛfc\að\9b\0ÊQ\8eåÙ­Ð\18\12vB\12ÙmÃÝ3\fû¨ß¯>]_úÝÏ/_\16î\84       \82©£\18o£8p\14$(Hâ\13Û\9d\7f\ 1>6r¤endstream
+endobj
+7456 0 obj <<
+/Type /Page
+/Contents 7457 0 R
+/Resources 7455 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7458 0 obj <<
+/D [7456 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7459 0 obj <<
+/D [7456 0 R /XYZ 71.731 814.833 null]
+>> endobj
+7460 0 obj <<
+/D [7456 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2582 0 obj <<
+/D [7456 0 R /XYZ 264.629 755.597 null]
+>> endobj
+7461 0 obj <<
+/D [7456 0 R /XYZ 71.731 746.696 null]
+>> endobj
+7462 0 obj <<
+/D [7456 0 R /XYZ 71.731 746.696 null]
+>> endobj
+2586 0 obj <<
+/D [7456 0 R /XYZ 162.317 719.301 null]
+>> endobj
+7463 0 obj <<
+/D [7456 0 R /XYZ 233.126 703.48 null]
+>> endobj
+7464 0 obj <<
+/D [7456 0 R /XYZ 71.731 701.413 null]
+>> endobj
+2590 0 obj <<
+/D [7456 0 R /XYZ 174.677 678.142 null]
+>> endobj
+7465 0 obj <<
+/D [7456 0 R /XYZ 71.731 673.187 null]
+>> endobj
+7466 0 obj <<
+/D [7456 0 R /XYZ 71.731 670.796 null]
+>> endobj
+7467 0 obj <<
+/D [7456 0 R /XYZ 136.77 661.642 null]
+>> endobj
+7468 0 obj <<
+/D [7456 0 R /XYZ 222.859 661.642 null]
+>> endobj
+7469 0 obj <<
+/D [7456 0 R /XYZ 257.294 661.642 null]
+>> endobj
+7470 0 obj <<
+/D [7456 0 R /XYZ 71.731 647.861 null]
+>> endobj
+2594 0 obj <<
+/D [7456 0 R /XYZ 187.959 622.523 null]
+>> endobj
+7471 0 obj <<
+/D [7456 0 R /XYZ 71.731 619.958 null]
+>> endobj
+7472 0 obj <<
+/D [7456 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7473 0 obj <<
+/D [7456 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7474 0 obj <<
+/D [7456 0 R /XYZ 71.731 603.225 null]
+>> endobj
+7475 0 obj <<
+/D [7456 0 R /XYZ 139.477 590.177 null]
+>> endobj
+7476 0 obj <<
+/D [7456 0 R /XYZ 71.731 586.449 null]
+>> endobj
+2598 0 obj <<
+/D [7456 0 R /XYZ 169.811 563.178 null]
+>> endobj
+7477 0 obj <<
+/D [7456 0 R /XYZ 71.731 560.644 null]
+>> endobj
+3440 0 obj <<
+/D [7456 0 R /XYZ 71.731 531.564 null]
+>> endobj
+7478 0 obj <<
+/D [7456 0 R /XYZ 71.731 518.652 null]
+>> endobj
+2602 0 obj <<
+/D [7456 0 R /XYZ 240.716 496.272 null]
+>> endobj
+7479 0 obj <<
+/D [7456 0 R /XYZ 71.731 485.693 null]
+>> endobj
+7480 0 obj <<
+/D [7456 0 R /XYZ 71.731 485.693 null]
+>> endobj
+2606 0 obj <<
+/D [7456 0 R /XYZ 162.317 459.976 null]
+>> endobj
+7481 0 obj <<
+/D [7456 0 R /XYZ 233.126 444.156 null]
+>> endobj
+7482 0 obj <<
+/D [7456 0 R /XYZ 71.731 442.088 null]
+>> endobj
+2610 0 obj <<
+/D [7456 0 R /XYZ 174.677 418.818 null]
+>> endobj
+7483 0 obj <<
+/D [7456 0 R /XYZ 71.731 413.862 null]
+>> endobj
+7484 0 obj <<
+/D [7456 0 R /XYZ 71.731 411.471 null]
+>> endobj
+7485 0 obj <<
+/D [7456 0 R /XYZ 136.77 402.318 null]
+>> endobj
+7486 0 obj <<
+/D [7456 0 R /XYZ 222.859 402.318 null]
+>> endobj
+7487 0 obj <<
+/D [7456 0 R /XYZ 304.643 402.318 null]
+>> endobj
+7488 0 obj <<
+/D [7456 0 R /XYZ 326.166 402.318 null]
+>> endobj
+7489 0 obj <<
+/D [7456 0 R /XYZ 343.384 402.318 null]
+>> endobj
+7490 0 obj <<
+/D [7456 0 R /XYZ 71.731 388.536 null]
+>> endobj
+2614 0 obj <<
+/D [7456 0 R /XYZ 187.959 363.198 null]
+>> endobj
+7491 0 obj <<
+/D [7456 0 R /XYZ 71.731 360.634 null]
+>> endobj
+7492 0 obj <<
+/D [7456 0 R /XYZ 71.731 355.852 null]
+>> endobj
+7493 0 obj <<
+/D [7456 0 R /XYZ 71.731 355.852 null]
+>> endobj
+7494 0 obj <<
+/D [7456 0 R /XYZ 71.731 343.901 null]
+>> endobj
+7495 0 obj <<
+/D [7456 0 R /XYZ 139.477 330.853 null]
+>> endobj
+7496 0 obj <<
+/D [7456 0 R /XYZ 71.731 327.956 null]
+>> endobj
+7497 0 obj <<
+/D [7456 0 R /XYZ 71.731 327.956 null]
+>> endobj
+7498 0 obj <<
+/D [7456 0 R /XYZ 71.731 316.862 null]
+>> endobj
+7499 0 obj <<
+/D [7456 0 R /XYZ 139.477 302.459 null]
+>> endobj
+7500 0 obj <<
+/D [7456 0 R /XYZ 71.731 298.731 null]
+>> endobj
+2618 0 obj <<
+/D [7456 0 R /XYZ 202.018 275.46 null]
+>> endobj
+7501 0 obj <<
+/D [7456 0 R /XYZ 71.731 272.926 null]
+>> endobj
+3441 0 obj <<
+/D [7456 0 R /XYZ 71.731 243.846 null]
+>> endobj
+7502 0 obj <<
+/D [7456 0 R /XYZ 71.731 230.934 null]
+>> endobj
+2622 0 obj <<
+/D [7456 0 R /XYZ 252.199 208.554 null]
+>> endobj
+7503 0 obj <<
+/D [7456 0 R /XYZ 71.731 197.975 null]
+>> endobj
+7504 0 obj <<
+/D [7456 0 R /XYZ 71.731 197.975 null]
+>> endobj
+2626 0 obj <<
+/D [7456 0 R /XYZ 162.317 172.258 null]
+>> endobj
+7505 0 obj <<
+/D [7456 0 R /XYZ 239.103 156.438 null]
+>> endobj
+7506 0 obj <<
+/D [7456 0 R /XYZ 71.731 154.37 null]
+>> endobj
+2630 0 obj <<
+/D [7456 0 R /XYZ 174.677 131.1 null]
+>> endobj
+7507 0 obj <<
+/D [7456 0 R /XYZ 71.731 126.144 null]
+>> endobj
+7508 0 obj <<
+/D [7456 0 R /XYZ 71.731 123.753 null]
+>> endobj
+7509 0 obj <<
+/D [7456 0 R /XYZ 136.77 114.6 null]
+>> endobj
+7510 0 obj <<
+/D [7456 0 R /XYZ 227.163 114.6 null]
+>> endobj
+7511 0 obj <<
+/D [7456 0 R /XYZ 313.252 114.6 null]
+>> endobj
+7512 0 obj <<
+/D [7456 0 R /XYZ 339.115 114.6 null]
+>> endobj
+7513 0 obj <<
+/D [7456 0 R /XYZ 356.333 114.6 null]
+>> endobj
+7514 0 obj <<
+/D [7456 0 R /XYZ 71.731 100.818 null]
+>> endobj
+7455 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7517 0 obj <<
+/Length 1120      
+/Filter /FlateDecode
+>>
+stream
+xÚÅW]oÛ6\14}ϯУ<Ì\f¿IaO\99Ûn\1d\86\ eM\8dîa\1d\fEVb\ 1¶äé#Múëw)\92\92lÉN·¹\18\ 2D\94uyyîáá!I\ 2\f\7f$P\ 4)F\ 2\8d)ÒJ\aÉî
+\a\ fðå§+â"æ.d>\88ùqyuý\86Ñ B\91dÁò> Z#Î%ä\91\88K\11\7f\84\8bM¼¯Ór6§J\87\ 4Ùç¯YÞ<]ß.g\ 4ãp\ eo3\126OöÛâæ\9dm¼*³Gßñ\13\16\18Âà\e´ÈìÏå/W¯\97\1d8A  \ 2\1cçà»\90\11|J\ 3BP$\84ÁOH\84\84 \81\12\1aa¨Ãà¿)\1f\9a]\9a×\95\19ôú\8d }¹8\98\13\ 5¬°60Ùdûc`]B*\90Âd
+\19EJFÐ\1a|:~vE\10\b3\19}>[\85êQ\11N\11\ 5ð>Æ`«7©å1˳:\8b·Ù\97tm\7fHf*4ÀÛ\97ª.\9b\ 4¦¢nJ\17\7f\97\83m\96éCVÁLBÏ\11\13s\0&#\ e\b\19R\9a¶cî²¼(ïâ*=E\8a\8c\14bX]\8c\94\93¤ø\18\ 3ðó\8cè0ÎkOE\vØ6ófwç¥\a%\0%©        þÞ\91\8brNZA¶ïqS\17»¸Î\92x»}v\8c¦Û4©=e\abë8£\12EQÔBºM\81ú\1cºj\15~\9c)\1eÆÛ&u}Õ¡ð\ 4\12\9d*\87<}\0\ 4\8fi_\87\ 1_úÙ·ÏN\ e\89\99\9e¶U¸\9aîãlÛ\83U\88\12\v\96\rÉ\82 !y;®ÑÒjóyÕª¦î;q@&M'ß\87ID#»\9aÞÅ;W\ f§Çõ8ÝL¦\1d\14¯Á[\80\ 6\7f¢T\1d+Û1±\1eØÇ&.×À\83\9dq¯íuZ%e¶¯³"\1fÈßh¿\9a\9a.7î\1c\96\15\1dýÃs^쫬ê*R\88(î+\92\82\\15\ 2÷\ 1-µÚU1Uò0\9bä@ºô%\83êº\15Ø\85h$qä"\1e\8bl=N\ 2#
+,ú$ä\87©*        \86I\8b4LZ\84\býg\ eèÇ\9d\9c)\14iv±Å>Èwr±û\18\83-/Ü\1a=,æÅ\15ùj \92Éu¨\10Æv\88¥_U÷M\9eô\1d\86B\97\ 4\80Egf}$t?ë\99SuSy»ª\8bcáûÅÝÚU§ûCÑw\1a7¿¢I\ 5À²UXü\17_bÿ\93\9e×uú\98\ 5½\89\9cÏ=\94\1fÁ\88õËõ´CU°·n]\9d\8b\19\89B\7fò±\ 3\15ƶ¦¦È\8dðͼh¢ÂaF\rgAÍ\a~Ô§\1dX\12\9c¸\ 4e.*éJ\19y\92O\ 4»«\84ã ÉÕ6¾\e§d\1c\99M6q¾ÚÇe¼[eë§Õ~Â75\8a`³ÿwé³ò¯\17²sð\ö\92¡2\8e\11\1a*\89¾ÖQù\ 1kS\8eJ\0­\ 4\7f¸\94£\ eò\9dtT\1fc\85²N\9f¼²Á\8cF¥p\r;\89g¿u"p!Oä0»¤HD~gúù÷ñî<>o\1a DKwà$'õ0I\1cÜN¨¼ÜV4Èw\9a8\17cpî\vàË[\9fwñÁ    ý\90V»k\81Y\96%üÇásuh\8c\85qtï í±>Îótkß[ZR\18µúºÃû\84ø'ï5à¢@ØÅ®5]ºÓ·\1a\eò\ryÜû\94g       }{û~\8aÙ!IîÆLykBçîÔ}\88¿RÃÁE\99²\ fs\98ª\7f[¼¾½q×è·\1f\96¶Á\ 4ÁÔÎìð>Î\99F\82\10·²Ô©{ó\18áßÝyóëendstream
+endobj
+7516 0 obj <<
+/Type /Page
+/Contents 7517 0 R
+/Resources 7515 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7272 0 R
+>> endobj
+7518 0 obj <<
+/D [7516 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7519 0 obj <<
+/D [7516 0 R /XYZ 71.731 814.833 null]
+>> endobj
+2634 0 obj <<
+/D [7516 0 R /XYZ 187.959 758.046 null]
+>> endobj
+7520 0 obj <<
+/D [7516 0 R /XYZ 71.731 755.482 null]
+>> endobj
+7521 0 obj <<
+/D [7516 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7522 0 obj <<
+/D [7516 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7523 0 obj <<
+/D [7516 0 R /XYZ 71.731 738.749 null]
+>> endobj
+7524 0 obj <<
+/D [7516 0 R /XYZ 139.477 725.701 null]
+>> endobj
+7525 0 obj <<
+/D [7516 0 R /XYZ 71.731 711.71 null]
+>> endobj
+7526 0 obj <<
+/D [7516 0 R /XYZ 139.477 697.307 null]
+>> endobj
+7527 0 obj <<
+/D [7516 0 R /XYZ 71.731 693.579 null]
+>> endobj
+2638 0 obj <<
+/D [7516 0 R /XYZ 202.018 670.308 null]
+>> endobj
+7528 0 obj <<
+/D [7516 0 R /XYZ 71.731 667.774 null]
+>> endobj
+3442 0 obj <<
+/D [7516 0 R /XYZ 71.731 638.694 null]
+>> endobj
+7529 0 obj <<
+/D [7516 0 R /XYZ 71.731 625.782 null]
+>> endobj
+2642 0 obj <<
+/D [7516 0 R /XYZ 201.483 603.402 null]
+>> endobj
+7530 0 obj <<
+/D [7516 0 R /XYZ 71.731 594.502 null]
+>> endobj
+7531 0 obj <<
+/D [7516 0 R /XYZ 71.731 594.502 null]
+>> endobj
+2646 0 obj <<
+/D [7516 0 R /XYZ 162.317 567.106 null]
+>> endobj
+7532 0 obj <<
+/D [7516 0 R /XYZ 203.238 551.286 null]
+>> endobj
+7533 0 obj <<
+/D [7516 0 R /XYZ 71.731 549.219 null]
+>> endobj
+2650 0 obj <<
+/D [7516 0 R /XYZ 174.677 525.948 null]
+>> endobj
+7534 0 obj <<
+/D [7516 0 R /XYZ 71.731 520.992 null]
+>> endobj
+7535 0 obj <<
+/D [7516 0 R /XYZ 71.731 518.601 null]
+>> endobj
+7536 0 obj <<
+/D [7516 0 R /XYZ 136.77 509.448 null]
+>> endobj
+7537 0 obj <<
+/D [7516 0 R /XYZ 201.336 509.448 null]
+>> endobj
+7538 0 obj <<
+/D [7516 0 R /XYZ 209.945 509.448 null]
+>> endobj
+7539 0 obj <<
+/D [7516 0 R /XYZ 71.731 495.666 null]
+>> endobj
+2654 0 obj <<
+/D [7516 0 R /XYZ 187.959 470.328 null]
+>> endobj
+7540 0 obj <<
+/D [7516 0 R /XYZ 71.731 467.764 null]
+>> endobj
+7541 0 obj <<
+/D [7516 0 R /XYZ 71.731 462.982 null]
+>> endobj
+7542 0 obj <<
+/D [7516 0 R /XYZ 71.731 462.982 null]
+>> endobj
+7543 0 obj <<
+/D [7516 0 R /XYZ 71.731 452.386 null]
+>> endobj
+7544 0 obj <<
+/D [7516 0 R /XYZ 139.477 437.983 null]
+>> endobj
+7545 0 obj <<
+/D [7516 0 R /XYZ 71.731 434.255 null]
+>> endobj
+2658 0 obj <<
+/D [7516 0 R /XYZ 192.609 410.984 null]
+>> endobj
+7546 0 obj <<
+/D [7516 0 R /XYZ 71.731 406.028 null]
+>> endobj
+7547 0 obj <<
+/D [7516 0 R /XYZ 71.731 404.368 null]
+>> endobj
+7548 0 obj <<
+/D [7516 0 R /XYZ 180.801 393.981 null]
+>> endobj
+7549 0 obj <<
+/D [7516 0 R /XYZ 71.731 391.154 null]
+>> endobj
+2662 0 obj <<
+/D [7516 0 R /XYZ 202.018 366.982 null]
+>> endobj
+7550 0 obj <<
+/D [7516 0 R /XYZ 71.731 364.447 null]
+>> endobj
+3443 0 obj <<
+/D [7516 0 R /XYZ 71.731 335.367 null]
+>> endobj
+7551 0 obj <<
+/D [7516 0 R /XYZ 71.731 322.456 null]
+>> endobj
+2666 0 obj <<
+/D [7516 0 R /XYZ 232.091 300.076 null]
+>> endobj
+7552 0 obj <<
+/D [7516 0 R /XYZ 71.731 291.175 null]
+>> endobj
+7553 0 obj <<
+/D [7516 0 R /XYZ 71.731 291.175 null]
+>> endobj
+2670 0 obj <<
+/D [7516 0 R /XYZ 162.317 263.78 null]
+>> endobj
+7554 0 obj <<
+/D [7516 0 R /XYZ 227.148 247.959 null]
+>> endobj
+7555 0 obj <<
+/D [7516 0 R /XYZ 71.731 245.892 null]
+>> endobj
+2674 0 obj <<
+/D [7516 0 R /XYZ 174.677 222.621 null]
+>> endobj
+7556 0 obj <<
+/D [7516 0 R /XYZ 71.731 217.666 null]
+>> endobj
+7557 0 obj <<
+/D [7516 0 R /XYZ 71.731 215.275 null]
+>> endobj
+7558 0 obj <<
+/D [7516 0 R /XYZ 136.77 206.121 null]
+>> endobj
+7559 0 obj <<
+/D [7516 0 R /XYZ 218.554 206.121 null]
+>> endobj
+7560 0 obj <<
+/D [7516 0 R /XYZ 240.077 206.121 null]
+>> endobj
+7561 0 obj <<
+/D [7516 0 R /XYZ 266.19 206.121 null]
+>> endobj
+7562 0 obj <<
+/D [7516 0 R /XYZ 292.017 206.121 null]
+>> endobj
+7563 0 obj <<
+/D [7516 0 R /XYZ 369.533 206.121 null]
+>> endobj
+7564 0 obj <<
+/D [7516 0 R /XYZ 395.36 206.121 null]
+>> endobj
+7565 0 obj <<
+/D [7516 0 R /XYZ 71.731 192.34 null]
+>> endobj
+2678 0 obj <<
+/D [7516 0 R /XYZ 187.959 167.002 null]
+>> endobj
+7566 0 obj <<
+/D [7516 0 R /XYZ 71.731 164.437 null]
+>> endobj
+7567 0 obj <<
+/D [7516 0 R /XYZ 71.731 159.655 null]
+>> endobj
+7568 0 obj <<
+/D [7516 0 R /XYZ 71.731 159.655 null]
+>> endobj
+7569 0 obj <<
+/D [7516 0 R /XYZ 71.731 149.059 null]
+>> endobj
+7570 0 obj <<
+/D [7516 0 R /XYZ 139.477 134.656 null]
+>> endobj
+7571 0 obj <<
+/D [7516 0 R /XYZ 191.143 134.656 null]
+>> endobj
+7572 0 obj <<
+/D [7516 0 R /XYZ 71.731 131.759 null]
+>> endobj
+7573 0 obj <<
+/D [7516 0 R /XYZ 71.731 131.759 null]
+>> endobj
+7574 0 obj <<
+/D [7516 0 R /XYZ 71.731 119.311 null]
+>> endobj
+7575 0 obj <<
+/D [7516 0 R /XYZ 139.477 106.263 null]
+>> endobj
+7576 0 obj <<
+/D [7516 0 R /XYZ 71.731 103.366 null]
+>> endobj
+7577 0 obj <<
+/D [7516 0 R /XYZ 71.731 103.366 null]
+>> endobj
+7578 0 obj <<
+/D [7516 0 R /XYZ 71.731 90.917 null]
+>> endobj
+7579 0 obj <<
+/D [7516 0 R /XYZ 139.477 77.869 null]
+>> endobj
+7580 0 obj <<
+/D [7516 0 R /XYZ 71.731 74.141 null]
+>> endobj
+7515 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F51 3667 0 R /F27 2966 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7583 0 obj <<
+/Length 1730      
+/Filter /FlateDecode
+>>
+stream
+xÚ­XK\8fÛ6\10¾ï¯ðÑ.b®H\89¢\84\9e\92MZ¤(\1atcô\92\ 4\vY¢½,dÉ¡¤}ô×wH\ e\927   \10ø`\8a\1cÎ{\86\1fI\17\ 1üèBP"BºH\ 2F\12\91,òÃU°ØÃÊïW\14)ÖH²\1eмÙ\]ÿ\16²EJÒ8\lv\v\96$$\8a\13\93\8bMñiys\9f\1d[©Wk&\92%%îÿOUuO×·\9b\15\r\82å\1a¾VtÙ=¹µ\9b×\7f¹Á[­\1eüÆÏ\ 1\ f\80\fÖ`DW_6\7f\½ÛôÊqF    èñ\92úH2Q\9f±\ 5¥$åÜèOiJ8g\vÁ\13\12\80\1dFÿ·²Éµ:¶ª®\8cXØ!N\ 6\a\8b5å$\8c\98%ÝÜK§í®«r»Á~m;U\16\8d\ek    \96\1eµldÕf'\92zçþ[Ï¡®p°­3] W]\1fÜè\98éì Á«Èõ\bLuý 
+Y \8eC«@I\16\934M­\92Ê\88L\ 4\8a\82Á¡.º\12Ç#Æð\9di\9d=7\8e\97ì¾\7f\9cz\862\92\ 6Æû\86àS\ eF|\ 1\96\94/\89I\ 1\1a-ïaêqE\13\90!ÝJûlì\90fîÕT$\r\ 4\89CÏQÕ3"\9dÅç"#\14É\97Û¬AQï?¸\95¬( \16Í\8añY\914$\\84Èq\9bu\85ÎZ9\15\1c     \92°\93­+\ 1ÆUwÖ\97wªx:Óâ\b9\r, (iH\92\ 4rÓø\8a;WâæJ\96@ÌR\10j*ÃÉ\9d÷K       e\11
+?¨ªÖS\ 5Ã\80°H¼¨ K\9c\82 ³¶É\9e¡\ 6ÍQæês\100P$÷)k¨vî_˯\9dlZY8&\ 3\ 3¬\91Ôä\89ðFÒ\81\96@\1e¸\90Ì\eÆÁ°Ð\e¦ô×\99\80'Dôñ\ 6\8a3\8b\ 2´(Àj2\ 3\14{¨5ÎØúº¶Z«cãæÞßþí\ 6\86\1f\98\8d\15\ 1I\82ü\¡Ã@U\85|\92\8d3U\98pF£pºÜ\86
\8a\87¬Ê%Vr¶ë;b^W\8d        ñÁ¯\9d׶:o\rZîUÓêA÷PHÚty.\r·f×\95Ä*e
+5"1\1d4(Áâ³â\13L\9cÂ\9c;\8a\1aÒÔ\8ahܺ       ·\99oïqC!\1fT.¯±?\99¥\9e\97ªT«²Rý'qeûì\16ò¬,\91\rÖoÄÆMå\94$\86ÉÝý£Ñ«>6Óà§Píq\82Ñ÷\r\17â\93\84ÔØY¹\11ªg\86EÖffÄ\9c¢fj¤¨%\7f\9el\e8f¢ñ\1a\95\18\86\1cõ¾³â&Z'\ 1I£©Ò)\8b\14²Ìf#\84Ñ&¤\99ȪÂÑÔÛ\7feÞ6îCËñAbæ\14î°g\8e\9b\ 2\9b¦\8a;=&þΡ\bî ¹º¼\9d)·          M§ÚsS3\90\1f\9c¦K\ea3\91\aé\86Ð\1d\8c%vYû9\9b«&Q_¹      ,A\93½ÈÀ\18m\ 6\a Ëö\12û *1tyï\15[[zT'RûÂRÀº\82¼³\1fû²ÞÚ\ egw\98*\ f\96ÏXâ\97OÐÄ\8a»\95m§ñ\14ýg%à\14);y\19\e\84v\93\9bPÇJî!f\ f¨hÕ\1d\ 6\16`GPÕYÁçîØ\1aÀ\84]¦Ê\93\9a\82À±b£\8a\a\11x\9að8|)¬°-\ 2ÝâÁñµ\ ecÂR\a\82\164_ ÜÒ~_¤\80\ 6©?\17?3&¼\81¾ê\9a3°scZ\92\83\7f¢O\b×Ú¬\88\99è¬QÎ\9a\81»C\17£\8fÏ\15t\rÕôF\bBEä\8d\88    G\13Pk\1e\9c\b¬?}c\997rÈ\ fº>íO!\ 3S\91p\1d\ 3´Í!\89m\9f¼Ã\89_ús®g\90B\7fN}U¹\rS)\90~QàOðW\8e×Iû\ 17f\ 2ä     \8dâ\95\9eå\16$üG¹õgð\90\95\81H\ 1\e³*ëj?å\ 5 \84öøm\f¦\86\fÃ\88DáÀ\9fô×¹\90\87± a\10à%\80Ú-ñk½\87c´j/àU\ 1÷\97èÌÉÃK\84\aÿaÈ\89\88ã¹[\ 4\83\ 5\13©ÁÒù\7f\7fá \8cÁ\85Ã\94Õ\89\9f»q\f[jÄ\0\99ŽL£Ý±\86PxxàûÕ©\19Ô\1a\9aþ±®
+{iÚO
+'\19\9fÌ\13W\0n\81|3½?$"¡gy2ë\10@Þ¡`?Ï!'~\97\1d\82\ 6\ 1d]¸'\8d\9aÄ´s\ 2Þ\83¾êýµ\9fñÏ\wù\96»°\10æ|\ 5ÜH*Ò\9fæ«\ 1¿\8b¾ò4ýýÁûÃáX\7fÂ`FÕ\83\eõ\9aÚÛô\0g\8aeU·x,\1e\8fº>jÕWé·Ü2¬éYßð\80ph;?Í7'~\97}\834#ýæ\93¥\83\8cÓ\8cBö¼\99»R÷æ\ f`Áw=\14\84ø&bCÄ\85Ï<\9b¥nÆ\82\a UÃ}Ë¢\17óiÐ\v\8eOAæcàn¾k{\89î±»Ýëy\e²²t,\1d*·ì,f3#Ûmàß\97\ 6\10½\ 4\7f\83\v\0ò\ 2ô\15\843ßØ\1fï\95C¹ë0áV\83\ 6\87Þ¶0yY8\85\9c\0\88FUYZá\97ï\v\9cÄ\91?~\88\13fïCF\90\81\98à6\832í·G\94xOOI\ 4½höb·\97\95\a\99Ö§\16³Y\8bLAÍ]uì­\98ÅC\90\ 1"/\ 3)\ 6gb8\ 1Þsy    }Sðtôâó\83x\95}\ f^µ9öÃxuØ\15ð=\91E$\ 5`óÒ\8bã\89Ä?8
+èw\16{\8dx\18µ?ܼ»}\8d\8f\8cï?nÜ ä4`Îàáke\14&\84÷øT°\v¯\8aS\rÿ\a\18¿m\98endstream
+endobj
+7582 0 obj <<
+/Type /Page
+/Contents 7583 0 R
+/Resources 7581 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7584 0 obj <<
+/D [7582 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2682 0 obj <<
+/D [7582 0 R /XYZ 192.609 758.046 null]
+>> endobj
+7585 0 obj <<
+/D [7582 0 R /XYZ 71.731 753.091 null]
+>> endobj
+2686 0 obj <<
+/D [7582 0 R /XYZ 323.685 715.705 null]
+>> endobj
+7586 0 obj <<
+/D [7582 0 R /XYZ 71.731 710.75 null]
+>> endobj
+7587 0 obj <<
+/D [7582 0 R /XYZ 71.731 710.75 null]
+>> endobj
+7588 0 obj <<
+/D [7582 0 R /XYZ 240.084 700.363 null]
+>> endobj
+7589 0 obj <<
+/D [7582 0 R /XYZ 365.612 700.363 null]
+>> endobj
+7590 0 obj <<
+/D [7582 0 R /XYZ 204.676 687.411 null]
+>> endobj
+7591 0 obj <<
+/D [7582 0 R /XYZ 174.686 674.46 null]
+>> endobj
+7592 0 obj <<
+/D [7582 0 R /XYZ 71.731 657.78 null]
+>> endobj
+7593 0 obj <<
+/D [7582 0 R /XYZ 119.552 633.945 null]
+>> endobj
+7594 0 obj <<
+/D [7582 0 R /XYZ 119.552 620.993 null]
+>> endobj
+7595 0 obj <<
+/D [7582 0 R /XYZ 119.552 608.042 null]
+>> endobj
+7596 0 obj <<
+/D [7582 0 R /XYZ 71.731 591.362 null]
+>> endobj
+2690 0 obj <<
+/D [7582 0 R /XYZ 202.018 568.092 null]
+>> endobj
+7597 0 obj <<
+/D [7582 0 R /XYZ 71.731 565.557 null]
+>> endobj
+3444 0 obj <<
+/D [7582 0 R /XYZ 71.731 536.477 null]
+>> endobj
+7598 0 obj <<
+/D [7582 0 R /XYZ 71.731 523.566 null]
+>> endobj
+2694 0 obj <<
+/D [7582 0 R /XYZ 213.602 501.186 null]
+>> endobj
+7599 0 obj <<
+/D [7582 0 R /XYZ 71.731 490.607 null]
+>> endobj
+7600 0 obj <<
+/D [7582 0 R /XYZ 71.731 490.607 null]
+>> endobj
+2698 0 obj <<
+/D [7582 0 R /XYZ 162.317 464.89 null]
+>> endobj
+7601 0 obj <<
+/D [7582 0 R /XYZ 215.193 449.069 null]
+>> endobj
+7602 0 obj <<
+/D [7582 0 R /XYZ 71.731 447.002 null]
+>> endobj
+2702 0 obj <<
+/D [7582 0 R /XYZ 174.677 423.731 null]
+>> endobj
+7603 0 obj <<
+/D [7582 0 R /XYZ 71.731 418.776 null]
+>> endobj
+7604 0 obj <<
+/D [7582 0 R /XYZ 71.731 416.385 null]
+>> endobj
+7605 0 obj <<
+/D [7582 0 R /XYZ 136.77 407.231 null]
+>> endobj
+7606 0 obj <<
+/D [7582 0 R /XYZ 209.945 407.231 null]
+>> endobj
+7607 0 obj <<
+/D [7582 0 R /XYZ 304.643 407.231 null]
+>> endobj
+7608 0 obj <<
+/D [7582 0 R /XYZ 339.66 407.231 null]
+>> endobj
+7609 0 obj <<
+/D [7582 0 R /XYZ 356.878 407.231 null]
+>> endobj
+7610 0 obj <<
+/D [7582 0 R /XYZ 391.572 407.231 null]
+>> endobj
+7611 0 obj <<
+/D [7582 0 R /XYZ 408.79 407.231 null]
+>> endobj
+7612 0 obj <<
+/D [7582 0 R /XYZ 430.9 407.231 null]
+>> endobj
+7613 0 obj <<
+/D [7582 0 R /XYZ 452.423 407.231 null]
+>> endobj
+7614 0 obj <<
+/D [7582 0 R /XYZ 71.731 393.45 null]
+>> endobj
+2706 0 obj <<
+/D [7582 0 R /XYZ 187.959 368.112 null]
+>> endobj
+7615 0 obj <<
+/D [7582 0 R /XYZ 71.731 365.547 null]
+>> endobj
+7616 0 obj <<
+/D [7582 0 R /XYZ 71.731 360.765 null]
+>> endobj
+7617 0 obj <<
+/D [7582 0 R /XYZ 71.731 360.765 null]
+>> endobj
+7618 0 obj <<
+/D [7582 0 R /XYZ 71.731 350.169 null]
+>> endobj
+7619 0 obj <<
+/D [7582 0 R /XYZ 139.477 335.766 null]
+>> endobj
+7620 0 obj <<
+/D [7582 0 R /XYZ 71.731 332.869 null]
+>> endobj
+7621 0 obj <<
+/D [7582 0 R /XYZ 71.731 332.869 null]
+>> endobj
+7622 0 obj <<
+/D [7582 0 R /XYZ 71.731 320.421 null]
+>> endobj
+7623 0 obj <<
+/D [7582 0 R /XYZ 139.477 307.372 null]
+>> endobj
+7624 0 obj <<
+/D [7582 0 R /XYZ 71.731 304.475 null]
+>> endobj
+7625 0 obj <<
+/D [7582 0 R /XYZ 71.731 304.475 null]
+>> endobj
+7626 0 obj <<
+/D [7582 0 R /XYZ 71.731 292.027 null]
+>> endobj
+7627 0 obj <<
+/D [7582 0 R /XYZ 139.477 278.979 null]
+>> endobj
+7628 0 obj <<
+/D [7582 0 R /XYZ 71.731 276.082 null]
+>> endobj
+7629 0 obj <<
+/D [7582 0 R /XYZ 71.731 276.082 null]
+>> endobj
+7630 0 obj <<
+/D [7582 0 R /XYZ 71.731 264.988 null]
+>> endobj
+7631 0 obj <<
+/D [7582 0 R /XYZ 139.477 250.585 null]
+>> endobj
+7632 0 obj <<
+/D [7582 0 R /XYZ 71.731 248.81 null]
+>> endobj
+2710 0 obj <<
+/D [7582 0 R /XYZ 192.609 223.587 null]
+>> endobj
+7633 0 obj <<
+/D [7582 0 R /XYZ 71.731 218.631 null]
+>> endobj
+7634 0 obj <<
+/D [7582 0 R /XYZ 119.552 195.293 null]
+>> endobj
+7635 0 obj <<
+/D [7582 0 R /XYZ 323.383 195.293 null]
+>> endobj
+7636 0 obj <<
+/D [7582 0 R /XYZ 234.878 182.341 null]
+>> endobj
+7637 0 obj <<
+/D [7582 0 R /XYZ 71.731 178.613 null]
+>> endobj
+2714 0 obj <<
+/D [7582 0 R /XYZ 202.018 155.342 null]
+>> endobj
+7638 0 obj <<
+/D [7582 0 R /XYZ 71.731 152.808 null]
+>> endobj
+3445 0 obj <<
+/D [7582 0 R /XYZ 71.731 123.728 null]
+>> endobj
+7581 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F51 3667 0 R /F42 3513 0 R /F50 3663 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7642 0 obj <<
+/Length 1239      
+/Filter /FlateDecode
+>>
+stream
+xÚÍXIoã6\14¾çWè(\17\15#\92")¡§43-Z\14S côÒ\14\81l3¶
+[R´ÌLúëû¸I²\16'E3há\83\16>¾å{ËG\v{!ü°'0\12\14{qHP,bo{º
+½=¬üx\85­D`E\82\81Ì÷ë«ë\1f\12\94pê­\1f=\12Ç(\8a8èá(âÌ[ï~÷o\ fiÙÈj\15\10\11û\18\99ë/YÞ~¹¾[¯p\18ú\ 1<­°ß~1k·7\1fÌÍ»*ûä6Þ\87,\ 41X\83;¼úcýóÕûuç\1c#\18\81\1f\97Ü·"\13÷        ñ°@\ 43å¿\8dQ0\86X"´ûY\9e5\ fÅæÏ\87º©Úm£,\9bM\11¢\10)l\8a\ 4\8a X \1c\91\84ëM\1fÒ\934\92Ñ\0\9dÐ\v0Ó²Ë\8aE/\9e\10\14Q
\94ô=! ¡öeé1ûKÖæE\91K\vÜ
+Ǿ\ 1Oø'Y×éÞ®\80\19  &ô½1×V²\ f\ 5£\84éø\ 3k3 \fQ\1a\1f\9f󢬳º\8bG ,"\17\ fGÌFc#`a/ \81\8dm\ 4³ñ\ eÕñ\18\12\83\90o+\18\91m\9aïä§l+\1fì\8bo¬9Ü+H"Ä\13gÎl\98Z!P\99¡\13úÖè\1a\19Ú\1e²ò\92\99\10Ñ$²\1a\ eEÝ(ù©!\1a¡¨\vÇ\1aêQ\1aè#ª&\84\15\ 4\80òjÆk(̸\87\ 6\7f7\97<*\12Ĺ\80\9b\ 4a\9c\9b\9edÞÔ\9dݳr\14PïÑ\b¯ac\81\1aÄ\18ñ\18\ 4\8d\85\98ë,\82\ 4Oàn°4¾vM\88       \81&TÝØë3]8¨{\1c\11D µ\9c\8cò®,\0:7\v\9aÂ^\ f¶¼·EUɺ,ò\9d\1e$ûI;ľ)\9eëM\91V»)\14\ 1øÅ!§\ 1¦\803\9edv\16\12®r\12½\1d$½¾eH¬Ì+ Y    _9oñÉ\9bTC\93å{'\98Õg³á\ 5LÈyuÎ\ 2B)4ÆÛáÑ©[\86Ã\88\98é²\93\96?\8aÇ\11\16\9b6;îän<
+\ 5\84ÚÅAéÀ\81q\92\85w²ÞVYÙdE>\1dæföÓÈà¸V\ 6£$ò\1fÛ|\viÑ{ô\8b³é®^\9c\8drõìüW÷ÊCX6Nê7ÐÄöæx,¶i#a¹\1e-\8dLЮQÀií'\81(\8d\9fO­lç \91ù®\1e\82¤Ø\e\\05h\ 6¬ÐÂdøäN\82»
+øXø¿­\84\95Ë\80Q½©Ò\9b¬Í\îÓ\ 6\8e\ 6ö©=m\14F\95£ÇqNÓZ\9e\17Æc\9a\1d{7;ò\ f\1c\913\8c\18\8fzÒ:|®K¹\ 5\12|\89üÙ?#ÿ±ÞAô1°\14\807æþû0$\1dô:¡³'\ 2\85\87\1at×fêÙL\81­L)ØZ4JY¥ªðê¹ú¶\ e\83À(ö³s@\ 4ðó\7f{\ eH^s\ e\10Sz^Rªè\9c:¯²ê   Êîa\89õÉKLMÔA\13úá+05à\8c\84 o6\86\aú\16ç°\93ù\8f\98z\98\8d9H°:±\89·c¦\81¾EH\9c\8cfMÍ  éÑÄw\19 \b\ 4pÙ¸u7²ô\96ª-\eÛá\95|j³ÊqÚæÙ^{Ì.°Uüz¶¢=[Ñ8Ôle¨J=Õ2­4+¨±Ccì/¤\fÃläÜ\9d\84\ f\9fón>\ eMB'ðnâeÖDc,cÿ\98Õ\8d\10ÑÖÛ²,ªFA \1eµmëGó\\82K\84\ 3\19éçÎÿÎAÕO\1cQÌ-Û\99:Rû&³r2È\19üM\89Ü,Ó\1a\1f\aÿdµ0ÇÝÔèáÓ)µ©lk\97FW\fj@ª³\9a\1eésx\86(Æ¢Ãs\91D\18Ìdî<\1d\8c{Âfi: \14Ê$NÎ\ e5ÿ\1f\1ev¶ý\9fN"\94\84ââ×\8a^Ä}¬\10Hý³\7f\1céPnÿzûþîÆ~ øéãÚÜP\86Cb\ 2\1e\88h\8c\18vE-èÂ\17\89©\87\7f\ 3\8aT^ýendstream
+endobj
+7641 0 obj <<
+/Type /Page
+/Contents 7642 0 R
+/Resources 7640 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7643 0 obj <<
+/D [7641 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7644 0 obj <<
+/D [7641 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2718 0 obj <<
+/D [7641 0 R /XYZ 202.119 755.597 null]
+>> endobj
+7645 0 obj <<
+/D [7641 0 R /XYZ 71.731 745.018 null]
+>> endobj
+7646 0 obj <<
+/D [7641 0 R /XYZ 71.731 745.018 null]
+>> endobj
+2722 0 obj <<
+/D [7641 0 R /XYZ 162.317 719.301 null]
+>> endobj
+7647 0 obj <<
+/D [7641 0 R /XYZ 209.215 703.48 null]
+>> endobj
+7648 0 obj <<
+/D [7641 0 R /XYZ 71.731 701.413 null]
+>> endobj
+2726 0 obj <<
+/D [7641 0 R /XYZ 174.677 678.142 null]
+>> endobj
+7649 0 obj <<
+/D [7641 0 R /XYZ 71.731 673.187 null]
+>> endobj
+7650 0 obj <<
+/D [7641 0 R /XYZ 71.731 670.796 null]
+>> endobj
+7651 0 obj <<
+/D [7641 0 R /XYZ 136.77 661.642 null]
+>> endobj
+7652 0 obj <<
+/D [7641 0 R /XYZ 205.641 661.642 null]
+>> endobj
+7653 0 obj <<
+/D [7641 0 R /XYZ 300.339 661.642 null]
+>> endobj
+7654 0 obj <<
+/D [7641 0 R /XYZ 335.356 661.642 null]
+>> endobj
+7655 0 obj <<
+/D [7641 0 R /XYZ 417.141 661.642 null]
+>> endobj
+7656 0 obj <<
+/D [7641 0 R /XYZ 460.221 661.642 null]
+>> endobj
+7657 0 obj <<
+/D [7641 0 R /XYZ 477.439 661.642 null]
+>> endobj
+7658 0 obj <<
+/D [7641 0 R /XYZ 71.731 647.861 null]
+>> endobj
+2730 0 obj <<
+/D [7641 0 R /XYZ 187.959 622.523 null]
+>> endobj
+7659 0 obj <<
+/D [7641 0 R /XYZ 71.731 619.958 null]
+>> endobj
+7660 0 obj <<
+/D [7641 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7661 0 obj <<
+/D [7641 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7662 0 obj <<
+/D [7641 0 R /XYZ 71.731 604.58 null]
+>> endobj
+7663 0 obj <<
+/D [7641 0 R /XYZ 139.477 590.177 null]
+>> endobj
+7664 0 obj <<
+/D [7641 0 R /XYZ 71.731 587.28 null]
+>> endobj
+7665 0 obj <<
+/D [7641 0 R /XYZ 71.731 587.28 null]
+>> endobj
+7666 0 obj <<
+/D [7641 0 R /XYZ 71.731 574.832 null]
+>> endobj
+7667 0 obj <<
+/D [7641 0 R /XYZ 139.477 561.784 null]
+>> endobj
+7668 0 obj <<
+/D [7641 0 R /XYZ 71.731 558.886 null]
+>> endobj
+7669 0 obj <<
+/D [7641 0 R /XYZ 71.731 558.886 null]
+>> endobj
+7670 0 obj <<
+/D [7641 0 R /XYZ 71.731 546.438 null]
+>> endobj
+7671 0 obj <<
+/D [7641 0 R /XYZ 139.477 533.39 null]
+>> endobj
+7672 0 obj <<
+/D [7641 0 R /XYZ 71.731 529.662 null]
+>> endobj
+2734 0 obj <<
+/D [7641 0 R /XYZ 192.609 506.391 null]
+>> endobj
+7673 0 obj <<
+/D [7641 0 R /XYZ 71.731 501.436 null]
+>> endobj
+7674 0 obj <<
+/D [7641 0 R /XYZ 71.731 474.369 null]
+>> endobj
+2738 0 obj <<
+/D [7641 0 R /XYZ 202.018 451.099 null]
+>> endobj
+7675 0 obj <<
+/D [7641 0 R /XYZ 71.731 448.564 null]
+>> endobj
+3446 0 obj <<
+/D [7641 0 R /XYZ 71.731 419.484 null]
+>> endobj
+7676 0 obj <<
+/D [7641 0 R /XYZ 71.731 406.573 null]
+>> endobj
+2742 0 obj <<
+/D [7641 0 R /XYZ 209.453 384.193 null]
+>> endobj
+7677 0 obj <<
+/D [7641 0 R /XYZ 71.731 373.614 null]
+>> endobj
+7678 0 obj <<
+/D [7641 0 R /XYZ 71.731 373.614 null]
+>> endobj
+2746 0 obj <<
+/D [7641 0 R /XYZ 162.317 347.897 null]
+>> endobj
+7679 0 obj <<
+/D [7641 0 R /XYZ 203.238 332.076 null]
+>> endobj
+7680 0 obj <<
+/D [7641 0 R /XYZ 71.731 330.009 null]
+>> endobj
+2750 0 obj <<
+/D [7641 0 R /XYZ 174.677 306.738 null]
+>> endobj
+7681 0 obj <<
+/D [7641 0 R /XYZ 71.731 301.783 null]
+>> endobj
+7682 0 obj <<
+/D [7641 0 R /XYZ 71.731 299.392 null]
+>> endobj
+7683 0 obj <<
+/D [7641 0 R /XYZ 136.77 290.238 null]
+>> endobj
+7684 0 obj <<
+/D [7641 0 R /XYZ 201.336 290.238 null]
+>> endobj
+7685 0 obj <<
+/D [7641 0 R /XYZ 296.035 290.238 null]
+>> endobj
+7686 0 obj <<
+/D [7641 0 R /XYZ 331.051 290.238 null]
+>> endobj
+7687 0 obj <<
+/D [7641 0 R /XYZ 356.878 290.238 null]
+>> endobj
+7688 0 obj <<
+/D [7641 0 R /XYZ 71.731 276.457 null]
+>> endobj
+2754 0 obj <<
+/D [7641 0 R /XYZ 187.959 251.119 null]
+>> endobj
+7689 0 obj <<
+/D [7641 0 R /XYZ 71.731 248.554 null]
+>> endobj
+7690 0 obj <<
+/D [7641 0 R /XYZ 71.731 243.772 null]
+>> endobj
+7691 0 obj <<
+/D [7641 0 R /XYZ 71.731 243.772 null]
+>> endobj
+7692 0 obj <<
+/D [7641 0 R /XYZ 71.731 233.176 null]
+>> endobj
+7693 0 obj <<
+/D [7641 0 R /XYZ 139.477 218.773 null]
+>> endobj
+7694 0 obj <<
+/D [7641 0 R /XYZ 71.731 215.876 null]
+>> endobj
+7695 0 obj <<
+/D [7641 0 R /XYZ 71.731 215.876 null]
+>> endobj
+7696 0 obj <<
+/D [7641 0 R /XYZ 71.731 203.427 null]
+>> endobj
+7697 0 obj <<
+/D [7641 0 R /XYZ 139.477 190.379 null]
+>> endobj
+7698 0 obj <<
+/D [7641 0 R /XYZ 71.731 186.651 null]
+>> endobj
+2758 0 obj <<
+/D [7641 0 R /XYZ 192.609 163.381 null]
+>> endobj
+7699 0 obj <<
+/D [7641 0 R /XYZ 71.731 158.425 null]
+>> endobj
+7700 0 obj <<
+/D [7641 0 R /XYZ 256.213 148.038 null]
+>> endobj
+7701 0 obj <<
+/D [7641 0 R /XYZ 178.4 135.087 null]
+>> endobj
+7702 0 obj <<
+/D [7641 0 R /XYZ 395.673 135.087 null]
+>> endobj
+7703 0 obj <<
+/D [7641 0 R /XYZ 71.731 131.359 null]
+>> endobj
+2762 0 obj <<
+/D [7641 0 R /XYZ 202.018 108.088 null]
+>> endobj
+7704 0 obj <<
+/D [7641 0 R /XYZ 71.731 105.554 null]
+>> endobj
+3447 0 obj <<
+/D [7641 0 R /XYZ 71.731 76.473 null]
+>> endobj
+7640 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7707 0 obj <<
+/Length 1208      
+/Filter /FlateDecode
+>>
+stream
+xÚ­WK\8fÛ6\10¾ï¯ÐQ."®ø\12)ô´Ý&E\8b"\ 56F/Ma¨2m\v°eE¢\8cÍ¿ïð%É\96½Ù \v\1fDYÃy~ß\f\89£\14~8\12\18   \8a#\99\12$\85\8cÊÃ]\1amáËowØK$^$\99Èü²¼»ÿ@I\94£<£Ñr\13\11)\11c\19èÉ\10Ëx´\ÿ\13\8aF«v\91\10!c\8cÜóϪî\9fï\9f\96\v\9c¦q\ 2o\v\1c÷ÏîÛãÃG·øµ­Naãç\94§ \ 6ß`\85\17ÿ.ÿ¸{¿\1c\9cã\ 4#ðã%÷½ÈÌ}B",\10ÁÜøïc\14\9c#\9e\vë~YÔ«µÚ\14ý^¯ªöËj]uM¡Ë\9dqÁíf\88BÈ°\9b   $       \98¢\19"yfw\7f,\ eÊI²I\9aÒ(ÁÜʾÂ\82\18÷a\ 6\9a©   ÉìûL\88pÉÑ;\15²\94\92¶Óîe¯Njï\96U\r\15\ 6²ì?z#\v\11ïÜ\1f»¢^ï!ÛCX\18åÜ&%     f\13Â\11¥Ò\1aÿôµ>6]Õ\rÁ        \84\ 5\vÁe\88\ f¡AH­Ò}[¯´\13æé(\9cI(F\bèåDLmàT \f\93\90\bÀ\ 6DèµãQ\fJÎI\90\ 2\8dW\14QÄÓ`ÿÝ"É\0\8e§cµv«\9fæ*©D\82\85\rkuZ\81ìL+É\10Æô\k§Û¾ÔnÝèU«¶ÝM#\12`(¹ßo%ç\8e\eÌÊ1\ 1øçk\95£\ 2*\ 6ØIh\ e\1eåVø¡Ýö\aUën°{\86K\ 1\f\84My\ 6:\10ç$ây
+\8e\88kD#Hd9¬&\9f.\9f\ 3'1!ÀICÎQ\9f\19è    "@° c]óxö`>©R\1f}£¨ûÃ\7f\0cÓWÞyv\0êw\80T'Zì{O\96ðW÷µÓêà×\8d*+âr\9e\9d\ 4¼Ír\ 6nS(\ f¾@ÀÕ4e¦\90ìíÒ4ê»\92&
+\94\90\83\9d\fgq\ 39\89«S¡\95\7f?Ú$º\97VÁÇm\ 5yhÕÚýUh÷ÔÕ\ 1¾ùMÇͼ\99\91T"\9aÒ\ 1­_zÕYþÎûW\96#\99ó\81íû=rj\97¦BÞÄã\ 2ËØL\0\86y\b\0\14Aö%d\81æ&\1d\80obuô\9d\82"\82uh\81\95_\r\81Ù¿\8fîÙ\ 1>\94[¶j_èêXw»ªqÿ@Tö9AÕt¯m\92A¶Ó6\83ni\18Ý\a½É\1c1\94q\94\ 3d]À¾\ 3̲\92\ 41\17Ù0\14¼Ý\95¾\ 2E\0XN¸\87"9ë\13W\81\bý\92É7äë¨ï6_½\8c\r}B±µjT½\86\ 64#$T\ e\80PëªÞzæ\1eÝ\13B³Ø\f\845Å\\87Éæ\9eê¹T\8d)«{Ý´Ãà=ï\88\81ÃТóÜ5Ä\ f\ 6qÕ^Í+ãæ4e.Á][Þw0É\1a#\8fÊQûp|H   \80ÃàÉØ0ÔJSF»uÂ\8b\1f:9¼¬zZ\r\9cÂ\ 4ÈfG\86BëÂ\ 2Lù¤\ e(\9f\1f,ÄY\ 1/\9a\1eKÕu¦h×Î\ eÞþ÷\9f\1dÆ\89\9eÞ\18{·â\9fj\94®\e\8e\a\85é\1c6$s\f»9\893\94æÁ\9cIÏÕAÌé·\ 61\81S'ÐÜ\rbòÚ9LÏì^#6a\12aØôVÄ\9eè»Iì c|\e\9aí\145C\v\9fáÊ&ß\1cBM×|\1d;\9fìÙ\11¶K\11ÿ½\10,¶ýâ&U©ï\85f\93Gv­¶ÐðOj<\1f\98\81Ö\9e÷\8fá\b]\16\9d_\99±`{IQí¿Ivz\8eÈM«Ô[q\1d¿¨zZ \14\8cH9ãz__4г\9a¸\ 2âxdt¸
+øNz<\¤È7\83\vHú»\13a(OÅ\8b7ÈQ$\ \ 52·­Í\85\ e\13Å_\8fï\9f\1eü¥ñ÷OK· \1c§ÄÅ?½}28\9cs\1c\ eç\82ݸ%Î=ü\1f\1c¤ÁPendstream
+endobj
+7706 0 obj <<
+/Type /Page
+/Contents 7707 0 R
+/Resources 7705 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7708 0 obj <<
+/D [7706 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7709 0 obj <<
+/D [7706 0 R /XYZ 71.731 768.009 null]
+>> endobj
+2766 0 obj <<
+/D [7706 0 R /XYZ 296.821 755.597 null]
+>> endobj
+7710 0 obj <<
+/D [7706 0 R /XYZ 71.731 745.018 null]
+>> endobj
+7711 0 obj <<
+/D [7706 0 R /XYZ 71.731 745.018 null]
+>> endobj
+2770 0 obj <<
+/D [7706 0 R /XYZ 162.317 719.301 null]
+>> endobj
+7712 0 obj <<
+/D [7706 0 R /XYZ 263.014 703.48 null]
+>> endobj
+7713 0 obj <<
+/D [7706 0 R /XYZ 71.731 701.413 null]
+>> endobj
+2774 0 obj <<
+/D [7706 0 R /XYZ 174.677 678.142 null]
+>> endobj
+7714 0 obj <<
+/D [7706 0 R /XYZ 71.731 673.187 null]
+>> endobj
+7715 0 obj <<
+/D [7706 0 R /XYZ 71.731 670.796 null]
+>> endobj
+7716 0 obj <<
+/D [7706 0 R /XYZ 188.423 661.642 null]
+>> endobj
+7717 0 obj <<
+/D [7706 0 R /XYZ 296.035 661.642 null]
+>> endobj
+7718 0 obj <<
+/D [7706 0 R /XYZ 317.557 661.642 null]
+>> endobj
+7719 0 obj <<
+/D [7706 0 R /XYZ 339.667 661.642 null]
+>> endobj
+7720 0 obj <<
+/D [7706 0 R /XYZ 369.799 661.642 null]
+>> endobj
+7721 0 obj <<
+/D [7706 0 R /XYZ 404.521 661.642 null]
+>> endobj
+7722 0 obj <<
+/D [7706 0 R /XYZ 477.697 661.642 null]
+>> endobj
+7723 0 obj <<
+/D [7706 0 R /XYZ 71.731 647.861 null]
+>> endobj
+2778 0 obj <<
+/D [7706 0 R /XYZ 187.959 622.523 null]
+>> endobj
+7724 0 obj <<
+/D [7706 0 R /XYZ 71.731 619.958 null]
+>> endobj
+7725 0 obj <<
+/D [7706 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7726 0 obj <<
+/D [7706 0 R /XYZ 71.731 615.176 null]
+>> endobj
+7727 0 obj <<
+/D [7706 0 R /XYZ 71.731 603.225 null]
+>> endobj
+7728 0 obj <<
+/D [7706 0 R /XYZ 139.477 590.177 null]
+>> endobj
+7729 0 obj <<
+/D [7706 0 R /XYZ 71.731 587.28 null]
+>> endobj
+7730 0 obj <<
+/D [7706 0 R /XYZ 71.731 587.28 null]
+>> endobj
+7731 0 obj <<
+/D [7706 0 R /XYZ 71.731 575.23 null]
+>> endobj
+7732 0 obj <<
+/D [7706 0 R /XYZ 139.477 561.784 null]
+>> endobj
+7733 0 obj <<
+/D [7706 0 R /XYZ 351.921 561.784 null]
+>> endobj
+7734 0 obj <<
+/D [7706 0 R /XYZ 485.454 548.832 null]
+>> endobj
+7735 0 obj <<
+/D [7706 0 R /XYZ 71.731 532.984 null]
+>> endobj
+7736 0 obj <<
+/D [7706 0 R /XYZ 71.731 532.984 null]
+>> endobj
+7737 0 obj <<
+/D [7706 0 R /XYZ 71.731 520.535 null]
+>> endobj
+7738 0 obj <<
+/D [7706 0 R /XYZ 139.477 507.487 null]
+>> endobj
+7739 0 obj <<
+/D [7706 0 R /XYZ 71.731 503.759 null]
+>> endobj
+2782 0 obj <<
+/D [7706 0 R /XYZ 143.462 480.488 null]
+>> endobj
+7740 0 obj <<
+/D [7706 0 R /XYZ 71.731 477.954 null]
+>> endobj
+3448 0 obj <<
+/D [7706 0 R /XYZ 71.731 448.874 null]
+>> endobj
+7741 0 obj <<
+/D [7706 0 R /XYZ 71.731 435.962 null]
+>> endobj
+2786 0 obj <<
+/D [7706 0 R /XYZ 244.211 413.582 null]
+>> endobj
+7742 0 obj <<
+/D [7706 0 R /XYZ 71.731 403.003 null]
+>> endobj
+7743 0 obj <<
+/D [7706 0 R /XYZ 71.731 403.003 null]
+>> endobj
+2790 0 obj <<
+/D [7706 0 R /XYZ 162.317 377.286 null]
+>> endobj
+7744 0 obj <<
+/D [7706 0 R /XYZ 227.148 361.466 null]
+>> endobj
+7745 0 obj <<
+/D [7706 0 R /XYZ 71.731 359.399 null]
+>> endobj
+2794 0 obj <<
+/D [7706 0 R /XYZ 174.677 336.128 null]
+>> endobj
+7746 0 obj <<
+/D [7706 0 R /XYZ 71.731 331.172 null]
+>> endobj
+7747 0 obj <<
+/D [7706 0 R /XYZ 71.731 328.781 null]
+>> endobj
+7748 0 obj <<
+/D [7706 0 R /XYZ 136.77 319.628 null]
+>> endobj
+7749 0 obj <<
+/D [7706 0 R /XYZ 218.554 319.628 null]
+>> endobj
+7750 0 obj <<
+/D [7706 0 R /XYZ 304.643 319.628 null]
+>> endobj
+7751 0 obj <<
+/D [7706 0 R /XYZ 71.731 305.846 null]
+>> endobj
+2798 0 obj <<
+/D [7706 0 R /XYZ 187.959 280.508 null]
+>> endobj
+7752 0 obj <<
+/D [7706 0 R /XYZ 71.731 277.944 null]
+>> endobj
+7753 0 obj <<
+/D [7706 0 R /XYZ 71.731 273.162 null]
+>> endobj
+7754 0 obj <<
+/D [7706 0 R /XYZ 71.731 273.162 null]
+>> endobj
+7755 0 obj <<
+/D [7706 0 R /XYZ 71.731 261.211 null]
+>> endobj
+7756 0 obj <<
+/D [7706 0 R /XYZ 139.477 248.163 null]
+>> endobj
+7757 0 obj <<
+/D [7706 0 R /XYZ 71.731 244.435 null]
+>> endobj
+2802 0 obj <<
+/D [7706 0 R /XYZ 202.018 221.164 null]
+>> endobj
+7758 0 obj <<
+/D [7706 0 R /XYZ 71.731 218.629 null]
+>> endobj
+3449 0 obj <<
+/D [7706 0 R /XYZ 71.731 189.549 null]
+>> endobj
+7759 0 obj <<
+/D [7706 0 R /XYZ 71.731 176.638 null]
+>> endobj
+2806 0 obj <<
+/D [7706 0 R /XYZ 230.508 154.258 null]
+>> endobj
+7760 0 obj <<
+/D [7706 0 R /XYZ 71.731 143.679 null]
+>> endobj
+7761 0 obj <<
+/D [7706 0 R /XYZ 71.731 143.679 null]
+>> endobj
+2810 0 obj <<
+/D [7706 0 R /XYZ 162.317 117.962 null]
+>> endobj
+7762 0 obj <<
+/D [7706 0 R /XYZ 221.171 102.141 null]
+>> endobj
+7763 0 obj <<
+/D [7706 0 R /XYZ 71.731 100.074 null]
+>> endobj
+7705 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F27 2966 0 R /F50 3663 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7766 0 obj <<
+/Length 807       
+/Filter /FlateDecode
+>>
+stream
+xÚµV[oÚ0\18}çWä\11&Åøs|\8böÔví´iê¤6oÛ\84RHi¦\91°\ 4ªv¿~\9f\ 2\84\8b:&\1ebããïz\8emð(þÀS@T\0\9e¦\8ch¥½éb@½9®|\1c\80\ eâw0\97Ñ`|\130/$¡\f¼èÑcZ\13Î%Ú\91\84KáE³oë§x¹J\8a\91Ï\94\1e\ 2±ß/i¶~\19ßE# tèãl\ 4Ãõ\8b]»º¸µ\83\ fEú\oüN\ 5E\18®á\bF?¢Ï\83먠   N0 \18Ç¡ð\1dd'|Æ<\0\12
+aâ\a\b\89\10ÌSB\13\8ay\98øï_³|Y¦¥ñ9¾á¸H@q\83¦\9e\ f\92Ø,\9fótf\11\82\bô)Ð\ 1­ Ó8\9bL\9fÒåä±H\92IZüÞµ¨\14áÚÁMÆåªXOW#_b\95p{µÛMß9oÐîÖ\92аv\86Ð]û \b\13\0Þ[ÌF\11|\86%
+¸ðü $X\91
+|QÌ×\8b$[\95\8dÛ¦é¦\f
+¹Á7\1cwÛS\97U*J¨\86¾þ0¢¤\89½³´ýmZ      \fãc8èس½TmTÀ\19aØÂ\1acb[æiÖPq\95\8d@\ fkÊMGjh\12¨&Uõ\91\98«u\91´uâX\eYÕ  -\vÀ2q$\ 1X\ f@$     \rǵr<ÆÁe\1e\17³Ò\8eãlæV­\e\1cÝ\98\0Ò,þ\95þ\89Wi\9e¹\7f×ÙÔÌÊÖ36\ f\84«x  HësQÎó\87\9f\93Y\9eõEÉ\15ѦV\81$,´\8c¾\8d\17\8d\8d6\8a
+Ûo´S[©\91Ö\r\8d\18S¶^³\ 4+\96¿\96vfvî\16x\81õLÊ2\9e»Et\92 Ã{Xè\9cøL\90 Ðç\95âNv][\ 2\9b\1e\15º\9d\aD\88Ǥ®w#´G\84\8c\84À\8f\89\10$6\ e7¼I\84Îo\9f\ 69~C\1d\9eM\83\1d{{5XcNÓàb\93\1fH\98\8a"­$7õب¢Ñ#6PH^\9f¹Õ¡y\8a8ÄÉâè±ÚÉZq$â[´Ñ9|Ô°H\96ERb³í\99ÐÃ\90ÊÏ\7f\91Çn~\eú\10\18¿ÝRú\84kê¸B4Å\8e\ 4翦\18\r\b¥òl\12éØÛ+\91\1as¶kê\98,fÉs:MÎvkì7ÛI\16[ÏÅ1ml\11¿\12CþxH7ÖçøÁ\³Û=u¯VÆIHÕÁwm\v©\9fµ\8a\84ª\12ô\86\r\13û׫ë»\v÷\94ýt\1fÙA \802\9bt÷MÌñª6Ï\ 3\9bµ\12{Þ®»\11þ\ 5PÿÒñendstream
+endobj
+7765 0 obj <<
+/Type /Page
+/Contents 7766 0 R
+/Resources 7764 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7767 0 obj <<
+/D [7765 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2814 0 obj <<
+/D [7765 0 R /XYZ 174.677 758.046 null]
+>> endobj
+7768 0 obj <<
+/D [7765 0 R /XYZ 71.731 753.091 null]
+>> endobj
+7769 0 obj <<
+/D [7765 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7770 0 obj <<
+/D [7765 0 R /XYZ 141.074 741.546 null]
+>> endobj
+7771 0 obj <<
+/D [7765 0 R /XYZ 218.554 741.546 null]
+>> endobj
+7772 0 obj <<
+/D [7765 0 R /XYZ 304.643 741.546 null]
+>> endobj
+7773 0 obj <<
+/D [7765 0 R /XYZ 71.731 727.765 null]
+>> endobj
+2818 0 obj <<
+/D [7765 0 R /XYZ 187.959 702.427 null]
+>> endobj
+7774 0 obj <<
+/D [7765 0 R /XYZ 71.731 699.863 null]
+>> endobj
+7775 0 obj <<
+/D [7765 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7776 0 obj <<
+/D [7765 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7777 0 obj <<
+/D [7765 0 R /XYZ 71.731 683.129 null]
+>> endobj
+7778 0 obj <<
+/D [7765 0 R /XYZ 139.477 670.081 null]
+>> endobj
+3450 0 obj <<
+/D [7765 0 R /XYZ 71.731 653.809 null]
+>> endobj
+2822 0 obj <<
+/D [7765 0 R /XYZ 450.023 623.57 null]
+>> endobj
+3451 0 obj <<
+/D [7765 0 R /XYZ 71.731 620.492 null]
+>> endobj
+7779 0 obj <<
+/D [7765 0 R /XYZ 71.731 604.712 null]
+>> endobj
+2826 0 obj <<
+/D [7765 0 R /XYZ 187.453 585.409 null]
+>> endobj
+7780 0 obj <<
+/D [7765 0 R /XYZ 71.731 574.83 null]
+>> endobj
+7781 0 obj <<
+/D [7765 0 R /XYZ 71.731 574.83 null]
+>> endobj
+2830 0 obj <<
+/D [7765 0 R /XYZ 162.317 549.113 null]
+>> endobj
+7782 0 obj <<
+/D [7765 0 R /XYZ 185.305 533.292 null]
+>> endobj
+7783 0 obj <<
+/D [7765 0 R /XYZ 71.731 531.225 null]
+>> endobj
+2834 0 obj <<
+/D [7765 0 R /XYZ 174.677 507.954 null]
+>> endobj
+7784 0 obj <<
+/D [7765 0 R /XYZ 71.731 502.999 null]
+>> endobj
+7785 0 obj <<
+/D [7765 0 R /XYZ 71.731 500.608 null]
+>> endobj
+7786 0 obj <<
+/D [7765 0 R /XYZ 141.074 491.454 null]
+>> endobj
+7787 0 obj <<
+/D [7765 0 R /XYZ 192.728 491.454 null]
+>> endobj
+7788 0 obj <<
+/D [7765 0 R /XYZ 274.512 491.454 null]
+>> endobj
+7789 0 obj <<
+/D [7765 0 R /XYZ 71.731 477.673 null]
+>> endobj
+2838 0 obj <<
+/D [7765 0 R /XYZ 187.959 452.335 null]
+>> endobj
+7790 0 obj <<
+/D [7765 0 R /XYZ 71.731 449.77 null]
+>> endobj
+7791 0 obj <<
+/D [7765 0 R /XYZ 71.731 444.988 null]
+>> endobj
+7792 0 obj <<
+/D [7765 0 R /XYZ 71.731 444.988 null]
+>> endobj
+7793 0 obj <<
+/D [7765 0 R /XYZ 71.731 433.037 null]
+>> endobj
+7794 0 obj <<
+/D [7765 0 R /XYZ 139.477 419.989 null]
+>> endobj
+3452 0 obj <<
+/D [7765 0 R /XYZ 71.731 403.717 null]
+>> endobj
+7795 0 obj <<
+/D [7765 0 R /XYZ 71.731 390.806 null]
+>> endobj
+2842 0 obj <<
+/D [7765 0 R /XYZ 195.113 368.425 null]
+>> endobj
+7796 0 obj <<
+/D [7765 0 R /XYZ 71.731 357.847 null]
+>> endobj
+7797 0 obj <<
+/D [7765 0 R /XYZ 71.731 357.847 null]
+>> endobj
+2846 0 obj <<
+/D [7765 0 R /XYZ 162.317 332.13 null]
+>> endobj
+7798 0 obj <<
+/D [7765 0 R /XYZ 191.283 316.309 null]
+>> endobj
+7799 0 obj <<
+/D [7765 0 R /XYZ 71.731 314.242 null]
+>> endobj
+2850 0 obj <<
+/D [7765 0 R /XYZ 174.677 290.971 null]
+>> endobj
+7800 0 obj <<
+/D [7765 0 R /XYZ 71.731 286.016 null]
+>> endobj
+7801 0 obj <<
+/D [7765 0 R /XYZ 71.731 283.625 null]
+>> endobj
+7802 0 obj <<
+/D [7765 0 R /XYZ 141.074 274.471 null]
+>> endobj
+7803 0 obj <<
+/D [7765 0 R /XYZ 197.032 274.471 null]
+>> endobj
+7804 0 obj <<
+/D [7765 0 R /XYZ 283.121 274.471 null]
+>> endobj
+7805 0 obj <<
+/D [7765 0 R /XYZ 71.731 260.69 null]
+>> endobj
+2854 0 obj <<
+/D [7765 0 R /XYZ 187.959 235.352 null]
+>> endobj
+7806 0 obj <<
+/D [7765 0 R /XYZ 71.731 232.787 null]
+>> endobj
+7807 0 obj <<
+/D [7765 0 R /XYZ 71.731 228.005 null]
+>> endobj
+7808 0 obj <<
+/D [7765 0 R /XYZ 71.731 228.005 null]
+>> endobj
+7809 0 obj <<
+/D [7765 0 R /XYZ 71.731 216.054 null]
+>> endobj
+7810 0 obj <<
+/D [7765 0 R /XYZ 139.477 203.006 null]
+>> endobj
+3453 0 obj <<
+/D [7765 0 R /XYZ 71.731 186.734 null]
+>> endobj
+7811 0 obj <<
+/D [7765 0 R /XYZ 71.731 173.822 null]
+>> endobj
+2858 0 obj <<
+/D [7765 0 R /XYZ 213.603 151.442 null]
+>> endobj
+7812 0 obj <<
+/D [7765 0 R /XYZ 71.731 142.542 null]
+>> endobj
+7813 0 obj <<
+/D [7765 0 R /XYZ 71.731 142.542 null]
+>> endobj
+2862 0 obj <<
+/D [7765 0 R /XYZ 162.317 115.146 null]
+>> endobj
+7814 0 obj <<
+/D [7765 0 R /XYZ 203.238 99.326 null]
+>> endobj
+7815 0 obj <<
+/D [7765 0 R /XYZ 71.731 97.258 null]
+>> endobj
+7764 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7818 0 obj <<
+/Length 1882      
+/Filter /FlateDecode
+>>
+stream
+xÚ­XY\8fÛ6\10~ϯð£·\88¹"u§Oé6)R\14i\91¸OMQh%Ú&"\8b.%íñï;á\ e[\927(\82ÅB3ä\883\9cùæ\90ùÊ\83\8a9\8b}¾J<Á\928YåÇWÞj\ f;¿¼âNbãD6#\99\9f¶¯nßûb\95²4òWÛÝJ$        \v\82\bÎ\89X\10\85«mñ×úî\90\9d\1ain6"NÖ\9cÑó7UµO·\9f¶7ÜóÖ\eànøº}¢½»·\1f\89øÙ¨\87îÅ/^è\81\18ì\ 1ÅoþÞþúêݶ7.\14\9c\81\1d×Ìw"\13ó\85XqÎÒ0Dû9OY\18\8aU\1c\83{ ý\9f\9f+}ªU\8d:oß\a°Éx\1c ´·Úð\88Ñ-\1f´*H"ô\ 6  Ð\19\82\ 2Ï\8aäYUÈ\a\95Ë\7f
+]ÉéqQÀÂ(vÂxߺ1mÞÜl"ðÑð²[øÁiãÃ\ 1iÀ¢49Ó6Õ" 2^2há?\92Ì\99\1f\83\17ÒpµñS\ 6N±Âo;=ʪ©{Í}ÜÑ\131À#¸P=\8eQçÛ(ö\98\97ð¹   \16G)P£­Ëg\1fO.\ 4Ä\13\88Ñy\14Ðx°\8b\a\82        \88c'\83Ö\9d´ªz<6Úaî\86\ ewäèÛ{\9d\19\80eA\8b\14\8cÖÈÁ]1\13\9cÜ\ 5Ç\87@nB\887j&'\1c2S<ff\1co|-`>Bk·
+b\96à\rü\88\89\94Àö1;\ eÈ8sohe¯\9c<ºv
+YÈy\17c!âî^p     ý\\13gäÉÈ\1aâ\99Á%\e¥+ZÖ;zfe¹è\9aÚú¦¨ç\90ãtoDÈ|?ùî\194sóñ\81±\ f\9cCýëËYÄ=\9fù^<Rù8\93E\80+/x1\8b\84\abéÿÎ"Ò<\97DAè3/M¾[\12\8dÎ[L¢Nf1\89\9a\83tÐÒºYFSÚ£ÉF\ 3á\ 5\11¹\ 4¥EäµTó\99\10\94\98°­$ñ\9a:\ 4Ñ\7fÖÙ^\12ù¡Úis¼8²OCp»\ f=!\1c\ eã¬{¯nÀòÌe\a¬üa¤\91ÿ¶ªV\8d¬§\89×eô([·\9dS*ùä\9cr\9fÕ*'2×U¡\1a\ 5\19¨+\97\97½/* \99Vgæ\99X¸Â\85\9bñ¶gÉ9ê\97­½ý\ 2z|\1f\9c\a­f®Ov2\9b\91P\a\89\98¥ñ¸Mv"®Ì\84\13}\ 2\9c\9cÌê»\ 2IzgNÿ\0I\ 1\ 6ðàÌ\80Z\1fÑ/Q@ \8bÂuÝ\9eÀ±'m\1aYÐJó|\92õX(\18\957`,¨wY.IÜU9»\85Åä ö\a÷¶¡g©\1f\9d®\93\94\ 5\16\ 2F\e\1fm\ 6\0aábÈ\80À\ 6Ѣƿ(ï\ 2\8a\ 6\ 1æA\99¦ÍÊ)¸|pL_Õ­i®3É\ 6/\9a¬Ùb¼½\90ÅP®®Ç{\10Z\8c·\13y1ÞS}ß\10ï©þi¼G\ 6äÙ}i\83\19Gk\188\1cÑг\84Àˬv\1c
+KPû":×Ç\13d6\1cBü£j0¸qØ%X489¢\80ó߫%æîp\14\ e°®"º³À9}h\8559\83*\12\88\0\9e\1aÎ1Äô\0\ eÂ=\ 6qÅÚÀ\88¶ Bb\0\15r³ \12\83 kcË \ 2\87FÑ9¨ðÌ\11¨,ÿîA:ã\8f\9a\15\82\ fʲ\7f\86Þü&^\97Êö7èz)v1Gèã\11}T©<k$­É\fÅ\ fÄ\90ÿ\91êÝ\83\8cÚÍÜ\rñ\18¤Îê\93ÑX(I¼ÔùÜ5#\ 1c\84ï^PNVV\b¡\82\18[^ý\14[\10\1c@&£qêä.\9b\bæÅâ,\9e®àâ7Ìbî\89\10º§ÿB­\1d  -å^'òRîÍè{9÷fôOrolÀ£6_UµÇ\9e\18Ñ·\1c\91õsÝÈ#µÊGìj6¥\80ɪg\920ÐÔª\86hÁ"öôº£\ 3öD²6Õì\92`îܯÒT²$ÚNum\8e!ßµeéÎ\85v\8cU~\9cs\ 4HÛ¹yh\15ðäõÀ\bÑ3\ 2¾uF\8cðÆ\f\89YkáBÌ#\8e,ªíǨ\95µVÃsp\r0\94E\96Üu\ 2ý]\80Î\8d®ëÍL¥À\8a¢Ê~b\99\ 5\16\f\9a1\f\815\b-\ 2Ë\89¼\b¬©¾o\0ÖTÿ\14X#\ 3\14M\6)½h]\81\a\1e°Xx1Õx\´\89
+\vMfö²¡5h¿¹úây"§=(ô²Ô'\18´\11\84N^ë²&qÄÐ/ww\17\aß\ 3\90\eÕ\ 5õl\v¦ÒÍ\f¸ \ 5 Ò}kÈâ¤\8f.ÒµnM.kbrm`²=á¼\876íq5µ£3îÚ¶\82\84iq·²\bº<\8f.\9eØ)\ 5¾°\9dÆÁ\rI×        .ÁdQv\ 1)øR\83@`=\vXÄI\10\8a¼\9d6ýx]éj\93\19[\ 13;¬úI\9fè°](ø°R÷­\9b\8ca³>è¶,h\17\83*$mìµvË\10ZÓPnÀºý\84 \rÊ\r¿\emýx<ÚN½>\9esÕhDg½,^\89Æù\ f\8c·>ª';\83AY?êBÒâØ%v\8b\9a\0ìL~\9f²\17ÇvT\93\81_\13\9b\15øK\81Â\93l÷°\87W´àÞ8\80Dæh\bûôZ÷n¬\87ª\86 Â,x³\94ü\1cÞ\8bÃäzò\8f\84\96\92¿\13y)ùgô½\9cü3ú'É?6àÒÝÂ_C\9ck\8a\ e00ë\13\ 2Ot)\8cäÒ±\18\e|\8eFnàh6\ 4bæø~\ 2@f´þ\15ÇGW¦\81í\12y\1a3*\10\\8c*\81\83\13.\1e\81°iι\r1òPNNð\9d\87s\1d²ö\e\11       è\8e0&uÉ\r\vÊ\1dÐÖN\ 2?[ðùûÝ»OoéÐs¬Îä\7fw1û}]ÂX,\87ßT\ fMszs{û\b\9fákø\17á\9aÁ4e2¦Í\9e>g.\10á~\ 6\86\18§^|õ\87âA¤û\9d¸Cßù\19h¢½\8eûmøÃç-\11~È=1\9dþ\ 2?\ 1èt\1fBq´ðcðÔÂÿ\0l>´kendstream
+endobj
+7817 0 obj <<
+/Type /Page
+/Contents 7818 0 R
+/Resources 7816 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7819 0 obj <<
+/D [7817 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7820 0 obj <<
+/D [7817 0 R /XYZ 71.731 814.833 null]
+>> endobj
+2866 0 obj <<
+/D [7817 0 R /XYZ 174.677 758.046 null]
+>> endobj
+7821 0 obj <<
+/D [7817 0 R /XYZ 71.731 753.091 null]
+>> endobj
+7822 0 obj <<
+/D [7817 0 R /XYZ 71.731 750.7 null]
+>> endobj
+7823 0 obj <<
+/D [7817 0 R /XYZ 141.074 741.546 null]
+>> endobj
+7824 0 obj <<
+/D [7817 0 R /XYZ 205.641 741.546 null]
+>> endobj
+7825 0 obj <<
+/D [7817 0 R /XYZ 300.339 741.546 null]
+>> endobj
+7826 0 obj <<
+/D [7817 0 R /XYZ 71.731 727.765 null]
+>> endobj
+2870 0 obj <<
+/D [7817 0 R /XYZ 187.959 702.427 null]
+>> endobj
+7827 0 obj <<
+/D [7817 0 R /XYZ 71.731 699.863 null]
+>> endobj
+7828 0 obj <<
+/D [7817 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7829 0 obj <<
+/D [7817 0 R /XYZ 71.731 695.081 null]
+>> endobj
+7830 0 obj <<
+/D [7817 0 R /XYZ 71.731 684.484 null]
+>> endobj
+7831 0 obj <<
+/D [7817 0 R /XYZ 139.477 670.081 null]
+>> endobj
+3454 0 obj <<
+/D [7817 0 R /XYZ 71.731 653.809 null]
+>> endobj
+7832 0 obj <<
+/D [7817 0 R /XYZ 71.731 640.898 null]
+>> endobj
+2874 0 obj <<
+/D [7817 0 R /XYZ 243.265 618.518 null]
+>> endobj
+7833 0 obj <<
+/D [7817 0 R /XYZ 71.731 609.617 null]
+>> endobj
+7834 0 obj <<
+/D [7817 0 R /XYZ 71.731 609.617 null]
+>> endobj
+2878 0 obj <<
+/D [7817 0 R /XYZ 162.317 582.222 null]
+>> endobj
+7835 0 obj <<
+/D [7817 0 R /XYZ 215.193 566.401 null]
+>> endobj
+7836 0 obj <<
+/D [7817 0 R /XYZ 71.731 564.334 null]
+>> endobj
+2882 0 obj <<
+/D [7817 0 R /XYZ 174.677 541.063 null]
+>> endobj
+7837 0 obj <<
+/D [7817 0 R /XYZ 71.731 536.108 null]
+>> endobj
+7838 0 obj <<
+/D [7817 0 R /XYZ 71.731 533.717 null]
+>> endobj
+7839 0 obj <<
+/D [7817 0 R /XYZ 141.074 524.563 null]
+>> endobj
+7840 0 obj <<
+/D [7817 0 R /XYZ 214.25 524.563 null]
+>> endobj
+7841 0 obj <<
+/D [7817 0 R /XYZ 317.557 524.563 null]
+>> endobj
+7842 0 obj <<
+/D [7817 0 R /XYZ 71.731 510.782 null]
+>> endobj
+2886 0 obj <<
+/D [7817 0 R /XYZ 187.959 485.444 null]
+>> endobj
+7843 0 obj <<
+/D [7817 0 R /XYZ 71.731 482.879 null]
+>> endobj
+7844 0 obj <<
+/D [7817 0 R /XYZ 71.731 478.097 null]
+>> endobj
+7845 0 obj <<
+/D [7817 0 R /XYZ 71.731 478.097 null]
+>> endobj
+7846 0 obj <<
+/D [7817 0 R /XYZ 71.731 467.501 null]
+>> endobj
+7847 0 obj <<
+/D [7817 0 R /XYZ 139.477 453.098 null]
+>> endobj
+3455 0 obj <<
+/D [7817 0 R /XYZ 71.731 435.996 null]
+>> endobj
+2890 0 obj <<
+/D [7817 0 R /XYZ 349.844 399.875 null]
+>> endobj
+3456 0 obj <<
+/D [7817 0 R /XYZ 71.731 396.182 null]
+>> endobj
+2894 0 obj <<
+/D [7817 0 R /XYZ 304.439 367.022 null]
+>> endobj
+7848 0 obj <<
+/D [7817 0 R /XYZ 71.731 361.075 null]
+>> endobj
+7849 0 obj <<
+/D [7817 0 R /XYZ 71.731 349.134 null]
+>> endobj
+7850 0 obj <<
+/D [7817 0 R /XYZ 71.731 347.473 null]
+>> endobj
+7851 0 obj <<
+/D [7817 0 R /XYZ 129.514 333.267 null]
+>> endobj
+7852 0 obj <<
+/D [7817 0 R /XYZ 129.514 320.316 null]
+>> endobj
+7853 0 obj <<
+/D [7817 0 R /XYZ 71.731 318.249 null]
+>> endobj
+7854 0 obj <<
+/D [7817 0 R /XYZ 129.514 305.704 null]
+>> endobj
+7855 0 obj <<
+/D [7817 0 R /XYZ 371.961 292.752 null]
+>> endobj
+7856 0 obj <<
+/D [7817 0 R /XYZ 349.063 279.801 null]
+>> endobj
+7857 0 obj <<
+/D [7817 0 R /XYZ 71.731 266.735 null]
+>> endobj
+7858 0 obj <<
+/D [7817 0 R /XYZ 129.514 252.237 null]
+>> endobj
+7859 0 obj <<
+/D [7817 0 R /XYZ 71.731 224.267 null]
+>> endobj
+7860 0 obj <<
+/D [7817 0 R /XYZ 129.514 211.722 null]
+>> endobj
+7861 0 obj <<
+/D [7817 0 R /XYZ 71.731 182.091 null]
+>> endobj
+7862 0 obj <<
+/D [7817 0 R /XYZ 71.731 156.48 null]
+>> endobj
+7863 0 obj <<
+/D [7817 0 R /XYZ 71.731 130.577 null]
+>> endobj
+7864 0 obj <<
+/D [7817 0 R /XYZ 71.731 128.917 null]
+>> endobj
+7865 0 obj <<
+/D [7817 0 R /XYZ 129.514 112.758 null]
+>> endobj
+7866 0 obj <<
+/D [7817 0 R /XYZ 198.335 86.855 null]
+>> endobj
+7867 0 obj <<
+/D [7817 0 R /XYZ 71.731 84.788 null]
+>> endobj
+7816 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F42 3513 0 R /F50 3663 0 R /F51 3667 0 R /F27 2966 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7870 0 obj <<
+/Length 2407      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YK\93ä¶\r¾ï¯èÛjª¶Ù¤¨çTmU\9c\8d\9dZ\97í]ÛS¾dsPKìieÔ¢¬Ç<òë\ 3\10 ZýØ\89\9d\81 H\82 ð\11\0Õj%á§V©\12©V«L\86"K³Uyx#W÷0ò÷7\8ag¬yÊz1ç¯wo6ßép\95\8b<Ñ«»Ý*Ì2\11E        ÈID\94Ä«»ê\1fÁ\87\8d¦¿Y\87i\16(Aí\ fu;=o~¹»QR\ 6kèݨ`z¦±\ fßüDÄßúúÑ/ü"c Ó`\f(uóÏ»ïß|{7+\17\87J\80\1e¯©\1fIÐ?É\80\88D\ 6s¯ÍQ*\17q\1cÂYãLH8\87?c\98®R\91§xD?ÇOÁ#~    Ãø\%\15FBgÇy\8býÎÛãþ¼æÚþ³\8dU\b
+¨èD\81\85\8aQ\18\ 5½)\9aõX\1f\f*¶ù.Zx)\8f\84J5l\89K\ fEÓØ\92&-·\89¤\90\93\86©ël?
+\12ýq¤¶\1e°\8d\83¢\81ͪ\17f¶åM\1a4Se*Ï vÜ\e\9aþé÷¿|ã\95lL1\98\e\95\ 5\ 2U\0\13èH\84I\8a\10y¬Üîn¿\\a\12±5ÔVö©mlA[A\7f×Û\ 3Q\9f\0\rô\9eÌ\96\88¡\1eyéÎöDئ2L\9e[\11X¨ \88\ 2\1d\ab\14\83\17Ù4Ncɪ\86\84\ 4\80é~\1c»ÛÍæéééFÁq\85-M_\bÛßo@_\10æTÞ\94öÐÙÖ´ã°©ÛÊ<\8býxh\10Ûl\bt\ 4 AE"Q$û\ e\r\18¦\17z"kèLY\7f\912,©ÿcñ`°Û ÞȨÛ]_\fc\8f÷¬\1c§\9eEÕ<ÜÚ\91\88ª\86Iõv\1aѦÈxªÇ=Q£ß¿\9cú\1e\14ç\9dÇ¢]\9fX\82\9cV\15=HÐ:Æ»þ\ 1=\8c×\1aûó\16µm\89ób\10ZH}\9eñð\8e'\83\8bAg4\192\92`\87'\0Û»\8ewóúd\83®@\b>\14÷\86úèjl{\ 3û\9aGsÅo\83\9dú\92l\951\8c\(úíW"¶/Ô¢.æy¤\ e¸ðP´Õí|ÃR¸W\11^\1e-\85ÂX\19J¡áªâ\ eå#HOÐmÕm7\98\1e"ÛmÑÚöå`§á/0Ê8!M\0\9e÷F´f¼ÝÀPoí¸qÃ$¢±÷p«ø\149D¾ôl\8b\7fëÿÛ^¥¥Ö±6ØSÁ\8c\´À\ 6¯%\85\8fp\ 5\18\93v\10ÃRg]\b¼B礠D`\11b\ 6ÈÒàç©.\1f\88üØ\ 2\88\9a¦ @xN\ f8\ 5Æp%4¥"\v1\Æ®å$ÓÞ\e\11\9e\19\80­7åh\11÷ìº\1d-Q\fèì\ 4¡nÑ"ñ\90\8d\88\9c\8a}¹ô=¢Ji\87.\95Sx.+ö\e\ 4G¸-°øòPëy\9d\16iF§ªÛGû\80 N$ÄiGÅy\0\17§©Ç\17
+.4øý\rÐÓ0Ro|éxÑÛÙ1Çô\11Å"\91Ñ\1cý\1fÌ¥.!f\16?å-\89*¼ð=«Áè'.\9c\8c·\9cY\15Ú\9cì\88Ýao§\86\870öÕ\8dá\88\9fj\91DÙÉuÄ c'¶µé{Û\ f¯\18\1a.[\9c¾r\9cÙ´p.\9dkÊ);\10\9e;\f¸X\98ç\14\v\81ÕõvÛ\98\ 3u8üåî¼p ÐÛáô\1d1\ek\1fh"Ú\a[\8cºý0ò0\98å(µ\9aJ\17Us\8e'0á-jü\96x³A±cûkQ
+\10\87f\96ÚÃ\ 1(°S\87¦Ò\92r-ò(ôSZu\8c\1fç\85ÅÖÒl\1dtv\18j8*­¥cÃ\11\ f\ 3\93¸×¼\18\1d×\98çc\87­q%þ\9bç\ 2çrH­}Û\9e\16¤©\80==LÛÁ¸[/f\89ÇüÇa\ 26ÏÀ\80\8cD\9eä\97ìx{\91¶Û\7f\81@¢Ù(@ç.O_\16F*\8bE®=ðáª
+{årä"Ë2\9eã\8aQ'\9dÂ
\83i\19É\aÓ·¦¡-1\85\15pÖ­×á\0\80 \1aã       åÐuè\82Zxâv\1fjÖQ\16\7fEs\b²h&RjÓÔÛ\rI\1f6¡ Ùà\96yv\96\8b$ñÇ|¾\94\96\888LxøÊr0R\9aòð˵Õ\99\8c½*d\81\rù\ 4\12ƾ¸\12û¨¦V\v\9b\99%\ 1\14:ÁÞ\95\99ÐqxD\13´.\ 3#\8b¯ÌÀ¶KrH»ñ \f[cªá<zw \rÄ\9f{\8fÎ\11¶±~\b\12\1dÕ>\88Ç\12\8a\82a\aõ\86\ f·¯E¡\1c`1G!\17ðk\86ì\1f\8aö\14\92 p\9aÇÚe\1c \11³Xþ\98áe\18)&I\a\ 1\98´\e\b}È¢Ø%¹\8e\ 3pM\ 3\85\1aHÜ-µtår\8a¾\13¾È°\88|GÓ\97{¶¶2,n\ f\80\95Á#\ f¸¼     \93·^\10\94ýX'^\ 6*pÊT¼b4_\1f\81ߣ\8cê£Ã\ 3ìËUË!I\12"7 \18\16\18\92\8b\11jrE­¼¬\81^\17£®\8aQ\97b\84\10\7fVvz*\9b»é\15ßûÓëT¤ËÒ^çPºöÅÁ\80s\ 6Ìèè\9cH\ 6\1f?Ñ`QU=À\91\98\94)\80\v\81\a2äÔ\8dÔ¥L\8c3ìÎO\80\12\90êyà\1e\v\1d¿vW\94¼¢t5;\ e´ÆÏwN×Îé\97~®PÕ\ 3ìè2EâSF
+\18k\11º÷ðШ\ 4\8d¹3â\18\81\83\98\ 6>×ø¸\1a\9f\-Ñ[^Eµ\10ïC\15:²©\1c\91s(¸\92\89Ø"é\9cÌñ\9a\1fí\fý\14\1e\86\aHe\òùú\90S\18¿\0L\ 3¯·×+ý\98«¶áàqB9Ä\91û§÷]ÝÅ\1c\18úßßGLÚ÷ò9\93\82\94P\v%3\86
+Þu­å1ø¹\1eZ\ fÉp\91X\80MGFj\80§lé`\80=Ûò\84\92ßiÒ?ò©³£G\93\f>\7fü\fÞ\88©³µól.2ý\16\97Ø@ÔêT\ 6,\13¨->í\1cå\91|\99\81¥\12\99öÉåkvÑ\98.|\8a!Ì¥ry\11°ëÜ~±A\ 6%`âs[t)z\99Û\ 4       "à\ 2±£wgª\0÷CÙ×\1dæ\r\ 2\ f¯\eÎ\9a­\8fg/|Z×±HÏRÓ\ 2\811¿Ä±m©¥p\1dG\8b''t¨BÂ\8aÉ\15I\8eçòF¬ç\8d\91\86´Ó\8f,±´=V\10Í\vuéùP\e\1euWéÂL\1a
+\8a|~\ 2à\92+ï0\1d\8aH©ù\13Ñv.b4\94ô:>;­/b´Tô%\a      ºÝ!§+ä¸*
+[ã\9e30v,î\80}\0ØÐÃ\1e:ÎãøÖç×\1fò\18ð°®BÃQZî\ 3´ÄÀb±ègE\96¹P\A19_\85àJ\10wt\19²æ'\8dâ\83\0﩯ÇÑ´Ää\9a\10Ø\{^â='\92«%3\96¾p\13\10BwWJ%\99\8a\0¦[\8aª .@Áß'÷òE\16ÈñîÀ5q~â\8eÉÇ5\87\94©;ýÌ\ 1kñ9\80\ 6<ùÔqZ\96ÓKê\879¼Â­ö\95\93\ f¡_;w\16B\ 5\9aÿ\99\97Ñl>v\ 3ÁøÊ\93\10\1e\93\91P\80[*Ç(mÛ\8e¾#ø\80ü¿\87ã\93¢íä£\v¼}øuÀt¦­L[Ò-ÃüÂP¡LBíÔUÅè\ræ-¿Hcÿõµ\vÛÌ\89f]ü±"sÖwù\8dÃ\19e©Z\v©\8eô\1em×y\1d©äð\98\1cRhç]½üà\10F\89\7fp d]y¥Ç1\1cÕ?a¾j\86µû\8bA\9e=û½P2E\7fæêÓaþ\µüVÏ\7fm\84\91Èeúê\9f\1fÇ)þ¿\ fÿ¿À©\fÔÊ}çæÿ;>þzG\84\8e\15TôîXË?N"\r§J|,MÓ¯üÁq©á\7f\091Êÿendstream
+endobj
+7869 0 obj <<
+/Type /Page
+/Contents 7870 0 R
+/Resources 7868 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7639 0 R
+>> endobj
+7871 0 obj <<
+/D [7869 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7872 0 obj <<
+/D [7869 0 R /XYZ 129.514 758.046 null]
+>> endobj
+7873 0 obj <<
+/D [7869 0 R /XYZ 223.687 758.046 null]
+>> endobj
+7874 0 obj <<
+/D [7869 0 R /XYZ 132.832 732.143 null]
+>> endobj
+7875 0 obj <<
+/D [7869 0 R /XYZ 71.731 687.9 null]
+>> endobj
+3457 0 obj <<
+/D [7869 0 R /XYZ 71.731 651.83 null]
+>> endobj
+2898 0 obj <<
+/D [7869 0 R /XYZ 344.421 621.59 null]
+>> endobj
+7876 0 obj <<
+/D [7869 0 R /XYZ 71.731 615.966 null]
+>> endobj
+7877 0 obj <<
+/D [7869 0 R /XYZ 71.731 600.833 null]
+>> endobj
+7878 0 obj <<
+/D [7869 0 R /XYZ 265.156 579.792 null]
+>> endobj
+7879 0 obj <<
+/D [7869 0 R /XYZ 71.731 565.896 null]
+>> endobj
+7880 0 obj <<
+/D [7869 0 R /XYZ 71.731 541.241 null]
+>> endobj
+7881 0 obj <<
+/D [7869 0 R /XYZ 71.731 498.659 null]
+>> endobj
+7882 0 obj <<
+/D [7869 0 R /XYZ 305.486 487.775 null]
+>> endobj
+7883 0 obj <<
+/D [7869 0 R /XYZ 160.164 474.823 null]
+>> endobj
+7884 0 obj <<
+/D [7869 0 R /XYZ 249.828 474.823 null]
+>> endobj
+7885 0 obj <<
+/D [7869 0 R /XYZ 262.331 474.823 null]
+>> endobj
+7886 0 obj <<
+/D [7869 0 R /XYZ 71.731 458.144 null]
+>> endobj
+7887 0 obj <<
+/D [7869 0 R /XYZ 71.731 421.254 null]
+>> endobj
+7888 0 obj <<
+/D [7869 0 R /XYZ 71.731 351.917 null]
+>> endobj
+7889 0 obj <<
+/D [7869 0 R /XYZ 71.731 309.335 null]
+>> endobj
+7890 0 obj <<
+/D [7869 0 R /XYZ 221.389 256.688 null]
+>> endobj
+7891 0 obj <<
+/D [7869 0 R /XYZ 349.31 256.688 null]
+>> endobj
+7892 0 obj <<
+/D [7869 0 R /XYZ 460.496 243.737 null]
+>> endobj
+7893 0 obj <<
+/D [7869 0 R /XYZ 319.515 217.834 null]
+>> endobj
+7894 0 obj <<
+/D [7869 0 R /XYZ 71.731 201.155 null]
+>> endobj
+7895 0 obj <<
+/D [7869 0 R /XYZ 202.221 190.27 null]
+>> endobj
+7896 0 obj <<
+/D [7869 0 R /XYZ 71.731 187.823 null]
+>> endobj
+7897 0 obj <<
+/D [7869 0 R /XYZ 71.731 162.604 null]
+>> endobj
+7898 0 obj <<
+/D [7869 0 R /XYZ 365.696 141.563 null]
+>> endobj
+7899 0 obj <<
+/D [7869 0 R /XYZ 71.731 138.596 null]
+>> endobj
+3458 0 obj <<
+/D [7869 0 R /XYZ 71.731 115.964 null]
+>> endobj
+7868 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F22 2958 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7902 0 obj <<
+/Length 2949      
+/Filter /FlateDecode
+>>
+stream
+xÚ­ZëoÜ6\12ÿ\9e¿ÂÀ\ 1\975\10Ñ"E½ÚK\0Çq\v_\93Øgûú¥)|ò\8aöê¢\95¶zøq\7fýÍpHI»Òî¦uà\ f\1a\92£áèÇyrÍ\ f\øã\a!g¡Ç\ f"W°(\8c\ eæËWîÁ=¬üü\8a\e\ eÇ°8\ 3\9e÷ׯ\8e~òÄAÌâÀ;¸¾;\10QĤ\f@NÀdà\1f\§¿ÍN\16ɪQÕ¡#ÂhÆ\19=?fEûtty}È]wæÀè\90ÏÚ'Z;9þLÄ\87*{°/~q}\17Ø`\r(~øûõ?_\9d^wÊù\823Ðc\97ú\86e¤¾\10\a\2\ f\94\ 6ýÍ7\86\ 2£>Ì0\ fµ\8eÂÙYQ7I\9e'MV\164\93ÁLÕÎq¢F¥@^ØÃ!C\16   Ø\9bûðÔÒ®\17êÐñb\8e\0\9c\1còh\86ß\8aãeòÕ¬ÔeÞ\92<=lª\f°Qz$f\rÐ%\91w-ÐyþLlIÛ\94ˤ12
+PñÁÐ_UU¨\9cè²m\fqg¥+ö,Ó6Wø\r\80\97Ã\ 5\8b}Ry^.W\19}3À \85?û¤u\95"\98ÕÏu£\96DWjÞV5*\8a<Í¢*Ûû\ 5-\19\154>rh.Òg<ôaCÜ\bÅÞe¤Ã:\8e¾`n \f[S\92Ðd~\18Î\16\99zP´c­r5§\93ÁeøBü\16GÄ!\13^h>\89k\11Uv¿hЮÄlU©UUÎU]\97\956Æ74\ f_\rðÂ\87\93\ 1\8aYR¤DäYñÕN¦Y\85{>ÀW\83\ 6\8c\19ëUUÏ«le¬\ 5&\10u|¢h\8d!\ e\9a¤ºWMmv¹CW\19\1fÂÒ°G`q\ fåÜZ \1eÓ3ÕvÒùKS®Ì¼V±¬\9eixWæyùXw[\ 4L\84\9eÞ\ 2¾k\9e\14NZ=\1cáI|q]\91«Þù\92\1cÍmÊù8\8f\99\ fz\ 6¡`Üõ§¼O°0\88\81\1a,m>;GåB\80£\ 21\90G\9e\bîÅL\86a·'~ÀÐ¥\f"c84\90|f¾N[\b¨\1f\v\1f\9e\1e\v\89E]Í{<Ð\13{HRu\97´yC\13¥Ù  â\ 3\11λ~Ç\9bf\91Õ7äb;!\94 \ 3\17ß\ fÂ^Þv\b\r\ f~÷g¥R°D.ü@û\19\10!86\84$ô2\9aÖæj\96êg@\84B\80\1eÛX£9ë²­æª6K9X-0\9b0¢§®\ 1\14Ã\vhOXý-n*ãÀø¶JõÐ\aH\8b6Ñ¡O¯ÞZ¢-Èm\97ªh²âÞÌ6\v5\11zB\9f¹"Ø\ez\ 2À]x\86-ÕVPdÚû\88u Òñ¼\90\852^\v5¿\9c^~>ýxóñüäøÐ÷g×gç\9fß\1eaä®+mZ9&BG0ø\13ãÝ\ 5d\8e\18\92\15m\ f¸y\9eor\88'g\9dýáì­Z\0¾îì!CKÄe\ 4\17Wð ñ©uOiÍ`\ 2áÑì0\84½j\8bBÃ'CÙ\1d)ÒàN5\ 5X\18è\80\88D^\96_\89ºÃ­\91X%Í\82(\1d­áÙ\19\ 3\ e0\ e\12\7fk\85lÝ&+Æ\87ç®A\f\18Þ\1e\91oÕG\82\11;¬uìQ\fÙ\\1a\10\9fÆâ\ 2æ\v¿Ãxôúð\b\9e§Þ\8e\+üè¶Íòt|\8eàj"²ÆÖGdNIÃ\93Þìì\8e\9e\ 5\1e\96\ 4¼Z\9dÞhr\10Ãq¨\9e²ºÑ\19ç\rM\94y\8a\81\ eßÃ\88\aÆe\f\14p\92\11\ 3_[\ 3\8cÒPÔa®ÓHmÂW]·K\95\9a\ 1\96ei\1fÆ\869\ 1ê\12\99v0×e±ì\80i\87ö>\ 6(\82zÑ÷·\0¤?Äs¡\ e\13Ò\84iaÂôî\83\ f$s½xýà×\9c{÷ÁÛ\90;8øõ·#×_;øQâ¼ú÷û\ fg\97\0âÕ[ÆØÑzZé\13\89ù\86]\99Á÷]æ\aü»e\86\81¼­\99Áòô\85ë Ä{~\ 4FºZå\99Jǧ\ fE\97ëí¯ë $\8fl]§Ã\15¥\9b\15T¿Ùm®h\17\1dUpÅ\86_\fM8ÖE,0\98rnÀ¢Ëe|\15Ëå\8ah¨ô\9cÞ'$d¼¡O\8c\8a@\8c\92Tú*\13O\13
+\9e¾®\0±\12 ^\13\95µ\ 3\9bȪ        ÝâÐ\1ab\86/ä4¤À\f⫲®\1d³Iúfã59(\9b7òb\17Lá(gUYb^\1d\9f\81\1f±0ü¦Cp¹\8dM\ 5\15\0(\17\93¯'Ü\99J3\9dyi\ e\ eÃÌ[EÅ Å\0º+\9c\80\93d=@<$UfOÁ\8dÁ\91׳e¢\ f]Jwvry~uusrþéâìã)Lyñ¬^\94m\9eÒò¼,\9a\ 4K_\1c¤Ð\ 3äå
+³>M4e\99;:~v<+\f\8bÚ8\9eÞÐ\f%+ ÔS²t&P^uh\r@\85\829\92Öd\93jéP\ 2\9f\80U\82\8dù\83Ìíbg@\ 5\16>w\0\1fL\9b>\10f\8dEÒ´n®0°+3q«Û\9f¯Ä\9a\15\93Ô¾­\84\15S\ 3\8fl\ 3»ùÍ´`+Ýi31­ñ X\1e81g\81\1fü\85Êù\e\ 2\9e\84\1e\~¿x×\8bÛ\1aî\f\vE;\9b\ fWIm(hý«ÆÐ\95JtÞ\fw6\1dT\fP&5W\ 4}>ëº\ eÉ\ 2S}ë\10¢{gEN\16\80)0\ 6p\8d%\r\1e3¬®p\19º~\8cpÐøgs\9a1{\9a\ 1\99:\81\ 4\13\9e\1a\9a\ 2w\85j:5Û`\19®\19´¡æ+\1a\82Õ4Kî×\1d\85Ð*ÊZõ\95\0ÁFú²ÎòBhô¥F\eÞã\9e~?\80Z¹on\ 3\88¥ó\¡\ 6\93ï\90dúê\ 2\87âÝßùØ<\1d+WDÌ\8b½>g\89@êÊ·ª\e\1a\80\85êÂ% :Ô®ç\135L,\99çÙÐØi1vu\17\8a\17\eh³"Í ?·[à½\8c\93ªÆ´/8õ\90äm·\\98I\8d<\12\v\r;RtÌ"ð1%â1ç\ f]\ 2\93\83Ð)̾÷¦\115ÕÝ
+\92\v%ÑÁ\81`\bé\8cpã`B&86\ 2P·EÑÆÁ8'ôÔe\v\12\81\83\1f­QÄàlá\96WÛ&Ëëo\7fù7þû\ fÄpD·(õ\11v\15iùX°za\96NÈziP\94F"µ\15\9e\16\8dª4hZ£¾ÂÆá\7fºz\15\83\99Ë\0$g\95yLâÜë±h5_\94ÆX\19\16Ee\ 5§}3Oª´f\vZèY¾pOþ\r \0;4ª|>~ÿñôæäøòÃÍ*[Ñ$7ò¶
\91\1ePW\8eõ1É\ 5×mrAºk¬´\1f1Éx¼ë[¶Héª\ f}8ë58\8aì\9b oRê¯\8aëõüDW\97\9a¶×\13:\9a$\ 5+Ç/þIöé}ÊÛÿ\82Á\18­1Ò2Ã\ 4\aØ\91s\12I\9f¹\84ô1\18C\85kÉÉ#ÔÖ*þ¤µÚÛ\ 4ÄíõT\90´>Þ'\1d*Í\Ùe.Ïõ¡\7fü\9f\99¥\8càúT\ e"\9b\9aCö«uE\bC¼{Áe\b\11B\96ÃB÷\9eæt}\ e<E»¼µ\92í\gÔ4l\9eWTÙô\1c·%Z{\9f\8b³>CSäÄtkB]Z\16\86º5\97\9ePÂꫧÍ\10¹v\9fc®G+Û¹]\\9c_^\9f~¸¡ô~ùá\8a\16°\82Åë[\8c¬°Ðë¶\ 6i¥ÖÛj,òsÕX\rU=\a\19\83»á\81N\83\ 2b\0\12Õ"U²\ 4!Õ¶\10î¹\8cãO4Âe\1e÷MZ¨Á\9d\86\ 6®ÉÅãÛ®ßí^\ f"\16\85¶Ä{ý\f~i\98á \1e\93\1eï¨_é:¸ê\8f        ©Ææ\8cTà1ö¯\8dbB¤ïÃ![þ¬\9c\92H©ÞJ4\9f\94¤)\18\9aFÿ8\84D6[ênEû«\86º~7á\14Â÷4íàõÝ\9aSDF\0R6k{nl\9d"2N\ 1\aµRó\fm\89ì\99ìht\9fÀ¡\86æ\1d\14\8bDZ.øe®\85óÍÔUT$y\8föÔ\85¡þÅÉ´'E:q©\ 1ÅJ×îeå\84\ ex1\1a\1a\86\81ÉéïÊî6qÑ9\89\fS\vÑÁT¹B©é2·wÝ_\ f#\7ffk ¬\8d­³Ô
+·ëÌý\16\ä¹s\9feR¯ÿàÑÝ\90Q\10¨\8d;êáµ½\91Zûr\ f\7fçÛ    ¿Ï\82Î\ 1 3´ÔRNF\99\94w?lëaÀ\19Áf'¯ó\1dËã\f\98lk\12²8ÔúlÈAµ¾\bá\8fö\13R_¤Lì·£3¢wFû\ f\v`.@\ 1\14\80\ 4çO\18\1eø\10ç\9då®\aÓ®-¸8»ðû\80Ø6øSLµ\1e«?]|$âøç­°B\13îûñ\1eX{¦­°\1a\96½°\8e÷û\ 6X7ö\9f\84\0À\1a¼\0Öà;Àêr\16Ëp\ f¬=ÓVX\rË^XÇû}\ 3¬\eûOÂ:P\0`\r_\0kørX£\10\9aH\7f7ª=Ï6P\rÇ>LÇ\9bí\87tcó)D\a»\ 3 Ñ\v\0\8d^\ ehH?Éí\ 4´çÙ\ 6¨áØ\aèx³ý\80nl>\ 5è`wÝ%8\13¹\B.\97Þ^LOðõ\7fÑàìêئ«ªÿéÆbû˯\87¡\9c\1d_\9d^ný\95!\82\ 2\85ï\86¶çÙ\ 6­áØ\aíx³ýÐnl>\ 5í`w\82öîeÐþô2hͽ)|@ì\86;ÿ±ªg±ÿWe\81]\97\81:\9f\9f\9c^\1e3«Ù5\11\9eÏ]ó#òð\9f²¤\17\ 10Ö9ÃhË?O\8d5ü? z\92Ïendstream
+endobj
+7901 0 obj <<
+/Type /Page
+/Contents 7902 0 R
+/Resources 7900 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7972 0 R
+>> endobj
+7903 0 obj <<
+/D [7901 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2902 0 obj <<
+/D [7901 0 R /XYZ 294.611 757.665 null]
+>> endobj
+7904 0 obj <<
+/D [7901 0 R /XYZ 71.731 754.624 null]
+>> endobj
+7905 0 obj <<
+/D [7901 0 R /XYZ 364.727 728.893 null]
+>> endobj
+7906 0 obj <<
+/D [7901 0 R /XYZ 71.731 700.923 null]
+>> endobj
+7907 0 obj <<
+/D [7901 0 R /XYZ 71.731 697.602 null]
+>> endobj
+7908 0 obj <<
+/D [7901 0 R /XYZ 71.731 685.512 null]
+>> endobj
+7909 0 obj <<
+/D [7901 0 R /XYZ 139.477 672.105 null]
+>> endobj
+7910 0 obj <<
+/D [7901 0 R /XYZ 71.731 669.208 null]
+>> endobj
+7911 0 obj <<
+/D [7901 0 R /XYZ 71.731 657.118 null]
+>> endobj
+7912 0 obj <<
+/D [7901 0 R /XYZ 139.477 643.712 null]
+>> endobj
+7913 0 obj <<
+/D [7901 0 R /XYZ 414.503 630.76 null]
+>> endobj
+7914 0 obj <<
+/D [7901 0 R /XYZ 139.477 617.809 null]
+>> endobj
+7915 0 obj <<
+/D [7901 0 R /XYZ 139.477 591.906 null]
+>> endobj
+7916 0 obj <<
+/D [7901 0 R /XYZ 229.141 591.906 null]
+>> endobj
+7917 0 obj <<
+/D [7901 0 R /XYZ 241.644 591.906 null]
+>> endobj
+7918 0 obj <<
+/D [7901 0 R /XYZ 340.421 578.955 null]
+>> endobj
+7919 0 obj <<
+/D [7901 0 R /XYZ 71.731 576.057 null]
+>> endobj
+7920 0 obj <<
+/D [7901 0 R /XYZ 183.59 565.173 null]
+>> endobj
+7921 0 obj <<
+/D [7901 0 R /XYZ 192.885 565.173 null]
+>> endobj
+7922 0 obj <<
+/D [7901 0 R /XYZ 271.659 565.173 null]
+>> endobj
+7923 0 obj <<
+/D [7901 0 R /XYZ 71.731 563.609 null]
+>> endobj
+7924 0 obj <<
+/D [7901 0 R /XYZ 139.477 550.561 null]
+>> endobj
+7925 0 obj <<
+/D [7901 0 R /XYZ 236.507 550.561 null]
+>> endobj
+7926 0 obj <<
+/D [7901 0 R /XYZ 198.25 524.658 null]
+>> endobj
+7927 0 obj <<
+/D [7901 0 R /XYZ 163.058 511.707 null]
+>> endobj
+7928 0 obj <<
+/D [7901 0 R /XYZ 156.319 498.755 null]
+>> endobj
+7929 0 obj <<
+/D [7901 0 R /XYZ 139.477 485.804 null]
+>> endobj
+7930 0 obj <<
+/D [7901 0 R /XYZ 71.731 484.187 null]
+>> endobj
+7931 0 obj <<
+/D [7901 0 R /XYZ 71.731 470.817 null]
+>> endobj
+7932 0 obj <<
+/D [7901 0 R /XYZ 139.477 457.41 null]
+>> endobj
+7933 0 obj <<
+/D [7901 0 R /XYZ 71.731 453.682 null]
+>> endobj
+7934 0 obj <<
+/D [7901 0 R /XYZ 71.731 426.119 null]
+>> endobj
+7935 0 obj <<
+/D [7901 0 R /XYZ 71.731 424.458 null]
+>> endobj
+7936 0 obj <<
+/D [7901 0 R /XYZ 71.731 401.756 null]
+>> endobj
+7937 0 obj <<
+/D [7901 0 R /XYZ 213.888 388.805 null]
+>> endobj
+7938 0 obj <<
+/D [7901 0 R /XYZ 71.731 372.125 null]
+>> endobj
+7939 0 obj <<
+/D [7901 0 R /XYZ 71.731 259.481 null]
+>> endobj
+7940 0 obj <<
+/D [7901 0 R /XYZ 321.592 234.704 null]
+>> endobj
+7941 0 obj <<
+/D [7901 0 R /XYZ 71.731 230.977 null]
+>> endobj
+7942 0 obj <<
+/D [7901 0 R /XYZ 71.731 216.364 null]
+>> endobj
+7943 0 obj <<
+/D [7901 0 R /XYZ 218.554 199.777 null]
+>> endobj
+7944 0 obj <<
+/D [7901 0 R /XYZ 304.643 199.777 null]
+>> endobj
+7945 0 obj <<
+/D [7901 0 R /XYZ 373.515 199.777 null]
+>> endobj
+7946 0 obj <<
+/D [7901 0 R /XYZ 429.473 199.777 null]
+>> endobj
+7947 0 obj <<
+/D [7901 0 R /XYZ 71.731 175.008 null]
+>> endobj
+7948 0 obj <<
+/D [7901 0 R /XYZ 290.67 162.057 null]
+>> endobj
+7949 0 obj <<
+/D [7901 0 R /XYZ 309.413 162.057 null]
+>> endobj
+7950 0 obj <<
+/D [7901 0 R /XYZ 351.65 162.057 null]
+>> endobj
+7951 0 obj <<
+/D [7901 0 R /XYZ 353.9 149.105 null]
+>> endobj
+7952 0 obj <<
+/D [7901 0 R /XYZ 71.731 147.038 null]
+>> endobj
+7953 0 obj <<
+/D [7901 0 R /XYZ 71.731 145.377 null]
+>> endobj
+7954 0 obj <<
+/D [7901 0 R /XYZ 129.514 131.172 null]
+>> endobj
+7955 0 obj <<
+/D [7901 0 R /XYZ 129.514 131.172 null]
+>> endobj
+7956 0 obj <<
+/D [7901 0 R /XYZ 71.731 129.104 null]
+>> endobj
+7957 0 obj <<
+/D [7901 0 R /XYZ 129.514 116.559 null]
+>> endobj
+7958 0 obj <<
+/D [7901 0 R /XYZ 129.514 116.559 null]
+>> endobj
+7959 0 obj <<
+/D [7901 0 R /XYZ 71.731 114.492 null]
+>> endobj
+7960 0 obj <<
+/D [7901 0 R /XYZ 129.514 101.947 null]
+>> endobj
+7961 0 obj <<
+/D [7901 0 R /XYZ 129.514 101.947 null]
+>> endobj
+7962 0 obj <<
+/D [7901 0 R /XYZ 71.731 99.88 null]
+>> endobj
+7963 0 obj <<
+/D [7901 0 R /XYZ 129.514 87.335 null]
+>> endobj
+7964 0 obj <<
+/D [7901 0 R /XYZ 129.514 87.335 null]
+>> endobj
+7965 0 obj <<
+/D [7901 0 R /XYZ 71.731 85.268 null]
+>> endobj
+7966 0 obj <<
+/D [7901 0 R /XYZ 129.514 72.723 null]
+>> endobj
+7967 0 obj <<
+/D [7901 0 R /XYZ 129.514 72.723 null]
+>> endobj
+7968 0 obj <<
+/D [7901 0 R /XYZ 71.731 70.656 null]
+>> endobj
+7969 0 obj <<
+/D [7901 0 R /XYZ 129.514 58.111 null]
+>> endobj
+7970 0 obj <<
+/D [7901 0 R /XYZ 129.514 58.111 null]
+>> endobj
+7971 0 obj <<
+/D [7901 0 R /XYZ 71.731 56.043 null]
+>> endobj
+7900 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+7975 0 obj <<
+/Length 3098      
+/Filter /FlateDecode
+>>
+stream
+xÚÕ[YoÜ8\12~ϯðc\e\98¦EÝZì\ eà8ɬg&ÇÆÆb\80É \90%u¬që\88¤¶ãÅþø­â¡¦$²Ù¹v±ð\83Hª¨*~_±X$ÝôÄ\81?z\12Q\12yô$v\\12GñIV=qN>À\9b\9f\9eP!±\16"kEæéõ\93³\17\9e{\92\90$ôN®7'n\1c\13ß\ fá;!ñÃàä:ÿ}uq\9b¶CÑ\9d®Ý(^QÂ\9f¿\96õîÓÙÛëSê8«5ÔNéj÷\89¿»8\7fÅ\vϺò^v|ç\ 4\ e\88Á;(ÑÓ?®\7f~òüz4.p)\ 1;\ e\99ï;`\7f\18CÁ'1Èêd(MH\10¸0Ö &\ e\8cC\8eÑ\8dN"\92D8D)#Ep\88ï\7\98\9bD]\9fxñ^NÑ7\7fîõ\8b>\vý¾\821uÁ\0êO\fh³,­×=ÚÀ\8c\1d\85}Jbß\83¯£Ô\ f\1cÊM#0\1dn\v^xs\81ݯxåòê\9c\17²´\ 3Vr^¹yäÏ_þy\1aù«ó«ço\17\ 3\96Àø\1eñ=ß\ 2ð^È\b°\10±\ 2¼Ôw\ 4À3ýZ\80\15\ 38Àù×\ 1üì\e\ 1ìÆ$vm\1e¼\172\ 2,D¬\0\1d\ 1ðL¿\16\806+\11¢\8f\1a\84#\10¢v\84/±ÿ?Æ\1a\16"\84Ø\8cï\18X|\11y®~>¥ñê\1cb\92£\8b2#pÔ'`ÑaüG\19#ü\Â\8aþBÙ\11àO\95k±ßk\17Ðç_      ý³/\82Þý<èÃ\ 4\9e\80ãAì\15!\13øRÄ\86¾F\9f\1dþ¹~\1dþª\ 1\82\80þ+   ¸ú"\ 2èg\12\10û$\89\ 3\v\ 1{!#\ 1BÄJÀRß\11\ 4Ìôk   P\f¨{$`  ¿\17\908\fmð_0à^QÇ\97\ 4\9cQ\a\ 2»?Fù\19\r¯®.\8dðF\ eñ"Ï\ 2ï^È\b¯\10±Â»Ôw\ 4¼3ýZx\15\ 3²\f±Y \v\92q\1c\7f\11º¾ÉÃ/\9az(ª¶éÒNié\9amoD<\b /´DsEÈ\88¸\10±"¾Ôw\ 4â3ýZÄ\15\ 3Ò²ÒB~\9cC\9f\84Þ\ 2x\81:øó\b¼Î§Ï»¬©&\88\8b°òØ\ 3!fô!\7f¢~bA\7f/dD_\88XÑ_ê;\ 2ý\99~-ú\8a\ 1m¶.\1dïKÑ\7fs±¾\84ÞóT\11\b\98c~ùÛoçHÒµ\11]7$\81\17ZÐÝ\v\19Ñ\15"Vt\97ú\8e@w¦_\8b®b@\9bU^\18;_\9e\8a¿\³þÇÅêóü>\85\90\92\9dF«[#Ì\94\92ĵìx\14!#ÌBÄ
+óRß\110ÏôkaV\f¨|/ÒÄl\8f\9a\90¼ô½ð\98h}õüâµ      TH\8e\88G-»\1c\ 4ª\14±\81ªÑg\au®_\aªjÀÍ&͵\99\86ï\93\90\1d\ 1íÿL1\1f\9b,\84¼RT7E\9e\83ã\16ùÜs«4/¦0?}q\1a8«s\91 ÿTÝüÝ\b\12Kr=\8a\18\ 1g\ 2V¸ç\9a\8e\0{¢Y\võ¨º-ﺦ.ût  u\0¡$\8cçP\8f\91¶*ªFæ\ eUÚ¶\12à\1eÀ6Òq\bý7å/o_\v¹_\87\9c\18±\ fcâı\ 5ý½\90\11\7f!be`©ï\b\ efúµ,(\ 6`2¶M\87â3·6\8fÅÀ\v»ºßµ\90Î\r\92\86[~fò\80è§]±ßÇ<6;^©\v);4b²äåÀ\r\ 5h\88\eÉ9×wÙ\994\96dKsc\8f\84±\»\ fm\90\82À#~dÙ )BF\1a\85\88\95Æ¥¾#h\9cé×Ò¨\18p_vÃ.Ý\1e±æ\ 6\91\14>ËwU\85\80¹Ð\8cù\vÔ\ 4¥\\9as\ e­C\81Sl(ë\ f¼Þl¸@.O\81¡-­Å\81\19~¥Ù\f\8a\e dq_fð\15VIkv q²\16&ÂàI\12\88ô¸m·°ã\eʦî¹\10\ e\b\18\86y¨¾ÆÅÌKÂÕ¶ì\87\9e\17Ñ$|Þ§Û]!Ú\98ýX\80\0½\ 42\ 5>Ú½uØ8<Bc+*è±\1cM0iï\92Ô#À\91\80óöa\897\ eÂqU7dºq°S# \98öb\ 4\97¯\85T\9ewE/ìÖ[@\ 1­Ä\8f\84\82²ÑX\0\ 2A°° M×\1cI/\ 2Q7\16xs,»´*\86¢Cf\92\80¡ã¬î\91´Äç\93\14Z3Ø5¤eÍ+=tà¥z\a+]ÇE\99G@\9b\80ß\rV\847\\8a\17<\ 1A       \80\1a\85x\rú-¡\86U9I¼C\ 3õI<
+ܦÂøZ\98[\15Ì\17¹·B\1dÝ\80\8f\1fÆ\1dC¤Pý­o\8b¬|ç8®\12Åf!lxl\v\9e\89\99ÌJ\1a\10?\91¸\9bç£\9aGÈh*N\84\1dÈ\99\88·å ÍéÕ\88\19­n\84Uýî¦\1fÊa7\86_XÔ\96¦%\ eñ=©T\93\98\a\10Ú¤K\11\81\12®Â4^θÀõGÎ\ 3\97qÇÚºâã®ì\8a\ã²®Kh$\17ô²û¨ÏZ£\11;1yñ«­T#æ\r\95âÝ}Ú\95éͶ@\9a\b\97B\v\97ÃgË\9d\9d\99\888cÚÁæ+*Aj8 !%\9e\13\8d0
\85ÐVA\9f\9e\añÉF\82æýÀëUÓ\ f¼\84¨á\93M\bÖ\0¥\8e\17e,\16\1f\13À\8aZS\17K\84='\86©\10X\10vB_E\98\7f¯\95Z\8btÜBÁ`=\f"Éd\8e°×e{Æ\9ei]\17[î*ÎÂG\96s\19ü/\96þ÷×Ó5D\17ÈáÀ\82ÐqVMËÂü\8f\9a%\1d\p\8cd\98\95s\ f\17®\8f\82\98\93¬eó\17ÓêïÃF5ñ-I\9c"dZý¥\88mõ×賯þsýÓÙÄW\7fÕ\80\93G·Ùq\86CÜq©øÛ\92\96\908^4a¥î44\80UÎ,\ fä
+y\ 4\1aCg?ÛdVèƣܸND"sPEE
+\81wÍâþùY±Iw[\11þ\84¿²\88(´$ÆüÎ\a\9fõlg*\8a\90\91a!bex©ï\b\86gúµ\f+\ 6Teý_d\18Â\ 1ÏÖ¡Àç\9dçs¢7\8f¼õá¶äá\82Õx&\83%n'+\8e\84Ë0\87\1f\19sEhìo\9bÝ6çå\9düÀFv\9fÄ£\10Æ\99ø\93ØËíòÝÕ>\1e\9d\89\10%\16\ 4|y\ 1\91¥Èv\ 3f\ 2\816nXÏ+|}\87Â\90Þ\15â\8b¥xr«Q\ 5\8e\8f\87\9e\ e\8anP\b\15*³fña\16\8dd|T¢hSU»Zä¶b6ÜüYdÃ\98.Ex^HWrjÈÕp²ýÚ\8f\19Ó\94¾hÓ.UÓ\ 1Þ¡©Rã\19¯\17Q¶Õ;8c\14\8c\91\19£Ñg\9f1sýº\19£\1aP|\1a\8a:/t\97¦1qirxÒÈ<à÷ÃÉ\12\ eHàÉ\8fÿ[ß;\9efb¦Þ\7f\1cî\8d9\85\13­\8a\1a\9eWÒÝ\0D\ f07Yµ\7f(\aî¢\98\ 5c\væ\8f¬\97D\87ÕÀ¯*ti,\97\eþ¼|ö£ëøà\88\11S\84\9e\ 5\15±\87\80Ͷ\e\10[æÃ|;?~\9c9-n.Ä\9b®ÈðH¬Ý;ÿèÒeì\ 6ndtQÈ\9baÓhqѽ\90ÑE\85\88ÕE\97ú\8e\99\8b*\ 6´ÅV\7f­9Ù´ÿ_{¨\eAl¯!ºç¼\8cÁ\89m5ÙZ/\ 4Þ\9c\91ÛR9±c+\ 2ëã\8b\18\86\98\12Èu\ 2
\b¶å5\11\90\137\80Í\83ѧ\80\92з\1c\ 4)BF\9f\12"V\9fZê;§fúµ>¥\18p\93îòÎ~\9e÷M³ÁQçtFË\15|ºb\ 1%âæ±\14\1f\8av\9a\17Ò»§¹\915Øg;¶\7f\ fT\84\8c¬     \11+kK}G°6Ó¯eM1 Û6ÙÝû\r\96\80\13$Þ÷àmL¿Qñ®¨³GCz®LÌhõq\97vÿf\?ݤÏ\94#\f#y\ eì\ 4\8d2Fê¸\84\95¹\85²#\88\9b*×ò¶×Þ\ f9¤Uw\9a¹\86'\1eî÷à,W÷Eý\90Ö¹r³\ 1¦0\8aö÷SM¥\9cÀó%\96\1f   \8es\12\83¥\81-7\ eHìXöÊ\8a\90\89/)b#L£ÏÎØ\¿\8e\0HNþ§\9cM\93\19L%\«¾\rm\90\ 5ÓIJ\ 1V\84\8c´     \11+mK}GÐ6Ó¯¥M1 jh`à-&4ø\1e´õÅ°<Ò\18é\1aO\9d0¡íûôC¡îæÄ:\16ÌY\94GWÛÇCWT.\1e¾Æ\96ÿWP\84\8c\f
+\11+\83K}G08Ó¯eP1 í\9a\f\80\82\95Nwú*~¼pTÊû¹4nGBÚ¦\1fÖÂ\90\12\88«?\9cm\9b¦]ß°Tån¶üuiÝWå0n¦+γ¸\91¢ø{\85(\11§\9f\9eÈ\97\99 \11ûø¼ìqs\96kÎIéTrqºÉ·u³]|Ú¶\98>MN\ fä»\17\97/^KosÜíø\83\ eðâ]«1À\9d\1a Õ'\ 3\97ÁM)l\ 3\ 3×ò¿\90\8a\90ÉM¥\88ÍM5úìn:ׯsSÕ\0`â}7lß·]Ùtåð¸ô±\ 4\7f:\93\88ã¹þèªX\1eõ³\1a»Ø\84çxà\84\95\87¦»C\9a±<ÜvE\9aó2¿ñt÷§m¬gSµ¥ôE\80\a¯w¦·\19\ få \92uåg?ò7?òJØp\19{\9e±K\15H|\13v\1f\8b:\1daµ3væÿ\r\83-cF\89\95ªÉw[|É«ã\1e±çuy§Ì¾tË\98\17}Öáaß\8aO\ 6lcÓ\b\v8\8dÐ\96NlB\949¨\ß<Ê\8dÈ}39\90\9bç¿ø\9f\93tU\89\ekv»\14A²àË\v_\8a·×\ eIâH¬UyYo\1a~½¡Ýà¯Ç^\1e\89bw\7fñ¦º½\b\89à'\89\13\1düÅ×^DþàKN±é7PÍë\8bçoÏ\89ü\9f\9ak^ð\ 2ê¸ÜLõ×b¾\17\83\97H'\8d\12ïº\96\16þ\a?j¡Nendstream
+endobj
+7974 0 obj <<
+/Type /Page
+/Contents 7975 0 R
+/Resources 7973 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7972 0 R
+>> endobj
+7976 0 obj <<
+/D [7974 0 R /XYZ 71.731 802.878 null]
+>> endobj
+7977 0 obj <<
+/D [7974 0 R /XYZ 129.514 758.046 null]
+>> endobj
+7978 0 obj <<
+/D [7974 0 R /XYZ 129.514 758.046 null]
+>> endobj
+7979 0 obj <<
+/D [7974 0 R /XYZ 71.731 755.979 null]
+>> endobj
+7980 0 obj <<
+/D [7974 0 R /XYZ 129.514 743.434 null]
+>> endobj
+7981 0 obj <<
+/D [7974 0 R /XYZ 129.514 743.434 null]
+>> endobj
+7982 0 obj <<
+/D [7974 0 R /XYZ 71.731 741.367 null]
+>> endobj
+7983 0 obj <<
+/D [7974 0 R /XYZ 129.514 728.822 null]
+>> endobj
+7984 0 obj <<
+/D [7974 0 R /XYZ 129.514 728.822 null]
+>> endobj
+7985 0 obj <<
+/D [7974 0 R /XYZ 71.731 726.755 null]
+>> endobj
+7986 0 obj <<
+/D [7974 0 R /XYZ 129.514 714.21 null]
+>> endobj
+7987 0 obj <<
+/D [7974 0 R /XYZ 129.514 714.21 null]
+>> endobj
+7988 0 obj <<
+/D [7974 0 R /XYZ 71.731 712.143 null]
+>> endobj
+7989 0 obj <<
+/D [7974 0 R /XYZ 129.514 699.597 null]
+>> endobj
+7990 0 obj <<
+/D [7974 0 R /XYZ 129.514 699.597 null]
+>> endobj
+7991 0 obj <<
+/D [7974 0 R /XYZ 71.731 697.53 null]
+>> endobj
+7992 0 obj <<
+/D [7974 0 R /XYZ 129.514 684.985 null]
+>> endobj
+7993 0 obj <<
+/D [7974 0 R /XYZ 129.514 684.985 null]
+>> endobj
+7994 0 obj <<
+/D [7974 0 R /XYZ 71.731 682.918 null]
+>> endobj
+7995 0 obj <<
+/D [7974 0 R /XYZ 129.514 670.373 null]
+>> endobj
+7996 0 obj <<
+/D [7974 0 R /XYZ 129.514 670.373 null]
+>> endobj
+7997 0 obj <<
+/D [7974 0 R /XYZ 71.731 668.306 null]
+>> endobj
+7998 0 obj <<
+/D [7974 0 R /XYZ 129.514 655.761 null]
+>> endobj
+7999 0 obj <<
+/D [7974 0 R /XYZ 129.514 655.761 null]
+>> endobj
+8000 0 obj <<
+/D [7974 0 R /XYZ 71.731 653.694 null]
+>> endobj
+8001 0 obj <<
+/D [7974 0 R /XYZ 129.514 641.149 null]
+>> endobj
+8002 0 obj <<
+/D [7974 0 R /XYZ 129.514 641.149 null]
+>> endobj
+8003 0 obj <<
+/D [7974 0 R /XYZ 71.731 639.081 null]
+>> endobj
+8004 0 obj <<
+/D [7974 0 R /XYZ 129.514 626.536 null]
+>> endobj
+8005 0 obj <<
+/D [7974 0 R /XYZ 129.514 626.536 null]
+>> endobj
+8006 0 obj <<
+/D [7974 0 R /XYZ 71.731 624.469 null]
+>> endobj
+8007 0 obj <<
+/D [7974 0 R /XYZ 129.514 611.924 null]
+>> endobj
+8008 0 obj <<
+/D [7974 0 R /XYZ 129.514 611.924 null]
+>> endobj
+8009 0 obj <<
+/D [7974 0 R /XYZ 71.731 609.857 null]
+>> endobj
+8010 0 obj <<
+/D [7974 0 R /XYZ 129.514 597.312 null]
+>> endobj
+8011 0 obj <<
+/D [7974 0 R /XYZ 129.514 597.312 null]
+>> endobj
+8012 0 obj <<
+/D [7974 0 R /XYZ 71.731 595.245 null]
+>> endobj
+8013 0 obj <<
+/D [7974 0 R /XYZ 129.514 582.7 null]
+>> endobj
+8014 0 obj <<
+/D [7974 0 R /XYZ 129.514 582.7 null]
+>> endobj
+8015 0 obj <<
+/D [7974 0 R /XYZ 71.731 580.633 null]
+>> endobj
+8016 0 obj <<
+/D [7974 0 R /XYZ 129.514 568.088 null]
+>> endobj
+8017 0 obj <<
+/D [7974 0 R /XYZ 129.514 568.088 null]
+>> endobj
+8018 0 obj <<
+/D [7974 0 R /XYZ 402.608 568.088 null]
+>> endobj
+8019 0 obj <<
+/D [7974 0 R /XYZ 71.731 566.02 null]
+>> endobj
+8020 0 obj <<
+/D [7974 0 R /XYZ 129.514 553.475 null]
+>> endobj
+8021 0 obj <<
+/D [7974 0 R /XYZ 129.514 553.475 null]
+>> endobj
+8022 0 obj <<
+/D [7974 0 R /XYZ 71.731 536.796 null]
+>> endobj
+8023 0 obj <<
+/D [7974 0 R /XYZ 332.676 525.912 null]
+>> endobj
+8024 0 obj <<
+/D [7974 0 R /XYZ 487.525 525.912 null]
+>> endobj
+8025 0 obj <<
+/D [7974 0 R /XYZ 417.545 512.96 null]
+>> endobj
+8026 0 obj <<
+/D [7974 0 R /XYZ 235.047 500.009 null]
+>> endobj
+8027 0 obj <<
+/D [7974 0 R /XYZ 470.093 500.009 null]
+>> endobj
+8028 0 obj <<
+/D [7974 0 R /XYZ 71.731 496.281 null]
+>> endobj
+8029 0 obj <<
+/D [7974 0 R /XYZ 241.73 485.397 null]
+>> endobj
+8030 0 obj <<
+/D [7974 0 R /XYZ 433.79 485.397 null]
+>> endobj
+8031 0 obj <<
+/D [7974 0 R /XYZ 428.447 472.445 null]
+>> endobj
+8032 0 obj <<
+/D [7974 0 R /XYZ 71.731 455.766 null]
+>> endobj
+8033 0 obj <<
+/D [7974 0 R /XYZ 140.035 444.882 null]
+>> endobj
+8034 0 obj <<
+/D [7974 0 R /XYZ 71.731 443.317 null]
+>> endobj
+8035 0 obj <<
+/D [7974 0 R /XYZ 71.731 441.657 null]
+>> endobj
+8036 0 obj <<
+/D [7974 0 R /XYZ 129.514 426.948 null]
+>> endobj
+8037 0 obj <<
+/D [7974 0 R /XYZ 129.514 426.948 null]
+>> endobj
+8038 0 obj <<
+/D [7974 0 R /XYZ 165.798 426.948 null]
+>> endobj
+8039 0 obj <<
+/D [7974 0 R /XYZ 71.731 424.881 null]
+>> endobj
+8040 0 obj <<
+/D [7974 0 R /XYZ 129.514 412.336 null]
+>> endobj
+8041 0 obj <<
+/D [7974 0 R /XYZ 129.514 412.336 null]
+>> endobj
+8042 0 obj <<
+/D [7974 0 R /XYZ 165.798 412.336 null]
+>> endobj
+8043 0 obj <<
+/D [7974 0 R /XYZ 71.731 384.366 null]
+>> endobj
+8044 0 obj <<
+/D [7974 0 R /XYZ 129.514 371.821 null]
+>> endobj
+8045 0 obj <<
+/D [7974 0 R /XYZ 129.514 371.821 null]
+>> endobj
+8046 0 obj <<
+/D [7974 0 R /XYZ 183.771 371.821 null]
+>> endobj
+8047 0 obj <<
+/D [7974 0 R /XYZ 195.287 371.821 null]
+>> endobj
+8048 0 obj <<
+/D [7974 0 R /XYZ 206.804 371.821 null]
+>> endobj
+8049 0 obj <<
+/D [7974 0 R /XYZ 71.731 356.802 null]
+>> endobj
+8050 0 obj <<
+/D [7974 0 R /XYZ 129.514 344.257 null]
+>> endobj
+8051 0 obj <<
+/D [7974 0 R /XYZ 129.514 344.257 null]
+>> endobj
+8052 0 obj <<
+/D [7974 0 R /XYZ 177.395 344.257 null]
+>> endobj
+8053 0 obj <<
+/D [7974 0 R /XYZ 188.911 344.257 null]
+>> endobj
+8054 0 obj <<
+/D [7974 0 R /XYZ 200.428 344.257 null]
+>> endobj
+8055 0 obj <<
+/D [7974 0 R /XYZ 71.731 341.766 null]
+>> endobj
+8056 0 obj <<
+/D [7974 0 R /XYZ 129.514 329.645 null]
+>> endobj
+8057 0 obj <<
+/D [7974 0 R /XYZ 129.514 329.645 null]
+>> endobj
+8058 0 obj <<
+/D [7974 0 R /XYZ 183.372 329.645 null]
+>> endobj
+8059 0 obj <<
+/D [7974 0 R /XYZ 71.731 327.577 null]
+>> endobj
+8060 0 obj <<
+/D [7974 0 R /XYZ 129.514 315.032 null]
+>> endobj
+8061 0 obj <<
+/D [7974 0 R /XYZ 129.514 315.032 null]
+>> endobj
+8062 0 obj <<
+/D [7974 0 R /XYZ 196.144 315.032 null]
+>> endobj
+8063 0 obj <<
+/D [7974 0 R /XYZ 71.731 312.965 null]
+>> endobj
+8064 0 obj <<
+/D [7974 0 R /XYZ 129.514 300.42 null]
+>> endobj
+8065 0 obj <<
+/D [7974 0 R /XYZ 129.514 300.42 null]
+>> endobj
+8066 0 obj <<
+/D [7974 0 R /XYZ 177.723 300.42 null]
+>> endobj
+8067 0 obj <<
+/D [7974 0 R /XYZ 71.731 298.353 null]
+>> endobj
+8068 0 obj <<
+/D [7974 0 R /XYZ 129.514 285.808 null]
+>> endobj
+8069 0 obj <<
+/D [7974 0 R /XYZ 129.514 285.808 null]
+>> endobj
+8070 0 obj <<
+/D [7974 0 R /XYZ 177.723 285.808 null]
+>> endobj
+8071 0 obj <<
+/D [7974 0 R /XYZ 71.731 283.741 null]
+>> endobj
+8072 0 obj <<
+/D [7974 0 R /XYZ 129.514 271.196 null]
+>> endobj
+8073 0 obj <<
+/D [7974 0 R /XYZ 129.514 271.196 null]
+>> endobj
+8074 0 obj <<
+/D [7974 0 R /XYZ 183.701 271.196 null]
+>> endobj
+8075 0 obj <<
+/D [7974 0 R /XYZ 71.731 269.129 null]
+>> endobj
+8076 0 obj <<
+/D [7974 0 R /XYZ 129.514 256.584 null]
+>> endobj
+8077 0 obj <<
+/D [7974 0 R /XYZ 129.514 256.584 null]
+>> endobj
+8078 0 obj <<
+/D [7974 0 R /XYZ 207.283 256.584 null]
+>> endobj
+8079 0 obj <<
+/D [7974 0 R /XYZ 71.731 252.856 null]
+>> endobj
+8080 0 obj <<
+/D [7974 0 R /XYZ 71.731 240.196 null]
+>> endobj
+8081 0 obj <<
+/D [7974 0 R /XYZ 71.731 223.631 null]
+>> endobj
+8082 0 obj <<
+/D [7974 0 R /XYZ 77.27 198.135 null]
+>> endobj
+8083 0 obj <<
+/D [7974 0 R /XYZ 129.514 183.523 null]
+>> endobj
+8084 0 obj <<
+/D [7974 0 R /XYZ 129.514 183.523 null]
+>> endobj
+8085 0 obj <<
+/D [7974 0 R /XYZ 232.02 183.523 null]
+>> endobj
+8086 0 obj <<
+/D [7974 0 R /XYZ 71.731 166.843 null]
+>> endobj
+8087 0 obj <<
+/D [7974 0 R /XYZ 71.731 139.28 null]
+>> endobj
+3459 0 obj <<
+/D [7974 0 R /XYZ 71.731 116.463 null]
+>> endobj
+7973 0 obj <<
+/Font << /F32 3079 0 R /F27 2966 0 R /F42 3513 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8090 0 obj <<
+/Length 2631      
+/Filter /FlateDecode
+>>
+stream
+xÚ­\19Ë\92Û¸ñî¯Ð\91Sea\b\82Ͻ9¶\93\9aTÊvÙÊîa½\aJâHÌR¤B\90¶æïÓ/\90\94Dy¼\95)\1d\b4\1aýB£\1f\90^øðÓ\8bD«ÄèEê\a*MÒÅæðÊ_ì`å\1f¯´`,\ 5e9ÁùÛêÕýßM°ÈT\16\9bÅêq\11¤©
\18èÄ*\8c£Åjû»÷v\9f\1f»¢½[\ 6IêiÅß\7f\95u\7fºÿ¼ºÓ¾ï-av§½þÄkoß|àÁ»¶üæ6~õ#\1fÐ`\rFúî\8fÕ?_½_\rÂE\81V Ç\8fÄ\17\94\83`¡Ce@h\90_tL¢DÅ">@T\88\89÷¥<\1c«\82ÇÿîʪìÊ¢,@&\19­\10&*\r\80¥\8eàKDV{Øe\8cñ¬PÀqWØ\ eG\81×\ f´ha\93×<X\væcÓ×[\1e\965oé\80"1\ e§æ÷S\15Ä\19(\8cL\91ê\8ctƨÀ\8f\ 4ÇöëmÙ\16\9b®i\9f\98Aó(ÒíáH\84?\1aþN§\1e\1e\fη|0@z±\fB­Â$\ 4m\ 3\95E¬®múv\83vJBäеE\81Ûéì#4\86\95Å\89â8%Å\11eíÖm±eH.(ë\9c÷F`\94v@j\19tl\9b]\9b\83Ü\aË\0Ö­z\12òÍáÐ×å\92\ 4÷EbM\12oò®¬w \9d\ e½ï%è\ e#CF&Ð\99\ 1`.\ 6@çU\8cúÛ]ì{\82½mø[7\1d\ fl¿Ûña#QY]÷eµåa~<V%\8aÐÔVH\94-\9a\9fe'@q,êsÉÙÖÛ¢&/Ò^C®á\8bÔ\0\10)yñX´NGÀ±O¶+\ e¼d\8fŦüêûÁ\86çt\19áÆ>æ\ewl\b\1e4Ä-\83Bȯa`oeu\10àW0Zæ½áÉ\9bO\ f3\86¯Êu\9b£ï\ 5©\96#\85\81\9c\14\9b\84A|*8"ò8púÑò¾ÜÜ%\9e ¬[ÐÔòx_îö\ e«*¾\15\15\ fÑÏñë,\81ã²vj_\v\9a¯m×æ\e\16È$±\97Ó\95L\12¯¨mßÒÝ\ 5(H~\ 4©×è×O\f\12\7f\ 2L6\f\80\1eû\ e¶0\10T°H\14Da\0Ý@@:s:\80\ fÇ)̯}a\12O1\98\9aÔ\8c\9b`\8c\ 6ª\9aºà\99ðµwADG\f \ eS0\0=û¼âqÕ|\97\ 1\e\ f\87##\10\85'L\ 3ò\88ô"n¤gqãâú\91d¶ \9b\1a§Þ!ïè4]t\9d\ 6¹$\84ø\15\ 2·®¯C\`T¦\ 5ã~&Lª$\91Õ\rr\9d!\90©4M\ 5çõ5\85\b²\9c¬¶E¾ý\7f$øÞ\96Ý\8c\ 4&PQä$\90Ó¾\föÊ×±`\94\r\84\8a\eT\>\18½[b1\18úc\r&¿6±V~à\14\84S\8184C;U\91qü!rS´C\9ak¾>K\ 3Y4JÍ\99\87B\84þVn9¨§gá\19öÉ\97\9cK\ f^\8c ð,5¸M¨b=I«´5·pýix\96RRï\b\ ezÆSâ\b× \83w\924\93r#o\8b_\ 6\86±
+\12Ã\87}êN\97µ\87Ö\19\189XD\19\9c*\18d¦ø\80\ 5ÊÊ\93¥ËïP§è \80:\ 5\v\96\91\1e\17*\13Ûk\93AÒM\ 6\9e(\e\a\17\9fj\fP\9aË\f\98²A\9exB7Ó\ fÀk7\ 5hË@\8cº\b´\ 5\854\80\1c
+kó]Áà1´âÒ®\a[Z^áÌKt÷mÓïö\f\96\ÓÔ¯gbTçÎlà\81\93îéHnùZ¦\ 3\12fÁ      ÞÃ;9\9fz{\899EÛ4àëugÏ\1d\8b\8a/®jÈ5Z\88Õ\9deg\85\82\b¾F%©\16Ççk7{Ø\11T\93pÃ_ì°Gz·\ f[pP6\bŵèÝ´ÅD½Òvî&\Ú\ eõ¡\ 2@\94\87RépSy\fkë¾µÝM\v\80èY\96¼\9c\ 5Fz·- 8\13?\8aGÿÆ\89\14\851y\0Ä\8f¦'\1fH&Æ\10\0Þ\0¼&Ra\0D|*\ 6Û\94u'\96\8a¹P\80ïÀpâiñèi\94E¯3Ûj_Úi`\12W\94J7\95J7¥â   *\1añnë¼\9c¿Å)\97Æ\ 3&,Oz»\ 30CTþAè\8eÍÐ\ 2¸\ 2\88Ī*'\ fªH\89\82Ëü8Vi\16_]\90\1fúH\98j\15Ã÷¥|dBï¦\8f8\9cÑG²À\83\80T6[º\180\e\ f0\83x\86v¯1`5CA\8fð÷¹«'Ïw\ 4\1e\1d(|±d®*Ê+0£ \93\99\91'x\86ír,ÎI\82¼\83ì[óä²zÓ\13i#\7fÂ\r&¶øo_Ô\e\99Õýa=6\1e\b\11\a\83\11;\18h\83\92DPDc'Tóx-ûG7\8b°ÜÆäÈcj÷(\86\1fû\8eqù>Lä¹\16yÛ6GñUìf'·à<¦\ 4®HXBÜ9=Ýô\97 Q&z¹\14:¡wÛ_\ 4g8\81pÒ¦\87Ði¯Þ~º\7føÄpL\9fø\1dê\ 6D`\954\97Ѹºrdx\85\86\10n0\ 2Aε\97,\fµ;`mYy¤\93\ 4\98=ïr\8cÞhzl\1fé 4ñÛÀY\15\ 2\17²<\19£?î@Ïp\v\15<\ 4ìòØWÒ\88²B\bÿLÕ\ 2Ê/{À#æzÑ!¼R\ 1%\89\86îÑ\9f®ü\82ÈÚH*ÿÄawªÌ4³s5ÂÕ\1d\91\10?k.\12\ e%Ä`%\81.XèD\ 5:ÂS^Æ\89JB\b[&\1e¤<Km\17\ f@îé\ 6Ð\83\8c\9dâC~\98    ´¾<ïèY\92\13?\8bb\15Å®Øÿ\1a\ 4É\85øgiAÒW:¤/|\16³g\ 5\8eÌ0}\r¹kbµiîºÊ\15\90eY\9a©3Í\17N\83i4 F¢q\10ArIi×\97§\1a®~9"\9eY\ 6\8cnÂç,\93àÅs\8dÜï×&6Êh×\ 1\ 1\ 2\99Ç\e\9c¨Ì\98±\ 1Ù\16ßfR]¬âÄ1ùã\ eÂ\91\9fÎ1\83\b\14Ç\8eØòð\f·Cnÿ\9ciú 35ÙOòr2-Ëgx\953í%\1c\9f\89¿ªÕã\rNN\94Ç*ßÙg\9aá\9fföý\19µ,\ 4Äk½Rèiÿòi\1d¯Y-M
+RksæéǶx,O³>\12j3rÅ\8b\14òÅðnºüuFx¾*?CÆ\1dÝr\7f\83L<\90¹¾\88Ë$S\1aì\b5\99Ò1_Çw\85Ý´%\a\84+\8a\1c«L8m\9aM8D\9e«\e\1cù*K²ÉûÆ­ÐfT\1c\ 5d²kG\9eßnaD!\e¾\87¦.;\8ap0qߪÙñ`ìÅM8\rv0\93nUÈQ¥\85\14jéåL$\9baþAª\ f?T±\9f\9ee§±©MÃË\17F\ 45ëÿ@µLOa\91÷\9e\1a,\ 2÷Ý®á\87S\98um^ÛC    ÅÜ\96\11GI\89l.»èé\1e\96\1d£\86^)\17Ð\DË©\87R\ 2gß©\1a(ǯ­\1eûJkç@®¹ØUÍ\1ajwI#.\8b\14'|W¦\9aÐ-\15\86\9aUÍù\95PF¿Ê²\8cè\7fü´zøøáË|þ\e£üR²Ïr       A¸ä÷Ó¹\ 2OëøE\e\82   ½ë\ 2/4Jg\ 3˱\193\89ñ\1a¸*wød.sî\94f²Y\16©8Ô?q\17"\88\\82Öåí®è\98ðÄ1i.ö\91gu\0<ÐkoàÞ\86Y4~cæV\ 3aüO\ 2ÊéÞê©\18{-Î\1e\12\87ç%bñ\98÷U'/[Ì\94Æõl9\ 3\81\v\81÷\80\7f\ f\9eì?SÍ\f\9d­\1d\1cjJ\13\1cD«H\9f÷\0Ë\83ó\14\97Cçü$\81på¿ÜÛÂHnÖKL0p\9cxI\1a\8fG\ 1c¸8`s¸;²ÆoÜ1\95\9fû¼æ¸\12\8fvÇ        ©Ha ßP¹ÆQ$ö¨Í&\8c\18i²/À6:î¥<§ª4\8cÎÎ\18ý\80ÛÏt\12=³lÚ®¦X?0\10\84Q\fâ\14\0°}qÊ·À\ 2_Gð½\1faßòª\97­{z\88\0\18EðL^+`\ e\99\14\99\9f\1cwn~GøL1\a\85¸\1eÊ9ÿôLú\94&Ò@ªó\93ó'ä\ fý\ 1ºyyãrÂÊÃnC½+½å<¹zX$âîÃ\ ee®-·E[\<¸\90-ry\ 2Á\7f\ 3ÈÔIåOb¨ö²y\1f\1dþ*\1fQÜ?åP\ 1%\93?\9a\ 5\81"íÛ÷\9fßÈ¿ã\ f_V<0\91\86«~\954B|{×.ܤþ\8d¿Ã¯%ü\1f\96f\1eïendstream
+endobj
+8089 0 obj <<
+/Type /Page
+/Contents 8090 0 R
+/Resources 8088 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7972 0 R
+>> endobj
+8091 0 obj <<
+/D [8089 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2906 0 obj <<
+/D [8089 0 R /XYZ 228.734 757.665 null]
+>> endobj
+8092 0 obj <<
+/D [8089 0 R /XYZ 71.731 751.719 null]
+>> endobj
+8093 0 obj <<
+/D [8089 0 R /XYZ 327.821 741.845 null]
+>> endobj
+8094 0 obj <<
+/D [8089 0 R /XYZ 193.754 651.185 null]
+>> endobj
+8095 0 obj <<
+/D [8089 0 R /XYZ 220.434 651.185 null]
+>> endobj
+8096 0 obj <<
+/D [8089 0 R /XYZ 255.762 651.185 null]
+>> endobj
+8097 0 obj <<
+/D [8089 0 R /XYZ 282.442 651.185 null]
+>> endobj
+8098 0 obj <<
+/D [8089 0 R /XYZ 335.016 651.185 null]
+>> endobj
+8099 0 obj <<
+/D [8089 0 R /XYZ 438.599 651.185 null]
+>> endobj
+8100 0 obj <<
+/D [8089 0 R /XYZ 71.731 634.505 null]
+>> endobj
+8101 0 obj <<
+/D [8089 0 R /XYZ 71.731 621.554 null]
+>> endobj
+8102 0 obj <<
+/D [8089 0 R /XYZ 71.731 618.232 null]
+>> endobj
+8103 0 obj <<
+/D [8089 0 R /XYZ 71.731 607.234 null]
+>> endobj
+8104 0 obj <<
+/D [8089 0 R /XYZ 139.477 592.736 null]
+>> endobj
+8105 0 obj <<
+/D [8089 0 R /XYZ 71.731 576.887 null]
+>> endobj
+8106 0 obj <<
+/D [8089 0 R /XYZ 71.731 565.889 null]
+>> endobj
+8107 0 obj <<
+/D [8089 0 R /XYZ 139.477 551.391 null]
+>> endobj
+8108 0 obj <<
+/D [8089 0 R /XYZ 71.731 548.494 null]
+>> endobj
+8109 0 obj <<
+/D [8089 0 R /XYZ 71.731 537.495 null]
+>> endobj
+8110 0 obj <<
+/D [8089 0 R /XYZ 139.477 522.997 null]
+>> endobj
+8111 0 obj <<
+/D [8089 0 R /XYZ 347.813 510.046 null]
+>> endobj
+8112 0 obj <<
+/D [8089 0 R /XYZ 71.731 507.149 null]
+>> endobj
+8113 0 obj <<
+/D [8089 0 R /XYZ 71.731 496.15 null]
+>> endobj
+8114 0 obj <<
+/D [8089 0 R /XYZ 139.477 481.652 null]
+>> endobj
+8115 0 obj <<
+/D [8089 0 R /XYZ 71.731 452.853 null]
+>> endobj
+8116 0 obj <<
+/D [8089 0 R /XYZ 71.731 439.901 null]
+>> endobj
+8117 0 obj <<
+/D [8089 0 R /XYZ 139.477 427.356 null]
+>> endobj
+3460 0 obj <<
+/D [8089 0 R /XYZ 71.731 399.386 null]
+>> endobj
+2910 0 obj <<
+/D [8089 0 R /XYZ 160.373 364.501 null]
+>> endobj
+8118 0 obj <<
+/D [8089 0 R /XYZ 71.731 357.408 null]
+>> endobj
+8119 0 obj <<
+/D [8089 0 R /XYZ 71.731 357.408 null]
+>> endobj
+2914 0 obj <<
+/D [8089 0 R /XYZ 162.317 328.205 null]
+>> endobj
+8120 0 obj <<
+/D [8089 0 R /XYZ 173.35 312.384 null]
+>> endobj
+8121 0 obj <<
+/D [8089 0 R /XYZ 71.731 297.366 null]
+>> endobj
+2918 0 obj <<
+/D [8089 0 R /XYZ 174.677 274.095 null]
+>> endobj
+8122 0 obj <<
+/D [8089 0 R /XYZ 71.731 271.53 null]
+>> endobj
+8123 0 obj <<
+/D [8089 0 R /XYZ 71.731 266.748 null]
+>> endobj
+8124 0 obj <<
+/D [8089 0 R /XYZ 183.877 256.361 null]
+>> endobj
+8125 0 obj <<
+/D [8089 0 R /XYZ 200.222 256.361 null]
+>> endobj
+8126 0 obj <<
+/D [8089 0 R /XYZ 218.155 256.361 null]
+>> endobj
+8127 0 obj <<
+/D [8089 0 R /XYZ 258.145 256.361 null]
+>> endobj
+8128 0 obj <<
+/D [8089 0 R /XYZ 274.49 256.361 null]
+>> endobj
+8129 0 obj <<
+/D [8089 0 R /XYZ 292.423 256.361 null]
+>> endobj
+8130 0 obj <<
+/D [8089 0 R /XYZ 319.979 256.361 null]
+>> endobj
+8131 0 obj <<
+/D [8089 0 R /XYZ 336.324 256.361 null]
+>> endobj
+8132 0 obj <<
+/D [8089 0 R /XYZ 354.257 256.361 null]
+>> endobj
+8133 0 obj <<
+/D [8089 0 R /XYZ 369.928 256.361 null]
+>> endobj
+8134 0 obj <<
+/D [8089 0 R /XYZ 386.273 256.361 null]
+>> endobj
+8135 0 obj <<
+/D [8089 0 R /XYZ 404.206 256.361 null]
+>> endobj
+8136 0 obj <<
+/D [8089 0 R /XYZ 437.412 256.361 null]
+>> endobj
+8137 0 obj <<
+/D [8089 0 R /XYZ 453.757 256.361 null]
+>> endobj
+8138 0 obj <<
+/D [8089 0 R /XYZ 471.69 256.361 null]
+>> endobj
+8139 0 obj <<
+/D [8089 0 R /XYZ 493.02 256.361 null]
+>> endobj
+8140 0 obj <<
+/D [8089 0 R /XYZ 509.365 256.361 null]
+>> endobj
+8141 0 obj <<
+/D [8089 0 R /XYZ 119.552 243.41 null]
+>> endobj
+8142 0 obj <<
+/D [8089 0 R /XYZ 159.283 243.41 null]
+>> endobj
+8143 0 obj <<
+/D [8089 0 R /XYZ 165.37 243.41 null]
+>> endobj
+8144 0 obj <<
+/D [8089 0 R /XYZ 180.642 243.41 null]
+>> endobj
+8145 0 obj <<
+/D [8089 0 R /XYZ 186.729 243.41 null]
+>> endobj
+8146 0 obj <<
+/D [8089 0 R /XYZ 71.731 241.016 null]
+>> endobj
+2922 0 obj <<
+/D [8089 0 R /XYZ 192.609 217.242 null]
+>> endobj
+8147 0 obj <<
+/D [8089 0 R /XYZ 71.731 212.287 null]
+>> endobj
+8148 0 obj <<
+/D [8089 0 R /XYZ 170.531 201.9 null]
+>> endobj
+8149 0 obj <<
+/D [8089 0 R /XYZ 119.552 175.997 null]
+>> endobj
+8150 0 obj <<
+/D [8089 0 R /XYZ 71.731 172.244 null]
+>> endobj
+2926 0 obj <<
+/D [8089 0 R /XYZ 180.415 148.998 null]
+>> endobj
+8151 0 obj <<
+/D [8089 0 R /XYZ 71.731 148.855 null]
+>> endobj
+8152 0 obj <<
+/D [8089 0 R /XYZ 71.731 144.072 null]
+>> endobj
+8153 0 obj <<
+/D [8089 0 R /XYZ 71.731 144.072 null]
+>> endobj
+8154 0 obj <<
+/D [8089 0 R /XYZ 134.276 131.264 null]
+>> endobj
+8155 0 obj <<
+/D [8089 0 R /XYZ 71.731 131.055 null]
+>> endobj
+8156 0 obj <<
+/D [8089 0 R /XYZ 139.477 116.652 null]
+>> endobj
+8157 0 obj <<
+/D [8089 0 R /XYZ 238.831 116.652 null]
+>> endobj
+8158 0 obj <<
+/D [8089 0 R /XYZ 234.5 103.701 null]
+>> endobj
+8159 0 obj <<
+/D [8089 0 R /XYZ 71.731 102.084 null]
+>> endobj
+8160 0 obj <<
+/D [8089 0 R /XYZ 71.731 102.084 null]
+>> endobj
+8161 0 obj <<
+/D [8089 0 R /XYZ 134.276 89.919 null]
+>> endobj
+8162 0 obj <<
+/D [8089 0 R /XYZ 71.731 89.71 null]
+>> endobj
+8163 0 obj <<
+/D [8089 0 R /XYZ 139.477 75.307 null]
+>> endobj
+8164 0 obj <<
+/D [8089 0 R /XYZ 506.595 62.356 null]
+>> endobj
+8088 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F42 3513 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8167 0 obj <<
+/Length 2046      
+/Filter /FlateDecode
+>>
+stream
+xÚ­Y[s£¸\12~÷¯ðËV9\ fht\ 5ñ8\9b\9d³·¹ìI\§NÕÌÔ\16\ 6\1cS\83Á\v8Éì¯ßn]0Ø8N¶R~@\12\8dºõéë\8bd6§ðcó\88\91H°¹¦\9cèHÏÓí\8cÎïàÍÏ3æ$\ 2'\12\fd~\ÎÞüGðyLâPÌ\97ë9×\9aH\19Â<!\91¡\9a/³Ï\8bëM²ëòæ*à\91^0b\9fï\8bjÿøæfyÅ(]\ 4лb\8bý£}wýö£müÔ\14÷þÃ/TQ\10\83wÐbW_\97¿ÍÞ-{ã\14g\ 4ìxÊ|'rb¾\1c\98ÏXL\94âóHiBa\19h~PX\ 3\82 È\8eÕöòR\10\94^N¢0\86ÖàÕñ³7\91q\ e&"Ô\87ù\8c\8d<\1aØ(9¡Q¯\12M\n\8a\16\8c\fé¢ÞuE]Ùv»ËÓâ\v¥<w/¯¯\98^\18l¡³ÍÛ6¹Ëm§Èòª³²\8d\e1\93°E·q"I\9aæ».©R×ß&í7b\9b˱Ln`\9a\a\9c¨Xà¢H¬\98e\827@pá\rhm/irlHTXÙ¡]ST8\99鬾ã¤\80Äp·Â\90P\8aàâäM\9ed«}ÓvNp\0\99\92D1/\97ÖÛmReÄÎû©*¿;\rE×Z\13ÒºiòvWWY\ 1¬¬îÜr8%\8ak· næêjä\ 6u(A£ª«àï¼qÃvJlÕkû\1c¡\18Y\14Ý\9bÆ\r\81};èdÄv\7fÉ\1f\93\f6r\9b\94và>)÷Nt\93¸é½\1d«ÜØJG¨ï\9a\1cwöÑ@        D^}·Ï¤r\r/`\81\eù\ 3¸q$=rôñ\14ZÆ@\8fr\ 2ÄÎ÷q¿Í\9b\1dg.6\1f\8an\ 3\80ÖûîH¯é!\85ñ\99ÖU\v|l¼¹\89\e÷ \98Í`L\93\88ÊÑfÔU\8eü"§Ë\bÀMc®à)H¤-*ÁÚ»õºLîÚs\9e\1d\86\82p¡^ͳ\aóMz¶\88ã^'\9a\9d8M\9cgDz    \9eÛ:sNÛÚ\ 1è\b\\ftd/Õäi^ì\ e_\1fÂ\0tþÚçûÆ\ 4ab\aÆ|\83iîaË\1cå g)\ar@9çå1øäp\1fV&\1aè\11ïx\18\19Þ\rÇO÷)VDÇÑ\vØ\86ÓõlC\1dÞ9BË6C5\1c7\\1f)7Ã6l\8e9gÄÝø\98s4"Zñ\91o\8d97
+N\12\12 4\94c\90mPøÇ\ 2­ÑÑ¢J¶`¤¤*4c8;\84²X\87#\1c«ý6\98\15\84h\1c\951ÑÀe®HL\85yóÁ\ 4\13\1dÆtñSÞ¦\8dÛôcf\8b\98È(\9a+\r`2\8eLüköù+\9dg@Ûßf\14(¨ç\ fЦ\84\ 1\19·3\ 1\82Z2×/g·³ÿþ\8b/\ e®àô\a\ 3\ 3N\13\82\fù
+c\12:ø>ÜþüçÍòf\82\15\10¥h\1fß)\84\8b\90\ f\ 30ÀÃo\90ÿ÷¹uw\9cÀ4jWW`Äî\a!'\ 1ÛmZ\9a\88"NOÀ\14á\9c÷F½ûÿò\92Q¼7JN\18\95?vy\95åÙ\9b\16RC\964\99·\ 6\8dy\9e5¢·æý§ë·ï/Ù#z{ô\84=e\9dÚls\80  Ml*?ú\12\9cÄpóþüðöö÷KÆ\81I\ê\18w\90RkÞòJ©EòÍÙ\97ºd  Éa\85.~\9a·\80>\9aùHr\968R\92\10\bh¥VÆ;q©e{L\16Ø\15\17\ 3 \bÐ"\1c9ä1\83\Uc¾ëíLS\0¬/\8e\8e\ 1\8b¸1ä\180 ÖYÀ(\91ÚYÎh\ f\98ü×\80i"T8\0l\92Ô\97\0óD>\ f\16"iD\8f©>\86\rÁê\91{)lÆ\ 3\9e\ 5\1cë\81Ó¯\ 6Ü\19ÿS!Qat\1eºU\rÅ\91\85M@e\11³Q.\18xd\8fà\89K\ 2\82\88Û\ 4÷\9e\87à!¢ýqóéúÝíí³BIÜcÈ=\86ïªdU:í»¦NÁ´\ 2Êh\eP\ÝåJf\elÀìr\8a\bÅÚ'ÇÃQÂ%ÇÚ#ø¸+\8b´è°\8c7}£ÛAtWÖ+S¾ø·>\9ceEkÅNó+~c>`\\9d)&\15\1c\ 4\90Ö\11qGÄ\a_K>$6\9fO\95\92\98\15E$^­\94\1cÌ7YJr8Àz\19{Jt\88Ca±òÇj¿\1dm\ e5PvØ\9aÓz\ 6\8eÏJ\8bg\1d¶hOô\a¬\8e\12w\fÒöT9Ô0\ 4VE\843é>ló2O'f\17\9a\84ÂW\80à\13åÔ\ e
+\95\87põ¾%L°ó{\ 4%àºx<»K
\10ů·K\87ù&vI@\r\17õ:ý.\99\15\ 1\1d\ f×*\9c0î±?Ø\7f\14\9c!ÚöBm×\18\97\93\92\ 3L\156\84)wñ\99d\18£Í»¤³C«ü®¨*s\rsgG\90\19øÌ\93ô*Zl¬x\7f&Ç7eá«_óÎð\vÇ×u³MlY\e\84\91       \8fC\a\eÞK\9cì\9dÄK\1aO\82\1fÚ\89à#IÄ{\ 2ÔûÒ\91våȽo½óÛC±ÆÕ:§Ïïñ@\9fz70U¸¥¥\97õÇ\83)VEPiGrLªÿyRÝÃ\19lªØö¬\82\93\8a\17D\83ùÎû¾\93ACÿÀ}s)ÍÞ\7fØ\8e3{Ò\89 5Är|fÞøånòrwn­\Ãñ\15ªÿ×Zë`¾³kõ2O­uïî»Ì\86¯k`\ 2ÒÔm\9a        v\f#\90²\9bM\89\82f  ê\85Ò\85¤j\14ó8rQà-!Ð\16\8e\86f_BÂc\9b\14>"½N`¥&×¢ìÔ\94çê\85/\9cGGisß\15eѹ´¶öy\r\82xWT{\ܾ\9dʨx\19àï\ 2\86Å\84qìÉ$mÜØY3tãÃ\ 5¢Ó\9bW]{\80Æ\9eÔí\8aá\8c*\84=ÄÝ~¯ê][´§  \86\9a\84\1a    q       \99\10\8f\86¾úø|
+± \82ù
+/ÈN\83)h\89\ 5ïS\bÔ«÷\13y&\84\ f¦_¯\ 2\94.\¦ô»\14\14g\94ùy\8al"\9e\ 1ËÕK\15µg®FÂ\17γ¾\80N\7f56ÖÅñêA¿P×Ã\ 5\ 2\99X\95\86Jó¥è¬.hZAÉù­-þÎ'¼\ e\82]üÒ\95¥§ú 8\ 3\8cظf\85lUu\97ÑD\7f\9aÐ\19\13I}b\fv\17\96x®F\0ZË!\9eOèò9\16rÜÓ÷pÏ\9cfsq\9a£|âþoâ\92Ä4zò\1f©\83\88ÿC
\88PÃx\ eT\ 3\a\9b\9b·îO¨_o\97¶!\14£ÜÚ7ü7KBµ©\18ó×\12çþu:µð\1frh®¿endstream
+endobj
+8166 0 obj <<
+/Type /Page
+/Contents 8167 0 R
+/Resources 8165 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7972 0 R
+>> endobj
+8168 0 obj <<
+/D [8166 0 R /XYZ 71.731 802.878 null]
+>> endobj
+8169 0 obj <<
+/D [8166 0 R /XYZ 71.731 814.833 null]
+>> endobj
+8170 0 obj <<
+/D [8166 0 R /XYZ 71.731 768.009 null]
+>> endobj
+8171 0 obj <<
+/D [8166 0 R /XYZ 71.731 768.009 null]
+>> endobj
+8172 0 obj <<
+/D [8166 0 R /XYZ 134.276 758.046 null]
+>> endobj
+8173 0 obj <<
+/D [8166 0 R /XYZ 71.731 757.837 null]
+>> endobj
+8174 0 obj <<
+/D [8166 0 R /XYZ 139.477 743.434 null]
+>> endobj
+8175 0 obj <<
+/D [8166 0 R /XYZ 305.486 730.483 null]
+>> endobj
+8176 0 obj <<
+/D [8166 0 R /XYZ 246.226 704.58 null]
+>> endobj
+8177 0 obj <<
+/D [8166 0 R /XYZ 71.731 690.684 null]
+>> endobj
+8178 0 obj <<
+/D [8166 0 R /XYZ 71.731 690.684 null]
+>> endobj
+8179 0 obj <<
+/D [8166 0 R /XYZ 134.276 677.847 null]
+>> endobj
+8180 0 obj <<
+/D [8166 0 R /XYZ 71.731 676.283 null]
+>> endobj
+8181 0 obj <<
+/D [8166 0 R /XYZ 139.477 663.235 null]
+>> endobj
+8182 0 obj <<
+/D [8166 0 R /XYZ 235.374 650.283 null]
+>> endobj
+8183 0 obj <<
+/D [8166 0 R /XYZ 71.731 637.218 null]
+>> endobj
+8184 0 obj <<
+/D [8166 0 R /XYZ 71.731 636.388 null]
+>> endobj
+8185 0 obj <<
+/D [8166 0 R /XYZ 71.731 636.388 null]
+>> endobj
+8186 0 obj <<
+/D [8166 0 R /XYZ 71.731 408.936 null]
+>> endobj
+8187 0 obj <<
+/D [8166 0 R /XYZ 71.731 408.936 null]
+>> endobj
+8188 0 obj <<
+/D [8166 0 R /XYZ 134.276 395.985 null]
+>> endobj
+8189 0 obj <<
+/D [8166 0 R /XYZ 71.731 395.776 null]
+>> endobj
+8190 0 obj <<
+/D [8166 0 R /XYZ 139.477 381.373 null]
+>> endobj
+8191 0 obj <<
+/D [8166 0 R /XYZ 263.829 381.373 null]
+>> endobj
+8192 0 obj <<
+/D [8166 0 R /XYZ 375.11 381.373 null]
+>> endobj
+8193 0 obj <<
+/D [8166 0 R /XYZ 71.731 380.334 null]
+>> endobj
+8194 0 obj <<
+/D [8166 0 R /XYZ 71.731 380.334 null]
+>> endobj
+8195 0 obj <<
+/D [8166 0 R /XYZ 134.276 367.591 null]
+>> endobj
+8196 0 obj <<
+/D [8166 0 R /XYZ 71.731 366.027 null]
+>> endobj
+8197 0 obj <<
+/D [8166 0 R /XYZ 139.477 352.979 null]
+>> endobj
+8198 0 obj <<
+/D [8166 0 R /XYZ 166.01 352.979 null]
+>> endobj
+8199 0 obj <<
+/D [8166 0 R /XYZ 180.801 340.028 null]
+>> endobj
+8200 0 obj <<
+/D [8166 0 R /XYZ 71.731 337.131 null]
+>> endobj
+8201 0 obj <<
+/D [8166 0 R /XYZ 71.731 337.131 null]
+>> endobj
+8202 0 obj <<
+/D [8166 0 R /XYZ 134.276 326.246 null]
+>> endobj
+8203 0 obj <<
+/D [8166 0 R /XYZ 71.731 326.037 null]
+>> endobj
+8204 0 obj <<
+/D [8166 0 R /XYZ 139.477 311.634 null]
+>> endobj
+8205 0 obj <<
+/D [8166 0 R /XYZ 71.731 310.69 null]
+>> endobj
+8206 0 obj <<
+/D [8166 0 R /XYZ 71.731 310.69 null]
+>> endobj
+8207 0 obj <<
+/D [8166 0 R /XYZ 134.276 297.853 null]
+>> endobj
+8208 0 obj <<
+/D [8166 0 R /XYZ 71.731 296.289 null]
+>> endobj
+8209 0 obj <<
+/D [8166 0 R /XYZ 139.477 283.241 null]
+>> endobj
+3461 0 obj <<
+/D [8166 0 R /XYZ 71.731 266.969 null]
+>> endobj
+2930 0 obj <<
+/D [8166 0 R /XYZ 161.32 231.677 null]
+>> endobj
+8210 0 obj <<
+/D [8166 0 R /XYZ 71.731 224.584 null]
+>> endobj
+8211 0 obj <<
+/D [8166 0 R /XYZ 71.731 224.584 null]
+>> endobj
+2934 0 obj <<
+/D [8166 0 R /XYZ 162.317 195.381 null]
+>> endobj
+8212 0 obj <<
+/D [8166 0 R /XYZ 173.35 179.56 null]
+>> endobj
+8213 0 obj <<
+/D [8166 0 R /XYZ 71.731 164.542 null]
+>> endobj
+2938 0 obj <<
+/D [8166 0 R /XYZ 174.677 141.271 null]
+>> endobj
+8214 0 obj <<
+/D [8166 0 R /XYZ 71.731 138.707 null]
+>> endobj
+8215 0 obj <<
+/D [8166 0 R /XYZ 71.731 133.925 null]
+>> endobj
+8216 0 obj <<
+/D [8166 0 R /XYZ 176.709 123.538 null]
+>> endobj
+8217 0 obj <<
+/D [8166 0 R /XYZ 185.339 123.538 null]
+>> endobj
+8218 0 obj <<
+/D [8166 0 R /XYZ 203.271 123.538 null]
+>> endobj
+8219 0 obj <<
+/D [8166 0 R /XYZ 243.261 123.538 null]
+>> endobj
+8220 0 obj <<
+/D [8166 0 R /XYZ 251.891 123.538 null]
+>> endobj
+8221 0 obj <<
+/D [8166 0 R /XYZ 269.824 123.538 null]
+>> endobj
+8222 0 obj <<
+/D [8166 0 R /XYZ 285.495 123.538 null]
+>> endobj
+8223 0 obj <<
+/D [8166 0 R /XYZ 294.124 123.538 null]
+>> endobj
+8224 0 obj <<
+/D [8166 0 R /XYZ 309.397 123.538 null]
+>> endobj
+8225 0 obj <<
+/D [8166 0 R /XYZ 318.027 123.538 null]
+>> endobj
+8226 0 obj <<
+/D [8166 0 R /XYZ 335.959 123.538 null]
+>> endobj
+8227 0 obj <<
+/D [8166 0 R /XYZ 369.165 123.538 null]
+>> endobj
+8228 0 obj <<
+/D [8166 0 R /XYZ 377.794 123.538 null]
+>> endobj
+8229 0 obj <<
+/D [8166 0 R /XYZ 395.727 123.538 null]
+>> endobj
+8230 0 obj <<
+/D [8166 0 R /XYZ 417.057 123.538 null]
+>> endobj
+8231 0 obj <<
+/D [8166 0 R /XYZ 425.687 123.538 null]
+>> endobj
+8232 0 obj <<
+/D [8166 0 R /XYZ 443.62 123.538 null]
+>> endobj
+8233 0 obj <<
+/D [8166 0 R /XYZ 500.735 123.538 null]
+>> endobj
+8234 0 obj <<
+/D [8166 0 R /XYZ 509.365 123.538 null]
+>> endobj
+8235 0 obj <<
+/D [8166 0 R /XYZ 119.552 110.586 null]
+>> endobj
+8236 0 obj <<
+/D [8166 0 R /XYZ 152.757 110.586 null]
+>> endobj
+8237 0 obj <<
+/D [8166 0 R /XYZ 158.844 110.586 null]
+>> endobj
+8238 0 obj <<
+/D [8166 0 R /XYZ 176.777 110.586 null]
+>> endobj
+8239 0 obj <<
+/D [8166 0 R /XYZ 216.508 110.586 null]
+>> endobj
+8240 0 obj <<
+/D [8166 0 R /XYZ 222.595 110.586 null]
+>> endobj
+8241 0 obj <<
+/D [8166 0 R /XYZ 237.867 110.586 null]
+>> endobj
+8242 0 obj <<
+/D [8166 0 R /XYZ 243.955 110.586 null]
+>> endobj
+8243 0 obj <<
+/D [8166 0 R /XYZ 71.731 108.192 null]
+>> endobj
+8165 0 obj <<
+/Font << /F32 3079 0 R /F42 3513 0 R /F27 2966 0 R /F22 2958 0 R /F51 3667 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8246 0 obj <<
+/Length 2088      
+/Filter /FlateDecode
+>>
+stream
+xÚ­YY\8fã¸\11~÷¯ÐK\0\e\888<D\1d\8f»3\93I/²³\9bi'\b°»\bÔ6Ý\16Ö\96\1cIîîÙ_\9f*\16©Ã\92{:\81á\aQd©XÇWÅ*Z\ 4\1c~"H\ 4K\94\bR.Y\9a¤Áæ¸àÁ#¬|Z\bG\11:\92p@óýzñî/J\ 6\19Ëb\15¬w\81LS\16E1ð\89Y\14ë`½ýeù~\9f\9fZS¯B\99¤KÁèù·¢<¿¼û²^  Î\97!¼­ÄòüBkï¿ûL\83\ fuñä?ü\95k\ e\ 6#±úmýÃâãº\13NKÁ@\8e×Äw$\13ñ¥\f\84`\99Ö(¿\10\19ÓZ\ 6\89N\19\a=Pþ\ f¦ÙÔÅ©-ª\12·\85/\92^a\1e\84B3\15IKºÞ\9bU¨Òdyn\8bCÑ~uô\ 3\ 3é\88q\99ÂgHÞ\98rûp®\9bvÊWk\96péè\1eMiê¼5\r1\7f8T\9bU²üݽV;z\1eMÓä\8f\9eè¹h÷4jNfSüʹ4[\9ax¿\12é\12ml¿\ 2ÃÓ\87ô~÷a¥\92%C\89@5\9e\81Ïá)Á@\ 3\15#\9e-Ið0\12¼\13\88\16@\1e«\8e\16½:\19gI\1a;u\90ü÷¦øĄ̃\9d\10\10²-\1aÚÌ\1a\ 3\84\ 6{li&/·Dr:7{ãÆEÙV´¼ÉK\9aÚ\9a§bcPyF\13w3\92\86"JY\1cGNia%ÙTçrÆIJ²X'NZ\94\ f\81:0÷\9fi¦E\93á`S\1d\8f9"}ëHÛêä¾²:àÀ¼\14­\9fÛaØL$\94"fYªÜ¶¯\89æ\r\89\bA\86Gïh|\19 ÈÊ\ 2X\ 4ÉX\aÙ>(B\99J&³\14\ 6°s\96Y\9e?ý¼¾ûéó=\91Gr\1c\11         FY²Ð©\15\86Îú\17\81ë\ 3\ eìÈ"°åLäJ\96Ä\19\8c\ 6K\97Ï.È\85\94\10ä0\18ð£(\1fØFD\8a\81\97»=     Öè?\15§ËÊFº}ÉÀ*\a³iÁ.Í4\943Í´\88Þ\14ÊZxì·yýhZÚ©\8fÃØ\81\13cÑá\13çîvDh\ 1\84\13$\eMzy˪u²\ e\81\vÙ&áb\14¿[³ËÏ\87\96¼â|bÇe~4So\82\92\z¬½\ 3úw\10N|FÉ\98éø2\14Î\8dÙ²)OÀ\87\0\93h\18(H\v\14baá\81Rl¯\82\ 4\90/\84¼\1dHz~3 \91LdI·g\ f\12\99¨Î\118îíî\16\9f÷\ 5\9eÞ:/ãË \ 2\15¦ZûôLÑ\4ÚU5\rÚ:\aL\94ͱh[¿8
+\å\82Û²\ eÉí`\v9ò9eQ©       WbùWó\92oAèc~ \89§üp64Üç\16Wr\89é\13'\1eÜ©6¨ä\8b=Epþ+Ñùù©\9f% _e\99\ 3\ 5\7f\99¢Æå\18"pÂ}>\1fM\r\ 6\1c\v\81Va\95Ð:-ã\84)=ÎÓyù\95PÔ       eß<\1e7\10×ÅÖÔdÉd\997>\f\9c-ð¥*]\bÎà\16\86ÒÃ\96L\eî<lw\87ü±¹\86\\1d\v\96\ 2âo\85Ü\ 1¿Yä¦*êöD1ï=F7¹Ë Ê\15\ eð<V[Âo\8d®W1ÔZ\¡2#*JB0°'\ 5}èÐì2\16Ì\8c\91\ 5\13Þ\81À\95\90\85\9c*z>\18ò¤\ 2?&#?\ e±fϪK·N|\93*ÆEú?@\rÙuPÃ\17')\ e-ÔÎ-\81ä-PJß\ 2¥áÙ\11f\82ñTØâQ(Rúû\ 2w\84\12Ìfâ\10"GÚ9´\91V,\8eô(¨Ëóñ\81Ê\83 \ 6<ò8\18\987P\8d\ 1XÕeù:B§ÊX\94$\81\86\ 3[e\11¢é?\8b_~ãÁ\16 ÷Ã\82Ãd\1a\98C*Ì\82ãB¥\0©H¸÷Ãâ~ñ÷ÿã\8b\1eÎnÿp \80\85óг\bç(\8e\ 3ÍÁTT\91ÿxÿéß_Ö_¦NÎ"@¼\a\ 1Ö³2\ 60\88U\bEåò\93«¢É7øý°(rþ+väõaÑ<M\ 4´\ f:OJÕ\89ôñ_ë×E\92\9dH\11\89ô\8f\ 6¥\81³Û¼´\10U\ 4&>\14      Ö\0feÛ\a¨\9dÚ\11a\ 3ùðUA\ 5\96b2²%\19Ù.l|Âj¾\96\9b
+Ê"øîvùjÀo6_Å*ëö´ÕåÉ`\92\12IW¢à¸°s¾\1e\82       «\ 2\9c´uUVç\86æ \9bu\19  ^±_\99\9eL\1c²\81J\ 6µÛÔq2a<ñ\1dX^nç¸0Í=\93Í¡jf\1a\1a\ 5y)Ê\ 6\8d\8foÜ@4(Ü\8b\ 3i4èÂèpK¡ÿ\93ã¤Xô\95º+ß0\91\ e\9f\83R\ 3ræÙ\1dùß8Ç\ùõìañ\9c\99\85\ 5\14C*½\1d*:v³ \90Ð\80;\92®ó´\95*e>J±;o\14ÈÈÛ¾ß\9ad\\ 1í¿îº¦×Êõ\88ÅÂ\1f\14ÏhѼëÈ\1eLûlLÙwLEùèV°2±\rñ¸·ºê\81\94¥\99\1c»àÁ»À6È×|\0M:´\7f·ë\94\ 6ü®zÁÓ|Ó\r\17É\14\8b\1e\18ÏD\87Ï\89¹Ü±üaØ¢\f\8eå¢\99\89Á\f\92\86÷\96àß<÷§®PÐ*c\95:ªê6Þ\15]{=ë
+\rÏLÝÎ\15=¿\19W\b\10Ow{ö®P\12]±ÂJ½¦Wë\rxö÷2R      W·á<],ØIº\92póEùTQ\81ÈhõÎ1º¸Ó¸ü\ eWÊ¢Ù\9bÆ7 \8a§\17\859\92j¹¬M{®±»ÆÒÄË¡åø\92
+':ti×âhy\19Vví\ e\14ßÑð\^È   \9fÌæ\ 2\89Õ\97ÒoÊ\ 5Êwîõ\99Ä\96¶;£Â5Â\ 6g\\96\15%YÃ×\19mq|[?á\92ÀÉ#\ fêÎ]ñr\15zP\r\ 1öo\a½\9eßì}I
+Ñïi<ô¦7SÐ2w\97\ 5½ücn\11giGÔ´µM¡Q$Ý=]Dý0>ó­­\88p-oiêÁ<\16eio\8b\1fi\ 6±\81O\93»\9e\eÉOÀ\95®\aaåP\94Ý¥\1f¬Ñ\ 5fd\9bìcî\9aIÛKÆã¦yÐÖO\\17á]²¿ûùS3\93v"[Ëtwt\aßÉ\98þjd|x\83¶ý¥\fè7º\97¡üWzZß\93Ì\81*Ñ,K¢1¨þéAõ\ 4%ä\#àP%¡\93@ýo\85ª\ 1¿«g\8b§AA\7fF¿\rïJ\9dI\9cØsêÂVqv¡îÞ«»7\87ÓU]\95\86çí\8a\99\ 1¿ëº:\9a×t=÷W´E¹Ã\e\ f\84é\8cÓÜÿ12b\19O^ýǦ'ñ\7fØÀq\9e `c\1e¶ò~ÿñËwî ¾»_Ó@iÁ%\19\7føoO¤R¦\85ïnRyå_\99©\84ÿ\ 5\10áiYendstream
+endobj
+8245 0 obj <<
+/Type /Page
+/Contents 8246 0 R
+/Resources 8244 0 R
+/MediaBox [0 0 593.051 838.744]
+/Parent 7972 0 R
+>> endobj
+8247 0 obj <<
+/D [8245 0 R /XYZ 71.731 802.878 null]
+>> endobj
+2942 0 obj <<
+/D [8245 0 R /XYZ 192.609 758.046 null]
+>> endobj
+8248 0 obj <<
+/D [8245 0 R /XYZ 71.731 753.091 null]
+>> endobj
+8249 0 obj <<
+/D [8245 0 R /XYZ 173.58 742.704 null]
+>> endobj
+8250 0 obj <<
+/D [8245 0 R /XYZ 210.338 729.752 null]
+>> endobj
+8251 0 obj <<
+/D [8245 0 R /XYZ 119.552 716.801 null]
+>> endobj
+8252 0 obj <<
+/D [8245 0 R /XYZ 369.192 716.801 null]
+>> endobj
+2946 0 obj <<
+/D [8245 0 R /XYZ 180.415 689.802 null]
+>> endobj
+8253 0 obj <<
+/D [8245 0 R /XYZ 71.731 689.659 null]
+>> endobj
+8254 0 obj <<
+/D [8245 0 R /XYZ 71.731 684.877 null]
+>> endobj
+8255 0 obj <<
+/D [8245 0 R /XYZ 71.731 684.877 null]
+>> endobj
+8256 0 obj <<
+/D [8245 0 R /XYZ 134.276 672.069 null]
+>> endobj
+8257 0 obj <<
+/D [8245 0 R /XYZ 71.731 671.86 null]
+>> endobj
+8258 0 obj <<
+/D [8245 0 R /XYZ 139.477 657.457 null]
+>> endobj
+8259 0 obj <<
+/D [8245 0 R /XYZ 238.662 657.457 null]
+>> endobj
+8260 0 obj <<
+/D [8245 0 R /XYZ 234.5 644.505 null]
+>> endobj
+8261 0 obj <<
+/D [8245 0 R /XYZ 71.731 642.888 null]
+>> endobj
+8262 0 obj <<
+/D [8245 0 R /XYZ 71.731 642.888 null]
+>> endobj
+8263 0 obj <<
+/D [8245 0 R /XYZ 134.276 630.724 null]
+>> endobj
+8264 0 obj <<
+/D [8245 0 R /XYZ 71.731 630.515 null]
+>> endobj
+8265 0 obj <<
+/D [8245 0 R /XYZ 139.477 616.112 null]
+>> endobj
+8266 0 obj <<
+/D [8245 0 R /XYZ 394.876 603.16 null]
+>> endobj
+8267 0 obj <<
+/D [8245 0 R /XYZ 71.731 587.312 null]
+>> endobj
+8268 0 obj <<
+/D [8245 0 R /XYZ 71.731 587.312 null]
+>> endobj
+8269 0 obj <<
+/D [8245 0 R /XYZ 134.276 576.427 null]
+>> endobj
+8270 0 obj <<
+/D [8245 0 R /XYZ 71.731 574.863 null]
+>> endobj
+8271 0 obj <<
+/D [8245 0 R /XYZ 139.477 561.815 null]
+>> endobj
+8272 0 obj <<
+/D [8245 0 R /XYZ 222.495 548.864 null]
+>> endobj
+8273 0 obj <<
+/D [8245 0 R /XYZ 71.731 546.797 null]
+>> endobj
+8274 0 obj <<
+/D [8245 0 R /XYZ 71.731 545.967 null]
+>> endobj
+8275 0 obj <<
+/D [8245 0 R /XYZ 71.731 545.967 null]
+>> endobj
+8276 0 obj <<
+/D [8245 0 R /XYZ 71.731 485.289 null]
+>> endobj
+8277 0 obj <<
+/D [8245 0 R /XYZ 71.731 485.289 null]
+>> endobj
+8278 0 obj <<
+/D [8245 0 R /XYZ 134.276 472.337 null]
+>> endobj
+8279 0 obj <<
+/D [8245 0 R /XYZ 71.731 470.773 null]
+>> endobj
+8280 0 obj <<
+/D [8245 0 R /XYZ 139.477 457.725 null]
+>> endobj
+8281 0 obj <<
+/D [8245 0 R /XYZ 344.576 457.725 null]
+>> endobj
+8282 0 obj <<
+/D [8245 0 R /XYZ 392.155 457.725 null]
+>> endobj
+8283 0 obj <<
+/D [8245 0 R /XYZ 71.731 443.829 null]
+>> endobj
+8284 0 obj <<
+/D [8245 0 R /XYZ 71.731 443.829 null]
+>> endobj
+8285 0 obj <<
+/D [8245 0 R /XYZ 134.276 430.993 null]
+>> endobj
+8286 0 obj <<
+/D [8245 0 R /XYZ 71.731 430.783 null]
+>> endobj
+8287 0 obj <<
+/D [8245 0 R /XYZ 139.477 416.38 null]
+>> endobj
+8288 0 obj <<
+/D [8245 0 R /XYZ 263.829 416.38 null]
+>> endobj
+8289 0 obj <<
+/D [8245 0 R /XYZ 71.731 413.483 null]
+>> endobj
+8290 0 obj <<
+/D [8245 0 R /XYZ 71.731 413.483 null]
+>> endobj
+8291 0 obj <<
+/D [8245 0 R /XYZ 134.276 402.599 null]
+>> endobj
+8292 0 obj <<
+/D [8245 0 R /XYZ 71.731 402.39 null]
+>> endobj
+8293 0 obj <<
+/D [8245 0 R /XYZ 139.477 387.987 null]
+>> endobj
+8294 0 obj <<
+/D [8245 0 R /XYZ 439.996 387.987 null]
+>> endobj
+8295 0 obj <<
+/D [8245 0 R /XYZ 71.731 385.09 null]
+>> endobj
+8296 0 obj <<
+/D [8245 0 R /XYZ 71.731 385.09 null]
+>> endobj
+8297 0 obj <<
+/D [8245 0 R /XYZ 134.276 374.205 null]
+>> endobj
+8298 0 obj <<
+/D [8245 0 R /XYZ 71.731 373.996 null]
+>> endobj
+8299 0 obj <<
+/D [8245 0 R /XYZ 139.477 359.593 null]
+>> endobj
+8300 0 obj <<
+/D [8245 0 R /XYZ 430.512 346.642 null]
+>> endobj
+8301 0 obj <<
+/D [8245 0 R /XYZ 71.731 332.746 null]
+>> endobj
+8302 0 obj <<
+/D [8245 0 R /XYZ 71.731 332.746 null]
+>> endobj
+8303 0 obj <<
+/D [8245 0 R /XYZ 134.276 319.909 null]
+>> endobj
+8304 0 obj <<
+/D [8245 0 R /XYZ 71.731 318.345 null]
+>> endobj
+8305 0 obj <<
+/D [8245 0 R /XYZ 139.477 305.297 null]
+>> endobj
+8306 0 obj <<
+/D [8245 0 R /XYZ 166.01 305.297 null]
+>> endobj
+8307 0 obj <<
+/D [8245 0 R /XYZ 180.801 292.345 null]
+>> endobj
+8308 0 obj <<
+/D [8245 0 R /XYZ 71.731 289.448 null]
+>> endobj
+8309 0 obj <<
+/D [8245 0 R /XYZ 71.731 289.448 null]
+>> endobj
+8310 0 obj <<
+/D [8245 0 R /XYZ 134.276 278.564 null]
+>> endobj
+8311 0 obj <<
+/D [8245 0 R /XYZ 71.731 278.355 null]
+>> endobj
+8312 0 obj <<
+/D [8245 0 R /XYZ 139.477 263.952 null]
+>> endobj
+8313 0 obj <<
+/D [8245 0 R /XYZ 71.731 263.008 null]
+>> endobj
+8314 0 obj <<
+/D [8245 0 R /XYZ 71.731 263.008 null]
+>> endobj
+8315 0 obj <<
+/D [8245 0 R /XYZ 134.276 250.171 null]
+>> endobj
+8316 0 obj <<
+/D [8245 0 R /XYZ 71.731 248.607 null]
+>> endobj
+8317 0 obj <<
+/D [8245 0 R /XYZ 139.477 235.558 null]
+>> endobj
+8244 0 obj <<
+/Font << /F32 3079 0 R /F22 2958 0 R /F27 2966 0 R /F51 3667 0 R /F42 3513 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+8318 0 obj <<
+/Type /Encoding
+/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro 129/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]
+>> endobj
+3667 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/BaseFont /Courier-Oblique
+>> endobj
+3663 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/BaseFont /Courier-Bold
+>> endobj
+3513 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/BaseFont /Courier
+>> endobj
+3078 0 obj <<
+/Length1 1653
+/Length2 10853
+/Length3 532
+/Length 11741     
+/Filter /FlateDecode
+>>
+stream
+xÚíveT\9cë\96\ eÁ¥pw÷à\1a\82»C\ 1\85\ 4ww\87à\1eÜ5¸[p\b\92àî\ 4g8çv÷íu{æÏtÿ\9a5µVÕúÞ-Ï\96g¿û+jre5f1s\aS ´\83=\98\99\9d\85M\0 \ 1´\a»:{ª\99Y)2Ë\81Ml\ 1ïRn$jj g       \18ä`/i\ 2\ 6
+\0´\80æ\0\19\80\83\ 3ÀÎÏÏ\8fD\r\90ppôt\ 6YZ\81\ 1t\1aªZô\8c\8cLÿ\94üe\ 20õüwÍ»§\vÈÒ\1e@óþà\ 6´up´{\8fù\ eñ\7fí¨\ 6\ 4\ 2ÀV@\80\ 5È\16\b\90ø¬¬#§$\ 3 \93\0È\0í\81ÎïE(»\9aÚ\82Ì\0\8a 3 ½\v\90\1e`áà\f°ýÇ\ 1`æ`o\ eú«4\17\96w,1\17\80     ÀÅ\11h\ 6zw\ 3z\98\ 1\1dÿR1\ 1\1c\81Îv \17\97÷g\0È\ 5`élb\ f\ 1Ø\ 1\0²7³u5ÿ+\81\85Ãß    9:;¼[ؽëÞÁ\94\1d\À.fΠG0à=ª²¤ô?ò\ 4[\99\80ÿ\8aí\ 2zW\ 3\1c,Þ-Í\1dÌ\ÿ*éoÝ;Ì»\16l\ 2²w\ 1\80\81\1eà¿b\99\ 2\ 1æ \17G[\13Ï÷Øï`\8eΠ¿Ópu\ 1Ù[þ3\ 3&\803ÐÒÄÙÜ\16èâò\ eó\8eýWwþY'à?Uoâèhëù··ÃßVÿ\91\ 3\bì\ 2´µ`Abçx\8fi\ 6~\8fm    ²GbýkRäì-\1c\0ìlÿ\90\9b»:þ»Î\rèüw\83èþ\9a\19ú÷$LÌ\1dìm=\ 1æ@\v$V%\að{H\0Ýÿ\1dË,ÿs$ÿ\ fPü?Bðÿ\b½ÿ=rÿ\95£ÿt\89ÿ»÷ù_¡¥]mm\95LìÞ\aàß6\fà}Å88Ø\9a:8Ø\0\14\ 1\7f­\1a\90Ù\7fq2±\ 3Ùzþ\9fÝþÕ^\vø\8f\8cU\81\96®¶&ÎÿªþG\101{Ëwv\98Ù¹YØþ!\ 6¹H\83<\80æÊ °\99\15ÀÂÄö½q\7fË5ìÍ\81ζ {à;Á\7f÷öÝ\89\8dã_têV 3\eû¿\98àú\87
+hoþ¯U¼söw\r¬\1arJê:b\8cÿeÇþm¦ü>\v`uOG àßòÒúä`þ\1f\87¿@ÄÅ\1d<\0ÞÌì<<\0fN\ eþ÷+ÈÎ\aàçáùò¿ ø7\10û?Ï\9fLÀΠ\ f\80\1e\e\v\e\e;àý÷ß¿ÿ<\19ü\v\8c\94½\99\83ù_Ó£\ 66±7\7f\1f¸ÿ\10ü[\v@N®@9I\07\e\a\e;\17çßR3Wgç÷êþÞ\fï\9dø÷óß\17\ 2\bô\0\9a!­,:\98    \ 6[§ge\80kñ¾\ eMHêõ}g\87\1e
+q,mP/*ð¯vèñK\ fßâ¯4~®    ai\9c\12xmó\8r|Ù\91\1dù\8ekKÛ\93
+<Ë'þBIß[\80¹NÓÁ˸\eÈjX\8a\9a\15í}>¯¸  £Ëæ¹ûkBEÕ°ä\19\8e\83Ó\19áü\ f½?¥[\81?\ eÕ\9d#\9a¯YZ}Ü\87N\8cF\b¬Ú£c\9a¤\83?w´\ 3£ÃC\83=\97°½;D\8c¹q\88Ô\82n0¨4QþN¹D¢º\1a\95.¾:.Ô\v7"ñ]\931DÙ¹¶~\14û\85\8c\97Awê4A
+\9c\8a\10k\v\19\99\12ûY\15d\9dÔ¡ê¨^þ1óå\e\81£\ 4\95è\ eX\ 6§\98òE\9fìè\8dx{\90¥4\ 5\94{[²yì÷\14²\99eèIóê\89EÈnêù¤AD\7f\86ô¬v\1fnV \1f}òÔzJ\95ýÙ5åb¹L%l¤\ 3!Ê婦%\8a~\ f\ fUÿ´YÑïE\8b\ 1·I\8f+\8c\e²\aÿÄT\9d\89È\92+µ®M\19\ 6+ât\88*A\96\1fßÞ-ô\fÝbºòý¾TW/ÛM¾\87Oia\8aÈ[Âù\8e»Á#F\8fa\vò\19,.ÞA\9b\83Âúîæ\94¥Tãl*i@.\a\1eÍÐ\19½\0õ\82©\ 1Þbû\84C_d.bÜ\e\92f\9e¡\15öÔÃ\ekøóèÞäÞðËD\86>\ 6A6£zÌ;Ä\8f±g\90Æ»þ\80H\13\86¥C_®-\9bí\13ÆM®½Cö¢ÄÜ\ 5@ioõa\11Ð}\ f\8cÔª\b\19ÁHs?öLQÝ!\r¢ÿÌ\16\93WëR
+¢Ì{\19½U²³4äáÌƺCï\\17û*Ì\85!Øþ\8cLwA<Ì\95D\1a\19·Ã<DcQ\85è"\19;9\133(\e¶r\95X(úó÷·®¨\9aßþ
+¯þ¾.\r\81\ 1Xp§z? Ôf¼´\e\94\7fõì!¥Eé³Y¿©½ù\9eîÿ\10\9d\9f2á9Ò\92?¸ø\91ãL{\10[\14Ù\9a@T=_]­'Ïû\90Çý\88HD¶]]ê7Ĥë1°\93\f±B\83\vß\vÇt£¾×¢Df^\85\93¶À}=\1fô\83ñ\ eÓ?#£w?
+\\9cg:\8aôa\98\93}»çdý\11ãØòÔѨÓ\ 5\7f\f|F\f\búD\11\99õ Ö\9fOt\13\7f²O\1d&[¶q´wÏqÓ\82õ\10\1f\93ß®ïA\95Y±À3óäÇúa\9b\19\9bC\17\9f\831Y\8e A\80\=GäÐ\8e$8\96\12»,²\80?¡ïWFOÉ\15S½Û8I*Π5aÿqKôâSÔF\1a\ 5¯èã\ 2\98,g +¨üÕ¹Ò_d\1f[ú9ÜY\97"dD¤A1G,Ó\19«èöM\ 6Ó×0ó©\14î\17Ò÷>\96¹o\1c\18\v4ZeèÄOtÑGVcÉ\93z\ 5à\97´í·\98iVÆLåPþg\91o\96Ê»{;"ûêr6³ªAz³_n\8a.#íÏ+\91\96*·á>\83\9a¿RïSË5°?dZʵÖ\7fØq\82Ï\a«S-­\96r-\90£KPÙ÷È\1dY\ 5¨Þi«3±`î3'ÕÌ\8eü6ã¬k²i\85~}Tlc\ f³ÇM5÷è_ØêûP\82*sä~w@\bͯ½ý39~ÿCK(­\134g\16·Z\9ee\1f¬\92v'¦\9a\8b·-Eb\1a\aç\9d\1d\rRãÉ8\92Ý\99\98T_\7fudù«]0\99f"LÂ\17\b\ eô\fû\8c\91\ fWÕú^\101\ 6vqõë\ebrÑCÍó\12À\9f\95á\1d\89\vn³&\85vá.a>\97¡,\91Ñ´lj<ZÚ·°\{$@\bÈnÿ¢HF\8cá\eÕ8\15\99lè£%\19§\80?T?Äwr8DQJö\8c?\b~}\82\f\ 3¹´ûQ\8b Sòn\7fàú°ñq ñ\12ÚL%\ 1\8dSÜÔþ\9e°¶ }\18_\f\88ó\11­Ñ;ô÷\93h\98{;M_k)ü5êÖ´sç\\8e}\92\ 2eñàÈ\17øè&ååØ<uoõaéTñü\19\18Ìysu\a½\8ay\84°\87\9b\8bV\9d\ f+cªk\ egjé¹ä¥<eÉ\97ÇÕUøã
+_\b\82F\f\8eÐ\1e\eIY\ e\14V\9d;\M\12\b\17\83ye¦\1cëX¸\19é\83\80?^ÅÐ9\90hi(t²£\ 4¬÷\8a«!ù\97O\9c¡\99\10Ó\1fI©6\ 6h¿m\82>&{»Ów$\94\ 1Ky{ïÜe\ 4'k¢~ ¸mbq\90;\89ä\96\9ce1À\91\1aa-\18ßeâ\ f#\8b¹Wnðì¸\ 3+¸Bq\19È\ 3Tq§Îʪì$tï7à­\99Ët\10\aÂ"        #$ÏX\14¾!âÆ\98\1a+â³\8e\83Çô\1a\8fÌVvZ.\ eï_*'Ø\9c\94\96¡tß°ö4,®\82¶z¨·\7f¼]->áÌN\0µ-Ôt\84n_ú|!3µ\eÂ
+OEýÛç»\8fùû{mm³\99\ eNàÏEk\8f
+\fBV\7fW\8cVA¦®¬Æ\919ôò?`A+Ý%g\1déÁ\86\9e\ eí1\1cfp\19>ÿ./°m\v´\ri·F\84û\92*}64tù\ 6DA\94´v²M\8dä9\1chÈÒÀ\9fpW\14)ÈÙ\9fúÙ\1cERÛ:Ðà¶Q\14\1cÞDÓf\aà»a\102%Ïe9Í\10Ç$îý4ø\15½VÉÏ7"\1dG\0zAb\fÓñ.z\9e\10\93       ÍzBòµwë^ò%:<\ 1=\8e\11º\11\8dÒ\18Ô6ë+½\ 3Ís\85ñq;\9d÷\ñ!©x©\89õ§Þ\8b\rEè3\9e³\8c>>ÒåhH\10Ï--e짹ê-W>k\1eq÷ã´12\ 3\9f+1Û\98\ e-èü\9aI|ó\1aËs\ 54M\9eÐqË:1Q±aX¦çÕ5§Ë\91\0\91~íõKú7D\90æT=\1d\93hX\88h\ 5¡6Ôº\89\9a#ñ¨ÀhñgØ\ 6«æp¿¬"$\13¯§Èo#*¤,\83üÒñ/\93Ç\8bÒ2SdO~þÚ\12\85\9e¯Ç\17_ä¶Ü¼î§39Ø\e\8dtâý\15ðGÝ'\ e4\8f£9Oç\1e+´Ú~Ãï[\89Oß@\84\14Föê¢K×\f@¨Pþà\v\14äç:¼XU\rã,Q%÷g\98üÃwâu-Uw,è\eæ\7f¡\1c·LH:²BZ\86\ 4g\176®Ô\7fÇL³Z\84vÀ5\89¾\ 1£\87*VçÞó´Ò¦È\ 4\11÷G\1e\80\1d\8cn\vÍ\f\11\93\ fúãÍÑù ¤¤¿\13I\84âd­@ÖÔx!\8d\88µ×\81'-ß¿°\93Ó5\8e}å(¦Æ£Ê\9ePïC,ãºô±é\eùz[\98>\9c#T±·\98\9e_¹1×ðÁµ\93öm"\9c\a.=îâ^çfÜ'«<\95\a\8d\12d\ f\89\8c¢Ý4Q\83\ e\98¨Y\93vaü"\16\8f3»Ü¼(Y\1e$ºC.\ eðªÕ¤+¡3,óç\95 ãh\9c\\ 4\102´ N·¬\aÈÐ\18\81dJ\19NXc\8c/\7f\ 6ØЪÓ\86D\15Bó% ^~
+\a\ 6ø´>\16ßá|¿}³¡\14+¿DîÂ_\rÑY2c<QkÁFC\81DÂZn_À:¸\83\1e§D"¨¿ç5äØ\vF  ýC\97$ßSÎ+<±¨\8fZ\1aÛ\9c\99¡WCn\99Äá\94å<¶}\18" 4¡I\9eZ®dNø¤¶5ë²\9e÷\ 2ö\9eº1   á\89      jì¢ÌÙT\9b\1c»6 >nÚòÂë\85Sl5é)\1e´O\1aø\13\ 1\11\e¶+^¤¿²\89\85      Ý=¨áå\10_8ùµ\91ëf\96*xK\ 4gtru\b\16ZÞ9Ç\17\e\9b»\ f\8bÓw\10ïµló\ 4Ð\9fûÁÕR-&ú£P%6Mt\91!·°\11\1f\95\82ç1^X¶\93&}R\85`­õ\1f4\87&\b^9£2T{2\93Ãc_\8bÖü\13ÚÑ\ 5
+Ó7K#+xÎåsu§-e\9c­þ\eoaDÃ\95Lõ´½\91\9b¸\1eÈ£Î\87g\16\ f\91?\88\8fð\16Ç\ f\8do*¿\ 6\9bô]\8eéEp\14Ä\7f§)ó¸§
+\88çé\8c\91\9dRªüRìBêëíï\15ÈjÀâßA\ 2Ü\1c\v+%\1eÅt¥ñ¸Ò)áIâíz·J\8c\v=T:^|4µÄp,èÓOAq\94\1ajú4Ý%ÄÔa\14\8cQê]\1f¤e%\13:i¿j\95\82ë²8b\93\1eà$\0Æÿ\13?§Ð\144ðØåç"ÐæÄÀjq\99,w7/\13\83ѸE``hèÙê\87)ø¥¹K\a-\1d o\8cun00Þ\98k¬æÙ!6ú\81«½¬ça9¤\ 6µTÏÐt¤XÁ\8bT7ï\94\15aÆY\90FßP/íêêyk\96»¢keñ.8\89è\83ª9\9d7ãÎÚÍô\9b£\84ÚÚBOs\93\92yv)ç^\7fÒMh:;÷ÕC@Û=_/7\8331TóXGÃõ \96ok\975ðâÖæ\91P\97\1cÙÖmo\81]l[\enùVäÞé ðW\1eìã«H\e×\ 6\1a\1fãT\97)2Áý\96ö\8dí!\8dV0e\vÚ¼üÐy
+µÁø\ 1/k7e\eï´RO¨~ý¶Ø~,ï\1e}è=\96Î˪ª3¤S\f\81
+Ny\83&\97û\95Ç\92\16ÎW/?ÃæÀ©\12¤ÈÎ\89\ 1ªqf¹áãXºO2©³\86ª8ü\ 5ß\r¢ñ@¨\bîY±Kµâ8\fd´=Ph!Iß²IYà\84àÒ\87\7f\16Í\9bI¤ÑL.ø}Ê7òxÈg|,áb÷oõ\9fô¤ûðdBKúIhN´¬\12tÄ>§È/|\aRI¹¤$Ý5\8d\a\ 2\ eCeq\93ÚÒ\8eõ"\1c\ 46&EùÌ\eýï^Kø\ f\v~\ 5?\18Ó\7f\98õgy:ÛÓRcåÙ\97.`C{F\99U\8d\7f\0i\1cáBp¯8*[ûa¨fÅøB§z\86ÿyÞ?h\9f[bÔ¤Ô\95\93ðM^\89Ú+¦\17éØJ\8a\89Z5×ÆÃÿvû\94\a\93\ 1ï)\9a"4Å¢\13Ûb·q  ¦ï\98è9êSSJ\84ml\9bÂS)\8eg§y9ã\8d=[ì~dJ|Ú\9f7"     \1eØ17â\9dÑÔ,ó1¥Æ\8e¼k÷\8c#¶v\ f\95Fpú\99]R\11\ eå¤q{ñ­·\8d¥ð\14\15\ 5\82Zç`n}\82ڭþÜ\0\16&\17*ªqü\19ßô\10É\9d¬Èoâ\94\\1f´\r7=¤Å\r\95\0^\9d¶F\16#\9b3\1fDqé\9fiÇKRêÁLBE\97£\88¤4è×ë²®úÉÚ\876\8dsKM°:=BjøÕ@#]\9eÿ¼«v#\9f\7f\81ß©ý{wâÜ\8f\1dob£?\ 6å\8bÇÖ8\98KH©°P\ 6WÊmc\18\ e\ 3XP°kéØÐú\f³ÞîØSÔÏÝìvz´Û\9fïûbÁ;ø\ 6K·Ñ\13e\94\10\83Ö\85\95\92\83\ eyu²\12\v\ 5:\9b\86/H\1dxë(·®k?^fM \92\93\84[ãhGXBu¯\14<\12\88\17È°6í\19\18×V\ 6\86Æôæ(\9c·z§\87zdñì\93\89©É¾e\99Y\ 2\9e\14ÕSa\99þ\9d*1\16\18\1aõ\92m=Ù\1f\91G òÈÅ\88\9e\ 2\11Ô\80\9c\e\91Y\8fFò!_\95jk       º@\ 6(;­Ý­¢'Ý\18\8463Ì\11©\93Ò¶_c^\15ìAív#a%\15)*=ª×M\9cb\13¤ªéU'Ø¢G\ 10×Þ\84\1s1í] Ð?秸s\ 6Ð\9f \8b'\95\9aé¸EÉ^»PÎ\97\10K\ ev¯ÃÒagEë\1d=¿®¥\87 \rZÊÊx -\99ñ\9a|\r­!kæ\15F9³\91vúbîGa\ 2\7fìÍ~O|\9b\17CÐÆranÇ\ 2oÃyéÈVQZ[0Õê\ 5m\8cõyVYÑxu½^\87\r\82Ôzµ2´Ý\86Q\89îzHÃb˯\87ÈgÁ\98Ö4\9d\8aùg´v\9eÝ<\ 3\18\18´\14~L\17¬ª¥\97\1d4\9dB_U\15\98\82¦=V:Kÿ&"y\83W\19F\1eÇ\18«(f\9bÙ »¤® £Ó2ºquª¼\14\88LA¶ÕBè]\1a2yåÒõ\82\8bØ\1a\89U_\94n=\ 6rRú\1dÌ+BWbèãÿ\12b\84Çy\vþÓä¹4¿x¸\99\10
+ÁOü\12°&|·»\8crd®\99F\1f%n\ay6µÚ\8e\19ÏÇ\14\85Ý\f\r.NKuz^!½FK0h'\7fü*E\18Ô!\85\87C·«§³òVE\1c\80HüZáî\82¥ÛZ÷g\90ëª\ 4?\8bÑvóì²\8a\84Û#\91\ f\91\ 3\rêUì@½3\95\16ZO\8a       Õ~\197¤V~Rïëú\99Ä|é0¸Ã0é    \17\1e\99Û5?û­\8b¶ÊÎú\94¹Ï\96®\bºc\8c\8b»ÿÉÓé°ØÄi\97{\ e÷\14{\13z4Mk¬HõqÇn²&®\162\89\ 6«[ç`àHA¦0'Çå(õõ*èñº\84ê7®\9f÷ºTy\1fÅÓhåòÜEt\9aõÎêr¢Èo?%8ÿÅ\90`m\9a\9e\ 6ý5\86\0èöô/\16$mt{²i:\ 2ê¥\r\84eÊa19Ê9\85S˯\13«\eÑ\86-XB\89Å÷%ª¾à\84ZY{\9f\10\1f×3¿Y £/\99waå||f¦ñÌ\83\14c  \9e\1dÎì`yÝ\b\1d-s¸?N6¸]Ûö\94S!Á\8b\93,\17\93,\8dg0÷ºÊ«\8cî«\97ªØÛ4òjN¡jUët\81ê\946¬k\9a
+\8f\7f\97TMÞðÎU\87ÀãsSÌ\r\e÷n?\97Ò:°)[ï±¥\8fÊH`\£|ßfÃÇÌBÖ{a¼\81P\b\12e\97,k\1a\9fØ<{\86\fSK·Î\ eÞ\93 Sæ\17O\1f È+þI5O¶\8eS(D·\96¸ÎâúXéäBÏæ\93LX@«ÀäIQÐÛùà 6¬\88àÀW\8dÏå\99\13±g/\ 4\16È\93\84ãEþÃèv\84¬6ôÒ\vªg\1aJGöì#-A\95@\96°D±tnFý\1cä¶q<\134\9có-ºy­&¨\94 2Ý<2\99Ø|\16 Al¦¯c°ø\1ch5²Ú~º!ötÏ\95Y8\8b\85q$L\81Ôë\19©\15°Ù-"ÓO\82¬\v%íó8ð\16\1a=Ä`   ¬$\9e¹>\9d\e\85\97\ 15ËO"p\11\8aMyW½\8eº\ 2õ\12\ f_É0\8aô\87}\1azëYÛ\95Qt«'E\92¬ýô¨\10$2áèôz\f\15 ´»(ö|khÛò%Mg\86\81ÇØg\98|±Õ¯Hmæ\80\91
+½]Ü·sôÞ*p2õ¬õz}Pýäµ\17_f\9e®\90\14S\ 1ó\e\95¾<\12\18|§nÔ¦\8d¿[\ 6k40lÅJ\\96}²q\Q\99\81ºþ{\9f\ 5w\ 4e4Ë\9fLõL\96­q4¯ôH\17\860½»5¢Ê\186È1\7fj[\rçëï\1fÔ\11\91ãmêd\99¼\ 3
+HW_-(7¾§\a\våÒ\89ny\14æ.ÜbÇi\921\8b\17<Áî\18Üù\ fGã>Ü §ZÔè¡ÏÝ\19~?(\e\85ßÄi¯F>x"\ 4í´\vÙ\9d\89\17]¾ÜZL1\7f8fO\18h¿       4\82ÿZ
+!~ä·<j¼X[îý\96"m\11o[§Çq\91ÛmòIá1êK\ 5Ò1\17ª8&²O\8fìë|å*\93@\ f£H¢\ 6\96\v½t¡â}GèóXs³ú­.\ 1³¶\17\1dÍú ;\r\97\r⳩`>3\14î=Åxõ\ f \17\ 1öö÷\ 2²!KâöþÏÈ8\14ºW++"Ô\1dG¢)3È\88vS'-è!TãX\9d\\93\ýÔøØSX-¦¨9§&=gOb\85\12ß,*>±\ eUÓÖ{á\rb\1c\ fä}öÈãÏ\9cå\8eÓ\8f\fPlp\1fy\94\fì>òs­\89>ÚEå\90þ\h}\86Î\97Z ^Gþ\f\17ô]¶0\90ܧ¡æ\93¯çèO\98f=(Dê0^Ùê\98\ 4Ñgâ=G\r\87       R^\8bg{ׯ²ÇÆ
+*7+ºù&Aþ\v\15aNo\98i4\ 5\8fIù )\86pSV\1dz¤«Â¦\89ul&\rÂ\8eõãö)\95=d#L$·Bµ\93{ÜFüúé©Bî\14\83à­\a\ 2²þ \19Iz­y]\suzsî\936iö8\89oaWÒëÕEæs?Z|J|L\Ì\16(¸äÊËûü\8d¤×Ùo\9fÏ\9b_NêÔ\13a\9bN\82ï\8f\83ø(Xd·êÁ\95|\10þ¼/¾ôhú\99e {þäá2\9a\9a±u7r\ 6^\1dÍ\'\12ÝAAiÞôk6\84¤\1c\8f\13\87_G'êgÞÔ\f-Y\85y\14nzß¡ Õ¶\9c§H\16zÆñäf\17¢\16gÂí\92\81\80³\87\80\14\ 1\Y¬»      TÁNÒ\ 3mîr$ãi\f\14é½\13\88\10\83     \93x+Fç\98Ík]\95ɸïø\8bkuhc\8dW\9a\1cOóOÁâ\82iyñ-þI|\8dÒ\e\b_\99ü8wgØÄ­B]\8a.Óqpâ\1d¡t±\9e78E\91ý?Ã\9b<¢=¿°Å ÆöÌ·qÍõsÇ\9d©|Å>÷Ãx\81\91IäÙÓÛ\84ENáø\9c\98ªºb[\9a\92+1\19É(#Qýì\81Jwô\82D\80\80bGn¹\18KhoJÔí·Ú=PÙ\9eV,ÜUÑ\98"\8fä* Q«á?¿\8c*e\96\8býæ]\1a\97z\ 5\ fjpùN\94y+\ 1Ѽo;â\98r-¡\81%<×» | Ú¥Ö°b\87\88V  GÖ<£¾l\95s¡«C\84¡=t¯ÈÄHÕlkÉ!5\14~>?Clß'ÜWgPÿ\93\13\92UX\81£5"r\14×eãûñ\f\8aG\f¼8ÚO\8bì|Vã\1f×ÂP´\eÚ{GE¶ã'D\80_­ô:ú
+\9f1º%\93ÒwF\ 3\bwÔqc\ 4\17ê÷Ñ1è¸KiåXÇ\ 3à=Ã]~\8bI[\8dcÏ'5õ\86\9c{aO\ 1¾C\ e\1fÈ\vÏJ]\8c\8734\99\1e\1f\84Á\80-ü?YW¢®\85\02\ 5¬`\1fá \89ÃÁ$º\1f7ÓQ_\ fÕC\vÜ_8\8e\93\8cebéó(¤hñì¾\9fe\11ä:Î&   /í\9dà\0\8dTFáF\9c\8f\84ÛM\99\f¥vg&9î)ùú§"TÈÆ5È\93'«æ$ÏIOÒá¶\8e«}G\90ém1 Hùp[¨\1f³\9d»N!½$:ÌûHeJ?F\93#X\85FÕúò\97\93ýè×æò§Þ3ÔNò\94ß-\r5cY\ 1«°·A\830\1d\18iú­¶\9fu{D>¼þ²\15£F\80sü6i-UpëÉ.Íü\85\v\83á\99\12Û{.ó9{&\ 1M\85\7f\89\10Ñ\94à\8d:\1eª     Q6(õOZUË\85,\ 3\82Ùb[F\vi\1f×ëR½\1dý1<\89Öï$§ä°i\ 3\95ëûG«¸ü¶\vìv,6\8b\85õù£-W~\ 3\94\9cþ¾\ 1º\17\ e[qͶUáa\8a\9cò\ 6}©+ïÀ\ 6\1a¿En¸\82\16\12Õ97õ\81ä\96\82m\ 4¸S\11{
+WÙE/h\b\eò%\ e\b\ 1I¹UùöÃJÆ~ìE±\94\12¡û3ßõ×pèÛ!\85É\16i¼Ôj¤i]þγL\11¡®\8cá¢Ç\94!ÄüÀ 9%\7fÔ,\9b\14]\13\84F\ 4Íø\89ÕÈá\12>\922\9fÅEL±^õJÇ\95\9a\aö0t\86\fç/§O\90\94û±mCWD,\81³\87\94\94Ø(\föZ¸-\98^ þ\rδÝS\91?:k'Gp½ãøqù/ëI\0\ 4÷à?X¬C;ù=CîØ\84\8f\18$\1f,7à\8aÖ=´j×\87ÆÖHÉ=|Å\164E"Þ*\18\94·t\bkÂí\f\8az\98Ä\1c\82®^v;&ÐRlCæ\1c¢\1eÍnyÒ¡\8e\aÆ\ 36¯©ó{a6È¿î÷D   Ó§0!hê#\rýn<~.ìÕØ\80 {¹öP \7fEçé\b\86\19ûøÃõ\12C\81i@S\82P\80q[e\92R\96泪{§á%\11dq8\7f\16FEè\96\9eÚ¯¶®a·\9enpÇðzâ\8aغqã\90\9c\95\83\17x%¤{\90çÐ\82³»h¼·Öøj)uÐàJ\85\82Õ\9dÙ""`\92ÓÇjüë§\9e\ 6Ý/F<OÔ¬ÐÜOÊ\r¼(É3\15ÏÄgú8¬\14\1eÀTÛô5<¾ck­h%¶\80¯\15QE¶\9d\14\85¾*\840\82Ôó2ÞN\82\90ºl\ e¤çͶkèS$lÒè0Y\11xÄÕ®\14\ eý¨¿­\98&V}_\0\ 3Y\17±wú\9d\8e"wß~¬i\1eå18°Ø\_ö·$\89\1d\ 6\95NÅ#\96\7f'õ¼×ù8\9c\19º\1c\12ζ®<\9f÷F7~½«?\19T\ 2ÁÄÃ\9eÞ\80o\f{¸à¸\9fÿûX\93£Fð&¸ÑX¸±¸è\97©wEê²æÕ\8a\132ßk ÏG"£ÑhIö©{\9be!}5ô\87Ã}oPào"\r\e\13:xû³K\1dA7JgmØ·Å\1f!\9fc¶¿<¦!P\828u+Ô\8a\96\13Ö\85\8aàÔæ\8cR\89\95[C\10µ\e*7\91&Óe\ 4N\9b\96\ 5$dz?e A=ÅÄp>Î\9c\1ffö¹õ
+\84\9e\v\9f>u/Õ!@Däåþ\91õÑ£t!\12\11
+\1a#`\12²\ 5ÀÛ \1dÍ\b4\86Ü\b/\82\ eï\96âü\ 4ø{M\81¯\rAs¢r\85\8eq6\ 2ù\eÜP믠¥ÔT§ÀK\99Å+öF\93\1aqJ\r\fÂ\81Tí&ôÙW\9b|ÏmìÞÌÍbe!{\0\98:%Õ\8eý¯2,½+gf\12Z<\96\ 3\añ5(äï~§h\1eVä8\a¦9´}3,å\ 4\10wûµru\ 3\1c·ý\9e<\b¾\13\98\8dÊÅG&ãzü\1f²Ê\ f4¾ª\18¸}\91D\10áëò\rM\9d3«:Ñ÷Î-\v\13ô næ\8b\ffUÍ·å\96k\9b\96ùyRvõê\8bèLÓ±½âÕ©\9c\81\8b÷3d\8clúµZ\8eÃïÍ÷³\9bý=ØØ\ fèáù@\93\93§S\81»vD®ª\0Ê÷Ó7ý\96]N¹\17B.¬ÖSÕdx¡_N\8aæ\9bõkU½;ÁC\ 1ö×\9cïØÉìéâû\8b?\81\8fR?\ e\9dý\ f¹\ 2-wÆ7eûXðÙl\97\1c\88ç÷,?ÚáD1¯\9eÕ\18dåê®\9eS^\98ð3£çÌ} \9b,$W\92Ó\93\96?7Ï\98\11ö\aå\ 3.\18\97ã׳-\10ÝzÍ\85ãZþ÷ìN£½\93}\8f)Ft©}×yxDj¥ód·Q\9b`7      ?¿j^GÏ\92Í¥Ü\9fAj®§\ 2óÔ.r\10å\ 5\ 4\ 3õ\17\9eW\16We%Ôf\15½n¥Ö¦\1f\ 3oæ«4z\9ax7\16¯]e²ÍÂL&\91ò\99«×±s¢<\96Ý\87a³{\ 2\84hÖÔX\ 2\88\ 3ßÿ\82óâ&Â\1f\ý`JT~ülYÀ(¥Û\a\17i\95î\1f\8càD\95\ 1>Ã~#'±a.Y\19'óLæØV\ 4Ùâ\v\9b\861\14äÍêÚ|­q\89\97Ñ\84WýfãuÄC³{Æ¡\824K\87 »MbÚ\89¾{É;3sÕ2\ 5 X«/øþUÅ1\9dÏ<#VÙÖ\17\17ñír·íXtºa¨\87\87\9a\ fÔɦ\0\89ß|déùM¢\92\ 4ÅÆ/\f$Ѧ­ü\16:RÐäÍ5ÝFä\9c·L\89+'dG\ 3fÁýÉ\93¼\80¨\9b\81]·Õ\1dãa@©fy&\1c Ð-1²½\89µu$IEQËùF\98k1\13Âqø\ 1G\85üºQ\9eü¸¢Û\93HRüK%~\ fÕ\aþ7ëPÒ\1d\92ø¹\8aSB5Ö!uÓ\ 68RI©u½pº\,\16\e©\8cÕ(x\18F\ 6\ 4\97.\r\9eê\83f\91~訴\8dT\84Ôõ \8dÜKèÎç\1aõ:\v».}Т¯Ê\9c3\1cäÏÄsÀÀ
+\9d³Ì\v\8e6;\9c+BÕ÷ã91È`v)æ9\vù \ 2ø8\1a\ fÝ\81ve9s7\8aE4éa÷g½ß\12\13m3[\18°F\89;Ö°=\ 2Þ\ e\83V&\ 5\8a\92±
+!\9e¤$'Ûlªó[ñð¯Ë\93+\96\82â8\88|önW\91H\19v¼f{\93¾ÀùàÑÖDàÿÔ½Ï\7f3ê|­P¬Ân
+J(½\11\13Óêp®\1aØC~¡·¿¼I"Ùj\196%òB\80£\r\18ª\9f§ZMó
+ ³$xÄMþÞ½ªöÛ"úØ\97\85¤\87Ãb\19$¸¹M\8a\12O±jÑ9tï]W`\ 5ÇÙ\99äì¯Ùì'V\8eà\18{\8d{\10ì®(²¬\17\a\8aú#°O &7#Ï\8d¾rßcf¶\9a\9cdy».\Ü\f}É¡Èί\98ÂÊûi/0\1d\12çrv\r}4Ê\fð\96\12Aðí4·«\80\ 1=½§b<>ç!0Ë,´\8bÅì)ä\1aÛ\91bHLðP³\9b\14ªç¾RO7K\89`.{\9a\92G±$\ 5)t¼rÜ,ô\8e\92ãÍúª öç\96v\r\8f¾Jɽk;xìó¾Ø <Ô¶\87L2\rB¦d¦«LÕ«\98]P£\8a\1e\80§Ù\ 3+\ eZh\171K¥µ\ 5n®.°÷¦\12¦t¯ÖeÞwLá\v-\16be7­{ò\ 1õ1WìºJ}n;\a\97¦ãY\85_Äd¨ e¥Ñ¯6\96ÚþAJf¥öãoÜU\9eøüt+º½\81Mç¯ýÖR\93\13ª-\9dIÜÌMê3\805XoÂþÓhq5\12À\85\18½Ù\ 4\1f+\91c}\95\95ïC\ 1*\8a¤D\9b<tù½Æ\87odóÑa\b_pV\e\9bïñ)èfw\ 5òñ½\11ðúj\8e ­Ûkj\1fHW'\90Í\11\15£Øè>\r\10\93
+b\87ë\89e«î \9fgÑçbEÅ?|"\14ú¼\1c\8b;³Ôþ!ä)\8dmÿ\13\93\8f\8e\11\rbÂLN\1eûTÔ\1f\88A/|,È?$"Èè\f\93\96©\ f&\96T
+Å5b\8f\7f\ 2Ùák»øæ{õ¬bK\17\15\98\83q\18Ú6?\9ciËt\85b'\14\80Ê|;q23\ 2È^ƨ\84ï\a#\18G\82K\8eSÉÖ0.\1f:×bÃ;Ï(Ú\89l;îh\97Äc\9dY\8cëy1ºÖçz!S\11¨B6\ f¢S\11Ó\a´Ô\f¨½ç"<\ 6øfT>\91D\19\16ôòë\9dsº3¬ÛÌUÊäà´¿\f\91³`\96f$(ké\bo\9ePe6'Ìî\8bì\8a\1a¶j\95\ 1\85_\1c&\19û!\16%óc\ 4ô%÷õ_\8a=½#â´-y¸%.>í6ßUÿÖ$\1a<ÓdbÕÓŬ®ÈÞ\19\1fN0°vð¦\91ý\15\90aÑI5#Sç\91ô*\8eÖ\85aù¤ÈÖæ²cn\80YômD\&¹ª\8f?\92¥ÏQ\9e\1e\8f]\9e;l¨°>2w\rõ®#÷\f\11\19Käç=@Ó\12\96ñFú\ 5Ä¡\84D\11¼\14\ e\85B­Û¶\0\13\12ÍWÇ\ f_¥h*\94\ 2wS­µÜ?\93fuÕËä\1e\1c*F¯ÉF\17+Y\ 5\9f¨T\87âc\1a\9eü\91ì\17!\13j'Q
+>¥cD:6\ 2**ö&3¢\v\17\8d\1e-¤¡:\96*\17`g¦\8du§&q©Éu½.êíë\v\1e\cDʨ\99+k·J(
+\15ÎLÀ\ 5¢¥'\12zÿ\ 1
\91¾W.Òõð\80\15ñ)\ f\1cæ·æ\9a×\ fÂߺå\89¶Eû\93¶äkðIxöa\83X{-\eß>âÕ)\hµi\9c¸þ\ e\ 3p\88\1f]IZ¥\ f7\1f\15A\12ID$\82©OÜäÚ+a\f\8f%:é\8268Ä\14ñì\7f?u\93-9¥A\16ÛÖ\90\1e\eÎÅxê\ 3v\1fìâ%»Yë/\ 5PPéC$[f\9c\e\14¤L\8eN!nÇíM\ 2Ä?\13OÒ|\9d¼\1dóE»Å"7ÍZCD{EM\8d¾\ 4:\94\96\a\ 4\ 3éx\vh\1an8ã\88\14²¾¿\94¤£Ù\10\91\84÷nßMHÓ|j\vmÁ ÚLvrýMÒß²\ eñj>w'jfp~A   Å¹\83Í(Ð\8a\ 4ñ\9bb+Ñ9/Õ­úþT=\ 4\8e\96{É2KÚtCxÈÕ\85è
+n\0j½iíóÛ>\a<jRù\9cª\ 4\aªìüÄï\97\93Ýκç\17êx_\17æ¥_Ú\85\91¸ JÏT\98Ç\89     u&²ÚD;\83\rÈà\82\8eËRz
+\ 1õ]°îá§.K\f\0Á¦/\9añ\94XK6\19¾ë\\bM\16I(&ãC\12-ä®÷è\95låá!OTû\96Ì\fªTß×Çu!ÊóZÓ²\9dèér\16\92>xxaGåY\80ì\83ñ¼ë\ fÏ\9eòý\ ew\e^\f\1f-\ 1\9cîO2ÇuÁGgó¿ö\89û\82ú\11º\97zZB\88³¥öÃs"\82\15\8e3^>ße\97Oûc\8b\82\
+íËI\16¯\8cê\1eËâF\98Ëhä½»9ÛöøR\83eÁlCò\ 4\15û$×_J\ esØ°WÚ"\89Êä\82L¿\18\8cÞÖÅî¶Íó\88AÜ^\88q\13£ÐéÓ\85\7fT\18Ð\83\87\19SB\16E+\85\9b\83 R\18\94\±&§u\96Ò§_¹\82¡ÿ¹ú\19\89\1a\9d/\1c\ 1\r%\ e\16l6):\ 5cÛà\12\ 4\ e\83¼ÙÝ]íù%øª\89vlßðbY×Uý1u¯g\9b¤ô\13Íð\8f\96ãÎ~\81ïjZÁZ¯e\1eShÙ\1d¼ÔMð¤¹!²\97Ã\13ö¾»sX\8a(.gJ   MÓ¯X[áÐõb\92
+À2Ï\va/ÌWÚ\98\8fr\975ÂOÚ8^»¸\1d\87E¿Ä:4ë\13È6··\8c\11\0.\ 4ö5SØ Eú\9dû\1aWH®M\11\ 4ôز_ø\9bXQCò\7fØ\95B#f·*ª\esl\91J\1e«¹Jo\1cÍl.\19T\9fðó\9fæ\19g¦N)YØÉ\9e\95Ñ)\ eä\85~\ 5\8eXÝÝ \9bw%¥É\e&gc\83\eF÷¦{WÌgMbÌÂÉø¥\11!÷Å/p2\19嵨µ®ÔfRôDê\9eG}à\9d\86P˦F\97å]÷FZ\19\1aõ8\11b¾l_Ã\9dê©£­}Äê\8f8j\8e#ðdý\88\98\89\10ó\82È\e\11%YyYµ\5\87+\19?èx÷\fÁ$\9aw4\»CøÊ\8bÖÂ\83&\16\85eIó±6çV\86p\98USr«\81\ f&b$\93\13mFÈ/ÿ\1fòÜóÞyE\82¿\10ìÊ4\7f\91\86\81ðÎaª8ágiqy¿¶¬eõÑÍc/xnüº
+\12Ì`$\88õ2\87\1d\84\rQ>?¤}Ú\8b|¡w'D0õágªúÀ\9cn\93\99êö¤Þ/HQ\8f\17@´M\bW×b{N¼Å\97\1c\98¶Ø×\9c?Çs\83æÙ3\95\1c\12Ku½\1aD\11\12(Vj\92h\96ÞéU\ eW\16±/ß\85\87\96Bxiåtýá\¯÷\16\85\99Í_ã\8b\92DÙ÷6\ 6\9e\v}åÃ\12IðÝÝÞÉ7¢â)Éçü8=ë\82O&:8\8cvw      \8bþ\83§\85]\ 3\8c\86\9c­OËØâôí°Éâ,ða\1a\9f\83\18>¸Ë6èÑ\16\98S\84\84ôª/\90V)¡Bc4:P¿Þ,z¨Ils\19â*\90\83Ë\ 1\103æ¶'ú9Ô\10\1f«W)ã|¢O\96m\16&¿kå\ e\8fÚÛaÈì\9aoÍ&\92x,bç(«\97|é'ª\80³¼b³wOz8g ¾fzª\9b·*¨]\ fAÍéwÜ\92\84í\v\90\88¼ç\19é\9a3L\92Ï×&C©îuJ¤\91óÀs\85\11\8fA\1f5I\8dÿÚ¤j\9d7\8a\a·\97A°Câo+E7ó²¼Õê[¹du%3\8bÆÎm7«\8d\86\9a«+)b9¤g\ 3ä\93\17ÌÑ\93\17_\97[ hu¥û±4¼ê\9f\85q\r÷Ü\93\10ÊgWÝÔ\ 1b|þt
+\9b­\88ïæ²#Lú\81\12\ f²}Q\9f6\1a\88\ 2«udâ$F⧭\ fR\ 5ÉqI§Wn\95\16B\98Íæ3\98$B°}[\9f¹\915\8a-µ(¦$KÖK\1f \vuìoJ¢ø\93m'¤Éô\18ݸàÐ\98OguDk\7f\8a\9f\8d\ 3`\86,wØqUóÐ\94Ý°mM\88\92\1eä*R`|F8,Õ\ 6SEÄÅ\v\9e|;¨ÆÃ?áFä\ 5\82e\ 4{flH\ 5\1f\7fÝ\12Æö±Äü¾¥½´2à\7fÍl½¥pªâÍxN0\90D\81Oòc¶2ØHf´WÔ]\v\83¼BBëJ®a:¦ï\8d\eÇ'­\87ü\18%lõÂ\83\8fÃ\1eù(`ÎR\9eì2íñs\8c\1ff~ðÛÐ\11RøEt·[e ý«\ ef\1a\878Ì@¨\90\8a\15\11;àÒI\8dz\16ÏÄH\95[Ä~Áãäñco¶úSGþÐ\93Ì\83\12¸¡ö¹a\16\99et"â\ 1       A7Ѽ\aÅMìûåcÂr\9a}\biîÌ¥æÛË\93TâÛ×\903Îi\8eqP¯`³dgLåÊÔ}MýH\14Õ\v´#÷ÄÍðs.\84°®ºÖB\90Ýé¹\ 4KE2=+îQ\8d-\17x,v$¿o]X)dc\12»n\14¨[K#½ÛÎq\94\80 Sã\82Ôl\ e`g}\11J{æ\18¡\12È\8b·\ ej\91¢²UU´VOæ\13ûf{\86Ñ\ 3×J1ß\rÀù¨;sÎèÛP/\11¸\91®÷³o%µµ\92í3\9ewtF\ 2\95aô<\93Û\85ùÒÁºÉÜÕsík2Ëg1\93dD\11
+wé\8dÂ\ f\9a\19e¡8¡\97H=PãEZþ'Ô\87\1cÆÍ1£¡q¤(¿á4Ö\ 5\86\ 4ê\98±5È\ 6²\93$ký\ 2M\îå\9c³ü 'TÙc7Y\1a@ÈHhs\9dñ{ª\12/\7f\98Ù¬éø¯3©pQ\1a*)å×|ìjíIq\8b»Ý\8dõλ\1dÊGÉã5¨9ÝÞ2®\8cN\9fW"]\15\16<\89\98\8e\9b\9dã\r½Ä)NÅ\ 2=\15%²°9R>\rÃïùPQ0Ã\11»ÍÍ\\1cÙw\96ç\1eC²t;â@´Ýò\801I((ì\8e
+\87äÁýM#\96eUÄäÒ\1dù
+\87ä\8d£;\90Å\9bõM´y\88!°çñÎ_í\10¸§Û\92#ÀÍQ&©ÄÏFu#±\1fg\a®¿U\86º\a¤0O¬3åy÷õÀï|%`+×.W\fC­*
+>Ö\14\ 2~°ÃºmlJÃ?\98ËêR!GH\r4\9dfé,ñf1ÂÉ\9aÒB\83nªâü\1cª\13\97º\8côæÙ£\14\1a'Ôò'\945\81å\8b\10Û\7fó\83ôÿ\ 1þ\9f\0\ 5\9a8\83\1dìL\9cm\90þ\17þ@º4endstream
+endobj
+3079 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/FirstChar 40
+/LastChar 120
+/Widths 8319 0 R
+/BaseFont /UINTYA+CenturySchL-Ital
+/FontDescriptor 3077 0 R
+>> endobj
+3077 0 obj <<
+/Ascent 743
+/CapHeight 706
+/Descent -185
+/FontName /UINTYA+CenturySchL-Ital
+/ItalicAngle -15
+/StemV 86
+/XHeight 466
+/FontBBox [-166 -329 1018 966]
+/Flags 4
+/CharSet (/parenleft/parenright/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/A/C/D/E/I/L/N/O/R/S/T/a/c/e/h/i/l/n/o/p/r/s/t/u/v/x)
+/FontFile 3078 0 R
+>> endobj
+8319 0 obj
+[333 333 0 0 0 333 278 606 556 556 556 556 556 556 556 556 556 556 0 0 0 0 0 0 0 704 0 722 778 722 0 0 0 407 0 0 667 0 815 778 0 0 741 667 685 0 0 0 0 0 0 0 0 0 0 0 0 574 0 444 0 444 0 0 611 333 0 0 333 0 611 500 574 0 444 444 352 611 519 0 500 ]
+endobj
+2965 0 obj <<
+/Length1 1648
+/Length2 20374
+/Length3 532
+/Length 21296     
+/Filter /FlateDecode
+>>
+stream
+xÚ¬ºcp¤ï·.\9cL4±­\8emÛ¶mÛ¶m{âdÂ\89mÛ¶mó\9dÿoëÔ>çýrÎþÐUϽp-\ëYÕwW\93\10È+Ñ\b\18Û\19\9a\88ÚÙ:Ó0ÐÒs\ 2\84Ll\9d]\1c=\94\8cÌ¥i\14íl\f\0\7f¥,P$$B\8e&\ 6Î\16v¶Â\ 6Î&\9c\05\13c\80°\89\11\80\91\11ÀÀÁÁ\ 1E\ 2\10²³÷p´03w\ 6\90«(ªQPQQÿ\97ä_&\0C\8fÿÐüõt²0³\ 5\90þ}p5±¶³·ù\eó/Äÿµ£\92\89       ÀÙÜ\ 4`jam\ 2\10\92\93×\90\90\15\ 3\90\8bɪ\0ÄLlM\1c\r¬\ 1ò.\86Ö\16F\0i\v#\13['\13
+\80©\9d#Àúß\ e\0#;[c\8b\7f\95æDû\17KÀ `\0p²71²øëfândbÿ/\155ÀÞÄÑÆÂÉéï3À  `æh`ëü·\aÎv\0\v[#k\17ã\7f%ðWnj÷OBö\8ev\7f-lþêþ\82ÉÛ99;\199ZØ;\ 3þF\95\17\16ý·<\9dÍ\r\9cÿ\15ÛÉâ¯\1a`gú×ÒØÎÈå_%ý£û\vóWël`aë\ 4p6qwþW,C\13\80±\85\93½µ\81ÇßØ\7fÁì\1d-þIÃÅÉÂÖì¿2 \ 68\9a\98\198\1a[\9b89ý\85ù\8bý¯îüW\9d\80ÿ¥z\ 3{{k\8f\7f¼íþ±úÏ\1c,\9c\9dL¬Mi¡\18\18ÿÆ4rþ\eÛÌÂ\16\8aî_\93"akj\a` ÿ7¹±\8bý\7fè\M\1cÿi\10ù¿f\86âo\12\ 6Æv¶Ö\1e\0c\13S(:Y;ç¿!\ 1äÿw,ÓþÏ\91ü?@ñÿ\bÁÿ#ôþ¿\91ûß9ú_^âÿ×÷ù¿C\8bºX[Ë\1aØü\1d\80\7fß0\80¿+ÆÎÎÚÐÎÎ
\røת±ýß|\fl,¬=þÿ½þ»½\9aÉ¿%ü\7f\ 4\93p6øÛ\16\ 1[³¿ÔÐÓÒÿ\9bÐÂIÔÂÝÄXÞÂÙÈ\1c`j`ý·gÿÈUl\8dM\1c­-lMþrûO[\ 14\fôÌÿM§lnadeû/\12X\19þQ\99Ø\1aÿ÷
+þÒõOþtB\1aâ¢j\8aTÿÛzýÇLþï\188+{ØÿÍìß+\91±3þÏÿ@\ 4\ 5íÜ\ 1^4\8c\fl\0\1a&ú¿[\97\9e\9e\1eÀÁÎàó\7f\bø\ f\10Ã\7f\9de\f\9c\1d\ 1Z\7f«¦gø§ö\7fÿü×Iç¿Á\88Ø\1aÙ\19ÿkp\94\9c\rl\8dÿÎÚ\7f
+þ½\ 5\16\ e.&\12Â\0\16zFz\ 6æ\7f\8beäâèø·º\7f\96ÂßNüÇù\9fwÁÄÄÝÄ\bjuÉÎ\88+Ø2=+ù\16=ohBX«¯\87\ 1d(ľ´^¹¨À¿Ú®Û/=|\87£Bÿ£&\84¶a\8aó«ÕcñÌþó@\92òp¤\aÍ\9a¬;Õä*\1fÇ\87\88¢·\0q\93´\9d\8dê0\90\146ã\-ÚëzAz\eT\93\95^õpwBAQ·ä\ 3\1c\9dÉñçõ3\85?\91k\81?
\93=\9c¯QZ]\1cj\aB\ 3\10RmáÙ9iÒÉó\13ÙÀèðÐ`÷-Xï\ 16Un\1c$       \97+(,i\94¿C.6\9f¦J\85\93¯Öt/:\91(xÃ\1f"(¹ÊÞ\ 6ï\9aû\9e¹«2I&ö˲®\ 4ÑËs6ý±R¾À¨½Ud9-ëú6¦Õ}Å+ìbÃLÜ2­¨ÜBT`§\82H\v«¦6Cë­\86/J \15\8aä¥øåz\9dVïÁ6Oö\83ÈÔeÓ\91EJ®\97ßx\9f»\e\ eDZ\9a\19\89DðOigÏ\12sN4ãµÅ`æÑþD~r\97\ 4\9eÖ\8aê[kX\ 11m:\868ÃÅÞ\9bÈâ´q\89\9f\r7Yç3z\8añ3;Ò\95Þ¢rÈ\80\ epWª\8a\17Êýú\19Y\18ùèx¡»\r,\1f\98W[Ïgº_¬æ\1a\96Æk¹E\1a½ºÁyF¸vë\9aCp\ 3;_Ù ÎåP\1eH\92Ñ\ e"Ù{=\98&R;\eF\1f\85\bÎ\96¤j0ûðÈsl\82\9a\8dÍÏM°»\ 1D\ 58f"68¥µU\10\ 2\93Û^4Ʊìn\81êná/\9b\b\a\96\94\86Ûð\90~hX4l¸\83a:/Z<°çÔ8\97A~\80"ñ¾¼á¼è÷ð\ 3ñ&\8fñ\85 ÑG<\ 6|Ù)äò\Emuç\83X{ü¯Y2ý¼\r,\16\85ö\ 4®o\ 2hn÷$(Þ½\9d°ûé\15\15kSf \9fc\9f\8e%+ËdH/\¾xv¿f\8e\94\1e¸\13\ayT\ 6ÆÓñ-\171\87U\v\93Ê<\9aZîK\96~(í «\82¸\96-f\96\89LSûRËK\1fIa¾¦7BG\üqÉo«þ øÃT<m,\15\80^KªE\10³§ìD\9f\ 2\1d\ 1ÞR4<8ÿT\80ô©s\8dþH\b\1fO  Qj ¯'ÁÁpN½GB\99¨sý¢î¿Ed6|\9e\0Ý\17\1c©7\17ÔV;yUh+þ3\81\8dQ¦k»àfq\85Oet­vʹ\18my\0Á\0C\||Ï0dvèAË\83«\87púüj\ 4¦¥\15\19?¼aq\83θµéWÝ\84­9\v\ 1ì\a\8b8U/q§Á\1fê\ 5ü\13¢\18«\16ù°Ì\81\1fö<\ 1\1cA%\ 1&Îá\89ÝsUVELÊtkxtg¢ \15\89>k¼iÄÝK©Ny¡ï\ e;\16\8aàò\1dáÖj\8eVc,¹\89®$"û//\ 16³·³÷\1eîÆ·\18ÁE\99so\ 1¥¢|iûî_Ã\8f§\8b\9cqª$\1a|Ô$OÙYe\8dY(ÖÁ½®\ 2ÂÄ\ 2\1eÔoÞ,zkñ;|½QÀz      O\15\8f>qÐ>o\83ã\1d\b\f
+R\ 3­¨8¦ê÷       hhj´ÝäP\vwe\85]\10J
+õ|\rMßzÈ<×°µ\ 3hèÎ\86Üø9\9c\a3+ó\8dC\1eãÝW\1eYxÎ\ e¨Z*¡@:ÖjùÏ/®wý\ 1\ 4\15b;¾¼\84]1jâü\1f]#ZëñáÌacÌ\9erWàhäÙd½
+\8ei\93\94"=î7²\ 3÷ì\a\ 5móºsq\ 3Ö±b,êæ\9d\ 2\93>é XÈòý:\82 ºÚW]+\19t®Ò\v¸Î\1d\98ýç\aq\9b\97:ö¶ç×nwò Çí\8f³\12\81«XÕf?\89\ 3e!DÌ)\1f\88îäÏs#Ï×Y+ǶfbT'^Rù{N\1e}\ 5út*/að1\19±Ôël\:!9'Ñ.]\1cå¾öÅ\16/FT\v\14ßwç)h\199P3\1e~ñõ°ÛcH÷r,$æcÐ\1ex`ùSN\8b\ 2\97\8dJ\8d7}j\r­S{¨{\1a\8e\8eÊ$\17\1e\12¨d&öhæØ\93½1×÷BÌ\153\93x$¢¡`?W\v\92yt~¾ó\8a\87D\98g]¦Zndö\83Ï`Û\12¯×M¿_\ 3äØ\92\vB3ZN\8e¹ëºMl¿r~\88Á×`\1dxL¦6¼öOãr ñÞö^\94·p_\15\88Õ!\17\84½Ìc\r\87\17\1dDzê©Õ3\97/\18I*êSJò[_ðZ\ 5Ù\15"?Ûê\9e3(aÇ\96i\96Ê5\bQ\981/5¿\96\1eã¢.\85\9b\11\14ä¤ñàGGØÒWGê4jär2GÆ|ò3\vX\83¬zèÞ        b/\1eú±ýéq]CÑ?\95\k<Ô­©X¿\86üê`\v\94î\89-Cq\81\8b(oVrúL\r»gOd\ 5ïÛ´\ 2SóâíºõOrí\94\eÖà}4\89ÌÎÏ»êàzHÙ\ eÈ+ÆÀ\94¶!Çi}z\8e\aC1 r§à \84eÁ9AÏ=\92¯]\1d\ 4\ 3·/\83\1aÜnÍZ1óª¯\9eøáFï        h\128ö;ÊçOËì(\87\1d\18YÐ'\8a\9c hº6{¹\87\1dÅìÙI\96\81£\90Í\92¥¸`0n¿ÕÛæ¨âGÈ*Ã\1c\9as%=U\97ñþH4çÔé\8d   ·µ}\9f\1d»l¡-+yM\12ý¬.¶?7èXb\93¦(\v\1c\ 5=öÒ \8a\89\1cl\81@Ûäz\9d\87ôD²\a\85[\9d¡è¾\93[ñ Ã\1c\r\1d¢¤ÚÑ\1f\v4\1e\r\81\91\9bìó\vÈéT\1aCîܸ\ 2\11\88Iy\ 2j\8a-@`\88û\9djà×Hª/Öy
+ÆãZùùá­ÜMDeÚ­~¡ö\91\81V\81ÊÆÒ#\1dúJ/\90Îvp*dë\8c³úr\1dÏE²$l\82³yxùFóÂÏ\aÙ\ 6>µÊTÁõL\1cä°äÍX\95\8f¤Õ\1d¤ho\b7aÕÏ2íëTÚ\91¹âõ#\8fA\95bk\ 4³aÿp¢Æê\1c\7f²EÜ\f\97Õ¤o\86nžyg\aº|;F,Q\8aíÎ_(\10\ fï\88FAE\rõ5\95U¹ò8^Z        \ 2æ\ 6%[Îu?.ßùã\bÉÔ+óa\9f\8b\0~íÒ\8a\93Ø\1føèʱA8ó*\ 4\17ìì\94\87`-OòMlM\1c\81
\a \87á\1a«Úg×F`C\96Q-ê\19Êù\1fÂhÕb¦¹V«5U\rÙòÕÂÚÆäL²Ý¨\0\98W\ 6>ÓÍ¡º\a\88Ô\v\0\88BSD\9a\80\1c§\91\f6\ 6k©ûóxÃ+DâR'oòyqº0ýO\81\ 3\1f\1a8o\16ÇØ5DÕ÷z\83­\91È\13Í\94\13B      }cb¨y
+\8bÚÆ\ 4f\8a\98\reXIà\9aù·9v\ 4¾A·Ãúìiþ¶\95á\v\86ûÞ\ 1[Íã<çº\82,I®¢Ã-H3°\ 6\10\16\ 5ù\1eoÉ â\ 4dµ8úÉ\89é@\9b\bB v½        \88ê>>\ e\1exe=\90¨\88¬Û\v­^w\7fÃ\9a\87\acÉ'·÷é\95b=\90\82Ìü@Ûcdá\84\89Ý\ eyÌH?Îu\9e\98ìYT\1c\ e1\ f»ñ2\ f<\1e¹\9f\1fÝF÷A1$fÌm¢4»\11È#\10ÂNU\fv¿Ä\18\ 4\1c\90ô3ü¢×¿\1aüGu0¬\98Ü\93üHhíÖG÷\ 4ê\ 2C12\83FC/òúª'P×r^1èß\¼öø\95 -q§É\8d.\10á\1eZ¾çO(ñi0îo\8d\9e}ïÓ\9fg~üÀ¦\11Ì\89¿+\85\9e¶ê¢Ì\\9dç\8cóPë\ 3\ 3(0\eL\14F\ 1\92,ÒãåÀ(å¯\83\1d½%ð2®>õµ·÷Ĭ°¨FÒý\96è\ 6\8e\85=ðe\85\ fâcô\ f:åu¾ \91~ÜC$ä½&K'\r\1eb¢_ø*\ 1¿ÝÝ\97\8b\13÷Àmß\81\ 4ßÄ\9aÝ\13ç¼tµ\9a+Kx1\ 1\8b\16²\9d\84¡\e¿\80L
+×&     9ö8xËÖÂü\ e       g\8f\15\14O\ 1ö&J$;)×+\96<&ì\9fvÚÉ«\83Ik\85pL÷sb\9a\ÿôo°ÝKåÄq\91´Ô[\9f¸\e/\1e\81*\17e~ÆÊe~ÇÅ\1c\ 2@\90\9c\ 65T\15í"Ný\94@¦°\93ºÜ\15<"\7f\9e\19»³`kxã$r\0>G\94tã:@NÑ\83\9de[ 2éÌ\4ª\1aÞ-èw¸9-éS\ 2\93ÅÒ\9d\ 2$t®8Ä\a§A#),Ù\87ìRxæÎC;&~\ 65\1d\92\18ê)i6­\aäPîµË\18\82\8fà\15\r\903/PÆ\0ÇÿxÖ)\16\17Jm¢bogV\88î¸K\19ÈYô6\ fË\1dÆo:\83H;Ù¾]çõì\89ª\8d¹\83[\84©ÓI
+\9a\8a
+,ëÞ¶\ e´û\81\9cú\13
+·\¡\8d+adC©";@"wáâǾ\0Í\v«\1ac\8bX²÷U?ÑÐ\8bÞC\91\ 4A¿·\r\89\ 4ñB\8clÆ@v\ 56¯/\1cØ5-11õO[ÙB
+Söe\ 1\97\0Z(/h4ºÊK:X$ü/¶aé\ 3\98@X(õÎÙ>¢õ1Qw\1dZFäZS\8d%Q\16\85È\1c2Z\91\9fþwi\8fõTq\ 3Øä\1e\1e¯'gÎ1+\1eô Ìa\18l¤ô\ 1ðd\9d@®]\8f\82¸Éý?\8b\11Ê\vÙ\9a\ 6\15\8aAS°=\1f\1er<F\7fÆ}_ÿöäD·Ê¾Ñç~\ e\8b4dú\9dÜ\8d\83Î:¶nº\1f\1f8¶&¶é\11\8e\a%\85ñdƬOÍ\ 1ê7Óö\96\9e\87CËEJ«¸%í\17î&ÐS \92\9e²®\18Ò\14\8c'o¶\80i\8b¿b\18/I{NjW£\86\80\ 1ÿÃ\80pM\ 1ÁTU¶¸6£'yíxôç;¦\90\1f\97±±73/ìE\18\ 1µo;æ}^¹'`G÷\87ç\bg^´&ð¤\1aê\90\10±"!JF\ fëT¥+ß\8aþi\ 2Ö]ª¨éÐ1g\8c\vNÊ»ù/â\14nAkVÊ^=\ 2df\16÷ö6I\bÅÁá\8c¸ÉF\ fj\ 6ÈÐëOÑ.ßÅ.úÅÎ\9f\1a\e8\81 òÃ@ _ɸLAb\f\9b\ 2ß\92=\ 3\1fôô\8b\r½\ 3Íâ\19ÐÓ»Ø\8aÂ[]«c\95R»t\1eä7¾\92å°\9bßlª¯Z<OÓ\1froé\8aéÃeÐß\8eÏ\9a\19ŵDÕìç¾Âi!9[|.®UX¬a\8f­ôYVz§c\v\9fÁÝ\8e\17h\ 2ç~и\88«FX\18-¾ßB\9d\ 5\18@\10ïþd\a(\86õ]M+#«\aÎéVùEU8È<y \b\7f       #\85Ä\9cW\v\1cÉ£\1cò¾\ 4\b̳¶q\92ûü(Ü>¢,f#\9d\ 2û%;\87EÜý¡IÝ$s¬¹-«\9d»Í¤\11   ÑL3p«ÂÖÂ])\86rEWFÌ\157vF\85j\10è &ð¸Ù^\14õÇ.÷"à#åâ\8d\7f¥ýÙg§T:\8fç½Î/\ 3y\94Ça E\9tAXƼ\1f¹ÚÿÏÂã\9fB\98\13À»x0ºÍ\99!ЩUH¡\ 2¹{íô¢xë|\90õì\93¦¼h\b3\v\17à*Bý   \9a\7f\9e¿\85\13ÔïT¢\9b¸_Ûé¨üÅIJ\87T$æ.í\ 1ÁÃoeãÜk¬5M]ëHós\113T,±Iv\86_U\ 4\9d\ e§æùEW\vɸ²ýë}\eOÜç\84OÁ    Ã\r\ 5
+I[¢äÇ;9÷'\89\a\ 5\1d7Ùýq½\eTCz\ fçÑJwÕ\99±´\ e\vß\8fÅ}JðC×Ø\ 2@\92\96ró­3\8f\94\8dÈ5KßÔ\10Þë~\9e\97rĽ\13(\10\93ß\1aâfÑ\fâ~P\8bkX_ÒîÑ\89Í\r¿LK\7fþ½\9fzY,\98        m>\85\e½yòj¼\9b&d¹Æfl\9dæ\88õ\9aZ\7f\f\r\8as¥îGØó×Fo\9fæ&¢vI°\ 4õ\ 5\18\962\93\14\9a\ e    #î"I\7f\8c)¤M\14µ2$ÕO£¥\f\b¬o\91ÝWÚ/¨ñwÖ[ãA\8e\f·Qñ¥àP³×\14¢×$\91ª\1f\rW\88\98+\9b\8cP\a¯v?-äp\1cÒ?æ\ 5Ë÷Ç9\b\ eX^iB¨\8d\10\ 1-`©4<GÈ h|]Ǻ8\11Sw\e<DV\96{öK"\99¿Õ¥ØÅY;OJ¬fÍ\14\86^\e\8a+ B\86ÜÁ¿\ 4ÿü\19-\93\ e\7fï\aÝ\8aH÷ÞØ©ÐÁ5]L_\9dG\fsèÆdw\ fÈ\18¬öqü\ eN>X&5=\0yóõó\94¤x\ e¡\94-°-\94Xô)ÂçíÍó\rm`\97«\9a2² ¨ÙW%{Òô úp¼\89\86\13ÄqÜ\ 3\e\eK\9c,P®Àö\a\ 1·m\82óÆ\9du%%\15\93|M\8e¯+\17êæÖê¬h\8dÔ\11Ò8â}çü\8dJ\9b|¹4åm     \ 4       \95ÆÝÞ\8c\96PÀ [ÖãPatÞ.i-ý\fÂ!sñ\1dç\87µ\8f\7f¸"A3
+$¨ÌrÉ{\1aC\ 6\85\9að\e\9fúYÉb-y\9aÔ\ 2\9a\82嫺2v©\98ù\a\10»ÔÀb\9dQi\9d2Õö\81Ý\93@\ 6H4\90\95óf\f8Ìá\174\\15\10>lôb»      :>ç-â\9e#)\98\8a¤(\19.=exÍù}\88@\15ö\1fZ\1cö~)\v]s<ùE\13/½½\18/\ e \b$9w_©1\9bÑ\8d¯´\90±\82 áh¿G~è7gí\90\84Ä>CfýJkäÐõa5+ñ\v£\86ß¡\91\80â8/âÔð\17\vbØ­\ 6pZ\1d;ÛrªywPë\ 4\9d9ye;Â×\9fý«\9euíÏ\89\1ct`Km¶"$gz\1aÒ\14»\11a\958\98Üë\93[\f\1cÄPîQW\11Ü`\9f,ÖÁ@\12\a\8dÕÚR\19HqxÑÒ!¹\90l¯±\ 6\15ØÓà}\ 2>u\81\9f\ 1\1fc¡òÌö\ 3O\95\13ì\16#\\ 34óû⿽¤ô\95Qݼ\85\12^?åøCDFb\85åqÇ¡n\9a|\8c~w¯\10\80ÊYìõ\86Hɬ;¿¾ühô.d\8a\1d\7f\ 1J½!°4\9c\87%üÂ\ 3\8fç\96ªR\98¡\9bß\1döª~X.e³éiëRd½\ 4^IÑE\1c\94\12¨?\10\97ÚZ;ìFï\ 5ÅS\94\84"\1eèHÍ\ fÎ×âÝSÓ}ï\7f}OÁëçi§ÿ=/'~~\94\14(ûÒ¤\bù\f²\9e»Äû£\11\g\v\Æx\98ý\81¶öê\9a\82yW@åÛS\96tÒz
+\v\15ä\8c²5ò\88\ 2\10*\93Ó=uôYì\11D\9aë\93<¹Þµb)\ 3\9c\1eØ\84p\80âpp³emÿ|s¨Z~K bÒ\94ýù¾Êï{°\ 3\93$\17¬¼ÿÈ\8a5­X½\0çM\82]®,¾´u\88\13\16\1d\10PºÐ_®\8a\1coïyy\b®ÆÃÍ<¸§BÆ\9dHHÙ\ 4\8døåW¾Ïß\80¡ð\1d?e©ÜA9 [YÂ\7f4r.B\18¬Ã\80àrÍû\ 1\1e Á\94+6ù<Yå\86ÔAÎ{\f¾>\90ÄdY\ 4ây.Ájõèyq5±<««\8cÿ\0`\94£¹¢j9pÖÉöûóÜ\ 4D\95_\8b\15\a\8c¯{>\1d ý\r°ðÅ6ëîf%Ï\94Pj¤-J?\8fñãQ>Ï\87\83¾:\12K\93¹Tã2\ f_z|õ¸\ 1­    \18¹W\15\83ahx\94,>ÌT&p\9e#´S\8d*+<ò­\17¡Öî¹\8c\ 1Ë\9e\ 6õ¡ùf«³xûL\1fwt\85¬\18͵u;ÞýL·ð%x®â¾{gOC¥òÍó\96f\9e#\9d\9a\8e²\87\11PtP\90\9cÎÏ¡Ê¡%7úHälq\b\1c]bî\8aÒ\ 5Ï`¤¯\9dñp\1d\84Üè\ 1±\1a\ 4û3í\8e¡Þ.\v!ÜC
+ß.O\ eµ\bÎYÌ\ eú\ 3\17Ú 4næwJÞ\8fü/B\93üo«Ú;\ 5\1c\v±\8e¢\85\83~ªWü\948,+Å¥o:|ò-ä\83F\12b­À\8c\80Ä\8d\80i¢·¶\9e4ÍQý\85\1e_É&)V¨'\9fÀ\ 5k\98\9bo\8fv^\9a\16ɤ\9d\13C-`\1e\14NTç\ f©õmF==\1eY7®\18Cl:\1e=\1fyÚ377dVàâï¶\1a»nAöD,\89ºM2´       QèM\96\85Æ\92;\86µ¢¶\8aðë#lm/©*¬äFÛÊRP6õ&gV\0akÚ\ráåªõ1\1d\89æ4Öë¶ò\80\93?Z\9a\v\82li4\ 2\9d\8c³{\8b_°¢\19\95\ 4þ\9c¾\19\v\9cî\16g·t\83dóvù\8f_k\10eL\ 2G\e\19\81\86ñ\98ã\ 3ñ¾\16Y\b·@ÄN£\1e³8\88ÍSó\ 5öJ\10þW¿"/ÄBU°]Pj¶ÑH\9f\15(\19»:´#(\81d¾Ð6³Ë«Z\8d\16±Ãb^%\93\80Ð)Ü\ 5
+  \82\f¦oVc\98uË2+5k\9fheJm\9cd\awåÒí¬ålU/7øca\97¾ù\0³¨þJ`\95BD¾\13sL\ 3\ 5g\ 5\9f¢lm¶TÙqê\f¦\ el¥f\ 6ã\ 5\10\83ð\1ed\8e\83ç6)?<\v\83þ8\ 2\ e\18à\ 3SüÓ«8êg©Ù\ 4\9bzMûßä\99}c%U\19¿n@\bqo\97Îi燐ܵ\197ÃT=4h \80ØçF;ê\e¤\ e9ïûº   2¸p¶á)±\vo\7f\v¢\1dÿ\ 6\ 1íÙi¦q®y¥\14ç\1e \9a\ 3\9d¯õE\ 3³\13÷\aUO âßîä¸/\9c\vr\fwq3\a>\ 6¨iÉM¶\93Ë\9eLEë\8bq\13å´Ù#Ì\8f6=g!\r\ 1i%M\9d&BZP\83\1c<@F;c!)ò¨\8abnRâ»÷\14b\9bÂx#ðH N\91µ§â\90ÂHT\9b\93éF\90\14^mÓºãQYp¬¬\9c¯\13hê3ï(\b(«MOêÆ\8d¼«Ì`\v\1cï\ 4\8c9ðCÁ\16YWè-Ä'\10Å\90rW(@½Cø¡t¿G\9eæÖ\ e\1c\98Kßå>\e|ê/ \15¾ÈæMr\8býJ{\b\bþ5\86÷\8e?\15xä}\93ZèWÏfåì\87é\8dÅ\89î\9f\14ùl÷«Ü\9f*\8ap-Ia­¬`G\ e\ 3       Ä¯Àà¡©\86ÿL¯\1a\aïØ>\11\ 1C\0ÍÆ-`a\ 5¦îæÓá\82H/\8eùFjÉ¿hÐÁÙ55¤ÓÚðÀ£Q®º@Mê%\91ÙçÊw¢ð\19û£+;úã<\17\81\91=B\91\ 1×\15
+?E\10N\7f%tl\1c2çU\7f\80VñAÞÁ\8a¼iQ\1e\95Û0õ\91H\14¯×Lõô7£µZ\aÊþ\a¿<\89\ fÉâ\87\93g\9c\99¶¹üµ\96c)W\10$àÜ:ùlë\13nĸ~\9d¡aAXOõ[\98f'9n`öé\16\8c\8ek/ú§ë­?J\8b½^ý¯nØÆt\9bÞJ\85\19\99\12=J\87ì\1dû£i2\9eê\84Ód¶Á\87\8e3Iù©\8anª3u\9e\88\15¨¢~]ù\b¹\84\ fþ>\1cò]87°Ízfd=»ãèi\ 4yÜx\ 5\81\8c_\aý\97\a5\97ÙPIõº\vjXHÁ]mi\ 4¨Å3{\ 2Í\9d\12áS\91¦\9e\81ã5]\94¥ä\1c\8fcG\a\96\7f\92° !¹×       Á\r@éMÖt^\ 2Ì{F$\1dÝÌ~1Ï®kG¢¢AÒP\ 6ÂÙTÅ(3$\80\99È6\1d\18f¿E8°z»ä\1e>1²*¥r]+4j-\9bÿ@\f\8ajtrd\88&Ö»½òÛõÇõÏ\8c/\89\93\b©X¡>\16\80¤ê÷\80±I\10O(\12åRçcc\92ÐÒæ\90©Õ¹\9fy\1c=U\82V*U\97cÆÅ9×ÆÜÀ³w¬\16i\8eF\16_;Q\81¸\96ìÀò»§1G\17ÀÛZD¹\13\84kâo¨É®\r\96Q\1aì\ eÃ.4³£\93\87¬\8b[\99\96|eåcþ\82\92\9d\86ù\86z\88\98\17`\15ËIL\ 6û2û"þ¼»ß¡\ 3\93w¶.¬ÃþaK\8a\1f\93\bCUöº=Ñ^:óÆÚ££\9b¦ \96\b~XáBk\96ç\98³\8buHð    &\e¡\98á®÷\84        ÷\14±9n\18Ð\90 ÉÖû\82\16\1cvU1õ\vxI7~ë\87\93m\80q~áüã\eÝì\13²u\0wrn`©\9a=Æ       *Ä\8f\ 1\ 4%u¿;\8c\13ºíf±\fy:¹:¹\aþìr,]E\ f\v\97i\8eõ~\ f#\88`"¶IüÔ\94ÑË#'Ë8\83\16r@\8cæe      \e\1fk)\99­c5¢ØC[äÅ]\12÷\e\1f\1e¢í\10 h*\823Û^^´üíÑ\81Á¸\ 10ºE²'r\1cûH¼¯\8e"S\91I\9e;³Óßh\1dîÉæ±R\ 5ve²F|\1eR:õUw\93D¬³\1cÆ@¾Èó·¡\b\9cØëT?ÆË\ 3\93\aÜN¼\8cµ\13\84ÈÆ\85\91¦rt]®À¸}D`/æ\91=ØwÿXt7Á¤Î\v©\91$ªYĬÑʶ\80L\9eSE\ 2ò9\95ÅÃí¡ï\8fiÞB\14åô\8c¬g@²\ f]\ 5\1f(A(\1e\81\ 2ôP9\r\8aÚ\ f¬'\13[½c³JA\ 4\7f©\7fúè\83W\11i\87\96]ä¸ñ\92É\99\fmïûÞ\8b\ 2\8f\8f·Íækï¥}û$§\86d{\13»Í!\15d¶zû*\17å&\ 4\9fp\83ê\95öÅlÍùy£èxý¢ÿD\84C\ 6¹Ý\80ä\86]x\94c7\13\84\8b\vÇl\98ó^¬T\98eC«[K\ eëÒû3\fû¸\a\84­:aáð\92¾\ 4\85o\93\vÊô\9bLÌÎÐàøØ[!Üð@×"\93\10\8a\99\9dK\18Ô¬¼×³~\7f£2ü\rË5\90DÚ¯\ f\14\93¹î)sErdç\19~Þ:Y\91\1e|²j\87?ëL©ié!w\1d\13\f\89ï9øÒ\96\1cº-\11\ 2\®ÿä¹Çö;\ 3/R0ÖVØ÷E\8dQ÷7åýD"ÿ\a\8bäæÎ]\1aa\986\93Ʊ>2\9e¼K\8e\13×\1f£yMsæxoqQ>6 Û\82Õ\11CÝSР\96P\8c}vµ\b²ñáìÄ\9eh¸ñg|\ 6\8dÆ?kÊF0Ù\96ä¯âûØ\11S¿\94+p»Å\9d\ 3À
+¹Ã\8bpÆá­ýBB¸ÃÔËJ·\13¦0\b¼\99Õ\1dã;«\9f^v}ç5i;Õ[\ e\85"ALyáZS¹÷%·²@â?æÛÄ\13\11\r\10d(CA[\80/%\12h\e\87\b\90L\13¥Pwn!ÁÒÊÿ\8cθ°\88rþ¾#Ú\ fì\12­:drù©1\1cy4ÈÏ6ê(k\ 3¥VÏ\8f'Ô÷Ãa\8f\88Ï˽Õ\86\9e\8bzR\9a§\83\17q\8f²+Døª\89\12S\86\92\86b~\ eð&è«\·|ÀY|·\82\ 47&\9b9Å|\85Ýv \eÃõ\9985[6\8d\9dÆ|ú\90\rg\1e÷­Qé\83/·Ü\ eËØC\8fÒ\98;=½\90í)³N°\8fG|Z¢wÛ½)áz76DÞÿ\8a\13\98\vO¯#˹:Á¿¹G¸Jpgºñä<¢²p\a¸&\ 6æ\14\ 6vw\f?\94\83\ eü!få\1f7Brü\190T©åZÉ\9c\95ü³¾>ÁxÑß\ f\93&\1c\ 6<ü} \89\8d^s\85\12f\99b³ô>¯Ä\82»ö`\86ðÒÁï2¢EK¦g\96ÞAX´¤\10çHÁ\ 2c*Ó=ãòá^¤S¹¼þ~;óÇ.\9e\17-2\ 4\rrF\fµøbÝ\82ù\rg×)Ãu\17\eÉ·k\92¯¯Ù(\1cÌ8q \b\88\1a0:#£¢#Y\98\9a¥Na$^!ÙãA,¾p\1c5\81\9d½Þè\ 4ÀTêÈ\9aéfoÁo\18º\81\13à"\12>\8d\83\8f\ e]áÖöyD¦\ýgWï éx\84\97\e\99â\15ÿiGw½\13yA~"¤P$\15]uîñ\ f¥cz\91­¬á\8baù.\81AGG\9dºÜ°qü|ò.·tF,ó      ¹ëþ¯mý0\vv\8d¹\bÑ»£\97xz¬mÊUÔ'v\11¾\8fI7\82\16\9cU<ñSÃ\9cð\87=*°´\96\ 1²Ñ?\ e*[³Áövrð·÷â£ó\ e$^$×µT!ke¬¬    \18Oß)¢¦ñÖ\7f\94~\85<\ f\89©\17\99\82æÑ p\86â\ 4\8bÝig<\ f iî\99ÏO\rÇÁ¬¿Kð \87é³Ðú\19§\8d\ eÈM\v¾\8d*OA¹Lüö\f\r{\82¯\88*\16\7fg©Ð¸j½NÑá§þT×\1fíäN\ 2#\1eZö.8§\92\9aÈAìØ«\19e\8fÍX\92ÈüE"\93ÑÇ\16Lðë\91\13H4]#)y_i   Ú§µ\e\9eýp¤½\8ed\93\0\93B\ 3Í\8c¿öùA×Hü±M$\94ÊÒvë\ 2MìvmA:VHö\aôÚ³(ò©\9fKêLOÕÉÖ ]\v\86\85ÍßÝOt(\9cR6\96\94rÄ>§ºw\aC]gÛ+p­\83
+9Y\8b\13J_\1c\97Hoâ    \81\1aQÅæ\96.ûGq¢¾\18Ï6QÅ1±ò1Ó/\9c£¢\97¶`b\89ó\9f
\fX\90\94\1d\99\11\b<\8f¦¶§ÕàïôÍUÝꮵ¼j\91]\89\\14S'£V\80´«vuCoa# H|&\81\9f\9dÎéÆ°ºP.Õì\16ç\91        
+\a(ÆUëp-º\13°0\e\ 6dÒ©\e¹ù\1d"ï·j±õÈ<òkùÏÑ1\8eû}o\8b¦re     \fuz;:0UÀI\18³ë<Ð[\ 4²#ª\1daóOñ£\19]X\83pD\ 3)\15U?»ø(i\v.V\8ck¹6÷Îëæ§`ôÀ\9eÃz\15i×|\9cäQ\94\11àÔGFËgØV\1eõ\1e¡Êöù^Ô±a8\95\8dw?O0áSiá\13\85VèÁª\ es\9eF±Ü\vàªa.ëD¦NæÖ\19*Ï[÷ë\fÓâ#\f\85úX\83Õû|Î\9bæ(m.]\1d\10     b\10\9esu=Ý\97ÿä\fA\9b\89Û°ªu\86\8dÞ§\0W\87
+\eâ\9f`   A´\1as\7fö\88°CìµËaKHÍcè\9c(\12\95ú6ð,Ø\0ïÈ\97Î\1d\9d\98\81Ò!\ 2.Ty\8a\9f\88\9aí\1f\9b\bÃÞ\86t[j~ÑG¼\e\17\91Ùêh1[º÷$\90¥oûaþ|\95 ë\9eI$Ð\13\9e7YHFºÿT\11¢ÇqËWO¸ß\84\16£8tÎD¸äM´\97]/\18aC\7f~\9cÝo\fö\eÎðá\1dí\87n&\8eYÕT³·1¬\ fÚÍ?\ 5¹\voçÒ£ÇÒ#Gþ\81åaú$µ`.\euMa£ùù9þj\8d·@ÿ°\93\14¦\vM)}\80w\95\8cÓ³øn¡¼á\12E\1cé\f\v9\91}\14­\1ck\86b)ê%\805Ê  \80\ 4°Câ n\89£ujó_JñÀ\ 1ݨB©sn½%ð\rÒøËuæqAæò\10;n
+"\v\1fUS\ eîóP-\e\82\16\1dvö¨\8bé°fÜxùÂ1<ªîí`¾µ)é·\ 6úÚ\ e/¿$\ 1®§¡çvÉ{$A\0ÚB\12ª8\1d^h\15ì\83õ¤+òÅ[«\17è»øÓ\eÊRä!\19ZZØ6K¹fÎnt\16Y\89Ï¥\18\92@\9fË÷v\1dï\82 \aD¸³»\92»ûrÌ\1dßú*\1dB°Óþí\11­A\8ev¹cÚY\15o\12'\ 4\ e\fÊ2Y`uáÑ:Ócò\82fT@ù\1eù$¨O9ÊÛZ¯\89s\9f$\97ËSp5´C®Ý@\1aͨ\9bÊ\86mô[Þ\81³        rËË9(É.\8eãä\10\\9eÅôU\83(+5\ 5L.ÏêDnÑ\ 3J\v\88Ö)¸Lkd\ 3`%ðG±L\8d\85\ 4\8cò\a\r9hÏ÷\88ÈËÝ2\8a9\ 6\ 6\8aÊöÈ\96\94=\18¼\12ôÀÈ\8dØ?ÂM@\90ÒP\vxµy¦nÝce¸\1f ÌK\1cT!'E\99Ï4äDûÛ\83ùÅ\9fÝC\b²\95\ 3?úô\96ïä+éá¡îO&¥­\8bóz`+² kÞ\ 6T\9b¯5N\8c-÷ö¶\ 3öÜ\95ZD\97\8b\11\86Q.\80¸\11¼\8c,(½áº¯!GP].ÈFÄJ\r\1f Gtè¿·6û¤s©     qxMìTþp´\813R¡PÁ\ 3ûwNåÔ!\ e
+_âVÒ0*¡\90Ó\8aÙ;ÅÒÝ\116\ e\15g-\ 6¹ëS\1f°;\9a\ e\9c xb\93Þl$= 5%°\ 1÷öÐ\8a\99\8a\9dh\8b)=gX¸\8f~ì»\ f$\83\80L\80\ 4Üå2î#w\88¤%á\eèï_~Å£\9a}.Ö·Y0\11ÎD%DVà\b\7f'\86Ý=\98*\ 1SB\8eÔ!\17iR\ 3*\ eéo»\80«<<*»C\1a¤«ða\1c¼lK\9dfLEö\12§T{Zvc\8d\7fZi7wh@g\9bßÁªfô\14N\ 5ßÒ»æ¸,aÞZ\9aÁÌèÉ\ 3ÈZ\9bY3"±·ÂÁ\1c\9cz\18\9e½k-ÿ°f\ 5 ìv.ø\e,\84pXä\12ª·\1eÁ-(\v\1fi'(ÊJ\14\19Ó6j¹*\ 6ÎCÚ\84\16¸§R­\r\91àÌ%Ôì·¿ãë7Cs\1fË\17÷~[1O÷\81øÐÙÕ³|È4.T¢ÄͼèD\17ü8g%D°\94#Sï\85Yܨ0Ô\95Ò¦¢z\rv\8bç\16Ú&Ùþ=JEr(´3êÑ@¨@mu+=µ<4\9aÛ^lb©a\13ɼ§ß\90\ 2\{Â\1d\89\8bà¾1 ÜUu-ÐC´]\9f¢­uVÿ\0ãk¾ï¿\9f\8b ÑÆ\15\85\8e\14.P+\83}->ò!\97ïi_¿Nè©éøn\97\18&dËz\1d·\8eè\95ÈJu\ 2\fST»:ª_\81\17Æ´%Þ·Q=#\85Úr¯\9eø\89nHeÉ\9aä\913¤kE\88\1aÀ,Í,I\95Îüêm{hB8\ fó@ú³j\8cºTJ§¦\14\86=«Ì#\8a»>è\808\17¢ØÔsS3gGÊ­#ÂO¾´\84:\92OE5ªÂ Ä:\8f:\ 4¸à\94QF×\ e\1e)y·§Òì\14Ñ\9c\7f\8e_n/û \85FWþO\ 5ó«Më\rC¿"Tàå\93]Û¾\ 3\aÍÌa\86ÿ[Ô^\17²\1d*\98\8fÜ\83Y àDÜ\12,-\ 5Ö®iJ_Ùs\11í\81ZÊI&N[\13\12¼Ô>æ\88%C0Qo'x'\93T\88RüþKH\1aÈ\rçÁ\ 576¤=­ôV\8dþ\93\¤:\8b\82åÈ\16£4(
+e\9e{ÅqVUa¡<MFÝé%]\7fÓÚ¡\9eè\82\8bwc\eçy\9b/\9a`u\ 2t7¬Kéåká\9e\95©\r¤\948`ïôA\95Ü.9(º¼JZi\rvZSN¿²R\17߯Ì'¬¶\97\1czÔÁ\99Î?*î\0\88é»;£ÿ¬Ê\84ÖF×E*sK4\18Oq;¾ÿfQ\9d0\a/åêE³\91üd\92¦<\97\1aîtÛB,\f\83\81d\80×\ fv\16ÜB\96\12£\80q>²ðrlº\90Ý\96â\_d¡SÙ6e\98\0bÖRçÅ®ÿ\9b\8cDèO\95×د\91Ö©gÈ
+²ÜiÇÝ\v\8f_
+V\81°®ì\ 5¥¢ö¢´\85P&\9dÊ\9dÓ\9bâw0!_Mda\11ïl\82ú§=s<+=éµL!¶sY\99\r\fû>\bDþEm9\92cÊ]t®©\89¢\14¬\e\15ù¬lz|\86¯ë8q¹Ü1Q\1a¼¶ i§\1f\ 1>H;8w\97EÞ$\93^\1d#Z\ fÇ>\9c-L\86\16ì\8f\16\1cä<\85^\18¬\9cµÀ\81×Ðr<\vzbL\887\1cC\ 4q2ä\81o)Â~!Nô\8cË\ 5Òî4\e\90ô\1a»·9ÃäV[Á¢á\9f§-f¡#*\ 4dj\94\9e@£%'\1e\9aé\0£ß'zp+µ\ 6'$ôËIWý\87×\ 5?SëE?6µÞ\9eG¦¸Ûq\ fóóµQJ\¯ùoþ|&Y\19¼wmm¶¹\84ÃÌC\93Åg\8fôÚñÍU\91ú\ 5¼C¥ñlä4mùº¤*Æ\90\ 4¶Ðµåí³åܧTÙ\7f-Õ%\99få¦B\ eÎL\9b\91\90=oíD7Q¿P¿©B¾ÿÀV\v\18+/B©>»¯6 \9c¦J]Ï\8aîì\99\15\1d\ 2\83\1f\13è\ 1)\13Ë\0½!±\9eù\96·\97\ 5ñ'X\1eÀ&Ö\ e\98\10'QÉ×\19V!\1e>§kÆÿr©ª\1aã\a¶þ\82\1cvT\9e±LNi\8a|½élv\89Ð\16\135\8b\ 2\95ï
+Pf/\1c°£\8e\1f\ f\ 6ªÏk\9d\81v\87\82\88õUeó¶zA%\86|\96ÇSÅû|Ñ\17\1d\1f\1asc\83.\1cõÐjé;åé2^Ì'\84æ¾)«ú´ß\12n4è\88=Ø&à<K#I    à ÊêuøS\8däñ\18¸áü\88\1a        \19½ÐCZ®cæ\8a>v%]T\178²gs%\9fe\82\16\88ª¹»¨\9bP\9a\97\8bõ9Õç\rçn\9a\9e\18\f\8aÆ;o\9cp'ãÍc$EÒ7\81\18ÝÕÖ{\17\ 3@üÀÿ2#­ö9"\ 6²>\8aâ»Å\1eû\8f\1fÚÞ¿§jöOcTâ× är|á\16d\10}q\92éT\eñ\f\14ÍV¿{\13\15bwÒ\9e\ eØ\8b=ÎËp@        \98\1am\93\9fÍ¢÷`'T\93\86+Â>a\80Áoz\r\19³\13$?«°4;NÞ0@7\bÉ)\11ëNN\97\10nMkù\ 4 \eÿÔýÞ¬còiE_|m©\86\ 3Ù\86ØóÁ\b\ 6\8a\91=\b9Ùr\8b\87ª\ 3b\95û½Ûí±Øâjd\ 1\93Ë\0>\14¸³ZØ^³¦AiÇj\0s;Äà\8bÔË{}a\84K\85OªÙ!ç`Ì,!¦hù^%ê\88\83l&rµ\99\9e¢P\9b8\9awÎÌÒ\13Ø\86\reV1\ 1| Du4hÇý\80V¦ÐÌ\15\8b²\9b$\16´\ fO(k½°[S~\ 4ç£s'\94ÿr±§«7\96-òà9^LW©Äv:JéM¾[\19\95Ø^RW\²j\97GHp"\ f@F4º'\15¹\97\89\9f\7f7\1f\14\0\16j\1eùÞè\88J¹mñè\ 5gc\"p=ñÎÞSÊOê®"qi®ãz¨eǵ²8Çh\93\99K1§³EÈ\ 2\19«ºí\85¬OlQ\82\18\93\9aÁ`\92@\15N/\19¶;¿\ eUí/\96Ã\11Wt\11Þ\8bó\8f¬ôG³ï_j«]\ 3\ 6<ºt¬#l¨ûࢹ}\82\9fBÓº\10°u\9c"¦`Lÿê´cEmbT\8d\85+q\f\7f®Aª\95Ç^µl\8a\94BY\ 6Ëh\1f´     "O<?Ýkw,yú¸þs0yÀ|.ì®í}"¤ëïs²;µa'ÌïUòÈ4_\9dz\8d\12;fl\19Í=\12\14Ü\ 3|WuvÚB!h6Ü<mÅ\8eº÷,\\93¶<\86\10÷\ 4¤>ò(w\afB\ 1\ 3%Ñ6±Ø#\e\r\11\97×|¬E\8b\1aS¹°
\ 5     ¬ª9 \8aßÿ*\9cw\84é\19jüµàâ¾c`È`·=ù\95Ïøë\89ÜTÉFÎ×\8d°»×*Ì3É(J³æOG%Ã\ 42h3HySK:ÝÛ\9f
+ã»ß§\1en\7f\886C"Äìê­mnb/\81\9d\90\86\ 6å}Ó\15êÙê\a¥\a\120*Ì%\13\e0|0\1a/w\ 3\ 4#ÌÈ\9d½\81høAï\v^Kæ\90±\8bK\8c\8cÇ_ 5\vVí²51&~\8d¹{\9a$êª\8eçZC\vź¿\18ûT\92¦\14¡\1cÃO¼Ï\b\9cv\85æ\83kãÏ×4{Ŭ\1c7Qó&ÁVµ­í¡÷&Ó\16Îõúø{\e³É¯#/BñC"Ã>\16\v6ü±®\84\93¡\86¡¢\9b_\1dÏ'\19ß[jÈ}§OØW\9fñí7E\99D\8f®/ÙÈÀ2mÒ=è&¹\86q(-óp©\81\116%\14ØyÂ>A²¤Pf3á\90\9f_b\9dLÈÝ¢Ý\ 2\90\97\9eA\9cí}KD£c\8eÄ\9df\8d÷è\Òtî^ÅFp{\17¾
+I<)>Ìk\8bn\98(mäÂx[Ôé\91\19£\8e÷\8f1u\viñæ¸l$ºØ\90SÂg\8b\844¬)\9fEP$Z\80\82\7fªQla\81TKM\87{\ fí1\8a\0\8e\92x\81Ø8Îü7\87\*\8c\e\r¢\7fiÈh\ 4ܪå\r\82¬]J~c3K\1dw%NHX!§ë÷Bǽ\14b\8aK%bq\8d¿\13F\ 1\9b\17î\vÞl+ðÈ;GE\19\13\ 6ÞÛO\8dO=\\94Å´ß<\a±\8d\98Ä\93\u\98?Ù¿Íg|?\0-¤q\ 2s&A-ÁÙ\9d\17é\10¿­\9b\13µÂ9\9dD\8f[8(\84ºDïwI+Q \bý¾zq%×`á\15BLÕ!ÍK\14ÁË6?óYhå¼\85¿4\a\15K\rnévÌ\92r6\13\9f\9eÇ\1dH`ý½Àe|¸üæ?_¤%äù\9eöº0µ9a û\9e^{m\92hE°\8fQKDu\12t!\1eì\12\90@ÞZ¢cðî\10³Á\ 1Qó`¸ ]ãx\84\12ô\87=³Eõ\98\82oZ/B¶«.°\94jé¡Î±c´8mÉh\143\14\19´ËIê\84\aÁt}\19\1dëc\ 1*+±g\b\18"`hÉHÊV \81Âæ3r/½°30Ìk"ñI\12\18Z_ \93­Ñƶ\82
+ð¸\99\e\ fË£µµÅ\ 1\ 1Û^\9a4\11\15]Êæn\80|DöboQ»\124\2úÄ\928´¾'óP\1c÷ê\fyfR}\ 3\rYfÊ
+ò'k\12\84´è¹\ 4\86\97\0zíj`w\1c\85CïÍPþÆ#¢~1^Ûm<®D\ e¡¼QeÐ4ñÆçç"-U\8cÿ÷c\1fÊàzÏÔ~bz»¸\7f\18z>æúSãíj\83¹¿\97Sújfèa~\9e'ÿ:¡CW#Këo\99¢ûÇ\Jÿn\17è\ f&ÕÏ?\18
\8dD\\9d\9f#Øo\82ª3Ó5ÊqªÄõµ\ 2b\96á^\ 3É\9b¿ç°\ 4\92\0Ü\1a\1dU\ fì\96Í[5µãMuÄ\96X\9cÊ\8f¼~«uk¤3"±Õ¤í6{¨]\9c\vEÇ.¸>m~ n\9c\92O\89;¾#Æ\ 4\89IH¡.Ò\9fW[\1aê\ 6u±ÏQ\µ\85D\9f-.WyÛï/5ãHþU\ f¹¢<Ñ~¶\8cDnâÑKGæÛêÄð·\93ow¬ÊjðG\93«ÐwÇ\a\19\9f¸ \86
+\1a\82´\8b\14\93\8eª%\v\8c¢\942Ðjªt\10#\8a\1e\84T£&t\ 6\18Å\fçl\91pÉïq
+¹>:\81ª\f\9dgíÙ\94ñ$º\1e+\ 6\fÓ©\92\ 2÷¬õv\19æ\8dÓy²&Òì×ô>¿c\82´Ìa¥O\89ÑdzÖáíËñø!Õ\9a{%V\92\83\13\8a\1d0·ö#S\97Uà˯\0Á\1c\9e\95eË3­åøðAk³Nf\ 3xcñt\98IEEÈ\ f\95\8a\81-X;´¡§\b\93W\95Ó©\1fè~\9c\9f±¤7à¬Ï§e×kEÙaZ~\13\16rp»¨z¶(*\85Ò»¨ä\9a\f\1a\8aÍ`¥w\9b2¶ó\95\8aù\99b\84dÀÞ¿\1c
\12À?\1a]\1fèa\1c\10`\a\9aû«\13ªtü;ÚѦºÏ·<ª\8dYf\12¼ùà¾c\8e£ï\ fy\99\ec®vßé;OÓÖͳO.D\a¢ìÑÙîÑ\9cJ\89ù\95\9bËü\94)\92ÓÕÎw\9cõ\87¼\90tç/ýª\10À\1dP\8cÙ;\7f\89u/Ul×;ABç\142;\10Uº-à\fÜ\1c\b\19þ {[\ ei\1el\13*íÌ­ü¹\8c\9e\95è;¿M£?`öôVzÜn/PÌDAA\1a\8b  Û\10©\ 3\ 5\ 5¬½p=âI\11$%Åy®I\18ÁTm\fµ£\13ÏÑ2\0Uw«x"k4\9af²o#­\85,VrÀO?zÌý\14É\86\1fÒ\8czÁZ\98 ßn®e\10¬¼V©Ï#\91Ò&\83\0"&»¨o ÙÃáqø=\a\14÷NÇ\WF9\92¹\88'\89×ɬ×ïø£Ýw\83<È­I\83\81\83EÙïÛ¾¸i»{\1eáÀIi\87\118±J^\8f\83H\93Ú
+Y%xú¤\\ 6Ý\94T\8d¦nmN\1c\95|>Ø|$\8cµÅ\96±£M1溻{\ 4\90)È!X|1\ 2\9e\94\9bIsM\ 1\e\14mÂh5\1aâWPdå\92A#¥\7f;Í;ú@¶N«â\88\14Ý&Õ¡«vÑ\11\15ã\8fî!\9d\16±±ÌÕ»ý\91\93¬æ²X¨\88<ÜÜÙ°ºÝ\17Ç8ô\11þ h¿\82=·0×C.öÎ\99¥h­÷Q\8eJ\91¶¨JÚSn\ 2W\88ÖÔÜ¢\ 5´\98®R
+bQº\10¡\830 ¦:4¾\19Ý\e!\8fße]-uü\8ej\7f\1fÝ1äs5ÑbÀrk5\0è;\7f¯$(¼WM[ö\8d·EƤx©º±Ø6lQ$\14áÅ\97\v\8fë\07.û\ 6Ð\9d¡qPéêp1\829\81¥ì\ 1[âI£yé&ýò½fµÉ<âÁÉÝ2]\a\16c%\ 1ÆèÎàÚ#g|QÄPÒÈP(»\8eV\8eàK\bµÂÛÔ\93ÒÏ\8b¬ EùIgQùÑRl\86\9aÅÓtçrøs>Köá^M\ft\99\1cmw@$mñîÝ\93\vV\ 3fm\13\0}-4-Å\8bøÚÍK\e$\87\ e»¢D\90Üî\1c\9b:`\99úa²\15kýQ@\8aÆðä\15MРL½\8a{\98±ÍZ^]\8bJi\88\8eo°û¶\813\95¡\11<úþ¨þ6b\1fðÊ_\ fÇ\1d4A%W\r}L\ 12õº\f\9f&ÿ÷\12]!³\aëÐ\91gNJ\ 4Ù¡\ e\9f\12\95¨µ0Û¿]¹C\7fösôh\80\81ý\8e1ø=øºé¬\84,\83\7f\1aÑrÉÆåí7-tÛ­sØÜ
+XÓ\92\95Ä\8b\7f\9aÎvuª\sß\8a³G)\1d $¿i\91ÓxZúf>¼\93·f\81Oÿs.æµ\13ºDà\16rxÄr\1dYw\90¥³8aÂf©^\8dâOÌÁlÝ\91\0YyVØ\93Y\9f\97/V\82ÇO¼T)IÒ     P\86ðóç\80\89\14\8d\10cP¤c\ 2ãGÔ\88b\ 3Û2;\95\8a¥i\17\vÖ\9aÙa\15sæM>Ók/\85\93ï§\82à\1a4¶Çd~j¾¶\15$}À­¨ê±yô!\8b\8dÕ\9c\9dîÈ"s)]Ú©\80ëã\ 2R¸»Ê¬H\8cÞHîDä]&¼\94z\91\86Múi\1af\9b<U»»®`\ fû/âÄ3ÜOÒ\aá=\9f¢f
+3\9b+\96õúîZ¬mH-*_9 ,¡¶bI\ eëp\ f°dsbÕ{)5#FJ\9cQ1c\ e\94Ýx\84"ËÙ\8d\95ÝÛ\ f\86(¼>\8cÈ<²\ fÆÖ\17º\8eß \1e\12F Â\9b\¯·r\ 6=s\ 6L\86ùª\9c,~ø ò/D\16¿ôó\bBDó\ eg¿\90\19Ûçc°5\9f,yÜFé²\8d'1z\1fäÎÈ0\81Äâ·`jµ¡*aíV.mÓºll¬í\91Ë©®IT²«\ eà\8b6ÔQ\ 6­¦¤È\83?ç)PÌYr¿\87\9b\8b¨A'\92j\8ccjC
\98\a\ 4C}/5\8a\8bÚC+\8d÷\14\98\1dº\7fÒL(¶\94Ë>¹G\9c\85\ 6¦7­\1f)pq=ËñðÃ\93û-Ô
+>ÄPclö\8dÄ\96J\13\rÑ\16Ý~¾z\88©¥,\9a<\10Kw\8b\99²s=±\øm+åL°(oäê4Ë\19\9f öå\95²ñ1·\83®&ÎÆ\v\añ\91
+±îb\8ei\ 3\89h gkóÑ\95\95¯\J`À\9ac\18³Õp?T\1a\8a\fÀ\8d²*\9dp{Êb\8dß\15'J\14yg\1e\8f«×<lbÁF\9e=wõ\1dÝÛ|¿QÖ7\0þÞ_Ùø:ïZÈdÊ÷\98Øç\82\9a;\11\97~­/µÊ¿fúûN\1a¥        ãë"\7fU£q§\9eb¯-ج\õ[GEñ÷\85\fÃÜMÐ\ 2wéÙÙkSÕÕê\9d\90Ö)i\8d\8b\1d\8dÖK\97\9a\17\13\99ïþ~\11«\brúuëGÀ\88\81©>ó½\ 63Ô p!/Ò$7\88¿U0@A\12\91µè¿´÷â]Æ|ù\ 2\974[ü}´O\9aMJ³\ 1Р    \8b\a\ f¼È\178\17AÚíã\99\92_-\9fQH^\12\7f\18Å°h_²MnLý=\14³ã\8aÂ\8a\13,s)<vû§\1e\1d\93âÑ·\1dd\0£Ç\10\8c÷Àè\búï}a\9c\9b\10ÖÞRµ§\92æ'S\92m\8f²w.Ø\1c.Ç3SpOE0ÅÑç0½Zd\1fiË×u \82(Åa\81¶Ü\96Ѳ%\92       ÏDQDÛK\ 6èØ\9aÞÉr\18\8c×|³\98Î\ 2BÔÇ\1f\11È\16á0©çâ4ÁÓ\15:U%\83·\96¿_ä¦'÷\fö\13n\8efÕ$ò\1cd«ùzu?
+a·Qü®D\ 2¨¯j\87\ 5ü¹»íè¤Û\9cÎÏñCØx÷v2öÌJí\192ù±\\8a´m\vKvSuy\ f\8fÖóRaª\bô\80-`\83\19ÄâQ¿\16\ 6ú\85\8b4áÝvT    åÕécp/y\bvÕ/×Â\ f\7f·µ7S¨\87ªÞ\8e\1eµÏ8\99\7f\ 1qxí?wõF6t\ 3¡+îx\94\ 5/\12 \16+°Íû\80\98G]Ø\8dkQ\9e\ 5\ 2\ 2glô\86ø\99T\\862s\11\e\ e\9bá­oß\9c\89ga\1e÷V\80´qQaÅ\80§;\v_§ú\1eù­+I©Ùã*:°Go¼\ 5 =u=\11~\9ee¢ç©\81¬üü "V»dØ«#\v"õ¿\84=ô±\14\91\99\fÓ6?­\11Ì\98è\1e\86\8bT1¢Z\8blAò|\86mx\8d¶_³­C\82\ f\1a^ÃR
+.©\1aø\94x\ 3Á\14§Ý\96ø¦Æ\87ïUxÆ×?\92â«`ã:\93\91GÑ!f¯ù½jûj\18\ 6&¡B
+\7fÔ\86ÍÍ;õ\91$D#\1eUÞ«¬ÔçÞ\99\v¾õóæ2OÆ\85õÞªD^·öY;ú\96\99(.¨8]\vÞZ9ľ)°\ 1[\88©Õ}üqeW\94zµ/\vÝV`T¥ÌM\17\16¦¬&\9b\92¹`s\ fL"Õ´¦,-©#\9dÜ=\88\8cnb\8d{®¼7   \vE£ß­»N \7f\ 4÷ºþÊ\91\94þA\8c§ê\91\96êeN\12\9a»\83§Z\94F6Î\9f\ f\9f@\9a\1aR\ 6ÍX\8bm\99ÝØÒ\9bqóq\95÷©\0Ó\õNd\1f\fÞJ\88\15Ñ[â\98¨ÑØxÍt±\1csZ^Uò\87\80\1ePN^Léù×Î\89vTQש5¦k¾~"í­ÄÎ\87\ eÑ£5\8cÇik{ì§:\19õ\90\85ñÊÍ^t
+£4-©Ñ\ 5
+\ 1\7f>I¨`&$ì\9eó\8cjY\98¨ÕT0m\96\97ÀÇj\84³Q\a#\13ÀÊ
+\1aD%è²¾ÅI#Í?×j\962:\98§dºöÈ/A\8fö£Ã\9a¦\1aø\r}h×ö'!Eú2¥\17G\90z¥£!=\99\r8\105ó¤)t1\9a£
+7\1e¿\97ì
+ƹÌ\89Éù\1fl9ö¦É\97\a!qn\13³|gXþ/íåtgÿ·\1dÀoM\1cô}çZ²\9eá½sm\19½mÌ
+WO\15o7ãgH\9bÔEñ_ïf»\83´s;³\84,\88äA¸h\18\11DT\1eÊn_¶\r\a\10¿»\12Z<|*·_e½Ü\99¾\96VdíL¾\r\ 3+Qoø»ÍÀ\ fSWf*ùËN\ e\98/9\ 3à,é\81NRá\ 6\17':unW\16¨¹Dû\8bUYÌ3Ç÷}5Fì   Uº\ 4{\16,òj\bý\8eÄC°*á(\14
+Ú&6\9dæÖà>\1e`\90ã\9b£ àVÓ¨ò\89ÄÚ­ø\rtÐ~¯xc\ 4\9dUJ\19{°$Æ.¶}Üã ²]\17N\8a^Y°\14:kKFµ%9áË\1drn/\8bZs`ǧ\86\98¾\93þ²\94©\bz\9aVçÌþcÒ6À²jÒ\98^\ 3\ 1¯®\ 6Ø\18Þ\1d+TDzÅ\ 2\19õåê\7fªÖÌ}/é4\82\ 5\89hØ)õ\9b\aÈѸ\90\87\96\86Yï±[Ô\7fýÚV\ 2é|\18I\eÊ\96d® íçè«\9fña@Ó\fî*)F8>}8D*\1c\1e±\17>èh\8e­2]\9e\94\bÙ\16\86h\83ós¡\10p¡VÃëOJ!&й\0R\95Ëôå-õRÆ\8f\12W5«y \87¹\15`\ fP\92ñ\14^Kä?åh\86V1l\16\97\15\99->\99^\92H¸±þFðÃ5y\81Üx
\8e$\ 6!íçmB\1eÍÔO@\99q\aÝ]H¨³\9cþ\89ì»Û5S\ 3Â>$ø:eIYÄ\14ñÑç¢\ f1ÿ\10\89ô:\9bÆû¥\16±¡³ñúûù^\11aPC³J>\86Î\8dfÿ\ 4þ\97\12[\1dI®SMáÓÙ\10¨QT]8gè\8bRÿïs\8bß\19Ñ\15?^©`Ø\13\96à í³2¦P¥u\85ŬºËí+\97\89/.·#@8\1eÏ\9c_µ|\14\13Lû[×Y\85Ûf0j\82Åv}Ä\1cäKÏ\1d\80"Þp¨@G;\99 Ç\16Ô\83â`á>\88?\8d\7f\ 5Ø\9dV\a 7\91\ 5\13Ü:M\91/êY\9b\8d&x\13å(5\91t\1d©Ä\18Y.\98\87ÏñºÐ÷µký^éIzfñä\8b=Ù`ÌSæ¢\íè|\83Û0\80\9bF»N'yª\ 3¢pfl\9e\10\1c »¢\94G$´7     :¿ ¯\8f ÔcÞ-ù\8fÿnáµ-c¶nªm\98\92´\8c¢Frì9\ fæ\1dw;ì§\95C\9cÐÀCJ\99ÎrÉù¦÷\9e¤\17(kÄ3á¶ÂE!Iò\83\1e\1eêÖ\vÌ*W\91¹u\99\86àÖ6û¹n@2s#`<ÿ\1ej\969)\95¼\f\17D\aõ2t{4Á(´XóáÄ£3|Qß Me  \85\a
\13O\9b± Íd\85îÃ\97Þ\b' ë²ô£\89ò\83_       oKQò%ö\ 2?O\84÷TðëCÉ>b\96{~_²\ 3J\13'\8a¹µ8\ 1\93\1c\94\ 3-´ Õ¶à\82¸âº}\87\16\80<\15\1cÄ\9a¶jùx\0þ-ö]É4jª/"\85Õq<V~\84\ 2\9cã\88\15éÿ!CÈ@X³û\15\81pÙã5TT\98ö;©{\1a\15}\11\83\ 4ªkäTz\8dR\fxÖ¬*\89\99\9cOÂé¹²\7f
+üM¢¡\ fý%\ 5\v\13öq3ÿÇ\b5YÞ\19\8bk\90X1Y\bOý¸wDã,ÜF¢ÝÖÊ¡Ú±=Ö\83Äcw«mâ\80ûÁM\9díø´\11ÓÚ6ÔO06Îá:Q$!\93¼\9d/\93Pì»"×¥Ð\8d\e¬Ê-P 8\97r\97=S\0soßÿ×Î\ÿÃá\0\f\0\16Ó\ eÓ\86aºs'OÇi_Ý]\9bvbºÛaº;fÚL·á¦N\9c6\9d§»6Þ?âýíý¼Ï\1fðpRÅ\87ýúaEõü\Π   \82\83æ\82@Í"\1aQ\92(\8aÐ[lÊp :·\98=\ 6k,/\14îz-Pý\19-Ë$t\15\ 5\f\91%ØVû³ä3a\90\82V·qö³ç\fó\82ä\1eë\81uîÔ\95\84¾\84¶¥\f\ 1v\eø]DÕ¬\96Mw6Uæ\90Çe-Ô¬Sæ\12®PÊ{\96hw\9av½F\96aym.Oï 9¨iHþ\86\8f@;Ñ(¦\13\86m-ºFú\81Cóó!\12Â\86\1a`V\83,;Z/2Æ!t\18¡\96\18ËÞfº¡Ö_\93Zo\80\a\12ßO¯P¶\ f}%¯w\8f\94ú±\92\96ujvy§]ç\87$`Ë\89\12Ã\1aáª\80bÿ\aï\es\94EÑn¥W\1dM\10¼×By jl/%Vhì*\ e\8b­ÙvZ­½\1f£ÈXzM\8dÚî®B\99ûÏ\10\9bI\ 1`M\87×\1c\0Ú\8bö\99\ e_XÒ\eìoÈR5>ejO/Ã[\91ûØ©Ú\83¾hÀçô*\e]\93U\99É\85²RB¯Ã¯J\bÎNæ°ÿ\91\93*Y\11ÆB÷ ¢­Ê^K\1fl[\80>`\12±[_ÿ`Á~õ"¾p[W{W\96\92\94àg®ãel}³y\19Å\e\19§\9añ­\84Îú_ãe?ù\98zyZÇ\1c7°t\92\86RÉ4\89=½7\98\8f:âÚ9\9b®)Xñ      \f-\82\81\80øfÂ\1a\93\92NϦ¾\94H\1d-ÍlÊTøÑ@\S$©º\9dt\0˨Ã>YQÛ¬cøkÞY\99|û9ÆÕ\8eÝ^MbÕ \96 \84a\89Sy]\0Í\ 2I¼~:\9e%dã\13¢^ùb\13<aiO\8f2íÞ½2b¤\8e\14à9¬5\ 3Î\93\9fª·Þ\850YÔØÒR¿ÅðHA\90á²Ùi§D]Å\ 6ͱVóX\86\17ÂØ\9d\99\84úæ{Þ~\12H½xØç&\93AmfAq)V{\93<X\85³Ióá\91\8a\ 5HaÓ¾¶Øæ\8fÃ\1a\89Bd.{:Ü2NGá¢\9cXü¢ÂíKp\872ð5ãaäÆq÷@\82µÔ\v\9dÞW=kñ`nfªïÃ|ã¬Ã\7fîxR+òù\ 4à\98½û\8d0+gOg¾¯bÅ3\96¹\10D\ eF³3Ó\ 3\9aû
+qª×$\11Û+â:göÆúyâÛë\92¯\15jjÞ\15läÐ\89\1f°7ªÉå\10Ô\ÚØtËwÙ:¿#:¼ß\97\87½\1d
+ËÔz\9e\18\9b\13ù®¸\1döéW\ f\10Q\9cýСgûg©èé\16\ 6O+ýÅÊÕÚEa\9d¢÷<0X§XÓ*êåÃé\972åÔ\8e\15­\80©\88\9b`ô½°êH\9d\ e<²ìÿê\19ù\8dð(ê\95<øs+5=fl\88\8a®\19û{þ¹@þìNï²\81\84jß&µ\93b%\\ fªÛs¦34u\82å\98\85\95\95^¦ëîÔ8ÉÝ!\9dÕZ~×ó\7f"ûV±ÉôßÊ\87a©a\9fÝ!
+0\£\ 5þ\1dbÛ ZÄo\88Õ\ fèüE(-\ e\1f4£êòsV\8e1\1dù{ì\84\99-\95 \83Z\1f\9fHd0íå{³Î¥}ý7'\15ùÛ+£\ 4\88\99¹­Ý¦½/ßóa\ 6\a\82Ê\1fÌ\9d\92üAcp\7fTu\12ß5?jDÉ¿¦\ 3Ê\14\19㨹`\85¡\ e¡\95¤!\97#¤ UÂÜ­\8fا»\92EÛ®.¥\89\99\1a%ÅVp\ 1Ý\8c\f\9e-?\1f">Nt\1aï#Es\a;B\8bùøfÔ*\96\ 1ö\ 6z¼aòTÎÎ:M­Æß{_Ü\1cºmÝ\80\83&\19G©¦\0\ 1W×:\19G^è|\8f @ÿ[\ 2Ë\ePàp\90@Åù+;\97/§ðBYn\ 6*lãDYvÆÚÕjcT>+N°H÷9þNþO<oZQÊjÚÉ\1f+\1c\8f\94¦D\a/¼m\19·\99\15Ëï\82Þ\9b\a\8d\1fÔ0®\v¡üo\87uäøWþb°æ,F\9a\e\1e\16öæ\8b\8c/a\19á\86o*O\ 1ó\ fã\8bÑA\f\87°n&»:(B*T¼¿ä\9eß÷ãB\8d\984éÉ\82Ï}\9cüIqêΩ6\96VïñÃ\ fmö­\9c8ÍW\85·\81ÒÛ:q¡±ë\117iZæÚ\86^שּׂ:\874d(gD\9f \ 6»JÞEoìÕ\95ð\1e\9c\84ìºï\84\ 5Öy\1ez\17\17:ñ6\9aDìå-/\a\ e\ 2\11\13¡ÜÛÝ\84<*\99æÉ÷F)6]zÃ÷x*²ø&áÛÌ\19\1fêZ]Æ~ö\87\\15Uè~b,ëj\ 5P\13\85úG¦\11(pH!\18      \eÏ%l
+(¬9÷O\ 3yÍ×ñ\rë£OÖ\1ceòËÒñ17é\18Ã\84\19 ¯5\9bLGy\1e\ e<*äI\87U¨ç\f=\e4A1͵\v\18y\1fÛ³üpiRÉöùùDíë:¦~Ù¬\11\vë\9bq\89\1a»\ 2ª»ñÞ£\9dUñèÖãªÆWP=Rbç\90ÿ[\88Ö´Ð_ëÖïú\8d\97Ü\86óñ\1d÷ö'0A\85|¡ã\8c\14tN\97\ 4¨¯#3Òl\12mÿiÊB\0³ï\94çúÜ#\r\ f\1cG/~ÛñÀUDZ\1eÈ\90C\14(\98ò\9df{\17×\85+P<+ì[\1a\8cnk\96ÆúyVfôû±»Ð²\98Æyeû­È/wdZn¡*P\9b|\13\ f\vp4t\97@zÁI~\97Ñý)ÿ:w"\9dñ[í»«ÒÌõ³.¼\82b\b¯i/\11\11©\96+\12Syã&ÏÙé(\8eò\12q:\a ¶ô\8enÔuZ\19HÞNö\95ÌnYB        :\7f\ e"P;{Vü"szw+\16lò»£cÆ×ò1y±Íé¾`$!Å\17­úÌ.c¼¼¯t\ 6kuD
+\91\86\19$¬ÞQõAXêq¤5,n#\8f_ÊÝÿ\ 5Ö¾Oµ³\18àëøÇøºnfå]\0G3\90½d\8d`±ßÐåaÞæÀÕ`³\97\9f^çì        \88\89\88íÎpɲ@³Ç¥Ü`­Ä\ 3\1a7ñÍ\9fe\v{­ê¯!   oó6é\7fËQø'F`\18r)\9b¤&w{ª;\9db²¼\8b\ eÝËù\b\7f\11,\8b\8f,ÏÎRá\11\ 3\8d\84\8aßÿ k\r\86\80÷\8e.\1fQEíz\ f¿8M\81(\9ew7ìs\89*Z\1cC\86W\ 5\98\9e±Ïjß°Á\18\ e\13'yé\1aÀPéAJ5PnJ~½½ÑäûLBÑ\90V\7fí1\17îí\1cO°ÊE\1etµéúj§âª3³ KÑØ\14ô@8\92âì/ÿmF®>ïã+S;êH\10\ 63F½(Ò\0E_cÆUä½Ä\97©7\93Êiè,´&ÊE¬\8cÏ\7fÍÏMwÓ±Ù0\18ï\12í+Ce\ 3\97^¾ý\1e\ 5£\83
+tÒ´ÓÁ\15Õ4Ü«,( ,\89ÂÉeh¿æسQ\85æB<Ü\8fö\90yVÞþÝè1N! \r2DzùV¼\88ëæ'\84>ߺ*û65þ¢ôÍ\85\8d<-\ú¦\ 2\10\96`Ô©Ý\8dþ\8f±àÏ®\9d\ 6Ü~\95âAm%J}]5\9d\bac^Í\19Äb­\ f_óPü\ 1:\9eW¢Ýöj\ 3_8\ 4ǨkC1=\ 2\96\b7K\ 3gó^ÊÉrµ\95·°\10Q¥-¨Ø7Z\8dZU\99_A²PøËlO\1f]kJ\b\82"V\8cÒxr«Ú\95¬\93ý]]n-Ó\97¤á·9\rÀ*>l\91\ 6\91\86þªâ'¾;²_\81¯1~5D\1fM\9d6\8aR&7\fÚ\ 2`"ü®4»\ 3yc×\ 5å\99\85B\908\1c;"ÐÖ<IÈ\97 Ôz«µcñ\9d\9ehÄ0þiÇSg$éÛp£û\80øÿR\15\ 2>}¶ºTf\97\98\96¦m\17[\11¤\9eÞ\a1,\1eú\a1ÌUcée£öhçn¶\90\90&vû´\11ïB,»ÀãgC\13\8e\1aHt0\8d\9cl¤e-\9bpt\7f\9eá~d9Iðy¿ëR±Ä\87;ÞnW\10µ\12Ax\89\8e\ 27H$\\87´tO\9fÀ£É\0«Ñ\19MM!Mû\814ÿºG¢Fp\96\ 3\0¼\9a8\18uSʨÁC\86ÑÈö\b\19\ eÿ\13~ÝO0\13°\14\86\8f\1f§©_ÅÑâg¨Æ\88üªo\97°÷è¾ÂÚwí^¤\96\86Õº\90\96\99HÀ~µ%\0¨ÿGy b¶\ 6\0¾³PôbF[\10"!Ì\ 5ªP\7f\12&}fSý2ê"«6¡Yô|g·;!#8"£\au4(G\81ÒL\ÂÈ\8dI;\99× ¦&vø\8a\1e¡\99f\1egbp¢]3Ñûêé\8dyÅW­<ÛK¤k\95Â8íxOó\9cѨä\8f\ 1*U\8b$l ª\9b\7f\84Ñ~\14qrÐZ¹I;\ 3K>\e9'nâ9M1â[ÿ\0@\10\ fÆèÑc\8b¡Æjî£Älërñ\18\94Îl\93à¥Dj¯P!Îsl\86\84ö³®qq3~«ÊÅ\9d\ 2]ù=¨HãzÈ\µ°\95\12\ 1\a\15\16ÿÚÔP9Õ¸3[Á4\1a±iÙ\e\ eéòÒ\97'ÛIg\86\1f\8b:½:\90¾³}\0Ìöò@ÜÜ­\fìÈ\87%êù@\ eã¼\12\ 1Ð:Þj+\80ïðQ@\8eìÜØ\18\7f\93ÁêÌCÙ}x/'\9591£y/£\97aÈýmhã\99\8cÖ5ÐÂ7CgÎI¾òç\98r°åÞx\7f\1d£E\99¡x
+ªê_\81Ì~«Îïî\18ÍQ§?zÑ.ic\7fænC\86\89ÝÄMíõY£ÕôI\98?ZÌÈq!\ 5³Â\ e©h\13:9¡bË\8d\16\8a\84Sh\84©Ê\18o¦­â\16;´[\9aªds<©¸\1còùplô>0\8cê\bŪ챪\aöÐfæÌ°£\99a6\99]i¦\94Jûµ+\9f¹ö;xi\1d\8a+yËɱ,çFå³Æ.5\8bG»ÝULîÆkdBV\88\88çõJ!òµÿªòÀ.Oο:¤àM_ýNÙéù+\r8Õ6+\8bH\9fxåa·ÿ\f\15n'¸*O\1e\17¨=%Y{â$\f\86ßXQR±\9d$<\85\8a\e\99\8fn?q)\ 6I+J
+\8dÜ\12¿\88¨_ÎòîÛI\ 5MÔjra+\91<\b¶é­\8a@ãÜ4ÆZgDöUý\8d\920o\b\aq\1c\13<²nàº\1c\9e_\96Äj+~ðÑT·eX»%ì\1a\90ßÕ2\91~öå(Ì\81\854£jõ0\aõ\8díñÉFð¦:Gô\14`M(\89\9dß8m7\1cÿì\987\85QU=Yã\14YE\86£\9d§³É\13\8aüÞRr\97ËrÔÄ,õiÁä\ 1tÄ.°ü\93\88gÕ¸åà³à\88\97\92¥0,³SÄ3þF\8aá±Û(\e\alAû»°    CrbC\bÝ\8b;]
+\ 1«)èë\f\ 6í\12\9d\9e\85#ïaZBü]'\8f\7fÆÕcc!zhý8\1a
\ e\94RK¢UQC[\874<@;8¡ùÃ7ÎçÈ\12\ 1\1fU\ 2}°À\83â]±æõF\rh;\87]|3G*­j\14\9dn¹û2Í\12´yÉ\8eÂm\1añ>ôdõ\r\7flf|\9eÏõú\84\\ 2ërÔujbÕ\ 2\8fòú\1aSw±\86äØUrèu\83\82Bw)¶\89\8fõJbRúKF]"\19\80,\8bÁ7\13FÖUÜX\9dÉI«m%5;èïv?×e\14\ e)V\8fq\ 6ì\98Y·²\91\87\aÙ¹Ì\ak*\15Ä.úµ[¦xÔ¯f£&X)\95ê:\88LE\aÌ
+múÎÄ¿Û£âÝ:\189Ça\90]*BÇJò\1eÖ        ²*?2\96G1Ùz\ e\bâ\1d8ÑqªáÞ\rA\19¾õ¬IùÛ)µ Ñ#\ 4f÷PÆài\ e¬\eZóÀI\1f\1cCúQ=%l\8eè\ 3áá¹±P×\1f\1f¾Ý\99ÙÇ\88\92YN}\96;\f\89gf    ¦\11\93#û¼\12C
+JбI!ý\ 6»r;·ê2\94\94\11AVù¼\1f\80Ýñé¢ÛSöR¼\94W`!ä\8bO\83\13È:\88ã\0¸ó\1a.«9g̺í\8bÍ\1e\18¸7Uz\99\rÃY¬æ'6\1cé\1c\15\1dMØukçBr¿\ 4\ò¶"\1f¸\98\81\9aó\98\7fÀ\ 3Q¹ßÃ\88%\11ß\19ã^\87ø"\8f«\87:\a´í°\ 6ÂQ®ÜÀã_\0®-ß_,;ç¯Ù\8d¨\8f\ 3ÙÅGÁà\19Æ#bÔø\87ð\9eûOø\94\a#B\1c\83¦¡\9f¯\e$ÆEEó\83\14W\81¥\9f¿_­\ 6¾\8fÌØ-7 º|7jõâk\13²V\1f£\ 2«ÉMö>ö\ 6£zm¹Ï«»¯%\9d)Dçù¼§å¸\0^Ü6\9aàÆÒhÖ\9a,¡ª[c²\88­Ý \18P~¥%÷(@\ fôÊ¢H\fÒ±\96ûe\1fë\1f:µ{\12\0\90óH´øóß        Ü3\97ñO\8c¥J\17       ²}ÂJ\8bôhö@iDU\ f\96zÛ°\ðÆù\9c\1e\80ç­\85\98¿ie5C\ 4î@\97ÓBµÍ\98iÙܽ8K8Þ\84ª×\14¡PëQ\86¬\9eZÇÑD\86Ï_Ð\83_\7f\13÷ê\8bj\18õ\8d÷È.\ fza\8a¥eeíÇð%\ 3²K\8fÓ\ 3/¥J¹´~\82ÊþâÇ;PÃ5Kq\83ï«Ì8\15*\168{V\12;ÂU\8dÀÁÍDï«}%¦7ßj¶0\80çwÂSZê¦sXLÊ'\82H3\91\83å\8a\80\86&\19\8cm\82Ó1ìµ\99ßzx¯\ 6û°\ 1È´S\87.ñþ¾ô`Y¢¿æ\1f\9bq0ÙÒ;Zr9QQ\8c
+éR:\1e\ eµ¾£v\88\90rß"öpc¯²#\99\9dê«\1e:aiñ\ 6st]uË¥TÛ\97<©ñ\1c¹;aÎ\9fÅ\0>·nDê~á+\9aîD?>QÝ\85Âf\83\84âv¼vn&öË¡ä\86\9e1\90£B\87ø·Ì\1f8\e#\84xªùy?¾G\90\v\7fú\91hävý\f,NÚy×'²þWUÆ\9d\ 4\89â"¡hä=î]×ð\95:\1eyãù)®¢l2w´×\15+d\96\16\8c5êg\vJ*\1f#\11àc¿ñòAâ\89ì*êþ<&jÊv[æ7\9d\17\ 2ð\97Û\16¢V¡\93\ 2\ 6\92\90\82ñ¾rûz\9c\ 5Á¼\1cù·Ê\7f1-\17\ 3\12n\~Ø\1ev}¬4]\87ËL¦0ö¡2Ö\84¾Nì̳\13\7fã,6\82\94¯z/Å_ìÁ3ÉU+GU\80µ1Tû~Ùôsë(\1fÞ\13ÇjüÓA`­©9
+úYø\14\89ϼ\1d5ÁÐÂ<\9f°\86\1d\91ë 1 \980cé\96+\902\13ßÿ\12îÿ\aÿ'\ 2\eg;+O/7\17+O'Üÿ\ 1*QkZendstream
+endobj
+2966 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/FirstChar 2
+/LastChar 169
+/Widths 8320 0 R
+/BaseFont /CYHFWR+CenturySchL-Roma
+/FontDescriptor 2964 0 R
+>> endobj
+2964 0 obj <<
+/Ascent 742
+/CapHeight 703
+/Descent -190
+/FontName /CYHFWR+CenturySchL-Roma
+/ItalicAngle 0
+/StemV 95
+/XHeight 464
+/FontBBox [-217 -302 1000 981]
+/Flags 4
+/CharSet (/fi/fl/exclam/quotedbl/numbersign/percent/ampersand/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/asciitilde/quotedblleft/quotedblright/bullet/emdash/copyright)
+/FontFile 2965 0 R
+>> endobj
+8320 0 obj
+[611 611 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 296 389 556 0 833 815 204 333 333 0 606 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 0 606 606 0 0 722 722 722 778 722 667 778 833 407 556 778 667 944 815 778 667 778 722 630 667 815 722 981 704 704 611 333 0 333 0 500 0 556 556 444 574 500 333 537 611 315 296 593 315 889 611 500 574 556 444 463 389 611 537 778 537 537 481 0 0 0 606 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 606 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 ]
+endobj
+2957 0 obj <<
+/Length1 1647
+/Length2 17250
+/Length3 532
+/Length 18181     
+/Filter /FlateDecode
+>>
+stream
+xÚ¬¶cxem´%\1aWlsǶí¤bÛ¶mUl۩ضm§bÛvrëûNw\9f~N÷ýÓÝ?ö~Ö;1&Æ|çZ¤\84òJ´\82Æv\86&bv¶Î´\8ct\f\\0a\13[g\17G\ f%#siZ!;kcÀ_)+4)©°£\89\81³\85\9d­\88\81³ \17@ÍÄ\18 bb\ 4`b\ 20rrrB\93\ 2\84íì=\1c-ÌÌ\9d\ 1\14*\8aj\94ÔÔ4ÿ)ùÇ\ 4`èñß5\7f=\9d,Ìl\ 1d\7f\1f\M¬íìmþÆü\vñ\7fì¨db\ 2p67\ 1\98ZX\9b\0\84åä5$dÅ\ 1\14â²*\0q\13[\13G\ 3k\80¼\8b¡µ\85\11@ÚÂÈÄÖÉ\84\12`jç\b°þ\8f\ 3ÀÈÎÖØâ\9fÒ\9cèþb     :\ 1\f\0Nö&F\16\7fÝLÜ\8dLìÿQÑ\0ìM\1cm,\9c\9cþ>\ 3,\9c\0f\8e\ 6¶Î\7f{àl\a°°5²v1þ'\81¿rS»\7f\13²w´ûkaóW÷\17LÞÎÉÙÉÈÑÂÞ\19ð7ª¼\88Ø\7fäélnàüOl'\8b¿j\80\9dé_Kc;#\97\7fJúW÷\17æ¯ÖÙÀÂÖ        àlâîüO,C\13\80±\85\93½µ\81ÇßØ\7fÁì\1d-þMÃÅÉÂÖì?3 \ 18\9a\98\198\1a[\9b89ý\85ù\8býOwþ³NÀÿT½\81½½µÇ¿ÞvÿZý\8f\1c,\9c\9dL¬Mé \19\99þÆ4rþ\eÛÌÂ\16\9aþ\9fI\91°5µ\ 302ü\87ÜØÅþ¿ë\M\1cÿm\10Å?3Cù7    \ 3c;[k\ f\80±\89)4½¬\9dóß\90\0\8aÿ3\96éþß\91üÿ\80âÿ'\ 4ÿ?¡÷ÿ\8eÜÿÊÑÿt\89ÿoïó\7f\85\16s±¶\965°ù;\0ÿmÃ\0þ®\18;;kC;;+\80\9fUó¿¸\18ØXX{üÿ;ýW{5\93ÿÈ÷\7f\87%álð·)\82¶f\7f\89a cø\ f¡\85\93\98\85»\89±¼\85³\919ÀÔÀúoÇþ\95«Ø\1a\9b8Z[Ø\9aüeöߦ\ 2h\19\19\98ÿ\8bNÙÜÂÈÊö\1f
+8ÿ\ 3ÎÄÖø¿\16ð\97¬\7fÓ§W\12\92\94 þ_\96ë¿fò\7f\87ÀYÙÃþofÿ­\10\19;ãÿqø\aDHÈÎ\1dàEËÈÆ\ 6 efÿ»s\19\18\18þùcõùßDü\17\89ñ?Ï2\ 6Î\8e\16î\0­¿e30þ[ü\7fûýçIç¿À\88Ú\1aÙ\19ÿ37JÎ\ 6¶Æ\7f\7f\bþ[\ f,\1c\L$D\0¬\fL\f\8c,LÿJ\8d\\1c\1dÿ\96÷ïNøÛ\8aÿ~þ÷*\98\98¸\9b\18A¯.Û\19qÿ²LËLw®ÅÈ\1d\9e\14Ñêïe\ 4\1d\ e¶/iP.*ð¯¶ëñK\vÛá¬Ðÿ¨        ¦k\9cæújóX:³ÿ<\90¤:\1cíE·&ïI1¹ÊÇõ!¦ì+@Ú$ë`§>\f¤×-\81K?W\8bòº^\94Þ\ 6ÓdcP=Ü\9dTPÔ-þ\80À\9bî`v\84¼~¦ô'v-ðG%y²\87÷5J­\8fEëDl\ 4B®-<;'K<y~"\1f\1c\e\19\1eê¹\ 5ï;À¡Î\89\85"åv\ 5\83#\8bôwÈÁá×T©pòU/\92\9bîp¢*©\r©oÝT°;\1c\96\9e\9cxêÿ¾x\b<K\90\9c\ 2µ\8b\99åì\88¯¹í¥¥£º\8b)(\e\14ñ9"æ!CCõ=D¬õðs@Ér²\v\87     Ü«\0\94?ìÉ\85¾Ü\14uóaÐÖ$å\ 3«+dè\v\1dÃð-\81\90x\87ãýâÈ\83\91ÕdN[ò;@ÎÛ¥\96µà475y\räpI\16µXWø]i¾Õö¡\e#TD\af<1Þq!ùÞ\90þû¾\97uõ§Þ0à\ 3ÿòÌ´j\19µf\8bÿ"eü¹çÄï\93K;\7fX·§T½\98\ 2\9d\r¼«'tZÚc\8bácÓ¤\90Fg\b=\13\92ª¢\ 6úNf¤Vi\1akE\\92\15\vi3C\95.®2jX\7fQ\19È\e\92`¸Å »ÇZÔa¨®\eY\9f~sJÅÅã!\92ó`%¼ýM\0$Ñ­Ásñ\15²\7f\8c% -\7fEûi\14\87Ñ\99®±Â\8b¼94\80F\0¿Ëãl}$ui¬\ 3·\81¢0\11¬â\17        \1f\1a\94"-*¿©1"· 
+\9b;&\ 4\87Rv¿\88a\16^\v\94ø\ e\9b}P6\93®¢\ 6û˵Üè¬\94Øo\ 1Õ}ð\84\19\8aÁ\13,à \95\90h\9exo@vW\as[ª\12ûîoùTÛ¾Ò\1fq\81¼¶i\19¿±\83ÞÄY[+\9cûÚêX¢Ø­O&rv\9bkº8ü\bQò¶¶\9c¯g|U²\17Ûrw2»I¤\9b!Ì^¦@6è%Ù¼T­C׶\rnæmx_\ 3'Ô&¢\964âß\9c\11\17J5<EÈÕ®\83\85\15m;ùÛÎKz¹X©\92UêêÂæÆ\1cÕ¼Ù\8b·0\b¢Uä\86\e\1dH\r\96Ñ\7f±@\ 4\ 6tÚ/SÄ}m±\8cð°mm¥Ü\9fÓ\97Ý\9a£Z\1a\19ÄÄ\ 2\8dåäe\ 2«¶¾^Û!Dô\97\1a°\7f)S\8aýñ&\e\11\86Ó\1aÙ\ eÁ\96\99\11\82qð\M^Ð>x­©\ 5\12¿àÆ\95»¤Ì\\8dgµäFOi\aéá\8dïÈ\96\1e}\9f­à\82\82®ï\9f¼\rf\84\ 6'\rÀ\88\13ï^\9a\13b\e\98\98·{\16Í·Ö\96\84ø Æ\v«[PN\b×T\83ßy©/y>º\80ðÚ¬\eÒ¸õû\röGxLýã¦\85\e\83\8eª6fÉ\8fÎ\96U÷F\15\ 2{GrË
+ÑÁ\8em\9cs\8c\9díÜ,\ 6b\978\11Q\aIÄöæ\89õ\13ÒTà\r*©mW0\8aæ\12\92Þºt'"Ï è\1dRp\90\82É=BOÂ,£ËV   Î,-føô`;»Ú¿Ev&\ 1A?\90h\8dåIÛÒx/Ø     Ê\12ý§¹\1d9Ò]U\9eÙÙz¦£°J\94¬\9b~\8b\10\87¼¸\99y\88mö[®©Äm\8a$H\8d\85\95ËXt_2`²\81sº±6\1eüG\14\1d\82\9c*4ü\ 1¤\9d<\ 4-%\ 2\8dÖE\ 4\9a\98\ ft7E-\97¹lÒxÔV\9e×2½\foD\97ÔÝ\1e¸³ZAûó\14\10Ñ\97ß'NQm;¸;±±_r¼µ\10\1e¹¸-\835Û|\1cOm".MË\a¢Ô @fFêdEöï\11\84\96SÍÉ\85\8e9q©ïRMìF\1fLè}êã2ï°Þ\9a¡i¹\989}OóEØÖõ±Ç\vl2±õÄBi}õ)6ä¹5I\88Ä\18¿1\14\1e±íVºt}\11_Fæ²'/BòêñÃ\8f\9a[\1f\81öéÃ\17\8aï³\ 61N¾\89ÀâìÜsÒQ\17]¶Á\0\10²\1d\9bÒ?^\10U\19Ð\\8epy\90ÞÂÞïÓÑD±Ü0Õç¾Ôh5+BÇ\fËÜ·[SØ\a\9fOTÚ\11 ¯ãuÚyîîN\1a$§ßRBh9\1aî\8e2\90Î\84Z\12\95<\18\84p\1f»s\1c±ky\ 2e@Sa+\9cã÷\vÍÃ9\18yΠ81\83=\93}6ýN\8byؼ\1e\£¿N\1aÉ\ 4\98£ªî5¿GwqYAoÒ\9dƬ0³\18´Í÷ÄzgÖкÞé¶}Ì\11×ôÝõô­Wm5\18\9a¢\eÿ¾\rËæ\87\12\9bTý>9Ç\ 5ºe»\81\9dÛ\ 3}}Ú\93}XVë~t<ðl=Î\17áhoÍ\95-9;Df6\9dJKÏé\1f¹î\ 3u6£r*\0çä\92J\96E°°ëû\B\r\b*!bio·?\14Ç'\8e\8a¦=»æ@ÛrdÌÖÿ\9e\83]\1cÄ\16\80ò}V\857N\8f\96{Mïø       ©\84wºèJ\vç\13·ÎÂ!ê>UqþÙe4Ô2ý¢gXU¦ò\ 6\16ö\9e½ÕЬö[:ó9`«|¼ÕÑÝ\[zHn·ü\87\93Ý#Õ\84\9cøh*ÎÑæe\1fvqD=è¦sìx&w\ fÚ"\eÂÜQã#?÷¦'açM¸DNâÓG\89p3\9aÑ\9d-ËiÛç\e?ùa\9aÉh"z-AË\9bs\13\14ë)Ò¨°&Ys¹¿ç\9f\90Y\85i\97VK2\81H\17\11M ô3\88#Ïq¢ºýÐ{¶Ç\98hI\19/\81æi ü¦«·\1ff¾ ÏÆv2\94\84zeŨ\ 3gªµtA\19\ 6à`ï-\97\13\ 3\85î»%\b\93\11e?S^ÑfpÃßnBqÅT\1eX±Sd ÞÝ6¹BPáu"\95h:\r\88T\9b6ãVÑ\ eL©Êa\92\8awGz©\9au\8cß\94\84Ôæ¢ù,0³\8e£Þ×·L]#sïm\ f½\98ö=¹Dûa­\98\91ÀK'¢$§~MtªI]LÚ½¢¹\9dkbP²\8e=t{ÂÉS\82xkµÓb\186:íºþÚó¥\91ÜÓO4G!T\eþ\94t5æ\84[\94\13¢ÝÉQeÈ\19/OÄT\15y\0\v\ 5YÏ|5¸É\9a\86Øä\9a¯\94Ëâ\ 2\99ævóø.\7fP¿Fï?\ 2­°6°\11Èæo¹\82üópr¶\90ãqöR\9b\ 4¨6áÑ{ØoÎ\9eF5pó÷\83F\85¿\8e5JZ¿Ø#t\ 1>^\12\8d\10ø95ìqY\ f_käÖ@\92\9c\ 4(\88Jå¯\9f\ e\92Öºoj\b\8aÜs¤Yýiï=\99¬O\ 5zV@xLY1¥nC}ä8üæùÊöüÁ\ fW-CJ9Ö\96?:`A\84¡ñp\8b,`\8fJ =\8b\85Ú\8b×±PwJ(°\ 1ô©g\87AZ\8d¾(\15{"Í\87L+óê\13ráÅ\0ë\1a\8fïH¼ÕæßJyd¶à\97E\17­N¼\ 4_¯gÎ6\86ã?ïT\ 2ºî\85ÑÄÐ\92\ 4\86ku3§}þ9ÔÚ¾D©\18³ë\8e\98¿¼ä´jî\7fq*Ý\16ü#ëj÷\8a\e\85o\89gλ\1a&xë)3Ñ\93ÛÈ\eh\r\ 5\1ff
+\19as¹é¥90\8b\13¨À\9c\a£\8e(» \13\19mO>\13+l\b\17Q?ì0\80Ð*\93D(w\v\ 5Ä7w³y\99\14Ϋ8\91\11KïÒ³Ä>û#G        \ 5\1d\v     Ü\84Â~"8\1a÷\ 2Lq\1d\940¼6,4ÍYÙ¼\ e\99è\90Ó\8f\ 2óÓ|\93\81Ô º\1c\ 4Ñ%ñ²ãú¾\8egxþ1Ù\86e\19\ e\96"Ú¶\91Ö^F\97\99\89Ä\89³è\8d}\ e}nØØ­Yö\ 3Ù\ 3ÉØK\9eæn´q,\a\ 6õéÑÜpÑz-X\85G\13n\8d\9dW\1aÚ-\9ca/ª"»zª\9e/Þª7ß\86¥Ü :óͺ²U:¸®hp«!ó\ 32\1e[\9b[\92ß\91\9aÙPsgéCøò\99\8f³d\ 6\7fnw\1c\98\ 2ør3ƹ_k\1f\9bÒjõ)\ 3í\83qk\82õA-8\95¼´\r\97\ 3à\14\11¨\93£m\85ÞÃP\99Ü\12{Ú#M½°\11\11êÄõç¡ò
\99\ 6}\18Zx\98öéή¶tûp®\ʸÅ1þ@®R
+$\8c9.è\8aG¥J/\1f¡÷¨é~\17\9azd\89\97\9ei\8dÇV¸=ê\94³Êõ×Ãe\881léÃÚ\9ee  okç±eÈF\8c\1f\9f±ßÜ\98\v[ųS>¤þª ,ï#3ëP\8c&\v\16AÅ*ÇJ¸\93\94?ÒÕVü¦ÅâÝ\8d3ª36Âe9ãâÚ£\bÃð.¨\91\b     -\85\18¢\8eH°+\vÅZJÁÍp\13¡\ 5\15 \924¤ËzCÐ3ê\9a=\1e°uÇ\8fù¶\bk\85U\9c\7fÔé\88\99µ\ 2ª\ 2¢ïÞRÌõm,\15É\98þ\80·Þ\vF\10\1e\a8:z¢³b¼¬\11LÅ¡ț9Ö\85¤¿ä¤òp\ 3²éy;öe\î\1aq#Ç\1dè@¨¶¬\1d|­w­\88ÒM\90|\8c÷\98ª°\11ÅÒ2l¹ÇÈÍf¥u\fاz\í~Ñ¢\ ez)\fÔ"{ãy¿±\8c.D:ÛëYõ\173ò¡\86\82Î~\1f8L={Ò\93\8cTPøj5\e ÝQ{í\90<_.:\ü\82\80dèm*5G/Õ\ 1RO0P\9f§Ä=³# e¤\16¬#m,²)R\81«\87%#¨rG£Zµ¨eå\9aºhzÔ>w3p\15ä»\93$ïÕt'\9a¡ù8a\ eЦ\8e)4Ïv)û¡Vï\85Û\15Ü#Á\18¸8$(\1a\15\955¾¿Ìg\93W\ 1ü~\ 3\eC\91îCØcÆ\89\82]\99lÀ¾\7fü¡\18sbø\8dQ(þG¢Æ\92;ñ:x! 4eoâ轫\91hÎÛ\83nã Ã¥\90\85°:Ï\81\ 1Üä\80y\81¸\ 5\18¨À³ÅµmifÌÎ\87¢Nú¨ÑnUÈ\1d_\12Ó\93@ÞÍ\ 2\90]ËY\0\bAùX[*º4~Y\8bXéÕ½õùäZ@û\81·Ð+ïMBÊ\0\88{,×þ1\9b ç2ìö;9\88\1cnÏÔ\a\10\13ùbâ<ÄM6"ým\94è\92$%)ÜÜ;+ìô\86\8düÕ Kµ-² çåè+øyo6\8dc\97=°p²läØ
+7§e6\83\ 64û'ùðñ\87\8f\16SúÒµ/Z0\99\9f{\7f\83Ö8Áó\9e\81f\97{n)\1fÁÚ\9b_H¯ØB§½:T0\88QÓí\80Þ\9c\87\ 4GÇWÌ£¹\84Õ¡i¸£å\ 4\8b\10Çåjp¼\ 4Åò\99âaén)\98½J½ô÷\92\9cÂe[\8cð\10\81²\86\ 3Ǧ±Ú n\1a=|\8a\10\12* \ó'$¶\16ì\99 ÛÄeÂ\1cY¸©ö9áÏÉÂ%_íäNÞ#\8f\9dÅ=+ÒU®\98Ư\ 4v\vµB1\846Üábmz\99X`\vN*\9d¤·{OÿÙ\1a'Ñ!-iþ_\b\97\1aôsß¼.?\87\99÷¦oÓhPjþ\84í\99ÛÇõ\8ei~\r£¬Ô&\1a%v¤\f>LX\8fÏCÄ×:n\8a&Ì'É\82µÏSc\15\1f\94)ö&\ 5²
+\18l\97qý¦?\90Dvbð£?Y t\16ZV\8eyÌâ-Øò?Æ-^\9düàbl\b\82&\9e\17~Ì3ª©×á\87\9c\8e#bÕ#\95¦\fÞ6­\rß;ê\92\94r\ f£9S
+àhu\9fí­¤y ·\ 4é\92ó\88«6cì$VxÛ8'é\11+=\ 1\ 2¢Ìó*\1d£\84Í5Í~Y\0\17;n§\fG\Ü\ 3\9b       [nõÉÜ|\ e\82Ƨy\14\81>\ 1\8bÛåW\19#
+\aK\ e¼ªs7ä£\9f&ݤ[\ÁRo³»\ 6\15nL²³,1´ß\9aâ½P;\97¿q¦ð{5\r¥>C²È\1d\13\8fãè¹£«ÜlfàåONEwL/¿Z¸r\0Ôðï\1e%Ì¥ù­E\ 1\14¼£ë¨¥ûb©32Âc±sO\93\9fóéÄ\ e    \rËòH°<N9_í\86^È]ßí¯=P\17L\93Uà­\84\89\80\13êÖt\r!Þ]"x>"'9±mZ\ 2Ìù¾\8e\1cîU\12\ 6
+"úÈ\1f#B1mv\eS\ 6Ç(ÀðpK\881£C\96\94i\ f\82öiì\127àh:Z\ayþT1Ù¡ÖW\9fÔ\15G\1fíÏ\eûFN¬~9#I)ÂÔmþà­¤Õ­:(\95\9bJ?\87Úe\æÔé\11´¶ÞO
+\ f\11úÞ©e\86\95År\89½Q0\ 2÷µw\e¬§\b»ú0îÄ\8dös@²à\0?å©û8#|\ f\87Ð]\8dºê\84¦F_:\1f\13¶å\15ű ±Å\ 1\83HT\9b$ü#\9c\1aþ©ø\8a\14ö@êN¦ÞUctâAëÁ\ 2\930    Ñ\1a\9e~Aq¾\v&dàN9\14BþDÃkòË\9a\b²5­\9f\10[\98¼\99\88#\84ÿì£É@ûÃ\ 6/A\vûwÈ\91f¥âBÒ\9a\8c\84\89\1d]çV7lí\ 4\11Ϫ\98Ë\9eM s)e¹ö8$Ý\94=Ý07\11"\9c4\86ìê}0\86)2|\10\1c\13\14h\9cÒ³-®²\94Î<>Ò\90\ 1#ÆÈkæ  \r;i\8eú\91-\83Rêr Ý­Ü\9c)\rÀÙS\1d_\82\89\82í¼ï<E\93\11_\9b¡\fËÁ9¬F|2\95\f¥\93 ÞÜv\e8ìHU®ÞÖ\83JP¢}\81kWBÿ·+ê:ª/\83¼À\9bÞ9\12*2>\97\8eÄ:\93­DÜ\93v\12\ 4ÏÉ$$hÍlY>^¤Üq\1elàGº\80ýöD`º8é\1aß\92Un?ÕWÞ\ e0\80+¦ü¸dÛOöhÞ®\8ft\95t]\f\8cÆ\11ôç\8bLÜÅ0Ð\b®÷Â\?bSh¢KÞq\82\98\197$\10\84W\15\vÈ    ºAé\\91ë\aÆàYKÑ#\8fH V\\15sÛØ\1aÕ\8e\8bã\ fHy\ 1\9cئr\1aî5Óá}ÎâÁ¡\94.²X-ª/¬¥>Ä\90*®rÔÙ\\93\1f\1eÊLÆQ\84²ÒÄ@=d¿§Ð7\98¦~l¦(ɺoâ/ Ç\7fxL& D¤ãÙàEk>ä\ 5\ eA:\1fªùtÜ\90ÕßÛ]ýÚnÛ  ´¿H\8c
+%.Ov8N{!Hômÿ­\83äùJ \ 1    \1fµnλ\7f¥L\9bÊ"\90\9bÖE=\`«Á?ËH\e¦\9fJѸÖ:>t¾á\97\ 4$^\85\ 4YZb\19®S\ 1{6\9c\18\0?\896Äç\0;r0â2Ý˶YØÐuç\88¥ð±ê#PÙ\ 2«÷»\a\a\17~K*\8aa÷Æv\94:ð    \9cå\97W\99\84±HóÌ\1c\ 2¶Ç0bÕ\81\ 52\92\12\833[Âìz\9f8\12ÍÛ1ó4pu\90éüÏ\ 4¯ÁÄþ$Äî»(l+ò\99c\16ÒR°FpËCý[\ 5\10fX¶Oý7`¸ãZXó&z\1e ;é¦ýÙ9\ 6nR\83¢YÄÂäü\9e\91\ 2!^|¬{\8a¼cß·¸÷Sâ\ 5Çak`\82\80`y\ 6ʶ\82IÞ$ò/2{\85DY6;o/\9a\8aùa\rÂv\ 5!9§\ e\95Ó3\ f\1dþ\ 3y5;¨\ 6Aö60ùÓ§y¾'èW\14l|§\9d\r\13\17\10\82\83Kw)\11\9b\971\ f\876\E\\1e\99WÖ§\88\ 4öë\14¥-)-å\1fv¾G\8aD°ÚóÐj\9añÞ9N\8c\13Ù´Ì\fU\9f\8e\82wÁKHE\88\85\88\8c\92N\13\1aÊÃË\9cÓÍ/yù\ f«\82\15¸Üø?È}Ü>¶}e\893\8b\9fFÈ©Ýö\8d(± \ f,¹{¨#\89Ö\8e;Ùä\ f\89B\8e\9eA\16Y?\97EQúël5 a¡C`<\1e\1dà÷  ,\9ae»k\1an\ 1oK\98\ 57\82m\eý\ 4÷J\81M´<E\ 6¡\7fÞÃ\9cZ\8fÎ\10\18à`£Ö\99\ 1ÂË\95Þ\1eFu\90\860\86)!\8f\87\8bMkþ\82(F¿¸±á\86w\ 4Ù\ 66ÅÕæ\8bò\ f´\0\97\88±ãÐ\ 1    ZCYø\8ef>\ 3µýXQ\9bçå\8eÍѯL\7føeÊ\9dmº­7\ fùÅ®\ 1\ 1DóØ/Wmü¸¨,álÌ\f_\18%ã#ܤå\14Ö\87\86ù\86ÕÚß°\9bE®\5w\16\84d\8do\8bùÜc\95!î¡r\ 3?­tGæÝó\96Ö:¼\90æþ¾ëA¾{!Q\9fS\17$CZ+É}7\81\9f\b\88i\13º0i@\85\95Aô´³\88¤'\91\ 4\16\ 3\b¹oO\93\19}}o|!áÒQþÀ9'7wÓ¯\ 1éQ\19      \1fèPäÅ\9bN!þ:ª\ 1þÓövuÌ~%áº\19ÕÄ2·ÐÀ¬n\87pw\10\8e¾À\ 2\16\rëPa߯޲Åw½H>§\80ê\9b½²æõG\953t\18çn?\8a\8d@\93¹µ[í>¢Ù\18ðqÅZÆíK^Ö#\9b`Yê\97W>'2ܦÚ\ fygºìH\ 6®")F\8e\8c®°\18\13|¿\b\9a#j\11ÜðÎ#qúàáDG\ 2úàâ¨ñú\f\eî\fFZ\¥7°\ 2\rÉ\12c{I,\9cïìÒ§5\f
+=áþyHÏ\92¥qw;ı%\98\97r©©Ö'\1c\0:CY|¤e\85Rܽ\80¼;¬\1cYv·ÔZ>^ÏkfÞª\1eÁ~\98V2ð\13\19C#©1v]´\90\ f\97Q*\81ïbññ:²\9d\9fpr5]Ö{\1eÙË\95ÇÙ\16\13uíÅ\7f(Bà\1cwû³\rø\95\aL:´a*¹Æ\82å©É@ZÚÍ¿Á\13g-*Om\9c\102qñÌýÓÚË\96 å³\rlNBÌoÊ\85zÛñ\1cw\9e»xÿYdΡn\ 4ó\19*~ÎÝ\fr=Æ\1c$³¨Oļ\ 5ø
+Iò§ë%å\15\95\89\86t4\88\15
+dº\9e­}Z\9a0/Ï\8d@:\ eÆ\89\16\10\a+v\80Ú\94\12£ÍuT\ 1\8a×\9eÔô\19¡È\80Ã_\88¤»úÝ+\ f\9fÎ¥Æ\10\93à\9cÙ\ 3í\8a8VB J5u\fM\85¤|äU\0´\9f\ 1\16\91\9fì\95\84¨\99vXÕ#\9e\9c\ fy4¼+\9f\1eÅ\97©\170½ð\ 39ÖO\91Q¢^Dß?ÇSHØWË\9e¾\92Èo±Ý\8f'¦o\95À\ 2\13©0\9aÚ×ÉM\ 5Z¥yB\92Ñ\\96\89èÄ\89Ã\8a8¨Ò\97ÏDÒaá\80²\8a¢§'eò\ 3ö]Öl"\91\ 2\13%«µà\ 5/#\9b»<Pb\96\14°S®\8c
+\18¸ø½ï1*b\ 5\1cÕÒ&_\96\vGô¤\9ac\89\94zJUû\88\89´[¯CA\81bËÏóY\ 4\rè´ªµ[\879Äü,9í+gæ\10Um\92ö\8e \83\b\ ft?mÃǼ¨ÒÓ\11L\80`\85\8eÆ\ 5T¨Ò@1ä ò¡ØÒ7dLÐr³\ e[È{\10 \97\ f\ e\8c\1d\9bw\7f_âÃ]\\bõ\16\ e¬¶þ\8bgDoJS\7fºáÍêS\13'ýÓµ±6UpEIæ®þk\80DÌü35Ld\10ìw/.ß\8e&ÃaóÝäö¹\0ÃÍ\80\90¿-ø\96ð\a?á§d\9eÜ\80é´P¥n\91Ý>Ø]UöÖkY!ç\82Ë\9a¸Ô\9cn²>¢D-ÿ\eQb\7f\15êxÑ{tolRï\81ø\ 5êõF\90\10ÑAãFa\11*&\7fªCè\16\9e[\8f\\1fmzV£\rsö&\91õ%r§&\1f&\97\91\ f\93\85\96³6\99En/\81\1dÂ\v\8a\13'\19úÖ½
+Bf-±~vX\1a·|ÔJ\93,\8cº@MÞÜ\95;:\9c\90 ¨èL­5ÎW\9fTHã
\9fAË6Um\ 3Ë¢\1e¸tã\85\1fLÆtÙ)ßçR~£\12\95±Úõ~\84Ñ0úË\1eæá #\1aM5ut\9c\12@×P\7fÊOÕ«døÛB\ 6\a\7f9ÜXÕ\9eãÖDªòq\14ÀÂ\1eçLÔ"·]9\aîË\9cü¦§7·]^[\99±\ 5\d´\17¬SNì:/¸ÌÊÿ*\85\ 4¯F]mÜ\99\8e§\96\88äº-
+\1eÅïn   \8f\ fX^ÁÓ\12\87
+\95~Ee\85¼\12T1ëH®\9eö$\eJfë#\rg*©Fß\\93Bɹå+±ó\ 6Ã=»\17ýCpÓ\91þpu!É9´Û0,\r_HË~Gr\91ÄL¿(Øî\1d\82Ì\1aø¤R\aíÜÐ\87R#s\83\10ò1\ eѲ\95 \1fÌè=\13bz7+½§ÉÃ`^Ê¥Àª:«¤Q\98Ø<\9c\90YäÆ\17%\98F²ýê'êúG\ 1\976É°Ái(;lD»Æþ§rõÅkðÕÛ\8e"^C$ CL¿ÏM\14l\93'\8c9eg\8a¾³}$\145\ f>|\8c˱ÿÁ\99âq\95\1e\8e1¢Ãà£û䤶\16\16v\96J\1du\9f\8ccAþÅ®\90\82\8d\17Gn\8fmsS\87Éã\97\95­ÅiR\1c\95´\90V\99ëY\ f5\92\9b\ 6e\1dÍëÙO\b\8dU\bóï\90²nö\1f\99eQx;Èi´Ï]¢5_\a\ 5\1dÚ2¶±14.+b°»MI\93\ÄJ4ýa\12Øá5\99Iv¯lú\9eß¹r ¹úç\87\18þd\9f%Þã`ëZtã ø\1eùý\9bbº#\e\12\90 ´¼6\8fî.aÏ\ 2\9a\83\9dØáÞEzm©Ë\99]\87\8aÄàã\16Z\f\15l\ 5Ó\ 6fssOýµ`Û¬\e\12n^K\8bµí\8ffÕ~\8c&      Ç[(\9dSî·\9a¤â\87_i=:#Ì£µoÞ\8bK§x\97¤ÄáOì\ 4Çþ~A\81Uxáy\86k\92=g\ 5¿\ f>\11¹\13\v\9f\93*\eÇ*Ñ\ 6î\1d\8aãÌ~ª¼¡ÝoK¤÷îè\84\b©:ø\á0U$\15?È^ÿ1q\ 45\1eñ\8cÝg\8dAqg4+[c/ÆoÎ;¨\1c5TõC=\rÃ@\88\1eøæ2º¢]¿±\82íy\9aú\11c\8fWy\85\84èYY <æàIÔ\18d\8dur¿z´äjÚÖÙÀ|>ôîµØn½\166&\97ËCÛô\1e\1d\87Ø\1dÇ\82\18\1d¡úZ\ 1L\98òsäWC +!;.èô\9b|9\ 2\8dÚÃÓz¤ \1e\18¼Ó5ÿY\ eµ»|!ä«|\17ÅÞ&Îa`Pï\92^éD\19\8eã\8a\b´W
+ÿ£\93{¯0\82J\1eæ\8cÅ$É2]Tõ\91$H8Âåu\10N¼XM\81d\ 2Dz\a¦\19XæÕéÆË\90ÄMÏ"\ ft\17V=¡j½°æ%~\8caXnTmôbé\13D=l\84\12Dgá¯\14O\9c\91\ 2\974SóH ¤¾3Á°Ý\ 6\16[ýWâ
+áªl2ÁuÐëöQ\1d6:\8b\ fjI\94\86Æp\82¤\83À\1cnÙôÏyà\Í\11BÉÈżÊõ     ¦`øjdÝr?\r7@tµÍ\0Ý\81ÿ\14\84\r"\96õ\13\11ÃN8\8c¢í*\99\8c\9cª\8ag\12\e\ 5Í\17\ e®&ÌÕ\10á\1fNi  û¶jW¯nTºÓºÈ½ì\8b\95õ»¬Q\15°Q\8bÍ¡ò\1d!%y\8bÓ²\89\95.    ßxç×\9b\91\få¹É\11\ 6\8c"Ñ'÷`3\1dxp\97·¯Rl\19\99\9c=äê\ e\92\8f¤\8aJ ì\86]ʱû\1ff_5|\8d_*¹Ù<Ũ\9b\1e\12^shЧvÀ\b×88s\86e\ 6\9aä\12tòÆ\f\91ð9æ\1aµGjñ·ð\13§ÜT<B¬äÒâ»\9bÇ&\9c\ fÊi\ 5Â\99¢Òi¶È\f¢Ù\8b²­ú\ 2\8búÃ\11é!¹ó&c°c\90\1eÏP°Oª3\91÷h* \9aðè\18.E7÷\16\15ð̲pM¼³-¥^\9e\9a'"z\87©\8c¬'2l\18\v\8c¿n)´T0@\93\ 1¾ob{¬d¡ÑìÝX      m¼.ýlïQ\9cmmi\ 5%\15Áú0\11\93»p\9cF<pwê~÷$ÜóõÄEYk§î\1e9Çæã\1a\84È\eÒ:Z8ý\0FÚ®cë³ûm\19jF\fäw¯¤\ 1e\81l¸ðð\ 6ù9\83\99'f\ 4ßÐ\ 2y\ 2v¬â±£{x_'F°A\9aÚw=\1c\8c\9d¤LÂ\15%i\9f\94H\17\895æÆÄ\ 2rT\91\97ËRfÃ\94\a?©LÊ&¥îP\19À\15\a­ªßV\12^Ürpw\9c\ek
+\8dP|Wr\v\93\bÛè(\82d\98\17ls\88%x$F·\98î\95$4`\ 5Òi\11\98zP4\17îÎR !\8a\ 5í-%¬þ¼\eBÎKÿ\17£÷Aµ\8d\95/Ý¢o\f&=÷øI\97Ix=4zÿî´E#ÃØ\89ùùU9¶ºvE=Ã\8aiâè¡?-}\17KU'ÜÏi\1ffÔ}'\võ*ô\1fìI£\89mÓ©~~=Éó\83>dÆbXEWØÚe\19\8bK\ 4¯.S\11ë\a~\96Í\ 4\ f\96\1c\9dÍ8 G[Èq®\8f(ñë\184àÕÒ\ 1G\80\ 3ó¹IuO'ú\ f\13210£èç}\8d\ÃZ=ep%ש\1dT\90Ê\ 2ð\12§lI)²/Ó\8bÉI¢3\12Wb1%è\ 5ª\98õä°\86\8c½öS   ¸\8eà»ïå\9c×[\1a\9b\84\8a´{q\vO3ï7ܨ°.|G§Ý"õ9o{\83\ 6\ 5êÞIXWw\8b/=¢\8cÚZíÂÚ%Ë\1dn\ 6\9b\ 2LÜÉáUx¸0úH\9b(N\92\93e\91SK¤ó}o\8f­g\16ú \89>ú?¦²ÀèS\90¿s\9eA\81Í#Ò{"ì$Øêêíy¸\94W\93\1c\80\88Ñ\93`^=\8f
+/\93<(ð\96\e­·\9b\84j{²J\reºÆ¤@¡ðo¬\ e\e\ e~\1eü@\ fè'i9gEi(0È0¥*ÎNß)í\ f\89\14ò\e\9d³§p¿å\8f\97\90\ 4-\ 3EÌÀ\9b\ e\13ù²-´tûhs\0gÎÃoÜÚ+\86`\10£\17µ­ÈÒFcoYý>[#\ 2Þ\8aÎúmÄÄ{ÎÁâlNá\7f\91\9fS\15¿Â\91|\8b\8eÝ\9aÈ\vâöÈ9É\9e\Âí²"Ô¦¤OFñ\86Ä\f4\eH\1aè\86\fr]¹ÀqÌÄêàÒ\989öå\7f[=yÙ^£É\87\9bÕ\14\87¦W\13\99ÐÑ\87BElúâ&¨Ï(æè\0V#µÏ\13<¾¸?ÉOl\ 2Õ\19\99ü(ýÝ\85\1au%\90ñÛ\16jÂËq$\9f_\8d| ¨2fæZ«'\83Ì}ÑÈ2"     ²ëÞÔÔLÂKj¥ÍßB\96\90RO\18\1eÛF;Gç\ 2Ä&\8cÕIUåêqQ\974¥F3­\93\9bf\ 3\1eÜÉ8îv¾W»\90G f\95\99±éÈT\9cQ5\ 3\87i\95Ѹ:Õ\86\7f\\8b\ 6%1ü\f\1f£\18\ f\ 3û\ eçMÀwÒTjÆ\1e\92 \8b^F*Y/$Sw\95ú\11E³LðtmY\12õ{¼Qa\95%øÇ\ 5\9aФ.&ÅW\91V¥&ʯ\ 2Â,Hùw´¥KOCxÁò!µVÜ\94Þ\17\18ù\10S±fp1.¥v\85\11\ 6²º\96?6m\92á½\ 5<â*0\9cÛ¼\9dÆÙ\15\e.Ê·ï¿\878»Lº\86ÉØ\ 2\19uu\r\16Ik\9fw\ e?Y/\7f>#Ã\82ùh\16\0ö\86&õ=H\b]i!\92á\ 3«í\18£åƧMYâ\8e\ 2'ääÑêÓQ\86    øk_ØE\f\83i¹XP~»äS¬\96\ 6Q\8c\04Bq2ýa\ 5\82\85\12§\ 1T:=\86      \ 1¹#~\87\11r\89?ôX÷  \10ôMs\9d^á-\8cE\1f:¦õ¯¦Ï©½29©u¡ÇÑú¿5Ë0f `\1fï­xó¾\13I,9!=Ê-\v~v\1c¶9^1²ãç8\98__\12E$\14\8c÷ÃÏy=\889vÜÆ«ÖAfºP¡(zl(nh¨\97xf¡JÂI`ÐAEø\11§±-¿.á<ó\ 1\81(Säþ\ e        .ô~T`Å[UÞÚ»ó\ 2\13\94rX&ë\f\84,mú\9dÂ\ 3\10i¸QE³\r\81Þ=\96\ 6Gü­pü\8a\87y\8dËUÅû<±\1cï\8e)8Ìí\9c\85\18O\ ej6 Y\ 1®sð\96\88\9cæ\8a3àÃ\ eÝ\9bc¶\95\1dC
+Jh­ÚXÆ\97j\93Mj[\ 4  Õ¶\9a\83È2|5z3R\96:ÒªR-§½íÒ-iqW6\8a)\7fI ß²~À\85\1c\0ÕÜÛñ\v¾­*\1f[ÎëPú\16¬Ïg\13q¯qÅ\11ît$K~ò\97¬¾»ò\ 2\8d\8dâ   ?Ii\\9bVÀ¨H­Jâ[l·R¾\rR .\ 4\86×\89\1c\8d\ 4\89O\ 3Úú\1eS$\97=ºWBÔb]øKÇ5V     kàÚb×!©´\98\88!³ä36~h\94ÍòÄí$µ\937\bÖdû\r\15I\94ù\97\18\9bî*o¤ºhLfm«¤\88Þ\91\f\ 2O7\94óÓ3Yë4A\95'GA\89\98½\18]¡OÉø2º}ñNo\13\8f\82\v1kôA\9e\95²o\ 3\aÄà«ðd,\8aÐ\e\19Ö\ e*).\ f]#Òíö2Öò3õÅR :Ü+É[ ^8,\93^
+±Pï|ÙÂ.x~6\8e\8aÑ4\9fÆ«\ e¨±È§8¥Rd\19ç@)õg£¬\12¦nˤ\1eòE     TfÍ\90\ 4wÒèÃüÕx78dMóáiHäNe˵qXÑ\88ã²ÏÆ
\81K    I\9fè$é\8bú¾\94M      Ô8fN\10\99ÅcµdR\83Ø,¼RSRS­×\97ê'\9eí\14ç\9a}\14ð(\v\ fá\9es\1aýàBQuÜ\8e\1dU~bQ\9eí\ f°i\8f\1eëg¥{߯âDÄ8Ù\13\83>4dï\v=ôÛéË/\10¶y÷9bºìÁnK\88B\83×ä\13Õ0îÒ÷        \11âO\1aXì·ä\12rï¥\fJVæ-¢út6)ë1è\85D\9aáS\7f²\88ªp
\9d!dðQË|á5¶P.\91\15\14©.c«K\7fÿÅ~TT^$\93¢LâÆ\9fZ\eO@Z\8bðâ\f\9b-eÔÔû5\88[\1c\8f\e\84T\f\8b\9c\ 4·DøÍ\ 2\02¶N\9bôû¦\8c\8a\99×\82G\1cAëý\92!KT>ºÂ¼\10l\13þÉÓ?rm(zì}÷(Rjά>Ã\13\93ø;\9dNPÅ>\8b´
+f+E#\83r\91\82Ðåн\89?¹I}}\11\ 4Ç\83o¶ûúÍ<"\f\19Ë®/\fLÐQ9dü\82æN(\896öº\11\93\9b\11^\8fW\ f¥\11\82'áûÜ°*_\ 5\7fVôÏ\9b\8f2w×ŶrBHd6ô\7fQw\1dA     3|\ 2Áh »\9c\eç(Þ¨ÌìêÚA±É\8fîh'\84/æ˦;\ 4b\99Õ:-$1ÙÜ¥D\ 2àmÉG\135I«\1d¥P\ 1\1dõzxß\1dÆÂ&9Ç\92¡Ú­H\18\11\1aì\ 6    )*`½¹\ 5¨ì\94\92ÖÆ \80\1fÒ\7fzu6\18\ 4öcª7\86W    \84I½@ZÇ¿©\18\1d<%\14#ß%¸\ 1µS+8\?äAì\85ª)(ò%M\15ü\ f\11\87yfe\99\9c/³EP»Ô\11#\13\88kçã\ e\7fÔ¬ðõǾ?µñèåÙ\99Î?õ\17æm0\8b¡3ëjÞVg\16ßc\82F\17\ 6×ùN\81\1dã)¥Ô¡\1f<Ó¹T³/!®ky\1dDdf\b{"?,#Ì6\85\ 5`\0#\f¼\80\7f3t\9d¦®\9bg\9dè\19!\17\97ÉÁ\ 4\8d\9b(!æ\18;-REr\ 3\87\0Û\94Äÿ \8a¾Ä\91ì\8b\1fu©y\187t\91\12ÓEæ Ñ¥àtÔ\97åÕ\9bÂXGU¹éÒûðz`\10GI¢\9e\8eÆs½ª\ 4+¯@MøIud"V\f^[j\18(u\8d.\92\ fOoä\112\19!Ju`Ô§o\ 4\1a#\17\90xA\10Øk¬GYK\97w\r\e¯ã}çè\1cÙ6åJ\86&¾h\85P\16Sã\ê\95a­!óYH\8eã©õ\89Q\83äqº\8c§\r3\1eiU@Ë÷;Ä^à²ä\ 21R8Ëa¸[¡lL&ëå&ʶ&]±\9b\8c\8aH\eô\91B\1f#쪫
+«É(¡\9cû\93D\vÓæÌ{\9aÖ\ 1\9b0v \99¯¤ÁNLÔì\ e^\8aͨ\ 5\91þ\1aª_çW¶Ou<\88¦´\rÇ:Ro¨\13C9&°îËé\9d4\85Ò\85Ny94ÏS¤F\97\93\8f7ßP\8dæ\10\89sYa4o\95\ 2þC8*Á\1cú\9bP\ 4\ fkc]pF\92\17èi RÓÁ$\8dø0øÚ¢qÁ³\85§\85\ 4\92â\13ǵm£©ôx±¼¹¶°\8cìmËòÔ\ 45¤"Ø\11r©¬ÁZåæD-Q\17]:ð\1fò¤\eYß4cQ<b±¦
+\9b\12mE4³ûÖ×U\10ÿ\a\ 6B\15\ 3\82þaÍñ\9d\140\r\8a\93lÂXÜ^Ýá'{¨]
+,\11­S\12/¶        \a¹{\1dH:\9dgQ¢\ 4k2ò\16ñ¢Þâ\9eÄÚ:v®Gíw¥\14ß0'8Ë\93åh<Z(\82>I\8bòÆ\85ÖëÁy\19ó ã        n²      =ð\vmÊ6ü¼)\ 2JØ@b°r\89¤\1aÒê_Oì\ e\10\ 2Ë\8e;tY        æ¿DÒ\84¾<¼\8a\ 4q®ºÇJ\b\8cs\1aúå{böLý\12\11³Ý£ÂÆ_ò\8d:)ýË\9a\90VÏÆ\ 1
+ÅÙ°Ë·¾·C@\ 2~8¨·c¿ð·¹òýy;\83\16£´\95ðTã\0\\89ò\9e
+\807^ÊÝP\14\86µdN#IV\Ñ\96\16\97Ú\82ÄGÚ\1f¾±½\14`\ 1\93º\8f¿ø\96tpxR«x:\18m|Ë"\85\f_\1f\e
+\b³7ª_98­C­(ë{aKlxÇtà\8cGBÎÑ~ßl\rçó\9e)æìi°A,séÀ\ 4_\98\7f¡{2ù£\8eA=ão/bÍS\\f\9bJs\8a9dÝ3\8aëÞÊ@Ü\1f%?i¦'bÛµ#KNåÔ\1dË`}c`9\ 1­s\1dã´\90ÆüáÒz¤\88k}\98cËf%\8a©4mä\17í\88\18ÍAðÒ·IÞÂéZ\99«,xÈß\8b(\9bÈ"áà(m\89Â×'e¡$\rã\8e&æò\1fÍjõ¬³Æ_ YÊ\95o,\1e\9fR:\11\92XmêGΧå\1a\e\98,\ 1\1c¹IöÚoÄÝ\82©\16\9b\8a2ìCÒ!V\88xÿlÚ$S¸Îï\877\ f³\1aÖíÖbQ/\17§|\86[2ÉV>ó\1e\ eK¯æýÞ-L\12áÊÃg\f%yÿ$6\17zðaGJ§f0XÁ§)ûÕ¦<\1cnûË\ 1ÄìkÕ²¹ÖÏê>T'\ 5BÆ_¾Ç[\ 5]Á²\ fçlJ¾s\\88 \12ß\12ä¼hÝ+®×+ßí`Ì0ÕÕ½\93;ÓÙyá!¶\84FäD>ðÏý[\86@¯?Dàù¥ÅIØ{þÞ×\83DãUJ\16+\ 4À1\8f\1c\92\15\9e/¬:/N\ fu
+}K\vIFÖ\86\81ßê¹\92à³È\vÕ\vÇT\1anÞ÷<ölQ\1a¢ÙÐyy\8b\87ë)D¢UÎpÄÞ¦Ú²©\12lfyKf°xàM»{½J¶ÞJNNtD ó`Ö\88Wj5ið\ 3L+mlâi\7fÜ\7f\97Ê»+Z\93.\rÊ\9cåw\8f´è&\14\7f=  õ&H\10\ 2ç\87Ó\1aæêp[§TÎ\19óGÆ\176ÔØÝ@»­õR9Jd`«Óf\84\ 5¢¯¦F?Ý\95(ækj*:ö8&äç\15ç\aÂí\8cdE\¼ê×Ý\18¨e\97\91{ "W~n[\11ævÉÏqö~-\19¥\19Ëh\82iok\90$¾ÍGò¾<ßäéE©lÃ#\18Øn"ÇØ|'®qÿJa{ñõ\95DmÍÅÙ\e)÷+gHâ\8bGaÍô:\akLwÄ9 ,îÉ*H&ø<\8c\86öuýV\vÂÄÕÙ«¹»^ÊÛ\8f4O\8erààñv\81myì¤+\ 3»g/Î2·ä[`\9e\ f#^ý¾´Ô\87\8b\ 5\16MV*éØÈaô\e4\90ƽ\82§ÔÒ¼qh\ 2:¾zr$½oàÈÔ8B¨Ä\97Â\16y/ëÞ\ 3Ü'I\ 2\1a\95\1fUs\80:\89\ÕÞ)éi~\7f}²fú\11\85\13Ü\16¥\9e\95¶"7Wô\v¹\99\8f°$þ\8b©Ë;\83×\aûC\bñ_0\ 6\ 5Ð\94\ 1\94qÌdYý@ß[Îèx\14c0ú*&q(à4\11\8d$\ 4\9ds\fêF\98Kf\91ë\1c»\8eÒ¼\8eÄ7yüÆß¿Ep¹;¶7-JöϾ~m÷_\ 4l[¹½S¡\a\ 5þ\8cQ\ 6£\9a"1\1e\19\98ÁN»\8b\80\85-\11ªJÑ»à\ví³t>øµÐâÂ\81\88\18­\85ùnÝ«\0\eåÐx\95µW\bñÕ\ e½ê\8f\ 4ñ)toÿåÐ\89¢fmÀó q\9b\90óêL©Ò\14ÔY]Ðý\83\99\ 2+q¼½EW_Xhö¡\8d­\9a\+Á\0´\87\15}\98T\87iKs\86¯¶ç\90\b§ùz1~Q\r\10\9b\ 6´naïDl\8djû©\96\9e\9bÒ
+ÈK=\\9dbÉY×ÕË"\95\8aÉ\12PâËÀ\8càe\85K\11 1HÒ QSº°×Axíâ=n°Ø\94\8ef; \ 5eB^\17Ã׶Ý\a^\f\9b\e\12fG̬3~ùLuG28ÏÆ\97JRxÛh[Ç\ 1üV.Ù\fã2\0ðÝ\1c\95\92Ôô"\vãÅ\9f\8b\88gTM-\\828t¯ùì\82*\ 1\92þ\95Y.:\16Ût X[g     #ÄQ5{\1c¬Bb\96\92E\ 1¯YÔ/¸4\9dÇÚ\87Û¹yg\88Bm\19\93\8f­gÃ=\ f½ywÖö\v\97ïCñê\17Z\9c \9e^ÙlÀªælðúi%\15\9aY\1cð8XR\81êp_\ 2 N+E¸à®[\90\8d\90Á¸~\84½\82`4ÚÊ\1e\ eîQ8\13\91\1ea\9cDÉÂ=ç­\10h2ë\82Ð8\17Â¥ô\8eqÔýÜäÜ\18èLQ\81×#\ 2¥}r\80³¹\86Æ¡ÌgýK\16\95\81Oxi8\14Ñwf\86\rÃ&mz\82½\8c(\18fò3Á¦\1d\91á×Ï\97РC\87:ÿÏWW¢\11yÃ|
+U|D%nÍ \86«\0U²9WmþA\1a\aí\1a¢\0ëök\84²!\97ü\96qÏ?yÃÔu'o·Ï\9b"ÅÜ8"\1fé«\16/ªiÛ\ 5'=:¶\r\8d*"ZÊÒH(ïf\85Mï0KI\9a\9b#\8bf°!ã£\ 2ä\96E\ 2Ú\ 1Ó2ÚÓ\vÕ{\ 6Kü4doÉÜ\8f>\98M\8càA½y\99\18úehPxW[ý¥r\14\1e\1d \ 3òyä¨\C\9c6\98V4 =z\eÙ¦E\7fÊù9\86­º¯#$\ e{\85Ê\94ñO»\ 3Xeêt[#$^ÚÔ\9aSó¹ÜÉ>@Úô\eeIÊ·¡m\8e\8fS\14ó\93"ü»\95~A&çð\9e\95Q\1d\8b©¥j\13Çêd\8bL ãÔ#Pð\92R}\9b\86ÑÔ­i)\10\82Ì;\12Íó Ûb\ eØ;\11\ fg\v\996d\1a\r\1d\89ø\83áz ~\19\92C\11\18þ´"\11ò\95\rÕ\19\ 5
+\Ä\95ÿ\ 4\1aLtÈ\a\ 3ÐXD4d\12Æ\98oz¢7%Xº)S
+Za\8a\ 1?\1cÈHW«\e0\19Q\ 2W\eÙ&\81Ð\87Øõ&\f©;\riO!\13§|ï\1d2\8e\97\9b\82Âÿ°S0\ 5r^µ\8d\16\ 1Û\agtÔÎ\0\b\1d%­zW_\9aåÓ\10 s"k\ f{\85ò¸Àt\87ß\88f©Ê\18\8cÊÇÌ\17ÈNb¥T\88ä\91\7fà\15h2Í.®\0OÌ@@³=+(hŤ7N\85}\8c\9cr\ 2 t\8b\17ã\8d\9aV6?\86\18Çq¡à&¿2\94HüY^\1c¶@1\10\87ÉLVèy9ÃRS~f\91\ 3vMuÛ50ÉLôJÉ\7f\14õ\9f+¸Å\96[\9c\ 5¾{n\81vK¬':-G\9a,âÚJÿÞ\ 4ºóÖíÐ\80Y\e[]\0küT\9et\ 5\12î·µe«YÃ9\88Îö©ôQG\89x)m¯ä±óØ\87Z        5{`]â]ÕÞT¹è?\1e   úÉ\85&dâ\85C\93D_u8xt§|)ïQ\98׺MO\r\95Æ)\18mËvwK\8d\9e½\ 4CÞ¸éb\82Þæ
+\95\86y\0\19pvû\8e¿»A\9bU;ç6\1eÀm\90×|8\8bè\96\1a#\84]uÎvõ\10\bþè\93\1aß{Ã+v`¯ \18\9a\97+ØP\ 1\r²'p\89­IâW\fM]\87\1f\80\14ÊØ-¬f6}ap·FýÐ\83\80ÁÁG\9eóò\94\15\95\b\14Ó\15\ 4[.k&QÍ&\1cê\9bjñ \\9a\18\ 6ÃË\15ð\91O\9f.®Y\8b#¤P\8e6®+q\8d\7f»¦\86§\981;\90\17àAQD?9\8dâù\8ad¥vnf?LK\85.ÑÂ?[Fw3¬\8d\96B7ÇÇÖ\ 6öÇçÑHâ^®Üf=´\90Ú\ 3¯\04~xÖs®\7f\9d/ó3\8e+\9f)\9bاHx|ÅBC,Â\82F\ 5ª¬\90{æ·\84A0pÁB¤Sr\ 4ͺ%hI\ 2N\9bòÅ\99à\19V\1ea\7fÐy]²G\8eæênh^2°4ÿ`l·Q2Æ\0\93\ 6ï[ú\ 4ì\ 6tx\e%3±\13^9GG³\10\92nîw>\v©\7fÕRãùm\94¸Jê~\8f\84ÃdÊ\80è\10êØ\9a«\0e)U\90p\ 3²)÷=èJÏ\8fX\8aæþ\97r1I×\13Ø\ 6\vºéC¤è\90)¸7§c­±;.;òNø\r\9e\99\ 2\8dä\94úõ:\89\87Üö~Åè[×ú\10)°Ç·g> \93E. \vHKä\ 3 \r\93\aC¢&­Æ^ð\94\15e\97©Õ»û\14\e÷\98©\8e\835\ 6Ô»õÂ\15iL×\9f\13
+Là^ ¨!\bsª»÷Fqñ.Èô¦\1a\v«M\84O<[×L\ 2¢@\ 3ÅÊ\¿O\1f²U\85z%W^&ë\96ÀLG¾Î¹Õ]_ß¼(¿t=\87æv\ 5Mßlm?ðf\15¬7WÐÂÑ/c¥»¿´\16pµP\ 1­sïÐg­'ïÇ6hR\ag\eÁÍ«\8b\7fâ[\80\ 3-E0Ú\9eÌ@·>\8b\8e\11÷°-a\10Ñ\1c\95$e\1a\95Ã,     R\16l/\ 2Æ\86\8f<ÑwXôÖ°³s\81³½fj}W\ 3\9bÕ×\91Xúù\10Õ\ fD<dsñ\85â.eQr¬\8f׺!ý%­\93\93Z­ï\16ɶ7\8eÆì
+\9feÊf5\83\bÕ!ktXFru$\98\90$èw=²kõ\9fß\87a)D\81±vV\86Çüõ§\10ª\9eíl\ 2Äôå+(j5Ä\89`\11²\86\96G|¡k     ÿPãBèR`\90\ 4fzv;FWÏxf\837\1a\99\rÙáü\84\9f\92ÂI\10}§ÍÐÙ¯ÚZÄ\ e\90\93\eà¤=X\80æ\ 57+ä\90\9a\11ØJ4\9cÚ|yÑê\f\88æ"T\8fR¡`\ 6}?Ñ3Þ\r\v\9dJóà`ZÖ\16(\ 1û1y\82Æ\87»:kf«\ 6\16f\95\ 1µ\91\ 3\865q«½Ä¸ÿnÂ¥\|}j;\95±v`\9al5\97óCÈê\8e\8cQEW;\ 27ÊPƧ´\ 3SØØýÛ¥Ú)\18trþU´\1e\1e=Å&Mäε^lCÕÃåût_TeþÓG4\91F.\9b¬Ba\82\86èôuÔÚ¤Z\92ÁqM\ 3_\90¶!Ñ\ 3¨\82Pìë¹Uó\b«¤ºÅ\10\9f@7í\85ó4\99 jü[×âR\8e@6¸\8a7*®\96\9dAy¼=ôÈ\aô\99bc\89\85ú\8a\91R.ë\ 3flÐÌeþí¹\19Ø\14\87\8e\9aå %nêE\9b\9fOÍ ê9{ñË3óø\93*eÒª\ f# y§\1f\vH5¼\8f\e3µÈì\96ÕB\94N\97â[\9dÕ,Etù\98O\1cì§râ\9cïò|\15^\ 2¨U¬Pb.       \ eåv¶(i.yð\1c=¸lpM\871ghõY\17«î\8cÊy<×!e²\04Ê!g\92ü\80Aú'LÂì\ï:\ 3\rê¢Ò4é5ûó°¶=\82\02âg&ËR  £÷åÕ)!Gø\aµ\8dH@9Ñ2\þÐ=\83Xy.).{j\19\ f\8d×Y3uLbS\96ÄZºLûkr¬8Ôi      \80Ô;Znïw¯\ 3 \9f\9a¼¸~\8b¾n\19Í\9fP\nÂüÏ¢>\ÞPVB\83wdvîli\1e÷E\ 3§Ë¢\11\96ýve\1e=[¯]I½a\85Tô"sÕ)\19t¤¯&µ:øÑËÝ\9aÊ©ur¼;̾ÉF5B\»\91Ù·ó|EÉ+Àí\9e®\89/¬p5õ\85Y2\17\ 5\ 5Ï\95Ñ\9c˧Ðzã¨Ôæäñ\ 2êt\³O¹\12Âä\8f#%N\7f¦\95o\98мb9\7fVòËÏ\92T\9c#·¼\ 2lÚV\8b÷\1d)\81èÓpöÔl\v\88\12ûs\94\1cÛ\8cþ¡ÛÉèEq\9f\83Ð9´à¨ùÄc\9f­
+\96bÓÆBcè-\0ÞÞlát³ÄAá\ e.åYh}¦yò\f\92!RÛC-b¾9\89¦þ:\82\9eÏÄQZúõ¸\92\84Z#\96\88\1d£\9fI\19ÿ"_0Y\84¥Þ\82õºÕDví&\8cçk2~#ç\8f¨±²\ 5\7fs\1f\16Ó{Å/¥\94\96\a\99\82w\12\89\98\9f³ø{\97²\fyS¿®Óm\13 \a6]\1a<\83dÉú~k\85\87)(íÚù^fçRg\85ä\fݦ0$á\eâÍ0¹\9c\87\90b¾V\14ÏÞa\964\ e        ½çim\ 6²pýéu\8aÈb1\ fw«P¾ôå\8b\90M0$\1c\røT­\80¾bQ>\89ñ\16\9f¦\ 6£*>É\170*Áå±Xöd4}\9a\99Ü6\84Ò\9a_\81kÜ\Ôìg!Ê!s70À\9f\8c7dH#ºV÷\92\9c\9b³C\9ag\1d  B÷FVç\1c;ß<#fÈz\12ö4\881}µþA \87¿pÝmñ\ 6#\rö\81\8a\90ùaˬ\83\8eø´\87¹3ýø\1dlnayÜ´÷ÍQÆ(c\13¦nx<u\84«G\944\83\83]Õ»gÎþ\8alM\86Y\86\9eÓ*d»õM\ 2£\86\82ÿ¡æ¿]ÿ\9aÙ!1§¿§'\0¿B\92®ÝFc¿ÞÁ­ë\85p\97¬N\b9\97]~f¾\9f\12)>®?U\ 4¦ý»\fýk\12\´]b\18£Ö:$\81í\82[IisÚl÷X\99¬äÆ\9cÜ\17\18X\12\88\8d\80Úå\\81³þ8\19\\87¹SÌíR\ 4ÍÆ×\9d^Hþ\99owï¨\14íǺ\1eC\ 4vp®b3Q^>äâ\90nÁ¡Ç=]W77Zfbô\1f\81l ¯¯±¦Æ½V\9e«A9¹}ª'\0Ûµ±\90Î8]ä@âL\9fþÕ"\15\13\9e\13zJËÄû\9f=k6\96¶¿_ôÞ\f\9c²\ e\86AI2\8e\89Ëï\11¦êdö÷\bòÁx\970\8dþ\9f\1e¤ëTw¨Ü\1cú[ú¯\8býÑ\v\9boA£Õ\0L},ý©'¹L\13\8d»ü!}¯f\16}ZjçÅ\85\1a¬Ô*5y\9eßx\8c\15¿!`\88^\9d;\9c¸[%íâÅ¥\9b½â\9d?ò2µ\1aë%\88ö\85 JwÏ\8d¯;ÒÔ*\1dXN¢Ë\94&\ 6\8e?.\1fæþP&yõ]¤x@«ØQ~ Ü&\ fß]É\8f\13þQ\80æ\b\a\97êa©9Á
+FZÄ@¾½j LJM\ 5®æ\93ò\9cÂ\17«?\12\1eI\94\11Úr\ 3\ 67\10c8\aå\ 1\9fªºp\85ÿÞ\ 1§2ʸW¨rÈcÿhª\8eÛæ\8eáï9q\91Ð1\9dv\88ÁÁØÄÇ\8a\8bâ3\16Ú\9c\0
\12\9d\88Þ\92\18\9f «\9c[\19\12\89ÜÀ_KÌ`\1ees´\/\9d\ 1I\7f+O·#oÆõHo»'\89ý^ÜÝ@\ f'Å@+\9a\8b²üÕ\ùÂÛù\8e\9c\ 650©D©\ eæåÊÂúè ¶+»#ÿØ\82<Q\8f*{oß\1a|ýÚÁ>ÑÎ]\14;\82|\82\1fú­ÖÐ~b\8f¿ñJæ\ 2\v)¸à\9f^s#Àà·2\ 1Vc\96\8fíT\9b\1eÎq­D\ 1\ 2Y\ 6\8cÆ´\81Å\88Wg|\173XÙ$¥ãO8?\88ç\1e»\12Þm\8e\1ef$J²Ñ¥ Ä-ì°µ²s-Ý*)KY~\87Î\ 5y\8b\9b\92ïòãëÕ\ 2¾ÅLO¿º\16\10W6ä7è\8dhíiSX\8c-Æ&'\16\1cÄá\vñ\bú\r\fn÷Ù@\90&7\ 3Ôý\ 5\9bõ\8dà\93iQØ\8f\17Ùb\ 3ëpLJ\fk¡Fß\0æu\99¸\1f\12\ 6h\98âæ\87¨\ 6\14IöuW\ 4\9fK8
+\16´\1eX\87\17Z½¬NÔ\96ï*Ì\1aÅ3\9b\84a\róÏ¥ÞNÃ60X¬Mä¶a
+_å8á\9dÞ¯\fd#§Tm±4ê|\8af\0ñ§\95VÏ]\9d~M_\7fïþ\9a6,µ%\r\9b8
+Qk\85¥ïµU´6c{«g\0X\89GMCí;´VU\12AS"ïä%É<\9e\v³H\82X6`\85±<\82\83\98\8c\91Ûí\8fí¹Ø
+Á¡\1a»A®\1c\915²¶Ø{ÎÉ\81?/ÞIÙ\12\9b¥Þ´Ñº\86rk\82ó\97\19º\15\1e·\166ï°\84\r\0\88ÿ
+ª²õE£Ô=\1fê¤Hdá\9c\96\ 2Ã\r\aäÝÔ~&\ eËt\eÝÂõ ò{â;\84"©X\95Ã\f¬\92ý칮Ž\ 4ä¬zD\ 4
+(Ã\9cÁ­¹ç\92\83\9b\ faFb×þ½'.\9a¹Ëºå×\81Y-\18N
+[\88\91Ñç*|@\9d~x­À\12\ eACh«&)\821\vÖs\a¦\ 6E:·Z\13Ô\17סú \99ó¸t\82yC\a0U'1/¾\8a\19¨#=O¥\eOí#$:7õ\98BtÂkëTºé\9eÄ{\8aH$\bÏ\9f¥ãÃ!oV,\0É\908k4@ÕpÛ^_\17©\98÷@1F}i\fþ\ 6¿r+­ú*ý\aþ\9d/\89H°S\ 5>\13 \9e\15S\v\97ÐÓí\12·\89\9d¡±\18\95THä\83µØ\9c» c.\88H±ßðåÙ,¯\86¼{;\13\15\9a\17Y\1d\8c\80øR\96i~1#këÌ\90\94ή©Î\87[»¯7\83D·i¿ô½jw>
+ÏPZì\96\8c$Tòñ6-'ô±Ykpd÷©aU©øk7¬Vý®\16\e_¤9®´´ôÍ4ÿBQHkø±Ìû\8få¤\a6\17$.\12þ·\82d&½ì0E¹pÕ%4bA\7f\1d\v\ e.,öÒ\88^ ¡&6jì\83W\ 5aôþ\95½\8aq§JÓåÞ:>\1a·\82a\90TkñÅE`Òÿ×Î\9cÿ3¡\0\0\0Ï\15\96ç>²5\89ç¨Ðr\e+=sÏ\e!#\1f\92;6Zkë-\96£\95#6·\16\13\16sSɱ\14\15aʵ2g\98i\8bBÒû#Þoïó¾\7fÀ\17ûºÇ£¢×\1d\1eòø8ª1\ 6\85Â\ 1,8\9c¬«£\8bzØý\8aQHH\b[\1avm\6æÃWS
+wpÅ%B\88\ eÿæ\19´ÇÝ7¼b     8\97³r¸ÞêI w¼øT\eÞØjñ©ºªë¯vå¶\9c.\85Û1\1e\ 2Í\d8í\147Ï·¼§¡'\7f7~ä,ÓV\9cÏ\16(\9ew\edN©\8dMÓ9¸zº\94 F\9fî}ñìÚ;Ì\8cËyÛ\9eW|Ì¡\9e·®»=\0ecn èó  \0BÜ«é\82\13JqAX\96½¡<\16n\97Vó1½QÏ@Õy|\90\14(+\86æ·wT?\ 3\bëÝíP0\87.\ 5\81\9bã;S\ 2H
+÷¹o\1fì\16é\86¹üÊ\9cϸ\7fàt\80»\ 1z½Å0\8dzZþ«Y\1fè-Jç\fÙô{\ 2Ó\«ý\84î\ 4#0·\14\17¸Ûðs\87º&{\8aF\90\94ÆÉ%=ñUiY`0®ºê\84ëw«ó¥Ø$ù\98\8fÓ¶     mNéd£ØÌ3Åw¯\9f\99]\86\9a\ÆÝ0\92\80\94Ú,)\91\96÷¦Ý$\8b\9cu'æuáo¾zpXÂV\9f\88ÈùY\83\ 3Ù\11]\ 5×T­ê'Swìejî¨[¬¯qì
+xõ\8c¤\88ØÂ\93¼yû \80/xhz\ 5ZÉo´Y\ 4\12Ä~wÑ\8dúÚaàQ\a\0äÞlðfKËßo»n\93æ'y©µüÓ-Ŧ}ã\rò\92÷ß\16semÓLæ94«QG#y6X\98¢¼\12å8¡UyåM$:\ 4ÍmkcC°\9d1ÉIáö\1a*9(JZ¢Vb\19AÂ$\rÀÈÏn\97\82*K_\105üuÌ\ 5[\10\8a\96t\17\98Ä\15\ 3'\86ÞÃ)úáy½÷\9a÷\85µ«8É2\8bD\9f 1\12\ 5\9cê\9b §\e­\82¯Úè\fÓ\11'\8a_\vø\bé\802z3îV\8e\14ÄËä¯ù(\7f\8a{¨²k4u\8e«­\ e\98¤\rk÷×¾´¥ÜIW°©ò\12üÂÐ<w²-ᣳÜ2S4^µÕ>n\ 5IA6\a t2-\ e¹ð2<¤ð\94é\e¡¥²5* 9Ù\8fÔc\80\988ZÏ=¨:þ\81Q¶µ©Ã\80àµë \98ÈÕ9>ð3´éi¬ñÖL'\8dÁF\1az¥î\83>\8bT̸p|¬\ eÀ¿MõÛ¥\947Øxms÷\1cj\ fqï«´\80Û \8a$çÔÌäº\1a[\91b'\18&H\87ò-/!X\89þ\87ý°H\1dð¨a¼-\958\7f\84x\1ah\93!­]l>¦\81\92jíaEïB÷P%Å\14&\19\rl,
+\80ß\8e\12û\9c×ÕK\ 1F\ fê®\16\85§\f\15\r4\19\1a\17ö\8afÿ$®\1a\90ÈkJ HG5~©×\8f³\98úB³Ð\83v/R\1aÈÎgÅí\87-Iø¾¤ª8\em:\v\14=h&È\f´¼\11K<A¼î\9b\bF25/7â¡\1d\18¡\9f\19á÷\ f\96£\8bÊ\1fbÏ    \8cgqd\10l9.ø\ e¹U_\8d\10ÈÈË6Vp\9cG! \ 2D\16½\9ctª*,º¥\12ÑØ\84        55IÅ\95%¶~ÁÙsj¤K(Ãj¨äÔUTÒ÷K£SÏã/>?`èÛ©«öDv\13L\f6ºù\8e\86ͳv\85Ù\94Ì\12\84KlK×3KÙT ~ù\ 6¦\9f¹\8eÓ/\8c\93Åáçsµ¬_\80»G"aù·Düc¤ä_ù;\~¸Ý½\8cò\94I\96;NèC@\ eß3w^\14óÆóì\7f
+êkY\11\1e\8a+]¯Þ×ÒvE%OVçhv÷\91y\r2\8fh½¡\12üT¬\ fbÜ·;ZÂÚü\13Ù2«i\8d¿\8a\[ÿ\1cFÚ¬\ 2\82\13+%®ºÕ\85Þífmm\81n\96?\8bªÚ\84.AÞ¸\8dÒy\ 6r5x\9e\1cÿîÄð\0C8|ÏÚ²\7fý\bAFÄù°
+G\ f3\1c\10·\19z©Ó«ã×"ù±£\83Ý\96\95qt,cL\17=³T\10)ºxr(aaÖ\f\18Å\0\84'+¦^Ðu\8a\f#ºf\89Ì\ 3\83uFÑSÖ\88\97±\9a\ 1Õ\96/\8eím\92F&E?%\ 4çT%ÂÄ\b°etÕî\82¦¯ÄÖ\ 4Í\8f
+¥v¦_gõéqk\9d\8aÐÒ«Þ\ fè\19lðoæ\8d>\9e·ÔÁÍ\17\91ªË-ª\15.$\83\8dô\92\19æäÐý\9f_\ 6\ 4$¬ãCÎþ\ f39\e+©ö\82\83C°(o%|`înÊäܪ\1a+¹EãçXXÍ_丽C£\9dRN·mR
+µ¶\85×·o\83\ fVóú\81et=PâiÄdý\1a\ 1ò/\ 1þ\ fþ\13Apth\10\16\17\83\ eÂF\ 1þ\ 1\ 6p\1e6endstream
+endobj
+2958 0 obj <<
+/Type /Font
+/Subtype /Type1
+/Encoding 8318 0 R
+/FirstChar 2
+/LastChar 122
+/Widths 8321 0 R
+/BaseFont /SBITZI+CenturySchL-Bold
+/FontDescriptor 2956 0 R
+>> endobj
+2956 0 obj <<
+/Ascent 721
+/CapHeight 721
+/Descent -190
+/FontName /SBITZI+CenturySchL-Bold
+/ItalicAngle 0
+/StemV 174
+/XHeight 475
+/FontBBox [-166 -372 1000 1005]
+/Flags 4
+/CharSet (/fi/fl/parenleft/parenright/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/equal/A/B/C/D/E/F/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z)
+/FontFile 2957 0 R
+>> endobj
+8321 0 obj
+[685 685 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 389 389 0 0 0 333 278 278 574 574 574 574 574 574 574 574 574 574 278 0 0 606 0 0 0 759 778 778 833 759 722 0 870 444 0 815 722 981 833 833 759 833 815 667 722 833 759 0 0 0 0 0 0 0 0 500 0 611 648 556 667 574 389 611 685 370 352 667 352 963 685 611 667 648 519 500 426 685 611 889 611 611 537 ]
+endobj
+2959 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [2950 0 R 2961 0 R 2968 0 R 3134 0 R 3303 0 R 3463 0 R]
+>> endobj
+3482 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [3479 0 R 3484 0 R 3540 0 R 3595 0 R 3643 0 R 3694 0 R]
+>> endobj
+3816 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [3767 0 R 3818 0 R 3890 0 R 3917 0 R 3953 0 R 3982 0 R]
+>> endobj
+4072 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [4037 0 R 4074 0 R 4138 0 R 4203 0 R 4264 0 R 4326 0 R]
+>> endobj
+4422 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [4372 0 R 4424 0 R 4493 0 R 4545 0 R 4592 0 R 4679 0 R]
+>> endobj
+4779 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8322 0 R
+/Kids [4728 0 R 4781 0 R 4833 0 R 4896 0 R 4973 0 R 5037 0 R]
+>> endobj
+5154 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [5092 0 R 5156 0 R 5207 0 R 5259 0 R 5315 0 R 5372 0 R]
+>> endobj
+5469 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [5429 0 R 5471 0 R 5521 0 R 5585 0 R 5655 0 R 5700 0 R]
+>> endobj
+5815 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [5767 0 R 5817 0 R 5887 0 R 5947 0 R 6001 0 R 6062 0 R]
+>> endobj
+6201 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [6141 0 R 6203 0 R 6255 0 R 6320 0 R 6380 0 R 6444 0 R]
+>> endobj
+6554 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [6500 0 R 6556 0 R 6612 0 R 6678 0 R 6739 0 R 6799 0 R]
+>> endobj
+6927 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8323 0 R
+/Kids [6851 0 R 6929 0 R 6988 0 R 7043 0 R 7105 0 R 7159 0 R]
+>> endobj
+7272 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8324 0 R
+/Kids [7225 0 R 7274 0 R 7339 0 R 7403 0 R 7456 0 R 7516 0 R]
+>> endobj
+7639 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 8324 0 R
+/Kids [7582 0 R 7641 0 R 7706 0 R 7765 0 R 7817 0 R 7869 0 R]
+>> endobj
+7972 0 obj <<
+/Type /Pages
+/Count 5
+/Parent 8324 0 R
+/Kids [7901 0 R 7974 0 R 8089 0 R 8166 0 R 8245 0 R]
+>> endobj
+8322 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 8325 0 R
+/Kids [2959 0 R 3482 0 R 3816 0 R 4072 0 R 4422 0 R 4779 0 R]
+>> endobj
+8323 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 8325 0 R
+/Kids [5154 0 R 5469 0 R 5815 0 R 6201 0 R 6554 0 R 6927 0 R]
+>> endobj
+8324 0 obj <<
+/Type /Pages
+/Count 17
+/Parent 8325 0 R
+/Kids [7272 0 R 7639 0 R 7972 0 R]
+>> endobj
+8325 0 obj <<
+/Type /Pages
+/Count 89
+/Kids [8322 0 R 8323 0 R 8324 0 R]
+>> endobj
+8326 0 obj <<
+/Type /Outlines
+/First 3 0 R
+/Last 2891 0 R
+/Count 13
+>> endobj
+2947 0 obj <<
+/Title 2948 0 R
+/A 2945 0 R
+/Parent 2931 0 R
+/Prev 2943 0 R
+>> endobj
+2943 0 obj <<
+/Title 2944 0 R
+/A 2941 0 R
+/Parent 2931 0 R
+/Prev 2939 0 R
+/Next 2947 0 R
+>> endobj
+2939 0 obj <<
+/Title 2940 0 R
+/A 2937 0 R
+/Parent 2931 0 R
+/Prev 2935 0 R
+/Next 2943 0 R
+>> endobj
+2935 0 obj <<
+/Title 2936 0 R
+/A 2933 0 R
+/Parent 2931 0 R
+/Next 2939 0 R
+>> endobj
+2931 0 obj <<
+/Title 2932 0 R
+/A 2929 0 R
+/Parent 2891 0 R
+/Prev 2911 0 R
+/First 2935 0 R
+/Last 2947 0 R
+/Count -4
+>> endobj
+2927 0 obj <<
+/Title 2928 0 R
+/A 2925 0 R
+/Parent 2911 0 R
+/Prev 2923 0 R
+>> endobj
+2923 0 obj <<
+/Title 2924 0 R
+/A 2921 0 R
+/Parent 2911 0 R
+/Prev 2919 0 R
+/Next 2927 0 R
+>> endobj
+2919 0 obj <<
+/Title 2920 0 R
+/A 2917 0 R
+/Parent 2911 0 R
+/Prev 2915 0 R
+/Next 2923 0 R
+>> endobj
+2915 0 obj <<
+/Title 2916 0 R
+/A 2913 0 R
+/Parent 2911 0 R
+/Next 2919 0 R
+>> endobj
+2911 0 obj <<
+/Title 2912 0 R
+/A 2909 0 R
+/Parent 2891 0 R
+/Prev 2907 0 R
+/Next 2931 0 R
+/First 2915 0 R
+/Last 2927 0 R
+/Count -4
+>> endobj
+2907 0 obj <<
+/Title 2908 0 R
+/A 2905 0 R
+/Parent 2891 0 R
+/Prev 2903 0 R
+/Next 2911 0 R
+>> endobj
+2903 0 obj <<
+/Title 2904 0 R
+/A 2901 0 R
+/Parent 2891 0 R
+/Prev 2899 0 R
+/Next 2907 0 R
+>> endobj
+2899 0 obj <<
+/Title 2900 0 R
+/A 2897 0 R
+/Parent 2891 0 R
+/Prev 2895 0 R
+/Next 2903 0 R
+>> endobj
+2895 0 obj <<
+/Title 2896 0 R
+/A 2893 0 R
+/Parent 2891 0 R
+/Next 2899 0 R
+>> endobj
+2891 0 obj <<
+/Title 2892 0 R
+/A 2889 0 R
+/Parent 8326 0 R
+/Prev 199 0 R
+/First 2895 0 R
+/Last 2931 0 R
+/Count -6
+>> endobj
+2887 0 obj <<
+/Title 2888 0 R
+/A 2885 0 R
+/Parent 2875 0 R
+/Prev 2883 0 R
+>> endobj
+2883 0 obj <<
+/Title 2884 0 R
+/A 2881 0 R
+/Parent 2875 0 R
+/Prev 2879 0 R
+/Next 2887 0 R
+>> endobj
+2879 0 obj <<
+/Title 2880 0 R
+/A 2877 0 R
+/Parent 2875 0 R
+/Next 2883 0 R
+>> endobj
+2875 0 obj <<
+/Title 2876 0 R
+/A 2873 0 R
+/Parent 199 0 R
+/Prev 2859 0 R
+/First 2879 0 R
+/Last 2887 0 R
+/Count -3
+>> endobj
+2871 0 obj <<
+/Title 2872 0 R
+/A 2869 0 R
+/Parent 2859 0 R
+/Prev 2867 0 R
+>> endobj
+2867 0 obj <<
+/Title 2868 0 R
+/A 2865 0 R
+/Parent 2859 0 R
+/Prev 2863 0 R
+/Next 2871 0 R
+>> endobj
+2863 0 obj <<
+/Title 2864 0 R
+/A 2861 0 R
+/Parent 2859 0 R
+/Next 2867 0 R
+>> endobj
+2859 0 obj <<
+/Title 2860 0 R
+/A 2857 0 R
+/Parent 199 0 R
+/Prev 2843 0 R
+/Next 2875 0 R
+/First 2863 0 R
+/Last 2871 0 R
+/Count -3
+>> endobj
+2855 0 obj <<
+/Title 2856 0 R
+/A 2853 0 R
+/Parent 2843 0 R
+/Prev 2851 0 R
+>> endobj
+2851 0 obj <<
+/Title 2852 0 R
+/A 2849 0 R
+/Parent 2843 0 R
+/Prev 2847 0 R
+/Next 2855 0 R
+>> endobj
+2847 0 obj <<
+/Title 2848 0 R
+/A 2845 0 R
+/Parent 2843 0 R
+/Next 2851 0 R
+>> endobj
+2843 0 obj <<
+/Title 2844 0 R
+/A 2841 0 R
+/Parent 199 0 R
+/Prev 2827 0 R
+/Next 2859 0 R
+/First 2847 0 R
+/Last 2855 0 R
+/Count -3
+>> endobj
+2839 0 obj <<
+/Title 2840 0 R
+/A 2837 0 R
+/Parent 2827 0 R
+/Prev 2835 0 R
+>> endobj
+2835 0 obj <<
+/Title 2836 0 R
+/A 2833 0 R
+/Parent 2827 0 R
+/Prev 2831 0 R
+/Next 2839 0 R
+>> endobj
+2831 0 obj <<
+/Title 2832 0 R
+/A 2829 0 R
+/Parent 2827 0 R
+/Next 2835 0 R
+>> endobj
+2827 0 obj <<
+/Title 2828 0 R
+/A 2825 0 R
+/Parent 199 0 R
+/Prev 2823 0 R
+/Next 2843 0 R
+/First 2831 0 R
+/Last 2839 0 R
+/Count -3
+>> endobj
+2823 0 obj <<
+/Title 2824 0 R
+/A 2821 0 R
+/Parent 199 0 R
+/Prev 2807 0 R
+/Next 2827 0 R
+>> endobj
+2819 0 obj <<
+/Title 2820 0 R
+/A 2817 0 R
+/Parent 2807 0 R
+/Prev 2815 0 R
+>> endobj
+2815 0 obj <<
+/Title 2816 0 R
+/A 2813 0 R
+/Parent 2807 0 R
+/Prev 2811 0 R
+/Next 2819 0 R
+>> endobj
+2811 0 obj <<
+/Title 2812 0 R
+/A 2809 0 R
+/Parent 2807 0 R
+/Next 2815 0 R
+>> endobj
+2807 0 obj <<
+/Title 2808 0 R
+/A 2805 0 R
+/Parent 199 0 R
+/Prev 2787 0 R
+/Next 2823 0 R
+/First 2811 0 R
+/Last 2819 0 R
+/Count -3
+>> endobj
+2803 0 obj <<
+/Title 2804 0 R
+/A 2801 0 R
+/Parent 2787 0 R
+/Prev 2799 0 R
+>> endobj
+2799 0 obj <<
+/Title 2800 0 R
+/A 2797 0 R
+/Parent 2787 0 R
+/Prev 2795 0 R
+/Next 2803 0 R
+>> endobj
+2795 0 obj <<
+/Title 2796 0 R
+/A 2793 0 R
+/Parent 2787 0 R
+/Prev 2791 0 R
+/Next 2799 0 R
+>> endobj
+2791 0 obj <<
+/Title 2792 0 R
+/A 2789 0 R
+/Parent 2787 0 R
+/Next 2795 0 R
+>> endobj
+2787 0 obj <<
+/Title 2788 0 R
+/A 2785 0 R
+/Parent 199 0 R
+/Prev 2767 0 R
+/Next 2807 0 R
+/First 2791 0 R
+/Last 2803 0 R
+/Count -4
+>> endobj
+2783 0 obj <<
+/Title 2784 0 R
+/A 2781 0 R
+/Parent 2767 0 R
+/Prev 2779 0 R
+>> endobj
+2779 0 obj <<
+/Title 2780 0 R
+/A 2777 0 R
+/Parent 2767 0 R
+/Prev 2775 0 R
+/Next 2783 0 R
+>> endobj
+2775 0 obj <<
+/Title 2776 0 R
+/A 2773 0 R
+/Parent 2767 0 R
+/Prev 2771 0 R
+/Next 2779 0 R
+>> endobj
+2771 0 obj <<
+/Title 2772 0 R
+/A 2769 0 R
+/Parent 2767 0 R
+/Next 2775 0 R
+>> endobj
+2767 0 obj <<
+/Title 2768 0 R
+/A 2765 0 R
+/Parent 199 0 R
+/Prev 2743 0 R
+/Next 2787 0 R
+/First 2771 0 R
+/Last 2783 0 R
+/Count -4
+>> endobj
+2763 0 obj <<
+/Title 2764 0 R
+/A 2761 0 R
+/Parent 2743 0 R
+/Prev 2759 0 R
+>> endobj
+2759 0 obj <<
+/Title 2760 0 R
+/A 2757 0 R
+/Parent 2743 0 R
+/Prev 2755 0 R
+/Next 2763 0 R
+>> endobj
+2755 0 obj <<
+/Title 2756 0 R
+/A 2753 0 R
+/Parent 2743 0 R
+/Prev 2751 0 R
+/Next 2759 0 R
+>> endobj
+2751 0 obj <<
+/Title 2752 0 R
+/A 2749 0 R
+/Parent 2743 0 R
+/Prev 2747 0 R
+/Next 2755 0 R
+>> endobj
+2747 0 obj <<
+/Title 2748 0 R
+/A 2745 0 R
+/Parent 2743 0 R
+/Next 2751 0 R
+>> endobj
+2743 0 obj <<
+/Title 2744 0 R
+/A 2741 0 R
+/Parent 199 0 R
+/Prev 2719 0 R
+/Next 2767 0 R
+/First 2747 0 R
+/Last 2763 0 R
+/Count -5
+>> endobj
+2739 0 obj <<
+/Title 2740 0 R
+/A 2737 0 R
+/Parent 2719 0 R
+/Prev 2735 0 R
+>> endobj
+2735 0 obj <<
+/Title 2736 0 R
+/A 2733 0 R
+/Parent 2719 0 R
+/Prev 2731 0 R
+/Next 2739 0 R
+>> endobj
+2731 0 obj <<
+/Title 2732 0 R
+/A 2729 0 R
+/Parent 2719 0 R
+/Prev 2727 0 R
+/Next 2735 0 R
+>> endobj
+2727 0 obj <<
+/Title 2728 0 R
+/A 2725 0 R
+/Parent 2719 0 R
+/Prev 2723 0 R
+/Next 2731 0 R
+>> endobj
+2723 0 obj <<
+/Title 2724 0 R
+/A 2721 0 R
+/Parent 2719 0 R
+/Next 2727 0 R
+>> endobj
+2719 0 obj <<
+/Title 2720 0 R
+/A 2717 0 R
+/Parent 199 0 R
+/Prev 2695 0 R
+/Next 2743 0 R
+/First 2723 0 R
+/Last 2739 0 R
+/Count -5
+>> endobj
+2715 0 obj <<
+/Title 2716 0 R
+/A 2713 0 R
+/Parent 2695 0 R
+/Prev 2711 0 R
+>> endobj
+2711 0 obj <<
+/Title 2712 0 R
+/A 2709 0 R
+/Parent 2695 0 R
+/Prev 2707 0 R
+/Next 2715 0 R
+>> endobj
+2707 0 obj <<
+/Title 2708 0 R
+/A 2705 0 R
+/Parent 2695 0 R
+/Prev 2703 0 R
+/Next 2711 0 R
+>> endobj
+2703 0 obj <<
+/Title 2704 0 R
+/A 2701 0 R
+/Parent 2695 0 R
+/Prev 2699 0 R
+/Next 2707 0 R
+>> endobj
+2699 0 obj <<
+/Title 2700 0 R
+/A 2697 0 R
+/Parent 2695 0 R
+/Next 2703 0 R
+>> endobj
+2695 0 obj <<
+/Title 2696 0 R
+/A 2693 0 R
+/Parent 199 0 R
+/Prev 2667 0 R
+/Next 2719 0 R
+/First 2699 0 R
+/Last 2715 0 R
+/Count -5
+>> endobj
+2691 0 obj <<
+/Title 2692 0 R
+/A 2689 0 R
+/Parent 2667 0 R
+/Prev 2687 0 R
+>> endobj
+2687 0 obj <<
+/Title 2688 0 R
+/A 2685 0 R
+/Parent 2667 0 R
+/Prev 2683 0 R
+/Next 2691 0 R
+>> endobj
+2683 0 obj <<
+/Title 2684 0 R
+/A 2681 0 R
+/Parent 2667 0 R
+/Prev 2679 0 R
+/Next 2687 0 R
+>> endobj
+2679 0 obj <<
+/Title 2680 0 R
+/A 2677 0 R
+/Parent 2667 0 R
+/Prev 2675 0 R
+/Next 2683 0 R
+>> endobj
+2675 0 obj <<
+/Title 2676 0 R
+/A 2673 0 R
+/Parent 2667 0 R
+/Prev 2671 0 R
+/Next 2679 0 R
+>> endobj
+2671 0 obj <<
+/Title 2672 0 R
+/A 2669 0 R
+/Parent 2667 0 R
+/Next 2675 0 R
+>> endobj
+2667 0 obj <<
+/Title 2668 0 R
+/A 2665 0 R
+/Parent 199 0 R
+/Prev 2643 0 R
+/Next 2695 0 R
+/First 2671 0 R
+/Last 2691 0 R
+/Count -6
+>> endobj
+2663 0 obj <<
+/Title 2664 0 R
+/A 2661 0 R
+/Parent 2643 0 R
+/Prev 2659 0 R
+>> endobj
+2659 0 obj <<
+/Title 2660 0 R
+/A 2657 0 R
+/Parent 2643 0 R
+/Prev 2655 0 R
+/Next 2663 0 R
+>> endobj
+2655 0 obj <<
+/Title 2656 0 R
+/A 2653 0 R
+/Parent 2643 0 R
+/Prev 2651 0 R
+/Next 2659 0 R
+>> endobj
+2651 0 obj <<
+/Title 2652 0 R
+/A 2649 0 R
+/Parent 2643 0 R
+/Prev 2647 0 R
+/Next 2655 0 R
+>> endobj
+2647 0 obj <<
+/Title 2648 0 R
+/A 2645 0 R
+/Parent 2643 0 R
+/Next 2651 0 R
+>> endobj
+2643 0 obj <<
+/Title 2644 0 R
+/A 2641 0 R
+/Parent 199 0 R
+/Prev 2623 0 R
+/Next 2667 0 R
+/First 2647 0 R
+/Last 2663 0 R
+/Count -5
+>> endobj
+2639 0 obj <<
+/Title 2640 0 R
+/A 2637 0 R
+/Parent 2623 0 R
+/Prev 2635 0 R
+>> endobj
+2635 0 obj <<
+/Title 2636 0 R
+/A 2633 0 R
+/Parent 2623 0 R
+/Prev 2631 0 R
+/Next 2639 0 R
+>> endobj
+2631 0 obj <<
+/Title 2632 0 R
+/A 2629 0 R
+/Parent 2623 0 R
+/Prev 2627 0 R
+/Next 2635 0 R
+>> endobj
+2627 0 obj <<
+/Title 2628 0 R
+/A 2625 0 R
+/Parent 2623 0 R
+/Next 2631 0 R
+>> endobj
+2623 0 obj <<
+/Title 2624 0 R
+/A 2621 0 R
+/Parent 199 0 R
+/Prev 2603 0 R
+/Next 2643 0 R
+/First 2627 0 R
+/Last 2639 0 R
+/Count -4
+>> endobj
+2619 0 obj <<
+/Title 2620 0 R
+/A 2617 0 R
+/Parent 2603 0 R
+/Prev 2615 0 R
+>> endobj
+2615 0 obj <<
+/Title 2616 0 R
+/A 2613 0 R
+/Parent 2603 0 R
+/Prev 2611 0 R
+/Next 2619 0 R
+>> endobj
+2611 0 obj <<
+/Title 2612 0 R
+/A 2609 0 R
+/Parent 2603 0 R
+/Prev 2607 0 R
+/Next 2615 0 R
+>> endobj
+2607 0 obj <<
+/Title 2608 0 R
+/A 2605 0 R
+/Parent 2603 0 R
+/Next 2611 0 R
+>> endobj
+2603 0 obj <<
+/Title 2604 0 R
+/A 2601 0 R
+/Parent 199 0 R
+/Prev 2583 0 R
+/Next 2623 0 R
+/First 2607 0 R
+/Last 2619 0 R
+/Count -4
+>> endobj
+2599 0 obj <<
+/Title 2600 0 R
+/A 2597 0 R
+/Parent 2583 0 R
+/Prev 2595 0 R
+>> endobj
+2595 0 obj <<
+/Title 2596 0 R
+/A 2593 0 R
+/Parent 2583 0 R
+/Prev 2591 0 R
+/Next 2599 0 R
+>> endobj
+2591 0 obj <<
+/Title 2592 0 R
+/A 2589 0 R
+/Parent 2583 0 R
+/Prev 2587 0 R
+/Next 2595 0 R
+>> endobj
+2587 0 obj <<
+/Title 2588 0 R
+/A 2585 0 R
+/Parent 2583 0 R
+/Next 2591 0 R
+>> endobj
+2583 0 obj <<
+/Title 2584 0 R
+/A 2581 0 R
+/Parent 199 0 R
+/Prev 2563 0 R
+/Next 2603 0 R
+/First 2587 0 R
+/Last 2599 0 R
+/Count -4
+>> endobj
+2579 0 obj <<
+/Title 2580 0 R
+/A 2577 0 R
+/Parent 2563 0 R
+/Prev 2575 0 R
+>> endobj
+2575 0 obj <<
+/Title 2576 0 R
+/A 2573 0 R
+/Parent 2563 0 R
+/Prev 2571 0 R
+/Next 2579 0 R
+>> endobj
+2571 0 obj <<
+/Title 2572 0 R
+/A 2569 0 R
+/Parent 2563 0 R
+/Prev 2567 0 R
+/Next 2575 0 R
+>> endobj
+2567 0 obj <<
+/Title 2568 0 R
+/A 2565 0 R
+/Parent 2563 0 R
+/Next 2571 0 R
+>> endobj
+2563 0 obj <<
+/Title 2564 0 R
+/A 2561 0 R
+/Parent 199 0 R
+/Prev 2547 0 R
+/Next 2583 0 R
+/First 2567 0 R
+/Last 2579 0 R
+/Count -4
+>> endobj
+2559 0 obj <<
+/Title 2560 0 R
+/A 2557 0 R
+/Parent 2547 0 R
+/Prev 2555 0 R
+>> endobj
+2555 0 obj <<
+/Title 2556 0 R
+/A 2553 0 R
+/Parent 2547 0 R
+/Prev 2551 0 R
+/Next 2559 0 R
+>> endobj
+2551 0 obj <<
+/Title 2552 0 R
+/A 2549 0 R
+/Parent 2547 0 R
+/Next 2555 0 R
+>> endobj
+2547 0 obj <<
+/Title 2548 0 R
+/A 2545 0 R
+/Parent 199 0 R
+/Prev 2523 0 R
+/Next 2563 0 R
+/First 2551 0 R
+/Last 2559 0 R
+/Count -3
+>> endobj
+2543 0 obj <<
+/Title 2544 0 R
+/A 2541 0 R
+/Parent 2523 0 R
+/Prev 2539 0 R
+>> endobj
+2539 0 obj <<
+/Title 2540 0 R
+/A 2537 0 R
+/Parent 2523 0 R
+/Prev 2535 0 R
+/Next 2543 0 R
+>> endobj
+2535 0 obj <<
+/Title 2536 0 R
+/A 2533 0 R
+/Parent 2523 0 R
+/Prev 2531 0 R
+/Next 2539 0 R
+>> endobj
+2531 0 obj <<
+/Title 2532 0 R
+/A 2529 0 R
+/Parent 2523 0 R
+/Prev 2527 0 R
+/Next 2535 0 R
+>> endobj
+2527 0 obj <<
+/Title 2528 0 R
+/A 2525 0 R
+/Parent 2523 0 R
+/Next 2531 0 R
+>> endobj
+2523 0 obj <<
+/Title 2524 0 R
+/A 2521 0 R
+/Parent 199 0 R
+/Prev 2507 0 R
+/Next 2547 0 R
+/First 2527 0 R
+/Last 2543 0 R
+/Count -5
+>> endobj
+2519 0 obj <<
+/Title 2520 0 R
+/A 2517 0 R
+/Parent 2507 0 R
+/Prev 2515 0 R
+>> endobj
+2515 0 obj <<
+/Title 2516 0 R
+/A 2513 0 R
+/Parent 2507 0 R
+/Prev 2511 0 R
+/Next 2519 0 R
+>> endobj
+2511 0 obj <<
+/Title 2512 0 R
+/A 2509 0 R
+/Parent 2507 0 R
+/Next 2515 0 R
+>> endobj
+2507 0 obj <<
+/Title 2508 0 R
+/A 2505 0 R
+/Parent 199 0 R
+/Prev 2483 0 R
+/Next 2523 0 R
+/First 2511 0 R
+/Last 2519 0 R
+/Count -3
+>> endobj
+2503 0 obj <<
+/Title 2504 0 R
+/A 2501 0 R
+/Parent 2483 0 R
+/Prev 2499 0 R
+>> endobj
+2499 0 obj <<
+/Title 2500 0 R
+/A 2497 0 R
+/Parent 2483 0 R
+/Prev 2495 0 R
+/Next 2503 0 R
+>> endobj
+2495 0 obj <<
+/Title 2496 0 R
+/A 2493 0 R
+/Parent 2483 0 R
+/Prev 2491 0 R
+/Next 2499 0 R
+>> endobj
+2491 0 obj <<
+/Title 2492 0 R
+/A 2489 0 R
+/Parent 2483 0 R
+/Prev 2487 0 R
+/Next 2495 0 R
+>> endobj
+2487 0 obj <<
+/Title 2488 0 R
+/A 2485 0 R
+/Parent 2483 0 R
+/Next 2491 0 R
+>> endobj
+2483 0 obj <<
+/Title 2484 0 R
+/A 2481 0 R
+/Parent 199 0 R
+/Prev 2463 0 R
+/Next 2507 0 R
+/First 2487 0 R
+/Last 2503 0 R
+/Count -5
+>> endobj
+2479 0 obj <<
+/Title 2480 0 R
+/A 2477 0 R
+/Parent 2463 0 R
+/Prev 2475 0 R
+>> endobj
+2475 0 obj <<
+/Title 2476 0 R
+/A 2473 0 R
+/Parent 2463 0 R
+/Prev 2471 0 R
+/Next 2479 0 R
+>> endobj
+2471 0 obj <<
+/Title 2472 0 R
+/A 2469 0 R
+/Parent 2463 0 R
+/Prev 2467 0 R
+/Next 2475 0 R
+>> endobj
+2467 0 obj <<
+/Title 2468 0 R
+/A 2465 0 R
+/Parent 2463 0 R
+/Next 2471 0 R
+>> endobj
+2463 0 obj <<
+/Title 2464 0 R
+/A 2461 0 R
+/Parent 199 0 R
+/Prev 2447 0 R
+/Next 2483 0 R
+/First 2467 0 R
+/Last 2479 0 R
+/Count -4
+>> endobj
+2459 0 obj <<
+/Title 2460 0 R
+/A 2457 0 R
+/Parent 2447 0 R
+/Prev 2455 0 R
+>> endobj
+2455 0 obj <<
+/Title 2456 0 R
+/A 2453 0 R
+/Parent 2447 0 R
+/Prev 2451 0 R
+/Next 2459 0 R
+>> endobj
+2451 0 obj <<
+/Title 2452 0 R
+/A 2449 0 R
+/Parent 2447 0 R
+/Next 2455 0 R
+>> endobj
+2447 0 obj <<
+/Title 2448 0 R
+/A 2445 0 R
+/Parent 199 0 R
+/Prev 2423 0 R
+/Next 2463 0 R
+/First 2451 0 R
+/Last 2459 0 R
+/Count -3
+>> endobj
+2443 0 obj <<
+/Title 2444 0 R
+/A 2441 0 R
+/Parent 2423 0 R
+/Prev 2439 0 R
+>> endobj
+2439 0 obj <<
+/Title 2440 0 R
+/A 2437 0 R
+/Parent 2423 0 R
+/Prev 2435 0 R
+/Next 2443 0 R
+>> endobj
+2435 0 obj <<
+/Title 2436 0 R
+/A 2433 0 R
+/Parent 2423 0 R
+/Prev 2431 0 R
+/Next 2439 0 R
+>> endobj
+2431 0 obj <<
+/Title 2432 0 R
+/A 2429 0 R
+/Parent 2423 0 R
+/Prev 2427 0 R
+/Next 2435 0 R
+>> endobj
+2427 0 obj <<
+/Title 2428 0 R
+/A 2425 0 R
+/Parent 2423 0 R
+/Next 2431 0 R
+>> endobj
+2423 0 obj <<
+/Title 2424 0 R
+/A 2421 0 R
+/Parent 199 0 R
+/Prev 2419 0 R
+/Next 2447 0 R
+/First 2427 0 R
+/Last 2443 0 R
+/Count -5
+>> endobj
+2419 0 obj <<
+/Title 2420 0 R
+/A 2417 0 R
+/Parent 199 0 R
+/Prev 2399 0 R
+/Next 2423 0 R
+>> endobj
+2415 0 obj <<
+/Title 2416 0 R
+/A 2413 0 R
+/Parent 2399 0 R
+/Prev 2411 0 R
+>> endobj
+2411 0 obj <<
+/Title 2412 0 R
+/A 2409 0 R
+/Parent 2399 0 R
+/Prev 2407 0 R
+/Next 2415 0 R
+>> endobj
+2407 0 obj <<
+/Title 2408 0 R
+/A 2405 0 R
+/Parent 2399 0 R
+/Prev 2403 0 R
+/Next 2411 0 R
+>> endobj
+2403 0 obj <<
+/Title 2404 0 R
+/A 2401 0 R
+/Parent 2399 0 R
+/Next 2407 0 R
+>> endobj
+2399 0 obj <<
+/Title 2400 0 R
+/A 2397 0 R
+/Parent 199 0 R
+/Prev 2383 0 R
+/Next 2419 0 R
+/First 2403 0 R
+/Last 2415 0 R
+/Count -4
+>> endobj
+2395 0 obj <<
+/Title 2396 0 R
+/A 2393 0 R
+/Parent 2383 0 R
+/Prev 2391 0 R
+>> endobj
+2391 0 obj <<
+/Title 2392 0 R
+/A 2389 0 R
+/Parent 2383 0 R
+/Prev 2387 0 R
+/Next 2395 0 R
+>> endobj
+2387 0 obj <<
+/Title 2388 0 R
+/A 2385 0 R
+/Parent 2383 0 R
+/Next 2391 0 R
+>> endobj
+2383 0 obj <<
+/Title 2384 0 R
+/A 2381 0 R
+/Parent 199 0 R
+/Prev 2363 0 R
+/Next 2399 0 R
+/First 2387 0 R
+/Last 2395 0 R
+/Count -3
+>> endobj
+2379 0 obj <<
+/Title 2380 0 R
+/A 2377 0 R
+/Parent 2363 0 R
+/Prev 2375 0 R
+>> endobj
+2375 0 obj <<
+/Title 2376 0 R
+/A 2373 0 R
+/Parent 2363 0 R
+/Prev 2371 0 R
+/Next 2379 0 R
+>> endobj
+2371 0 obj <<
+/Title 2372 0 R
+/A 2369 0 R
+/Parent 2363 0 R
+/Prev 2367 0 R
+/Next 2375 0 R
+>> endobj
+2367 0 obj <<
+/Title 2368 0 R
+/A 2365 0 R
+/Parent 2363 0 R
+/Next 2371 0 R
+>> endobj
+2363 0 obj <<
+/Title 2364 0 R
+/A 2361 0 R
+/Parent 199 0 R
+/Prev 2359 0 R
+/Next 2383 0 R
+/First 2367 0 R
+/Last 2379 0 R
+/Count -4
+>> endobj
+2359 0 obj <<
+/Title 2360 0 R
+/A 2357 0 R
+/Parent 199 0 R
+/Prev 2343 0 R
+/Next 2363 0 R
+>> endobj
+2355 0 obj <<
+/Title 2356 0 R
+/A 2353 0 R
+/Parent 2343 0 R
+/Prev 2351 0 R
+>> endobj
+2351 0 obj <<
+/Title 2352 0 R
+/A 2349 0 R
+/Parent 2343 0 R
+/Prev 2347 0 R
+/Next 2355 0 R
+>> endobj
+2347 0 obj <<
+/Title 2348 0 R
+/A 2345 0 R
+/Parent 2343 0 R
+/Next 2351 0 R
+>> endobj
+2343 0 obj <<
+/Title 2344 0 R
+/A 2341 0 R
+/Parent 199 0 R
+/Prev 2327 0 R
+/Next 2359 0 R
+/First 2347 0 R
+/Last 2355 0 R
+/Count -3
+>> endobj
+2339 0 obj <<
+/Title 2340 0 R
+/A 2337 0 R
+/Parent 2327 0 R
+/Prev 2335 0 R
+>> endobj
+2335 0 obj <<
+/Title 2336 0 R
+/A 2333 0 R
+/Parent 2327 0 R
+/Prev 2331 0 R
+/Next 2339 0 R
+>> endobj
+2331 0 obj <<
+/Title 2332 0 R
+/A 2329 0 R
+/Parent 2327 0 R
+/Next 2335 0 R
+>> endobj
+2327 0 obj <<
+/Title 2328 0 R
+/A 2325 0 R
+/Parent 199 0 R
+/Prev 2307 0 R
+/Next 2343 0 R
+/First 2331 0 R
+/Last 2339 0 R
+/Count -3
+>> endobj
+2323 0 obj <<
+/Title 2324 0 R
+/A 2321 0 R
+/Parent 2307 0 R
+/Prev 2319 0 R
+>> endobj
+2319 0 obj <<
+/Title 2320 0 R
+/A 2317 0 R
+/Parent 2307 0 R
+/Prev 2315 0 R
+/Next 2323 0 R
+>> endobj
+2315 0 obj <<
+/Title 2316 0 R
+/A 2313 0 R
+/Parent 2307 0 R
+/Prev 2311 0 R
+/Next 2319 0 R
+>> endobj
+2311 0 obj <<
+/Title 2312 0 R
+/A 2309 0 R
+/Parent 2307 0 R
+/Next 2315 0 R
+>> endobj
+2307 0 obj <<
+/Title 2308 0 R
+/A 2305 0 R
+/Parent 199 0 R
+/Prev 2291 0 R
+/Next 2327 0 R
+/First 2311 0 R
+/Last 2323 0 R
+/Count -4
+>> endobj
+2303 0 obj <<
+/Title 2304 0 R
+/A 2301 0 R
+/Parent 2291 0 R
+/Prev 2299 0 R
+>> endobj
+2299 0 obj <<
+/Title 2300 0 R
+/A 2297 0 R
+/Parent 2291 0 R
+/Prev 2295 0 R
+/Next 2303 0 R
+>> endobj
+2295 0 obj <<
+/Title 2296 0 R
+/A 2293 0 R
+/Parent 2291 0 R
+/Next 2299 0 R
+>> endobj
+2291 0 obj <<
+/Title 2292 0 R
+/A 2289 0 R
+/Parent 199 0 R
+/Prev 2275 0 R
+/Next 2307 0 R
+/First 2295 0 R
+/Last 2303 0 R
+/Count -3
+>> endobj
+2287 0 obj <<
+/Title 2288 0 R
+/A 2285 0 R
+/Parent 2275 0 R
+/Prev 2283 0 R
+>> endobj
+2283 0 obj <<
+/Title 2284 0 R
+/A 2281 0 R
+/Parent 2275 0 R
+/Prev 2279 0 R
+/Next 2287 0 R
+>> endobj
+2279 0 obj <<
+/Title 2280 0 R
+/A 2277 0 R
+/Parent 2275 0 R
+/Next 2283 0 R
+>> endobj
+2275 0 obj <<
+/Title 2276 0 R
+/A 2273 0 R
+/Parent 199 0 R
+/Prev 2255 0 R
+/Next 2291 0 R
+/First 2279 0 R
+/Last 2287 0 R
+/Count -3
+>> endobj
+2271 0 obj <<
+/Title 2272 0 R
+/A 2269 0 R
+/Parent 2255 0 R
+/Prev 2267 0 R
+>> endobj
+2267 0 obj <<
+/Title 2268 0 R
+/A 2265 0 R
+/Parent 2255 0 R
+/Prev 2263 0 R
+/Next 2271 0 R
+>> endobj
+2263 0 obj <<
+/Title 2264 0 R
+/A 2261 0 R
+/Parent 2255 0 R
+/Prev 2259 0 R
+/Next 2267 0 R
+>> endobj
+2259 0 obj <<
+/Title 2260 0 R
+/A 2257 0 R
+/Parent 2255 0 R
+/Next 2263 0 R
+>> endobj
+2255 0 obj <<
+/Title 2256 0 R
+/A 2253 0 R
+/Parent 199 0 R
+/Prev 2239 0 R
+/Next 2275 0 R
+/First 2259 0 R
+/Last 2271 0 R
+/Count -4
+>> endobj
+2251 0 obj <<
+/Title 2252 0 R
+/A 2249 0 R
+/Parent 2239 0 R
+/Prev 2247 0 R
+>> endobj
+2247 0 obj <<
+/Title 2248 0 R
+/A 2245 0 R
+/Parent 2239 0 R
+/Prev 2243 0 R
+/Next 2251 0 R
+>> endobj
+2243 0 obj <<
+/Title 2244 0 R
+/A 2241 0 R
+/Parent 2239 0 R
+/Next 2247 0 R
+>> endobj
+2239 0 obj <<
+/Title 2240 0 R
+/A 2237 0 R
+/Parent 199 0 R
+/Prev 2219 0 R
+/Next 2255 0 R
+/First 2243 0 R
+/Last 2251 0 R
+/Count -3
+>> endobj
+2235 0 obj <<
+/Title 2236 0 R
+/A 2233 0 R
+/Parent 2219 0 R
+/Prev 2231 0 R
+>> endobj
+2231 0 obj <<
+/Title 2232 0 R
+/A 2229 0 R
+/Parent 2219 0 R
+/Prev 2227 0 R
+/Next 2235 0 R
+>> endobj
+2227 0 obj <<
+/Title 2228 0 R
+/A 2225 0 R
+/Parent 2219 0 R
+/Prev 2223 0 R
+/Next 2231 0 R
+>> endobj
+2223 0 obj <<
+/Title 2224 0 R
+/A 2221 0 R
+/Parent 2219 0 R
+/Next 2227 0 R
+>> endobj
+2219 0 obj <<
+/Title 2220 0 R
+/A 2217 0 R
+/Parent 199 0 R
+/Prev 2195 0 R
+/Next 2239 0 R
+/First 2223 0 R
+/Last 2235 0 R
+/Count -4
+>> endobj
+2215 0 obj <<
+/Title 2216 0 R
+/A 2213 0 R
+/Parent 2195 0 R
+/Prev 2211 0 R
+>> endobj
+2211 0 obj <<
+/Title 2212 0 R
+/A 2209 0 R
+/Parent 2195 0 R
+/Prev 2207 0 R
+/Next 2215 0 R
+>> endobj
+2207 0 obj <<
+/Title 2208 0 R
+/A 2205 0 R
+/Parent 2195 0 R
+/Prev 2203 0 R
+/Next 2211 0 R
+>> endobj
+2203 0 obj <<
+/Title 2204 0 R
+/A 2201 0 R
+/Parent 2195 0 R
+/Prev 2199 0 R
+/Next 2207 0 R
+>> endobj
+2199 0 obj <<
+/Title 2200 0 R
+/A 2197 0 R
+/Parent 2195 0 R
+/Next 2203 0 R
+>> endobj
+2195 0 obj <<
+/Title 2196 0 R
+/A 2193 0 R
+/Parent 199 0 R
+/Prev 2171 0 R
+/Next 2219 0 R
+/First 2199 0 R
+/Last 2215 0 R
+/Count -5
+>> endobj
+2191 0 obj <<
+/Title 2192 0 R
+/A 2189 0 R
+/Parent 2171 0 R
+/Prev 2187 0 R
+>> endobj
+2187 0 obj <<
+/Title 2188 0 R
+/A 2185 0 R
+/Parent 2171 0 R
+/Prev 2183 0 R
+/Next 2191 0 R
+>> endobj
+2183 0 obj <<
+/Title 2184 0 R
+/A 2181 0 R
+/Parent 2171 0 R
+/Prev 2179 0 R
+/Next 2187 0 R
+>> endobj
+2179 0 obj <<
+/Title 2180 0 R
+/A 2177 0 R
+/Parent 2171 0 R
+/Prev 2175 0 R
+/Next 2183 0 R
+>> endobj
+2175 0 obj <<
+/Title 2176 0 R
+/A 2173 0 R
+/Parent 2171 0 R
+/Next 2179 0 R
+>> endobj
+2171 0 obj <<
+/Title 2172 0 R
+/A 2169 0 R
+/Parent 199 0 R
+/Prev 2147 0 R
+/Next 2195 0 R
+/First 2175 0 R
+/Last 2191 0 R
+/Count -5
+>> endobj
+2167 0 obj <<
+/Title 2168 0 R
+/A 2165 0 R
+/Parent 2147 0 R
+/Prev 2163 0 R
+>> endobj
+2163 0 obj <<
+/Title 2164 0 R
+/A 2161 0 R
+/Parent 2147 0 R
+/Prev 2159 0 R
+/Next 2167 0 R
+>> endobj
+2159 0 obj <<
+/Title 2160 0 R
+/A 2157 0 R
+/Parent 2147 0 R
+/Prev 2155 0 R
+/Next 2163 0 R
+>> endobj
+2155 0 obj <<
+/Title 2156 0 R
+/A 2153 0 R
+/Parent 2147 0 R
+/Prev 2151 0 R
+/Next 2159 0 R
+>> endobj
+2151 0 obj <<
+/Title 2152 0 R
+/A 2149 0 R
+/Parent 2147 0 R
+/Next 2155 0 R
+>> endobj
+2147 0 obj <<
+/Title 2148 0 R
+/A 2145 0 R
+/Parent 199 0 R
+/Prev 2127 0 R
+/Next 2171 0 R
+/First 2151 0 R
+/Last 2167 0 R
+/Count -5
+>> endobj
+2143 0 obj <<
+/Title 2144 0 R
+/A 2141 0 R
+/Parent 2127 0 R
+/Prev 2139 0 R
+>> endobj
+2139 0 obj <<
+/Title 2140 0 R
+/A 2137 0 R
+/Parent 2127 0 R
+/Prev 2135 0 R
+/Next 2143 0 R
+>> endobj
+2135 0 obj <<
+/Title 2136 0 R
+/A 2133 0 R
+/Parent 2127 0 R
+/Prev 2131 0 R
+/Next 2139 0 R
+>> endobj
+2131 0 obj <<
+/Title 2132 0 R
+/A 2129 0 R
+/Parent 2127 0 R
+/Next 2135 0 R
+>> endobj
+2127 0 obj <<
+/Title 2128 0 R
+/A 2125 0 R
+/Parent 199 0 R
+/Prev 2123 0 R
+/Next 2147 0 R
+/First 2131 0 R
+/Last 2143 0 R
+/Count -4
+>> endobj
+2123 0 obj <<
+/Title 2124 0 R
+/A 2121 0 R
+/Parent 199 0 R
+/Prev 2103 0 R
+/Next 2127 0 R
+>> endobj
+2119 0 obj <<
+/Title 2120 0 R
+/A 2117 0 R
+/Parent 2103 0 R
+/Prev 2115 0 R
+>> endobj
+2115 0 obj <<
+/Title 2116 0 R
+/A 2113 0 R
+/Parent 2103 0 R
+/Prev 2111 0 R
+/Next 2119 0 R
+>> endobj
+2111 0 obj <<
+/Title 2112 0 R
+/A 2109 0 R
+/Parent 2103 0 R
+/Prev 2107 0 R
+/Next 2115 0 R
+>> endobj
+2107 0 obj <<
+/Title 2108 0 R
+/A 2105 0 R
+/Parent 2103 0 R
+/Next 2111 0 R
+>> endobj
+2103 0 obj <<
+/Title 2104 0 R
+/A 2101 0 R
+/Parent 199 0 R
+/Prev 2083 0 R
+/Next 2123 0 R
+/First 2107 0 R
+/Last 2119 0 R
+/Count -4
+>> endobj
+2099 0 obj <<
+/Title 2100 0 R
+/A 2097 0 R
+/Parent 2083 0 R
+/Prev 2095 0 R
+>> endobj
+2095 0 obj <<
+/Title 2096 0 R
+/A 2093 0 R
+/Parent 2083 0 R
+/Prev 2091 0 R
+/Next 2099 0 R
+>> endobj
+2091 0 obj <<
+/Title 2092 0 R
+/A 2089 0 R
+/Parent 2083 0 R
+/Prev 2087 0 R
+/Next 2095 0 R
+>> endobj
+2087 0 obj <<
+/Title 2088 0 R
+/A 2085 0 R
+/Parent 2083 0 R
+/Next 2091 0 R
+>> endobj
+2083 0 obj <<
+/Title 2084 0 R
+/A 2081 0 R
+/Parent 199 0 R
+/Prev 2067 0 R
+/Next 2103 0 R
+/First 2087 0 R
+/Last 2099 0 R
+/Count -4
+>> endobj
+2079 0 obj <<
+/Title 2080 0 R
+/A 2077 0 R
+/Parent 2067 0 R
+/Prev 2075 0 R
+>> endobj
+2075 0 obj <<
+/Title 2076 0 R
+/A 2073 0 R
+/Parent 2067 0 R
+/Prev 2071 0 R
+/Next 2079 0 R
+>> endobj
+2071 0 obj <<
+/Title 2072 0 R
+/A 2069 0 R
+/Parent 2067 0 R
+/Next 2075 0 R
+>> endobj
+2067 0 obj <<
+/Title 2068 0 R
+/A 2065 0 R
+/Parent 199 0 R
+/Prev 2047 0 R
+/Next 2083 0 R
+/First 2071 0 R
+/Last 2079 0 R
+/Count -3
+>> endobj
+2063 0 obj <<
+/Title 2064 0 R
+/A 2061 0 R
+/Parent 2047 0 R
+/Prev 2059 0 R
+>> endobj
+2059 0 obj <<
+/Title 2060 0 R
+/A 2057 0 R
+/Parent 2047 0 R
+/Prev 2055 0 R
+/Next 2063 0 R
+>> endobj
+2055 0 obj <<
+/Title 2056 0 R
+/A 2053 0 R
+/Parent 2047 0 R
+/Prev 2051 0 R
+/Next 2059 0 R
+>> endobj
+2051 0 obj <<
+/Title 2052 0 R
+/A 2049 0 R
+/Parent 2047 0 R
+/Next 2055 0 R
+>> endobj
+2047 0 obj <<
+/Title 2048 0 R
+/A 2045 0 R
+/Parent 199 0 R
+/Prev 2023 0 R
+/Next 2067 0 R
+/First 2051 0 R
+/Last 2063 0 R
+/Count -4
+>> endobj
+2043 0 obj <<
+/Title 2044 0 R
+/A 2041 0 R
+/Parent 2023 0 R
+/Prev 2039 0 R
+>> endobj
+2039 0 obj <<
+/Title 2040 0 R
+/A 2037 0 R
+/Parent 2023 0 R
+/Prev 2035 0 R
+/Next 2043 0 R
+>> endobj
+2035 0 obj <<
+/Title 2036 0 R
+/A 2033 0 R
+/Parent 2023 0 R
+/Prev 2031 0 R
+/Next 2039 0 R
+>> endobj
+2031 0 obj <<
+/Title 2032 0 R
+/A 2029 0 R
+/Parent 2023 0 R
+/Prev 2027 0 R
+/Next 2035 0 R
+>> endobj
+2027 0 obj <<
+/Title 2028 0 R
+/A 2025 0 R
+/Parent 2023 0 R
+/Next 2031 0 R
+>> endobj
+2023 0 obj <<
+/Title 2024 0 R
+/A 2021 0 R
+/Parent 199 0 R
+/Prev 1999 0 R
+/Next 2047 0 R
+/First 2027 0 R
+/Last 2043 0 R
+/Count -5
+>> endobj
+2019 0 obj <<
+/Title 2020 0 R
+/A 2017 0 R
+/Parent 1999 0 R
+/Prev 2015 0 R
+>> endobj
+2015 0 obj <<
+/Title 2016 0 R
+/A 2013 0 R
+/Parent 1999 0 R
+/Prev 2011 0 R
+/Next 2019 0 R
+>> endobj
+2011 0 obj <<
+/Title 2012 0 R
+/A 2009 0 R
+/Parent 1999 0 R
+/Prev 2007 0 R
+/Next 2015 0 R
+>> endobj
+2007 0 obj <<
+/Title 2008 0 R
+/A 2005 0 R
+/Parent 1999 0 R
+/Prev 2003 0 R
+/Next 2011 0 R
+>> endobj
+2003 0 obj <<
+/Title 2004 0 R
+/A 2001 0 R
+/Parent 1999 0 R
+/Next 2007 0 R
+>> endobj
+1999 0 obj <<
+/Title 2000 0 R
+/A 1997 0 R
+/Parent 199 0 R
+/Prev 1975 0 R
+/Next 2023 0 R
+/First 2003 0 R
+/Last 2019 0 R
+/Count -5
+>> endobj
+1995 0 obj <<
+/Title 1996 0 R
+/A 1993 0 R
+/Parent 1975 0 R
+/Prev 1991 0 R
+>> endobj
+1991 0 obj <<
+/Title 1992 0 R
+/A 1989 0 R
+/Parent 1975 0 R
+/Prev 1987 0 R
+/Next 1995 0 R
+>> endobj
+1987 0 obj <<
+/Title 1988 0 R
+/A 1985 0 R
+/Parent 1975 0 R
+/Prev 1983 0 R
+/Next 1991 0 R
+>> endobj
+1983 0 obj <<
+/Title 1984 0 R
+/A 1981 0 R
+/Parent 1975 0 R
+/Prev 1979 0 R
+/Next 1987 0 R
+>> endobj
+1979 0 obj <<
+/Title 1980 0 R
+/A 1977 0 R
+/Parent 1975 0 R
+/Next 1983 0 R
+>> endobj
+1975 0 obj <<
+/Title 1976 0 R
+/A 1973 0 R
+/Parent 199 0 R
+/Prev 1959 0 R
+/Next 1999 0 R
+/First 1979 0 R
+/Last 1995 0 R
+/Count -5
+>> endobj
+1971 0 obj <<
+/Title 1972 0 R
+/A 1969 0 R
+/Parent 1959 0 R
+/Prev 1967 0 R
+>> endobj
+1967 0 obj <<
+/Title 1968 0 R
+/A 1965 0 R
+/Parent 1959 0 R
+/Prev 1963 0 R
+/Next 1971 0 R
+>> endobj
+1963 0 obj <<
+/Title 1964 0 R
+/A 1961 0 R
+/Parent 1959 0 R
+/Next 1967 0 R
+>> endobj
+1959 0 obj <<
+/Title 1960 0 R
+/A 1957 0 R
+/Parent 199 0 R
+/Prev 1939 0 R
+/Next 1975 0 R
+/First 1963 0 R
+/Last 1971 0 R
+/Count -3
+>> endobj
+1955 0 obj <<
+/Title 1956 0 R
+/A 1953 0 R
+/Parent 1939 0 R
+/Prev 1951 0 R
+>> endobj
+1951 0 obj <<
+/Title 1952 0 R
+/A 1949 0 R
+/Parent 1939 0 R
+/Prev 1947 0 R
+/Next 1955 0 R
+>> endobj
+1947 0 obj <<
+/Title 1948 0 R
+/A 1945 0 R
+/Parent 1939 0 R
+/Prev 1943 0 R
+/Next 1951 0 R
+>> endobj
+1943 0 obj <<
+/Title 1944 0 R
+/A 1941 0 R
+/Parent 1939 0 R
+/Next 1947 0 R
+>> endobj
+1939 0 obj <<
+/Title 1940 0 R
+/A 1937 0 R
+/Parent 199 0 R
+/Prev 1935 0 R
+/Next 1959 0 R
+/First 1943 0 R
+/Last 1955 0 R
+/Count -4
+>> endobj
+1935 0 obj <<
+/Title 1936 0 R
+/A 1933 0 R
+/Parent 199 0 R
+/Prev 1915 0 R
+/Next 1939 0 R
+>> endobj
+1931 0 obj <<
+/Title 1932 0 R
+/A 1929 0 R
+/Parent 1915 0 R
+/Prev 1927 0 R
+>> endobj
+1927 0 obj <<
+/Title 1928 0 R
+/A 1925 0 R
+/Parent 1915 0 R
+/Prev 1923 0 R
+/Next 1931 0 R
+>> endobj
+1923 0 obj <<
+/Title 1924 0 R
+/A 1921 0 R
+/Parent 1915 0 R
+/Prev 1919 0 R
+/Next 1927 0 R
+>> endobj
+1919 0 obj <<
+/Title 1920 0 R
+/A 1917 0 R
+/Parent 1915 0 R
+/Next 1923 0 R
+>> endobj
+1915 0 obj <<
+/Title 1916 0 R
+/A 1913 0 R
+/Parent 199 0 R
+/Prev 1895 0 R
+/Next 1935 0 R
+/First 1919 0 R
+/Last 1931 0 R
+/Count -4
+>> endobj
+1911 0 obj <<
+/Title 1912 0 R
+/A 1909 0 R
+/Parent 1895 0 R
+/Prev 1907 0 R
+>> endobj
+1907 0 obj <<
+/Title 1908 0 R
+/A 1905 0 R
+/Parent 1895 0 R
+/Prev 1903 0 R
+/Next 1911 0 R
+>> endobj
+1903 0 obj <<
+/Title 1904 0 R
+/A 1901 0 R
+/Parent 1895 0 R
+/Prev 1899 0 R
+/Next 1907 0 R
+>> endobj
+1899 0 obj <<
+/Title 1900 0 R
+/A 1897 0 R
+/Parent 1895 0 R
+/Next 1903 0 R
+>> endobj
+1895 0 obj <<
+/Title 1896 0 R
+/A 1893 0 R
+/Parent 199 0 R
+/Prev 1875 0 R
+/Next 1915 0 R
+/First 1899 0 R
+/Last 1911 0 R
+/Count -4
+>> endobj
+1891 0 obj <<
+/Title 1892 0 R
+/A 1889 0 R
+/Parent 1875 0 R
+/Prev 1887 0 R
+>> endobj
+1887 0 obj <<
+/Title 1888 0 R
+/A 1885 0 R
+/Parent 1875 0 R
+/Prev 1883 0 R
+/Next 1891 0 R
+>> endobj
+1883 0 obj <<
+/Title 1884 0 R
+/A 1881 0 R
+/Parent 1875 0 R
+/Prev 1879 0 R
+/Next 1887 0 R
+>> endobj
+1879 0 obj <<
+/Title 1880 0 R
+/A 1877 0 R
+/Parent 1875 0 R
+/Next 1883 0 R
+>> endobj
+1875 0 obj <<
+/Title 1876 0 R
+/A 1873 0 R
+/Parent 199 0 R
+/Prev 1855 0 R
+/Next 1895 0 R
+/First 1879 0 R
+/Last 1891 0 R
+/Count -4
+>> endobj
+1871 0 obj <<
+/Title 1872 0 R
+/A 1869 0 R
+/Parent 1855 0 R
+/Prev 1867 0 R
+>> endobj
+1867 0 obj <<
+/Title 1868 0 R
+/A 1865 0 R
+/Parent 1855 0 R
+/Prev 1863 0 R
+/Next 1871 0 R
+>> endobj
+1863 0 obj <<
+/Title 1864 0 R
+/A 1861 0 R
+/Parent 1855 0 R
+/Prev 1859 0 R
+/Next 1867 0 R
+>> endobj
+1859 0 obj <<
+/Title 1860 0 R
+/A 1857 0 R
+/Parent 1855 0 R
+/Next 1863 0 R
+>> endobj
+1855 0 obj <<
+/Title 1856 0 R
+/A 1853 0 R
+/Parent 199 0 R
+/Prev 1835 0 R
+/Next 1875 0 R
+/First 1859 0 R
+/Last 1871 0 R
+/Count -4
+>> endobj
+1851 0 obj <<
+/Title 1852 0 R
+/A 1849 0 R
+/Parent 1835 0 R
+/Prev 1847 0 R
+>> endobj
+1847 0 obj <<
+/Title 1848 0 R
+/A 1845 0 R
+/Parent 1835 0 R
+/Prev 1843 0 R
+/Next 1851 0 R
+>> endobj
+1843 0 obj <<
+/Title 1844 0 R
+/A 1841 0 R
+/Parent 1835 0 R
+/Prev 1839 0 R
+/Next 1847 0 R
+>> endobj
+1839 0 obj <<
+/Title 1840 0 R
+/A 1837 0 R
+/Parent 1835 0 R
+/Next 1843 0 R
+>> endobj
+1835 0 obj <<
+/Title 1836 0 R
+/A 1833 0 R
+/Parent 199 0 R
+/Prev 1819 0 R
+/Next 1855 0 R
+/First 1839 0 R
+/Last 1851 0 R
+/Count -4
+>> endobj
+1831 0 obj <<
+/Title 1832 0 R
+/A 1829 0 R
+/Parent 1819 0 R
+/Prev 1827 0 R
+>> endobj
+1827 0 obj <<
+/Title 1828 0 R
+/A 1825 0 R
+/Parent 1819 0 R
+/Prev 1823 0 R
+/Next 1831 0 R
+>> endobj
+1823 0 obj <<
+/Title 1824 0 R
+/A 1821 0 R
+/Parent 1819 0 R
+/Next 1827 0 R
+>> endobj
+1819 0 obj <<
+/Title 1820 0 R
+/A 1817 0 R
+/Parent 199 0 R
+/Prev 1803 0 R
+/Next 1835 0 R
+/First 1823 0 R
+/Last 1831 0 R
+/Count -3
+>> endobj
+1815 0 obj <<
+/Title 1816 0 R
+/A 1813 0 R
+/Parent 1803 0 R
+/Prev 1811 0 R
+>> endobj
+1811 0 obj <<
+/Title 1812 0 R
+/A 1809 0 R
+/Parent 1803 0 R
+/Prev 1807 0 R
+/Next 1815 0 R
+>> endobj
+1807 0 obj <<
+/Title 1808 0 R
+/A 1805 0 R
+/Parent 1803 0 R
+/Next 1811 0 R
+>> endobj
+1803 0 obj <<
+/Title 1804 0 R
+/A 1801 0 R
+/Parent 199 0 R
+/Prev 1783 0 R
+/Next 1819 0 R
+/First 1807 0 R
+/Last 1815 0 R
+/Count -3
+>> endobj
+1799 0 obj <<
+/Title 1800 0 R
+/A 1797 0 R
+/Parent 1783 0 R
+/Prev 1795 0 R
+>> endobj
+1795 0 obj <<
+/Title 1796 0 R
+/A 1793 0 R
+/Parent 1783 0 R
+/Prev 1791 0 R
+/Next 1799 0 R
+>> endobj
+1791 0 obj <<
+/Title 1792 0 R
+/A 1789 0 R
+/Parent 1783 0 R
+/Prev 1787 0 R
+/Next 1795 0 R
+>> endobj
+1787 0 obj <<
+/Title 1788 0 R
+/A 1785 0 R
+/Parent 1783 0 R
+/Next 1791 0 R
+>> endobj
+1783 0 obj <<
+/Title 1784 0 R
+/A 1781 0 R
+/Parent 199 0 R
+/Prev 1763 0 R
+/Next 1803 0 R
+/First 1787 0 R
+/Last 1799 0 R
+/Count -4
+>> endobj
+1779 0 obj <<
+/Title 1780 0 R
+/A 1777 0 R
+/Parent 1763 0 R
+/Prev 1775 0 R
+>> endobj
+1775 0 obj <<
+/Title 1776 0 R
+/A 1773 0 R
+/Parent 1763 0 R
+/Prev 1771 0 R
+/Next 1779 0 R
+>> endobj
+1771 0 obj <<
+/Title 1772 0 R
+/A 1769 0 R
+/Parent 1763 0 R
+/Prev 1767 0 R
+/Next 1775 0 R
+>> endobj
+1767 0 obj <<
+/Title 1768 0 R
+/A 1765 0 R
+/Parent 1763 0 R
+/Next 1771 0 R
+>> endobj
+1763 0 obj <<
+/Title 1764 0 R
+/A 1761 0 R
+/Parent 199 0 R
+/Prev 1743 0 R
+/Next 1783 0 R
+/First 1767 0 R
+/Last 1779 0 R
+/Count -4
+>> endobj
+1759 0 obj <<
+/Title 1760 0 R
+/A 1757 0 R
+/Parent 1743 0 R
+/Prev 1755 0 R
+>> endobj
+1755 0 obj <<
+/Title 1756 0 R
+/A 1753 0 R
+/Parent 1743 0 R
+/Prev 1751 0 R
+/Next 1759 0 R
+>> endobj
+1751 0 obj <<
+/Title 1752 0 R
+/A 1749 0 R
+/Parent 1743 0 R
+/Prev 1747 0 R
+/Next 1755 0 R
+>> endobj
+1747 0 obj <<
+/Title 1748 0 R
+/A 1745 0 R
+/Parent 1743 0 R
+/Next 1751 0 R
+>> endobj
+1743 0 obj <<
+/Title 1744 0 R
+/A 1741 0 R
+/Parent 199 0 R
+/Prev 1719 0 R
+/Next 1763 0 R
+/First 1747 0 R
+/Last 1759 0 R
+/Count -4
+>> endobj
+1739 0 obj <<
+/Title 1740 0 R
+/A 1737 0 R
+/Parent 1719 0 R
+/Prev 1735 0 R
+>> endobj
+1735 0 obj <<
+/Title 1736 0 R
+/A 1733 0 R
+/Parent 1719 0 R
+/Prev 1731 0 R
+/Next 1739 0 R
+>> endobj
+1731 0 obj <<
+/Title 1732 0 R
+/A 1729 0 R
+/Parent 1719 0 R
+/Prev 1727 0 R
+/Next 1735 0 R
+>> endobj
+1727 0 obj <<
+/Title 1728 0 R
+/A 1725 0 R
+/Parent 1719 0 R
+/Prev 1723 0 R
+/Next 1731 0 R
+>> endobj
+1723 0 obj <<
+/Title 1724 0 R
+/A 1721 0 R
+/Parent 1719 0 R
+/Next 1727 0 R
+>> endobj
+1719 0 obj <<
+/Title 1720 0 R
+/A 1717 0 R
+/Parent 199 0 R
+/Prev 1699 0 R
+/Next 1743 0 R
+/First 1723 0 R
+/Last 1739 0 R
+/Count -5
+>> endobj
+1715 0 obj <<
+/Title 1716 0 R
+/A 1713 0 R
+/Parent 1699 0 R
+/Prev 1711 0 R
+>> endobj
+1711 0 obj <<
+/Title 1712 0 R
+/A 1709 0 R
+/Parent 1699 0 R
+/Prev 1707 0 R
+/Next 1715 0 R
+>> endobj
+1707 0 obj <<
+/Title 1708 0 R
+/A 1705 0 R
+/Parent 1699 0 R
+/Prev 1703 0 R
+/Next 1711 0 R
+>> endobj
+1703 0 obj <<
+/Title 1704 0 R
+/A 1701 0 R
+/Parent 1699 0 R
+/Next 1707 0 R
+>> endobj
+1699 0 obj <<
+/Title 1700 0 R
+/A 1697 0 R
+/Parent 199 0 R
+/Prev 1675 0 R
+/Next 1719 0 R
+/First 1703 0 R
+/Last 1715 0 R
+/Count -4
+>> endobj
+1695 0 obj <<
+/Title 1696 0 R
+/A 1693 0 R
+/Parent 1675 0 R
+/Prev 1691 0 R
+>> endobj
+1691 0 obj <<
+/Title 1692 0 R
+/A 1689 0 R
+/Parent 1675 0 R
+/Prev 1687 0 R
+/Next 1695 0 R
+>> endobj
+1687 0 obj <<
+/Title 1688 0 R
+/A 1685 0 R
+/Parent 1675 0 R
+/Prev 1683 0 R
+/Next 1691 0 R
+>> endobj
+1683 0 obj <<
+/Title 1684 0 R
+/A 1681 0 R
+/Parent 1675 0 R
+/Prev 1679 0 R
+/Next 1687 0 R
+>> endobj
+1679 0 obj <<
+/Title 1680 0 R
+/A 1677 0 R
+/Parent 1675 0 R
+/Next 1683 0 R
+>> endobj
+1675 0 obj <<
+/Title 1676 0 R
+/A 1673 0 R
+/Parent 199 0 R
+/Prev 1651 0 R
+/Next 1699 0 R
+/First 1679 0 R
+/Last 1695 0 R
+/Count -5
+>> endobj
+1671 0 obj <<
+/Title 1672 0 R
+/A 1669 0 R
+/Parent 1651 0 R
+/Prev 1667 0 R
+>> endobj
+1667 0 obj <<
+/Title 1668 0 R
+/A 1665 0 R
+/Parent 1651 0 R
+/Prev 1663 0 R
+/Next 1671 0 R
+>> endobj
+1663 0 obj <<
+/Title 1664 0 R
+/A 1661 0 R
+/Parent 1651 0 R
+/Prev 1659 0 R
+/Next 1667 0 R
+>> endobj
+1659 0 obj <<
+/Title 1660 0 R
+/A 1657 0 R
+/Parent 1651 0 R
+/Prev 1655 0 R
+/Next 1663 0 R
+>> endobj
+1655 0 obj <<
+/Title 1656 0 R
+/A 1653 0 R
+/Parent 1651 0 R
+/Next 1659 0 R
+>> endobj
+1651 0 obj <<
+/Title 1652 0 R
+/A 1649 0 R
+/Parent 199 0 R
+/Prev 1627 0 R
+/Next 1675 0 R
+/First 1655 0 R
+/Last 1671 0 R
+/Count -5
+>> endobj
+1647 0 obj <<
+/Title 1648 0 R
+/A 1645 0 R
+/Parent 1627 0 R
+/Prev 1643 0 R
+>> endobj
+1643 0 obj <<
+/Title 1644 0 R
+/A 1641 0 R
+/Parent 1627 0 R
+/Prev 1639 0 R
+/Next 1647 0 R
+>> endobj
+1639 0 obj <<
+/Title 1640 0 R
+/A 1637 0 R
+/Parent 1627 0 R
+/Prev 1635 0 R
+/Next 1643 0 R
+>> endobj
+1635 0 obj <<
+/Title 1636 0 R
+/A 1633 0 R
+/Parent 1627 0 R
+/Prev 1631 0 R
+/Next 1639 0 R
+>> endobj
+1631 0 obj <<
+/Title 1632 0 R
+/A 1629 0 R
+/Parent 1627 0 R
+/Next 1635 0 R
+>> endobj
+1627 0 obj <<
+/Title 1628 0 R
+/A 1625 0 R
+/Parent 199 0 R
+/Prev 1603 0 R
+/Next 1651 0 R
+/First 1631 0 R
+/Last 1647 0 R
+/Count -5
+>> endobj
+1623 0 obj <<
+/Title 1624 0 R
+/A 1621 0 R
+/Parent 1603 0 R
+/Prev 1619 0 R
+>> endobj
+1619 0 obj <<
+/Title 1620 0 R
+/A 1617 0 R
+/Parent 1603 0 R
+/Prev 1615 0 R
+/Next 1623 0 R
+>> endobj
+1615 0 obj <<
+/Title 1616 0 R
+/A 1613 0 R
+/Parent 1603 0 R
+/Prev 1611 0 R
+/Next 1619 0 R
+>> endobj
+1611 0 obj <<
+/Title 1612 0 R
+/A 1609 0 R
+/Parent 1603 0 R
+/Prev 1607 0 R
+/Next 1615 0 R
+>> endobj
+1607 0 obj <<
+/Title 1608 0 R
+/A 1605 0 R
+/Parent 1603 0 R
+/Next 1611 0 R
+>> endobj
+1603 0 obj <<
+/Title 1604 0 R
+/A 1601 0 R
+/Parent 199 0 R
+/Prev 1579 0 R
+/Next 1627 0 R
+/First 1607 0 R
+/Last 1623 0 R
+/Count -5
+>> endobj
+1599 0 obj <<
+/Title 1600 0 R
+/A 1597 0 R
+/Parent 1579 0 R
+/Prev 1595 0 R
+>> endobj
+1595 0 obj <<
+/Title 1596 0 R
+/A 1593 0 R
+/Parent 1579 0 R
+/Prev 1591 0 R
+/Next 1599 0 R
+>> endobj
+1591 0 obj <<
+/Title 1592 0 R
+/A 1589 0 R
+/Parent 1579 0 R
+/Prev 1587 0 R
+/Next 1595 0 R
+>> endobj
+1587 0 obj <<
+/Title 1588 0 R
+/A 1585 0 R
+/Parent 1579 0 R
+/Prev 1583 0 R
+/Next 1591 0 R
+>> endobj
+1583 0 obj <<
+/Title 1584 0 R
+/A 1581 0 R
+/Parent 1579 0 R
+/Next 1587 0 R
+>> endobj
+1579 0 obj <<
+/Title 1580 0 R
+/A 1577 0 R
+/Parent 199 0 R
+/Prev 1555 0 R
+/Next 1603 0 R
+/First 1583 0 R
+/Last 1599 0 R
+/Count -5
+>> endobj
+1575 0 obj <<
+/Title 1576 0 R
+/A 1573 0 R
+/Parent 1555 0 R
+/Prev 1571 0 R
+>> endobj
+1571 0 obj <<
+/Title 1572 0 R
+/A 1569 0 R
+/Parent 1555 0 R
+/Prev 1567 0 R
+/Next 1575 0 R
+>> endobj
+1567 0 obj <<
+/Title 1568 0 R
+/A 1565 0 R
+/Parent 1555 0 R
+/Prev 1563 0 R
+/Next 1571 0 R
+>> endobj
+1563 0 obj <<
+/Title 1564 0 R
+/A 1561 0 R
+/Parent 1555 0 R
+/Prev 1559 0 R
+/Next 1567 0 R
+>> endobj
+1559 0 obj <<
+/Title 1560 0 R
+/A 1557 0 R
+/Parent 1555 0 R
+/Next 1563 0 R
+>> endobj
+1555 0 obj <<
+/Title 1556 0 R
+/A 1553 0 R
+/Parent 199 0 R
+/Prev 1531 0 R
+/Next 1579 0 R
+/First 1559 0 R
+/Last 1575 0 R
+/Count -5
+>> endobj
+1551 0 obj <<
+/Title 1552 0 R
+/A 1549 0 R
+/Parent 1531 0 R
+/Prev 1547 0 R
+>> endobj
+1547 0 obj <<
+/Title 1548 0 R
+/A 1545 0 R
+/Parent 1531 0 R
+/Prev 1543 0 R
+/Next 1551 0 R
+>> endobj
+1543 0 obj <<
+/Title 1544 0 R
+/A 1541 0 R
+/Parent 1531 0 R
+/Prev 1539 0 R
+/Next 1547 0 R
+>> endobj
+1539 0 obj <<
+/Title 1540 0 R
+/A 1537 0 R
+/Parent 1531 0 R
+/Prev 1535 0 R
+/Next 1543 0 R
+>> endobj
+1535 0 obj <<
+/Title 1536 0 R
+/A 1533 0 R
+/Parent 1531 0 R
+/Next 1539 0 R
+>> endobj
+1531 0 obj <<
+/Title 1532 0 R
+/A 1529 0 R
+/Parent 199 0 R
+/Prev 1507 0 R
+/Next 1555 0 R
+/First 1535 0 R
+/Last 1551 0 R
+/Count -5
+>> endobj
+1527 0 obj <<
+/Title 1528 0 R
+/A 1525 0 R
+/Parent 1507 0 R
+/Prev 1523 0 R
+>> endobj
+1523 0 obj <<
+/Title 1524 0 R
+/A 1521 0 R
+/Parent 1507 0 R
+/Prev 1519 0 R
+/Next 1527 0 R
+>> endobj
+1519 0 obj <<
+/Title 1520 0 R
+/A 1517 0 R
+/Parent 1507 0 R
+/Prev 1515 0 R
+/Next 1523 0 R
+>> endobj
+1515 0 obj <<
+/Title 1516 0 R
+/A 1513 0 R
+/Parent 1507 0 R
+/Prev 1511 0 R
+/Next 1519 0 R
+>> endobj
+1511 0 obj <<
+/Title 1512 0 R
+/A 1509 0 R
+/Parent 1507 0 R
+/Next 1515 0 R
+>> endobj
+1507 0 obj <<
+/Title 1508 0 R
+/A 1505 0 R
+/Parent 199 0 R
+/Prev 1487 0 R
+/Next 1531 0 R
+/First 1511 0 R
+/Last 1527 0 R
+/Count -5
+>> endobj
+1503 0 obj <<
+/Title 1504 0 R
+/A 1501 0 R
+/Parent 1487 0 R
+/Prev 1499 0 R
+>> endobj
+1499 0 obj <<
+/Title 1500 0 R
+/A 1497 0 R
+/Parent 1487 0 R
+/Prev 1495 0 R
+/Next 1503 0 R
+>> endobj
+1495 0 obj <<
+/Title 1496 0 R
+/A 1493 0 R
+/Parent 1487 0 R
+/Prev 1491 0 R
+/Next 1499 0 R
+>> endobj
+1491 0 obj <<
+/Title 1492 0 R
+/A 1489 0 R
+/Parent 1487 0 R
+/Next 1495 0 R
+>> endobj
+1487 0 obj <<
+/Title 1488 0 R
+/A 1485 0 R
+/Parent 199 0 R
+/Prev 1463 0 R
+/Next 1507 0 R
+/First 1491 0 R
+/Last 1503 0 R
+/Count -4
+>> endobj
+1483 0 obj <<
+/Title 1484 0 R
+/A 1481 0 R
+/Parent 1463 0 R
+/Prev 1479 0 R
+>> endobj
+1479 0 obj <<
+/Title 1480 0 R
+/A 1477 0 R
+/Parent 1463 0 R
+/Prev 1475 0 R
+/Next 1483 0 R
+>> endobj
+1475 0 obj <<
+/Title 1476 0 R
+/A 1473 0 R
+/Parent 1463 0 R
+/Prev 1471 0 R
+/Next 1479 0 R
+>> endobj
+1471 0 obj <<
+/Title 1472 0 R
+/A 1469 0 R
+/Parent 1463 0 R
+/Prev 1467 0 R
+/Next 1475 0 R
+>> endobj
+1467 0 obj <<
+/Title 1468 0 R
+/A 1465 0 R
+/Parent 1463 0 R
+/Next 1471 0 R
+>> endobj
+1463 0 obj <<
+/Title 1464 0 R
+/A 1461 0 R
+/Parent 199 0 R
+/Prev 1443 0 R
+/Next 1487 0 R
+/First 1467 0 R
+/Last 1483 0 R
+/Count -5
+>> endobj
+1459 0 obj <<
+/Title 1460 0 R
+/A 1457 0 R
+/Parent 1443 0 R
+/Prev 1455 0 R
+>> endobj
+1455 0 obj <<
+/Title 1456 0 R
+/A 1453 0 R
+/Parent 1443 0 R
+/Prev 1451 0 R
+/Next 1459 0 R
+>> endobj
+1451 0 obj <<
+/Title 1452 0 R
+/A 1449 0 R
+/Parent 1443 0 R
+/Prev 1447 0 R
+/Next 1455 0 R
+>> endobj
+1447 0 obj <<
+/Title 1448 0 R
+/A 1445 0 R
+/Parent 1443 0 R
+/Next 1451 0 R
+>> endobj
+1443 0 obj <<
+/Title 1444 0 R
+/A 1441 0 R
+/Parent 199 0 R
+/Prev 1427 0 R
+/Next 1463 0 R
+/First 1447 0 R
+/Last 1459 0 R
+/Count -4
+>> endobj
+1439 0 obj <<
+/Title 1440 0 R
+/A 1437 0 R
+/Parent 1427 0 R
+/Prev 1435 0 R
+>> endobj
+1435 0 obj <<
+/Title 1436 0 R
+/A 1433 0 R
+/Parent 1427 0 R
+/Prev 1431 0 R
+/Next 1439 0 R
+>> endobj
+1431 0 obj <<
+/Title 1432 0 R
+/A 1429 0 R
+/Parent 1427 0 R
+/Next 1435 0 R
+>> endobj
+1427 0 obj <<
+/Title 1428 0 R
+/A 1425 0 R
+/Parent 199 0 R
+/Prev 1407 0 R
+/Next 1443 0 R
+/First 1431 0 R
+/Last 1439 0 R
+/Count -3
+>> endobj
+1423 0 obj <<
+/Title 1424 0 R
+/A 1421 0 R
+/Parent 1407 0 R
+/Prev 1419 0 R
+>> endobj
+1419 0 obj <<
+/Title 1420 0 R
+/A 1417 0 R
+/Parent 1407 0 R
+/Prev 1415 0 R
+/Next 1423 0 R
+>> endobj
+1415 0 obj <<
+/Title 1416 0 R
+/A 1413 0 R
+/Parent 1407 0 R
+/Prev 1411 0 R
+/Next 1419 0 R
+>> endobj
+1411 0 obj <<
+/Title 1412 0 R
+/A 1409 0 R
+/Parent 1407 0 R
+/Next 1415 0 R
+>> endobj
+1407 0 obj <<
+/Title 1408 0 R
+/A 1405 0 R
+/Parent 199 0 R
+/Prev 1387 0 R
+/Next 1427 0 R
+/First 1411 0 R
+/Last 1423 0 R
+/Count -4
+>> endobj
+1403 0 obj <<
+/Title 1404 0 R
+/A 1401 0 R
+/Parent 1387 0 R
+/Prev 1399 0 R
+>> endobj
+1399 0 obj <<
+/Title 1400 0 R
+/A 1397 0 R
+/Parent 1387 0 R
+/Prev 1395 0 R
+/Next 1403 0 R
+>> endobj
+1395 0 obj <<
+/Title 1396 0 R
+/A 1393 0 R
+/Parent 1387 0 R
+/Prev 1391 0 R
+/Next 1399 0 R
+>> endobj
+1391 0 obj <<
+/Title 1392 0 R
+/A 1389 0 R
+/Parent 1387 0 R
+/Next 1395 0 R
+>> endobj
+1387 0 obj <<
+/Title 1388 0 R
+/A 1385 0 R
+/Parent 199 0 R
+/Prev 1371 0 R
+/Next 1407 0 R
+/First 1391 0 R
+/Last 1403 0 R
+/Count -4
+>> endobj
+1383 0 obj <<
+/Title 1384 0 R
+/A 1381 0 R
+/Parent 1371 0 R
+/Prev 1379 0 R
+>> endobj
+1379 0 obj <<
+/Title 1380 0 R
+/A 1377 0 R
+/Parent 1371 0 R
+/Prev 1375 0 R
+/Next 1383 0 R
+>> endobj
+1375 0 obj <<
+/Title 1376 0 R
+/A 1373 0 R
+/Parent 1371 0 R
+/Next 1379 0 R
+>> endobj
+1371 0 obj <<
+/Title 1372 0 R
+/A 1369 0 R
+/Parent 199 0 R
+/Prev 1355 0 R
+/Next 1387 0 R
+/First 1375 0 R
+/Last 1383 0 R
+/Count -3
+>> endobj
+1367 0 obj <<
+/Title 1368 0 R
+/A 1365 0 R
+/Parent 1355 0 R
+/Prev 1363 0 R
+>> endobj
+1363 0 obj <<
+/Title 1364 0 R
+/A 1361 0 R
+/Parent 1355 0 R
+/Prev 1359 0 R
+/Next 1367 0 R
+>> endobj
+1359 0 obj <<
+/Title 1360 0 R
+/A 1357 0 R
+/Parent 1355 0 R
+/Next 1363 0 R
+>> endobj
+1355 0 obj <<
+/Title 1356 0 R
+/A 1353 0 R
+/Parent 199 0 R
+/Prev 1339 0 R
+/Next 1371 0 R
+/First 1359 0 R
+/Last 1367 0 R
+/Count -3
+>> endobj
+1351 0 obj <<
+/Title 1352 0 R
+/A 1349 0 R
+/Parent 1339 0 R
+/Prev 1347 0 R
+>> endobj
+1347 0 obj <<
+/Title 1348 0 R
+/A 1345 0 R
+/Parent 1339 0 R
+/Prev 1343 0 R
+/Next 1351 0 R
+>> endobj
+1343 0 obj <<
+/Title 1344 0 R
+/A 1341 0 R
+/Parent 1339 0 R
+/Next 1347 0 R
+>> endobj
+1339 0 obj <<
+/Title 1340 0 R
+/A 1337 0 R
+/Parent 199 0 R
+/Prev 1319 0 R
+/Next 1355 0 R
+/First 1343 0 R
+/Last 1351 0 R
+/Count -3
+>> endobj
+1335 0 obj <<
+/Title 1336 0 R
+/A 1333 0 R
+/Parent 1319 0 R
+/Prev 1331 0 R
+>> endobj
+1331 0 obj <<
+/Title 1332 0 R
+/A 1329 0 R
+/Parent 1319 0 R
+/Prev 1327 0 R
+/Next 1335 0 R
+>> endobj
+1327 0 obj <<
+/Title 1328 0 R
+/A 1325 0 R
+/Parent 1319 0 R
+/Prev 1323 0 R
+/Next 1331 0 R
+>> endobj
+1323 0 obj <<
+/Title 1324 0 R
+/A 1321 0 R
+/Parent 1319 0 R
+/Next 1327 0 R
+>> endobj
+1319 0 obj <<
+/Title 1320 0 R
+/A 1317 0 R
+/Parent 199 0 R
+/Prev 1299 0 R
+/Next 1339 0 R
+/First 1323 0 R
+/Last 1335 0 R
+/Count -4
+>> endobj
+1315 0 obj <<
+/Title 1316 0 R
+/A 1313 0 R
+/Parent 1299 0 R
+/Prev 1311 0 R
+>> endobj
+1311 0 obj <<
+/Title 1312 0 R
+/A 1309 0 R
+/Parent 1299 0 R
+/Prev 1307 0 R
+/Next 1315 0 R
+>> endobj
+1307 0 obj <<
+/Title 1308 0 R
+/A 1305 0 R
+/Parent 1299 0 R
+/Prev 1303 0 R
+/Next 1311 0 R
+>> endobj
+1303 0 obj <<
+/Title 1304 0 R
+/A 1301 0 R
+/Parent 1299 0 R
+/Next 1307 0 R
+>> endobj
+1299 0 obj <<
+/Title 1300 0 R
+/A 1297 0 R
+/Parent 199 0 R
+/Prev 1279 0 R
+/Next 1319 0 R
+/First 1303 0 R
+/Last 1315 0 R
+/Count -4
+>> endobj
+1295 0 obj <<
+/Title 1296 0 R
+/A 1293 0 R
+/Parent 1279 0 R
+/Prev 1291 0 R
+>> endobj
+1291 0 obj <<
+/Title 1292 0 R
+/A 1289 0 R
+/Parent 1279 0 R
+/Prev 1287 0 R
+/Next 1295 0 R
+>> endobj
+1287 0 obj <<
+/Title 1288 0 R
+/A 1285 0 R
+/Parent 1279 0 R
+/Prev 1283 0 R
+/Next 1291 0 R
+>> endobj
+1283 0 obj <<
+/Title 1284 0 R
+/A 1281 0 R
+/Parent 1279 0 R
+/Next 1287 0 R
+>> endobj
+1279 0 obj <<
+/Title 1280 0 R
+/A 1277 0 R
+/Parent 199 0 R
+/Prev 1259 0 R
+/Next 1299 0 R
+/First 1283 0 R
+/Last 1295 0 R
+/Count -4
+>> endobj
+1275 0 obj <<
+/Title 1276 0 R
+/A 1273 0 R
+/Parent 1259 0 R
+/Prev 1271 0 R
+>> endobj
+1271 0 obj <<
+/Title 1272 0 R
+/A 1269 0 R
+/Parent 1259 0 R
+/Prev 1267 0 R
+/Next 1275 0 R
+>> endobj
+1267 0 obj <<
+/Title 1268 0 R
+/A 1265 0 R
+/Parent 1259 0 R
+/Prev 1263 0 R
+/Next 1271 0 R
+>> endobj
+1263 0 obj <<
+/Title 1264 0 R
+/A 1261 0 R
+/Parent 1259 0 R
+/Next 1267 0 R
+>> endobj
+1259 0 obj <<
+/Title 1260 0 R
+/A 1257 0 R
+/Parent 199 0 R
+/Prev 1239 0 R
+/Next 1279 0 R
+/First 1263 0 R
+/Last 1275 0 R
+/Count -4
+>> endobj
+1255 0 obj <<
+/Title 1256 0 R
+/A 1253 0 R
+/Parent 1239 0 R
+/Prev 1251 0 R
+>> endobj
+1251 0 obj <<
+/Title 1252 0 R
+/A 1249 0 R
+/Parent 1239 0 R
+/Prev 1247 0 R
+/Next 1255 0 R
+>> endobj
+1247 0 obj <<
+/Title 1248 0 R
+/A 1245 0 R
+/Parent 1239 0 R
+/Prev 1243 0 R
+/Next 1251 0 R
+>> endobj
+1243 0 obj <<
+/Title 1244 0 R
+/A 1241 0 R
+/Parent 1239 0 R
+/Next 1247 0 R
+>> endobj
+1239 0 obj <<
+/Title 1240 0 R
+/A 1237 0 R
+/Parent 199 0 R
+/Prev 1219 0 R
+/Next 1259 0 R
+/First 1243 0 R
+/Last 1255 0 R
+/Count -4
+>> endobj
+1235 0 obj <<
+/Title 1236 0 R
+/A 1233 0 R
+/Parent 1219 0 R
+/Prev 1231 0 R
+>> endobj
+1231 0 obj <<
+/Title 1232 0 R
+/A 1229 0 R
+/Parent 1219 0 R
+/Prev 1227 0 R
+/Next 1235 0 R
+>> endobj
+1227 0 obj <<
+/Title 1228 0 R
+/A 1225 0 R
+/Parent 1219 0 R
+/Prev 1223 0 R
+/Next 1231 0 R
+>> endobj
+1223 0 obj <<
+/Title 1224 0 R
+/A 1221 0 R
+/Parent 1219 0 R
+/Next 1227 0 R
+>> endobj
+1219 0 obj <<
+/Title 1220 0 R
+/A 1217 0 R
+/Parent 199 0 R
+/Prev 1199 0 R
+/Next 1239 0 R
+/First 1223 0 R
+/Last 1235 0 R
+/Count -4
+>> endobj
+1215 0 obj <<
+/Title 1216 0 R
+/A 1213 0 R
+/Parent 1199 0 R
+/Prev 1211 0 R
+>> endobj
+1211 0 obj <<
+/Title 1212 0 R
+/A 1209 0 R
+/Parent 1199 0 R
+/Prev 1207 0 R
+/Next 1215 0 R
+>> endobj
+1207 0 obj <<
+/Title 1208 0 R
+/A 1205 0 R
+/Parent 1199 0 R
+/Prev 1203 0 R
+/Next 1211 0 R
+>> endobj
+1203 0 obj <<
+/Title 1204 0 R
+/A 1201 0 R
+/Parent 1199 0 R
+/Next 1207 0 R
+>> endobj
+1199 0 obj <<
+/Title 1200 0 R
+/A 1197 0 R
+/Parent 199 0 R
+/Prev 1179 0 R
+/Next 1219 0 R
+/First 1203 0 R
+/Last 1215 0 R
+/Count -4
+>> endobj
+1195 0 obj <<
+/Title 1196 0 R
+/A 1193 0 R
+/Parent 1179 0 R
+/Prev 1191 0 R
+>> endobj
+1191 0 obj <<
+/Title 1192 0 R
+/A 1189 0 R
+/Parent 1179 0 R
+/Prev 1187 0 R
+/Next 1195 0 R
+>> endobj
+1187 0 obj <<
+/Title 1188 0 R
+/A 1185 0 R
+/Parent 1179 0 R
+/Prev 1183 0 R
+/Next 1191 0 R
+>> endobj
+1183 0 obj <<
+/Title 1184 0 R
+/A 1181 0 R
+/Parent 1179 0 R
+/Next 1187 0 R
+>> endobj
+1179 0 obj <<
+/Title 1180 0 R
+/A 1177 0 R
+/Parent 199 0 R
+/Prev 1159 0 R
+/Next 1199 0 R
+/First 1183 0 R
+/Last 1195 0 R
+/Count -4
+>> endobj
+1175 0 obj <<
+/Title 1176 0 R
+/A 1173 0 R
+/Parent 1159 0 R
+/Prev 1171 0 R
+>> endobj
+1171 0 obj <<
+/Title 1172 0 R
+/A 1169 0 R
+/Parent 1159 0 R
+/Prev 1167 0 R
+/Next 1175 0 R
+>> endobj
+1167 0 obj <<
+/Title 1168 0 R
+/A 1165 0 R
+/Parent 1159 0 R
+/Prev 1163 0 R
+/Next 1171 0 R
+>> endobj
+1163 0 obj <<
+/Title 1164 0 R
+/A 1161 0 R
+/Parent 1159 0 R
+/Next 1167 0 R
+>> endobj
+1159 0 obj <<
+/Title 1160 0 R
+/A 1157 0 R
+/Parent 199 0 R
+/Prev 1139 0 R
+/Next 1179 0 R
+/First 1163 0 R
+/Last 1175 0 R
+/Count -4
+>> endobj
+1155 0 obj <<
+/Title 1156 0 R
+/A 1153 0 R
+/Parent 1139 0 R
+/Prev 1151 0 R
+>> endobj
+1151 0 obj <<
+/Title 1152 0 R
+/A 1149 0 R
+/Parent 1139 0 R
+/Prev 1147 0 R
+/Next 1155 0 R
+>> endobj
+1147 0 obj <<
+/Title 1148 0 R
+/A 1145 0 R
+/Parent 1139 0 R
+/Prev 1143 0 R
+/Next 1151 0 R
+>> endobj
+1143 0 obj <<
+/Title 1144 0 R
+/A 1141 0 R
+/Parent 1139 0 R
+/Next 1147 0 R
+>> endobj
+1139 0 obj <<
+/Title 1140 0 R
+/A 1137 0 R
+/Parent 199 0 R
+/Prev 1135 0 R
+/Next 1159 0 R
+/First 1143 0 R
+/Last 1155 0 R
+/Count -4
+>> endobj
+1135 0 obj <<
+/Title 1136 0 R
+/A 1133 0 R
+/Parent 199 0 R
+/Prev 1111 0 R
+/Next 1139 0 R
+>> endobj
+1131 0 obj <<
+/Title 1132 0 R
+/A 1129 0 R
+/Parent 1111 0 R
+/Prev 1127 0 R
+>> endobj
+1127 0 obj <<
+/Title 1128 0 R
+/A 1125 0 R
+/Parent 1111 0 R
+/Prev 1123 0 R
+/Next 1131 0 R
+>> endobj
+1123 0 obj <<
+/Title 1124 0 R
+/A 1121 0 R
+/Parent 1111 0 R
+/Prev 1119 0 R
+/Next 1127 0 R
+>> endobj
+1119 0 obj <<
+/Title 1120 0 R
+/A 1117 0 R
+/Parent 1111 0 R
+/Prev 1115 0 R
+/Next 1123 0 R
+>> endobj
+1115 0 obj <<
+/Title 1116 0 R
+/A 1113 0 R
+/Parent 1111 0 R
+/Next 1119 0 R
+>> endobj
+1111 0 obj <<
+/Title 1112 0 R
+/A 1109 0 R
+/Parent 199 0 R
+/Prev 1083 0 R
+/Next 1135 0 R
+/First 1115 0 R
+/Last 1131 0 R
+/Count -5
+>> endobj
+1107 0 obj <<
+/Title 1108 0 R
+/A 1105 0 R
+/Parent 1083 0 R
+/Prev 1103 0 R
+>> endobj
+1103 0 obj <<
+/Title 1104 0 R
+/A 1101 0 R
+/Parent 1083 0 R
+/Prev 1099 0 R
+/Next 1107 0 R
+>> endobj
+1099 0 obj <<
+/Title 1100 0 R
+/A 1097 0 R
+/Parent 1083 0 R
+/Prev 1095 0 R
+/Next 1103 0 R
+>> endobj
+1095 0 obj <<
+/Title 1096 0 R
+/A 1093 0 R
+/Parent 1083 0 R
+/Prev 1091 0 R
+/Next 1099 0 R
+>> endobj
+1091 0 obj <<
+/Title 1092 0 R
+/A 1089 0 R
+/Parent 1083 0 R
+/Prev 1087 0 R
+/Next 1095 0 R
+>> endobj
+1087 0 obj <<
+/Title 1088 0 R
+/A 1085 0 R
+/Parent 1083 0 R
+/Next 1091 0 R
+>> endobj
+1083 0 obj <<
+/Title 1084 0 R
+/A 1081 0 R
+/Parent 199 0 R
+/Prev 1059 0 R
+/Next 1111 0 R
+/First 1087 0 R
+/Last 1107 0 R
+/Count -6
+>> endobj
+1079 0 obj <<
+/Title 1080 0 R
+/A 1077 0 R
+/Parent 1059 0 R
+/Prev 1075 0 R
+>> endobj
+1075 0 obj <<
+/Title 1076 0 R
+/A 1073 0 R
+/Parent 1059 0 R
+/Prev 1071 0 R
+/Next 1079 0 R
+>> endobj
+1071 0 obj <<
+/Title 1072 0 R
+/A 1069 0 R
+/Parent 1059 0 R
+/Prev 1067 0 R
+/Next 1075 0 R
+>> endobj
+1067 0 obj <<
+/Title 1068 0 R
+/A 1065 0 R
+/Parent 1059 0 R
+/Prev 1063 0 R
+/Next 1071 0 R
+>> endobj
+1063 0 obj <<
+/Title 1064 0 R
+/A 1061 0 R
+/Parent 1059 0 R
+/Next 1067 0 R
+>> endobj
+1059 0 obj <<
+/Title 1060 0 R
+/A 1057 0 R
+/Parent 199 0 R
+/Prev 1035 0 R
+/Next 1083 0 R
+/First 1063 0 R
+/Last 1079 0 R
+/Count -5
+>> endobj
+1055 0 obj <<
+/Title 1056 0 R
+/A 1053 0 R
+/Parent 1035 0 R
+/Prev 1051 0 R
+>> endobj
+1051 0 obj <<
+/Title 1052 0 R
+/A 1049 0 R
+/Parent 1035 0 R
+/Prev 1047 0 R
+/Next 1055 0 R
+>> endobj
+1047 0 obj <<
+/Title 1048 0 R
+/A 1045 0 R
+/Parent 1035 0 R
+/Prev 1043 0 R
+/Next 1051 0 R
+>> endobj
+1043 0 obj <<
+/Title 1044 0 R
+/A 1041 0 R
+/Parent 1035 0 R
+/Prev 1039 0 R
+/Next 1047 0 R
+>> endobj
+1039 0 obj <<
+/Title 1040 0 R
+/A 1037 0 R
+/Parent 1035 0 R
+/Next 1043 0 R
+>> endobj
+1035 0 obj <<
+/Title 1036 0 R
+/A 1033 0 R
+/Parent 199 0 R
+/Prev 1011 0 R
+/Next 1059 0 R
+/First 1039 0 R
+/Last 1055 0 R
+/Count -5
+>> endobj
+1031 0 obj <<
+/Title 1032 0 R
+/A 1029 0 R
+/Parent 1011 0 R
+/Prev 1027 0 R
+>> endobj
+1027 0 obj <<
+/Title 1028 0 R
+/A 1025 0 R
+/Parent 1011 0 R
+/Prev 1023 0 R
+/Next 1031 0 R
+>> endobj
+1023 0 obj <<
+/Title 1024 0 R
+/A 1021 0 R
+/Parent 1011 0 R
+/Prev 1019 0 R
+/Next 1027 0 R
+>> endobj
+1019 0 obj <<
+/Title 1020 0 R
+/A 1017 0 R
+/Parent 1011 0 R
+/Prev 1015 0 R
+/Next 1023 0 R
+>> endobj
+1015 0 obj <<
+/Title 1016 0 R
+/A 1013 0 R
+/Parent 1011 0 R
+/Next 1019 0 R
+>> endobj
+1011 0 obj <<
+/Title 1012 0 R
+/A 1009 0 R
+/Parent 199 0 R
+/Prev 987 0 R
+/Next 1035 0 R
+/First 1015 0 R
+/Last 1031 0 R
+/Count -5
+>> endobj
+1007 0 obj <<
+/Title 1008 0 R
+/A 1005 0 R
+/Parent 987 0 R
+/Prev 1003 0 R
+>> endobj
+1003 0 obj <<
+/Title 1004 0 R
+/A 1001 0 R
+/Parent 987 0 R
+/Prev 999 0 R
+/Next 1007 0 R
+>> endobj
+999 0 obj <<
+/Title 1000 0 R
+/A 997 0 R
+/Parent 987 0 R
+/Prev 995 0 R
+/Next 1003 0 R
+>> endobj
+995 0 obj <<
+/Title 996 0 R
+/A 993 0 R
+/Parent 987 0 R
+/Prev 991 0 R
+/Next 999 0 R
+>> endobj
+991 0 obj <<
+/Title 992 0 R
+/A 989 0 R
+/Parent 987 0 R
+/Next 995 0 R
+>> endobj
+987 0 obj <<
+/Title 988 0 R
+/A 985 0 R
+/Parent 199 0 R
+/Prev 963 0 R
+/Next 1011 0 R
+/First 991 0 R
+/Last 1007 0 R
+/Count -5
+>> endobj
+983 0 obj <<
+/Title 984 0 R
+/A 981 0 R
+/Parent 963 0 R
+/Prev 979 0 R
+>> endobj
+979 0 obj <<
+/Title 980 0 R
+/A 977 0 R
+/Parent 963 0 R
+/Prev 975 0 R
+/Next 983 0 R
+>> endobj
+975 0 obj <<
+/Title 976 0 R
+/A 973 0 R
+/Parent 963 0 R
+/Prev 971 0 R
+/Next 979 0 R
+>> endobj
+971 0 obj <<
+/Title 972 0 R
+/A 969 0 R
+/Parent 963 0 R
+/Prev 967 0 R
+/Next 975 0 R
+>> endobj
+967 0 obj <<
+/Title 968 0 R
+/A 965 0 R
+/Parent 963 0 R
+/Next 971 0 R
+>> endobj
+963 0 obj <<
+/Title 964 0 R
+/A 961 0 R
+/Parent 199 0 R
+/Prev 939 0 R
+/Next 987 0 R
+/First 967 0 R
+/Last 983 0 R
+/Count -5
+>> endobj
+959 0 obj <<
+/Title 960 0 R
+/A 957 0 R
+/Parent 939 0 R
+/Prev 955 0 R
+>> endobj
+955 0 obj <<
+/Title 956 0 R
+/A 953 0 R
+/Parent 939 0 R
+/Prev 951 0 R
+/Next 959 0 R
+>> endobj
+951 0 obj <<
+/Title 952 0 R
+/A 949 0 R
+/Parent 939 0 R
+/Prev 947 0 R
+/Next 955 0 R
+>> endobj
+947 0 obj <<
+/Title 948 0 R
+/A 945 0 R
+/Parent 939 0 R
+/Prev 943 0 R
+/Next 951 0 R
+>> endobj
+943 0 obj <<
+/Title 944 0 R
+/A 941 0 R
+/Parent 939 0 R
+/Next 947 0 R
+>> endobj
+939 0 obj <<
+/Title 940 0 R
+/A 937 0 R
+/Parent 199 0 R
+/Prev 915 0 R
+/Next 963 0 R
+/First 943 0 R
+/Last 959 0 R
+/Count -5
+>> endobj
+935 0 obj <<
+/Title 936 0 R
+/A 933 0 R
+/Parent 915 0 R
+/Prev 931 0 R
+>> endobj
+931 0 obj <<
+/Title 932 0 R
+/A 929 0 R
+/Parent 915 0 R
+/Prev 927 0 R
+/Next 935 0 R
+>> endobj
+927 0 obj <<
+/Title 928 0 R
+/A 925 0 R
+/Parent 915 0 R
+/Prev 923 0 R
+/Next 931 0 R
+>> endobj
+923 0 obj <<
+/Title 924 0 R
+/A 921 0 R
+/Parent 915 0 R
+/Prev 919 0 R
+/Next 927 0 R
+>> endobj
+919 0 obj <<
+/Title 920 0 R
+/A 917 0 R
+/Parent 915 0 R
+/Next 923 0 R
+>> endobj
+915 0 obj <<
+/Title 916 0 R
+/A 913 0 R
+/Parent 199 0 R
+/Prev 891 0 R
+/Next 939 0 R
+/First 919 0 R
+/Last 935 0 R
+/Count -5
+>> endobj
+911 0 obj <<
+/Title 912 0 R
+/A 909 0 R
+/Parent 891 0 R
+/Prev 907 0 R
+>> endobj
+907 0 obj <<
+/Title 908 0 R
+/A 905 0 R
+/Parent 891 0 R
+/Prev 903 0 R
+/Next 911 0 R
+>> endobj
+903 0 obj <<
+/Title 904 0 R
+/A 901 0 R
+/Parent 891 0 R
+/Prev 899 0 R
+/Next 907 0 R
+>> endobj
+899 0 obj <<
+/Title 900 0 R
+/A 897 0 R
+/Parent 891 0 R
+/Prev 895 0 R
+/Next 903 0 R
+>> endobj
+895 0 obj <<
+/Title 896 0 R
+/A 893 0 R
+/Parent 891 0 R
+/Next 899 0 R
+>> endobj
+891 0 obj <<
+/Title 892 0 R
+/A 889 0 R
+/Parent 199 0 R
+/Prev 867 0 R
+/Next 915 0 R
+/First 895 0 R
+/Last 911 0 R
+/Count -5
+>> endobj
+887 0 obj <<
+/Title 888 0 R
+/A 885 0 R
+/Parent 867 0 R
+/Prev 883 0 R
+>> endobj
+883 0 obj <<
+/Title 884 0 R
+/A 881 0 R
+/Parent 867 0 R
+/Prev 879 0 R
+/Next 887 0 R
+>> endobj
+879 0 obj <<
+/Title 880 0 R
+/A 877 0 R
+/Parent 867 0 R
+/Prev 875 0 R
+/Next 883 0 R
+>> endobj
+875 0 obj <<
+/Title 876 0 R
+/A 873 0 R
+/Parent 867 0 R
+/Prev 871 0 R
+/Next 879 0 R
+>> endobj
+871 0 obj <<
+/Title 872 0 R
+/A 869 0 R
+/Parent 867 0 R
+/Next 875 0 R
+>> endobj
+867 0 obj <<
+/Title 868 0 R
+/A 865 0 R
+/Parent 199 0 R
+/Prev 843 0 R
+/Next 891 0 R
+/First 871 0 R
+/Last 887 0 R
+/Count -5
+>> endobj
+863 0 obj <<
+/Title 864 0 R
+/A 861 0 R
+/Parent 843 0 R
+/Prev 859 0 R
+>> endobj
+859 0 obj <<
+/Title 860 0 R
+/A 857 0 R
+/Parent 843 0 R
+/Prev 855 0 R
+/Next 863 0 R
+>> endobj
+855 0 obj <<
+/Title 856 0 R
+/A 853 0 R
+/Parent 843 0 R
+/Prev 851 0 R
+/Next 859 0 R
+>> endobj
+851 0 obj <<
+/Title 852 0 R
+/A 849 0 R
+/Parent 843 0 R
+/Prev 847 0 R
+/Next 855 0 R
+>> endobj
+847 0 obj <<
+/Title 848 0 R
+/A 845 0 R
+/Parent 843 0 R
+/Next 851 0 R
+>> endobj
+843 0 obj <<
+/Title 844 0 R
+/A 841 0 R
+/Parent 199 0 R
+/Prev 819 0 R
+/Next 867 0 R
+/First 847 0 R
+/Last 863 0 R
+/Count -5
+>> endobj
+839 0 obj <<
+/Title 840 0 R
+/A 837 0 R
+/Parent 819 0 R
+/Prev 835 0 R
+>> endobj
+835 0 obj <<
+/Title 836 0 R
+/A 833 0 R
+/Parent 819 0 R
+/Prev 831 0 R
+/Next 839 0 R
+>> endobj
+831 0 obj <<
+/Title 832 0 R
+/A 829 0 R
+/Parent 819 0 R
+/Prev 827 0 R
+/Next 835 0 R
+>> endobj
+827 0 obj <<
+/Title 828 0 R
+/A 825 0 R
+/Parent 819 0 R
+/Prev 823 0 R
+/Next 831 0 R
+>> endobj
+823 0 obj <<
+/Title 824 0 R
+/A 821 0 R
+/Parent 819 0 R
+/Next 827 0 R
+>> endobj
+819 0 obj <<
+/Title 820 0 R
+/A 817 0 R
+/Parent 199 0 R
+/Prev 795 0 R
+/Next 843 0 R
+/First 823 0 R
+/Last 839 0 R
+/Count -5
+>> endobj
+815 0 obj <<
+/Title 816 0 R
+/A 813 0 R
+/Parent 795 0 R
+/Prev 811 0 R
+>> endobj
+811 0 obj <<
+/Title 812 0 R
+/A 809 0 R
+/Parent 795 0 R
+/Prev 807 0 R
+/Next 815 0 R
+>> endobj
+807 0 obj <<
+/Title 808 0 R
+/A 805 0 R
+/Parent 795 0 R
+/Prev 803 0 R
+/Next 811 0 R
+>> endobj
+803 0 obj <<
+/Title 804 0 R
+/A 801 0 R
+/Parent 795 0 R
+/Prev 799 0 R
+/Next 807 0 R
+>> endobj
+799 0 obj <<
+/Title 800 0 R
+/A 797 0 R
+/Parent 795 0 R
+/Next 803 0 R
+>> endobj
+795 0 obj <<
+/Title 796 0 R
+/A 793 0 R
+/Parent 199 0 R
+/Prev 767 0 R
+/Next 819 0 R
+/First 799 0 R
+/Last 815 0 R
+/Count -5
+>> endobj
+791 0 obj <<
+/Title 792 0 R
+/A 789 0 R
+/Parent 767 0 R
+/Prev 787 0 R
+>> endobj
+787 0 obj <<
+/Title 788 0 R
+/A 785 0 R
+/Parent 767 0 R
+/Prev 783 0 R
+/Next 791 0 R
+>> endobj
+783 0 obj <<
+/Title 784 0 R
+/A 781 0 R
+/Parent 767 0 R
+/Prev 779 0 R
+/Next 787 0 R
+>> endobj
+779 0 obj <<
+/Title 780 0 R
+/A 777 0 R
+/Parent 767 0 R
+/Prev 775 0 R
+/Next 783 0 R
+>> endobj
+775 0 obj <<
+/Title 776 0 R
+/A 773 0 R
+/Parent 767 0 R
+/Prev 771 0 R
+/Next 779 0 R
+>> endobj
+771 0 obj <<
+/Title 772 0 R
+/A 769 0 R
+/Parent 767 0 R
+/Next 775 0 R
+>> endobj
+767 0 obj <<
+/Title 768 0 R
+/A 765 0 R
+/Parent 199 0 R
+/Prev 739 0 R
+/Next 795 0 R
+/First 771 0 R
+/Last 791 0 R
+/Count -6
+>> endobj
+763 0 obj <<
+/Title 764 0 R
+/A 761 0 R
+/Parent 739 0 R
+/Prev 759 0 R
+>> endobj
+759 0 obj <<
+/Title 760 0 R
+/A 757 0 R
+/Parent 739 0 R
+/Prev 755 0 R
+/Next 763 0 R
+>> endobj
+755 0 obj <<
+/Title 756 0 R
+/A 753 0 R
+/Parent 739 0 R
+/Prev 751 0 R
+/Next 759 0 R
+>> endobj
+751 0 obj <<
+/Title 752 0 R
+/A 749 0 R
+/Parent 739 0 R
+/Prev 747 0 R
+/Next 755 0 R
+>> endobj
+747 0 obj <<
+/Title 748 0 R
+/A 745 0 R
+/Parent 739 0 R
+/Prev 743 0 R
+/Next 751 0 R
+>> endobj
+743 0 obj <<
+/Title 744 0 R
+/A 741 0 R
+/Parent 739 0 R
+/Next 747 0 R
+>> endobj
+739 0 obj <<
+/Title 740 0 R
+/A 737 0 R
+/Parent 199 0 R
+/Prev 715 0 R
+/Next 767 0 R
+/First 743 0 R
+/Last 763 0 R
+/Count -6
+>> endobj
+735 0 obj <<
+/Title 736 0 R
+/A 733 0 R
+/Parent 715 0 R
+/Prev 731 0 R
+>> endobj
+731 0 obj <<
+/Title 732 0 R
+/A 729 0 R
+/Parent 715 0 R
+/Prev 727 0 R
+/Next 735 0 R
+>> endobj
+727 0 obj <<
+/Title 728 0 R
+/A 725 0 R
+/Parent 715 0 R
+/Prev 723 0 R
+/Next 731 0 R
+>> endobj
+723 0 obj <<
+/Title 724 0 R
+/A 721 0 R
+/Parent 715 0 R
+/Prev 719 0 R
+/Next 727 0 R
+>> endobj
+719 0 obj <<
+/Title 720 0 R
+/A 717 0 R
+/Parent 715 0 R
+/Next 723 0 R
+>> endobj
+715 0 obj <<
+/Title 716 0 R
+/A 713 0 R
+/Parent 199 0 R
+/Prev 695 0 R
+/Next 739 0 R
+/First 719 0 R
+/Last 735 0 R
+/Count -5
+>> endobj
+711 0 obj <<
+/Title 712 0 R
+/A 709 0 R
+/Parent 695 0 R
+/Prev 707 0 R
+>> endobj
+707 0 obj <<
+/Title 708 0 R
+/A 705 0 R
+/Parent 695 0 R
+/Prev 703 0 R
+/Next 711 0 R
+>> endobj
+703 0 obj <<
+/Title 704 0 R
+/A 701 0 R
+/Parent 695 0 R
+/Prev 699 0 R
+/Next 707 0 R
+>> endobj
+699 0 obj <<
+/Title 700 0 R
+/A 697 0 R
+/Parent 695 0 R
+/Next 703 0 R
+>> endobj
+695 0 obj <<
+/Title 696 0 R
+/A 693 0 R
+/Parent 199 0 R
+/Prev 671 0 R
+/Next 715 0 R
+/First 699 0 R
+/Last 711 0 R
+/Count -4
+>> endobj
+691 0 obj <<
+/Title 692 0 R
+/A 689 0 R
+/Parent 671 0 R
+/Prev 687 0 R
+>> endobj
+687 0 obj <<
+/Title 688 0 R
+/A 685 0 R
+/Parent 671 0 R
+/Prev 683 0 R
+/Next 691 0 R
+>> endobj
+683 0 obj <<
+/Title 684 0 R
+/A 681 0 R
+/Parent 671 0 R
+/Prev 679 0 R
+/Next 687 0 R
+>> endobj
+679 0 obj <<
+/Title 680 0 R
+/A 677 0 R
+/Parent 671 0 R
+/Prev 675 0 R
+/Next 683 0 R
+>> endobj
+675 0 obj <<
+/Title 676 0 R
+/A 673 0 R
+/Parent 671 0 R
+/Next 679 0 R
+>> endobj
+671 0 obj <<
+/Title 672 0 R
+/A 669 0 R
+/Parent 199 0 R
+/Prev 647 0 R
+/Next 695 0 R
+/First 675 0 R
+/Last 691 0 R
+/Count -5
+>> endobj
+667 0 obj <<
+/Title 668 0 R
+/A 665 0 R
+/Parent 647 0 R
+/Prev 663 0 R
+>> endobj
+663 0 obj <<
+/Title 664 0 R
+/A 661 0 R
+/Parent 647 0 R
+/Prev 659 0 R
+/Next 667 0 R
+>> endobj
+659 0 obj <<
+/Title 660 0 R
+/A 657 0 R
+/Parent 647 0 R
+/Prev 655 0 R
+/Next 663 0 R
+>> endobj
+655 0 obj <<
+/Title 656 0 R
+/A 653 0 R
+/Parent 647 0 R
+/Prev 651 0 R
+/Next 659 0 R
+>> endobj
+651 0 obj <<
+/Title 652 0 R
+/A 649 0 R
+/Parent 647 0 R
+/Next 655 0 R
+>> endobj
+647 0 obj <<
+/Title 648 0 R
+/A 645 0 R
+/Parent 199 0 R
+/Prev 619 0 R
+/Next 671 0 R
+/First 651 0 R
+/Last 667 0 R
+/Count -5
+>> endobj
+643 0 obj <<
+/Title 644 0 R
+/A 641 0 R
+/Parent 619 0 R
+/Prev 639 0 R
+>> endobj
+639 0 obj <<
+/Title 640 0 R
+/A 637 0 R
+/Parent 619 0 R
+/Prev 635 0 R
+/Next 643 0 R
+>> endobj
+635 0 obj <<
+/Title 636 0 R
+/A 633 0 R
+/Parent 619 0 R
+/Prev 631 0 R
+/Next 639 0 R
+>> endobj
+631 0 obj <<
+/Title 632 0 R
+/A 629 0 R
+/Parent 619 0 R
+/Prev 627 0 R
+/Next 635 0 R
+>> endobj
+627 0 obj <<
+/Title 628 0 R
+/A 625 0 R
+/Parent 619 0 R
+/Prev 623 0 R
+/Next 631 0 R
+>> endobj
+623 0 obj <<
+/Title 624 0 R
+/A 621 0 R
+/Parent 619 0 R
+/Next 627 0 R
+>> endobj
+619 0 obj <<
+/Title 620 0 R
+/A 617 0 R
+/Parent 199 0 R
+/Prev 603 0 R
+/Next 647 0 R
+/First 623 0 R
+/Last 643 0 R
+/Count -6
+>> endobj
+615 0 obj <<
+/Title 616 0 R
+/A 613 0 R
+/Parent 603 0 R
+/Prev 611 0 R
+>> endobj
+611 0 obj <<
+/Title 612 0 R
+/A 609 0 R
+/Parent 603 0 R
+/Prev 607 0 R
+/Next 615 0 R
+>> endobj
+607 0 obj <<
+/Title 608 0 R
+/A 605 0 R
+/Parent 603 0 R
+/Next 611 0 R
+>> endobj
+603 0 obj <<
+/Title 604 0 R
+/A 601 0 R
+/Parent 199 0 R
+/Prev 587 0 R
+/Next 619 0 R
+/First 607 0 R
+/Last 615 0 R
+/Count -3
+>> endobj
+599 0 obj <<
+/Title 600 0 R
+/A 597 0 R
+/Parent 587 0 R
+/Prev 595 0 R
+>> endobj
+595 0 obj <<
+/Title 596 0 R
+/A 593 0 R
+/Parent 587 0 R
+/Prev 591 0 R
+/Next 599 0 R
+>> endobj
+591 0 obj <<
+/Title 592 0 R
+/A 589 0 R
+/Parent 587 0 R
+/Next 595 0 R
+>> endobj
+587 0 obj <<
+/Title 588 0 R
+/A 585 0 R
+/Parent 199 0 R
+/Prev 583 0 R
+/Next 603 0 R
+/First 591 0 R
+/Last 599 0 R
+/Count -3
+>> endobj
+583 0 obj <<
+/Title 584 0 R
+/A 581 0 R
+/Parent 199 0 R
+/Prev 555 0 R
+/Next 587 0 R
+>> endobj
+579 0 obj <<
+/Title 580 0 R
+/A 577 0 R
+/Parent 555 0 R
+/Prev 575 0 R
+>> endobj
+575 0 obj <<
+/Title 576 0 R
+/A 573 0 R
+/Parent 555 0 R
+/Prev 571 0 R
+/Next 579 0 R
+>> endobj
+571 0 obj <<
+/Title 572 0 R
+/A 569 0 R
+/Parent 555 0 R
+/Prev 567 0 R
+/Next 575 0 R
+>> endobj
+567 0 obj <<
+/Title 568 0 R
+/A 565 0 R
+/Parent 555 0 R
+/Prev 563 0 R
+/Next 571 0 R
+>> endobj
+563 0 obj <<
+/Title 564 0 R
+/A 561 0 R
+/Parent 555 0 R
+/Prev 559 0 R
+/Next 567 0 R
+>> endobj
+559 0 obj <<
+/Title 560 0 R
+/A 557 0 R
+/Parent 555 0 R
+/Next 563 0 R
+>> endobj
+555 0 obj <<
+/Title 556 0 R
+/A 553 0 R
+/Parent 199 0 R
+/Prev 527 0 R
+/Next 583 0 R
+/First 559 0 R
+/Last 579 0 R
+/Count -6
+>> endobj
+551 0 obj <<
+/Title 552 0 R
+/A 549 0 R
+/Parent 527 0 R
+/Prev 547 0 R
+>> endobj
+547 0 obj <<
+/Title 548 0 R
+/A 545 0 R
+/Parent 527 0 R
+/Prev 543 0 R
+/Next 551 0 R
+>> endobj
+543 0 obj <<
+/Title 544 0 R
+/A 541 0 R
+/Parent 527 0 R
+/Prev 539 0 R
+/Next 547 0 R
+>> endobj
+539 0 obj <<
+/Title 540 0 R
+/A 537 0 R
+/Parent 527 0 R
+/Prev 535 0 R
+/Next 543 0 R
+>> endobj
+535 0 obj <<
+/Title 536 0 R
+/A 533 0 R
+/Parent 527 0 R
+/Prev 531 0 R
+/Next 539 0 R
+>> endobj
+531 0 obj <<
+/Title 532 0 R
+/A 529 0 R
+/Parent 527 0 R
+/Next 535 0 R
+>> endobj
+527 0 obj <<
+/Title 528 0 R
+/A 525 0 R
+/Parent 199 0 R
+/Prev 499 0 R
+/Next 555 0 R
+/First 531 0 R
+/Last 551 0 R
+/Count -6
+>> endobj
+523 0 obj <<
+/Title 524 0 R
+/A 521 0 R
+/Parent 499 0 R
+/Prev 519 0 R
+>> endobj
+519 0 obj <<
+/Title 520 0 R
+/A 517 0 R
+/Parent 499 0 R
+/Prev 515 0 R
+/Next 523 0 R
+>> endobj
+515 0 obj <<
+/Title 516 0 R
+/A 513 0 R
+/Parent 499 0 R
+/Prev 511 0 R
+/Next 519 0 R
+>> endobj
+511 0 obj <<
+/Title 512 0 R
+/A 509 0 R
+/Parent 499 0 R
+/Prev 507 0 R
+/Next 515 0 R
+>> endobj
+507 0 obj <<
+/Title 508 0 R
+/A 505 0 R
+/Parent 499 0 R
+/Prev 503 0 R
+/Next 511 0 R
+>> endobj
+503 0 obj <<
+/Title 504 0 R
+/A 501 0 R
+/Parent 499 0 R
+/Next 507 0 R
+>> endobj
+499 0 obj <<
+/Title 500 0 R
+/A 497 0 R
+/Parent 199 0 R
+/Prev 471 0 R
+/Next 527 0 R
+/First 503 0 R
+/Last 523 0 R
+/Count -6
+>> endobj
+495 0 obj <<
+/Title 496 0 R
+/A 493 0 R
+/Parent 471 0 R
+/Prev 491 0 R
+>> endobj
+491 0 obj <<
+/Title 492 0 R
+/A 489 0 R
+/Parent 471 0 R
+/Prev 487 0 R
+/Next 495 0 R
+>> endobj
+487 0 obj <<
+/Title 488 0 R
+/A 485 0 R
+/Parent 471 0 R
+/Prev 483 0 R
+/Next 491 0 R
+>> endobj
+483 0 obj <<
+/Title 484 0 R
+/A 481 0 R
+/Parent 471 0 R
+/Prev 479 0 R
+/Next 487 0 R
+>> endobj
+479 0 obj <<
+/Title 480 0 R
+/A 477 0 R
+/Parent 471 0 R
+/Prev 475 0 R
+/Next 483 0 R
+>> endobj
+475 0 obj <<
+/Title 476 0 R
+/A 473 0 R
+/Parent 471 0 R
+/Next 479 0 R
+>> endobj
+471 0 obj <<
+/Title 472 0 R
+/A 469 0 R
+/Parent 199 0 R
+/Prev 443 0 R
+/Next 499 0 R
+/First 475 0 R
+/Last 495 0 R
+/Count -6
+>> endobj
+467 0 obj <<
+/Title 468 0 R
+/A 465 0 R
+/Parent 443 0 R
+/Prev 463 0 R
+>> endobj
+463 0 obj <<
+/Title 464 0 R
+/A 461 0 R
+/Parent 443 0 R
+/Prev 459 0 R
+/Next 467 0 R
+>> endobj
+459 0 obj <<
+/Title 460 0 R
+/A 457 0 R
+/Parent 443 0 R
+/Prev 455 0 R
+/Next 463 0 R
+>> endobj
+455 0 obj <<
+/Title 456 0 R
+/A 453 0 R
+/Parent 443 0 R
+/Prev 451 0 R
+/Next 459 0 R
+>> endobj
+451 0 obj <<
+/Title 452 0 R
+/A 449 0 R
+/Parent 443 0 R
+/Prev 447 0 R
+/Next 455 0 R
+>> endobj
+447 0 obj <<
+/Title 448 0 R
+/A 445 0 R
+/Parent 443 0 R
+/Next 451 0 R
+>> endobj
+443 0 obj <<
+/Title 444 0 R
+/A 441 0 R
+/Parent 199 0 R
+/Prev 415 0 R
+/Next 471 0 R
+/First 447 0 R
+/Last 467 0 R
+/Count -6
+>> endobj
+439 0 obj <<
+/Title 440 0 R
+/A 437 0 R
+/Parent 415 0 R
+/Prev 435 0 R
+>> endobj
+435 0 obj <<
+/Title 436 0 R
+/A 433 0 R
+/Parent 415 0 R
+/Prev 431 0 R
+/Next 439 0 R
+>> endobj
+431 0 obj <<
+/Title 432 0 R
+/A 429 0 R
+/Parent 415 0 R
+/Prev 427 0 R
+/Next 435 0 R
+>> endobj
+427 0 obj <<
+/Title 428 0 R
+/A 425 0 R
+/Parent 415 0 R
+/Prev 423 0 R
+/Next 431 0 R
+>> endobj
+423 0 obj <<
+/Title 424 0 R
+/A 421 0 R
+/Parent 415 0 R
+/Prev 419 0 R
+/Next 427 0 R
+>> endobj
+419 0 obj <<
+/Title 420 0 R
+/A 417 0 R
+/Parent 415 0 R
+/Next 423 0 R
+>> endobj
+415 0 obj <<
+/Title 416 0 R
+/A 413 0 R
+/Parent 199 0 R
+/Prev 387 0 R
+/Next 443 0 R
+/First 419 0 R
+/Last 439 0 R
+/Count -6
+>> endobj
+411 0 obj <<
+/Title 412 0 R
+/A 409 0 R
+/Parent 387 0 R
+/Prev 407 0 R
+>> endobj
+407 0 obj <<
+/Title 408 0 R
+/A 405 0 R
+/Parent 387 0 R
+/Prev 403 0 R
+/Next 411 0 R
+>> endobj
+403 0 obj <<
+/Title 404 0 R
+/A 401 0 R
+/Parent 387 0 R
+/Prev 399 0 R
+/Next 407 0 R
+>> endobj
+399 0 obj <<
+/Title 400 0 R
+/A 397 0 R
+/Parent 387 0 R
+/Prev 395 0 R
+/Next 403 0 R
+>> endobj
+395 0 obj <<
+/Title 396 0 R
+/A 393 0 R
+/Parent 387 0 R
+/Prev 391 0 R
+/Next 399 0 R
+>> endobj
+391 0 obj <<
+/Title 392 0 R
+/A 389 0 R
+/Parent 387 0 R
+/Next 395 0 R
+>> endobj
+387 0 obj <<
+/Title 388 0 R
+/A 385 0 R
+/Parent 199 0 R
+/Prev 359 0 R
+/Next 415 0 R
+/First 391 0 R
+/Last 411 0 R
+/Count -6
+>> endobj
+383 0 obj <<
+/Title 384 0 R
+/A 381 0 R
+/Parent 359 0 R
+/Prev 379 0 R
+>> endobj
+379 0 obj <<
+/Title 380 0 R
+/A 377 0 R
+/Parent 359 0 R
+/Prev 375 0 R
+/Next 383 0 R
+>> endobj
+375 0 obj <<
+/Title 376 0 R
+/A 373 0 R
+/Parent 359 0 R
+/Prev 371 0 R
+/Next 379 0 R
+>> endobj
+371 0 obj <<
+/Title 372 0 R
+/A 369 0 R
+/Parent 359 0 R
+/Prev 367 0 R
+/Next 375 0 R
+>> endobj
+367 0 obj <<
+/Title 368 0 R
+/A 365 0 R
+/Parent 359 0 R
+/Prev 363 0 R
+/Next 371 0 R
+>> endobj
+363 0 obj <<
+/Title 364 0 R
+/A 361 0 R
+/Parent 359 0 R
+/Next 367 0 R
+>> endobj
+359 0 obj <<
+/Title 360 0 R
+/A 357 0 R
+/Parent 199 0 R
+/Prev 331 0 R
+/Next 387 0 R
+/First 363 0 R
+/Last 383 0 R
+/Count -6
+>> endobj
+355 0 obj <<
+/Title 356 0 R
+/A 353 0 R
+/Parent 331 0 R
+/Prev 351 0 R
+>> endobj
+351 0 obj <<
+/Title 352 0 R
+/A 349 0 R
+/Parent 331 0 R
+/Prev 347 0 R
+/Next 355 0 R
+>> endobj
+347 0 obj <<
+/Title 348 0 R
+/A 345 0 R
+/Parent 331 0 R
+/Prev 343 0 R
+/Next 351 0 R
+>> endobj
+343 0 obj <<
+/Title 344 0 R
+/A 341 0 R
+/Parent 331 0 R
+/Prev 339 0 R
+/Next 347 0 R
+>> endobj
+339 0 obj <<
+/Title 340 0 R
+/A 337 0 R
+/Parent 331 0 R
+/Prev 335 0 R
+/Next 343 0 R
+>> endobj
+335 0 obj <<
+/Title 336 0 R
+/A 333 0 R
+/Parent 331 0 R
+/Next 339 0 R
+>> endobj
+331 0 obj <<
+/Title 332 0 R
+/A 329 0 R
+/Parent 199 0 R
+/Prev 327 0 R
+/Next 359 0 R
+/First 335 0 R
+/Last 355 0 R
+/Count -6
+>> endobj
+327 0 obj <<
+/Title 328 0 R
+/A 325 0 R
+/Parent 199 0 R
+/Prev 311 0 R
+/Next 331 0 R
+>> endobj
+323 0 obj <<
+/Title 324 0 R
+/A 321 0 R
+/Parent 311 0 R
+/Prev 319 0 R
+>> endobj
+319 0 obj <<
+/Title 320 0 R
+/A 317 0 R
+/Parent 311 0 R
+/Prev 315 0 R
+/Next 323 0 R
+>> endobj
+315 0 obj <<
+/Title 316 0 R
+/A 313 0 R
+/Parent 311 0 R
+/Next 319 0 R
+>> endobj
+311 0 obj <<
+/Title 312 0 R
+/A 309 0 R
+/Parent 199 0 R
+/Prev 295 0 R
+/Next 327 0 R
+/First 315 0 R
+/Last 323 0 R
+/Count -3
+>> endobj
+307 0 obj <<
+/Title 308 0 R
+/A 305 0 R
+/Parent 295 0 R
+/Prev 303 0 R
+>> endobj
+303 0 obj <<
+/Title 304 0 R
+/A 301 0 R
+/Parent 295 0 R
+/Prev 299 0 R
+/Next 307 0 R
+>> endobj
+299 0 obj <<
+/Title 300 0 R
+/A 297 0 R
+/Parent 295 0 R
+/Next 303 0 R
+>> endobj
+295 0 obj <<
+/Title 296 0 R
+/A 293 0 R
+/Parent 199 0 R
+/Prev 279 0 R
+/Next 311 0 R
+/First 299 0 R
+/Last 307 0 R
+/Count -3
+>> endobj
+291 0 obj <<
+/Title 292 0 R
+/A 289 0 R
+/Parent 279 0 R
+/Prev 287 0 R
+>> endobj
+287 0 obj <<
+/Title 288 0 R
+/A 285 0 R
+/Parent 279 0 R
+/Prev 283 0 R
+/Next 291 0 R
+>> endobj
+283 0 obj <<
+/Title 284 0 R
+/A 281 0 R
+/Parent 279 0 R
+/Next 287 0 R
+>> endobj
+279 0 obj <<
+/Title 280 0 R
+/A 277 0 R
+/Parent 199 0 R
+/Prev 263 0 R
+/Next 295 0 R
+/First 283 0 R
+/Last 291 0 R
+/Count -3
+>> endobj
+275 0 obj <<
+/Title 276 0 R
+/A 273 0 R
+/Parent 263 0 R
+/Prev 271 0 R
+>> endobj
+271 0 obj <<
+/Title 272 0 R
+/A 269 0 R
+/Parent 263 0 R
+/Prev 267 0 R
+/Next 275 0 R
+>> endobj
+267 0 obj <<
+/Title 268 0 R
+/A 265 0 R
+/Parent 263 0 R
+/Next 271 0 R
+>> endobj
+263 0 obj <<
+/Title 264 0 R
+/A 261 0 R
+/Parent 199 0 R
+/Prev 243 0 R
+/Next 279 0 R
+/First 267 0 R
+/Last 275 0 R
+/Count -3
+>> endobj
+259 0 obj <<
+/Title 260 0 R
+/A 257 0 R
+/Parent 243 0 R
+/Prev 255 0 R
+>> endobj
+255 0 obj <<
+/Title 256 0 R
+/A 253 0 R
+/Parent 243 0 R
+/Prev 251 0 R
+/Next 259 0 R
+>> endobj
+251 0 obj <<
+/Title 252 0 R
+/A 249 0 R
+/Parent 243 0 R
+/Prev 247 0 R
+/Next 255 0 R
+>> endobj
+247 0 obj <<
+/Title 248 0 R
+/A 245 0 R
+/Parent 243 0 R
+/Next 251 0 R
+>> endobj
+243 0 obj <<
+/Title 244 0 R
+/A 241 0 R
+/Parent 199 0 R
+/Prev 223 0 R
+/Next 263 0 R
+/First 247 0 R
+/Last 259 0 R
+/Count -4
+>> endobj
+239 0 obj <<
+/Title 240 0 R
+/A 237 0 R
+/Parent 223 0 R
+/Prev 235 0 R
+>> endobj
+235 0 obj <<
+/Title 236 0 R
+/A 233 0 R
+/Parent 223 0 R
+/Prev 231 0 R
+/Next 239 0 R
+>> endobj
+231 0 obj <<
+/Title 232 0 R
+/A 229 0 R
+/Parent 223 0 R
+/Prev 227 0 R
+/Next 235 0 R
+>> endobj
+227 0 obj <<
+/Title 228 0 R
+/A 225 0 R
+/Parent 223 0 R
+/Next 231 0 R
+>> endobj
+223 0 obj <<
+/Title 224 0 R
+/A 221 0 R
+/Parent 199 0 R
+/Prev 207 0 R
+/Next 243 0 R
+/First 227 0 R
+/Last 239 0 R
+/Count -4
+>> endobj
+219 0 obj <<
+/Title 220 0 R
+/A 217 0 R
+/Parent 207 0 R
+/Prev 215 0 R
+>> endobj
+215 0 obj <<
+/Title 216 0 R
+/A 213 0 R
+/Parent 207 0 R
+/Prev 211 0 R
+/Next 219 0 R
+>> endobj
+211 0 obj <<
+/Title 212 0 R
+/A 209 0 R
+/Parent 207 0 R
+/Next 215 0 R
+>> endobj
+207 0 obj <<
+/Title 208 0 R
+/A 205 0 R
+/Parent 199 0 R
+/Prev 203 0 R
+/Next 223 0 R
+/First 211 0 R
+/Last 219 0 R
+/Count -3
+>> endobj
+203 0 obj <<
+/Title 204 0 R
+/A 201 0 R
+/Parent 199 0 R
+/Next 207 0 R
+>> endobj
+199 0 obj <<
+/Title 200 0 R
+/A 197 0 R
+/Parent 8326 0 R
+/Prev 195 0 R
+/Next 2891 0 R
+/First 203 0 R
+/Last 2875 0 R
+/Count -134
+>> endobj
+195 0 obj <<
+/Title 196 0 R
+/A 193 0 R
+/Parent 8326 0 R
+/Prev 191 0 R
+/Next 199 0 R
+>> endobj
+191 0 obj <<
+/Title 192 0 R
+/A 189 0 R
+/Parent 8326 0 R
+/Prev 43 0 R
+/Next 195 0 R
+>> endobj
+187 0 obj <<
+/Title 188 0 R
+/A 185 0 R
+/Parent 171 0 R
+/Prev 183 0 R
+>> endobj
+183 0 obj <<
+/Title 184 0 R
+/A 181 0 R
+/Parent 171 0 R
+/Prev 179 0 R
+/Next 187 0 R
+>> endobj
+179 0 obj <<
+/Title 180 0 R
+/A 177 0 R
+/Parent 171 0 R
+/Prev 175 0 R
+/Next 183 0 R
+>> endobj
+175 0 obj <<
+/Title 176 0 R
+/A 173 0 R
+/Parent 171 0 R
+/Next 179 0 R
+>> endobj
+171 0 obj <<
+/Title 172 0 R
+/A 169 0 R
+/Parent 43 0 R
+/Prev 151 0 R
+/First 175 0 R
+/Last 187 0 R
+/Count -4
+>> endobj
+167 0 obj <<
+/Title 168 0 R
+/A 165 0 R
+/Parent 151 0 R
+/Prev 163 0 R
+>> endobj
+163 0 obj <<
+/Title 164 0 R
+/A 161 0 R
+/Parent 151 0 R
+/Prev 159 0 R
+/Next 167 0 R
+>> endobj
+159 0 obj <<
+/Title 160 0 R
+/A 157 0 R
+/Parent 151 0 R
+/Prev 155 0 R
+/Next 163 0 R
+>> endobj
+155 0 obj <<
+/Title 156 0 R
+/A 153 0 R
+/Parent 151 0 R
+/Next 159 0 R
+>> endobj
+151 0 obj <<
+/Title 152 0 R
+/A 149 0 R
+/Parent 43 0 R
+/Prev 135 0 R
+/Next 171 0 R
+/First 155 0 R
+/Last 167 0 R
+/Count -4
+>> endobj
+147 0 obj <<
+/Title 148 0 R
+/A 145 0 R
+/Parent 135 0 R
+/Prev 143 0 R
+>> endobj
+143 0 obj <<
+/Title 144 0 R
+/A 141 0 R
+/Parent 135 0 R
+/Prev 139 0 R
+/Next 147 0 R
+>> endobj
+139 0 obj <<
+/Title 140 0 R
+/A 137 0 R
+/Parent 135 0 R
+/Next 143 0 R
+>> endobj
+135 0 obj <<
+/Title 136 0 R
+/A 133 0 R
+/Parent 43 0 R
+/Prev 115 0 R
+/Next 151 0 R
+/First 139 0 R
+/Last 147 0 R
+/Count -3
+>> endobj
+131 0 obj <<
+/Title 132 0 R
+/A 129 0 R
+/Parent 115 0 R
+/Prev 127 0 R
+>> endobj
+127 0 obj <<
+/Title 128 0 R
+/A 125 0 R
+/Parent 115 0 R
+/Prev 123 0 R
+/Next 131 0 R
+>> endobj
+123 0 obj <<
+/Title 124 0 R
+/A 121 0 R
+/Parent 115 0 R
+/Prev 119 0 R
+/Next 127 0 R
+>> endobj
+119 0 obj <<
+/Title 120 0 R
+/A 117 0 R
+/Parent 115 0 R
+/Next 123 0 R
+>> endobj
+115 0 obj <<
+/Title 116 0 R
+/A 113 0 R
+/Parent 43 0 R
+/Prev 95 0 R
+/Next 135 0 R
+/First 119 0 R
+/Last 131 0 R
+/Count -4
+>> endobj
+111 0 obj <<
+/Title 112 0 R
+/A 109 0 R
+/Parent 95 0 R
+/Prev 107 0 R
+>> endobj
+107 0 obj <<
+/Title 108 0 R
+/A 105 0 R
+/Parent 95 0 R
+/Prev 103 0 R
+/Next 111 0 R
+>> endobj
+103 0 obj <<
+/Title 104 0 R
+/A 101 0 R
+/Parent 95 0 R
+/Prev 99 0 R
+/Next 107 0 R
+>> endobj
+99 0 obj <<
+/Title 100 0 R
+/A 97 0 R
+/Parent 95 0 R
+/Next 103 0 R
+>> endobj
+95 0 obj <<
+/Title 96 0 R
+/A 93 0 R
+/Parent 43 0 R
+/Prev 75 0 R
+/Next 115 0 R
+/First 99 0 R
+/Last 111 0 R
+/Count -4
+>> endobj
+91 0 obj <<
+/Title 92 0 R
+/A 89 0 R
+/Parent 75 0 R
+/Prev 87 0 R
+>> endobj
+87 0 obj <<
+/Title 88 0 R
+/A 85 0 R
+/Parent 75 0 R
+/Prev 83 0 R
+/Next 91 0 R
+>> endobj
+83 0 obj <<
+/Title 84 0 R
+/A 81 0 R
+/Parent 75 0 R
+/Prev 79 0 R
+/Next 87 0 R
+>> endobj
+79 0 obj <<
+/Title 80 0 R
+/A 77 0 R
+/Parent 75 0 R
+/Next 83 0 R
+>> endobj
+75 0 obj <<
+/Title 76 0 R
+/A 73 0 R
+/Parent 43 0 R
+/Prev 55 0 R
+/Next 95 0 R
+/First 79 0 R
+/Last 91 0 R
+/Count -4
+>> endobj
+71 0 obj <<
+/Title 72 0 R
+/A 69 0 R
+/Parent 55 0 R
+/Prev 67 0 R
+>> endobj
+67 0 obj <<
+/Title 68 0 R
+/A 65 0 R
+/Parent 55 0 R
+/Prev 63 0 R
+/Next 71 0 R
+>> endobj
+63 0 obj <<
+/Title 64 0 R
+/A 61 0 R
+/Parent 55 0 R
+/Prev 59 0 R
+/Next 67 0 R
+>> endobj
+59 0 obj <<
+/Title 60 0 R
+/A 57 0 R
+/Parent 55 0 R
+/Next 63 0 R
+>> endobj
+55 0 obj <<
+/Title 56 0 R
+/A 53 0 R
+/Parent 43 0 R
+/Prev 51 0 R
+/Next 75 0 R
+/First 59 0 R
+/Last 71 0 R
+/Count -4
+>> endobj
+51 0 obj <<
+/Title 52 0 R
+/A 49 0 R
+/Parent 43 0 R
+/Prev 47 0 R
+/Next 55 0 R
+>> endobj
+47 0 obj <<
+/Title 48 0 R
+/A 45 0 R
+/Parent 43 0 R
+/Next 51 0 R
+>> endobj
+43 0 obj <<
+/Title 44 0 R
+/A 41 0 R
+/Parent 8326 0 R
+/Prev 35 0 R
+/Next 191 0 R
+/First 47 0 R
+/Last 171 0 R
+/Count -9
+>> endobj
+39 0 obj <<
+/Title 40 0 R
+/A 37 0 R
+/Parent 35 0 R
+>> endobj
+35 0 obj <<
+/Title 36 0 R
+/A 33 0 R
+/Parent 8326 0 R
+/Prev 27 0 R
+/Next 43 0 R
+/First 39 0 R
+/Last 39 0 R
+/Count -1
+>> endobj
+31 0 obj <<
+/Title 32 0 R
+/A 29 0 R
+/Parent 27 0 R
+>> endobj
+27 0 obj <<
+/Title 28 0 R
+/A 25 0 R
+/Parent 8326 0 R
+/Prev 23 0 R
+/Next 35 0 R
+/First 31 0 R
+/Last 31 0 R
+/Count -1
+>> endobj
+23 0 obj <<
+/Title 24 0 R
+/A 21 0 R
+/Parent 8326 0 R
+/Prev 19 0 R
+/Next 27 0 R
+>> endobj
+19 0 obj <<
+/Title 20 0 R
+/A 17 0 R
+/Parent 8326 0 R
+/Prev 15 0 R
+/Next 23 0 R
+>> endobj
+15 0 obj <<
+/Title 16 0 R
+/A 13 0 R
+/Parent 8326 0 R
+/Prev 11 0 R
+/Next 19 0 R
+>> endobj
+11 0 obj <<
+/Title 12 0 R
+/A 9 0 R
+/Parent 8326 0 R
+/Prev 7 0 R
+/Next 15 0 R
+>> endobj
+7 0 obj <<
+/Title 8 0 R
+/A 5 0 R
+/Parent 8326 0 R
+/Prev 3 0 R
+/Next 11 0 R
+>> endobj
+3 0 obj <<
+/Title 4 0 R
+/A 1 0 R
+/Parent 8326 0 R
+/Next 7 0 R
+>> endobj
+8327 0 obj <<
+/Names [(0) 2955 0 R (0.1.1) 2 0 R (1.0) 6 0 R (10.0) 194 0 R (1000) 4340 0 R (1002) 4341 0 R (1003) 4342 0 R (1004) 4343 0 R (1006) 4344 0 R (1007) 4345 0 R (1008) 4346 0 R (101) 3546 0 R (1010) 4347 0 R (1011) 4348 0 R (1012) 4349 0 R (1013) 4350 0 R (1015) 4351 0 R (1016) 4352 0 R (1017) 4353 0 R (1018) 3105 0 R (102) 3547 0 R (1022) 4355 0 R (1023) 4356 0 R (1024) 4357 0 R (1025) 4358 0 R (1027) 4359 0 R (1028) 4360 0 R (103) 3548 0 R (1030) 4361 0 R (1032) 4362 0 R (1033) 4363 0 R (1034) 4364 0 R (1036) 4365 0 R (1037) 4366 0 R (1038) 4367 0 R (1040) 4368 0 R (1041) 4369 0 R (1042) 4370 0 R (1044) 4376 0 R (1045) 4377 0 R (1046) 4378 0 R (1047) 4379 0 R (1048) 4380 0 R (1049) 4381 0 R (105) 3549 0 R (1050) 4382 0 R (1051) 4383 0 R (1053) 4384 0 R (1054) 4385 0 R (1055) 4386 0 R (1056) 4387 0 R (1057) 4388 0 R (1058) 4389 0 R (1059) 4390 0 R (106) 3550 0 R (1060) 4391 0 R (1061) 4392 0 R (1062) 4393 0 R (1064) 4394 0 R (1065) 4395 0 R (1066) 4396 0 R (1067) 4397 0 R (1069) 4398 0 R (107) 3551 0 R (1070) 4399 0 R (1071) 4400 0 R (1072) 4401 0 R (1074) 4402 0 R (1075) 4403 0 R (1076) 4404 0 R (1078) 4405 0 R (1079) 4406 0 R (108) 3552 0 R (1080) 4407 0 R (1081) 3106 0 R (1085) 4409 0 R (1086) 4410 0 R (1087) 4411 0 R (1088) 4412 0 R (109) 3553 0 R (1090) 4413 0 R (1091) 4414 0 R (1093) 4415 0 R (1095) 4416 0 R (1096) 4417 0 R (1097) 4418 0 R (1099) 4419 0 R (11.0) 198 0 R (11.100.1) 2022 0 R (11.100.396.2) 2026 0 R (11.100.397.2) 2030 0 R (11.100.398.2) 2034 0 R (11.100.399.2) 2038 0 R (11.100.400.2) 2042 0 R (11.101.1) 2046 0 R (11.101.401.2) 2050 0 R (11.101.402.2) 2054 0 R (11.101.403.2) 2058 0 R (11.101.404.2) 2062 0 R (11.102.1) 2066 0 R (11.102.405.2) 2070 0 R (11.102.406.2) 2074 0 R (11.102.407.2) 2078 0 R (11.103.1) 2082 0 R (11.103.408.2) 2086 0 R (11.103.409.2) 2090 0 R (11.103.410.2) 2094 0 R (11.103.411.2) 2098 0 R (11.104.1) 2102 0 R (11.104.412.2) 2106 0 R (11.104.413.2) 2110 0 R (11.104.414.2) 2114 0 R (11.104.415.2) 2118 0 R (11.105.1) 2122 0 R (11.106.1) 2126 0 R (11.106.416.2) 2130 0 R (11.106.417.2) 2134 0 R (11.106.418.2) 2138 0 R (11.106.419.2) 2142 0 R (11.107.1) 2146 0 R (11.107.420.2) 2150 0 R (11.107.421.2) 2154 0 R (11.107.422.2) 2158 0 R (11.107.423.2) 2162 0 R (11.107.424.2) 2166 0 R (11.108.1) 2170 0 R (11.108.425.2) 2174 0 R (11.108.426.2) 2178 0 R (11.108.427.2) 2182 0 R (11.108.428.2) 2186 0 R (11.108.429.2) 2190 0 R (11.109.1) 2194 0 R (11.109.430.2) 2198 0 R (11.109.431.2) 2202 0 R (11.109.432.2) 2206 0 R (11.109.433.2) 2210 0 R (11.109.434.2) 2214 0 R (11.110.1) 2218 0 R (11.110.435.2) 2222 0 R (11.110.436.2) 2226 0 R (11.110.437.2) 2230 0 R (11.110.438.2) 2234 0 R (11.111.1) 2238 0 R (11.111.439.2) 2242 0 R (11.111.440.2) 2246 0 R (11.111.441.2) 2250 0 R (11.112.1) 2254 0 R (11.112.442.2) 2258 0 R (11.112.443.2) 2262 0 R (11.112.444.2) 2266 0 R (11.112.445.2) 2270 0 R (11.113.1) 2274 0 R (11.113.446.2) 2278 0 R (11.113.447.2) 2282 0 R (11.113.448.2) 2286 0 R (11.114.1) 2290 0 R (11.114.449.2) 2294 0 R (11.114.450.2) 2298 0 R (11.114.451.2) 2302 0 R (11.115.1) 2306 0 R (11.115.452.2) 2310 0 R (11.115.453.2) 2314 0 R (11.115.454.2) 2318 0 R (11.115.455.2) 2322 0 R (11.116.1) 2326 0 R (11.116.456.2) 2330 0 R (11.116.457.2) 2334 0 R (11.116.458.2) 2338 0 R (11.117.1) 2342 0 R (11.117.459.2) 2346 0 R (11.117.460.2) 2350 0 R (11.117.461.2) 2354 0 R (11.118.1) 2358 0 R (11.119.1) 2362 0 R (11.119.462.2) 2366 0 R (11.119.463.2) 2370 0 R (11.119.464.2) 2374 0 R (11.119.465.2) 2378 0 R (11.120.1) 2382 0 R (11.120.466.2) 2386 0 R (11.120.467.2) 2390 0 R (11.120.468.2) 2394 0 R (11.121.1) 2398 0 R (11.121.469.2) 2402 0 R (11.121.470.2) 2406 0 R (11.121.471.2) 2410 0 R (11.121.472.2) 2414 0 R (11.122.1) 2418 0 R (11.123.1) 2422 0 R (11.123.473.2) 2426 0 R (11.123.474.2) 2430 0 R (11.123.475.2) 2434 0 R (11.123.476.2) 2438 0 R (11.123.477.2) 2442 0 R (11.124.1) 2446 0 R (11.124.478.2) 2450 0 R (11.124.479.2) 2454 0 R (11.124.480.2) 2458 0 R (11.125.1) 2462 0 R (11.125.481.2) 2466 0 R (11.125.482.2) 2470 0 R (11.125.483.2) 2474 0 R (11.125.484.2) 2478 0 R (11.126.1) 2482 0 R (11.126.485.2) 2486 0 R (11.126.486.2) 2490 0 R (11.126.487.2) 2494 0 R (11.126.488.2) 2498 0 R (11.126.489.2) 2502 0 R (11.127.1) 2506 0 R (11.127.490.2) 2510 0 R (11.127.491.2) 2514 0 R (11.127.492.2) 2518 0 R (11.128.1) 2522 0 R (11.128.493.2) 2526 0 R (11.128.494.2) 2530 0 R (11.128.495.2) 2534 0 R (11.128.496.2) 2538 0 R (11.128.497.2) 2542 0 R (11.129.1) 2546 0 R (11.129.498.2) 2550 0 R (11.129.499.2) 2554 0 R (11.129.500.2) 2558 0 R (11.13.1) 202 0 R (11.130.1) 2562 0 R (11.130.501.2) 2566 0 R (11.130.502.2) 2570 0 R (11.130.503.2) 2574 0 R (11.130.504.2) 2578 0 R (11.131.1) 2582 0 R (11.131.505.2) 2586 0 R (11.131.506.2) 2590 0 R (11.131.507.2) 2594 0 R (11.131.508.2) 2598 0 R (11.132.1) 2602 0 R (11.132.509.2) 2606 0 R (11.132.510.2) 2610 0 R (11.132.511.2) 2614 0 R (11.132.512.2) 2618 0 R (11.133.1) 2622 0 R (11.133.513.2) 2626 0 R (11.133.514.2) 2630 0 R (11.133.515.2) 2634 0 R (11.133.516.2) 2638 0 R (11.134.1) 2642 0 R (11.134.517.2) 2646 0 R (11.134.518.2) 2650 0 R (11.134.519.2) 2654 0 R (11.134.520.2) 2658 0 R (11.134.521.2) 2662 0 R (11.135.1) 2666 0 R (11.135.522.2) 2670 0 R (11.135.523.2) 2674 0 R (11.135.524.2) 2678 0 R (11.135.525.2) 2682 0 R (11.135.526.2) 2686 0 R (11.135.527.2) 2690 0 R (11.136.1) 2694 0 R (11.136.528.2) 2698 0 R (11.136.529.2) 2702 0 R (11.136.530.2) 2706 0 R (11.136.531.2) 2710 0 R (11.136.532.2) 2714 0 R (11.137.1) 2718 0 R (11.137.533.2) 2722 0 R (11.137.534.2) 2726 0 R (11.137.535.2) 2730 0 R (11.137.536.2) 2734 0 R (11.137.537.2) 2738 0 R (11.138.1) 2742 0 R (11.138.538.2) 2746 0 R (11.138.539.2) 2750 0 R (11.138.540.2) 2754 0 R (11.138.541.2) 2758 0 R (11.138.542.2) 2762 0 R (11.139.1) 2766 0 R (11.139.543.2) 2770 0 R (11.139.544.2) 2774 0 R (11.139.545.2) 2778 0 R (11.139.546.2) 2782 0 R (11.14.1) 206 0 R (11.14.28.2) 210 0 R (11.14.29.2) 214 0 R (11.14.30.2) 218 0 R (11.140.1) 2786 0 R (11.140.547.2) 2790 0 R (11.140.548.2) 2794 0 R (11.140.549.2) 2798 0 R (11.140.550.2) 2802 0 R (11.141.1) 2806 0 R (11.141.551.2) 2810 0 R (11.141.552.2) 2814 0 R (11.141.553.2) 2818 0 R (11.142.1) 2822 0 R (11.143.1) 2826 0 R (11.143.554.2) 2830 0 R (11.143.555.2) 2834 0 R (11.143.556.2) 2838 0 R (11.144.1) 2842 0 R (11.144.557.2) 2846 0 R (11.144.558.2) 2850 0 R (11.144.559.2) 2854 0 R (11.145.1) 2858 0 R (11.145.560.2) 2862 0 R (11.145.561.2) 2866 0 R (11.145.562.2) 2870 0 R (11.146.1) 2874 0 R (11.146.563.2) 2878 0 R (11.146.564.2) 2882 0 R (11.146.565.2) 2886 0 R (11.15.1) 222 0 R (11.15.31.2) 226 0 R (11.15.32.2) 230 0 R (11.15.33.2) 234 0 R (11.15.34.2) 238 0 R (11.16.1) 242 0 R (11.16.35.2) 246 0 R (11.16.36.2) 250 0 R (11.16.37.2) 254 0 R (11.16.38.2) 258 0 R (11.17.1) 262 0 R (11.17.39.2) 266 0 R (11.17.40.2) 270 0 R (11.17.41.2) 274 0 R (11.18.1) 278 0 R (11.18.42.2) 282 0 R (11.18.43.2) 286 0 R (11.18.44.2) 290 0 R (11.19.1) 294 0 R (11.19.45.2) 298 0 R (11.19.46.2) 302 0 R (11.19.47.2) 306 0 R (11.20.1) 310 0 R (11.20.48.2) 314 0 R (11.20.49.2) 318 0 R (11.20.50.2) 322 0 R (11.21.1) 326 0 R (11.22.1) 330 0 R (11.22.51.2) 334 0 R (11.22.52.2) 338 0 R (11.22.53.2) 342 0 R (11.22.54.2) 346 0 R (11.22.55.2) 350 0 R (11.22.56.2) 354 0 R (11.23.1) 358 0 R (11.23.57.2) 362 0 R (11.23.58.2) 366 0 R (11.23.59.2) 370 0 R (11.23.60.2) 374 0 R (11.23.61.2) 378 0 R (11.23.62.2) 382 0 R (11.24.1) 386 0 R (11.24.63.2) 390 0 R (11.24.64.2) 394 0 R (11.24.65.2) 398 0 R (11.24.66.2) 402 0 R (11.24.67.2) 406 0 R (11.24.68.2) 410 0 R (11.25.1) 414 0 R (11.25.69.2) 418 0 R (11.25.70.2) 422 0 R (11.25.71.2) 426 0 R (11.25.72.2) 430 0 R (11.25.73.2) 434 0 R (11.25.74.2) 438 0 R (11.26.1) 442 0 R (11.26.75.2) 446 0 R (11.26.76.2) 450 0 R (11.26.77.2) 454 0 R (11.26.78.2) 458 0 R (11.26.79.2) 462 0 R (11.26.80.2) 466 0 R (11.27.1) 470 0 R (11.27.81.2) 474 0 R (11.27.82.2) 478 0 R (11.27.83.2) 482 0 R (11.27.84.2) 486 0 R (11.27.85.2) 490 0 R (11.27.86.2) 494 0 R (11.28.1) 498 0 R (11.28.87.2) 502 0 R (11.28.88.2) 506 0 R (11.28.89.2) 510 0 R (11.28.90.2) 514 0 R (11.28.91.2) 518 0 R (11.28.92.2) 522 0 R (11.29.1) 526 0 R (11.29.93.2) 530 0 R (11.29.94.2) 534 0 R (11.29.95.2) 538 0 R (11.29.96.2) 542 0 R (11.29.97.2) 546 0 R (11.29.98.2) 550 0 R (11.30.1) 554 0 R (11.30.100.2) 562 0 R (11.30.101.2) 566 0 R (11.30.102.2) 570 0 R (11.30.103.2) 574 0 R (11.30.104.2) 578 0 R (11.30.99.2) 558 0 R (11.31.1) 582 0 R (11.32.1) 586 0 R (11.32.105.2) 590 0 R (11.32.106.2) 594 0 R (11.32.107.2) 598 0 R (11.33.1) 602 0 R (11.33.108.2) 606 0 R (11.33.109.2) 610 0 R (11.33.110.2) 614 0 R (11.34.1) 618 0 R (11.34.111.2) 622 0 R (11.34.112.2) 626 0 R (11.34.113.2) 630 0 R (11.34.114.2) 634 0 R (11.34.115.2) 638 0 R (11.34.116.2) 642 0 R (11.35.1) 646 0 R (11.35.117.2) 650 0 R (11.35.118.2) 654 0 R (11.35.119.2) 658 0 R (11.35.120.2) 662 0 R (11.35.121.2) 666 0 R (11.36.1) 670 0 R (11.36.122.2) 674 0 R (11.36.123.2) 678 0 R (11.36.124.2) 682 0 R (11.36.125.2) 686 0 R (11.36.126.2) 690 0 R (11.37.1) 694 0 R (11.37.127.2) 698 0 R (11.37.128.2) 702 0 R (11.37.129.2) 706 0 R (11.37.130.2) 710 0 R (11.38.1) 714 0 R (11.38.131.2) 718 0 R (11.38.132.2) 722 0 R (11.38.133.2) 726 0 R (11.38.134.2) 730 0 R (11.38.135.2) 734 0 R (11.39.1) 738 0 R (11.39.136.2) 742 0 R (11.39.137.2) 746 0 R (11.39.138.2) 750 0 R (11.39.139.2) 754 0 R (11.39.140.2) 758 0 R (11.39.141.2) 762 0 R (11.40.1) 766 0 R (11.40.142.2) 770 0 R (11.40.143.2) 774 0 R (11.40.144.2) 778 0 R (11.40.145.2) 782 0 R (11.40.146.2) 786 0 R (11.40.147.2) 790 0 R (11.41.1) 794 0 R (11.41.148.2) 798 0 R (11.41.149.2) 802 0 R (11.41.150.2) 806 0 R (11.41.151.2) 810 0 R (11.41.152.2) 814 0 R (11.42.1) 818 0 R (11.42.153.2) 822 0 R (11.42.154.2) 826 0 R (11.42.155.2) 830 0 R (11.42.156.2) 834 0 R (11.42.157.2) 838 0 R (11.43.1) 842 0 R (11.43.158.2) 846 0 R (11.43.159.2) 850 0 R (11.43.160.2) 854 0 R (11.43.161.2) 858 0 R (11.43.162.2) 862 0 R (11.44.1) 866 0 R (11.44.163.2) 870 0 R (11.44.164.2) 874 0 R (11.44.165.2) 878 0 R (11.44.166.2) 882 0 R (11.44.167.2) 886 0 R (11.45.1) 890 0 R (11.45.168.2) 894 0 R (11.45.169.2) 898 0 R (11.45.170.2) 902 0 R (11.45.171.2) 906 0 R (11.45.172.2) 910 0 R (11.46.1) 914 0 R (11.46.173.2) 918 0 R (11.46.174.2) 922 0 R (11.46.175.2) 926 0 R (11.46.176.2) 930 0 R (11.46.177.2) 934 0 R (11.47.1) 938 0 R (11.47.178.2) 942 0 R (11.47.179.2) 946 0 R (11.47.180.2) 950 0 R (11.47.181.2) 954 0 R (11.47.182.2) 958 0 R (11.48.1) 962 0 R (11.48.183.2) 966 0 R (11.48.184.2) 970 0 R (11.48.185.2) 974 0 R (11.48.186.2) 978 0 R (11.48.187.2) 982 0 R (11.49.1) 986 0 R (11.49.188.2) 990 0 R (11.49.189.2) 994 0 R (11.49.190.2) 998 0 R (11.49.191.2) 1002 0 R (11.49.192.2) 1006 0 R (11.50.1) 1010 0 R (11.50.193.2) 1014 0 R (11.50.194.2) 1018 0 R (11.50.195.2) 1022 0 R (11.50.196.2) 1026 0 R (11.50.197.2) 1030 0 R (11.51.1) 1034 0 R (11.51.198.2) 1038 0 R (11.51.199.2) 1042 0 R (11.51.200.2) 1046 0 R (11.51.201.2) 1050 0 R (11.51.202.2) 1054 0 R (11.52.1) 1058 0 R (11.52.203.2) 1062 0 R (11.52.204.2) 1066 0 R (11.52.205.2) 1070 0 R (11.52.206.2) 1074 0 R (11.52.207.2) 1078 0 R (11.53.1) 1082 0 R (11.53.208.2) 1086 0 R (11.53.209.2) 1090 0 R (11.53.210.2) 1094 0 R (11.53.211.2) 1098 0 R (11.53.212.2) 1102 0 R (11.53.213.2) 1106 0 R (11.54.1) 1110 0 R (11.54.214.2) 1114 0 R (11.54.215.2) 1118 0 R (11.54.216.2) 1122 0 R (11.54.217.2) 1126 0 R (11.54.218.2) 1130 0 R (11.55.1) 1134 0 R (11.56.1) 1138 0 R (11.56.219.2) 1142 0 R (11.56.220.2) 1146 0 R (11.56.221.2) 1150 0 R (11.56.222.2) 1154 0 R (11.57.1) 1158 0 R (11.57.223.2) 1162 0 R (11.57.224.2) 1166 0 R (11.57.225.2) 1170 0 R (11.57.226.2) 1174 0 R (11.58.1) 1178 0 R (11.58.227.2) 1182 0 R (11.58.228.2) 1186 0 R (11.58.229.2) 1190 0 R (11.58.230.2) 1194 0 R (11.59.1) 1198 0 R (11.59.231.2) 1202 0 R (11.59.232.2) 1206 0 R (11.59.233.2) 1210 0 R (11.59.234.2) 1214 0 R (11.60.1) 1218 0 R (11.60.235.2) 1222 0 R (11.60.236.2) 1226 0 R (11.60.237.2) 1230 0 R (11.60.238.2) 1234 0 R (11.61.1) 1238 0 R (11.61.239.2) 1242 0 R (11.61.240.2) 1246 0 R (11.61.241.2) 1250 0 R (11.61.242.2) 1254 0 R (11.62.1) 1258 0 R (11.62.243.2) 1262 0 R (11.62.244.2) 1266 0 R (11.62.245.2) 1270 0 R (11.62.246.2) 1274 0 R (11.63.1) 1278 0 R (11.63.247.2) 1282 0 R (11.63.248.2) 1286 0 R (11.63.249.2) 1290 0 R (11.63.250.2) 1294 0 R (11.64.1) 1298 0 R (11.64.251.2) 1302 0 R (11.64.252.2) 1306 0 R (11.64.253.2) 1310 0 R (11.64.254.2) 1314 0 R (11.65.1) 1318 0 R (11.65.255.2) 1322 0 R (11.65.256.2) 1326 0 R (11.65.257.2) 1330 0 R (11.65.258.2) 1334 0 R (11.66.1) 1338 0 R (11.66.259.2) 1342 0 R (11.66.260.2) 1346 0 R (11.66.261.2) 1350 0 R (11.67.1) 1354 0 R (11.67.262.2) 1358 0 R (11.67.263.2) 1362 0 R (11.67.264.2) 1366 0 R (11.68.1) 1370 0 R (11.68.265.2) 1374 0 R (11.68.266.2) 1378 0 R (11.68.267.2) 1382 0 R (11.69.1) 1386 0 R (11.69.268.2) 1390 0 R (11.69.269.2) 1394 0 R (11.69.270.2) 1398 0 R (11.69.271.2) 1402 0 R (11.70.1) 1406 0 R (11.70.272.2) 1410 0 R (11.70.273.2) 1414 0 R (11.70.274.2) 1418 0 R (11.70.275.2) 1422 0 R (11.71.1) 1426 0 R (11.71.276.2) 1430 0 R (11.71.277.2) 1434 0 R (11.71.278.2) 1438 0 R (11.72.1) 1442 0 R (11.72.279.2) 1446 0 R (11.72.280.2) 1450 0 R (11.72.281.2) 1454 0 R (11.72.282.2) 1458 0 R (11.73.1) 1462 0 R (11.73.283.2) 1466 0 R (11.73.284.2) 1470 0 R (11.73.285.2) 1474 0 R (11.73.286.2) 1478 0 R (11.73.287.2) 1482 0 R (11.74.1) 1486 0 R (11.74.288.2) 1490 0 R (11.74.289.2) 1494 0 R (11.74.290.2) 1498 0 R (11.74.291.2) 1502 0 R (11.75.1) 1506 0 R (11.75.292.2) 1510 0 R (11.75.293.2) 1514 0 R (11.75.294.2) 1518 0 R (11.75.295.2) 1522 0 R (11.75.296.2) 1526 0 R (11.76.1) 1530 0 R (11.76.297.2) 1534 0 R (11.76.298.2) 1538 0 R (11.76.299.2) 1542 0 R (11.76.300.2) 1546 0 R (11.76.301.2) 1550 0 R (11.77.1) 1554 0 R (11.77.302.2) 1558 0 R (11.77.303.2) 1562 0 R (11.77.304.2) 1566 0 R (11.77.305.2) 1570 0 R (11.77.306.2) 1574 0 R (11.78.1) 1578 0 R (11.78.307.2) 1582 0 R (11.78.308.2) 1586 0 R (11.78.309.2) 1590 0 R (11.78.310.2) 1594 0 R (11.78.311.2) 1598 0 R (11.79.1) 1602 0 R (11.79.312.2) 1606 0 R (11.79.313.2) 1610 0 R (11.79.314.2) 1614 0 R (11.79.315.2) 1618 0 R (11.79.316.2) 1622 0 R (11.80.1) 1626 0 R (11.80.317.2) 1630 0 R (11.80.318.2) 1634 0 R (11.80.319.2) 1638 0 R (11.80.320.2) 1642 0 R (11.80.321.2) 1646 0 R (11.81.1) 1650 0 R (11.81.322.2) 1654 0 R (11.81.323.2) 1658 0 R (11.81.324.2) 1662 0 R (11.81.325.2) 1666 0 R (11.81.326.2) 1670 0 R (11.82.1) 1674 0 R (11.82.327.2) 1678 0 R (11.82.328.2) 1682 0 R (11.82.329.2) 1686 0 R (11.82.330.2) 1690 0 R (11.82.331.2) 1694 0 R (11.83.1) 1698 0 R (11.83.332.2) 1702 0 R (11.83.333.2) 1706 0 R (11.83.334.2) 1710 0 R (11.83.335.2) 1714 0 R (11.84.1) 1718 0 R (11.84.336.2) 1722 0 R (11.84.337.2) 1726 0 R (11.84.338.2) 1730 0 R (11.84.339.2) 1734 0 R (11.84.340.2) 1738 0 R (11.85.1) 1742 0 R (11.85.341.2) 1746 0 R (11.85.342.2) 1750 0 R (11.85.343.2) 1754 0 R (11.85.344.2) 1758 0 R (11.86.1) 1762 0 R (11.86.345.2) 1766 0 R (11.86.346.2) 1770 0 R (11.86.347.2) 1774 0 R (11.86.348.2) 1778 0 R (11.87.1) 1782 0 R (11.87.349.2) 1786 0 R (11.87.350.2) 1790 0 R (11.87.351.2) 1794 0 R (11.87.352.2) 1798 0 R (11.88.1) 1802 0 R (11.88.353.2) 1806 0 R (11.88.354.2) 1810 0 R (11.88.355.2) 1814 0 R (11.89.1) 1818 0 R (11.89.356.2) 1822 0 R (11.89.357.2) 1826 0 R (11.89.358.2) 1830 0 R (11.90.1) 1834 0 R (11.90.359.2) 1838 0 R (11.90.360.2) 1842 0 R (11.90.361.2) 1846 0 R (11.90.362.2) 1850 0 R (11.91.1) 1854 0 R (11.91.363.2) 1858 0 R (11.91.364.2) 1862 0 R (11.91.365.2) 1866 0 R (11.91.366.2) 1870 0 R (11.92.1) 1874 0 R (11.92.367.2) 1878 0 R (11.92.368.2) 1882 0 R (11.92.369.2) 1886 0 R (11.92.370.2) 1890 0 R (11.93.1) 1894 0 R (11.93.371.2) 1898 0 R (11.93.372.2) 1902 0 R (11.93.373.2) 1906 0 R (11.93.374.2) 1910 0 R (11.94.1) 1914 0 R (11.94.375.2) 1918 0 R (11.94.376.2) 1922 0 R (11.94.377.2) 1926 0 R (11.94.378.2) 1930 0 R (11.95.1) 1934 0 R (11.96.1) 1938 0 R (11.96.379.2) 1942 0 R (11.96.380.2) 1946 0 R (11.96.381.2) 1950 0 R (11.96.382.2) 1954 0 R (11.97.1) 1958 0 R (11.97.383.2) 1962 0 R (11.97.384.2) 1966 0 R (11.97.385.2) 1970 0 R (11.98.1) 1974 0 R (11.98.386.2) 1978 0 R (11.98.387.2) 1982 0 R (11.98.388.2) 1986 0 R (11.98.389.2) 1990 0 R (11.98.390.2) 1994 0 R (11.99.1) 1998 0 R (11.99.391.2) 2002 0 R (11.99.392.2) 2006 0 R (11.99.393.2) 2010 0 R (11.99.394.2) 2014 0 R (11.99.395.2) 2018 0 R (110) 3554 0 R (1100) 4420 0 R (1101) 4421 0 R (1103) 4427 0 R (1104) 4428 0 R (1105) 4429 0 R (1107) 4375 0 R (1108) 4430 0 R (1109) 4431 0 R (111) 3555 0 R (1111) 4432 0 R (1112) 4433 0 R (1113) 4434 0 R (1115) 4435 0 R (1116) 4436 0 R (1117) 4437 0 R (1119) 4438 0 R (112) 3556 0 R (1120) 4439 0 R (1121) 4440 0 R (1123) 4441 0 R (1124) 4442 0 R (1125) 4443 0 R (1127) 4444 0 R (1128) 4445 0 R (1129) 4446 0 R (113) 3557 0 R (1131) 4447 0 R (1132) 4448 0 R (1133) 4449 0 R (1135) 4450 0 R (1136) 4451 0 R (1137) 4452 0 R (1139) 4453 0 R (1140) 4454 0 R (1141) 4455 0 R (1143) 4456 0 R (1144) 4457 0 R (1145) 4458 0 R (1147) 4459 0 R (1148) 4460 0 R (1149) 4461 0 R (115) 3558 0 R (1151) 4462 0 R (1152) 4463 0 R (1153) 4464 0 R (1155) 4465 0 R (1156) 4466 0 R (1157) 4467 0 R (1159) 4468 0 R (116) 3559 0 R (1160) 4469 0 R (1161) 4470 0 R (1163) 4471 0 R (1164) 4472 0 R (1165) 4473 0 R (1167) 4474 0 R (1168) 4475 0 R (1169) 4476 0 R (117) 3560 0 R (1170) 4477 0 R (1172) 4478 0 R (1173) 4479 0 R (1174) 4480 0 R (1176) 4481 0 R (1177) 4482 0 R (1178) 4483 0 R (118) 3561 0 R (1180) 4484 0 R (1181) 4485 0 R (1182) 4486 0 R (1184) 4487 0 R (1185) 4488 0 R (1186) 4489 0 R (1189) 4490 0 R (119) 3562 0 R (1190) 4491 0 R (1191) 3108 0 R (1195) 4498 0 R (1196) 4499 0 R (1197) 4500 0 R (1198) 4501 0 R (12.0) 2890 0 R (12.147.1) 2894 0 R (12.148.1) 2898 0 R (12.149.1) 2902 0 R (12.150.1) 2906 0 R (12.151.1) 2910 0 R (12.151.566.2) 2914 0 R (12.151.567.2) 2918 0 R (12.151.568.2) 2922 0 R (12.151.569.2) 2926 0 R (12.152.1) 2930 0 R (12.152.570.2) 2934 0 R (12.152.571.2) 2938 0 R (12.152.572.2) 2942 0 R (12.152.573.2) 2946 0 R (120) 3563 0 R (1200) 4502 0 R (1201) 4503 0 R (1203) 4504 0 R (1204) 4505 0 R (1205) 4506 0 R (1206) 4507 0 R (1208) 4508 0 R (121) 3564 0 R (1210) 4509 0 R (1211) 4510 0 R (1212) 4511 0 R (1213) 4512 0 R (1214) 4513 0 R (1215) 4514 0 R (1216) 4515 0 R (1218) 4516 0 R (1219) 4517 0 R (122) 3565 0 R (1220) 4518 0 R (1221) 4519 0 R (1223) 4520 0 R (1224) 4521 0 R (1225) 4522 0 R (1227) 4523 0 R (1228) 3109 0 R (123) 3566 0 R (1232) 4525 0 R (1233) 4526 0 R (1234) 4527 0 R (1235) 4528 0 R (1237) 4529 0 R (1238) 4530 0 R (124) 3567 0 R (1240) 4531 0 R (1241) 4532 0 R (1242) 4533 0 R (1243) 4534 0 R (1245) 4535 0 R (1247) 4536 0 R (1248) 4537 0 R (1249) 4538 0 R (125) 3568 0 R (1250) 4539 0 R (1251) 4540 0 R (1253) 4541 0 R (1254) 4542 0 R (1255) 4543 0 R (1257) 4548 0 R (1258) 4496 0 R (126) 3569 0 R (1260) 4549 0 R (1261) 3110 0 R (1265) 4551 0 R (1266) 4552 0 R (1267) 4553 0 R (1268) 4554 0 R (127) 3570 0 R (1270) 4555 0 R (1271) 4556 0 R (1273) 4557 0 R (1274) 4558 0 R (1275) 4559 0 R (1276) 4560 0 R (1278) 4561 0 R (128) 3571 0 R (1280) 4562 0 R (1281) 4563 0 R (1282) 4564 0 R (1283) 4565 0 R (1284) 4566 0 R (1286) 4567 0 R (1287) 4568 0 R (1288) 4569 0 R (129) 3572 0 R (1290) 4570 0 R (1291) 4571 0 R (1292) 4572 0 R (1294) 4573 0 R (1295) 3111 0 R (1299) 4575 0 R (130) 3573 0 R (1300) 4576 0 R (1301) 4577 0 R (1302) 4578 0 R (1304) 4579 0 R (1305) 4580 0 R (1307) 4581 0 R (1308) 4582 0 R (1309) 4583 0 R (131) 3574 0 R (1310) 4584 0 R (1312) 4585 0 R (1314) 4586 0 R (1315) 4587 0 R (1316) 4588 0 R (1317) 4589 0 R (1318) 4590 0 R (132) 3575 0 R (1320) 4596 0 R (1321) 4597 0 R (1322) 4598 0 R (1323) 4599 0 R (1324) 4600 0 R (1325) 4601 0 R (1326) 4602 0 R (1328) 4603 0 R (1329) 4604 0 R (133) 3576 0 R (1331) 4605 0 R (1332) 3112 0 R (1336) 4607 0 R (1337) 4608 0 R (1338) 4609 0 R (1339) 4610 0 R (134) 3577 0 R (1341) 4611 0 R (1342) 4612 0 R (1344) 4613 0 R (1345) 4614 0 R (1346) 4615 0 R (1347) 4616 0 R (1348) 4617 0 R (1349) 4618 0 R (135) 3578 0 R (1351) 4619 0 R (1353) 4620 0 R (1354) 4621 0 R (1355) 4622 0 R (1356) 4623 0 R (1358) 4624 0 R (1359) 4625 0 R (136) 3579 0 R (1360) 4626 0 R (1361) 4627 0 R (1362) 4628 0 R (1364) 4629 0 R (1365) 4630 0 R (1366) 4631 0 R (1367) 4632 0 R (1368) 4633 0 R (1369) 4634 0 R (137) 3580 0 R (1370) 4635 0 R (1371) 4636 0 R (1372) 4637 0 R (1373) 4638 0 R (1374) 4639 0 R (1375) 4640 0 R (1376) 4641 0 R (1377) 4642 0 R (1378) 4643 0 R (1379) 4644 0 R (138) 3581 0 R (1380) 4645 0 R (1381) 4646 0 R (1382) 4647 0 R (1383) 4648 0 R (1384) 4649 0 R (1385) 4650 0 R (1386) 4651 0 R (1387) 4652 0 R (1388) 4653 0 R (1389) 4654 0 R (139) 3582 0 R (1390) 4655 0 R (1391) 4656 0 R (1392) 4657 0 R (1393) 4658 0 R (1394) 4659 0 R (1395) 4660 0 R (1396) 4661 0 R (1397) 4662 0 R (1398) 4663 0 R (1399) 4664 0 R (140) 3583 0 R (1400) 4665 0 R (1401) 4666 0 R (1402) 4667 0 R (1403) 4668 0 R (1404) 4669 0 R (1405) 4670 0 R (1406) 4671 0 R (1407) 4672 0 R (1408) 4673 0 R (1409) 4674 0 R (141) 3584 0 R (1410) 4675 0 R (1411) 4676 0 R (1412) 4677 0 R (1414) 4683 0 R (1415) 4595 0 R (1417) 4684 0 R (1418) 3113 0 R (142) 3585 0 R (1422) 4686 0 R (1423) 4687 0 R (1424) 4688 0 R (1425) 4689 0 R (1427) 4690 0 R (1428) 4691 0 R (143) 3586 0 R (1430) 4692 0 R (1431) 4693 0 R (1432) 4694 0 R (1433) 4695 0 R (1434) 4696 0 R (1435) 4697 0 R (1437) 4698 0 R (1439) 4699 0 R (1440) 4700 0 R (1441) 4701 0 R (1442) 4702 0 R (1444) 4703 0 R (1445) 4704 0 R (1446) 4705 0 R (1447) 4706 0 R (1448) 4707 0 R (145) 3587 0 R (1450) 4708 0 R (1451) 4709 0 R (1452) 4710 0 R (1453) 4711 0 R (1454) 4712 0 R (1456) 4713 0 R (1457) 4714 0 R (1459) 4715 0 R (146) 3588 0 R (1460) 3114 0 R (1464) 4717 0 R (1465) 4718 0 R (1466) 4719 0 R (1467) 4720 0 R (1469) 4721 0 R (147) 3589 0 R (1470) 4722 0 R (1472) 4723 0 R (1473) 4724 0 R (1474) 4725 0 R (1475) 4726 0 R (1477) 4731 0 R (1479) 4732 0 R (148) 3084 0 R (1480) 4733 0 R (1481) 4734 0 R (1482) 4735 0 R (1483) 4682 0 R (1485) 4736 0 R (1486) 4737 0 R (1487) 4738 0 R (1488) 4739 0 R (1489) 4740 0 R (1491) 4741 0 R (1492) 4742 0 R (1493) 4743 0 R (1495) 4744 0 R (1496) 3115 0 R (15) 3080 0 R (1500) 4746 0 R (1501) 4747 0 R (1502) 4748 0 R (1503) 4749 0 R (1505) 4750 0 R (1506) 4751 0 R (1508) 4752 0 R (1509) 4753 0 R (1510) 4754 0 R (1511) 4755 0 R (1512) 4756 0 R (1513) 4757 0 R (1515) 4758 0 R (1517) 4759 0 R (1518) 4760 0 R (1519) 4761 0 R (152) 3590 0 R (1520) 4762 0 R (1522) 4763 0 R (1523) 4764 0 R (1524) 4765 0 R (1525) 4766 0 R (1526) 4767 0 R (1528) 4768 0 R (1529) 4769 0 R (153) 3591 0 R (1530) 4770 0 R (1532) 4771 0 R (1533) 4772 0 R (1535) 4773 0 R (1536) 3116 0 R (154) 3592 0 R (1540) 4775 0 R (1541) 4776 0 R (1542) 4777 0 R (1543) 4778 0 R (1545) 4784 0 R (1546) 4785 0 R (1548) 4786 0 R (1549) 4787 0 R (155) 3593 0 R (1550) 4788 0 R (1551) 4789 0 R (1553) 4790 0 R (1555) 4791 0 R (1556) 4792 0 R (1557) 4793 0 R (1558) 4794 0 R (1559) 4795 0 R (156) 3598 0 R (1561) 4796 0 R (1562) 4797 0 R (1563) 4798 0 R (1565) 4799 0 R (1566) 4800 0 R (1567) 4801 0 R (1569) 4802 0 R (157) 3599 0 R (1572) 4803 0 R (1573) 4804 0 R (1574) 3118 0 R (1578) 4806 0 R (1579) 4807 0 R (158) 3600 0 R (1580) 4808 0 R (1581) 4809 0 R (1583) 4810 0 R (1584) 4811 0 R (1586) 4812 0 R (1587) 4813 0 R (1588) 4814 0 R (1589) 4815 0 R (159) 3601 0 R (1591) 4816 0 R (1593) 4817 0 R (1594) 4818 0 R (1595) 4819 0 R (1596) 4820 0 R (1597) 3119 0 R (160) 3602 0 R (1601) 4822 0 R (1602) 4823 0 R (1603) 4824 0 R (1604) 4825 0 R (1606) 4826 0 R (1607) 4827 0 R (1609) 4828 0 R (161) 3603 0 R (1610) 4829 0 R (1611) 4830 0 R (1612) 4831 0 R (1614) 4837 0 R (1616) 4838 0 R (1617) 4839 0 R (1618) 4840 0 R (1619) 4841 0 R (162) 3604 0 R (1620) 3120 0 R (1624) 4843 0 R (1625) 4844 0 R (1626) 4845 0 R (1627) 4846 0 R (1629) 4847 0 R (163) 3605 0 R (1630) 4848 0 R (1632) 4849 0 R (1633) 4850 0 R (1634) 4851 0 R (1635) 4852 0 R (1637) 4853 0 R (1639) 4854 0 R (1640) 4855 0 R (1641) 4856 0 R (1642) 4857 0 R (1643) 4858 0 R (1645) 4859 0 R (1646) 4860 0 R (1647) 4861 0 R (1648) 4862 0 R (1650) 4863 0 R (1651) 4864 0 R (1653) 4865 0 R (1654) 3121 0 R (1658) 4867 0 R (1659) 4868 0 R (1660) 4869 0 R (1661) 4870 0 R (1663) 4871 0 R (1664) 4872 0 R (1666) 4873 0 R (1667) 4874 0 R (1668) 4875 0 R (1669) 4876 0 R (1670) 4877 0 R (1671) 4878 0 R (1672) 4879 0 R (1673) 4880 0 R (1675) 4881 0 R (1677) 4882 0 R (1678) 4883 0 R (1679) 4884 0 R (168) 3606 0 R (1680) 4885 0 R (1682) 4886 0 R (1683) 4887 0 R (1684) 4888 0 R (1685) 4889 0 R (1687) 4890 0 R (1688) 4891 0 R (1689) 4892 0 R (169) 3607 0 R (1690) 4893 0 R (1691) 4894 0 R (1693) 4900 0 R (1694) 4836 0 R (1696) 4901 0 R (1697) 3122 0 R (17) 3481 0 R (170) 3608 0 R (1701) 4903 0 R (1702) 4904 0 R (1703) 4905 0 R (1704) 4906 0 R (1706) 4907 0 R (1707) 4908 0 R (1709) 4909 0 R (171) 3609 0 R (1710) 4910 0 R (1711) 4911 0 R (1712) 4912 0 R (1713) 4913 0 R (1714) 4914 0 R (1715) 4915 0 R (1716) 4916 0 R (1717) 4917 0 R (1718) 4918 0 R (1719) 4919 0 R (172) 3610 0 R (1720) 4920 0 R (1721) 4921 0 R (1722) 4922 0 R (1724) 4923 0 R (1726) 4924 0 R (1727) 4925 0 R (1728) 4926 0 R (1729) 4927 0 R (173) 3611 0 R (1731) 4928 0 R (1732) 4929 0 R (1733) 4930 0 R (1734) 4931 0 R (1736) 4932 0 R (1737) 4933 0 R (1738) 4934 0 R (1739) 4935 0 R (174) 3612 0 R (1741) 4936 0 R (1742) 4937 0 R (1743) 4938 0 R (1744) 4939 0 R (1746) 4940 0 R (1747) 4941 0 R (1748) 4942 0 R (1749) 4943 0 R (175) 3613 0 R (1751) 4944 0 R (1752) 4945 0 R (1753) 4946 0 R (1754) 4947 0 R (1755) 4948 0 R (1756) 4949 0 R (1757) 4950 0 R (1758) 4951 0 R (1759) 4952 0 R (176) 3614 0 R (1760) 4953 0 R (1761) 4954 0 R (1762) 4955 0 R (1764) 4956 0 R (1765) 4957 0 R (1767) 4958 0 R (1768) 3123 0 R (177) 3615 0 R (1772) 4960 0 R (1773) 4961 0 R (1774) 4962 0 R (1775) 4963 0 R (1777) 4964 0 R (1778) 4965 0 R (178) 3616 0 R (1780) 4966 0 R (1781) 4967 0 R (1782) 4968 0 R (1783) 4969 0 R (1784) 4970 0 R (1785) 4971 0 R (1787) 4977 0 R (1789) 4978 0 R (179) 3617 0 R (1790) 4979 0 R (1791) 4980 0 R (1792) 4981 0 R (1794) 4899 0 R (1796) 4982 0 R (1797) 4983 0 R (1798) 4984 0 R (18) 3081 0 R (180) 3618 0 R (1800) 4985 0 R (1801) 3124 0 R (1805) 4987 0 R (1806) 4988 0 R (1807) 4989 0 R (1808) 4990 0 R (181) 3619 0 R (1810) 4991 0 R (1811) 4992 0 R (1813) 4993 0 R (1814) 4994 0 R (1815) 4995 0 R (1816) 4996 0 R (1817) 4997 0 R (1818) 4998 0 R (182) 3620 0 R (1820) 4999 0 R (1822) 5000 0 R (1823) 5001 0 R (1824) 5002 0 R (1825) 5003 0 R (1827) 5004 0 R (1828) 5005 0 R (1829) 5006 0 R (183) 3621 0 R (1830) 5007 0 R (1831) 5008 0 R (1833) 5009 0 R (1834) 5010 0 R (1836) 5011 0 R (1837) 3125 0 R (184) 3622 0 R (1841) 5013 0 R (1842) 5014 0 R (1843) 5015 0 R (1844) 5016 0 R (1846) 5017 0 R (1847) 5018 0 R (1849) 5019 0 R (1850) 5020 0 R (1851) 5021 0 R (1852) 5022 0 R (1853) 5023 0 R (1854) 5024 0 R (1855) 5025 0 R (1856) 5026 0 R (1858) 5027 0 R (186) 3623 0 R (1860) 5028 0 R (1861) 5029 0 R (1862) 5030 0 R (1863) 5031 0 R (1865) 5032 0 R (1866) 5033 0 R (1867) 5034 0 R (1868) 5035 0 R (187) 3624 0 R (1870) 5040 0 R (1871) 5041 0 R (1872) 5042 0 R (1873) 5043 0 R (1874) 4976 0 R (1876) 5044 0 R (1877) 5045 0 R (1878) 5046 0 R (1879) 5047 0 R (188) 3625 0 R (1881) 5048 0 R (1882) 5049 0 R (1884) 5050 0 R (1885) 3126 0 R (1889) 5052 0 R (189) 3626 0 R (1890) 5053 0 R (1891) 5054 0 R (1892) 5055 0 R (1894) 5056 0 R (1895) 5057 0 R (1897) 5058 0 R (1898) 5059 0 R (1899) 5060 0 R (190) 3627 0 R (1900) 5061 0 R (1901) 5062 0 R (1902) 5063 0 R (1903) 5064 0 R (1904) 5065 0 R (1906) 5066 0 R (1908) 5067 0 R (1909) 5068 0 R (191) 3628 0 R (1910) 5069 0 R (1911) 5070 0 R (1913) 5071 0 R (1914) 5072 0 R (1915) 5073 0 R (1916) 5074 0 R (1918) 5075 0 R (1919) 5076 0 R (192) 3629 0 R (1920) 5077 0 R (1921) 5078 0 R (1922) 5079 0 R (1924) 5080 0 R (1925) 5081 0 R (1926) 5082 0 R (1928) 5083 0 R (1929) 5084 0 R (1931) 5085 0 R (1932) 3127 0 R (1936) 5087 0 R (1937) 5088 0 R (1938) 5089 0 R (1939) 5090 0 R (194) 3630 0 R (1941) 5096 0 R (1942) 5097 0 R (1944) 5098 0 R (1945) 5099 0 R (1946) 5100 0 R (1947) 5101 0 R (1949) 5102 0 R (195) 3631 0 R (1951) 5103 0 R (1952) 5104 0 R (1953) 5105 0 R (1954) 5106 0 R (1955) 5107 0 R (1957) 5108 0 R (1958) 5109 0 R (196) 3632 0 R (1960) 5110 0 R (1961) 3128 0 R (1965) 5112 0 R (1966) 5113 0 R (1967) 5114 0 R (1968) 5115 0 R (1970) 5116 0 R (1971) 5117 0 R (1973) 5118 0 R (1974) 5119 0 R (1975) 5120 0 R (1976) 5121 0 R (1977) 5122 0 R (1978) 5123 0 R (1979) 5124 0 R (198) 3633 0 R (1980) 5125 0 R (1982) 5126 0 R (1984) 5127 0 R (1985) 5128 0 R (1986) 5129 0 R (1987) 5130 0 R (1989) 5131 0 R (199) 3634 0 R (1990) 5132 0 R (1991) 5133 0 R (1992) 5134 0 R (1994) 5135 0 R (1995) 5136 0 R (1996) 5137 0 R (1997) 5138 0 R (1998) 5139 0 R (2.0) 10 0 R (20) 3486 0 R (200) 3635 0 R (2000) 5140 0 R (2001) 5141 0 R (2003) 5142 0 R (2004) 3129 0 R (2008) 5144 0 R (2009) 5145 0 R (2010) 5146 0 R (2011) 5147 0 R (2013) 5148 0 R (2014) 5149 0 R (2016) 5150 0 R (2017) 5151 0 R (2018) 5152 0 R (2019) 5153 0 R (202) 3636 0 R (2021) 5159 0 R (2023) 5160 0 R (2024) 5161 0 R (2025) 5162 0 R (2026) 5163 0 R (2027) 5095 0 R (2029) 5164 0 R (203) 3637 0 R (2030) 5165 0 R (2032) 5166 0 R (2033) 3130 0 R (2037) 5168 0 R (2038) 5169 0 R (2039) 5170 0 R (204) 3638 0 R (2040) 5171 0 R (2042) 5172 0 R (2043) 5173 0 R (2045) 5174 0 R (2046) 5175 0 R (2047) 5176 0 R (2048) 5177 0 R (2050) 5178 0 R (2052) 5179 0 R (2053) 5180 0 R (2054) 5181 0 R (2055) 5182 0 R (2056) 5183 0 R (2058) 5184 0 R (2059) 5185 0 R (206) 3639 0 R (2061) 5186 0 R (2062) 3131 0 R (2066) 5188 0 R (2067) 5189 0 R (2068) 5190 0 R (2069) 5191 0 R (207) 3640 0 R (2071) 5192 0 R (2072) 5193 0 R (2074) 5194 0 R (2075) 5195 0 R (2076) 5196 0 R (2077) 5197 0 R (2079) 5198 0 R (208) 3641 0 R (2081) 5199 0 R (2082) 5200 0 R (2083) 5201 0 R (2084) 5202 0 R (2085) 5203 0 R (2087) 5204 0 R (2088) 5205 0 R (2090) 5210 0 R (2091) 3132 0 R (2095) 5212 0 R (2096) 5213 0 R (2097) 5214 0 R (2098) 5215 0 R (2099) 5216 0 R (21) 3082 0 R (210) 3645 0 R (2101) 5217 0 R (2102) 5218 0 R (2104) 5219 0 R (2105) 5220 0 R (2106) 5221 0 R (2107) 5222 0 R (2109) 5223 0 R (211) 3646 0 R (2111) 5224 0 R (2112) 5225 0 R (2113) 5226 0 R (2114) 5227 0 R (2115) 5228 0 R (2117) 5229 0 R (2118) 5230 0 R (212) 3647 0 R (2120) 5231 0 R (2121) 3247 0 R (2125) 5233 0 R (2126) 5234 0 R (2127) 5235 0 R (2128) 5236 0 R (213) 3597 0 R (2130) 5237 0 R (2131) 5238 0 R (2133) 5239 0 R (2134) 5240 0 R (2135) 5241 0 R (2136) 5242 0 R (2137) 5243 0 R (2138) 5244 0 R (214) 3648 0 R (2140) 5245 0 R (2142) 5246 0 R (2143) 5247 0 R (2144) 5248 0 R (2145) 5249 0 R (2147) 5250 0 R (2148) 5251 0 R (2149) 5252 0 R (2150) 5253 0 R (2151) 5254 0 R (2153) 5255 0 R (2154) 5256 0 R (2156) 5257 0 R (2157) 3248 0 R (216) 3650 0 R (2161) 5263 0 R (2162) 5264 0 R (2163) 5265 0 R (2164) 5266 0 R (2166) 5267 0 R (2167) 5268 0 R (2169) 5269 0 R (217) 3651 0 R (2170) 5270 0 R (2171) 5271 0 R (2172) 5272 0 R (2173) 5273 0 R (2174) 5274 0 R (2175) 5275 0 R (2176) 5276 0 R (2178) 5277 0 R (218) 3652 0 R (2180) 5278 0 R (2181) 5279 0 R (2182) 5280 0 R (2183) 5281 0 R (2185) 5282 0 R (2186) 5283 0 R (2187) 5284 0 R (2188) 5285 0 R (2190) 5286 0 R (2191) 5287 0 R (2192) 5288 0 R (2193) 5289 0 R (2194) 5290 0 R (2196) 5291 0 R (2197) 5292 0 R (2199) 5293 0 R (2200) 3249 0 R (2204) 5295 0 R (2205) 5296 0 R (2206) 5297 0 R (2207) 5298 0 R (2209) 5299 0 R (2210) 5300 0 R (2212) 5301 0 R (2213) 5302 0 R (2214) 5303 0 R (2215) 5304 0 R (2217) 5305 0 R (2219) 5306 0 R (222) 3089 0 R (2220) 5307 0 R (2221) 5308 0 R (2222) 5309 0 R (2223) 5310 0 R (2225) 5311 0 R (2226) 5312 0 R (2228) 5313 0 R (2229) 3250 0 R (2233) 5319 0 R (2234) 5320 0 R (2235) 5321 0 R (2236) 5322 0 R (2238) 5323 0 R (2239) 5324 0 R (2241) 5325 0 R (2242) 5326 0 R (2243) 5327 0 R (2244) 5328 0 R (2245) 5329 0 R (2246) 5330 0 R (2248) 5331 0 R (2250) 5332 0 R (2251) 5333 0 R (2252) 5334 0 R (2253) 5335 0 R (2255) 5336 0 R (2256) 5337 0 R (2257) 5338 0 R (2258) 5339 0 R (2259) 5340 0 R (226) 3655 0 R (2261) 5341 0 R (2262) 5342 0 R (2264) 5343 0 R (2265) 3251 0 R (2269) 5345 0 R (227) 3656 0 R (2270) 5346 0 R (2271) 5347 0 R (2272) 5348 0 R (2274) 5349 0 R (2275) 5350 0 R (2277) 5351 0 R (2278) 5352 0 R (2279) 5353 0 R (228) 3657 0 R (2280) 5354 0 R (2281) 5355 0 R (2282) 5356 0 R (2284) 5357 0 R (2286) 5358 0 R (2287) 5359 0 R (2288) 5360 0 R (2289) 5361 0 R (229) 3658 0 R (2291) 5362 0 R (2292) 5363 0 R (2293) 5364 0 R (2294) 5365 0 R (2295) 5366 0 R (2297) 5367 0 R (2298) 5368 0 R (2299) 5369 0 R (23) 3083 0 R (2301) 5370 0 R (2302) 3252 0 R (2306) 5376 0 R (2307) 5377 0 R (2308) 5378 0 R (2309) 5379 0 R (231) 3659 0 R (2311) 5380 0 R (2312) 5381 0 R (2314) 5382 0 R (2315) 5383 0 R (2316) 5384 0 R (2317) 5385 0 R (2318) 5386 0 R (2319) 5387 0 R (232) 3660 0 R (2321) 5388 0 R (2323) 5389 0 R (2324) 5390 0 R (2325) 5391 0 R (2326) 5392 0 R (2328) 5393 0 R (2329) 5394 0 R (2330) 5395 0 R (2331) 5396 0 R (2332) 5397 0 R (2334) 5398 0 R (2335) 5399 0 R (2337) 5400 0 R (2338) 3253 0 R (234) 3661 0 R (2342) 5402 0 R (2343) 5403 0 R (2344) 5404 0 R (2345) 5405 0 R (2347) 5406 0 R (2348) 5407 0 R (235) 3664 0 R (2350) 5408 0 R (2351) 5409 0 R (2352) 5410 0 R (2353) 5411 0 R (2354) 5412 0 R (2355) 5413 0 R (2357) 5414 0 R (2359) 5415 0 R (236) 3665 0 R (2360) 5416 0 R (2361) 5417 0 R (2362) 5418 0 R (2364) 5419 0 R (2365) 5420 0 R (2366) 5421 0 R (2367) 5422 0 R (2368) 5423 0 R (237) 3668 0 R (2370) 5424 0 R (2371) 5425 0 R (2373) 5426 0 R (2374) 5427 0 R (2376) 5433 0 R (2377) 3254 0 R (238) 3669 0 R (2381) 5435 0 R (2382) 5436 0 R (2383) 5437 0 R (2384) 5438 0 R (2386) 5439 0 R (2387) 5440 0 R (2389) 5441 0 R (239) 3670 0 R (2390) 5442 0 R (2391) 5443 0 R (2392) 5444 0 R (2394) 5445 0 R (2396) 5446 0 R (2397) 5447 0 R (2398) 5448 0 R (2399) 5449 0 R (2400) 5450 0 R (2402) 5451 0 R (2403) 5452 0 R (2405) 5453 0 R (2408) 5454 0 R (2409) 3256 0 R (241) 3671 0 R (2413) 5456 0 R (2414) 5457 0 R (2415) 5458 0 R (2416) 5459 0 R (2418) 5460 0 R (2419) 5461 0 R (2421) 5462 0 R (2423) 5463 0 R (2424) 5464 0 R (2425) 5465 0 R (2427) 5466 0 R (2428) 5467 0 R (2429) 5468 0 R (243) 3672 0 R (2431) 5474 0 R (2432) 5475 0 R (2433) 5476 0 R (2434) 5432 0 R (2436) 5477 0 R (2437) 3257 0 R (244) 3673 0 R (2441) 5479 0 R (2442) 5480 0 R (2443) 5481 0 R (2444) 5482 0 R (2446) 5483 0 R (2447) 5484 0 R (2449) 5485 0 R (245) 3674 0 R (2451) 5486 0 R (2452) 5487 0 R (2453) 5488 0 R (2454) 5489 0 R (2455) 5490 0 R (2456) 5491 0 R (2457) 5492 0 R (2458) 5493 0 R (2459) 5494 0 R (246) 3675 0 R (2460) 5495 0 R (2462) 5496 0 R (2463) 5497 0 R (2464) 5498 0 R (2466) 5499 0 R (2467) 5500 0 R (2468) 5501 0 R (247) 3676 0 R (2470) 5502 0 R (2471) 5503 0 R (2472) 5504 0 R (2474) 5505 0 R (2475) 5506 0 R (2476) 5507 0 R (2478) 5508 0 R (2479) 5509 0 R (248) 3677 0 R (2480) 5510 0 R (2482) 5511 0 R (2483) 5512 0 R (2484) 5513 0 R (2486) 5514 0 R (2487) 5515 0 R (2488) 5516 0 R (2489) 5517 0 R (2491) 5518 0 R (2492) 5519 0 R (2493) 3258 0 R (2497) 5525 0 R (2498) 5526 0 R (2499) 5527 0 R (25) 3487 0 R (250) 3678 0 R (2500) 5528 0 R (2502) 5529 0 R (2503) 5530 0 R (2505) 5531 0 R (2506) 5532 0 R (2507) 5533 0 R (2508) 5534 0 R (2509) 5535 0 R (251) 3679 0 R (2510) 5536 0 R (2511) 5537 0 R (2512) 5538 0 R (2514) 5539 0 R (2516) 5540 0 R (2517) 5541 0 R (2518) 5542 0 R (2519) 5543 0 R (252) 3680 0 R (2521) 5544 0 R (2522) 5545 0 R (2523) 5546 0 R (2524) 5547 0 R (2526) 5548 0 R (2527) 5549 0 R (2528) 5550 0 R (2529) 5551 0 R (253) 3681 0 R (2530) 5552 0 R (2532) 5553 0 R (2533) 3259 0 R (2537) 5555 0 R (2538) 5556 0 R (2539) 5557 0 R (254) 3682 0 R (2540) 5558 0 R (2542) 5559 0 R (2543) 5560 0 R (2545) 5561 0 R (2546) 5562 0 R (2547) 5563 0 R (2548) 5564 0 R (2549) 5565 0 R (255) 3683 0 R (2550) 5566 0 R (2552) 5567 0 R (2554) 5568 0 R (2555) 5569 0 R (2556) 5570 0 R (2557) 5571 0 R (2559) 5572 0 R (256) 3684 0 R (2560) 5573 0 R (2561) 5574 0 R (2562) 5575 0 R (2563) 5576 0 R (2564) 5577 0 R (2566) 5578 0 R (2567) 3260 0 R (257) 3685 0 R (2571) 5580 0 R (2572) 5581 0 R (2573) 5582 0 R (2574) 5583 0 R (2576) 5589 0 R (2577) 5590 0 R (2579) 5591 0 R (258) 3686 0 R (2580) 5592 0 R (2581) 5593 0 R (2582) 5594 0 R (2583) 5595 0 R (2584) 5596 0 R (2586) 5597 0 R (2588) 5598 0 R (2589) 5599 0 R (2590) 5600 0 R (2591) 5601 0 R (2593) 5602 0 R (2594) 5603 0 R (2595) 5604 0 R (2596) 5605 0 R (2597) 5606 0 R (2598) 5607 0 R (260) 3687 0 R (2600) 5608 0 R (2601) 3261 0 R (2605) 5610 0 R (2606) 5611 0 R (2607) 5612 0 R (2608) 5613 0 R (261) 3090 0 R (2610) 5614 0 R (2611) 5615 0 R (2613) 5616 0 R (2614) 5617 0 R (2615) 5618 0 R (2616) 5619 0 R (2617) 5620 0 R (2618) 5621 0 R (2620) 5622 0 R (2622) 5623 0 R (2623) 5624 0 R (2624) 5625 0 R (2625) 5626 0 R (2627) 5627 0 R (2628) 5628 0 R (2629) 5629 0 R (2630) 5630 0 R (2631) 5631 0 R (2633) 5632 0 R (2634) 5633 0 R (2635) 5634 0 R (2636) 5635 0 R (2637) 3262 0 R (2641) 5637 0 R (2642) 5638 0 R (2643) 5639 0 R (2644) 5640 0 R (2646) 5641 0 R (2647) 5642 0 R (2649) 5643 0 R (265) 3689 0 R (2650) 5644 0 R (2651) 5645 0 R (2652) 5646 0 R (2653) 5647 0 R (2654) 5648 0 R (2656) 5649 0 R (2658) 5650 0 R (2659) 5651 0 R (266) 3690 0 R (2660) 5652 0 R (2661) 5653 0 R (2663) 5659 0 R (2664) 5660 0 R (2665) 5661 0 R (2666) 5662 0 R (2667) 5663 0 R (2668) 5588 0 R (267) 3691 0 R (2670) 5664 0 R (2671) 5665 0 R (2672) 5666 0 R (2673) 3263 0 R (2677) 5668 0 R (2678) 5669 0 R (2679) 5670 0 R (268) 3692 0 R (2680) 5671 0 R (2682) 5672 0 R (2683) 5673 0 R (2685) 5674 0 R (2686) 5675 0 R (2687) 5676 0 R (2688) 5677 0 R (2689) 5678 0 R (2690) 5679 0 R (2692) 5680 0 R (2694) 5681 0 R (2695) 5682 0 R (2696) 5683 0 R (2697) 5684 0 R (2699) 5685 0 R (27) 3488 0 R (270) 3696 0 R (2700) 5686 0 R (2701) 5687 0 R (2702) 5688 0 R (2703) 5689 0 R (2704) 5690 0 R (2706) 5691 0 R (2707) 3264 0 R (271) 3697 0 R (2711) 5693 0 R (2712) 5694 0 R (2713) 5695 0 R (2714) 5696 0 R (2716) 5697 0 R (2717) 5698 0 R (2719) 5703 0 R (2721) 5704 0 R (2722) 5705 0 R (2723) 5706 0 R (2724) 5707 0 R (2726) 5658 0 R (2727) 5708 0 R (2728) 5709 0 R (273) 3698 0 R (2730) 5710 0 R (2731) 5711 0 R (2732) 5712 0 R (2733) 5713 0 R (2734) 5714 0 R (2736) 5715 0 R (2737) 5716 0 R (2738) 5717 0 R (2739) 5718 0 R (274) 3699 0 R (2740) 5719 0 R (2742) 5720 0 R (2743) 5721 0 R (2744) 5722 0 R (2745) 5723 0 R (2746) 5724 0 R (2748) 5725 0 R (2749) 5726 0 R (275) 3700 0 R (2750) 5727 0 R (2751) 5728 0 R (2752) 5729 0 R (2754) 5730 0 R (2755) 5731 0 R (2756) 5732 0 R (2757) 5733 0 R (2759) 5734 0 R (276) 3701 0 R (2760) 5735 0 R (2761) 5736 0 R (2762) 5737 0 R (2764) 5738 0 R (2765) 5739 0 R (2766) 5740 0 R (2768) 5741 0 R (2769) 5742 0 R (2770) 5743 0 R (2771) 5744 0 R (2773) 5745 0 R (2774) 5746 0 R (2775) 5747 0 R (2777) 5748 0 R (2778) 5749 0 R (2779) 5750 0 R (278) 3702 0 R (2781) 5751 0 R (2782) 5752 0 R (2783) 5753 0 R (2785) 5754 0 R (2786) 5755 0 R (2787) 5756 0 R (2788) 5757 0 R (2790) 5758 0 R (2791) 5759 0 R (2792) 5760 0 R (2793) 3265 0 R (2797) 5762 0 R (2798) 5763 0 R (2799) 5764 0 R (28) 3489 0 R (280) 3703 0 R (2800) 5765 0 R (2802) 5770 0 R (2803) 5771 0 R (2805) 5772 0 R (2807) 5773 0 R (2808) 5774 0 R (2809) 5775 0 R (281) 3704 0 R (2811) 5776 0 R (2812) 5777 0 R (2813) 5778 0 R (2815) 5779 0 R (2816) 5780 0 R (2817) 5781 0 R (2819) 5782 0 R (282) 3705 0 R (2820) 5783 0 R (2821) 5784 0 R (2823) 5785 0 R (2824) 5786 0 R (2825) 5787 0 R (2826) 5788 0 R (2827) 5789 0 R (2829) 5790 0 R (283) 3706 0 R (2830) 5791 0 R (2831) 5792 0 R (2833) 5793 0 R (2834) 5794 0 R (2835) 5795 0 R (2836) 5796 0 R (2837) 5797 0 R (2838) 5798 0 R (2839) 5799 0 R (284) 3707 0 R (2840) 5800 0 R (2841) 5801 0 R (2842) 5802 0 R (2843) 5803 0 R (2845) 5804 0 R (2846) 5805 0 R (2847) 5806 0 R (2849) 5807 0 R (2850) 5808 0 R (2851) 5809 0 R (2853) 5810 0 R (2854) 5811 0 R (2855) 5812 0 R (2856) 5813 0 R (2858) 5814 0 R (2859) 3266 0 R (286) 3708 0 R (2863) 5821 0 R (2864) 5822 0 R (2865) 5823 0 R (2866) 5824 0 R (2868) 5825 0 R (2869) 5826 0 R (287) 3091 0 R (2871) 5827 0 R (2872) 5828 0 R (2873) 5829 0 R (2874) 5830 0 R (2875) 5831 0 R (2876) 5832 0 R (2878) 5833 0 R (2880) 5834 0 R (2881) 5835 0 R (2882) 5836 0 R (2883) 5837 0 R (2885) 5838 0 R (2886) 5839 0 R (2887) 5840 0 R (2888) 5841 0 R (2889) 3267 0 R (2893) 5843 0 R (2894) 5844 0 R (2895) 5845 0 R (2896) 5846 0 R (2898) 5847 0 R (2899) 5848 0 R (29) 3490 0 R (2901) 5849 0 R (2902) 5850 0 R (2903) 5851 0 R (2904) 5852 0 R (2905) 5853 0 R (2906) 5854 0 R (2908) 5855 0 R (291) 3710 0 R (2910) 5856 0 R (2911) 5857 0 R (2912) 5858 0 R (2913) 5859 0 R (2915) 5860 0 R (2916) 5861 0 R (2917) 5862 0 R (2918) 5863 0 R (2919) 3268 0 R (292) 3711 0 R (2923) 5865 0 R (2924) 5866 0 R (2925) 5867 0 R (2926) 5868 0 R (2928) 5869 0 R (2929) 5870 0 R (293) 3712 0 R (2931) 5871 0 R (2932) 5872 0 R (2933) 5873 0 R (2934) 5874 0 R (2935) 5875 0 R (2936) 5876 0 R (2938) 5877 0 R (294) 3713 0 R (2940) 5878 0 R (2941) 5879 0 R (2942) 5880 0 R (2943) 5881 0 R (2945) 5882 0 R (2946) 5883 0 R (2947) 5884 0 R (2948) 5885 0 R (2949) 3269 0 R (2953) 5891 0 R (2954) 5892 0 R (2955) 5893 0 R (2956) 5894 0 R (2958) 5895 0 R (2959) 5896 0 R (296) 3714 0 R (2961) 5897 0 R (2962) 5898 0 R (2963) 5899 0 R (2964) 5900 0 R (2965) 5901 0 R (2966) 5902 0 R (2968) 5903 0 R (297) 3715 0 R (2970) 5904 0 R (2971) 5905 0 R (2972) 5906 0 R (2973) 5907 0 R (2975) 5908 0 R (2976) 5909 0 R (2977) 5910 0 R (2978) 5911 0 R (2979) 5912 0 R (2981) 5913 0 R (2982) 3270 0 R (2986) 5915 0 R (2987) 5916 0 R (2988) 5917 0 R (2989) 5918 0 R (299) 3716 0 R (2991) 5919 0 R (2992) 5920 0 R (2994) 5921 0 R (2995) 5922 0 R (2996) 5923 0 R (2997) 5924 0 R (2998) 5925 0 R (2999) 5926 0 R (3.0) 14 0 R (300) 3717 0 R (3001) 5927 0 R (3003) 5928 0 R (3004) 5929 0 R (3005) 5930 0 R (3006) 5931 0 R (3008) 5932 0 R (3009) 5933 0 R (301) 3718 0 R (3010) 5934 0 R (3011) 5935 0 R (3012) 5936 0 R (3014) 5937 0 R (3015) 5938 0 R (3016) 5939 0 R (3017) 5940 0 R (3018) 3271 0 R (302) 3719 0 R (3022) 5942 0 R (3023) 5943 0 R (3024) 5944 0 R (3025) 5945 0 R (3027) 5950 0 R (3028) 5951 0 R (303) 3720 0 R (3030) 5952 0 R (3031) 5953 0 R (3032) 5954 0 R (3033) 5955 0 R (3035) 5956 0 R (3037) 5957 0 R (3038) 5958 0 R (3039) 5959 0 R (304) 3721 0 R (3040) 5960 0 R (3041) 3272 0 R (3045) 5962 0 R (3046) 5963 0 R (3047) 5964 0 R (3048) 5965 0 R (305) 3722 0 R (3050) 5966 0 R (3051) 5967 0 R (3053) 5968 0 R (3054) 5969 0 R (3055) 5970 0 R (3056) 5971 0 R (3058) 5972 0 R (306) 3723 0 R (3060) 5973 0 R (3061) 5974 0 R (3062) 5975 0 R (3063) 5976 0 R (3064) 5977 0 R (3066) 5978 0 R (3067) 5979 0 R (3068) 3273 0 R (3072) 5981 0 R (3073) 5982 0 R (3074) 5983 0 R (3075) 5984 0 R (3077) 5985 0 R (3078) 5986 0 R (308) 3724 0 R (3080) 5987 0 R (3081) 5988 0 R (3082) 5989 0 R (3083) 5990 0 R (3085) 5991 0 R (3087) 5992 0 R (3088) 5993 0 R (3089) 5994 0 R (3090) 5995 0 R (3091) 5996 0 R (3093) 5997 0 R (3094) 5998 0 R (3096) 5999 0 R (3097) 3274 0 R (31) 3491 0 R (310) 3725 0 R (3101) 6005 0 R (3102) 6006 0 R (3103) 6007 0 R (3104) 6008 0 R (3106) 6009 0 R (3107) 6010 0 R (3109) 6011 0 R (311) 3726 0 R (3110) 6012 0 R (3111) 6013 0 R (3112) 6014 0 R (3114) 6015 0 R (3116) 6016 0 R (3117) 6017 0 R (3118) 6018 0 R (3119) 6019 0 R (312) 3727 0 R (3120) 6020 0 R (3122) 6021 0 R (3123) 3275 0 R (3127) 6023 0 R (3128) 6024 0 R (3129) 6025 0 R (313) 3728 0 R (3130) 6026 0 R (3132) 6027 0 R (3133) 6028 0 R (3135) 6029 0 R (3136) 6030 0 R (3137) 6031 0 R (3138) 6032 0 R (3139) 6033 0 R (3140) 6034 0 R (3141) 6035 0 R (3142) 6036 0 R (3143) 6037 0 R (3144) 6038 0 R (3146) 6039 0 R (3148) 6040 0 R (3149) 6041 0 R (315) 3729 0 R (3150) 6042 0 R (3151) 6043 0 R (3153) 6044 0 R (3154) 6045 0 R (3155) 6046 0 R (3156) 6047 0 R (3158) 6048 0 R (3159) 6049 0 R (316) 3730 0 R (3160) 6050 0 R (3161) 6051 0 R (3163) 6052 0 R (3164) 6053 0 R (3165) 6054 0 R (3166) 6055 0 R (3167) 6056 0 R (3169) 6057 0 R (317) 3731 0 R (3170) 6058 0 R (3171) 6059 0 R (3173) 6060 0 R (3174) 3276 0 R (3178) 6067 0 R (3179) 6068 0 R (318) 3732 0 R (3180) 6069 0 R (3181) 6070 0 R (3183) 6071 0 R (3184) 6072 0 R (3186) 6073 0 R (3187) 6074 0 R (3188) 6075 0 R (3189) 6076 0 R (319) 3733 0 R (3190) 6077 0 R (3191) 6078 0 R (3192) 6079 0 R (3193) 6080 0 R (3194) 6081 0 R (3195) 6082 0 R (3196) 6083 0 R (3197) 6084 0 R (3198) 6085 0 R (3199) 6086 0 R (32) 3492 0 R (3201) 6087 0 R (3203) 6088 0 R (3204) 6089 0 R (3205) 6090 0 R (3206) 6091 0 R (3208) 6092 0 R (3209) 6093 0 R (321) 3734 0 R (3210) 6094 0 R (3211) 6095 0 R (3213) 6096 0 R (3214) 6097 0 R (3215) 6098 0 R (3216) 6099 0 R (3218) 6100 0 R (3219) 6101 0 R (322) 3735 0 R (3220) 6102 0 R (3221) 6103 0 R (3223) 6104 0 R (3224) 6105 0 R (3225) 6106 0 R (3226) 6107 0 R (3228) 6108 0 R (3229) 6109 0 R (323) 3736 0 R (3230) 6110 0 R (3231) 6111 0 R (3232) 6112 0 R (3234) 6113 0 R (3235) 6114 0 R (3237) 6115 0 R (3238) 3277 0 R (324) 3737 0 R (3242) 6117 0 R (3243) 6118 0 R (3244) 6119 0 R (3245) 6120 0 R (3247) 6121 0 R (3248) 6122 0 R (325) 3738 0 R (3250) 6123 0 R (3251) 6124 0 R (3252) 6125 0 R (3253) 6126 0 R (3254) 6127 0 R (3255) 6128 0 R (3256) 6129 0 R (3257) 6130 0 R (3259) 6131 0 R (3261) 6132 0 R (3262) 6133 0 R (3263) 6134 0 R (3264) 6135 0 R (3266) 6136 0 R (3267) 6137 0 R (3268) 6138 0 R (3269) 6139 0 R (327) 3739 0 R (3271) 6145 0 R (3272) 6146 0 R (3273) 6147 0 R (3274) 6148 0 R (3275) 6065 0 R (3277) 6149 0 R (3278) 6150 0 R (3279) 6151 0 R (328) 3740 0 R (3280) 6152 0 R (3282) 6153 0 R (3283) 3278 0 R (3287) 6155 0 R (3288) 6156 0 R (3289) 6157 0 R (329) 3092 0 R (3290) 6158 0 R (3292) 6159 0 R (3293) 6160 0 R (3295) 6161 0 R (3296) 6162 0 R (3297) 6163 0 R (3298) 6164 0 R (3299) 6165 0 R (33) 3493 0 R (3300) 6166 0 R (3301) 6167 0 R (3302) 6168 0 R (3304) 6169 0 R (3306) 6170 0 R (3307) 6171 0 R (3308) 6172 0 R (3309) 6173 0 R (3311) 6174 0 R (3312) 6175 0 R (3313) 6176 0 R (3314) 6177 0 R (3316) 6178 0 R (3317) 6179 0 R (3318) 6180 0 R (3319) 6181 0 R (3320) 6182 0 R (3322) 6183 0 R (3323) 6184 0 R (3324) 6185 0 R (3325) 6186 0 R (3327) 6187 0 R (3328) 3279 0 R (333) 3742 0 R (3332) 6189 0 R (3333) 6190 0 R (3334) 6191 0 R (3335) 6192 0 R (3337) 6193 0 R (3338) 6194 0 R (334) 3743 0 R (3340) 6195 0 R (3341) 6196 0 R (3342) 6197 0 R (3343) 6198 0 R (3344) 6199 0 R (3345) 6200 0 R (3347) 6206 0 R (3349) 6207 0 R (335) 3744 0 R (3350) 6208 0 R (3351) 6209 0 R (3352) 6210 0 R (3354) 6144 0 R (3356) 6211 0 R (3357) 6212 0 R (3358) 6213 0 R (336) 3745 0 R (3360) 6214 0 R (3361) 6215 0 R (3363) 6216 0 R (3364) 3280 0 R (3368) 6218 0 R (3369) 6219 0 R (3370) 6220 0 R (3371) 6221 0 R (3373) 6222 0 R (3374) 6223 0 R (3376) 6224 0 R (3377) 6225 0 R (3378) 6226 0 R (3379) 6227 0 R (338) 3746 0 R (3380) 6228 0 R (3381) 6229 0 R (3382) 6230 0 R (3383) 6231 0 R (3385) 6232 0 R (3387) 6233 0 R (3388) 6234 0 R (3389) 6235 0 R (339) 3747 0 R (3390) 6236 0 R (3392) 6237 0 R (3393) 6238 0 R (3394) 6239 0 R (3395) 6240 0 R (3397) 6241 0 R (3398) 6242 0 R (3399) 6243 0 R (34) 3494 0 R (3400) 6244 0 R (3401) 6245 0 R (3403) 6246 0 R (3404) 6247 0 R (3406) 6248 0 R (3407) 3281 0 R (341) 3748 0 R (3411) 6250 0 R (3412) 6251 0 R (3413) 6252 0 R (3414) 6253 0 R (3416) 6258 0 R (3417) 6259 0 R (3419) 6260 0 R (342) 3749 0 R (3420) 6261 0 R (3421) 6262 0 R (3422) 6263 0 R (3423) 6264 0 R (3424) 6265 0 R (3425) 6266 0 R (3426) 6267 0 R (3428) 6268 0 R (343) 3750 0 R (3430) 6269 0 R (3431) 6270 0 R (3432) 6271 0 R (3433) 6272 0 R (3435) 6273 0 R (3436) 6274 0 R (3437) 6275 0 R (3438) 6276 0 R (344) 3751 0 R (3440) 6277 0 R (3441) 6278 0 R (3442) 6279 0 R (3443) 6280 0 R (3444) 6281 0 R (3446) 6282 0 R (3447) 6283 0 R (3448) 6284 0 R (345) 3752 0 R (3450) 6285 0 R (3451) 3282 0 R (3455) 6287 0 R (3456) 6288 0 R (3457) 6289 0 R (3458) 6290 0 R (346) 3753 0 R (3460) 6291 0 R (3461) 6292 0 R (3463) 6293 0 R (3464) 6294 0 R (3465) 6295 0 R (3466) 6296 0 R (3467) 6297 0 R (3468) 6298 0 R (3469) 6299 0 R (347) 3754 0 R (3470) 6300 0 R (3472) 6301 0 R (3474) 6302 0 R (3475) 6303 0 R (3476) 6304 0 R (3477) 6305 0 R (3479) 6306 0 R (348) 3755 0 R (3480) 6307 0 R (3481) 6308 0 R (3482) 6309 0 R (3484) 6310 0 R (3485) 6311 0 R (3486) 6312 0 R (3487) 6313 0 R (3488) 6314 0 R (3490) 6315 0 R (3491) 6316 0 R (3492) 6317 0 R (3494) 6318 0 R (3495) 3283 0 R (3499) 6324 0 R (350) 3756 0 R (3500) 6325 0 R (3501) 6326 0 R (3502) 6327 0 R (3504) 6328 0 R (3505) 6329 0 R (3507) 6330 0 R (3508) 6331 0 R (3509) 6332 0 R (3510) 6333 0 R (3511) 6334 0 R (3512) 6335 0 R (3513) 6336 0 R (3514) 6337 0 R (3515) 6338 0 R (3516) 6339 0 R (3518) 6340 0 R (352) 3757 0 R (3520) 6341 0 R (3521) 6342 0 R (3522) 6343 0 R (3523) 6344 0 R (3525) 6345 0 R (3526) 6346 0 R (3527) 6347 0 R (3528) 6348 0 R (353) 3758 0 R (3530) 6349 0 R (3531) 6350 0 R (3532) 6351 0 R (3533) 6352 0 R (3535) 6353 0 R (3536) 6354 0 R (3537) 6355 0 R (3538) 6356 0 R (3539) 6357 0 R (354) 3759 0 R (3541) 6358 0 R (3542) 3284 0 R (3546) 6360 0 R (3547) 6361 0 R (3548) 6362 0 R (3549) 6363 0 R (355) 3760 0 R (3551) 6364 0 R (3552) 6365 0 R (3554) 6366 0 R (3555) 6367 0 R (3556) 6368 0 R (3557) 6369 0 R (3559) 6370 0 R (3561) 6371 0 R (3562) 6372 0 R (3563) 6373 0 R (3564) 6374 0 R (3565) 6375 0 R (3567) 6376 0 R (3568) 6377 0 R (357) 3761 0 R (3570) 6378 0 R (3571) 3285 0 R (3575) 6385 0 R (3576) 6386 0 R (3577) 6387 0 R (3578) 6388 0 R (358) 3762 0 R (3580) 6389 0 R (3581) 6390 0 R (3583) 6391 0 R (3584) 6392 0 R (3585) 6393 0 R (3586) 6394 0 R (3588) 6395 0 R (359) 3763 0 R (3590) 6396 0 R (3591) 6397 0 R (3592) 6398 0 R (3593) 6399 0 R (3594) 6400 0 R (3596) 6401 0 R (3597) 3286 0 R (360) 3764 0 R (3601) 6403 0 R (3602) 6404 0 R (3603) 6405 0 R (3604) 6406 0 R (3606) 6407 0 R (3607) 6408 0 R (3609) 6409 0 R (361) 3765 0 R (3610) 6410 0 R (3611) 6411 0 R (3612) 6412 0 R (3613) 6413 0 R (3614) 6414 0 R (3615) 6415 0 R (3616) 6416 0 R (3618) 6417 0 R (3620) 6418 0 R (3621) 6419 0 R (3622) 6420 0 R (3623) 6421 0 R (3625) 6422 0 R (3626) 6423 0 R (3627) 6424 0 R (3628) 6425 0 R (363) 3769 0 R (3630) 6426 0 R (3631) 6427 0 R (3632) 6428 0 R (3633) 6429 0 R (3634) 6430 0 R (3636) 6431 0 R (3637) 3287 0 R (364) 3770 0 R (3641) 6433 0 R (3642) 6434 0 R (3643) 6435 0 R (3644) 6436 0 R (3646) 6437 0 R (3647) 6438 0 R (3649) 6439 0 R (365) 3771 0 R (3650) 6440 0 R (3651) 6441 0 R (3652) 6442 0 R (3654) 6448 0 R (3656) 6449 0 R (3657) 6450 0 R (3658) 6451 0 R (3659) 6452 0 R (366) 3772 0 R (3660) 6383 0 R (3662) 6453 0 R (3663) 3288 0 R (3667) 6455 0 R (3668) 6456 0 R (3669) 6457 0 R (367) 3773 0 R (3670) 6458 0 R (3672) 6459 0 R (3673) 6460 0 R (3675) 6461 0 R (3676) 6462 0 R (3677) 6463 0 R (3678) 6464 0 R (368) 3774 0 R (3680) 6465 0 R (3682) 6466 0 R (3683) 6467 0 R (3684) 6468 0 R (3685) 6469 0 R (3686) 3289 0 R (3690) 6471 0 R (3691) 6472 0 R (3692) 6473 0 R (3693) 6474 0 R (3695) 6475 0 R (3696) 6476 0 R (3698) 6477 0 R (3699) 6478 0 R (37) 3495 0 R (370) 3775 0 R (3700) 6479 0 R (3701) 6480 0 R (3703) 6481 0 R (3705) 6482 0 R (3706) 6483 0 R (3707) 6484 0 R (3708) 6485 0 R (3709) 3290 0 R (371) 3776 0 R (3713) 6487 0 R (3714) 6488 0 R (3715) 6489 0 R (3716) 6490 0 R (3718) 6491 0 R (3719) 6492 0 R (372) 3093 0 R (3721) 6493 0 R (3722) 6494 0 R (3723) 6495 0 R (3724) 6496 0 R (3725) 6497 0 R (3726) 6498 0 R (3728) 6503 0 R (3730) 6504 0 R (3731) 6505 0 R (3732) 6506 0 R (3733) 6507 0 R (3735) 6447 0 R (3737) 6508 0 R (3738) 6509 0 R (3739) 6510 0 R (3741) 6511 0 R (3742) 3291 0 R (3746) 6513 0 R (3747) 6514 0 R (3748) 6515 0 R (3749) 6516 0 R (3751) 6517 0 R (3752) 6518 0 R (3754) 6519 0 R (3755) 6520 0 R (3756) 6521 0 R (3757) 6522 0 R (3759) 6523 0 R (376) 3778 0 R (3761) 6524 0 R (3762) 6525 0 R (3763) 6526 0 R (3764) 6527 0 R (3765) 6528 0 R (3767) 6529 0 R (3768) 3292 0 R (377) 3779 0 R (3772) 6531 0 R (3773) 6532 0 R (3774) 6533 0 R (3775) 6534 0 R (3777) 6535 0 R (3778) 6536 0 R (378) 3780 0 R (3780) 6537 0 R (3781) 6538 0 R (3782) 6539 0 R (3783) 6540 0 R (3784) 6541 0 R (3785) 6542 0 R (3787) 6543 0 R (3789) 6544 0 R (379) 3781 0 R (3790) 6545 0 R (3791) 6546 0 R (3792) 6547 0 R (3794) 6548 0 R (3795) 6549 0 R (3796) 6550 0 R (3797) 6551 0 R (3798) 6552 0 R (38) 3496 0 R (3800) 6553 0 R (3801) 3293 0 R (3805) 6561 0 R (3806) 6562 0 R (3807) 6563 0 R (3808) 6564 0 R (381) 3782 0 R (3810) 6565 0 R (3811) 6566 0 R (3813) 6567 0 R (3814) 6568 0 R (3815) 6569 0 R (3816) 6570 0 R (3818) 6571 0 R (382) 3783 0 R (3820) 6572 0 R (3821) 6573 0 R (3822) 6574 0 R (3823) 6575 0 R (3824) 6576 0 R (3826) 6577 0 R (3827) 3294 0 R (3831) 6579 0 R (3832) 6580 0 R (3833) 6581 0 R (3834) 6582 0 R (3836) 6583 0 R (3837) 6584 0 R (3839) 6585 0 R (384) 3784 0 R (3840) 6586 0 R (3841) 6587 0 R (3842) 6588 0 R (3844) 6589 0 R (3846) 6590 0 R (3847) 6591 0 R (3848) 6592 0 R (3849) 6593 0 R (3850) 6594 0 R (3852) 6595 0 R (3853) 3295 0 R (3855) 3296 0 R (3859) 6597 0 R (386) 3785 0 R (3860) 6598 0 R (3861) 6599 0 R (3862) 6600 0 R (3864) 6601 0 R (3865) 6602 0 R (3867) 6603 0 R (3868) 6604 0 R (3869) 6605 0 R (387) 3786 0 R (3870) 6606 0 R (3871) 6607 0 R (3872) 6608 0 R (3873) 6609 0 R (3874) 6610 0 R (3876) 6616 0 R (3878) 6617 0 R (3879) 6618 0 R (388) 3787 0 R (3880) 6619 0 R (3881) 6620 0 R (3883) 6559 0 R (3885) 6621 0 R (3886) 6622 0 R (3888) 6623 0 R (3889) 6624 0 R (389) 3788 0 R (3890) 6625 0 R (3891) 6626 0 R (3892) 6627 0 R (3894) 6628 0 R (3895) 6629 0 R (3896) 6630 0 R (3897) 3297 0 R (390) 3789 0 R (3901) 6632 0 R (3902) 6633 0 R (3903) 6634 0 R (3904) 6635 0 R (3906) 6636 0 R (3907) 6637 0 R (3909) 6638 0 R (391) 3790 0 R (3910) 6639 0 R (3911) 6640 0 R (3912) 6641 0 R (3914) 6642 0 R (3916) 6643 0 R (3917) 6644 0 R (3918) 6645 0 R (3919) 6646 0 R (392) 3791 0 R (3920) 3298 0 R (3924) 6648 0 R (3925) 6649 0 R (3926) 6650 0 R (3927) 6651 0 R (3929) 6652 0 R (393) 3792 0 R (3930) 6653 0 R (3932) 6654 0 R (3933) 6655 0 R (3934) 6656 0 R (3935) 6657 0 R (3936) 6658 0 R (3937) 6659 0 R (3938) 6660 0 R (3939) 6661 0 R (394) 3793 0 R (3940) 6662 0 R (3941) 6663 0 R (3942) 6664 0 R (3943) 6665 0 R (3944) 6666 0 R (3945) 6667 0 R (3947) 6668 0 R (3949) 6669 0 R (395) 3794 0 R (3950) 6670 0 R (3951) 6671 0 R (3952) 6672 0 R (3954) 6673 0 R (3955) 6674 0 R (3956) 6675 0 R (3957) 6676 0 R (3959) 6681 0 R (396) 3795 0 R (3960) 6682 0 R (3961) 6683 0 R (3962) 6684 0 R (3964) 6615 0 R (3966) 6685 0 R (3967) 6686 0 R (3969) 6687 0 R (397) 3796 0 R (3970) 6688 0 R (3971) 6689 0 R (3972) 6690 0 R (3974) 6691 0 R (3975) 6692 0 R (3976) 6693 0 R (3977) 6694 0 R (3978) 6695 0 R (398) 3797 0 R (3980) 6696 0 R (3981) 6697 0 R (3982) 6698 0 R (3984) 6699 0 R (3985) 3299 0 R (3989) 6701 0 R (399) 3798 0 R (3990) 6702 0 R (3991) 6703 0 R (3992) 6704 0 R (3994) 6705 0 R (3995) 6706 0 R (3997) 6707 0 R (3998) 6708 0 R (3999) 6709 0 R (4.0) 18 0 R (400) 3799 0 R (4000) 6710 0 R (4001) 6711 0 R (4002) 6712 0 R (4003) 6713 0 R (4004) 6714 0 R (4006) 6715 0 R (4008) 6716 0 R (4009) 6717 0 R (401) 3800 0 R (4010) 6718 0 R (4011) 6719 0 R (4013) 6720 0 R (4014) 6721 0 R (4015) 6722 0 R (4016) 6723 0 R (4018) 6724 0 R (4019) 6725 0 R (402) 3801 0 R (4020) 6726 0 R (4021) 6727 0 R (4022) 6728 0 R (4024) 6729 0 R (4025) 6730 0 R (4026) 6731 0 R (4028) 6732 0 R (4029) 3300 0 R (4033) 6734 0 R (4034) 6735 0 R (4035) 6736 0 R (4036) 6737 0 R (4038) 6742 0 R (4039) 6743 0 R (404) 3802 0 R (4041) 6744 0 R (4042) 6745 0 R (4043) 6746 0 R (4044) 6747 0 R (4045) 6748 0 R (4046) 6749 0 R (4048) 6750 0 R (405) 3803 0 R (4050) 6751 0 R (4051) 6752 0 R (4052) 6753 0 R (4053) 6754 0 R (4055) 6755 0 R (4056) 6756 0 R (4057) 6757 0 R (4058) 6758 0 R (4059) 6759 0 R (406) 3804 0 R (4061) 6760 0 R (4062) 6761 0 R (4064) 6762 0 R (4065) 3301 0 R (4069) 6764 0 R (4070) 6765 0 R (4071) 6766 0 R (4072) 6767 0 R (4074) 6768 0 R (4075) 6769 0 R (4077) 6770 0 R (4078) 6771 0 R (4079) 6772 0 R (408) 3805 0 R (4080) 6773 0 R (4081) 6774 0 R (4082) 6775 0 R (4084) 6776 0 R (4086) 6777 0 R (4087) 6778 0 R (4088) 6779 0 R (4089) 6780 0 R (409) 3806 0 R (4091) 6781 0 R (4092) 6782 0 R (4093) 6783 0 R (4094) 6784 0 R (4095) 6785 0 R (4097) 6786 0 R (4098) 3410 0 R (41) 3497 0 R (410) 3807 0 R (4102) 6788 0 R (4103) 6789 0 R (4104) 6790 0 R (4105) 6791 0 R (4107) 6792 0 R (4108) 6793 0 R (4110) 6794 0 R (4111) 6795 0 R (4112) 6796 0 R (4113) 6797 0 R (4115) 6802 0 R (4117) 6803 0 R (4118) 6804 0 R (4119) 6805 0 R (412) 3808 0 R (4120) 6806 0 R (4121) 3411 0 R (4125) 6808 0 R (4126) 6809 0 R (4127) 6810 0 R (4128) 6811 0 R (413) 3809 0 R (4130) 6812 0 R (4131) 6813 0 R (4133) 6814 0 R (4134) 6815 0 R (4135) 6816 0 R (4136) 6817 0 R (4138) 6818 0 R (414) 3810 0 R (4140) 6819 0 R (4141) 6820 0 R (4142) 6821 0 R (4143) 6822 0 R (4144) 6823 0 R (4146) 6824 0 R (4147) 6825 0 R (4148) 3412 0 R (4152) 6827 0 R (4153) 6828 0 R (4154) 6829 0 R (4155) 6830 0 R (4157) 6831 0 R (4158) 6832 0 R (416) 3811 0 R (4160) 6833 0 R (4161) 6834 0 R (4162) 6835 0 R (4163) 6836 0 R (4164) 6837 0 R (4165) 6838 0 R (4167) 6839 0 R (4169) 6840 0 R (417) 3812 0 R (4170) 6841 0 R (4171) 6842 0 R (4172) 6843 0 R (4174) 6844 0 R (4175) 6845 0 R (4176) 6846 0 R (4177) 6847 0 R (4178) 6848 0 R (418) 3813 0 R (4180) 6849 0 R (4181) 3413 0 R (4183) 3414 0 R (4187) 6856 0 R (4188) 6857 0 R (4189) 6858 0 R (419) 3814 0 R (4190) 6859 0 R (4192) 6860 0 R (4193) 6861 0 R (4195) 6862 0 R (4196) 6863 0 R (4197) 6864 0 R (4198) 6865 0 R (4199) 6866 0 R (42) 3498 0 R (420) 3815 0 R (4200) 6867 0 R (4201) 6868 0 R (4202) 6869 0 R (4204) 6870 0 R (4206) 6871 0 R (4207) 6872 0 R (4208) 6873 0 R (4209) 6874 0 R (421) 3094 0 R (4211) 6875 0 R (4212) 6876 0 R (4213) 6877 0 R (4214) 6878 0 R (4216) 6879 0 R (4217) 6880 0 R (4218) 6881 0 R (4219) 6882 0 R (4220) 6883 0 R (4222) 6884 0 R (4223) 3415 0 R (4227) 6886 0 R (4228) 6887 0 R (4229) 6888 0 R (4230) 6889 0 R (4232) 6890 0 R (4233) 6891 0 R (4235) 6892 0 R (4236) 6893 0 R (4237) 6894 0 R (4238) 6895 0 R (4239) 6896 0 R (4240) 6897 0 R (4241) 6898 0 R (4242) 6899 0 R (4243) 6900 0 R (4244) 6901 0 R (4245) 6902 0 R (4246) 6903 0 R (4247) 6904 0 R (4248) 6905 0 R (425) 3822 0 R (4250) 6906 0 R (4252) 6907 0 R (4253) 6908 0 R (4254) 6909 0 R (4255) 6910 0 R (4257) 6911 0 R (4258) 6912 0 R (4259) 6913 0 R (426) 3823 0 R (4260) 6914 0 R (4262) 6915 0 R (4263) 6916 0 R (4264) 6917 0 R (4265) 6918 0 R (4267) 6919 0 R (4268) 6920 0 R (4269) 6921 0 R (427) 3824 0 R (4270) 6922 0 R (4272) 6923 0 R (4273) 6924 0 R (4274) 6925 0 R (4275) 6926 0 R (4277) 6933 0 R (4278) 6934 0 R (4279) 6935 0 R (428) 3825 0 R (4280) 6936 0 R (4281) 6854 0 R (4283) 6937 0 R (4284) 6938 0 R (4285) 6939 0 R (4287) 6940 0 R (4288) 3416 0 R (4292) 6942 0 R (4293) 6943 0 R (4294) 6944 0 R (4295) 6945 0 R (4297) 6946 0 R (4298) 6947 0 R (430) 3826 0 R (4300) 6948 0 R (4301) 6949 0 R (4302) 6950 0 R (4303) 6951 0 R (4304) 6952 0 R (4305) 6953 0 R (4306) 6954 0 R (4307) 6955 0 R (4309) 6956 0 R (431) 3827 0 R (4311) 6957 0 R (4312) 6958 0 R (4313) 6959 0 R (4314) 6960 0 R (4316) 6961 0 R (4317) 6962 0 R (4318) 6963 0 R (4319) 6964 0 R (4321) 6965 0 R (4322) 6966 0 R (4323) 6967 0 R (4324) 6968 0 R (4325) 6969 0 R (4327) 6970 0 R (4328) 6971 0 R (4329) 6972 0 R (433) 3828 0 R (4331) 6973 0 R (4332) 3417 0 R (4336) 6975 0 R (4337) 6976 0 R (4338) 6977 0 R (4339) 6978 0 R (434) 3829 0 R (4341) 6979 0 R (4342) 6980 0 R (4344) 6981 0 R (4345) 6982 0 R (4346) 6983 0 R (4347) 6984 0 R (4348) 6985 0 R (4349) 6986 0 R (435) 3830 0 R (4351) 6991 0 R (4353) 6992 0 R (4354) 6993 0 R (4355) 6994 0 R (4356) 6995 0 R (4358) 6932 0 R (436) 3831 0 R (4360) 6996 0 R (4361) 6997 0 R (4362) 6998 0 R (4364) 6999 0 R (4365) 7000 0 R (4367) 7001 0 R (4368) 3418 0 R (437) 3832 0 R (4372) 7003 0 R (4373) 7004 0 R (4374) 7005 0 R (4375) 7006 0 R (4377) 7007 0 R (4378) 7008 0 R (438) 3833 0 R (4380) 7009 0 R (4381) 7010 0 R (4382) 7011 0 R (4383) 7012 0 R (4384) 7013 0 R (4385) 7014 0 R (4387) 7015 0 R (4389) 7016 0 R (439) 3834 0 R (4390) 7017 0 R (4391) 7018 0 R (4392) 7019 0 R (4394) 7020 0 R (4395) 7021 0 R (4396) 7022 0 R (4397) 7023 0 R (4398) 7024 0 R (440) 3835 0 R (4400) 7025 0 R (4401) 3419 0 R (4405) 7027 0 R (4406) 7028 0 R (4407) 7029 0 R (4408) 7030 0 R (4410) 7031 0 R (4411) 7032 0 R (4413) 7033 0 R (4414) 7034 0 R (4415) 7035 0 R (4416) 7036 0 R (4418) 7037 0 R (442) 3836 0 R (4420) 7038 0 R (4421) 7039 0 R (4422) 7040 0 R (4423) 7041 0 R (4424) 3420 0 R (4428) 7047 0 R (4429) 7048 0 R (4430) 7049 0 R (4431) 7050 0 R (4433) 7051 0 R (4434) 7052 0 R (4436) 7053 0 R (4437) 7054 0 R (4438) 7055 0 R (4439) 7056 0 R (444) 3837 0 R (4441) 7057 0 R (4443) 7058 0 R (4444) 7059 0 R (4445) 7060 0 R (4446) 7061 0 R (4447) 7062 0 R (4449) 7063 0 R (445) 3838 0 R (4450) 7064 0 R (4451) 3421 0 R (4455) 7066 0 R (4456) 7067 0 R (4457) 7068 0 R (4458) 7069 0 R (446) 3839 0 R (4460) 7070 0 R (4461) 7071 0 R (4463) 7072 0 R (4464) 7073 0 R (4465) 7074 0 R (4466) 7075 0 R (4467) 7076 0 R (4468) 7077 0 R (4469) 7078 0 R (447) 3840 0 R (4470) 7079 0 R (4472) 7080 0 R (4474) 7081 0 R (4475) 7082 0 R (4476) 7083 0 R (4477) 7084 0 R (4479) 7085 0 R (4480) 7086 0 R (4481) 7087 0 R (4482) 7088 0 R (4484) 7089 0 R (4485) 7090 0 R (4486) 7091 0 R (4487) 7092 0 R (4488) 3422 0 R (449) 3841 0 R (4492) 7094 0 R (4493) 7095 0 R (4494) 7096 0 R (4495) 7097 0 R (4497) 7098 0 R (4498) 7099 0 R (450) 3842 0 R (4500) 7100 0 R (4501) 7101 0 R (4502) 7102 0 R (4503) 7103 0 R (4505) 7108 0 R (4507) 7109 0 R (4508) 7110 0 R (4509) 7111 0 R (451) 3843 0 R (4510) 7112 0 R (4511) 3423 0 R (4515) 7114 0 R (4516) 7115 0 R (4517) 7116 0 R (4518) 7117 0 R (452) 3844 0 R (4520) 7118 0 R (4521) 7119 0 R (4523) 7120 0 R (4524) 7121 0 R (4525) 7122 0 R (4526) 7123 0 R (4527) 7124 0 R (4528) 7125 0 R (453) 3845 0 R (4530) 7126 0 R (4532) 7127 0 R (4533) 7128 0 R (4534) 7129 0 R (4535) 7130 0 R (4537) 7131 0 R (4538) 7132 0 R (4539) 7133 0 R (4540) 7134 0 R (4541) 7135 0 R (4543) 7136 0 R (4544) 3424 0 R (4548) 7138 0 R (4549) 7139 0 R (455) 3846 0 R (4550) 7140 0 R (4551) 7141 0 R (4553) 7142 0 R (4554) 7143 0 R (4556) 7144 0 R (4557) 7145 0 R (4558) 7146 0 R (4559) 7147 0 R (456) 3847 0 R (4561) 7148 0 R (4563) 7149 0 R (4564) 7150 0 R (4565) 7151 0 R (4566) 7152 0 R (4567) 3425 0 R (457) 3848 0 R (4571) 7154 0 R (4572) 7155 0 R (4573) 7156 0 R (4574) 7157 0 R (4576) 7163 0 R (4577) 7164 0 R (4579) 7165 0 R (458) 3849 0 R (4580) 7166 0 R (4581) 7167 0 R (4582) 7168 0 R (4584) 7169 0 R (4586) 7170 0 R (4587) 7171 0 R (4588) 7172 0 R (4589) 7173 0 R (459) 3850 0 R (4590) 3426 0 R (4592) 3427 0 R (4596) 7175 0 R (4597) 7176 0 R (4598) 7177 0 R (4599) 7178 0 R (46) 3499 0 R (460) 3851 0 R (4601) 7179 0 R (4602) 7180 0 R (4604) 7181 0 R (4605) 7182 0 R (4606) 7183 0 R (4607) 7184 0 R (4608) 7185 0 R (4609) 7186 0 R (4610) 7187 0 R (4611) 7188 0 R (4613) 7189 0 R (4615) 7190 0 R (4616) 7191 0 R (4617) 7192 0 R (4618) 7193 0 R (462) 3852 0 R (4620) 7194 0 R (4621) 7195 0 R (4622) 7196 0 R (4623) 7197 0 R (4625) 7198 0 R (4626) 7199 0 R (4627) 7200 0 R (4628) 7201 0 R (4629) 7202 0 R (463) 3853 0 R (4631) 7203 0 R (4632) 3428 0 R (4636) 7205 0 R (4637) 7206 0 R (4638) 7207 0 R (4639) 7208 0 R (464) 3854 0 R (4641) 7209 0 R (4642) 7210 0 R (4644) 7211 0 R (4645) 7212 0 R (4646) 7213 0 R (4647) 7214 0 R (4648) 7215 0 R (4649) 7216 0 R (465) 3855 0 R (4650) 7217 0 R (4651) 7218 0 R (4653) 7219 0 R (4655) 7220 0 R (4656) 7221 0 R (4657) 7222 0 R (4658) 7223 0 R (466) 3095 0 R (4660) 7228 0 R (4661) 7229 0 R (4662) 7230 0 R (4663) 7231 0 R (4665) 7162 0 R (4667) 7232 0 R (4668) 7233 0 R (4669) 3429 0 R (4673) 7235 0 R (4674) 7236 0 R (4675) 7237 0 R (4676) 7238 0 R (4678) 7239 0 R (4679) 7240 0 R (4681) 7241 0 R (4682) 7242 0 R (4683) 7243 0 R (4684) 7244 0 R (4686) 7245 0 R (4688) 7246 0 R (4689) 7247 0 R (4690) 7248 0 R (4691) 7249 0 R (4692) 7250 0 R (4694) 7251 0 R (4695) 3430 0 R (4697) 3431 0 R (47) 3500 0 R (470) 3857 0 R (4701) 7253 0 R (4702) 7254 0 R (4703) 7255 0 R (4704) 7256 0 R (4706) 7257 0 R (4707) 7258 0 R (4709) 7259 0 R (471) 3858 0 R (4710) 7260 0 R (4711) 7261 0 R (4712) 7262 0 R (4714) 7263 0 R (4716) 7264 0 R (4717) 7265 0 R (4718) 7266 0 R (4719) 7267 0 R (472) 3859 0 R (4720) 7268 0 R (4722) 7269 0 R (4723) 7270 0 R (4725) 7271 0 R (4726) 3432 0 R (473) 3860 0 R (4730) 7279 0 R (4731) 7280 0 R (4732) 7281 0 R (4733) 7282 0 R (4734) 7283 0 R (4736) 7284 0 R (4737) 7285 0 R (4739) 7286 0 R (4740) 7287 0 R (4741) 7288 0 R (4742) 7289 0 R (4744) 7290 0 R (4746) 7291 0 R (4747) 7292 0 R (4748) 7293 0 R (4749) 7294 0 R (475) 3861 0 R (4750) 3433 0 R (4754) 7296 0 R (4755) 7297 0 R (4756) 7298 0 R (4757) 7299 0 R (4759) 7300 0 R (476) 3862 0 R (4760) 7301 0 R (4762) 7302 0 R (4763) 7303 0 R (4764) 7304 0 R (4765) 7305 0 R (4767) 7306 0 R (4769) 7307 0 R (4770) 7308 0 R (4771) 7309 0 R (4772) 7310 0 R (4773) 7311 0 R (4775) 7312 0 R (4776) 7313 0 R (4777) 3434 0 R (478) 3863 0 R (4781) 7315 0 R (4782) 7316 0 R (4783) 7317 0 R (4784) 7318 0 R (4786) 7319 0 R (4787) 7320 0 R (4789) 7321 0 R (479) 3864 0 R (4790) 7322 0 R (4791) 7323 0 R (4792) 7324 0 R (4793) 7325 0 R (4794) 7326 0 R (4795) 7327 0 R (4796) 7328 0 R (4798) 7329 0 R (48) 3501 0 R (480) 3865 0 R (4800) 7330 0 R (4801) 7331 0 R (4802) 7332 0 R (4803) 7333 0 R (4805) 7334 0 R (4806) 7335 0 R (4807) 7336 0 R (4808) 7337 0 R (481) 3866 0 R (4810) 7342 0 R (4811) 7343 0 R (4812) 7344 0 R (4813) 7345 0 R (4814) 7277 0 R (4816) 7346 0 R (4817) 7347 0 R (4819) 7348 0 R (482) 3867 0 R (4820) 3435 0 R (4824) 7350 0 R (4825) 7351 0 R (4826) 7352 0 R (4827) 7353 0 R (4829) 7354 0 R (483) 3868 0 R (4830) 7355 0 R (4832) 7356 0 R (4833) 7357 0 R (4834) 7358 0 R (4835) 7359 0 R (4836) 7360 0 R (4837) 7361 0 R (4839) 7362 0 R (484) 3869 0 R (4841) 7363 0 R (4842) 7364 0 R (4843) 7365 0 R (4844) 7366 0 R (4846) 7367 0 R (4847) 7368 0 R (4848) 7369 0 R (4849) 7370 0 R (485) 3870 0 R (4850) 3436 0 R (4854) 7372 0 R (4855) 7373 0 R (4856) 7374 0 R (4857) 7375 0 R (4859) 7376 0 R (4860) 7377 0 R (4862) 7378 0 R (4863) 7379 0 R (4864) 7380 0 R (4865) 7381 0 R (4866) 7382 0 R (4867) 7383 0 R (4868) 7384 0 R (4869) 7385 0 R (487) 3871 0 R (4871) 7386 0 R (4873) 7387 0 R (4874) 7388 0 R (4875) 7389 0 R (4876) 7390 0 R (4878) 7391 0 R (4879) 7392 0 R (4880) 7393 0 R (4881) 7394 0 R (4883) 7395 0 R (4884) 7396 0 R (4885) 7397 0 R (4886) 7398 0 R (4887) 7399 0 R (4889) 7400 0 R (489) 3872 0 R (4890) 7401 0 R (4892) 7406 0 R (4893) 3437 0 R (4897) 7408 0 R (4898) 7409 0 R (4899) 7410 0 R (49) 3502 0 R (490) 3873 0 R (4900) 7411 0 R (4902) 7412 0 R (4903) 7413 0 R (4905) 7414 0 R (4906) 7415 0 R (4907) 7416 0 R (4908) 7417 0 R (4909) 7418 0 R (491) 3874 0 R (4910) 7419 0 R (4912) 7420 0 R (4914) 7421 0 R (4915) 7422 0 R (4916) 7423 0 R (4917) 7424 0 R (4919) 7425 0 R (492) 3875 0 R (4920) 7426 0 R (4921) 7427 0 R (4922) 7428 0 R (4923) 3438 0 R (4927) 7430 0 R (4928) 7431 0 R (4929) 7432 0 R (4930) 7433 0 R (4932) 7434 0 R (4933) 7435 0 R (4935) 7436 0 R (4936) 7437 0 R (4937) 7438 0 R (4938) 7439 0 R (4939) 7440 0 R (494) 3876 0 R (4940) 7441 0 R (4942) 7442 0 R (4944) 7443 0 R (4945) 7444 0 R (4946) 7445 0 R (4947) 7446 0 R (4949) 7447 0 R (495) 3877 0 R (4950) 7448 0 R (4951) 7449 0 R (4952) 7450 0 R (4953) 7451 0 R (4954) 7452 0 R (4956) 7453 0 R (4957) 7454 0 R (4958) 3439 0 R (496) 3878 0 R (4962) 7461 0 R (4963) 7462 0 R (4964) 7463 0 R (4965) 7464 0 R (4967) 7465 0 R (4968) 7466 0 R (497) 3879 0 R (4970) 7467 0 R (4971) 7468 0 R (4972) 7469 0 R (4973) 7470 0 R (4975) 7471 0 R (4977) 7472 0 R (4978) 7473 0 R (4979) 7474 0 R (498) 3880 0 R (4980) 7475 0 R (4981) 7476 0 R (4983) 7477 0 R (4984) 3440 0 R (4988) 7479 0 R (4989) 7480 0 R (4990) 7481 0 R (4991) 7482 0 R (4993) 7483 0 R (4994) 7484 0 R (4996) 7485 0 R (4997) 7486 0 R (4998) 7487 0 R (4999) 7488 0 R (5.0) 22 0 R (500) 3881 0 R (5000) 7489 0 R (5001) 7490 0 R (5003) 7491 0 R (5005) 7492 0 R (5006) 7493 0 R (5007) 7494 0 R (5008) 7495 0 R (501) 3882 0 R (5010) 7496 0 R (5011) 7497 0 R (5012) 7498 0 R (5013) 7499 0 R (5014) 7500 0 R (5016) 7501 0 R (5017) 3441 0 R (502) 3883 0 R (5021) 7503 0 R (5022) 7504 0 R (5023) 7505 0 R (5024) 7506 0 R (5026) 7507 0 R (5027) 7508 0 R (5029) 7509 0 R (503) 3884 0 R (5030) 7510 0 R (5031) 7511 0 R (5032) 7512 0 R (5033) 7513 0 R (5034) 7514 0 R (5036) 7520 0 R (5038) 7521 0 R (5039) 7522 0 R (504) 3885 0 R (5040) 7523 0 R (5041) 7524 0 R (5043) 7459 0 R (5045) 7525 0 R (5046) 7526 0 R (5047) 7527 0 R (5049) 7528 0 R (5050) 3442 0 R (5054) 7530 0 R (5055) 7531 0 R (5056) 7532 0 R (5057) 7533 0 R (5059) 7534 0 R (506) 3886 0 R (5060) 7535 0 R (5062) 7536 0 R (5063) 7537 0 R (5064) 7538 0 R (5065) 7539 0 R (5067) 7540 0 R (5069) 7541 0 R (507) 3887 0 R (5070) 7542 0 R (5071) 7543 0 R (5072) 7544 0 R (5073) 7545 0 R (5075) 7546 0 R (5076) 7547 0 R (5077) 7548 0 R (5078) 7549 0 R (5080) 7550 0 R (5081) 3443 0 R (5085) 7552 0 R (5086) 7553 0 R (5087) 7554 0 R (5088) 7555 0 R (5090) 7556 0 R (5091) 7557 0 R (5093) 7558 0 R (5094) 7559 0 R (5095) 7560 0 R (5096) 7561 0 R (5097) 7562 0 R (5098) 7563 0 R (5099) 7564 0 R (510) 3893 0 R (5100) 7565 0 R (5102) 7566 0 R (5104) 7567 0 R (5105) 7568 0 R (5106) 7569 0 R (5107) 7570 0 R (5108) 7571 0 R (5110) 7572 0 R (5111) 7573 0 R (5112) 7574 0 R (5113) 7575 0 R (5115) 7576 0 R (5116) 7577 0 R (5117) 7578 0 R (5118) 7579 0 R (5119) 7580 0 R (5121) 7585 0 R (5122) 7519 0 R (5124) 7586 0 R (5125) 7587 0 R (5126) 7588 0 R (5127) 7589 0 R (5128) 7590 0 R (5129) 7591 0 R (513) 3894 0 R (5130) 7592 0 R (5131) 7593 0 R (5132) 7594 0 R (5133) 7595 0 R (5134) 7596 0 R (5136) 7597 0 R (5137) 3444 0 R (5141) 7599 0 R (5142) 7600 0 R (5143) 7601 0 R (5144) 7602 0 R (5146) 7603 0 R (5147) 7604 0 R (5149) 7605 0 R (5150) 7606 0 R (5151) 7607 0 R (5152) 7608 0 R (5153) 7609 0 R (5154) 7610 0 R (5155) 7611 0 R (5156) 7612 0 R (5157) 7613 0 R (5158) 7614 0 R (516) 3895 0 R (5160) 7615 0 R (5162) 7616 0 R (5163) 7617 0 R (5164) 7618 0 R (5165) 7619 0 R (5167) 7620 0 R (5168) 7621 0 R (5169) 7622 0 R (5170) 7623 0 R (5172) 7624 0 R (5173) 7625 0 R (5174) 7626 0 R (5175) 7627 0 R (5177) 7628 0 R (5178) 7629 0 R (5179) 7630 0 R (518) 3897 0 R (5180) 7631 0 R (5181) 7632 0 R (5183) 7633 0 R (5184) 7634 0 R (5185) 7635 0 R (5186) 7636 0 R (5187) 7637 0 R (5189) 7638 0 R (519) 3898 0 R (5190) 3445 0 R (5194) 7645 0 R (5195) 7646 0 R (5196) 7647 0 R (5197) 7648 0 R (5199) 7649 0 R (520) 3899 0 R (5200) 7650 0 R (5202) 7651 0 R (5203) 7652 0 R (5204) 7653 0 R (5205) 7654 0 R (5206) 7655 0 R (5207) 7656 0 R (5208) 7657 0 R (5209) 7658 0 R (521) 3900 0 R (5211) 7659 0 R (5213) 7660 0 R (5214) 7661 0 R (5215) 7662 0 R (5216) 7663 0 R (5218) 7664 0 R (5219) 7665 0 R (522) 3901 0 R (5220) 7666 0 R (5221) 7667 0 R (5223) 7668 0 R (5224) 7669 0 R (5225) 7670 0 R (5226) 7671 0 R (5227) 7672 0 R (5229) 7673 0 R (523) 3902 0 R (5230) 7674 0 R (5232) 7675 0 R (5233) 3446 0 R (5237) 7677 0 R (5238) 7678 0 R (5239) 7679 0 R (5240) 7680 0 R (5242) 7681 0 R (5243) 7682 0 R (5245) 7683 0 R (5246) 7684 0 R (5247) 7685 0 R (5248) 7686 0 R (5249) 7687 0 R (525) 3904 0 R (5250) 7688 0 R (5252) 7689 0 R (5254) 7690 0 R (5255) 7691 0 R (5256) 7692 0 R (5257) 7693 0 R (5259) 7694 0 R (526) 3905 0 R (5260) 7695 0 R (5261) 7696 0 R (5262) 7697 0 R (5263) 7698 0 R (5265) 7699 0 R (5266) 7700 0 R (5267) 7701 0 R (5268) 7702 0 R (5269) 7703 0 R (5271) 7704 0 R (5272) 3447 0 R (5276) 7710 0 R (5277) 7711 0 R (5278) 7712 0 R (5279) 7713 0 R (5281) 7714 0 R (5282) 7715 0 R (5284) 7716 0 R (5285) 7717 0 R (5286) 7718 0 R (5287) 7719 0 R (5288) 7720 0 R (5289) 7721 0 R (529) 3920 0 R (5290) 7722 0 R (5291) 7723 0 R (5293) 7724 0 R (5295) 7725 0 R (5296) 7726 0 R (5297) 7727 0 R (5298) 7728 0 R (5300) 7729 0 R (5301) 7730 0 R (5302) 7731 0 R (5303) 7732 0 R (5304) 7733 0 R (5305) 7734 0 R (5307) 7735 0 R (5308) 7736 0 R (5309) 7737 0 R (5310) 7738 0 R (5311) 7739 0 R (5313) 7740 0 R (5314) 3448 0 R (5318) 7742 0 R (5319) 7743 0 R (532) 3921 0 R (5320) 7744 0 R (5321) 7745 0 R (5323) 7746 0 R (5324) 7747 0 R (5326) 7748 0 R (5327) 7749 0 R (5328) 7750 0 R (5329) 7751 0 R (533) 3922 0 R (5331) 7752 0 R (5333) 7753 0 R (5334) 7754 0 R (5335) 7755 0 R (5336) 7756 0 R (5337) 7757 0 R (5339) 7758 0 R (534) 3923 0 R (5340) 3449 0 R (5344) 7760 0 R (5345) 7761 0 R (5346) 7762 0 R (5347) 7763 0 R (5349) 7768 0 R (535) 3924 0 R (5350) 7769 0 R (5352) 7770 0 R (5353) 7771 0 R (5354) 7772 0 R (5355) 7773 0 R (5357) 7774 0 R (5359) 7775 0 R (536) 3925 0 R (5360) 7776 0 R (5361) 7777 0 R (5362) 7778 0 R (5363) 3450 0 R (5365) 3451 0 R (5369) 7780 0 R (537) 3926 0 R (5370) 7781 0 R (5371) 7782 0 R (5372) 7783 0 R (5374) 7784 0 R (5375) 7785 0 R (5377) 7786 0 R (5378) 7787 0 R (5379) 7788 0 R (5380) 7789 0 R (5382) 7790 0 R (5384) 7791 0 R (5385) 7792 0 R (5386) 7793 0 R (5387) 7794 0 R (5388) 3452 0 R (5392) 7796 0 R (5393) 7797 0 R (5394) 7798 0 R (5395) 7799 0 R (5397) 7800 0 R (5398) 7801 0 R (5400) 7802 0 R (5401) 7803 0 R (5402) 7804 0 R (5403) 7805 0 R (5405) 7806 0 R (5407) 7807 0 R (5408) 7808 0 R (5409) 7809 0 R (541) 3928 0 R (5410) 7810 0 R (5411) 3453 0 R (5415) 7812 0 R (5416) 7813 0 R (5417) 7814 0 R (5418) 7815 0 R (5420) 7821 0 R (5421) 7822 0 R (5423) 7823 0 R (5424) 7824 0 R (5425) 7825 0 R (5426) 7826 0 R (5428) 7827 0 R (5430) 7828 0 R (5431) 7829 0 R (5432) 7830 0 R (5433) 7831 0 R (5434) 3454 0 R (5438) 7833 0 R (5439) 7834 0 R (544) 3929 0 R (5440) 7835 0 R (5441) 7836 0 R (5443) 7837 0 R (5444) 7838 0 R (5446) 7839 0 R (5447) 7840 0 R (5448) 7841 0 R (5449) 7842 0 R (545) 3930 0 R (5451) 7843 0 R (5453) 7844 0 R (5454) 7845 0 R (5455) 7846 0 R (5456) 7847 0 R (5459) 3456 0 R (546) 3931 0 R (5461) 7848 0 R (5462) 7849 0 R (5463) 7850 0 R (5464) 7851 0 R (5465) 7852 0 R (5466) 7853 0 R (5467) 7854 0 R (5468) 7855 0 R (5469) 7856 0 R (547) 3932 0 R (5470) 7857 0 R (5471) 7858 0 R (5472) 7859 0 R (5473) 7860 0 R (5474) 7861 0 R (5475) 7862 0 R (5476) 7863 0 R (5477) 7864 0 R (5478) 7865 0 R (5479) 7866 0 R (548) 3933 0 R (5480) 7867 0 R (5481) 7872 0 R (5482) 7873 0 R (5483) 7874 0 R (5484) 7820 0 R (5485) 7875 0 R (5486) 3457 0 R (5488) 7876 0 R (5489) 7877 0 R (549) 3934 0 R (5490) 7878 0 R (5491) 7879 0 R (5492) 7880 0 R (5493) 7881 0 R (5494) 7882 0 R (5495) 7883 0 R (5496) 7884 0 R (5497) 7885 0 R (5498) 7886 0 R (5499) 7887 0 R (550) 3935 0 R (5500) 7888 0 R (5501) 7889 0 R (5502) 7890 0 R (5503) 7891 0 R (5504) 7892 0 R (5505) 7893 0 R (5506) 7894 0 R (5507) 7895 0 R (5508) 7896 0 R (5509) 7897 0 R (5510) 7898 0 R (5511) 7899 0 R (5512) 3458 0 R (5514) 7904 0 R (5515) 7905 0 R (5516) 7906 0 R (5518) 7907 0 R (5519) 7908 0 R (5520) 7909 0 R (5522) 7910 0 R (5523) 7911 0 R (5524) 7912 0 R (5525) 7913 0 R (5526) 7914 0 R (5527) 7915 0 R (5528) 7916 0 R (5529) 7917 0 R (5530) 7918 0 R (5532) 7919 0 R (5533) 7920 0 R (5534) 7921 0 R (5535) 7922 0 R (5536) 7923 0 R (5537) 7924 0 R (5538) 7925 0 R (5539) 7926 0 R (554) 3937 0 R (5540) 7927 0 R (5541) 7928 0 R (5542) 7929 0 R (5544) 7930 0 R (5545) 7931 0 R (5546) 7932 0 R (5547) 7933 0 R (5548) 7934 0 R (5549) 7935 0 R (5550) 7936 0 R (5551) 7937 0 R (5552) 7938 0 R (5553) 7939 0 R (5554) 7940 0 R (5555) 7941 0 R (5556) 7942 0 R (5557) 7943 0 R (5558) 7944 0 R (5559) 7945 0 R (5560) 7946 0 R (5561) 7947 0 R (5562) 7948 0 R (5563) 7949 0 R (5564) 7950 0 R (5565) 7951 0 R (5566) 7952 0 R (5567) 7953 0 R (5568) 7954 0 R (5569) 7955 0 R (557) 3957 0 R (5570) 7956 0 R (5571) 7957 0 R (5572) 7958 0 R (5573) 7959 0 R (5574) 7960 0 R (5575) 7961 0 R (5576) 7962 0 R (5577) 7963 0 R (5578) 7964 0 R (5579) 7965 0 R (5580) 7966 0 R (5581) 7967 0 R (5582) 7968 0 R (5583) 7969 0 R (5584) 7970 0 R (5585) 7971 0 R (5586) 7977 0 R (5587) 7978 0 R (5588) 7979 0 R (5589) 7980 0 R (559) 3959 0 R (5590) 7981 0 R (5591) 7982 0 R (5592) 7983 0 R (5593) 7984 0 R (5594) 7985 0 R (5595) 7986 0 R (5596) 7987 0 R (5597) 7988 0 R (5598) 7989 0 R (5599) 7990 0 R (5600) 7991 0 R (5601) 7992 0 R (5602) 7993 0 R (5603) 7994 0 R (5604) 7995 0 R (5605) 7996 0 R (5606) 7997 0 R (5607) 7998 0 R (5608) 7999 0 R (5609) 8000 0 R (5610) 8001 0 R (5611) 8002 0 R (5612) 8003 0 R (5613) 8004 0 R (5614) 8005 0 R (5615) 8006 0 R (5616) 8007 0 R (5617) 8008 0 R (5618) 8009 0 R (5619) 8010 0 R (562) 3960 0 R (5620) 8011 0 R (5621) 8012 0 R (5622) 8013 0 R (5623) 8014 0 R (5624) 8015 0 R (5625) 8016 0 R (5626) 8017 0 R (5627) 8018 0 R (5628) 8019 0 R (5629) 8020 0 R (563) 3961 0 R (5630) 8021 0 R (5631) 8022 0 R (5632) 8023 0 R (5633) 8024 0 R (5634) 8025 0 R (5635) 8026 0 R (5636) 8027 0 R (5637) 8028 0 R (5638) 8029 0 R (5639) 8030 0 R (5640) 8031 0 R (5641) 8032 0 R (5642) 8033 0 R (5643) 8034 0 R (5644) 8035 0 R (5645) 8036 0 R (5646) 8037 0 R (5647) 8038 0 R (5648) 8039 0 R (5649) 8040 0 R (565) 3962 0 R (5650) 8041 0 R (5651) 8042 0 R (5652) 8043 0 R (5653) 8044 0 R (5654) 8045 0 R (5655) 8046 0 R (5656) 8047 0 R (5657) 8048 0 R (5658) 8049 0 R (5659) 8050 0 R (566) 3963 0 R (5660) 8051 0 R (5661) 8052 0 R (5662) 8053 0 R (5663) 8054 0 R (5664) 8055 0 R (5665) 8056 0 R (5666) 8057 0 R (5667) 8058 0 R (5668) 8059 0 R (5669) 8060 0 R (567) 3964 0 R (5670) 8061 0 R (5671) 8062 0 R (5672) 8063 0 R (5673) 8064 0 R (5674) 8065 0 R (5675) 8066 0 R (5676) 8067 0 R (5677) 8068 0 R (5678) 8069 0 R (5679) 8070 0 R (5680) 8071 0 R (5681) 8072 0 R (5682) 8073 0 R (5683) 8074 0 R (5684) 8075 0 R (5685) 8076 0 R (5686) 8077 0 R (5687) 8078 0 R (5688) 8079 0 R (5689) 8080 0 R (569) 3965 0 R (5690) 8081 0 R (5691) 8082 0 R (5692) 8083 0 R (5693) 8084 0 R (5694) 8085 0 R (5695) 8086 0 R (5696) 8087 0 R (5699) 8092 0 R (570) 3966 0 R (5700) 8093 0 R (5701) 8094 0 R (5702) 8095 0 R (5703) 8096 0 R (5704) 8097 0 R (5705) 8098 0 R (5706) 8099 0 R (5707) 8100 0 R (5708) 8101 0 R (571) 3967 0 R (5710) 8102 0 R (5711) 8103 0 R (5712) 8104 0 R (5714) 8105 0 R (5715) 8106 0 R (5716) 8107 0 R (5718) 8108 0 R (5719) 8109 0 R (5720) 8110 0 R (5721) 8111 0 R (5723) 8112 0 R (5724) 8113 0 R (5725) 8114 0 R (5727) 8115 0 R (5728) 8116 0 R (5729) 8117 0 R (573) 3968 0 R (5730) 3460 0 R (5734) 8118 0 R (5735) 8119 0 R (5736) 8120 0 R (5737) 8121 0 R (5738) 8122 0 R (5739) 8123 0 R (574) 3969 0 R (5740) 8124 0 R (5741) 8125 0 R (5742) 8126 0 R (5743) 8127 0 R (5744) 8128 0 R (5745) 8129 0 R (5746) 8130 0 R (5747) 8131 0 R (5748) 8132 0 R (5749) 8133 0 R (575) 3970 0 R (5750) 8134 0 R (5751) 8135 0 R (5752) 8136 0 R (5753) 8137 0 R (5754) 8138 0 R (5755) 8139 0 R (5756) 8140 0 R (5757) 8141 0 R (5758) 8142 0 R (5759) 8143 0 R (5760) 8144 0 R (5761) 8145 0 R (5762) 8146 0 R (5764) 8147 0 R (5765) 8148 0 R (5766) 8149 0 R (5767) 8150 0 R (5769) 8151 0 R (577) 3971 0 R (5771) 8152 0 R (5772) 8153 0 R (5773) 8154 0 R (5774) 8155 0 R (5775) 8156 0 R (5776) 8157 0 R (5777) 8158 0 R (5779) 8159 0 R (578) 3972 0 R (5780) 8160 0 R (5781) 8161 0 R (5782) 8162 0 R (5783) 8163 0 R (5784) 8164 0 R (5786) 8170 0 R (5787) 8171 0 R (5788) 8172 0 R (5789) 8173 0 R (579) 3973 0 R (5790) 8174 0 R (5791) 8175 0 R (5792) 8176 0 R (5794) 8177 0 R (5795) 8178 0 R (5796) 8179 0 R (5797) 8180 0 R (5798) 8181 0 R (5799) 8182 0 R (580) 3956 0 R (5800) 8183 0 R (5801) 8184 0 R (582) 3985 0 R (583) 3986 0 R (584) 3987 0 R (585) 3988 0 R (5859) 8186 0 R (586) 3989 0 R (5860) 8187 0 R (5861) 8188 0 R (5862) 8189 0 R (5863) 8190 0 R (5864) 8191 0 R (5865) 8192 0 R (5867) 8193 0 R (5868) 8194 0 R (5869) 8195 0 R (587) 3990 0 R (5870) 8196 0 R (5871) 8197 0 R (5872) 8198 0 R (5873) 8199 0 R (5875) 8200 0 R (5876) 8201 0 R (5877) 8202 0 R (5878) 8203 0 R (5879) 8204 0 R (588) 3991 0 R (5881) 8205 0 R (5882) 8206 0 R (5883) 8207 0 R (5884) 8208 0 R (5885) 8209 0 R (5886) 3461 0 R (589) 3992 0 R (5890) 8210 0 R (5891) 8211 0 R (5892) 8212 0 R (5893) 8213 0 R (5894) 8214 0 R (5895) 8215 0 R (5896) 8216 0 R (5897) 8217 0 R (5898) 8218 0 R (5899) 8219 0 R (59) 3503 0 R (590) 3993 0 R (5900) 8220 0 R (5901) 8221 0 R (5902) 8222 0 R (5903) 8223 0 R (5904) 8224 0 R (5905) 8225 0 R (5906) 8226 0 R (5907) 8227 0 R (5908) 8228 0 R (5909) 8229 0 R (591) 3994 0 R (5910) 8230 0 R (5911) 8231 0 R (5912) 8232 0 R (5913) 8233 0 R (5914) 8234 0 R (5915) 8235 0 R (5916) 8236 0 R (5917) 8237 0 R (5918) 8238 0 R (5919) 8239 0 R (592) 3995 0 R (5920) 8240 0 R (5921) 8241 0 R (5922) 8242 0 R (5923) 8243 0 R (5925) 8248 0 R (5926) 8249 0 R (5927) 8250 0 R (5928) 8251 0 R (5929) 8252 0 R (593) 3996 0 R (5930) 8169 0 R (5932) 8253 0 R (5934) 8254 0 R (5935) 8255 0 R (5936) 8256 0 R (5937) 8257 0 R (5938) 8258 0 R (5939) 8259 0 R (594) 3997 0 R (5940) 8260 0 R (5942) 8261 0 R (5943) 8262 0 R (5944) 8263 0 R (5945) 8264 0 R (5946) 8265 0 R (5947) 8266 0 R (5949) 8267 0 R (595) 3998 0 R (5950) 8268 0 R (5951) 8269 0 R (5952) 8270 0 R (5953) 8271 0 R (5954) 8272 0 R (5955) 8273 0 R (5956) 8274 0 R (596) 3999 0 R (597) 4000 0 R (598) 4001 0 R (5981) 8276 0 R (5982) 8277 0 R (5983) 8278 0 R (5984) 8279 0 R (5985) 8280 0 R (5986) 8281 0 R (5987) 8282 0 R (5989) 8283 0 R (599) 4002 0 R (5990) 8284 0 R (5991) 8285 0 R (5992) 8286 0 R (5993) 8287 0 R (5994) 8288 0 R (5996) 8289 0 R (5997) 8290 0 R (5998) 8291 0 R (5999) 8292 0 R (6.0) 26 0 R (6.2.1) 30 0 R (60) 3504 0 R (600) 4003 0 R (6000) 8293 0 R (6001) 8294 0 R (6003) 8295 0 R (6004) 8296 0 R (6005) 8297 0 R (6006) 8298 0 R (6007) 8299 0 R (6008) 8300 0 R (601) 4004 0 R (6010) 8301 0 R (6011) 8302 0 R (6012) 8303 0 R (6013) 8304 0 R (6014) 8305 0 R (6015) 8306 0 R (6016) 8307 0 R (6018) 8308 0 R (6019) 8309 0 R (602) 4005 0 R (6020) 8310 0 R (6021) 8311 0 R (6022) 8312 0 R (6024) 8313 0 R (6025) 8314 0 R (6026) 8315 0 R (6027) 8316 0 R (6028) 8317 0 R (603) 4006 0 R (604) 4007 0 R (605) 4008 0 R (606) 4009 0 R (607) 4010 0 R (608) 4011 0 R (609) 4012 0 R (61) 3505 0 R (610) 4013 0 R (611) 4014 0 R (612) 4015 0 R (613) 4016 0 R (614) 4017 0 R (615) 4018 0 R (616) 4019 0 R (617) 4020 0 R (618) 4021 0 R (619) 4022 0 R (62) 3506 0 R (620) 4023 0 R (621) 4024 0 R (622) 4025 0 R (623) 4026 0 R (624) 4027 0 R (625) 4028 0 R (626) 4029 0 R (627) 4030 0 R (628) 4031 0 R (629) 4032 0 R (63) 3507 0 R (630) 4033 0 R (631) 4034 0 R (632) 4035 0 R (637) 3100 0 R (64) 3508 0 R (641) 4042 0 R (642) 4043 0 R (643) 4044 0 R (644) 4045 0 R (646) 4046 0 R (647) 4047 0 R (649) 4048 0 R (65) 3509 0 R (651) 4049 0 R (652) 4050 0 R (653) 4051 0 R (655) 4052 0 R (656) 4053 0 R (657) 4054 0 R (659) 4055 0 R (66) 3510 0 R (660) 4056 0 R (661) 4057 0 R (663) 4058 0 R (664) 4059 0 R (665) 4060 0 R (666) 3101 0 R (67) 3511 0 R (670) 4062 0 R (671) 4063 0 R (672) 4064 0 R (673) 4065 0 R (675) 4066 0 R (676) 4067 0 R (678) 4068 0 R (68) 3514 0 R (680) 4069 0 R (681) 4070 0 R (682) 4071 0 R (684) 4077 0 R (685) 4078 0 R (686) 4079 0 R (688) 4040 0 R (689) 4080 0 R (69) 3515 0 R (690) 4081 0 R (692) 4082 0 R (693) 4083 0 R (694) 4084 0 R (696) 4085 0 R (697) 4086 0 R (698) 4087 0 R (7.0) 34 0 R (7.3.1) 38 0 R (700) 4088 0 R (701) 4089 0 R (702) 4090 0 R (703) 4091 0 R (705) 4092 0 R (706) 4093 0 R (707) 4094 0 R (709) 4095 0 R (71) 3516 0 R (710) 4096 0 R (711) 4097 0 R (713) 4098 0 R (714) 4099 0 R (715) 4100 0 R (717) 4101 0 R (718) 4102 0 R (719) 4103 0 R (72) 3517 0 R (721) 4104 0 R (722) 4105 0 R (723) 4106 0 R (725) 4107 0 R (726) 4108 0 R (727) 4109 0 R (729) 4110 0 R (73) 3518 0 R (730) 4111 0 R (731) 4112 0 R (732) 4113 0 R (733) 4114 0 R (735) 4115 0 R (736) 4116 0 R (737) 4117 0 R (738) 4118 0 R (739) 4119 0 R (74) 3519 0 R (740) 4120 0 R (741) 4121 0 R (742) 4122 0 R (743) 4123 0 R (744) 4124 0 R (745) 4125 0 R (746) 4126 0 R (747) 4127 0 R (748) 4128 0 R (749) 4129 0 R (75) 3520 0 R (750) 4130 0 R (751) 3102 0 R (755) 4132 0 R (756) 4133 0 R (757) 4134 0 R (758) 4135 0 R (76) 3521 0 R (760) 4136 0 R (761) 4141 0 R (763) 4142 0 R (765) 4143 0 R (766) 4144 0 R (767) 4145 0 R (769) 4146 0 R (77) 3522 0 R (770) 4147 0 R (771) 4148 0 R (773) 4149 0 R (774) 4150 0 R (775) 4151 0 R (777) 4152 0 R (778) 4153 0 R (779) 4154 0 R (78) 3523 0 R (781) 4155 0 R (782) 4156 0 R (783) 4157 0 R (784) 4158 0 R (785) 4159 0 R (787) 4160 0 R (788) 4161 0 R (789) 4162 0 R (79) 3524 0 R (791) 4163 0 R (792) 4164 0 R (793) 4165 0 R (795) 4166 0 R (796) 4167 0 R (797) 4168 0 R (799) 4169 0 R (8.0) 42 0 R (8.10.1) 134 0 R (8.10.17.2) 138 0 R (8.10.18.2) 142 0 R (8.10.19.2) 146 0 R (8.11.1) 150 0 R (8.11.20.2) 154 0 R (8.11.21.2) 158 0 R (8.11.22.2) 162 0 R (8.11.23.2) 166 0 R (8.12.1) 170 0 R (8.12.24.2) 174 0 R (8.12.25.2) 178 0 R (8.12.26.2) 182 0 R (8.12.27.2) 186 0 R (8.4.1) 46 0 R (8.5.1) 50 0 R (8.6.1) 54 0 R (8.6.1.2) 58 0 R (8.6.2.2) 62 0 R (8.6.3.2) 66 0 R (8.6.4.2) 70 0 R (8.7.1) 74 0 R (8.7.5.2) 78 0 R (8.7.6.2) 82 0 R (8.7.7.2) 86 0 R (8.7.8.2) 90 0 R (8.8.1) 94 0 R (8.8.10.2) 102 0 R (8.8.11.2) 106 0 R (8.8.12.2) 110 0 R (8.8.9.2) 98 0 R (8.9.1) 114 0 R (8.9.13.2) 118 0 R (8.9.14.2) 122 0 R (8.9.15.2) 126 0 R (8.9.16.2) 130 0 R (80) 3525 0 R (800) 4170 0 R (801) 4171 0 R (803) 4172 0 R (804) 4173 0 R (805) 4174 0 R (807) 4175 0 R (808) 4176 0 R (809) 4177 0 R (81) 3526 0 R (810) 4178 0 R (811) 4179 0 R (812) 4180 0 R (813) 4181 0 R (814) 4182 0 R (816) 4183 0 R (817) 4184 0 R (818) 4185 0 R (819) 4186 0 R (82) 3527 0 R (820) 4187 0 R (821) 4188 0 R (822) 4189 0 R (823) 4190 0 R (824) 4191 0 R (826) 4192 0 R (827) 4193 0 R (828) 4194 0 R (829) 4195 0 R (83) 3528 0 R (830) 4196 0 R (831) 4197 0 R (832) 4198 0 R (833) 4199 0 R (834) 4200 0 R (835) 4201 0 R (837) 4206 0 R (838) 4207 0 R (839) 4208 0 R (84) 3529 0 R (840) 4209 0 R (841) 4210 0 R (842) 4211 0 R (843) 4212 0 R (844) 4213 0 R (845) 4214 0 R (847) 4215 0 R (848) 4216 0 R (849) 4217 0 R (85) 3530 0 R (850) 4218 0 R (851) 4219 0 R (852) 4220 0 R (853) 4221 0 R (854) 4222 0 R (856) 4223 0 R (857) 4224 0 R (858) 4225 0 R (860) 4226 0 R (861) 4227 0 R (862) 4228 0 R (863) 4229 0 R (865) 4230 0 R (866) 4231 0 R (867) 4232 0 R (869) 4233 0 R (87) 3531 0 R (870) 4234 0 R (871) 4235 0 R (873) 4236 0 R (874) 4237 0 R (875) 4238 0 R (877) 4239 0 R (878) 4240 0 R (879) 4241 0 R (88) 3532 0 R (881) 4242 0 R (882) 4243 0 R (883) 4244 0 R (884) 4245 0 R (885) 4246 0 R (886) 4247 0 R (887) 4248 0 R (888) 4249 0 R (889) 4250 0 R (89) 3533 0 R (891) 4251 0 R (892) 4252 0 R (893) 4253 0 R (894) 4254 0 R (895) 4255 0 R (896) 4256 0 R (897) 3103 0 R (9.0) 190 0 R (90) 3534 0 R (901) 4258 0 R (902) 4259 0 R (903) 4260 0 R (904) 4261 0 R (906) 4262 0 R (907) 4267 0 R (909) 4268 0 R (91) 3535 0 R (911) 4269 0 R (912) 4270 0 R (913) 4271 0 R (915) 4272 0 R (916) 4273 0 R (917) 4274 0 R (919) 4275 0 R (92) 3536 0 R (920) 4276 0 R (921) 4277 0 R (923) 4278 0 R (924) 4279 0 R (925) 4280 0 R (926) 4281 0 R (927) 4282 0 R (929) 4283 0 R (93) 3537 0 R (930) 4284 0 R (931) 4285 0 R (933) 4286 0 R (934) 4287 0 R (935) 4288 0 R (937) 4289 0 R (938) 4290 0 R (939) 4291 0 R (94) 3538 0 R (941) 4292 0 R (942) 4293 0 R (943) 4294 0 R (944) 4295 0 R (945) 4296 0 R (946) 4297 0 R (948) 4298 0 R (949) 4299 0 R (95) 3542 0 R (950) 4300 0 R (952) 4301 0 R (953) 4302 0 R (954) 4303 0 R (956) 4304 0 R (957) 4305 0 R (958) 4306 0 R (959) 4307 0 R (961) 4308 0 R (962) 4309 0 R (963) 4310 0 R (965) 4311 0 R (966) 4312 0 R (967) 4313 0 R (969) 4314 0 R (97) 3543 0 R (970) 4315 0 R (971) 4316 0 R (973) 4317 0 R (974) 4318 0 R (975) 4319 0 R (976) 3104 0 R (98) 3544 0 R (980) 4321 0 R (981) 4322 0 R (982) 4323 0 R (983) 4324 0 R (985) 4329 0 R (986) 4330 0 R (988) 4331 0 R (99) 3545 0 R (990) 4332 0 R (991) 4333 0 R (992) 4334 0 R (994) 4335 0 R (995) 4336 0 R (996) 4337 0 R (998) 4338 0 R (999) 4339 0 R (API-can-base-addr-fixup) 7429 0 R (API-can-check-dev-taken) 7460 0 R (API-can-checked-free) 7278 0 R (API-can-checked-malloc) 7252 0 R (API-can-chip-free-irq) 7759 0 R (API-can-chip-setup-irq) 7741 0 R (API-can-default-irq-dispatch) 7709 0 R (API-can-del-mem-list) 7295 0 R (API-can-release-io-region) 7349 0 R (API-can-release-mem-region) 7407 0 R (API-can-request-io-region) 7314 0 R (API-can-request-mem-region) 7371 0 R (API-canchip-done) 7795 0 R (API-candevice-done) 7811 0 R (API-canhardware-done) 7832 0 R (API-canque-abort-inslot) 6154 0 R (API-canque-activate-edge) 5890 0 R (API-canque-again-outslot) 6286 0 R (API-canque-edge-decref) 5961 0 R (API-canque-edge-incref) 5941 0 R (API-canque-fifo-abort-inslot) 5579 0 R (API-canque-fifo-again-outslot) 5667 0 R (API-canque-fifo-done-kern) 6787 0 R (API-canque-fifo-done-rtl) 7026 0 R (API-canque-fifo-flush-slots) 5980 0 R (API-canque-fifo-free-outslot) 5636 0 R (API-canque-fifo-get-inslot) 5524 0 R (API-canque-fifo-init-kern) 6763 0 R (API-canque-fifo-init-rtl) 7002 0 R (API-canque-fifo-init-slots) 6004 0 R (API-canque-fifo-put-inslot) 5554 0 R (API-canque-fifo-test-outslot) 5609 0 R (API-canque-filter-msg2edges) 6188 0 R (API-canque-filtid2internal) 5914 0 R (API-canque-flush) 6359 0 R (API-canque-free-outslot) 6249 0 R (API-canque-get-inslot) 6022 0 R (API-canque-get-inslot4id) 6066 0 R (API-canque-get-inslot4id-wait-kern) 6647 0 R (API-canque-get-inslot4id-wait-rtl) 6885 0 R (API-canque-get-outslot-wait-kern) 6700 0 R (API-canque-get-outslot-wait-rtl) 6941 0 R (API-canque-new-edge-kern) 6807 0 R (API-canque-new-edge-rtl) 7046 0 R (API-canque-notify-bothends) 5864 0 R (API-canque-notify-inends) 5820 0 R (API-canque-notify-outends) 5842 0 R (API-canque-put-inslot) 6116 0 R (API-canque-set-filt) 6323 0 R (API-canque-sync-wait-kern) 6733 0 R (API-canque-sync-wait-rtl) 6974 0 R (API-canque-test-outslot) 6217 0 R (API-canqueue-block-inlist) 6454 0 R (API-canqueue-block-outlist) 6470 0 R (API-canqueue-connect-edge) 6402 0 R (API-canqueue-disconnect-edge) 6432 0 R (API-canqueue-ends-dispose-kern) 6826 0 R (API-canqueue-ends-dispose-rtl) 7113 0 R (API-canqueue-ends-done-chip) 7234 0 R (API-canqueue-ends-filt-conjuction) 6530 0 R (API-canqueue-ends-flush-inlist) 6560 0 R (API-canqueue-ends-flush-outlist) 6578 0 R (API-canqueue-ends-init-chip) 7204 0 R (API-canqueue-ends-init-gen) 6384 0 R (API-canqueue-ends-init-kern) 6631 0 R (API-canqueue-ends-init-rtl) 7093 0 R (API-canqueue-ends-kill-inlist) 6486 0 R (API-canqueue-ends-kill-outlist) 6512 0 R (API-canqueue-notify-chip) 7174 0 R (API-canqueue-notify-kern) 6596 0 R (API-canqueue-notify-rtl) 7065 0 R (API-canqueue-rtl-done) 7153 0 R (API-canqueue-rtl-initialize) 7137 0 R (API-canqueue-rtl2lin-check-and-pend) 6855 0 R (API-init-chip-struct) 7598 0 R (API-init-device-struct) 7551 0 R (API-init-hw-struct) 7529 0 R (API-init-hwspecops) 7676 0 R (API-init-obj-struct) 7644 0 R (API-msgobj-done) 7779 0 R (API-register-chip-struct) 7502 0 R (API-register-obj-struct) 7478 0 R (API-sja1000p-attach-to-chip) 5187 0 R (API-sja1000p-baud-rate) 4902 0 R (API-sja1000p-check-tx-stat) 5086 0 R (API-sja1000p-chip-config) 4842 0 R (API-sja1000p-clear-objects) 5294 0 R (API-sja1000p-config-irqs) 5318 0 R (API-sja1000p-disable-configuration) 4821 0 R (API-sja1000p-enable-configuration) 4805 0 R (API-sja1000p-extended-mask) 4866 0 R (API-sja1000p-fill-chipspecops) 5434 0 R (API-sja1000p-irq-handler) 5375 0 R (API-sja1000p-irq-write-handler) 5344 0 R (API-sja1000p-pre-read-config) 4986 0 R (API-sja1000p-pre-write-config) 5012 0 R (API-sja1000p-read) 4959 0 R (API-sja1000p-release-chip) 5211 0 R (API-sja1000p-remote-request) 5232 0 R (API-sja1000p-send-msg) 5051 0 R (API-sja1000p-set-btregs) 5111 0 R (API-sja1000p-standard-mask) 5262 0 R (API-sja1000p-start-chip) 5143 0 R (API-sja1000p-stop-chip) 5167 0 R (API-sja1000p-wakeup-tx) 5401 0 R (API-struct-canchip-t) 4131 0 R (API-struct-candevice-t) 4061 0 R (API-struct-canfilt-t) 3777 0 R (API-struct-canhardware-t) 4041 0 R (API-struct-canque-edge-t) 5692 0 R (API-struct-canque-ends-t) 5761 0 R (API-struct-canque-fifo-t) 5478 0 R (API-struct-canque-slot-t) 5455 0 R (API-struct-canuser-t) 4320 0 R (API-struct-chipspecops-t) 4408 0 R (API-struct-hwspecops-t) 4354 0 R (API-struct-msgobj-t) 4257 0 R (API-template-init-chip-data) 4606 0 R (API-template-init-hw-data) 4574 0 R (API-template-init-obj-data) 4685 0 R (API-template-program-irq) 4716 0 R (API-template-read-register) 4774 0 R (API-template-release-io) 4524 0 R (API-template-request-io) 4497 0 R (API-template-reset) 4550 0 R (API-template-write-register) 4745 0 R (Doc-Start) 2954 0 R (LinCAN-close) 3688 0 R (LinCAN-ioctl-que-filter) 3821 0 R (LinCAN-ioctl-que-flush) 3856 0 R (LinCAN-open) 3654 0 R (LinCAN-read) 3709 0 R (LinCAN-write) 3741 0 R (cap:lincan_arch1) 3474 0 R (cap:lincan_canends1) 3476 0 R (cap:lincan_canhardware1) 3477 0 R (cap:lincan_canqueue1) 3475 0 R (lincan-api) 3086 0 R (lincan-api-board) 3107 0 R (lincan-api-chip) 3117 0 R (lincan-api-dev-and-msg) 3087 0 R (lincan-api-fops) 3088 0 R (lincan-api-main) 3099 0 R (lincan-api-queues) 3255 0 R (lincan-internals) 3098 0 R (lincan-usage) 3455 0 R (lincan-utils) 3459 0 R (lincan_arch) 3096 0 R (lincan_history) 3097 0 R (lincan_intro) 3085 0 R (page.1) 2953 0 R (page.10) 3955 0 R (page.11) 3984 0 R (page.12) 4039 0 R (page.13) 4076 0 R (page.14) 4140 0 R (page.15) 4205 0 R (page.16) 4266 0 R (page.17) 4328 0 R (page.18) 4374 0 R (page.19) 4426 0 R (page.2) 2963 0 R (page.20) 4495 0 R (page.21) 4547 0 R (page.22) 4594 0 R (page.23) 4681 0 R (page.24) 4730 0 R (page.25) 4783 0 R (page.26) 4835 0 R (page.27) 4898 0 R (page.28) 4975 0 R (page.29) 5039 0 R (page.3) 2970 0 R (page.30) 5094 0 R (page.31) 5158 0 R (page.32) 5209 0 R (page.33) 5261 0 R (page.34) 5317 0 R (page.35) 5374 0 R (page.36) 5431 0 R (page.37) 5473 0 R (page.38) 5523 0 R (page.39) 5587 0 R (page.4) 3136 0 R (page.40) 5657 0 R (page.41) 5702 0 R (page.42) 5769 0 R (page.43) 5819 0 R (page.44) 5889 0 R (page.45) 5949 0 R (page.46) 6003 0 R (page.47) 6064 0 R (page.48) 6143 0 R (page.49) 6205 0 R (page.5) 3305 0 R (page.50) 6257 0 R (page.51) 6322 0 R (page.52) 6382 0 R (page.53) 6446 0 R (page.54) 6502 0 R (page.55) 6558 0 R (page.56) 6614 0 R (page.57) 6680 0 R (page.58) 6741 0 R (page.59) 6801 0 R (page.6) 3465 0 R (page.60) 6853 0 R (page.61) 6931 0 R (page.62) 6990 0 R (page.63) 7045 0 R (page.64) 7107 0 R (page.65) 7161 0 R (page.66) 7227 0 R (page.67) 7276 0 R (page.68) 7341 0 R (page.69) 7405 0 R (page.7) 3820 0 R (page.70) 7458 0 R (page.71) 7518 0 R (page.72) 7584 0 R (page.73) 7643 0 R (page.74) 7708 0 R (page.75) 7767 0 R (page.76) 7819 0 R (page.77) 7871 0 R (page.78) 7903 0 R (page.79) 7976 0 R (page.8) 3892 0 R (page.80) 8091 0 R (page.81) 8168 0 R (page.82) 8247 0 R (page.9) 3919 0 R (table.1) 8185 0 R (table.2) 8275 0 R]
+/Limits [(0) (table.2)]
+>> endobj
+8328 0 obj <<
+/Kids [8327 0 R]
+>> endobj
+8329 0 obj <<
+/Dests 8328 0 R
+>> endobj
+8330 0 obj <<
+/Type /Catalog
+/Pages 8325 0 R
+/Outlines 8326 0 R
+/Names 8329 0 R
+/PageMode /UseOutlines /URI<</Base()>>  /ViewerPreferences<<>> 
+/OpenAction 2949 0 R
+/PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b)
+>> endobj
+8331 0 obj <<
+/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.10b)/Keywords()
+/CreationDate (D:20050713161900)
+>> endobj
+xref
+0 8332
+0000003512 65535 f 
+0000000009 00000 n 
+0000059633 00000 n 
+0000928578 00000 n 
+0000000050 00000 n 
+0000000068 00000 n 
+0000059693 00000 n 
+0000928493 00000 n 
+0000000107 00000 n 
+0000000160 00000 n 
+0000120952 00000 n 
+0000928406 00000 n 
+0000000199 00000 n 
+0000000235 00000 n 
+0000241512 00000 n 
+0000928317 00000 n 
+0000000275 00000 n 
+0000000309 00000 n 
+0000242669 00000 n 
+0000928228 00000 n 
+0000000349 00000 n 
+0000000375 00000 n 
+0000245205 00000 n 
+0000928139 00000 n 
+0000000415 00000 n 
+0000000480 00000 n 
+0000245393 00000 n 
+0000928013 00000 n 
+0000000520 00000 n 
+0000000558 00000 n 
+0000245518 00000 n 
+0000927952 00000 n 
+0000000600 00000 n 
+0000000633 00000 n 
+0000254509 00000 n 
+0000927826 00000 n 
+0000000673 00000 n 
+0000000722 00000 n 
+0000254634 00000 n 
+0000927765 00000 n 
+0000000764 00000 n 
+0000000802 00000 n 
+0000258773 00000 n 
+0000927637 00000 n 
+0000000842 00000 n 
+0000000896 00000 n 
+0000258898 00000 n 
+0000927563 00000 n 
+0000000938 00000 n 
+0000000998 00000 n 
+0000264546 00000 n 
+0000927476 00000 n 
+0000001040 00000 n 
+0000001092 00000 n 
+0000264734 00000 n 
+0000927352 00000 n 
+0000001134 00000 n 
+0000001157 00000 n 
+0000264921 00000 n 
+0000927278 00000 n 
+0000001201 00000 n 
+0000001224 00000 n 
+0000265110 00000 n 
+0000927191 00000 n 
+0000001268 00000 n 
+0000001295 00000 n 
+0000265679 00000 n 
+0000927104 00000 n 
+0000001339 00000 n 
+0000001367 00000 n 
+0000266753 00000 n 
+0000927030 00000 n 
+0000001411 00000 n 
+0000001441 00000 n 
+0000267004 00000 n 
+0000926906 00000 n 
+0000001483 00000 n 
+0000001507 00000 n 
+0000267191 00000 n 
+0000926832 00000 n 
+0000001551 00000 n 
+0000001574 00000 n 
+0000268802 00000 n 
+0000926745 00000 n 
+0000001618 00000 n 
+0000001645 00000 n 
+0000269242 00000 n 
+0000926658 00000 n 
+0000001689 00000 n 
+0000001717 00000 n 
+0000269683 00000 n 
+0000926584 00000 n 
+0000001761 00000 n 
+0000001791 00000 n 
+0000269934 00000 n 
+0000926458 00000 n 
+0000001833 00000 n 
+0000001856 00000 n 
+0000270122 00000 n 
+0000926382 00000 n 
+0000001900 00000 n 
+0000001924 00000 n 
+0000270309 00000 n 
+0000926291 00000 n 
+0000001970 00000 n 
+0000001998 00000 n 
+0000271008 00000 n 
+0000926199 00000 n 
+0000002044 00000 n 
+0000002073 00000 n 
+0000272016 00000 n 
+0000926121 00000 n 
+0000002119 00000 n 
+0000002150 00000 n 
+0000272332 00000 n 
+0000925991 00000 n 
+0000002193 00000 n 
+0000002218 00000 n 
+0000272521 00000 n 
+0000925912 00000 n 
+0000002264 00000 n 
+0000002288 00000 n 
+0000272709 00000 n 
+0000925819 00000 n 
+0000002334 00000 n 
+0000002362 00000 n 
+0000273408 00000 n 
+0000925726 00000 n 
+0000002408 00000 n 
+0000002437 00000 n 
+0000276406 00000 n 
+0000925647 00000 n 
+0000002483 00000 n 
+0000002514 00000 n 
+0000276722 00000 n 
+0000925516 00000 n 
+0000002558 00000 n 
+0000002593 00000 n 
+0000276911 00000 n 
+0000925437 00000 n 
+0000002640 00000 n 
+0000002664 00000 n 
+0000277100 00000 n 
+0000925344 00000 n 
+0000002711 00000 n 
+0000002739 00000 n 
+0000277289 00000 n 
+0000925265 00000 n 
+0000002786 00000 n 
+0000002813 00000 n 
+0000281252 00000 n 
+0000925134 00000 n 
+0000002857 00000 n 
+0000002895 00000 n 
+0000281441 00000 n 
+0000925055 00000 n 
+0000002942 00000 n 
+0000002966 00000 n 
+0000281630 00000 n 
+0000924962 00000 n 
+0000003013 00000 n 
+0000003041 00000 n 
+0000282328 00000 n 
+0000924869 00000 n 
+0000003088 00000 n 
+0000003117 00000 n 
+0000283404 00000 n 
+0000924790 00000 n 
+0000003164 00000 n 
+0000003195 00000 n 
+0000283846 00000 n 
+0000924673 00000 n 
+0000003239 00000 n 
+0000003276 00000 n 
+0000284035 00000 n 
+0000924594 00000 n 
+0000003323 00000 n 
+0000003347 00000 n 
+0000284225 00000 n 
+0000924501 00000 n 
+0000003394 00000 n 
+0000003422 00000 n 
+0000284924 00000 n 
+0000924408 00000 n 
+0000003469 00000 n 
+0000003498 00000 n 
+0000285936 00000 n 
+0000924329 00000 n 
+0000003545 00000 n 
+0000003576 00000 n 
+0000303638 00000 n 
+0000924236 00000 n 
+0000003617 00000 n 
+0000003668 00000 n 
+0000357074 00000 n 
+0000924142 00000 n 
+0000003710 00000 n 
+0000003775 00000 n 
+0000366223 00000 n 
+0000924005 00000 n 
+0000003817 00000 n 
+0000003865 00000 n 
+0000366348 00000 n 
+0000923926 00000 n 
+0000003910 00000 n 
+0000003965 00000 n 
+0000366537 00000 n 
+0000923794 00000 n 
+0000004010 00000 n 
+0000004049 00000 n 
+0000366726 00000 n 
+0000923715 00000 n 
+0000004097 00000 n 
+0000004121 00000 n 
+0000366916 00000 n 
+0000923622 00000 n 
+0000004169 00000 n 
+0000004197 00000 n 
+0000367105 00000 n 
+0000923543 00000 n 
+0000004245 00000 n 
+0000004272 00000 n 
+0000368116 00000 n 
+0000923411 00000 n 
+0000004317 00000 n 
+0000004354 00000 n 
+0000368302 00000 n 
+0000923332 00000 n 
+0000004402 00000 n 
+0000004426 00000 n 
+0000368492 00000 n 
+0000923239 00000 n 
+0000004474 00000 n 
+0000004502 00000 n 
+0000368681 00000 n 
+0000923146 00000 n 
+0000004550 00000 n 
+0000004577 00000 n 
+0000373746 00000 n 
+0000923067 00000 n 
+0000004625 00000 n 
+0000004656 00000 n 
+0000374954 00000 n 
+0000922935 00000 n 
+0000004701 00000 n 
+0000004736 00000 n 
+0000375143 00000 n 
+0000922856 00000 n 
+0000004784 00000 n 
+0000004808 00000 n 
+0000375331 00000 n 
+0000922763 00000 n 
+0000004856 00000 n 
+0000004884 00000 n 
+0000377796 00000 n 
+0000922670 00000 n 
+0000004932 00000 n 
+0000004959 00000 n 
+0000386933 00000 n 
+0000922591 00000 n 
+0000005007 00000 n 
+0000005038 00000 n 
+0000387504 00000 n 
+0000922459 00000 n 
+0000005083 00000 n 
+0000005117 00000 n 
+0000387693 00000 n 
+0000922380 00000 n 
+0000005165 00000 n 
+0000005189 00000 n 
+0000387882 00000 n 
+0000922287 00000 n 
+0000005237 00000 n 
+0000005265 00000 n 
+0000390184 00000 n 
+0000922208 00000 n 
+0000005313 00000 n 
+0000005340 00000 n 
+0000393666 00000 n 
+0000922076 00000 n 
+0000005385 00000 n 
+0000005420 00000 n 
+0000393855 00000 n 
+0000921997 00000 n 
+0000005468 00000 n 
+0000005492 00000 n 
+0000395869 00000 n 
+0000921904 00000 n 
+0000005540 00000 n 
+0000005568 00000 n 
+0000396058 00000 n 
+0000921825 00000 n 
+0000005616 00000 n 
+0000005643 00000 n 
+0000397702 00000 n 
+0000921693 00000 n 
+0000005688 00000 n 
+0000005725 00000 n 
+0000397891 00000 n 
+0000921614 00000 n 
+0000005773 00000 n 
+0000005797 00000 n 
+0000398081 00000 n 
+0000921521 00000 n 
+0000005845 00000 n 
+0000005873 00000 n 
+0000398270 00000 n 
+0000921442 00000 n 
+0000005921 00000 n 
+0000005948 00000 n 
+0000403327 00000 n 
+0000921310 00000 n 
+0000005993 00000 n 
+0000006032 00000 n 
+0000403516 00000 n 
+0000921231 00000 n 
+0000006080 00000 n 
+0000006104 00000 n 
+0000403705 00000 n 
+0000921138 00000 n 
+0000006152 00000 n 
+0000006180 00000 n 
+0000403894 00000 n 
+0000921059 00000 n 
+0000006228 00000 n 
+0000006255 00000 n 
+0000410418 00000 n 
+0000920966 00000 n 
+0000006300 00000 n 
+0000006350 00000 n 
+0000412686 00000 n 
+0000920834 00000 n 
+0000006395 00000 n 
+0000006432 00000 n 
+0000412875 00000 n 
+0000920755 00000 n 
+0000006480 00000 n 
+0000006504 00000 n 
+0000413064 00000 n 
+0000920662 00000 n 
+0000006552 00000 n 
+0000006580 00000 n 
+0000413507 00000 n 
+0000920569 00000 n 
+0000006628 00000 n 
+0000006657 00000 n 
+0000414076 00000 n 
+0000920476 00000 n 
+0000006705 00000 n 
+0000006736 00000 n 
+0000414393 00000 n 
+0000920383 00000 n 
+0000006784 00000 n 
+0000006816 00000 n 
+0000414645 00000 n 
+0000920304 00000 n 
+0000006864 00000 n 
+0000006888 00000 n 
+0000414897 00000 n 
+0000920172 00000 n 
+0000006933 00000 n 
+0000006970 00000 n 
+0000415085 00000 n 
+0000920093 00000 n 
+0000007018 00000 n 
+0000007042 00000 n 
+0000415275 00000 n 
+0000920000 00000 n 
+0000007090 00000 n 
+0000007118 00000 n 
+0000415718 00000 n 
+0000919907 00000 n 
+0000007166 00000 n 
+0000007195 00000 n 
+0000416160 00000 n 
+0000919814 00000 n 
+0000007243 00000 n 
+0000007274 00000 n 
+0000417822 00000 n 
+0000919721 00000 n 
+0000007322 00000 n 
+0000007354 00000 n 
+0000417948 00000 n 
+0000919642 00000 n 
+0000007402 00000 n 
+0000007426 00000 n 
+0000418200 00000 n 
+0000919510 00000 n 
+0000007471 00000 n 
+0000007504 00000 n 
+0000418387 00000 n 
+0000919431 00000 n 
+0000007552 00000 n 
+0000007576 00000 n 
+0000418577 00000 n 
+0000919338 00000 n 
+0000007624 00000 n 
+0000007652 00000 n 
+0000419020 00000 n 
+0000919245 00000 n 
+0000007700 00000 n 
+0000007729 00000 n 
+0000419462 00000 n 
+0000919152 00000 n 
+0000007777 00000 n 
+0000007808 00000 n 
+0000419715 00000 n 
+0000919059 00000 n 
+0000007856 00000 n 
+0000007888 00000 n 
+0000419968 00000 n 
+0000918980 00000 n 
+0000007936 00000 n 
+0000007960 00000 n 
+0000420220 00000 n 
+0000918848 00000 n 
+0000008005 00000 n 
+0000008043 00000 n 
+0000420407 00000 n 
+0000918769 00000 n 
+0000008091 00000 n 
+0000008115 00000 n 
+0000420597 00000 n 
+0000918676 00000 n 
+0000008163 00000 n 
+0000008191 00000 n 
+0000421040 00000 n 
+0000918583 00000 n 
+0000008239 00000 n 
+0000008268 00000 n 
+0000424448 00000 n 
+0000918490 00000 n 
+0000008316 00000 n 
+0000008347 00000 n 
+0000424956 00000 n 
+0000918397 00000 n 
+0000008395 00000 n 
+0000008427 00000 n 
+0000425145 00000 n 
+0000918318 00000 n 
+0000008475 00000 n 
+0000008499 00000 n 
+0000425397 00000 n 
+0000918186 00000 n 
+0000008544 00000 n 
+0000008584 00000 n 
+0000425586 00000 n 
+0000918107 00000 n 
+0000008632 00000 n 
+0000008656 00000 n 
+0000425776 00000 n 
+0000918014 00000 n 
+0000008704 00000 n 
+0000008732 00000 n 
+0000426345 00000 n 
+0000917921 00000 n 
+0000008780 00000 n 
+0000008809 00000 n 
+0000427037 00000 n 
+0000917828 00000 n 
+0000008857 00000 n 
+0000008888 00000 n 
+0000431970 00000 n 
+0000917735 00000 n 
+0000008936 00000 n 
+0000008968 00000 n 
+0000432096 00000 n 
+0000917656 00000 n 
+0000009016 00000 n 
+0000009040 00000 n 
+0000432348 00000 n 
+0000917524 00000 n 
+0000009085 00000 n 
+0000009124 00000 n 
+0000432535 00000 n 
+0000917445 00000 n 
+0000009172 00000 n 
+0000009196 00000 n 
+0000432725 00000 n 
+0000917352 00000 n 
+0000009244 00000 n 
+0000009272 00000 n 
+0000433296 00000 n 
+0000917259 00000 n 
+0000009320 00000 n 
+0000009349 00000 n 
+0000433991 00000 n 
+0000917166 00000 n 
+0000009397 00000 n 
+0000009428 00000 n 
+0000434372 00000 n 
+0000917073 00000 n 
+0000009476 00000 n 
+0000009508 00000 n 
+0000434561 00000 n 
+0000916994 00000 n 
+0000009556 00000 n 
+0000009580 00000 n 
+0000434812 00000 n 
+0000916862 00000 n 
+0000009625 00000 n 
+0000009663 00000 n 
+0000435000 00000 n 
+0000916783 00000 n 
+0000009711 00000 n 
+0000009735 00000 n 
+0000435190 00000 n 
+0000916690 00000 n 
+0000009783 00000 n 
+0000009811 00000 n 
+0000437391 00000 n 
+0000916597 00000 n 
+0000009859 00000 n 
+0000009888 00000 n 
+0000437766 00000 n 
+0000916504 00000 n 
+0000009936 00000 n 
+0000009967 00000 n 
+0000438144 00000 n 
+0000916411 00000 n 
+0000010015 00000 n 
+0000010047 00000 n 
+0000438397 00000 n 
+0000916332 00000 n 
+0000010095 00000 n 
+0000010119 00000 n 
+0000438649 00000 n 
+0000916200 00000 n 
+0000010164 00000 n 
+0000010205 00000 n 
+0000438836 00000 n 
+0000916121 00000 n 
+0000010253 00000 n 
+0000010277 00000 n 
+0000439026 00000 n 
+0000916028 00000 n 
+0000010325 00000 n 
+0000010353 00000 n 
+0000439598 00000 n 
+0000915935 00000 n 
+0000010401 00000 n 
+0000010430 00000 n 
+0000440293 00000 n 
+0000915842 00000 n 
+0000010478 00000 n 
+0000010509 00000 n 
+0000440546 00000 n 
+0000915749 00000 n 
+0000010557 00000 n 
+0000010589 00000 n 
+0000440735 00000 n 
+0000915670 00000 n 
+0000010637 00000 n 
+0000010661 00000 n 
+0000440987 00000 n 
+0000915538 00000 n 
+0000010706 00000 n 
+0000010746 00000 n 
+0000441174 00000 n 
+0000915459 00000 n 
+0000010794 00000 n 
+0000010818 00000 n 
+0000443065 00000 n 
+0000915366 00000 n 
+0000010867 00000 n 
+0000010895 00000 n 
+0000443507 00000 n 
+0000915273 00000 n 
+0000010944 00000 n 
+0000010973 00000 n 
+0000443949 00000 n 
+0000915180 00000 n 
+0000011022 00000 n 
+0000011053 00000 n 
+0000444201 00000 n 
+0000915087 00000 n 
+0000011102 00000 n 
+0000011134 00000 n 
+0000444454 00000 n 
+0000915008 00000 n 
+0000011183 00000 n 
+0000011207 00000 n 
+0000444643 00000 n 
+0000914915 00000 n 
+0000011252 00000 n 
+0000011301 00000 n 
+0000444957 00000 n 
+0000914783 00000 n 
+0000011346 00000 n 
+0000011393 00000 n 
+0000445146 00000 n 
+0000914704 00000 n 
+0000011442 00000 n 
+0000011466 00000 n 
+0000445336 00000 n 
+0000914611 00000 n 
+0000011515 00000 n 
+0000011543 00000 n 
+0000445779 00000 n 
+0000914532 00000 n 
+0000011592 00000 n 
+0000011621 00000 n 
+0000446284 00000 n 
+0000914400 00000 n 
+0000011666 00000 n 
+0000011714 00000 n 
+0000446473 00000 n 
+0000914321 00000 n 
+0000011763 00000 n 
+0000011787 00000 n 
+0000446661 00000 n 
+0000914228 00000 n 
+0000011836 00000 n 
+0000011864 00000 n 
+0000448693 00000 n 
+0000914149 00000 n 
+0000011913 00000 n 
+0000011942 00000 n 
+0000449194 00000 n 
+0000914017 00000 n 
+0000011987 00000 n 
+0000012025 00000 n 
+0000449383 00000 n 
+0000913938 00000 n 
+0000012074 00000 n 
+0000012098 00000 n 
+0000449572 00000 n 
+0000913845 00000 n 
+0000012147 00000 n 
+0000012175 00000 n 
+0000450015 00000 n 
+0000913752 00000 n 
+0000012224 00000 n 
+0000012253 00000 n 
+0000450457 00000 n 
+0000913659 00000 n 
+0000012302 00000 n 
+0000012333 00000 n 
+0000450774 00000 n 
+0000913566 00000 n 
+0000012382 00000 n 
+0000012414 00000 n 
+0000450963 00000 n 
+0000913487 00000 n 
+0000012463 00000 n 
+0000012487 00000 n 
+0000451215 00000 n 
+0000913355 00000 n 
+0000012532 00000 n 
+0000012572 00000 n 
+0000451404 00000 n 
+0000913276 00000 n 
+0000012621 00000 n 
+0000012645 00000 n 
+0000451593 00000 n 
+0000913183 00000 n 
+0000012694 00000 n 
+0000012722 00000 n 
+0000452291 00000 n 
+0000913090 00000 n 
+0000012771 00000 n 
+0000012800 00000 n 
+0000454921 00000 n 
+0000912997 00000 n 
+0000012849 00000 n 
+0000012881 00000 n 
+0000455047 00000 n 
+0000912918 00000 n 
+0000012930 00000 n 
+0000012954 00000 n 
+0000455299 00000 n 
+0000912786 00000 n 
+0000012999 00000 n 
+0000013035 00000 n 
+0000455486 00000 n 
+0000912707 00000 n 
+0000013084 00000 n 
+0000013108 00000 n 
+0000455676 00000 n 
+0000912614 00000 n 
+0000013157 00000 n 
+0000013185 00000 n 
+0000456758 00000 n 
+0000912521 00000 n 
+0000013234 00000 n 
+0000013263 00000 n 
+0000458910 00000 n 
+0000912428 00000 n 
+0000013312 00000 n 
+0000013344 00000 n 
+0000459099 00000 n 
+0000912349 00000 n 
+0000013393 00000 n 
+0000013417 00000 n 
+0000459349 00000 n 
+0000912217 00000 n 
+0000013462 00000 n 
+0000013494 00000 n 
+0000459536 00000 n 
+0000912138 00000 n 
+0000013543 00000 n 
+0000013567 00000 n 
+0000459725 00000 n 
+0000912045 00000 n 
+0000013616 00000 n 
+0000013644 00000 n 
+0000461731 00000 n 
+0000911952 00000 n 
+0000013693 00000 n 
+0000013722 00000 n 
+0000462296 00000 n 
+0000911873 00000 n 
+0000013771 00000 n 
+0000013795 00000 n 
+0000462548 00000 n 
+0000911741 00000 n 
+0000013840 00000 n 
+0000013881 00000 n 
+0000462736 00000 n 
+0000911662 00000 n 
+0000013930 00000 n 
+0000013954 00000 n 
+0000462926 00000 n 
+0000911569 00000 n 
+0000014003 00000 n 
+0000014031 00000 n 
+0000463496 00000 n 
+0000911476 00000 n 
+0000014080 00000 n 
+0000014109 00000 n 
+0000464191 00000 n 
+0000911383 00000 n 
+0000014158 00000 n 
+0000014190 00000 n 
+0000464378 00000 n 
+0000911304 00000 n 
+0000014239 00000 n 
+0000014263 00000 n 
+0000464630 00000 n 
+0000911172 00000 n 
+0000014308 00000 n 
+0000014350 00000 n 
+0000464819 00000 n 
+0000911093 00000 n 
+0000014399 00000 n 
+0000014423 00000 n 
+0000465009 00000 n 
+0000911000 00000 n 
+0000014472 00000 n 
+0000014500 00000 n 
+0000465706 00000 n 
+0000910907 00000 n 
+0000014549 00000 n 
+0000014578 00000 n 
+0000468125 00000 n 
+0000910814 00000 n 
+0000014627 00000 n 
+0000014658 00000 n 
+0000468440 00000 n 
+0000910721 00000 n 
+0000014707 00000 n 
+0000014739 00000 n 
+0000468629 00000 n 
+0000910642 00000 n 
+0000014788 00000 n 
+0000014812 00000 n 
+0000468880 00000 n 
+0000910510 00000 n 
+0000014857 00000 n 
+0000014892 00000 n 
+0000469069 00000 n 
+0000910431 00000 n 
+0000014941 00000 n 
+0000014965 00000 n 
+0000469258 00000 n 
+0000910338 00000 n 
+0000015014 00000 n 
+0000015042 00000 n 
+0000469956 00000 n 
+0000910245 00000 n 
+0000015091 00000 n 
+0000015120 00000 n 
+0000470899 00000 n 
+0000910152 00000 n 
+0000015169 00000 n 
+0000015200 00000 n 
+0000471151 00000 n 
+0000910059 00000 n 
+0000015249 00000 n 
+0000015281 00000 n 
+0000471340 00000 n 
+0000909980 00000 n 
+0000015330 00000 n 
+0000015354 00000 n 
+0000471592 00000 n 
+0000909848 00000 n 
+0000015399 00000 n 
+0000015438 00000 n 
+0000471781 00000 n 
+0000909769 00000 n 
+0000015487 00000 n 
+0000015511 00000 n 
+0000473415 00000 n 
+0000909676 00000 n 
+0000015560 00000 n 
+0000015588 00000 n 
+0000473856 00000 n 
+0000909583 00000 n 
+0000015637 00000 n 
+0000015666 00000 n 
+0000474298 00000 n 
+0000909490 00000 n 
+0000015715 00000 n 
+0000015747 00000 n 
+0000474487 00000 n 
+0000909411 00000 n 
+0000015796 00000 n 
+0000015820 00000 n 
+0000474738 00000 n 
+0000909279 00000 n 
+0000015865 00000 n 
+0000015902 00000 n 
+0000474927 00000 n 
+0000909200 00000 n 
+0000015951 00000 n 
+0000015975 00000 n 
+0000475115 00000 n 
+0000909107 00000 n 
+0000016024 00000 n 
+0000016052 00000 n 
+0000475814 00000 n 
+0000909014 00000 n 
+0000016101 00000 n 
+0000016130 00000 n 
+0000476760 00000 n 
+0000908921 00000 n 
+0000016179 00000 n 
+0000016211 00000 n 
+0000476949 00000 n 
+0000908842 00000 n 
+0000016260 00000 n 
+0000016284 00000 n 
+0000477201 00000 n 
+0000908710 00000 n 
+0000016329 00000 n 
+0000016366 00000 n 
+0000477390 00000 n 
+0000908631 00000 n 
+0000016415 00000 n 
+0000016439 00000 n 
+0000477580 00000 n 
+0000908538 00000 n 
+0000016488 00000 n 
+0000016516 00000 n 
+0000479185 00000 n 
+0000908445 00000 n 
+0000016565 00000 n 
+0000016594 00000 n 
+0000479560 00000 n 
+0000908352 00000 n 
+0000016643 00000 n 
+0000016675 00000 n 
+0000479749 00000 n 
+0000908273 00000 n 
+0000016724 00000 n 
+0000016748 00000 n 
+0000480001 00000 n 
+0000908141 00000 n 
+0000016793 00000 n 
+0000016829 00000 n 
+0000480188 00000 n 
+0000908062 00000 n 
+0000016878 00000 n 
+0000016902 00000 n 
+0000480378 00000 n 
+0000907969 00000 n 
+0000016951 00000 n 
+0000016979 00000 n 
+0000480811 00000 n 
+0000907876 00000 n 
+0000017028 00000 n 
+0000017057 00000 n 
+0000481253 00000 n 
+0000907783 00000 n 
+0000017106 00000 n 
+0000017138 00000 n 
+0000481442 00000 n 
+0000907704 00000 n 
+0000017187 00000 n 
+0000017211 00000 n 
+0000481694 00000 n 
+0000907572 00000 n 
+0000017256 00000 n 
+0000017296 00000 n 
+0000481881 00000 n 
+0000907493 00000 n 
+0000017345 00000 n 
+0000017369 00000 n 
+0000482071 00000 n 
+0000907400 00000 n 
+0000017418 00000 n 
+0000017446 00000 n 
+0000482514 00000 n 
+0000907307 00000 n 
+0000017495 00000 n 
+0000017524 00000 n 
+0000482956 00000 n 
+0000907214 00000 n 
+0000017573 00000 n 
+0000017605 00000 n 
+0000484409 00000 n 
+0000907135 00000 n 
+0000017654 00000 n 
+0000017678 00000 n 
+0000484660 00000 n 
+0000907003 00000 n 
+0000017723 00000 n 
+0000017762 00000 n 
+0000484848 00000 n 
+0000906924 00000 n 
+0000017811 00000 n 
+0000017835 00000 n 
+0000485102 00000 n 
+0000906831 00000 n 
+0000017884 00000 n 
+0000017912 00000 n 
+0000485545 00000 n 
+0000906738 00000 n 
+0000017961 00000 n 
+0000017990 00000 n 
+0000485987 00000 n 
+0000906645 00000 n 
+0000018039 00000 n 
+0000018071 00000 n 
+0000486173 00000 n 
+0000906566 00000 n 
+0000018120 00000 n 
+0000018144 00000 n 
+0000486425 00000 n 
+0000906434 00000 n 
+0000018189 00000 n 
+0000018230 00000 n 
+0000486614 00000 n 
+0000906355 00000 n 
+0000018279 00000 n 
+0000018303 00000 n 
+0000486804 00000 n 
+0000906262 00000 n 
+0000018352 00000 n 
+0000018380 00000 n 
+0000487375 00000 n 
+0000906169 00000 n 
+0000018429 00000 n 
+0000018458 00000 n 
+0000488069 00000 n 
+0000906076 00000 n 
+0000018507 00000 n 
+0000018539 00000 n 
+0000488258 00000 n 
+0000905997 00000 n 
+0000018588 00000 n 
+0000018612 00000 n 
+0000489785 00000 n 
+0000905865 00000 n 
+0000018657 00000 n 
+0000018697 00000 n 
+0000489970 00000 n 
+0000905786 00000 n 
+0000018746 00000 n 
+0000018770 00000 n 
+0000490159 00000 n 
+0000905693 00000 n 
+0000018819 00000 n 
+0000018847 00000 n 
+0000490858 00000 n 
+0000905600 00000 n 
+0000018896 00000 n 
+0000018925 00000 n 
+0000491804 00000 n 
+0000905507 00000 n 
+0000018974 00000 n 
+0000019006 00000 n 
+0000491992 00000 n 
+0000905428 00000 n 
+0000019055 00000 n 
+0000019079 00000 n 
+0000492244 00000 n 
+0000905294 00000 n 
+0000019124 00000 n 
+0000019164 00000 n 
+0000492433 00000 n 
+0000905215 00000 n 
+0000019213 00000 n 
+0000019237 00000 n 
+0000492621 00000 n 
+0000905122 00000 n 
+0000019286 00000 n 
+0000019314 00000 n 
+0000493064 00000 n 
+0000905027 00000 n 
+0000019363 00000 n 
+0000019393 00000 n 
+0000493506 00000 n 
+0000904930 00000 n 
+0000019443 00000 n 
+0000019476 00000 n 
+0000493696 00000 n 
+0000904847 00000 n 
+0000019526 00000 n 
+0000019551 00000 n 
+0000495456 00000 n 
+0000904709 00000 n 
+0000019597 00000 n 
+0000019636 00000 n 
+0000495646 00000 n 
+0000904625 00000 n 
+0000019686 00000 n 
+0000019711 00000 n 
+0000495836 00000 n 
+0000904526 00000 n 
+0000019761 00000 n 
+0000019790 00000 n 
+0000496408 00000 n 
+0000904427 00000 n 
+0000019840 00000 n 
+0000019870 00000 n 
+0000497102 00000 n 
+0000904328 00000 n 
+0000019920 00000 n 
+0000019953 00000 n 
+0000497291 00000 n 
+0000904244 00000 n 
+0000020003 00000 n 
+0000020028 00000 n 
+0000497544 00000 n 
+0000904105 00000 n 
+0000020074 00000 n 
+0000020118 00000 n 
+0000497734 00000 n 
+0000904021 00000 n 
+0000020168 00000 n 
+0000020193 00000 n 
+0000497925 00000 n 
+0000903922 00000 n 
+0000020243 00000 n 
+0000020272 00000 n 
+0000498498 00000 n 
+0000903823 00000 n 
+0000020322 00000 n 
+0000020352 00000 n 
+0000499194 00000 n 
+0000903724 00000 n 
+0000020402 00000 n 
+0000020434 00000 n 
+0000499446 00000 n 
+0000903640 00000 n 
+0000020484 00000 n 
+0000020509 00000 n 
+0000501412 00000 n 
+0000903501 00000 n 
+0000020555 00000 n 
+0000020594 00000 n 
+0000501602 00000 n 
+0000903417 00000 n 
+0000020644 00000 n 
+0000020669 00000 n 
+0000501792 00000 n 
+0000903318 00000 n 
+0000020719 00000 n 
+0000020748 00000 n 
+0000502364 00000 n 
+0000903219 00000 n 
+0000020798 00000 n 
+0000020828 00000 n 
+0000503058 00000 n 
+0000903120 00000 n 
+0000020878 00000 n 
+0000020910 00000 n 
+0000503247 00000 n 
+0000903036 00000 n 
+0000020960 00000 n 
+0000020985 00000 n 
+0000503500 00000 n 
+0000902897 00000 n 
+0000021031 00000 n 
+0000021068 00000 n 
+0000503690 00000 n 
+0000902813 00000 n 
+0000021118 00000 n 
+0000021143 00000 n 
+0000503881 00000 n 
+0000902714 00000 n 
+0000021193 00000 n 
+0000021222 00000 n 
+0000504453 00000 n 
+0000902615 00000 n 
+0000021272 00000 n 
+0000021302 00000 n 
+0000505148 00000 n 
+0000902516 00000 n 
+0000021352 00000 n 
+0000021384 00000 n 
+0000505338 00000 n 
+0000902417 00000 n 
+0000021434 00000 n 
+0000021467 00000 n 
+0000507459 00000 n 
+0000902333 00000 n 
+0000021517 00000 n 
+0000021542 00000 n 
+0000507648 00000 n 
+0000902194 00000 n 
+0000021588 00000 n 
+0000021632 00000 n 
+0000507837 00000 n 
+0000902110 00000 n 
+0000021682 00000 n 
+0000021707 00000 n 
+0000508028 00000 n 
+0000902011 00000 n 
+0000021757 00000 n 
+0000021786 00000 n 
+0000508471 00000 n 
+0000901912 00000 n 
+0000021836 00000 n 
+0000021866 00000 n 
+0000508912 00000 n 
+0000901813 00000 n 
+0000021916 00000 n 
+0000021948 00000 n 
+0000509102 00000 n 
+0000901729 00000 n 
+0000021998 00000 n 
+0000022031 00000 n 
+0000509292 00000 n 
+0000901631 00000 n 
+0000022077 00000 n 
+0000022147 00000 n 
+0000509545 00000 n 
+0000901492 00000 n 
+0000022193 00000 n 
+0000022232 00000 n 
+0000509735 00000 n 
+0000901408 00000 n 
+0000022282 00000 n 
+0000022307 00000 n 
+0000509923 00000 n 
+0000901309 00000 n 
+0000022357 00000 n 
+0000022386 00000 n 
+0000510113 00000 n 
+0000901210 00000 n 
+0000022436 00000 n 
+0000022464 00000 n 
+0000512951 00000 n 
+0000901126 00000 n 
+0000022514 00000 n 
+0000022546 00000 n 
+0000513203 00000 n 
+0000900987 00000 n 
+0000022592 00000 n 
+0000022631 00000 n 
+0000513391 00000 n 
+0000900903 00000 n 
+0000022681 00000 n 
+0000022706 00000 n 
+0000513582 00000 n 
+0000900804 00000 n 
+0000022756 00000 n 
+0000022785 00000 n 
+0000513772 00000 n 
+0000900705 00000 n 
+0000022835 00000 n 
+0000022863 00000 n 
+0000515921 00000 n 
+0000900621 00000 n 
+0000022913 00000 n 
+0000022945 00000 n 
+0000517754 00000 n 
+0000900482 00000 n 
+0000022991 00000 n 
+0000023031 00000 n 
+0000517943 00000 n 
+0000900398 00000 n 
+0000023081 00000 n 
+0000023106 00000 n 
+0000518133 00000 n 
+0000900299 00000 n 
+0000023156 00000 n 
+0000023185 00000 n 
+0000518832 00000 n 
+0000900200 00000 n 
+0000023235 00000 n 
+0000023265 00000 n 
+0000519780 00000 n 
+0000900116 00000 n 
+0000023315 00000 n 
+0000023348 00000 n 
+0000520031 00000 n 
+0000899977 00000 n 
+0000023394 00000 n 
+0000023434 00000 n 
+0000520221 00000 n 
+0000899893 00000 n 
+0000023484 00000 n 
+0000023509 00000 n 
+0000520412 00000 n 
+0000899794 00000 n 
+0000023559 00000 n 
+0000023588 00000 n 
+0000520984 00000 n 
+0000899695 00000 n 
+0000023638 00000 n 
+0000023668 00000 n 
+0000521743 00000 n 
+0000899611 00000 n 
+0000023718 00000 n 
+0000023751 00000 n 
+0000521995 00000 n 
+0000899472 00000 n 
+0000023797 00000 n 
+0000023839 00000 n 
+0000522183 00000 n 
+0000899388 00000 n 
+0000023889 00000 n 
+0000023914 00000 n 
+0000523979 00000 n 
+0000899289 00000 n 
+0000023964 00000 n 
+0000023993 00000 n 
+0000524549 00000 n 
+0000899190 00000 n 
+0000024043 00000 n 
+0000024073 00000 n 
+0000525308 00000 n 
+0000899106 00000 n 
+0000024123 00000 n 
+0000024156 00000 n 
+0000525561 00000 n 
+0000898967 00000 n 
+0000024202 00000 n 
+0000024244 00000 n 
+0000525751 00000 n 
+0000898883 00000 n 
+0000024294 00000 n 
+0000024319 00000 n 
+0000525942 00000 n 
+0000898784 00000 n 
+0000024369 00000 n 
+0000024398 00000 n 
+0000526514 00000 n 
+0000898685 00000 n 
+0000024448 00000 n 
+0000024478 00000 n 
+0000527209 00000 n 
+0000898601 00000 n 
+0000024528 00000 n 
+0000024561 00000 n 
+0000527654 00000 n 
+0000898462 00000 n 
+0000024607 00000 n 
+0000024649 00000 n 
+0000527844 00000 n 
+0000898378 00000 n 
+0000024699 00000 n 
+0000024724 00000 n 
+0000528035 00000 n 
+0000898279 00000 n 
+0000024774 00000 n 
+0000024803 00000 n 
+0000528606 00000 n 
+0000898180 00000 n 
+0000024853 00000 n 
+0000024883 00000 n 
+0000531005 00000 n 
+0000898096 00000 n 
+0000024933 00000 n 
+0000024966 00000 n 
+0000531386 00000 n 
+0000897957 00000 n 
+0000025012 00000 n 
+0000025055 00000 n 
+0000531576 00000 n 
+0000897873 00000 n 
+0000025105 00000 n 
+0000025130 00000 n 
+0000531766 00000 n 
+0000897774 00000 n 
+0000025180 00000 n 
+0000025209 00000 n 
+0000532337 00000 n 
+0000897675 00000 n 
+0000025259 00000 n 
+0000025289 00000 n 
+0000533094 00000 n 
+0000897591 00000 n 
+0000025339 00000 n 
+0000025372 00000 n 
+0000533344 00000 n 
+0000897452 00000 n 
+0000025418 00000 n 
+0000025457 00000 n 
+0000533532 00000 n 
+0000897368 00000 n 
+0000025507 00000 n 
+0000025532 00000 n 
+0000533723 00000 n 
+0000897269 00000 n 
+0000025582 00000 n 
+0000025611 00000 n 
+0000536094 00000 n 
+0000897170 00000 n 
+0000025661 00000 n 
+0000025689 00000 n 
+0000539639 00000 n 
+0000897086 00000 n 
+0000025739 00000 n 
+0000025771 00000 n 
+0000540018 00000 n 
+0000896947 00000 n 
+0000025817 00000 n 
+0000025856 00000 n 
+0000540208 00000 n 
+0000896863 00000 n 
+0000025906 00000 n 
+0000025931 00000 n 
+0000542980 00000 n 
+0000896764 00000 n 
+0000025981 00000 n 
+0000026010 00000 n 
+0000543170 00000 n 
+0000896665 00000 n 
+0000026060 00000 n 
+0000026088 00000 n 
+0000545896 00000 n 
+0000896581 00000 n 
+0000026138 00000 n 
+0000026170 00000 n 
+0000547331 00000 n 
+0000896442 00000 n 
+0000026216 00000 n 
+0000026255 00000 n 
+0000547521 00000 n 
+0000896358 00000 n 
+0000026305 00000 n 
+0000026330 00000 n 
+0000547711 00000 n 
+0000896259 00000 n 
+0000026380 00000 n 
+0000026409 00000 n 
+0000548284 00000 n 
+0000896175 00000 n 
+0000026459 00000 n 
+0000026489 00000 n 
+0000549039 00000 n 
+0000896036 00000 n 
+0000026535 00000 n 
+0000026575 00000 n 
+0000549228 00000 n 
+0000895952 00000 n 
+0000026625 00000 n 
+0000026650 00000 n 
+0000549419 00000 n 
+0000895853 00000 n 
+0000026700 00000 n 
+0000026729 00000 n 
+0000549990 00000 n 
+0000895769 00000 n 
+0000026779 00000 n 
+0000026809 00000 n 
+0000550742 00000 n 
+0000895630 00000 n 
+0000026855 00000 n 
+0000026896 00000 n 
+0000550932 00000 n 
+0000895546 00000 n 
+0000026946 00000 n 
+0000026971 00000 n 
+0000551123 00000 n 
+0000895447 00000 n 
+0000027021 00000 n 
+0000027050 00000 n 
+0000551696 00000 n 
+0000895363 00000 n 
+0000027100 00000 n 
+0000027130 00000 n 
+0000554061 00000 n 
+0000895224 00000 n 
+0000027176 00000 n 
+0000027215 00000 n 
+0000554251 00000 n 
+0000895140 00000 n 
+0000027265 00000 n 
+0000027290 00000 n 
+0000554441 00000 n 
+0000895041 00000 n 
+0000027340 00000 n 
+0000027369 00000 n 
+0000555013 00000 n 
+0000894942 00000 n 
+0000027419 00000 n 
+0000027449 00000 n 
+0000555706 00000 n 
+0000894858 00000 n 
+0000027499 00000 n 
+0000027531 00000 n 
+0000555959 00000 n 
+0000894719 00000 n 
+0000027577 00000 n 
+0000027619 00000 n 
+0000556149 00000 n 
+0000894635 00000 n 
+0000027669 00000 n 
+0000027694 00000 n 
+0000556339 00000 n 
+0000894536 00000 n 
+0000027744 00000 n 
+0000027773 00000 n 
+0000556905 00000 n 
+0000894437 00000 n 
+0000027823 00000 n 
+0000027853 00000 n 
+0000557600 00000 n 
+0000894353 00000 n 
+0000027903 00000 n 
+0000027935 00000 n 
+0000558041 00000 n 
+0000894214 00000 n 
+0000027981 00000 n 
+0000028018 00000 n 
+0000558230 00000 n 
+0000894130 00000 n 
+0000028068 00000 n 
+0000028093 00000 n 
+0000559940 00000 n 
+0000894031 00000 n 
+0000028143 00000 n 
+0000028172 00000 n 
+0000560383 00000 n 
+0000893947 00000 n 
+0000028222 00000 n 
+0000028252 00000 n 
+0000560889 00000 n 
+0000893808 00000 n 
+0000028298 00000 n 
+0000028335 00000 n 
+0000561079 00000 n 
+0000893724 00000 n 
+0000028385 00000 n 
+0000028410 00000 n 
+0000561270 00000 n 
+0000893625 00000 n 
+0000028460 00000 n 
+0000028489 00000 n 
+0000561715 00000 n 
+0000893526 00000 n 
+0000028539 00000 n 
+0000028569 00000 n 
+0000562157 00000 n 
+0000893442 00000 n 
+0000028619 00000 n 
+0000028651 00000 n 
+0000562474 00000 n 
+0000893303 00000 n 
+0000028697 00000 n 
+0000028738 00000 n 
+0000562664 00000 n 
+0000893219 00000 n 
+0000028788 00000 n 
+0000028813 00000 n 
+0000562855 00000 n 
+0000893120 00000 n 
+0000028863 00000 n 
+0000028892 00000 n 
+0000563299 00000 n 
+0000893021 00000 n 
+0000028942 00000 n 
+0000028972 00000 n 
+0000563742 00000 n 
+0000892922 00000 n 
+0000029022 00000 n 
+0000029054 00000 n 
+0000563931 00000 n 
+0000892838 00000 n 
+0000029104 00000 n 
+0000029137 00000 n 
+0000565833 00000 n 
+0000892699 00000 n 
+0000029183 00000 n 
+0000029223 00000 n 
+0000566023 00000 n 
+0000892615 00000 n 
+0000029273 00000 n 
+0000029298 00000 n 
+0000566213 00000 n 
+0000892516 00000 n 
+0000029348 00000 n 
+0000029377 00000 n 
+0000566657 00000 n 
+0000892417 00000 n 
+0000029427 00000 n 
+0000029457 00000 n 
+0000567099 00000 n 
+0000892333 00000 n 
+0000029507 00000 n 
+0000029540 00000 n 
+0000567352 00000 n 
+0000892194 00000 n 
+0000029586 00000 n 
+0000029622 00000 n 
+0000567542 00000 n 
+0000892110 00000 n 
+0000029672 00000 n 
+0000029697 00000 n 
+0000567733 00000 n 
+0000892011 00000 n 
+0000029747 00000 n 
+0000029776 00000 n 
+0000568559 00000 n 
+0000891912 00000 n 
+0000029826 00000 n 
+0000029856 00000 n 
+0000569758 00000 n 
+0000891813 00000 n 
+0000029906 00000 n 
+0000029938 00000 n 
+0000570011 00000 n 
+0000891729 00000 n 
+0000029988 00000 n 
+0000030021 00000 n 
+0000572190 00000 n 
+0000891590 00000 n 
+0000030067 00000 n 
+0000030106 00000 n 
+0000572380 00000 n 
+0000891506 00000 n 
+0000030156 00000 n 
+0000030181 00000 n 
+0000572570 00000 n 
+0000891407 00000 n 
+0000030231 00000 n 
+0000030260 00000 n 
+0000573652 00000 n 
+0000891308 00000 n 
+0000030310 00000 n 
+0000030340 00000 n 
+0000575359 00000 n 
+0000891209 00000 n 
+0000030390 00000 n 
+0000030422 00000 n 
+0000575549 00000 n 
+0000891125 00000 n 
+0000030472 00000 n 
+0000030505 00000 n 
+0000575802 00000 n 
+0000890986 00000 n 
+0000030551 00000 n 
+0000030587 00000 n 
+0000575992 00000 n 
+0000890902 00000 n 
+0000030637 00000 n 
+0000030662 00000 n 
+0000576183 00000 n 
+0000890803 00000 n 
+0000030712 00000 n 
+0000030741 00000 n 
+0000576880 00000 n 
+0000890704 00000 n 
+0000030791 00000 n 
+0000030821 00000 n 
+0000579430 00000 n 
+0000890605 00000 n 
+0000030871 00000 n 
+0000030903 00000 n 
+0000579747 00000 n 
+0000890521 00000 n 
+0000030953 00000 n 
+0000030986 00000 n 
+0000580000 00000 n 
+0000890382 00000 n 
+0000031032 00000 n 
+0000031070 00000 n 
+0000580190 00000 n 
+0000890298 00000 n 
+0000031120 00000 n 
+0000031145 00000 n 
+0000580380 00000 n 
+0000890199 00000 n 
+0000031195 00000 n 
+0000031224 00000 n 
+0000581078 00000 n 
+0000890100 00000 n 
+0000031274 00000 n 
+0000031304 00000 n 
+0000582026 00000 n 
+0000890001 00000 n 
+0000031354 00000 n 
+0000031386 00000 n 
+0000582344 00000 n 
+0000889917 00000 n 
+0000031436 00000 n 
+0000031469 00000 n 
+0000582597 00000 n 
+0000889778 00000 n 
+0000031515 00000 n 
+0000031557 00000 n 
+0000582786 00000 n 
+0000889694 00000 n 
+0000031607 00000 n 
+0000031632 00000 n 
+0000582976 00000 n 
+0000889595 00000 n 
+0000031682 00000 n 
+0000031711 00000 n 
+0000585157 00000 n 
+0000889496 00000 n 
+0000031761 00000 n 
+0000031791 00000 n 
+0000585723 00000 n 
+0000889397 00000 n 
+0000031841 00000 n 
+0000031873 00000 n 
+0000585913 00000 n 
+0000889313 00000 n 
+0000031923 00000 n 
+0000031956 00000 n 
+0000586165 00000 n 
+0000889174 00000 n 
+0000032002 00000 n 
+0000032040 00000 n 
+0000586353 00000 n 
+0000889090 00000 n 
+0000032090 00000 n 
+0000032115 00000 n 
+0000586544 00000 n 
+0000888991 00000 n 
+0000032165 00000 n 
+0000032194 00000 n 
+0000587242 00000 n 
+0000888892 00000 n 
+0000032244 00000 n 
+0000032274 00000 n 
+0000588191 00000 n 
+0000888793 00000 n 
+0000032324 00000 n 
+0000032356 00000 n 
+0000588381 00000 n 
+0000888709 00000 n 
+0000032406 00000 n 
+0000032439 00000 n 
+0000588633 00000 n 
+0000888570 00000 n 
+0000032485 00000 n 
+0000032523 00000 n 
+0000588823 00000 n 
+0000888486 00000 n 
+0000032573 00000 n 
+0000032598 00000 n 
+0000590550 00000 n 
+0000888387 00000 n 
+0000032648 00000 n 
+0000032677 00000 n 
+0000591246 00000 n 
+0000888288 00000 n 
+0000032727 00000 n 
+0000032757 00000 n 
+0000592192 00000 n 
+0000888189 00000 n 
+0000032807 00000 n 
+0000032839 00000 n 
+0000592446 00000 n 
+0000888105 00000 n 
+0000032889 00000 n 
+0000032922 00000 n 
+0000592698 00000 n 
+0000887966 00000 n 
+0000032968 00000 n 
+0000033007 00000 n 
+0000592887 00000 n 
+0000887882 00000 n 
+0000033057 00000 n 
+0000033082 00000 n 
+0000593078 00000 n 
+0000887783 00000 n 
+0000033132 00000 n 
+0000033161 00000 n 
+0000593776 00000 n 
+0000887684 00000 n 
+0000033211 00000 n 
+0000033241 00000 n 
+0000594725 00000 n 
+0000887585 00000 n 
+0000033291 00000 n 
+0000033323 00000 n 
+0000594979 00000 n 
+0000887501 00000 n 
+0000033373 00000 n 
+0000033406 00000 n 
+0000596816 00000 n 
+0000887362 00000 n 
+0000033452 00000 n 
+0000033486 00000 n 
+0000597006 00000 n 
+0000887278 00000 n 
+0000033536 00000 n 
+0000033561 00000 n 
+0000597196 00000 n 
+0000887179 00000 n 
+0000033611 00000 n 
+0000033640 00000 n 
+0000598024 00000 n 
+0000887080 00000 n 
+0000033690 00000 n 
+0000033720 00000 n 
+0000599224 00000 n 
+0000886996 00000 n 
+0000033770 00000 n 
+0000033803 00000 n 
+0000599477 00000 n 
+0000886857 00000 n 
+0000033849 00000 n 
+0000033881 00000 n 
+0000599667 00000 n 
+0000886773 00000 n 
+0000033931 00000 n 
+0000033956 00000 n 
+0000599858 00000 n 
+0000886674 00000 n 
+0000034006 00000 n 
+0000034035 00000 n 
+0000600298 00000 n 
+0000886575 00000 n 
+0000034085 00000 n 
+0000034115 00000 n 
+0000600741 00000 n 
+0000886476 00000 n 
+0000034165 00000 n 
+0000034197 00000 n 
+0000600931 00000 n 
+0000886392 00000 n 
+0000034247 00000 n 
+0000034280 00000 n 
+0000602635 00000 n 
+0000886253 00000 n 
+0000034326 00000 n 
+0000034366 00000 n 
+0000602825 00000 n 
+0000886169 00000 n 
+0000034416 00000 n 
+0000034441 00000 n 
+0000603015 00000 n 
+0000886070 00000 n 
+0000034491 00000 n 
+0000034520 00000 n 
+0000603459 00000 n 
+0000885971 00000 n 
+0000034570 00000 n 
+0000034600 00000 n 
+0000603902 00000 n 
+0000885887 00000 n 
+0000034650 00000 n 
+0000034683 00000 n 
+0000604155 00000 n 
+0000885748 00000 n 
+0000034729 00000 n 
+0000034769 00000 n 
+0000604344 00000 n 
+0000885664 00000 n 
+0000034819 00000 n 
+0000034844 00000 n 
+0000604535 00000 n 
+0000885565 00000 n 
+0000034894 00000 n 
+0000034923 00000 n 
+0000605235 00000 n 
+0000885466 00000 n 
+0000034973 00000 n 
+0000035003 00000 n 
+0000606184 00000 n 
+0000885382 00000 n 
+0000035053 00000 n 
+0000035086 00000 n 
+0000606436 00000 n 
+0000885243 00000 n 
+0000035132 00000 n 
+0000035175 00000 n 
+0000606625 00000 n 
+0000885159 00000 n 
+0000035225 00000 n 
+0000035250 00000 n 
+0000606815 00000 n 
+0000885060 00000 n 
+0000035300 00000 n 
+0000035329 00000 n 
+0000608663 00000 n 
+0000884961 00000 n 
+0000035379 00000 n 
+0000035409 00000 n 
+0000609039 00000 n 
+0000884877 00000 n 
+0000035459 00000 n 
+0000035492 00000 n 
+0000609292 00000 n 
+0000884738 00000 n 
+0000035538 00000 n 
+0000035578 00000 n 
+0000609482 00000 n 
+0000884654 00000 n 
+0000035628 00000 n 
+0000035653 00000 n 
+0000609673 00000 n 
+0000884555 00000 n 
+0000035703 00000 n 
+0000035732 00000 n 
+0000610118 00000 n 
+0000884471 00000 n 
+0000035782 00000 n 
+0000035812 00000 n 
+0000610623 00000 n 
+0000884332 00000 n 
+0000035858 00000 n 
+0000035899 00000 n 
+0000610812 00000 n 
+0000884248 00000 n 
+0000035949 00000 n 
+0000035974 00000 n 
+0000611003 00000 n 
+0000884149 00000 n 
+0000036024 00000 n 
+0000036053 00000 n 
+0000611448 00000 n 
+0000884065 00000 n 
+0000036103 00000 n 
+0000036133 00000 n 
+0000611953 00000 n 
+0000883926 00000 n 
+0000036179 00000 n 
+0000036222 00000 n 
+0000612142 00000 n 
+0000883842 00000 n 
+0000036272 00000 n 
+0000036297 00000 n 
+0000612333 00000 n 
+0000883743 00000 n 
+0000036347 00000 n 
+0000036376 00000 n 
+0000614365 00000 n 
+0000883644 00000 n 
+0000036426 00000 n 
+0000036456 00000 n 
+0000614931 00000 n 
+0000883560 00000 n 
+0000036506 00000 n 
+0000036539 00000 n 
+0000615184 00000 n 
+0000883421 00000 n 
+0000036585 00000 n 
+0000036629 00000 n 
+0000615374 00000 n 
+0000883337 00000 n 
+0000036679 00000 n 
+0000036704 00000 n 
+0000615565 00000 n 
+0000883238 00000 n 
+0000036754 00000 n 
+0000036783 00000 n 
+0000616007 00000 n 
+0000883139 00000 n 
+0000036833 00000 n 
+0000036863 00000 n 
+0000616448 00000 n 
+0000883055 00000 n 
+0000036913 00000 n 
+0000036946 00000 n 
+0000616701 00000 n 
+0000882916 00000 n 
+0000036992 00000 n 
+0000037039 00000 n 
+0000616891 00000 n 
+0000882832 00000 n 
+0000037089 00000 n 
+0000037114 00000 n 
+0000617082 00000 n 
+0000882733 00000 n 
+0000037164 00000 n 
+0000037193 00000 n 
+0000617653 00000 n 
+0000882634 00000 n 
+0000037243 00000 n 
+0000037273 00000 n 
+0000618347 00000 n 
+0000882550 00000 n 
+0000037323 00000 n 
+0000037356 00000 n 
+0000619995 00000 n 
+0000882411 00000 n 
+0000037402 00000 n 
+0000037446 00000 n 
+0000620185 00000 n 
+0000882327 00000 n 
+0000037496 00000 n 
+0000037521 00000 n 
+0000620375 00000 n 
+0000882228 00000 n 
+0000037571 00000 n 
+0000037600 00000 n 
+0000620818 00000 n 
+0000882129 00000 n 
+0000037650 00000 n 
+0000037680 00000 n 
+0000621261 00000 n 
+0000882045 00000 n 
+0000037730 00000 n 
+0000037763 00000 n 
+0000621514 00000 n 
+0000881906 00000 n 
+0000037809 00000 n 
+0000037854 00000 n 
+0000621704 00000 n 
+0000881822 00000 n 
+0000037904 00000 n 
+0000037929 00000 n 
+0000621895 00000 n 
+0000881723 00000 n 
+0000037979 00000 n 
+0000038008 00000 n 
+0000622339 00000 n 
+0000881624 00000 n 
+0000038058 00000 n 
+0000038088 00000 n 
+0000622782 00000 n 
+0000881540 00000 n 
+0000038138 00000 n 
+0000038171 00000 n 
+0000622972 00000 n 
+0000881442 00000 n 
+0000038217 00000 n 
+0000038281 00000 n 
+0000623158 00000 n 
+0000881303 00000 n 
+0000038327 00000 n 
+0000038366 00000 n 
+0000623346 00000 n 
+0000881219 00000 n 
+0000038416 00000 n 
+0000038441 00000 n 
+0000623537 00000 n 
+0000881120 00000 n 
+0000038491 00000 n 
+0000038520 00000 n 
+0000626150 00000 n 
+0000881021 00000 n 
+0000038570 00000 n 
+0000038600 00000 n 
+0000626967 00000 n 
+0000880937 00000 n 
+0000038650 00000 n 
+0000038682 00000 n 
+0000627348 00000 n 
+0000880798 00000 n 
+0000038728 00000 n 
+0000038769 00000 n 
+0000627538 00000 n 
+0000880714 00000 n 
+0000038819 00000 n 
+0000038844 00000 n 
+0000627729 00000 n 
+0000880615 00000 n 
+0000038894 00000 n 
+0000038923 00000 n 
+0000628173 00000 n 
+0000880531 00000 n 
+0000038973 00000 n 
+0000039003 00000 n 
+0000628677 00000 n 
+0000880392 00000 n 
+0000039049 00000 n 
+0000039096 00000 n 
+0000628867 00000 n 
+0000880308 00000 n 
+0000039146 00000 n 
+0000039171 00000 n 
+0000629058 00000 n 
+0000880209 00000 n 
+0000039221 00000 n 
+0000039250 00000 n 
+0000630141 00000 n 
+0000880110 00000 n 
+0000039300 00000 n 
+0000039330 00000 n 
+0000633491 00000 n 
+0000880011 00000 n 
+0000039380 00000 n 
+0000039412 00000 n 
+0000633745 00000 n 
+0000879927 00000 n 
+0000039462 00000 n 
+0000039495 00000 n 
+0000633998 00000 n 
+0000879788 00000 n 
+0000039541 00000 n 
+0000039586 00000 n 
+0000634187 00000 n 
+0000879704 00000 n 
+0000039636 00000 n 
+0000039661 00000 n 
+0000634377 00000 n 
+0000879605 00000 n 
+0000039711 00000 n 
+0000039740 00000 n 
+0000635076 00000 n 
+0000879506 00000 n 
+0000039790 00000 n 
+0000039820 00000 n 
+0000636024 00000 n 
+0000879407 00000 n 
+0000039870 00000 n 
+0000039902 00000 n 
+0000636278 00000 n 
+0000879323 00000 n 
+0000039952 00000 n 
+0000039985 00000 n 
+0000636531 00000 n 
+0000879184 00000 n 
+0000040032 00000 n 
+0000040071 00000 n 
+0000636721 00000 n 
+0000879100 00000 n 
+0000040122 00000 n 
+0000040147 00000 n 
+0000638452 00000 n 
+0000879001 00000 n 
+0000040198 00000 n 
+0000040227 00000 n 
+0000639022 00000 n 
+0000878902 00000 n 
+0000040278 00000 n 
+0000040308 00000 n 
+0000639717 00000 n 
+0000878803 00000 n 
+0000040359 00000 n 
+0000040391 00000 n 
+0000639907 00000 n 
+0000878719 00000 n 
+0000040442 00000 n 
+0000040475 00000 n 
+0000640159 00000 n 
+0000878580 00000 n 
+0000040522 00000 n 
+0000040561 00000 n 
+0000640348 00000 n 
+0000878496 00000 n 
+0000040612 00000 n 
+0000040637 00000 n 
+0000640538 00000 n 
+0000878397 00000 n 
+0000040688 00000 n 
+0000040717 00000 n 
+0000641109 00000 n 
+0000878298 00000 n 
+0000040768 00000 n 
+0000040798 00000 n 
+0000641802 00000 n 
+0000878214 00000 n 
+0000040849 00000 n 
+0000040882 00000 n 
+0000642055 00000 n 
+0000878075 00000 n 
+0000040929 00000 n 
+0000040968 00000 n 
+0000642245 00000 n 
+0000877991 00000 n 
+0000041019 00000 n 
+0000041044 00000 n 
+0000642435 00000 n 
+0000877892 00000 n 
+0000041095 00000 n 
+0000041124 00000 n 
+0000644377 00000 n 
+0000877808 00000 n 
+0000041175 00000 n 
+0000041205 00000 n 
+0000644879 00000 n 
+0000877669 00000 n 
+0000041252 00000 n 
+0000041290 00000 n 
+0000645069 00000 n 
+0000877585 00000 n 
+0000041341 00000 n 
+0000041366 00000 n 
+0000645259 00000 n 
+0000877486 00000 n 
+0000041417 00000 n 
+0000041446 00000 n 
+0000645703 00000 n 
+0000877387 00000 n 
+0000041497 00000 n 
+0000041527 00000 n 
+0000646145 00000 n 
+0000877303 00000 n 
+0000041578 00000 n 
+0000041611 00000 n 
+0000646462 00000 n 
+0000877164 00000 n 
+0000041658 00000 n 
+0000041702 00000 n 
+0000646652 00000 n 
+0000877080 00000 n 
+0000041753 00000 n 
+0000041778 00000 n 
+0000646843 00000 n 
+0000876981 00000 n 
+0000041829 00000 n 
+0000041858 00000 n 
+0000647412 00000 n 
+0000876882 00000 n 
+0000041909 00000 n 
+0000041939 00000 n 
+0000648107 00000 n 
+0000876798 00000 n 
+0000041990 00000 n 
+0000042023 00000 n 
+0000650123 00000 n 
+0000876700 00000 n 
+0000042070 00000 n 
+0000042135 00000 n 
+0000650313 00000 n 
+0000876561 00000 n 
+0000042182 00000 n 
+0000042230 00000 n 
+0000650503 00000 n 
+0000876477 00000 n 
+0000042281 00000 n 
+0000042306 00000 n 
+0000650694 00000 n 
+0000876378 00000 n 
+0000042357 00000 n 
+0000042386 00000 n 
+0000651393 00000 n 
+0000876279 00000 n 
+0000042437 00000 n 
+0000042467 00000 n 
+0000652342 00000 n 
+0000876195 00000 n 
+0000042518 00000 n 
+0000042551 00000 n 
+0000652595 00000 n 
+0000876056 00000 n 
+0000042598 00000 n 
+0000042644 00000 n 
+0000652785 00000 n 
+0000875972 00000 n 
+0000042695 00000 n 
+0000042720 00000 n 
+0000652976 00000 n 
+0000875873 00000 n 
+0000042771 00000 n 
+0000042800 00000 n 
+0000654057 00000 n 
+0000875774 00000 n 
+0000042851 00000 n 
+0000042881 00000 n 
+0000657475 00000 n 
+0000875675 00000 n 
+0000042932 00000 n 
+0000042964 00000 n 
+0000657728 00000 n 
+0000875591 00000 n 
+0000043015 00000 n 
+0000043048 00000 n 
+0000657981 00000 n 
+0000875452 00000 n 
+0000043095 00000 n 
+0000043139 00000 n 
+0000658171 00000 n 
+0000875368 00000 n 
+0000043190 00000 n 
+0000043215 00000 n 
+0000658361 00000 n 
+0000875269 00000 n 
+0000043266 00000 n 
+0000043295 00000 n 
+0000659060 00000 n 
+0000875170 00000 n 
+0000043346 00000 n 
+0000043376 00000 n 
+0000660008 00000 n 
+0000875071 00000 n 
+0000043427 00000 n 
+0000043459 00000 n 
+0000660262 00000 n 
+0000874987 00000 n 
+0000043510 00000 n 
+0000043543 00000 n 
+0000660515 00000 n 
+0000874848 00000 n 
+0000043590 00000 n 
+0000043628 00000 n 
+0000660705 00000 n 
+0000874764 00000 n 
+0000043679 00000 n 
+0000043704 00000 n 
+0000660895 00000 n 
+0000874665 00000 n 
+0000043755 00000 n 
+0000043784 00000 n 
+0000662970 00000 n 
+0000874566 00000 n 
+0000043835 00000 n 
+0000043865 00000 n 
+0000663536 00000 n 
+0000874467 00000 n 
+0000043916 00000 n 
+0000043948 00000 n 
+0000663726 00000 n 
+0000874383 00000 n 
+0000043999 00000 n 
+0000044032 00000 n 
+0000663978 00000 n 
+0000874244 00000 n 
+0000044079 00000 n 
+0000044117 00000 n 
+0000664167 00000 n 
+0000874160 00000 n 
+0000044168 00000 n 
+0000044193 00000 n 
+0000664358 00000 n 
+0000874061 00000 n 
+0000044244 00000 n 
+0000044273 00000 n 
+0000664927 00000 n 
+0000873962 00000 n 
+0000044324 00000 n 
+0000044354 00000 n 
+0000665622 00000 n 
+0000873878 00000 n 
+0000044405 00000 n 
+0000044438 00000 n 
+0000665874 00000 n 
+0000873739 00000 n 
+0000044485 00000 n 
+0000044523 00000 n 
+0000666063 00000 n 
+0000873655 00000 n 
+0000044574 00000 n 
+0000044599 00000 n 
+0000666253 00000 n 
+0000873556 00000 n 
+0000044650 00000 n 
+0000044679 00000 n 
+0000666695 00000 n 
+0000873472 00000 n 
+0000044730 00000 n 
+0000044760 00000 n 
+0000668693 00000 n 
+0000873333 00000 n 
+0000044807 00000 n 
+0000044844 00000 n 
+0000668883 00000 n 
+0000873249 00000 n 
+0000044895 00000 n 
+0000044920 00000 n 
+0000669073 00000 n 
+0000873150 00000 n 
+0000044971 00000 n 
+0000045000 00000 n 
+0000669518 00000 n 
+0000873051 00000 n 
+0000045051 00000 n 
+0000045081 00000 n 
+0000669960 00000 n 
+0000872967 00000 n 
+0000045132 00000 n 
+0000045165 00000 n 
+0000670277 00000 n 
+0000872828 00000 n 
+0000045212 00000 n 
+0000045250 00000 n 
+0000670467 00000 n 
+0000872744 00000 n 
+0000045301 00000 n 
+0000045326 00000 n 
+0000670658 00000 n 
+0000872645 00000 n 
+0000045377 00000 n 
+0000045406 00000 n 
+0000671357 00000 n 
+0000872561 00000 n 
+0000045457 00000 n 
+0000045487 00000 n 
+0000672367 00000 n 
+0000872422 00000 n 
+0000045534 00000 n 
+0000045574 00000 n 
+0000672557 00000 n 
+0000872338 00000 n 
+0000045625 00000 n 
+0000045650 00000 n 
+0000672747 00000 n 
+0000872239 00000 n 
+0000045701 00000 n 
+0000045730 00000 n 
+0000674597 00000 n 
+0000872155 00000 n 
+0000045781 00000 n 
+0000045811 00000 n 
+0000675099 00000 n 
+0000872016 00000 n 
+0000045858 00000 n 
+0000045901 00000 n 
+0000675289 00000 n 
+0000871932 00000 n 
+0000045952 00000 n 
+0000045977 00000 n 
+0000675479 00000 n 
+0000871833 00000 n 
+0000046028 00000 n 
+0000046057 00000 n 
+0000676050 00000 n 
+0000871734 00000 n 
+0000046108 00000 n 
+0000046138 00000 n 
+0000676746 00000 n 
+0000871650 00000 n 
+0000046189 00000 n 
+0000046222 00000 n 
+0000676999 00000 n 
+0000871511 00000 n 
+0000046269 00000 n 
+0000046311 00000 n 
+0000677188 00000 n 
+0000871427 00000 n 
+0000046362 00000 n 
+0000046387 00000 n 
+0000677379 00000 n 
+0000871328 00000 n 
+0000046438 00000 n 
+0000046467 00000 n 
+0000677823 00000 n 
+0000871244 00000 n 
+0000046518 00000 n 
+0000046548 00000 n 
+0000678329 00000 n 
+0000871105 00000 n 
+0000046595 00000 n 
+0000046631 00000 n 
+0000678519 00000 n 
+0000871021 00000 n 
+0000046682 00000 n 
+0000046707 00000 n 
+0000680446 00000 n 
+0000870922 00000 n 
+0000046758 00000 n 
+0000046787 00000 n 
+0000680889 00000 n 
+0000870838 00000 n 
+0000046838 00000 n 
+0000046868 00000 n 
+0000681332 00000 n 
+0000870740 00000 n 
+0000046915 00000 n 
+0000046982 00000 n 
+0000681521 00000 n 
+0000870601 00000 n 
+0000047029 00000 n 
+0000047068 00000 n 
+0000681709 00000 n 
+0000870517 00000 n 
+0000047119 00000 n 
+0000047144 00000 n 
+0000681900 00000 n 
+0000870418 00000 n 
+0000047195 00000 n 
+0000047224 00000 n 
+0000682600 00000 n 
+0000870319 00000 n 
+0000047275 00000 n 
+0000047305 00000 n 
+0000683548 00000 n 
+0000870235 00000 n 
+0000047356 00000 n 
+0000047388 00000 n 
+0000683801 00000 n 
+0000870096 00000 n 
+0000047435 00000 n 
+0000047476 00000 n 
+0000683991 00000 n 
+0000870012 00000 n 
+0000047527 00000 n 
+0000047552 00000 n 
+0000684182 00000 n 
+0000869913 00000 n 
+0000047603 00000 n 
+0000047632 00000 n 
+0000684880 00000 n 
+0000869829 00000 n 
+0000047683 00000 n 
+0000047713 00000 n 
+0000687272 00000 n 
+0000869690 00000 n 
+0000047760 00000 n 
+0000047801 00000 n 
+0000687462 00000 n 
+0000869606 00000 n 
+0000047852 00000 n 
+0000047877 00000 n 
+0000687652 00000 n 
+0000869507 00000 n 
+0000047928 00000 n 
+0000047957 00000 n 
+0000688096 00000 n 
+0000869408 00000 n 
+0000048008 00000 n 
+0000048038 00000 n 
+0000688539 00000 n 
+0000869324 00000 n 
+0000048089 00000 n 
+0000048122 00000 n 
+0000688729 00000 n 
+0000869226 00000 n 
+0000048169 00000 n 
+0000048241 00000 n 
+0000688919 00000 n 
+0000869087 00000 n 
+0000048288 00000 n 
+0000048325 00000 n 
+0000689107 00000 n 
+0000869003 00000 n 
+0000048376 00000 n 
+0000048401 00000 n 
+0000689297 00000 n 
+0000868904 00000 n 
+0000048452 00000 n 
+0000048481 00000 n 
+0000689742 00000 n 
+0000868805 00000 n 
+0000048532 00000 n 
+0000048562 00000 n 
+0000690184 00000 n 
+0000868706 00000 n 
+0000048613 00000 n 
+0000048645 00000 n 
+0000690373 00000 n 
+0000868622 00000 n 
+0000048696 00000 n 
+0000048729 00000 n 
+0000692138 00000 n 
+0000868483 00000 n 
+0000048776 00000 n 
+0000048811 00000 n 
+0000692328 00000 n 
+0000868399 00000 n 
+0000048862 00000 n 
+0000048887 00000 n 
+0000692581 00000 n 
+0000868300 00000 n 
+0000048938 00000 n 
+0000048967 00000 n 
+0000693025 00000 n 
+0000868216 00000 n 
+0000049018 00000 n 
+0000049048 00000 n 
+0000693531 00000 n 
+0000868077 00000 n 
+0000049095 00000 n 
+0000049129 00000 n 
+0000693720 00000 n 
+0000867993 00000 n 
+0000049180 00000 n 
+0000049205 00000 n 
+0000693910 00000 n 
+0000867894 00000 n 
+0000049256 00000 n 
+0000049285 00000 n 
+0000694354 00000 n 
+0000867795 00000 n 
+0000049336 00000 n 
+0000049366 00000 n 
+0000694797 00000 n 
+0000867711 00000 n 
+0000049417 00000 n 
+0000049449 00000 n 
+0000695112 00000 n 
+0000867572 00000 n 
+0000049496 00000 n 
+0000049535 00000 n 
+0000695302 00000 n 
+0000867488 00000 n 
+0000049586 00000 n 
+0000049611 00000 n 
+0000695492 00000 n 
+0000867389 00000 n 
+0000049662 00000 n 
+0000049691 00000 n 
+0000696190 00000 n 
+0000867290 00000 n 
+0000049742 00000 n 
+0000049772 00000 n 
+0000698573 00000 n 
+0000867191 00000 n 
+0000049823 00000 n 
+0000049855 00000 n 
+0000698762 00000 n 
+0000867107 00000 n 
+0000049906 00000 n 
+0000049939 00000 n 
+0000699014 00000 n 
+0000866968 00000 n 
+0000049986 00000 n 
+0000050025 00000 n 
+0000699204 00000 n 
+0000866884 00000 n 
+0000050076 00000 n 
+0000050101 00000 n 
+0000699395 00000 n 
+0000866785 00000 n 
+0000050152 00000 n 
+0000050181 00000 n 
+0000699967 00000 n 
+0000866701 00000 n 
+0000050232 00000 n 
+0000050262 00000 n 
+0000700724 00000 n 
+0000866562 00000 n 
+0000050309 00000 n 
+0000050349 00000 n 
+0000700912 00000 n 
+0000866478 00000 n 
+0000050400 00000 n 
+0000050425 00000 n 
+0000701103 00000 n 
+0000866379 00000 n 
+0000050476 00000 n 
+0000050505 00000 n 
+0000701802 00000 n 
+0000866280 00000 n 
+0000050556 00000 n 
+0000050586 00000 n 
+0000702750 00000 n 
+0000866181 00000 n 
+0000050637 00000 n 
+0000050669 00000 n 
+0000704729 00000 n 
+0000866097 00000 n 
+0000050720 00000 n 
+0000050753 00000 n 
+0000704982 00000 n 
+0000865958 00000 n 
+0000050800 00000 n 
+0000050840 00000 n 
+0000705172 00000 n 
+0000865874 00000 n 
+0000050891 00000 n 
+0000050916 00000 n 
+0000705363 00000 n 
+0000865775 00000 n 
+0000050967 00000 n 
+0000050996 00000 n 
+0000705936 00000 n 
+0000865691 00000 n 
+0000051047 00000 n 
+0000051077 00000 n 
+0000706695 00000 n 
+0000865552 00000 n 
+0000051124 00000 n 
+0000051161 00000 n 
+0000706885 00000 n 
+0000865468 00000 n 
+0000051212 00000 n 
+0000051237 00000 n 
+0000707076 00000 n 
+0000865369 00000 n 
+0000051288 00000 n 
+0000051317 00000 n 
+0000707648 00000 n 
+0000865270 00000 n 
+0000051368 00000 n 
+0000051398 00000 n 
+0000708408 00000 n 
+0000865186 00000 n 
+0000051449 00000 n 
+0000051481 00000 n 
+0000710214 00000 n 
+0000865047 00000 n 
+0000051528 00000 n 
+0000051565 00000 n 
+0000710404 00000 n 
+0000864963 00000 n 
+0000051616 00000 n 
+0000051641 00000 n 
+0000710594 00000 n 
+0000864864 00000 n 
+0000051692 00000 n 
+0000051721 00000 n 
+0000711038 00000 n 
+0000864765 00000 n 
+0000051772 00000 n 
+0000051802 00000 n 
+0000711481 00000 n 
+0000864681 00000 n 
+0000051853 00000 n 
+0000051881 00000 n 
+0000711734 00000 n 
+0000864542 00000 n 
+0000051928 00000 n 
+0000051966 00000 n 
+0000711924 00000 n 
+0000864458 00000 n 
+0000052017 00000 n 
+0000052042 00000 n 
+0000712115 00000 n 
+0000864359 00000 n 
+0000052093 00000 n 
+0000052122 00000 n 
+0000712687 00000 n 
+0000864260 00000 n 
+0000052173 00000 n 
+0000052203 00000 n 
+0000713383 00000 n 
+0000864176 00000 n 
+0000052254 00000 n 
+0000052287 00000 n 
+0000713635 00000 n 
+0000864037 00000 n 
+0000052334 00000 n 
+0000052373 00000 n 
+0000713825 00000 n 
+0000863953 00000 n 
+0000052424 00000 n 
+0000052449 00000 n 
+0000714015 00000 n 
+0000863854 00000 n 
+0000052500 00000 n 
+0000052529 00000 n 
+0000716170 00000 n 
+0000863755 00000 n 
+0000052580 00000 n 
+0000052610 00000 n 
+0000716735 00000 n 
+0000863671 00000 n 
+0000052661 00000 n 
+0000052694 00000 n 
+0000716988 00000 n 
+0000863532 00000 n 
+0000052741 00000 n 
+0000052774 00000 n 
+0000717178 00000 n 
+0000863448 00000 n 
+0000052825 00000 n 
+0000052850 00000 n 
+0000717369 00000 n 
+0000863349 00000 n 
+0000052901 00000 n 
+0000052930 00000 n 
+0000717813 00000 n 
+0000863250 00000 n 
+0000052981 00000 n 
+0000053011 00000 n 
+0000718256 00000 n 
+0000863151 00000 n 
+0000053062 00000 n 
+0000053094 00000 n 
+0000718573 00000 n 
+0000863067 00000 n 
+0000053145 00000 n 
+0000053178 00000 n 
+0000718826 00000 n 
+0000862928 00000 n 
+0000053225 00000 n 
+0000053262 00000 n 
+0000719016 00000 n 
+0000862844 00000 n 
+0000053313 00000 n 
+0000053338 00000 n 
+0000719206 00000 n 
+0000862745 00000 n 
+0000053389 00000 n 
+0000053418 00000 n 
+0000719903 00000 n 
+0000862646 00000 n 
+0000053469 00000 n 
+0000053499 00000 n 
+0000723055 00000 n 
+0000862547 00000 n 
+0000053550 00000 n 
+0000053582 00000 n 
+0000723182 00000 n 
+0000862448 00000 n 
+0000053633 00000 n 
+0000053685 00000 n 
+0000723942 00000 n 
+0000862364 00000 n 
+0000053736 00000 n 
+0000053769 00000 n 
+0000724195 00000 n 
+0000862225 00000 n 
+0000053816 00000 n 
+0000053851 00000 n 
+0000724385 00000 n 
+0000862141 00000 n 
+0000053902 00000 n 
+0000053927 00000 n 
+0000724575 00000 n 
+0000862042 00000 n 
+0000053978 00000 n 
+0000054007 00000 n 
+0000725398 00000 n 
+0000861943 00000 n 
+0000054058 00000 n 
+0000054088 00000 n 
+0000726599 00000 n 
+0000861844 00000 n 
+0000054139 00000 n 
+0000054171 00000 n 
+0000726981 00000 n 
+0000861760 00000 n 
+0000054222 00000 n 
+0000054255 00000 n 
+0000728885 00000 n 
+0000861621 00000 n 
+0000054302 00000 n 
+0000054336 00000 n 
+0000729075 00000 n 
+0000861537 00000 n 
+0000054387 00000 n 
+0000054412 00000 n 
+0000729265 00000 n 
+0000861438 00000 n 
+0000054463 00000 n 
+0000054492 00000 n 
+0000729965 00000 n 
+0000861339 00000 n 
+0000054543 00000 n 
+0000054573 00000 n 
+0000730910 00000 n 
+0000861240 00000 n 
+0000054624 00000 n 
+0000054656 00000 n 
+0000731100 00000 n 
+0000861156 00000 n 
+0000054707 00000 n 
+0000054740 00000 n 
+0000731353 00000 n 
+0000861017 00000 n 
+0000054787 00000 n 
+0000054821 00000 n 
+0000731543 00000 n 
+0000860933 00000 n 
+0000054872 00000 n 
+0000054897 00000 n 
+0000731734 00000 n 
+0000860834 00000 n 
+0000054948 00000 n 
+0000054977 00000 n 
+0000732306 00000 n 
+0000860735 00000 n 
+0000055028 00000 n 
+0000055058 00000 n 
+0000733002 00000 n 
+0000860636 00000 n 
+0000055109 00000 n 
+0000055141 00000 n 
+0000733382 00000 n 
+0000860552 00000 n 
+0000055192 00000 n 
+0000055225 00000 n 
+0000735254 00000 n 
+0000860413 00000 n 
+0000055272 00000 n 
+0000055314 00000 n 
+0000735444 00000 n 
+0000860329 00000 n 
+0000055365 00000 n 
+0000055390 00000 n 
+0000735634 00000 n 
+0000860230 00000 n 
+0000055441 00000 n 
+0000055470 00000 n 
+0000736335 00000 n 
+0000860131 00000 n 
+0000055521 00000 n 
+0000055551 00000 n 
+0000737409 00000 n 
+0000860047 00000 n 
+0000055602 00000 n 
+0000055627 00000 n 
+0000737662 00000 n 
+0000859908 00000 n 
+0000055674 00000 n 
+0000055710 00000 n 
+0000737852 00000 n 
+0000859824 00000 n 
+0000055761 00000 n 
+0000055786 00000 n 
+0000738043 00000 n 
+0000859725 00000 n 
+0000055837 00000 n 
+0000055866 00000 n 
+0000738487 00000 n 
+0000859626 00000 n 
+0000055917 00000 n 
+0000055947 00000 n 
+0000738930 00000 n 
+0000859542 00000 n 
+0000055998 00000 n 
+0000056031 00000 n 
+0000739183 00000 n 
+0000859403 00000 n 
+0000056078 00000 n 
+0000056113 00000 n 
+0000739373 00000 n 
+0000859319 00000 n 
+0000056164 00000 n 
+0000056189 00000 n 
+0000740783 00000 n 
+0000859220 00000 n 
+0000056240 00000 n 
+0000056269 00000 n 
+0000741226 00000 n 
+0000859136 00000 n 
+0000056320 00000 n 
+0000056350 00000 n 
+0000741669 00000 n 
+0000859038 00000 n 
+0000056397 00000 n 
+0000056467 00000 n 
+0000741858 00000 n 
+0000858899 00000 n 
+0000056514 00000 n 
+0000056545 00000 n 
+0000742046 00000 n 
+0000858815 00000 n 
+0000056596 00000 n 
+0000056621 00000 n 
+0000742237 00000 n 
+0000858716 00000 n 
+0000056672 00000 n 
+0000056701 00000 n 
+0000742682 00000 n 
+0000858632 00000 n 
+0000056752 00000 n 
+0000056782 00000 n 
+0000743187 00000 n 
+0000858493 00000 n 
+0000056829 00000 n 
+0000056861 00000 n 
+0000743377 00000 n 
+0000858409 00000 n 
+0000056912 00000 n 
+0000056937 00000 n 
+0000743567 00000 n 
+0000858310 00000 n 
+0000056988 00000 n 
+0000057017 00000 n 
+0000744011 00000 n 
+0000858226 00000 n 
+0000057068 00000 n 
+0000057098 00000 n 
+0000744517 00000 n 
+0000858087 00000 n 
+0000057145 00000 n 
+0000057179 00000 n 
+0000744707 00000 n 
+0000858003 00000 n 
+0000057230 00000 n 
+0000057255 00000 n 
+0000747253 00000 n 
+0000857904 00000 n 
+0000057306 00000 n 
+0000057335 00000 n 
+0000747696 00000 n 
+0000857820 00000 n 
+0000057386 00000 n 
+0000057416 00000 n 
+0000748202 00000 n 
+0000857696 00000 n 
+0000057463 00000 n 
+0000057499 00000 n 
+0000748392 00000 n 
+0000857612 00000 n 
+0000057550 00000 n 
+0000057575 00000 n 
+0000748583 00000 n 
+0000857513 00000 n 
+0000057626 00000 n 
+0000057655 00000 n 
+0000749027 00000 n 
+0000857429 00000 n 
+0000057706 00000 n 
+0000057736 00000 n 
+0000749470 00000 n 
+0000857305 00000 n 
+0000057779 00000 n 
+0000057829 00000 n 
+0000749597 00000 n 
+0000857221 00000 n 
+0000057876 00000 n 
+0000057930 00000 n 
+0000754061 00000 n 
+0000857122 00000 n 
+0000057977 00000 n 
+0000058036 00000 n 
+0000759055 00000 n 
+0000857023 00000 n 
+0000058083 00000 n 
+0000058136 00000 n 
+0000777052 00000 n 
+0000856924 00000 n 
+0000058183 00000 n 
+0000058227 00000 n 
+0000778829 00000 n 
+0000856784 00000 n 
+0000058274 00000 n 
+0000058304 00000 n 
+0000779019 00000 n 
+0000856700 00000 n 
+0000058355 00000 n 
+0000058380 00000 n 
+0000779209 00000 n 
+0000856601 00000 n 
+0000058431 00000 n 
+0000058460 00000 n 
+0000780860 00000 n 
+0000856502 00000 n 
+0000058511 00000 n 
+0000058543 00000 n 
+0000781176 00000 n 
+0000856418 00000 n 
+0000058594 00000 n 
+0000058622 00000 n 
+0000787226 00000 n 
+0000856293 00000 n 
+0000058669 00000 n 
+0000058699 00000 n 
+0000787415 00000 n 
+0000856209 00000 n 
+0000058750 00000 n 
+0000058775 00000 n 
+0000787604 00000 n 
+0000856110 00000 n 
+0000058826 00000 n 
+0000058855 00000 n 
+0000792070 00000 n 
+0000856011 00000 n 
+0000058906 00000 n 
+0000058938 00000 n 
+0000792452 00000 n 
+0000855927 00000 n 
+0000058989 00000 n 
+0000059017 00000 n 
+0000059320 00000 n 
+0000059753 00000 n 
+0000059071 00000 n 
+0000059444 00000 n 
+0000059507 00000 n 
+0000059570 00000 n 
+0000852732 00000 n 
+0000834253 00000 n 
+0000852557 00000 n 
+0000853550 00000 n 
+0000060500 00000 n 
+0000060313 00000 n 
+0000059827 00000 n 
+0000060437 00000 n 
+0000833110 00000 n 
+0000811516 00000 n 
+0000832935 00000 n 
+0000121014 00000 n 
+0000104043 00000 n 
+0000060588 00000 n 
+0000120889 00000 n 
+0000105133 00000 n 
+0000105279 00000 n 
+0000105424 00000 n 
+0000105568 00000 n 
+0000105712 00000 n 
+0000105858 00000 n 
+0000106003 00000 n 
+0000106149 00000 n 
+0000106294 00000 n 
+0000106441 00000 n 
+0000106587 00000 n 
+0000106743 00000 n 
+0000106898 00000 n 
+0000107052 00000 n 
+0000107205 00000 n 
+0000107371 00000 n 
+0000107536 00000 n 
+0000107693 00000 n 
+0000107850 00000 n 
+0000107997 00000 n 
+0000108143 00000 n 
+0000108288 00000 n 
+0000108433 00000 n 
+0000108580 00000 n 
+0000108726 00000 n 
+0000108873 00000 n 
+0000109019 00000 n 
+0000109166 00000 n 
+0000109312 00000 n 
+0000109458 00000 n 
+0000109604 00000 n 
+0000109749 00000 n 
+0000109893 00000 n 
+0000110048 00000 n 
+0000110202 00000 n 
+0000110359 00000 n 
+0000110516 00000 n 
+0000110675 00000 n 
+0000110834 00000 n 
+0000110993 00000 n 
+0000111151 00000 n 
+0000111298 00000 n 
+0000111444 00000 n 
+0000111591 00000 n 
+0000111737 00000 n 
+0000111882 00000 n 
+0000112026 00000 n 
+0000112173 00000 n 
+0000112319 00000 n 
+0000112465 00000 n 
+0000112611 00000 n 
+0000112759 00000 n 
+0000112906 00000 n 
+0000113054 00000 n 
+0000113201 00000 n 
+0000113360 00000 n 
+0000113519 00000 n 
+0000113667 00000 n 
+0000113814 00000 n 
+0000113961 00000 n 
+0000114107 00000 n 
+0000114255 00000 n 
+0000114402 00000 n 
+0000114550 00000 n 
+0000114697 00000 n 
+0000114845 00000 n 
+0000114992 00000 n 
+0000115140 00000 n 
+0000115287 00000 n 
+0000115435 00000 n 
+0000115582 00000 n 
+0000115730 00000 n 
+0000115877 00000 n 
+0000116024 00000 n 
+0000116170 00000 n 
+0000116329 00000 n 
+0000116487 00000 n 
+0000116635 00000 n 
+0000116782 00000 n 
+0000116930 00000 n 
+0000117077 00000 n 
+0000117225 00000 n 
+0000117372 00000 n 
+0000117520 00000 n 
+0000117667 00000 n 
+0000117815 00000 n 
+0000117962 00000 n 
+0000118108 00000 n 
+0000118253 00000 n 
+0000118401 00000 n 
+0000118548 00000 n 
+0000118696 00000 n 
+0000118843 00000 n 
+0000118990 00000 n 
+0000119137 00000 n 
+0000119285 00000 n 
+0000119432 00000 n 
+0000119580 00000 n 
+0000119727 00000 n 
+0000119874 00000 n 
+0000120020 00000 n 
+0000120164 00000 n 
+0000120307 00000 n 
+0000120453 00000 n 
+0000120598 00000 n 
+0000120744 00000 n 
+0000810897 00000 n 
+0000798857 00000 n 
+0000810721 00000 n 
+0000242606 00000 n 
+0000245142 00000 n 
+0000245330 00000 n 
+0000245455 00000 n 
+0000254446 00000 n 
+0000254571 00000 n 
+0000258710 00000 n 
+0000258835 00000 n 
+0000264483 00000 n 
+0000264608 00000 n 
+0000266878 00000 n 
+0000269808 00000 n 
+0000272206 00000 n 
+0000276596 00000 n 
+0000279371 00000 n 
+0000283720 00000 n 
+0000286125 00000 n 
+0000357011 00000 n 
+0000364666 00000 n 
+0000366286 00000 n 
+0000366411 00000 n 
+0000367990 00000 n 
+0000374828 00000 n 
+0000387378 00000 n 
+0000393540 00000 n 
+0000397576 00000 n 
+0000403201 00000 n 
+0000410355 00000 n 
+0000410607 00000 n 
+0000414771 00000 n 
+0000418074 00000 n 
+0000420094 00000 n 
+0000425271 00000 n 
+0000432222 00000 n 
+0000434687 00000 n 
+0000438523 00000 n 
+0000440861 00000 n 
+0000444580 00000 n 
+0000444832 00000 n 
+0000446158 00000 n 
+0000449068 00000 n 
+0000451089 00000 n 
+0000455173 00000 n 
+0000459224 00000 n 
+0000462422 00000 n 
+0000464504 00000 n 
+0000468754 00000 n 
+0000471466 00000 n 
+0000474612 00000 n 
+0000477075 00000 n 
+0000479875 00000 n 
+0000481568 00000 n 
+0000484535 00000 n 
+0000179464 00000 n 
+0000162067 00000 n 
+0000121116 00000 n 
+0000179401 00000 n 
+0000163193 00000 n 
+0000163341 00000 n 
+0000163488 00000 n 
+0000163636 00000 n 
+0000163783 00000 n 
+0000163931 00000 n 
+0000164078 00000 n 
+0000164226 00000 n 
+0000164373 00000 n 
+0000164521 00000 n 
+0000164668 00000 n 
+0000164816 00000 n 
+0000164963 00000 n 
+0000165110 00000 n 
+0000165256 00000 n 
+0000165403 00000 n 
+0000165550 00000 n 
+0000165711 00000 n 
+0000165871 00000 n 
+0000166019 00000 n 
+0000166166 00000 n 
+0000166314 00000 n 
+0000166461 00000 n 
+0000166609 00000 n 
+0000166756 00000 n 
+0000166904 00000 n 
+0000167051 00000 n 
+0000167198 00000 n 
+0000167344 00000 n 
+0000167492 00000 n 
+0000167639 00000 n 
+0000167787 00000 n 
+0000167934 00000 n 
+0000168082 00000 n 
+0000168229 00000 n 
+0000168377 00000 n 
+0000168524 00000 n 
+0000168672 00000 n 
+0000168819 00000 n 
+0000168967 00000 n 
+0000169114 00000 n 
+0000169260 00000 n 
+0000169405 00000 n 
+0000169553 00000 n 
+0000169700 00000 n 
+0000169848 00000 n 
+0000169995 00000 n 
+0000170143 00000 n 
+0000170290 00000 n 
+0000170438 00000 n 
+0000170585 00000 n 
+0000170733 00000 n 
+0000170880 00000 n 
+0000171028 00000 n 
+0000171175 00000 n 
+0000171321 00000 n 
+0000171466 00000 n 
+0000171614 00000 n 
+0000171761 00000 n 
+0000171909 00000 n 
+0000172056 00000 n 
+0000172204 00000 n 
+0000172351 00000 n 
+0000172499 00000 n 
+0000172646 00000 n 
+0000172793 00000 n 
+0000172940 00000 n 
+0000173088 00000 n 
+0000173235 00000 n 
+0000173381 00000 n 
+0000173526 00000 n 
+0000173674 00000 n 
+0000173821 00000 n 
+0000173969 00000 n 
+0000174116 00000 n 
+0000174264 00000 n 
+0000174411 00000 n 
+0000174559 00000 n 
+0000174706 00000 n 
+0000174854 00000 n 
+0000175001 00000 n 
+0000175149 00000 n 
+0000175296 00000 n 
+0000175442 00000 n 
+0000175587 00000 n 
+0000175735 00000 n 
+0000175882 00000 n 
+0000176030 00000 n 
+0000176177 00000 n 
+0000176325 00000 n 
+0000176472 00000 n 
+0000176620 00000 n 
+0000176767 00000 n 
+0000176915 00000 n 
+0000177062 00000 n 
+0000177210 00000 n 
+0000177357 00000 n 
+0000177502 00000 n 
+0000177647 00000 n 
+0000177794 00000 n 
+0000177941 00000 n 
+0000178088 00000 n 
+0000178235 00000 n 
+0000178382 00000 n 
+0000178528 00000 n 
+0000178674 00000 n 
+0000178819 00000 n 
+0000178965 00000 n 
+0000179110 00000 n 
+0000179256 00000 n 
+0000486299 00000 n 
+0000488383 00000 n 
+0000492118 00000 n 
+0000493823 00000 n 
+0000497418 00000 n 
+0000499573 00000 n 
+0000503374 00000 n 
+0000501286 00000 n 
+0000509229 00000 n 
+0000509419 00000 n 
+0000513077 00000 n 
+0000516111 00000 n 
+0000519906 00000 n 
+0000521870 00000 n 
+0000525435 00000 n 
+0000527528 00000 n 
+0000531260 00000 n 
+0000533220 00000 n 
+0000539892 00000 n 
+0000546023 00000 n 
+0000548915 00000 n 
+0000550616 00000 n 
+0000552323 00000 n 
+0000555833 00000 n 
+0000557915 00000 n 
+0000560763 00000 n 
+0000562348 00000 n 
+0000564056 00000 n 
+0000567226 00000 n 
+0000570138 00000 n 
+0000575676 00000 n 
+0000579874 00000 n 
+0000582471 00000 n 
+0000586040 00000 n 
+0000588507 00000 n 
+0000592573 00000 n 
+0000595105 00000 n 
+0000599351 00000 n 
+0000601058 00000 n 
+0000604029 00000 n 
+0000606310 00000 n 
+0000609166 00000 n 
+0000610498 00000 n 
+0000611827 00000 n 
+0000615058 00000 n 
+0000616575 00000 n 
+0000618472 00000 n 
+0000621388 00000 n 
+0000622909 00000 n 
+0000623032 00000 n 
+0000627222 00000 n 
+0000628552 00000 n 
+0000633872 00000 n 
+0000636405 00000 n 
+0000640034 00000 n 
+0000236166 00000 n 
+0000219689 00000 n 
+0000179552 00000 n 
+0000236103 00000 n 
+0000220761 00000 n 
+0000220909 00000 n 
+0000221056 00000 n 
+0000221204 00000 n 
+0000221351 00000 n 
+0000221499 00000 n 
+0000221646 00000 n 
+0000221794 00000 n 
+0000221941 00000 n 
+0000222089 00000 n 
+0000222236 00000 n 
+0000222384 00000 n 
+0000222531 00000 n 
+0000222678 00000 n 
+0000222824 00000 n 
+0000222972 00000 n 
+0000223119 00000 n 
+0000223267 00000 n 
+0000223414 00000 n 
+0000223562 00000 n 
+0000223709 00000 n 
+0000223857 00000 n 
+0000224004 00000 n 
+0000224152 00000 n 
+0000224299 00000 n 
+0000224447 00000 n 
+0000224594 00000 n 
+0000224741 00000 n 
+0000224887 00000 n 
+0000225035 00000 n 
+0000225182 00000 n 
+0000225330 00000 n 
+0000225477 00000 n 
+0000225625 00000 n 
+0000225772 00000 n 
+0000225920 00000 n 
+0000226067 00000 n 
+0000226215 00000 n 
+0000226362 00000 n 
+0000226510 00000 n 
+0000226657 00000 n 
+0000226803 00000 n 
+0000226948 00000 n 
+0000227096 00000 n 
+0000227243 00000 n 
+0000227391 00000 n 
+0000227538 00000 n 
+0000227686 00000 n 
+0000227833 00000 n 
+0000227981 00000 n 
+0000228128 00000 n 
+0000228276 00000 n 
+0000228423 00000 n 
+0000228571 00000 n 
+0000228718 00000 n 
+0000228864 00000 n 
+0000229009 00000 n 
+0000229157 00000 n 
+0000229304 00000 n 
+0000229450 00000 n 
+0000229597 00000 n 
+0000229745 00000 n 
+0000229892 00000 n 
+0000230040 00000 n 
+0000230187 00000 n 
+0000230335 00000 n 
+0000230482 00000 n 
+0000230630 00000 n 
+0000230777 00000 n 
+0000230923 00000 n 
+0000231068 00000 n 
+0000231216 00000 n 
+0000231363 00000 n 
+0000231511 00000 n 
+0000231658 00000 n 
+0000231806 00000 n 
+0000231953 00000 n 
+0000232101 00000 n 
+0000232248 00000 n 
+0000232396 00000 n 
+0000232543 00000 n 
+0000232691 00000 n 
+0000232838 00000 n 
+0000232984 00000 n 
+0000233129 00000 n 
+0000233276 00000 n 
+0000233423 00000 n 
+0000233571 00000 n 
+0000233718 00000 n 
+0000233866 00000 n 
+0000234013 00000 n 
+0000234169 00000 n 
+0000234324 00000 n 
+0000234472 00000 n 
+0000234619 00000 n 
+0000234767 00000 n 
+0000234914 00000 n 
+0000235061 00000 n 
+0000235207 00000 n 
+0000235363 00000 n 
+0000235518 00000 n 
+0000235665 00000 n 
+0000235811 00000 n 
+0000235957 00000 n 
+0000641929 00000 n 
+0000644753 00000 n 
+0000646336 00000 n 
+0000648234 00000 n 
+0000650187 00000 n 
+0000652469 00000 n 
+0000657855 00000 n 
+0000660389 00000 n 
+0000663853 00000 n 
+0000665749 00000 n 
+0000667071 00000 n 
+0000670151 00000 n 
+0000672241 00000 n 
+0000674973 00000 n 
+0000676873 00000 n 
+0000678203 00000 n 
+0000681269 00000 n 
+0000681395 00000 n 
+0000683675 00000 n 
+0000687146 00000 n 
+0000688666 00000 n 
+0000688793 00000 n 
+0000690500 00000 n 
+0000693405 00000 n 
+0000694986 00000 n 
+0000698888 00000 n 
+0000700600 00000 n 
+0000704856 00000 n 
+0000706569 00000 n 
+0000708599 00000 n 
+0000711608 00000 n 
+0000713509 00000 n 
+0000716862 00000 n 
+0000718700 00000 n 
+0000724069 00000 n 
+0000727108 00000 n 
+0000731227 00000 n 
+0000733509 00000 n 
+0000737536 00000 n 
+0000739057 00000 n 
+0000741606 00000 n 
+0000741732 00000 n 
+0000743061 00000 n 
+0000744391 00000 n 
+0000748076 00000 n 
+0000749407 00000 n 
+0000749534 00000 n 
+0000753999 00000 n 
+0000755645 00000 n 
+0000773974 00000 n 
+0000778766 00000 n 
+0000787163 00000 n 
+0000241574 00000 n 
+0000239941 00000 n 
+0000236254 00000 n 
+0000241449 00000 n 
+0000240149 00000 n 
+0000240309 00000 n 
+0000240468 00000 n 
+0000240632 00000 n 
+0000240795 00000 n 
+0000240957 00000 n 
+0000241119 00000 n 
+0000241284 00000 n 
+0000303764 00000 n 
+0000304458 00000 n 
+0000331064 00000 n 
+0000331637 00000 n 
+0000242794 00000 n 
+0000242482 00000 n 
+0000241676 00000 n 
+0000242731 00000 n 
+0000853675 00000 n 
+0000248731 00000 n 
+0000245018 00000 n 
+0000242896 00000 n 
+0000245267 00000 n 
+0000245579 00000 n 
+0000245642 00000 n 
+0000245705 00000 n 
+0000245768 00000 n 
+0000245832 00000 n 
+0000245895 00000 n 
+0000245958 00000 n 
+0000246022 00000 n 
+0000246086 00000 n 
+0000246149 00000 n 
+0000246212 00000 n 
+0000246275 00000 n 
+0000246338 00000 n 
+0000246401 00000 n 
+0000246464 00000 n 
+0000246528 00000 n 
+0000246592 00000 n 
+0000246655 00000 n 
+0000246718 00000 n 
+0000246782 00000 n 
+0000246846 00000 n 
+0000246909 00000 n 
+0000246972 00000 n 
+0000247035 00000 n 
+0000247098 00000 n 
+0000003662 00000 f 
+0000798767 00000 n 
+0000247161 00000 n 
+0000247224 00000 n 
+0000247287 00000 n 
+0000247350 00000 n 
+0000247413 00000 n 
+0000247477 00000 n 
+0000247540 00000 n 
+0000247603 00000 n 
+0000247666 00000 n 
+0000247729 00000 n 
+0000247791 00000 n 
+0000247854 00000 n 
+0000247917 00000 n 
+0000247979 00000 n 
+0000248042 00000 n 
+0000248105 00000 n 
+0000248167 00000 n 
+0000248230 00000 n 
+0000248293 00000 n 
+0000248356 00000 n 
+0000248419 00000 n 
+0000248481 00000 n 
+0000248544 00000 n 
+0000248606 00000 n 
+0000248669 00000 n 
+0000254945 00000 n 
+0000251296 00000 n 
+0000248847 00000 n 
+0000251420 00000 n 
+0000251483 00000 n 
+0000251546 00000 n 
+0000251609 00000 n 
+0000251673 00000 n 
+0000251736 00000 n 
+0000251798 00000 n 
+0000251862 00000 n 
+0000251925 00000 n 
+0000251988 00000 n 
+0000252052 00000 n 
+0000252115 00000 n 
+0000252178 00000 n 
+0000252241 00000 n 
+0000252304 00000 n 
+0000252368 00000 n 
+0000252430 00000 n 
+0000252492 00000 n 
+0000252555 00000 n 
+0000252619 00000 n 
+0000252682 00000 n 
+0000252745 00000 n 
+0000252808 00000 n 
+0000252871 00000 n 
+0000252934 00000 n 
+0000252997 00000 n 
+0000253060 00000 n 
+0000253123 00000 n 
+0000253186 00000 n 
+0000253249 00000 n 
+0000253312 00000 n 
+0000253375 00000 n 
+0000253438 00000 n 
+0000253500 00000 n 
+0000253563 00000 n 
+0000253626 00000 n 
+0000253689 00000 n 
+0000253752 00000 n 
+0000253815 00000 n 
+0000253878 00000 n 
+0000253941 00000 n 
+0000254004 00000 n 
+0000254067 00000 n 
+0000254130 00000 n 
+0000254193 00000 n 
+0000254256 00000 n 
+0000254319 00000 n 
+0000254382 00000 n 
+0000254695 00000 n 
+0000254758 00000 n 
+0000254820 00000 n 
+0000254882 00000 n 
+0000261241 00000 n 
+0000258018 00000 n 
+0000255061 00000 n 
+0000258142 00000 n 
+0000258205 00000 n 
+0000258267 00000 n 
+0000258329 00000 n 
+0000258393 00000 n 
+0000258456 00000 n 
+0000258520 00000 n 
+0000258583 00000 n 
+0000258647 00000 n 
+0000258959 00000 n 
+0000259022 00000 n 
+0000259086 00000 n 
+0000259150 00000 n 
+0000259214 00000 n 
+0000259277 00000 n 
+0000259341 00000 n 
+0000259405 00000 n 
+0000259469 00000 n 
+0000259533 00000 n 
+0000259596 00000 n 
+0000259660 00000 n 
+0000259724 00000 n 
+0000259787 00000 n 
+0000259851 00000 n 
+0000259915 00000 n 
+0000259978 00000 n 
+0000260041 00000 n 
+0000260104 00000 n 
+0000260167 00000 n 
+0000260231 00000 n 
+0000260295 00000 n 
+0000260359 00000 n 
+0000260423 00000 n 
+0000260486 00000 n 
+0000260549 00000 n 
+0000260612 00000 n 
+0000260676 00000 n 
+0000260739 00000 n 
+0000260802 00000 n 
+0000260865 00000 n 
+0000260928 00000 n 
+0000260991 00000 n 
+0000261054 00000 n 
+0000261116 00000 n 
+0000261178 00000 n 
+0000267376 00000 n 
+0000263568 00000 n 
+0000261357 00000 n 
+0000264041 00000 n 
+0000264104 00000 n 
+0000264167 00000 n 
+0000264231 00000 n 
+0000263722 00000 n 
+0000264294 00000 n 
+0000264357 00000 n 
+0000264420 00000 n 
+0000263882 00000 n 
+0000264671 00000 n 
+0000264795 00000 n 
+0000264858 00000 n 
+0000264983 00000 n 
+0000265047 00000 n 
+0000265172 00000 n 
+0000265235 00000 n 
+0000265297 00000 n 
+0000003666 00000 f 
+0000798672 00000 n 
+0000265360 00000 n 
+0000265424 00000 n 
+0000000000 00000 f 
+0000798574 00000 n 
+0000265488 00000 n 
+0000265552 00000 n 
+0000265616 00000 n 
+0000265741 00000 n 
+0000265804 00000 n 
+0000265866 00000 n 
+0000265928 00000 n 
+0000265991 00000 n 
+0000266055 00000 n 
+0000266119 00000 n 
+0000266183 00000 n 
+0000266246 00000 n 
+0000266309 00000 n 
+0000266372 00000 n 
+0000266436 00000 n 
+0000266499 00000 n 
+0000266562 00000 n 
+0000266626 00000 n 
+0000266690 00000 n 
+0000266815 00000 n 
+0000266941 00000 n 
+0000267065 00000 n 
+0000267128 00000 n 
+0000267253 00000 n 
+0000267314 00000 n 
+0000274093 00000 n 
+0000268678 00000 n 
+0000267520 00000 n 
+0000268864 00000 n 
+0000268927 00000 n 
+0000268988 00000 n 
+0000269051 00000 n 
+0000269115 00000 n 
+0000269179 00000 n 
+0000269304 00000 n 
+0000269367 00000 n 
+0000269430 00000 n 
+0000269493 00000 n 
+0000269556 00000 n 
+0000269620 00000 n 
+0000269745 00000 n 
+0000269871 00000 n 
+0000269996 00000 n 
+0000270059 00000 n 
+0000270183 00000 n 
+0000270246 00000 n 
+0000270372 00000 n 
+0000270435 00000 n 
+0000270498 00000 n 
+0000270562 00000 n 
+0000270626 00000 n 
+0000270690 00000 n 
+0000270754 00000 n 
+0000270818 00000 n 
+0000270882 00000 n 
+0000270946 00000 n 
+0000271071 00000 n 
+0000271134 00000 n 
+0000271197 00000 n 
+0000271260 00000 n 
+0000271322 00000 n 
+0000271386 00000 n 
+0000271448 00000 n 
+0000271510 00000 n 
+0000271573 00000 n 
+0000271637 00000 n 
+0000271701 00000 n 
+0000271764 00000 n 
+0000271827 00000 n 
+0000271890 00000 n 
+0000271953 00000 n 
+0000272079 00000 n 
+0000272142 00000 n 
+0000272269 00000 n 
+0000272395 00000 n 
+0000272458 00000 n 
+0000272584 00000 n 
+0000272647 00000 n 
+0000272772 00000 n 
+0000272835 00000 n 
+0000272898 00000 n 
+0000272962 00000 n 
+0000273025 00000 n 
+0000273089 00000 n 
+0000273153 00000 n 
+0000273217 00000 n 
+0000273281 00000 n 
+0000273345 00000 n 
+0000273471 00000 n 
+0000273534 00000 n 
+0000273597 00000 n 
+0000273660 00000 n 
+0000273722 00000 n 
+0000273785 00000 n 
+0000273847 00000 n 
+0000273909 00000 n 
+0000273971 00000 n 
+0000274032 00000 n 
+0000279433 00000 n 
+0000275902 00000 n 
+0000274237 00000 n 
+0000276026 00000 n 
+0000276089 00000 n 
+0000276152 00000 n 
+0000276215 00000 n 
+0000276279 00000 n 
+0000276343 00000 n 
+0000276469 00000 n 
+0000276532 00000 n 
+0000276659 00000 n 
+0000276785 00000 n 
+0000276848 00000 n 
+0000276974 00000 n 
+0000277038 00000 n 
+0000277163 00000 n 
+0000277226 00000 n 
+0000277352 00000 n 
+0000277415 00000 n 
+0000277478 00000 n 
+0000277541 00000 n 
+0000277605 00000 n 
+0000277667 00000 n 
+0000277729 00000 n 
+0000277792 00000 n 
+0000277855 00000 n 
+0000277918 00000 n 
+0000277981 00000 n 
+0000278044 00000 n 
+0000278107 00000 n 
+0000278170 00000 n 
+0000278234 00000 n 
+0000278297 00000 n 
+0000278361 00000 n 
+0000278424 00000 n 
+0000278487 00000 n 
+0000278549 00000 n 
+0000278612 00000 n 
+0000278676 00000 n 
+0000278738 00000 n 
+0000278801 00000 n 
+0000278865 00000 n 
+0000278928 00000 n 
+0000278991 00000 n 
+0000279055 00000 n 
+0000279118 00000 n 
+0000279181 00000 n 
+0000279245 00000 n 
+0000279308 00000 n 
+0000853800 00000 n 
+0000286187 00000 n 
+0000281002 00000 n 
+0000279563 00000 n 
+0000281126 00000 n 
+0000281189 00000 n 
+0000281315 00000 n 
+0000281378 00000 n 
+0000281504 00000 n 
+0000281567 00000 n 
+0000281693 00000 n 
+0000281756 00000 n 
+0000281819 00000 n 
+0000281882 00000 n 
+0000281946 00000 n 
+0000282010 00000 n 
+0000282074 00000 n 
+0000282138 00000 n 
+0000282202 00000 n 
+0000282265 00000 n 
+0000282391 00000 n 
+0000282454 00000 n 
+0000282517 00000 n 
+0000282580 00000 n 
+0000282643 00000 n 
+0000282707 00000 n 
+0000282770 00000 n 
+0000282833 00000 n 
+0000282896 00000 n 
+0000282960 00000 n 
+0000283024 00000 n 
+0000283087 00000 n 
+0000283150 00000 n 
+0000283213 00000 n 
+0000283277 00000 n 
+0000283341 00000 n 
+0000283466 00000 n 
+0000283529 00000 n 
+0000283593 00000 n 
+0000283657 00000 n 
+0000283783 00000 n 
+0000283909 00000 n 
+0000283972 00000 n 
+0000284098 00000 n 
+0000284162 00000 n 
+0000284288 00000 n 
+0000284351 00000 n 
+0000284414 00000 n 
+0000284477 00000 n 
+0000284541 00000 n 
+0000284605 00000 n 
+0000284669 00000 n 
+0000284733 00000 n 
+0000284797 00000 n 
+0000284861 00000 n 
+0000284987 00000 n 
+0000285050 00000 n 
+0000285113 00000 n 
+0000285176 00000 n 
+0000285239 00000 n 
+0000285303 00000 n 
+0000285366 00000 n 
+0000285429 00000 n 
+0000285492 00000 n 
+0000285556 00000 n 
+0000285620 00000 n 
+0000285683 00000 n 
+0000285746 00000 n 
+0000285809 00000 n 
+0000285873 00000 n 
+0000285999 00000 n 
+0000286062 00000 n 
+0000288861 00000 n 
+0000304521 00000 n 
+0000288707 00000 n 
+0000286331 00000 n 
+0000303575 00000 n 
+0000303701 00000 n 
+0000303828 00000 n 
+0000303891 00000 n 
+0000303251 00000 n 
+0000303954 00000 n 
+0000304017 00000 n 
+0000304080 00000 n 
+0000304143 00000 n 
+0000304207 00000 n 
+0000304271 00000 n 
+0000303410 00000 n 
+0000304333 00000 n 
+0000304395 00000 n 
+0000297228 00000 n 
+0000297469 00000 n 
+0000297550 00000 n 
+0000298592 00000 n 
+0000298615 00000 n 
+0000298983 00000 n 
+0000303228 00000 n 
+0000307364 00000 n 
+0000320261 00000 n 
+0000334600 00000 n 
+0000331761 00000 n 
+0000307210 00000 n 
+0000304666 00000 n 
+0000330555 00000 n 
+0000330618 00000 n 
+0000330681 00000 n 
+0000330745 00000 n 
+0000330809 00000 n 
+0000330873 00000 n 
+0000330937 00000 n 
+0000331000 00000 n 
+0000330230 00000 n 
+0000331127 00000 n 
+0000331190 00000 n 
+0000331253 00000 n 
+0000331317 00000 n 
+0000331381 00000 n 
+0000331445 00000 n 
+0000331509 00000 n 
+0000331573 00000 n 
+0000330394 00000 n 
+0000331699 00000 n 
+0000315829 00000 n 
+0000316074 00000 n 
+0000316155 00000 n 
+0000317197 00000 n 
+0000317220 00000 n 
+0000317524 00000 n 
+0000320238 00000 n 
+0000324806 00000 n 
+0000325013 00000 n 
+0000325094 00000 n 
+0000326136 00000 n 
+0000326159 00000 n 
+0000326506 00000 n 
+0000330207 00000 n 
+0000358022 00000 n 
+0000334455 00000 n 
+0000331920 00000 n 
+0000356758 00000 n 
+0000356821 00000 n 
+0000356884 00000 n 
+0000356594 00000 n 
+0000356947 00000 n 
+0000357137 00000 n 
+0000357200 00000 n 
+0000357263 00000 n 
+0000357326 00000 n 
+0000357389 00000 n 
+0000357453 00000 n 
+0000357515 00000 n 
+0000357578 00000 n 
+0000357642 00000 n 
+0000357705 00000 n 
+0000357768 00000 n 
+0000357832 00000 n 
+0000357895 00000 n 
+0000357958 00000 n 
+0000351874 00000 n 
+0000352085 00000 n 
+0000352166 00000 n 
+0000353208 00000 n 
+0000353232 00000 n 
+0000353558 00000 n 
+0000356571 00000 n 
+0000364728 00000 n 
+0000361250 00000 n 
+0000358167 00000 n 
+0000361374 00000 n 
+0000361437 00000 n 
+0000361500 00000 n 
+0000361563 00000 n 
+0000361627 00000 n 
+0000361689 00000 n 
+0000361753 00000 n 
+0000361816 00000 n 
+0000361880 00000 n 
+0000361943 00000 n 
+0000362006 00000 n 
+0000362069 00000 n 
+0000362133 00000 n 
+0000362195 00000 n 
+0000362259 00000 n 
+0000362322 00000 n 
+0000362386 00000 n 
+0000362449 00000 n 
+0000362513 00000 n 
+0000362576 00000 n 
+0000362640 00000 n 
+0000362702 00000 n 
+0000362766 00000 n 
+0000362829 00000 n 
+0000362891 00000 n 
+0000362954 00000 n 
+0000363018 00000 n 
+0000363081 00000 n 
+0000363145 00000 n 
+0000363208 00000 n 
+0000363272 00000 n 
+0000363335 00000 n 
+0000363399 00000 n 
+0000363462 00000 n 
+0000363525 00000 n 
+0000363588 00000 n 
+0000363652 00000 n 
+0000363715 00000 n 
+0000363779 00000 n 
+0000363842 00000 n 
+0000363906 00000 n 
+0000363968 00000 n 
+0000364031 00000 n 
+0000364094 00000 n 
+0000364158 00000 n 
+0000364221 00000 n 
+0000364285 00000 n 
+0000364348 00000 n 
+0000364412 00000 n 
+0000364475 00000 n 
+0000364539 00000 n 
+0000364602 00000 n 
+0000368992 00000 n 
+0000365973 00000 n 
+0000364816 00000 n 
+0000366097 00000 n 
+0000366160 00000 n 
+0000366474 00000 n 
+0000366600 00000 n 
+0000366663 00000 n 
+0000366789 00000 n 
+0000366853 00000 n 
+0000366979 00000 n 
+0000367042 00000 n 
+0000367167 00000 n 
+0000367230 00000 n 
+0000367293 00000 n 
+0000367356 00000 n 
+0000367420 00000 n 
+0000367483 00000 n 
+0000367546 00000 n 
+0000367610 00000 n 
+0000367673 00000 n 
+0000367736 00000 n 
+0000367800 00000 n 
+0000367863 00000 n 
+0000367926 00000 n 
+0000368053 00000 n 
+0000368178 00000 n 
+0000368240 00000 n 
+0000368365 00000 n 
+0000368429 00000 n 
+0000368555 00000 n 
+0000368618 00000 n 
+0000368743 00000 n 
+0000368805 00000 n 
+0000368867 00000 n 
+0000368929 00000 n 
+0000853925 00000 n 
+0000375456 00000 n 
+0000371158 00000 n 
+0000369108 00000 n 
+0000371282 00000 n 
+0000371345 00000 n 
+0000371408 00000 n 
+0000371471 00000 n 
+0000371535 00000 n 
+0000371598 00000 n 
+0000371662 00000 n 
+0000371725 00000 n 
+0000371788 00000 n 
+0000371852 00000 n 
+0000371914 00000 n 
+0000371976 00000 n 
+0000372040 00000 n 
+0000372103 00000 n 
+0000372166 00000 n 
+0000372229 00000 n 
+0000372292 00000 n 
+0000372355 00000 n 
+0000372417 00000 n 
+0000372481 00000 n 
+0000372544 00000 n 
+0000372607 00000 n 
+0000372671 00000 n 
+0000372734 00000 n 
+0000372797 00000 n 
+0000372861 00000 n 
+0000372924 00000 n 
+0000372986 00000 n 
+0000373050 00000 n 
+0000373113 00000 n 
+0000373176 00000 n 
+0000373240 00000 n 
+0000373303 00000 n 
+0000373366 00000 n 
+0000373430 00000 n 
+0000373492 00000 n 
+0000373555 00000 n 
+0000373619 00000 n 
+0000373683 00000 n 
+0000373809 00000 n 
+0000373872 00000 n 
+0000373935 00000 n 
+0000373999 00000 n 
+0000374062 00000 n 
+0000374126 00000 n 
+0000374190 00000 n 
+0000374254 00000 n 
+0000374318 00000 n 
+0000374382 00000 n 
+0000374446 00000 n 
+0000374510 00000 n 
+0000374574 00000 n 
+0000374638 00000 n 
+0000374701 00000 n 
+0000374764 00000 n 
+0000374891 00000 n 
+0000375017 00000 n 
+0000375080 00000 n 
+0000375206 00000 n 
+0000375270 00000 n 
+0000375394 00000 n 
+0000381656 00000 n 
+0000377547 00000 n 
+0000375586 00000 n 
+0000377671 00000 n 
+0000377734 00000 n 
+0000377859 00000 n 
+0000377922 00000 n 
+0000377985 00000 n 
+0000378047 00000 n 
+0000378111 00000 n 
+0000378174 00000 n 
+0000378237 00000 n 
+0000378301 00000 n 
+0000378364 00000 n 
+0000378427 00000 n 
+0000378491 00000 n 
+0000378554 00000 n 
+0000378616 00000 n 
+0000378680 00000 n 
+0000378743 00000 n 
+0000378806 00000 n 
+0000378870 00000 n 
+0000378934 00000 n 
+0000378998 00000 n 
+0000379061 00000 n 
+0000379124 00000 n 
+0000379188 00000 n 
+0000379251 00000 n 
+0000379313 00000 n 
+0000379377 00000 n 
+0000379440 00000 n 
+0000379503 00000 n 
+0000379567 00000 n 
+0000379630 00000 n 
+0000379693 00000 n 
+0000379757 00000 n 
+0000379820 00000 n 
+0000379883 00000 n 
+0000379947 00000 n 
+0000380010 00000 n 
+0000380073 00000 n 
+0000380137 00000 n 
+0000380201 00000 n 
+0000380265 00000 n 
+0000380329 00000 n 
+0000380393 00000 n 
+0000380457 00000 n 
+0000380520 00000 n 
+0000380583 00000 n 
+0000380647 00000 n 
+0000380711 00000 n 
+0000380775 00000 n 
+0000380839 00000 n 
+0000380902 00000 n 
+0000380966 00000 n 
+0000381029 00000 n 
+0000381092 00000 n 
+0000381155 00000 n 
+0000381218 00000 n 
+0000381280 00000 n 
+0000381342 00000 n 
+0000381404 00000 n 
+0000381467 00000 n 
+0000381530 00000 n 
+0000381593 00000 n 
+0000388008 00000 n 
+0000383891 00000 n 
+0000381772 00000 n 
+0000384015 00000 n 
+0000384078 00000 n 
+0000384141 00000 n 
+0000384204 00000 n 
+0000384268 00000 n 
+0000384332 00000 n 
+0000384396 00000 n 
+0000384460 00000 n 
+0000384523 00000 n 
+0000384587 00000 n 
+0000384651 00000 n 
+0000384714 00000 n 
+0000384777 00000 n 
+0000384841 00000 n 
+0000384904 00000 n 
+0000384967 00000 n 
+0000385030 00000 n 
+0000385094 00000 n 
+0000385158 00000 n 
+0000385221 00000 n 
+0000385284 00000 n 
+0000385348 00000 n 
+0000385411 00000 n 
+0000385474 00000 n 
+0000385538 00000 n 
+0000385602 00000 n 
+0000385665 00000 n 
+0000385728 00000 n 
+0000385792 00000 n 
+0000385855 00000 n 
+0000385918 00000 n 
+0000385982 00000 n 
+0000386045 00000 n 
+0000386108 00000 n 
+0000386172 00000 n 
+0000386234 00000 n 
+0000386297 00000 n 
+0000386361 00000 n 
+0000386424 00000 n 
+0000386487 00000 n 
+0000386551 00000 n 
+0000386615 00000 n 
+0000386679 00000 n 
+0000386743 00000 n 
+0000386806 00000 n 
+0000386870 00000 n 
+0000386996 00000 n 
+0000387059 00000 n 
+0000387123 00000 n 
+0000387187 00000 n 
+0000387250 00000 n 
+0000387314 00000 n 
+0000387441 00000 n 
+0000387567 00000 n 
+0000387630 00000 n 
+0000387756 00000 n 
+0000387820 00000 n 
+0000387945 00000 n 
+0000394045 00000 n 
+0000389934 00000 n 
+0000388138 00000 n 
+0000390058 00000 n 
+0000390121 00000 n 
+0000390247 00000 n 
+0000390310 00000 n 
+0000390373 00000 n 
+0000390436 00000 n 
+0000390500 00000 n 
+0000390563 00000 n 
+0000390626 00000 n 
+0000390690 00000 n 
+0000390753 00000 n 
+0000390815 00000 n 
+0000390879 00000 n 
+0000390942 00000 n 
+0000391005 00000 n 
+0000391069 00000 n 
+0000391133 00000 n 
+0000391196 00000 n 
+0000391259 00000 n 
+0000391322 00000 n 
+0000391386 00000 n 
+0000391449 00000 n 
+0000391512 00000 n 
+0000391576 00000 n 
+0000391639 00000 n 
+0000391702 00000 n 
+0000391766 00000 n 
+0000391829 00000 n 
+0000391892 00000 n 
+0000391956 00000 n 
+0000392020 00000 n 
+0000392084 00000 n 
+0000392148 00000 n 
+0000392211 00000 n 
+0000392274 00000 n 
+0000392338 00000 n 
+0000392401 00000 n 
+0000392464 00000 n 
+0000392528 00000 n 
+0000392591 00000 n 
+0000392654 00000 n 
+0000392718 00000 n 
+0000392782 00000 n 
+0000392845 00000 n 
+0000392908 00000 n 
+0000392972 00000 n 
+0000393034 00000 n 
+0000393097 00000 n 
+0000393161 00000 n 
+0000393224 00000 n 
+0000393287 00000 n 
+0000393351 00000 n 
+0000393414 00000 n 
+0000393476 00000 n 
+0000393603 00000 n 
+0000393729 00000 n 
+0000393792 00000 n 
+0000393918 00000 n 
+0000393982 00000 n 
+0000398962 00000 n 
+0000395682 00000 n 
+0000394161 00000 n 
+0000395806 00000 n 
+0000395932 00000 n 
+0000395995 00000 n 
+0000396121 00000 n 
+0000396184 00000 n 
+0000396247 00000 n 
+0000396310 00000 n 
+0000396374 00000 n 
+0000396437 00000 n 
+0000396500 00000 n 
+0000396564 00000 n 
+0000396627 00000 n 
+0000396690 00000 n 
+0000396754 00000 n 
+0000396817 00000 n 
+0000396880 00000 n 
+0000396944 00000 n 
+0000397007 00000 n 
+0000397070 00000 n 
+0000397134 00000 n 
+0000397195 00000 n 
+0000397258 00000 n 
+0000397322 00000 n 
+0000397386 00000 n 
+0000397449 00000 n 
+0000397512 00000 n 
+0000397639 00000 n 
+0000397765 00000 n 
+0000397828 00000 n 
+0000397954 00000 n 
+0000398018 00000 n 
+0000398144 00000 n 
+0000398207 00000 n 
+0000398333 00000 n 
+0000398396 00000 n 
+0000398459 00000 n 
+0000398522 00000 n 
+0000398586 00000 n 
+0000398649 00000 n 
+0000398712 00000 n 
+0000398775 00000 n 
+0000398837 00000 n 
+0000398899 00000 n 
+0000404396 00000 n 
+0000400916 00000 n 
+0000399092 00000 n 
+0000401040 00000 n 
+0000401103 00000 n 
+0000401166 00000 n 
+0000401229 00000 n 
+0000401292 00000 n 
+0000401356 00000 n 
+0000401420 00000 n 
+0000401483 00000 n 
+0000401547 00000 n 
+0000401611 00000 n 
+0000401675 00000 n 
+0000401738 00000 n 
+0000401801 00000 n 
+0000401865 00000 n 
+0000401929 00000 n 
+0000401993 00000 n 
+0000402057 00000 n 
+0000402121 00000 n 
+0000402185 00000 n 
+0000402249 00000 n 
+0000402313 00000 n 
+0000402376 00000 n 
+0000402439 00000 n 
+0000402503 00000 n 
+0000402567 00000 n 
+0000402630 00000 n 
+0000402693 00000 n 
+0000402757 00000 n 
+0000402821 00000 n 
+0000402884 00000 n 
+0000402947 00000 n 
+0000403011 00000 n 
+0000403074 00000 n 
+0000403137 00000 n 
+0000403264 00000 n 
+0000403390 00000 n 
+0000403453 00000 n 
+0000403578 00000 n 
+0000403642 00000 n 
+0000403768 00000 n 
+0000403831 00000 n 
+0000403956 00000 n 
+0000404019 00000 n 
+0000404082 00000 n 
+0000404145 00000 n 
+0000404209 00000 n 
+0000404272 00000 n 
+0000404334 00000 n 
+0000854050 00000 n 
+0000410669 00000 n 
+0000406182 00000 n 
+0000404526 00000 n 
+0000406306 00000 n 
+0000406369 00000 n 
+0000406432 00000 n 
+0000406495 00000 n 
+0000406559 00000 n 
+0000406622 00000 n 
+0000406686 00000 n 
+0000406749 00000 n 
+0000406812 00000 n 
+0000406876 00000 n 
+0000406938 00000 n 
+0000407001 00000 n 
+0000407065 00000 n 
+0000407128 00000 n 
+0000407191 00000 n 
+0000407254 00000 n 
+0000407317 00000 n 
+0000407380 00000 n 
+0000407444 00000 n 
+0000407507 00000 n 
+0000407570 00000 n 
+0000407634 00000 n 
+0000407697 00000 n 
+0000407760 00000 n 
+0000407824 00000 n 
+0000407887 00000 n 
+0000407950 00000 n 
+0000408014 00000 n 
+0000408077 00000 n 
+0000408140 00000 n 
+0000408204 00000 n 
+0000408267 00000 n 
+0000408330 00000 n 
+0000408394 00000 n 
+0000408457 00000 n 
+0000408519 00000 n 
+0000408583 00000 n 
+0000408646 00000 n 
+0000408709 00000 n 
+0000408773 00000 n 
+0000408836 00000 n 
+0000408899 00000 n 
+0000408963 00000 n 
+0000409026 00000 n 
+0000409088 00000 n 
+0000409152 00000 n 
+0000409215 00000 n 
+0000409278 00000 n 
+0000409342 00000 n 
+0000409405 00000 n 
+0000409468 00000 n 
+0000409532 00000 n 
+0000409596 00000 n 
+0000409659 00000 n 
+0000409722 00000 n 
+0000409786 00000 n 
+0000409849 00000 n 
+0000409912 00000 n 
+0000409976 00000 n 
+0000410039 00000 n 
+0000410102 00000 n 
+0000410166 00000 n 
+0000410228 00000 n 
+0000410291 00000 n 
+0000410481 00000 n 
+0000410544 00000 n 
+0000416412 00000 n 
+0000412373 00000 n 
+0000410799 00000 n 
+0000412497 00000 n 
+0000412560 00000 n 
+0000412623 00000 n 
+0000412749 00000 n 
+0000412812 00000 n 
+0000412938 00000 n 
+0000413001 00000 n 
+0000413127 00000 n 
+0000413190 00000 n 
+0000413253 00000 n 
+0000413316 00000 n 
+0000413380 00000 n 
+0000413444 00000 n 
+0000413570 00000 n 
+0000413633 00000 n 
+0000413696 00000 n 
+0000413759 00000 n 
+0000413821 00000 n 
+0000413885 00000 n 
+0000413949 00000 n 
+0000414013 00000 n 
+0000414139 00000 n 
+0000414202 00000 n 
+0000414266 00000 n 
+0000414330 00000 n 
+0000414455 00000 n 
+0000414518 00000 n 
+0000414582 00000 n 
+0000414708 00000 n 
+0000414834 00000 n 
+0000414959 00000 n 
+0000415022 00000 n 
+0000415148 00000 n 
+0000415212 00000 n 
+0000415338 00000 n 
+0000415401 00000 n 
+0000415464 00000 n 
+0000415527 00000 n 
+0000415591 00000 n 
+0000415655 00000 n 
+0000415781 00000 n 
+0000415844 00000 n 
+0000415907 00000 n 
+0000415970 00000 n 
+0000416033 00000 n 
+0000416097 00000 n 
+0000416223 00000 n 
+0000416286 00000 n 
+0000416350 00000 n 
+0000421481 00000 n 
+0000417635 00000 n 
+0000416556 00000 n 
+0000417759 00000 n 
+0000417885 00000 n 
+0000418011 00000 n 
+0000418137 00000 n 
+0000418263 00000 n 
+0000418325 00000 n 
+0000418450 00000 n 
+0000418514 00000 n 
+0000418640 00000 n 
+0000418703 00000 n 
+0000418766 00000 n 
+0000418829 00000 n 
+0000418893 00000 n 
+0000418957 00000 n 
+0000419083 00000 n 
+0000419146 00000 n 
+0000419209 00000 n 
+0000419272 00000 n 
+0000419335 00000 n 
+0000419399 00000 n 
+0000419525 00000 n 
+0000419588 00000 n 
+0000419652 00000 n 
+0000419778 00000 n 
+0000419841 00000 n 
+0000419905 00000 n 
+0000420031 00000 n 
+0000420157 00000 n 
+0000420283 00000 n 
+0000420345 00000 n 
+0000420470 00000 n 
+0000420534 00000 n 
+0000420660 00000 n 
+0000420723 00000 n 
+0000420786 00000 n 
+0000420849 00000 n 
+0000420913 00000 n 
+0000420977 00000 n 
+0000421103 00000 n 
+0000421166 00000 n 
+0000421229 00000 n 
+0000421292 00000 n 
+0000421355 00000 n 
+0000421418 00000 n 
+0000430204 00000 n 
+0000424198 00000 n 
+0000421625 00000 n 
+0000424322 00000 n 
+0000424385 00000 n 
+0000424511 00000 n 
+0000424574 00000 n 
+0000424638 00000 n 
+0000424702 00000 n 
+0000424766 00000 n 
+0000424829 00000 n 
+0000424893 00000 n 
+0000425019 00000 n 
+0000425082 00000 n 
+0000425208 00000 n 
+0000425334 00000 n 
+0000425460 00000 n 
+0000425523 00000 n 
+0000425649 00000 n 
+0000425713 00000 n 
+0000425839 00000 n 
+0000425902 00000 n 
+0000425963 00000 n 
+0000426026 00000 n 
+0000426090 00000 n 
+0000426154 00000 n 
+0000426218 00000 n 
+0000426282 00000 n 
+0000426408 00000 n 
+0000426471 00000 n 
+0000426533 00000 n 
+0000426595 00000 n 
+0000426658 00000 n 
+0000426722 00000 n 
+0000426785 00000 n 
+0000426848 00000 n 
+0000426911 00000 n 
+0000426975 00000 n 
+0000427100 00000 n 
+0000427163 00000 n 
+0000427227 00000 n 
+0000427291 00000 n 
+0000427355 00000 n 
+0000427418 00000 n 
+0000427482 00000 n 
+0000427546 00000 n 
+0000427610 00000 n 
+0000427673 00000 n 
+0000427737 00000 n 
+0000427800 00000 n 
+0000427864 00000 n 
+0000427928 00000 n 
+0000427992 00000 n 
+0000428056 00000 n 
+0000428120 00000 n 
+0000428184 00000 n 
+0000428247 00000 n 
+0000428311 00000 n 
+0000428375 00000 n 
+0000428439 00000 n 
+0000428502 00000 n 
+0000428565 00000 n 
+0000428628 00000 n 
+0000428691 00000 n 
+0000428755 00000 n 
+0000428819 00000 n 
+0000428883 00000 n 
+0000428947 00000 n 
+0000429011 00000 n 
+0000429075 00000 n 
+0000429138 00000 n 
+0000429202 00000 n 
+0000429266 00000 n 
+0000429329 00000 n 
+0000429393 00000 n 
+0000429456 00000 n 
+0000429519 00000 n 
+0000429582 00000 n 
+0000429645 00000 n 
+0000429708 00000 n 
+0000429771 00000 n 
+0000429833 00000 n 
+0000429895 00000 n 
+0000429957 00000 n 
+0000430019 00000 n 
+0000430081 00000 n 
+0000430142 00000 n 
+0000435631 00000 n 
+0000431720 00000 n 
+0000430348 00000 n 
+0000431844 00000 n 
+0000431907 00000 n 
+0000432033 00000 n 
+0000432159 00000 n 
+0000432285 00000 n 
+0000432411 00000 n 
+0000432473 00000 n 
+0000432598 00000 n 
+0000432662 00000 n 
+0000432788 00000 n 
+0000432851 00000 n 
+0000432914 00000 n 
+0000432977 00000 n 
+0000433041 00000 n 
+0000433105 00000 n 
+0000433169 00000 n 
+0000433233 00000 n 
+0000433359 00000 n 
+0000433422 00000 n 
+0000433485 00000 n 
+0000433548 00000 n 
+0000433611 00000 n 
+0000433675 00000 n 
+0000433738 00000 n 
+0000433801 00000 n 
+0000433864 00000 n 
+0000433928 00000 n 
+0000434054 00000 n 
+0000434117 00000 n 
+0000434181 00000 n 
+0000434245 00000 n 
+0000434309 00000 n 
+0000434435 00000 n 
+0000434498 00000 n 
+0000434624 00000 n 
+0000434750 00000 n 
+0000434874 00000 n 
+0000434937 00000 n 
+0000435063 00000 n 
+0000435127 00000 n 
+0000435253 00000 n 
+0000435315 00000 n 
+0000435378 00000 n 
+0000435441 00000 n 
+0000435505 00000 n 
+0000435569 00000 n 
+0000441360 00000 n 
+0000437204 00000 n 
+0000435775 00000 n 
+0000437328 00000 n 
+0000437454 00000 n 
+0000437517 00000 n 
+0000437578 00000 n 
+0000437639 00000 n 
+0000437702 00000 n 
+0000437829 00000 n 
+0000437892 00000 n 
+0000437955 00000 n 
+0000438019 00000 n 
+0000438081 00000 n 
+0000438207 00000 n 
+0000438270 00000 n 
+0000438334 00000 n 
+0000438460 00000 n 
+0000438586 00000 n 
+0000438712 00000 n 
+0000438774 00000 n 
+0000438899 00000 n 
+0000438963 00000 n 
+0000439089 00000 n 
+0000439152 00000 n 
+0000439215 00000 n 
+0000439279 00000 n 
+0000439343 00000 n 
+0000439407 00000 n 
+0000439471 00000 n 
+0000439535 00000 n 
+0000439661 00000 n 
+0000439724 00000 n 
+0000439787 00000 n 
+0000439850 00000 n 
+0000439913 00000 n 
+0000439977 00000 n 
+0000440040 00000 n 
+0000440103 00000 n 
+0000440166 00000 n 
+0000440230 00000 n 
+0000440356 00000 n 
+0000440419 00000 n 
+0000440483 00000 n 
+0000440609 00000 n 
+0000440672 00000 n 
+0000440798 00000 n 
+0000440924 00000 n 
+0000441050 00000 n 
+0000441112 00000 n 
+0000441235 00000 n 
+0000441298 00000 n 
+0000854175 00000 n 
+0000447097 00000 n 
+0000442878 00000 n 
+0000441504 00000 n 
+0000443002 00000 n 
+0000443128 00000 n 
+0000443191 00000 n 
+0000443252 00000 n 
+0000443316 00000 n 
+0000443380 00000 n 
+0000443444 00000 n 
+0000443570 00000 n 
+0000443633 00000 n 
+0000443696 00000 n 
+0000443759 00000 n 
+0000443822 00000 n 
+0000443886 00000 n 
+0000444012 00000 n 
+0000444075 00000 n 
+0000444138 00000 n 
+0000444264 00000 n 
+0000444327 00000 n 
+0000444391 00000 n 
+0000444517 00000 n 
+0000444706 00000 n 
+0000444769 00000 n 
+0000444895 00000 n 
+0000445020 00000 n 
+0000445083 00000 n 
+0000445209 00000 n 
+0000445273 00000 n 
+0000445399 00000 n 
+0000445462 00000 n 
+0000445525 00000 n 
+0000445588 00000 n 
+0000445652 00000 n 
+0000445716 00000 n 
+0000445842 00000 n 
+0000445905 00000 n 
+0000445968 00000 n 
+0000446031 00000 n 
+0000446094 00000 n 
+0000446221 00000 n 
+0000446347 00000 n 
+0000446410 00000 n 
+0000446536 00000 n 
+0000446600 00000 n 
+0000446723 00000 n 
+0000446785 00000 n 
+0000446847 00000 n 
+0000446909 00000 n 
+0000446972 00000 n 
+0000447035 00000 n 
+0000453233 00000 n 
+0000448443 00000 n 
+0000447241 00000 n 
+0000448567 00000 n 
+0000448630 00000 n 
+0000448756 00000 n 
+0000448819 00000 n 
+0000448880 00000 n 
+0000448941 00000 n 
+0000449004 00000 n 
+0000449131 00000 n 
+0000449257 00000 n 
+0000449320 00000 n 
+0000449446 00000 n 
+0000449509 00000 n 
+0000449635 00000 n 
+0000449698 00000 n 
+0000449761 00000 n 
+0000449824 00000 n 
+0000449888 00000 n 
+0000449952 00000 n 
+0000450078 00000 n 
+0000450141 00000 n 
+0000450204 00000 n 
+0000450267 00000 n 
+0000450330 00000 n 
+0000450394 00000 n 
+0000450520 00000 n 
+0000450583 00000 n 
+0000450647 00000 n 
+0000450711 00000 n 
+0000450837 00000 n 
+0000450900 00000 n 
+0000451026 00000 n 
+0000451152 00000 n 
+0000451278 00000 n 
+0000451341 00000 n 
+0000451466 00000 n 
+0000451530 00000 n 
+0000451656 00000 n 
+0000451719 00000 n 
+0000451782 00000 n 
+0000451845 00000 n 
+0000451909 00000 n 
+0000451973 00000 n 
+0000452037 00000 n 
+0000452101 00000 n 
+0000452165 00000 n 
+0000452229 00000 n 
+0000452354 00000 n 
+0000452417 00000 n 
+0000452480 00000 n 
+0000452543 00000 n 
+0000452606 00000 n 
+0000452670 00000 n 
+0000452733 00000 n 
+0000452796 00000 n 
+0000452859 00000 n 
+0000452922 00000 n 
+0000452984 00000 n 
+0000453046 00000 n 
+0000453108 00000 n 
+0000453171 00000 n 
+0000460296 00000 n 
+0000454671 00000 n 
+0000453377 00000 n 
+0000454795 00000 n 
+0000454858 00000 n 
+0000454984 00000 n 
+0000455110 00000 n 
+0000455236 00000 n 
+0000455362 00000 n 
+0000455424 00000 n 
+0000455549 00000 n 
+0000455613 00000 n 
+0000455739 00000 n 
+0000455802 00000 n 
+0000455865 00000 n 
+0000455928 00000 n 
+0000455992 00000 n 
+0000456056 00000 n 
+0000456120 00000 n 
+0000456184 00000 n 
+0000456248 00000 n 
+0000456312 00000 n 
+0000456376 00000 n 
+0000456440 00000 n 
+0000456504 00000 n 
+0000456568 00000 n 
+0000456632 00000 n 
+0000456695 00000 n 
+0000456821 00000 n 
+0000456884 00000 n 
+0000456947 00000 n 
+0000457010 00000 n 
+0000457071 00000 n 
+0000457135 00000 n 
+0000457198 00000 n 
+0000457261 00000 n 
+0000457324 00000 n 
+0000457388 00000 n 
+0000457451 00000 n 
+0000457514 00000 n 
+0000457577 00000 n 
+0000457641 00000 n 
+0000457704 00000 n 
+0000457767 00000 n 
+0000457829 00000 n 
+0000457893 00000 n 
+0000457956 00000 n 
+0000458019 00000 n 
+0000458082 00000 n 
+0000458146 00000 n 
+0000458209 00000 n 
+0000458272 00000 n 
+0000458335 00000 n 
+0000458399 00000 n 
+0000458463 00000 n 
+0000458527 00000 n 
+0000458591 00000 n 
+0000458655 00000 n 
+0000458719 00000 n 
+0000458783 00000 n 
+0000458847 00000 n 
+0000458973 00000 n 
+0000459036 00000 n 
+0000459162 00000 n 
+0000459286 00000 n 
+0000459412 00000 n 
+0000459474 00000 n 
+0000459599 00000 n 
+0000459662 00000 n 
+0000459788 00000 n 
+0000459851 00000 n 
+0000459914 00000 n 
+0000459978 00000 n 
+0000460042 00000 n 
+0000460106 00000 n 
+0000460170 00000 n 
+0000460234 00000 n 
+0000466333 00000 n 
+0000461481 00000 n 
+0000460440 00000 n 
+0000461605 00000 n 
+0000461668 00000 n 
+0000461794 00000 n 
+0000461857 00000 n 
+0000461918 00000 n 
+0000461979 00000 n 
+0000462042 00000 n 
+0000462106 00000 n 
+0000462169 00000 n 
+0000462233 00000 n 
+0000462359 00000 n 
+0000462485 00000 n 
+0000462610 00000 n 
+0000462673 00000 n 
+0000462799 00000 n 
+0000462863 00000 n 
+0000462989 00000 n 
+0000463052 00000 n 
+0000463115 00000 n 
+0000463178 00000 n 
+0000463242 00000 n 
+0000463305 00000 n 
+0000463369 00000 n 
+0000463433 00000 n 
+0000463559 00000 n 
+0000463622 00000 n 
+0000463685 00000 n 
+0000463748 00000 n 
+0000463811 00000 n 
+0000463875 00000 n 
+0000463938 00000 n 
+0000464001 00000 n 
+0000464064 00000 n 
+0000464128 00000 n 
+0000464253 00000 n 
+0000464316 00000 n 
+0000464441 00000 n 
+0000464567 00000 n 
+0000464693 00000 n 
+0000464756 00000 n 
+0000464882 00000 n 
+0000464946 00000 n 
+0000465072 00000 n 
+0000465135 00000 n 
+0000465198 00000 n 
+0000465261 00000 n 
+0000465325 00000 n 
+0000465389 00000 n 
+0000465453 00000 n 
+0000465517 00000 n 
+0000465580 00000 n 
+0000465644 00000 n 
+0000465769 00000 n 
+0000465832 00000 n 
+0000465895 00000 n 
+0000465958 00000 n 
+0000466021 00000 n 
+0000466084 00000 n 
+0000466146 00000 n 
+0000466208 00000 n 
+0000466270 00000 n 
+0000471968 00000 n 
+0000467685 00000 n 
+0000466477 00000 n 
+0000467809 00000 n 
+0000467872 00000 n 
+0000467935 00000 n 
+0000467998 00000 n 
+0000468061 00000 n 
+0000468188 00000 n 
+0000468250 00000 n 
+0000468314 00000 n 
+0000468377 00000 n 
+0000468503 00000 n 
+0000468566 00000 n 
+0000468691 00000 n 
+0000468817 00000 n 
+0000468943 00000 n 
+0000469006 00000 n 
+0000469132 00000 n 
+0000469196 00000 n 
+0000469321 00000 n 
+0000469384 00000 n 
+0000469447 00000 n 
+0000469510 00000 n 
+0000469573 00000 n 
+0000469637 00000 n 
+0000469701 00000 n 
+0000469765 00000 n 
+0000469829 00000 n 
+0000469893 00000 n 
+0000470019 00000 n 
+0000470082 00000 n 
+0000470145 00000 n 
+0000470208 00000 n 
+0000470271 00000 n 
+0000470335 00000 n 
+0000470396 00000 n 
+0000470457 00000 n 
+0000470520 00000 n 
+0000470584 00000 n 
+0000470647 00000 n 
+0000470710 00000 n 
+0000470773 00000 n 
+0000470836 00000 n 
+0000470962 00000 n 
+0000471025 00000 n 
+0000471089 00000 n 
+0000471214 00000 n 
+0000471277 00000 n 
+0000471403 00000 n 
+0000471529 00000 n 
+0000471655 00000 n 
+0000471718 00000 n 
+0000471843 00000 n 
+0000471906 00000 n 
+0000478015 00000 n 
+0000473165 00000 n 
+0000472112 00000 n 
+0000473289 00000 n 
+0000473352 00000 n 
+0000473478 00000 n 
+0000473541 00000 n 
+0000473602 00000 n 
+0000473665 00000 n 
+0000473729 00000 n 
+0000473793 00000 n 
+0000473919 00000 n 
+0000473982 00000 n 
+0000474045 00000 n 
+0000474108 00000 n 
+0000474171 00000 n 
+0000474235 00000 n 
+0000474361 00000 n 
+0000474424 00000 n 
+0000474549 00000 n 
+0000474675 00000 n 
+0000474801 00000 n 
+0000474864 00000 n 
+0000474990 00000 n 
+0000475054 00000 n 
+0000475178 00000 n 
+0000475241 00000 n 
+0000475304 00000 n 
+0000475367 00000 n 
+0000475431 00000 n 
+0000475495 00000 n 
+0000475559 00000 n 
+0000475623 00000 n 
+0000475687 00000 n 
+0000475751 00000 n 
+0000475876 00000 n 
+0000475939 00000 n 
+0000476002 00000 n 
+0000476065 00000 n 
+0000476128 00000 n 
+0000476192 00000 n 
+0000476255 00000 n 
+0000476318 00000 n 
+0000476381 00000 n 
+0000476445 00000 n 
+0000476508 00000 n 
+0000476571 00000 n 
+0000476633 00000 n 
+0000476697 00000 n 
+0000476823 00000 n 
+0000476886 00000 n 
+0000477012 00000 n 
+0000477138 00000 n 
+0000477264 00000 n 
+0000477327 00000 n 
+0000477453 00000 n 
+0000477517 00000 n 
+0000477642 00000 n 
+0000477704 00000 n 
+0000477765 00000 n 
+0000477827 00000 n 
+0000477890 00000 n 
+0000477953 00000 n 
+0000854300 00000 n 
+0000483139 00000 n 
+0000478998 00000 n 
+0000478159 00000 n 
+0000479122 00000 n 
+0000479248 00000 n 
+0000479311 00000 n 
+0000479372 00000 n 
+0000479433 00000 n 
+0000479496 00000 n 
+0000479623 00000 n 
+0000479686 00000 n 
+0000479812 00000 n 
+0000479938 00000 n 
+0000480062 00000 n 
+0000480125 00000 n 
+0000480251 00000 n 
+0000480315 00000 n 
+0000480437 00000 n 
+0000480500 00000 n 
+0000480563 00000 n 
+0000480624 00000 n 
+0000480686 00000 n 
+0000480748 00000 n 
+0000480874 00000 n 
+0000480937 00000 n 
+0000481000 00000 n 
+0000481063 00000 n 
+0000481126 00000 n 
+0000481190 00000 n 
+0000481316 00000 n 
+0000481379 00000 n 
+0000481505 00000 n 
+0000481631 00000 n 
+0000481757 00000 n 
+0000481819 00000 n 
+0000481944 00000 n 
+0000482008 00000 n 
+0000482134 00000 n 
+0000482197 00000 n 
+0000482260 00000 n 
+0000482323 00000 n 
+0000482387 00000 n 
+0000482451 00000 n 
+0000482577 00000 n 
+0000482640 00000 n 
+0000482703 00000 n 
+0000482766 00000 n 
+0000482829 00000 n 
+0000482893 00000 n 
+0000483017 00000 n 
+0000483079 00000 n 
+0000488445 00000 n 
+0000484222 00000 n 
+0000483283 00000 n 
+0000484346 00000 n 
+0000484472 00000 n 
+0000484598 00000 n 
+0000484722 00000 n 
+0000484785 00000 n 
+0000484911 00000 n 
+0000484975 00000 n 
+0000485039 00000 n 
+0000485165 00000 n 
+0000485228 00000 n 
+0000485291 00000 n 
+0000485354 00000 n 
+0000485418 00000 n 
+0000485482 00000 n 
+0000485608 00000 n 
+0000485671 00000 n 
+0000485734 00000 n 
+0000485797 00000 n 
+0000485860 00000 n 
+0000485924 00000 n 
+0000486049 00000 n 
+0000486112 00000 n 
+0000486236 00000 n 
+0000486362 00000 n 
+0000486488 00000 n 
+0000486551 00000 n 
+0000486677 00000 n 
+0000486741 00000 n 
+0000486867 00000 n 
+0000486930 00000 n 
+0000486993 00000 n 
+0000487056 00000 n 
+0000487120 00000 n 
+0000487184 00000 n 
+0000487248 00000 n 
+0000487312 00000 n 
+0000487438 00000 n 
+0000487501 00000 n 
+0000487564 00000 n 
+0000487627 00000 n 
+0000487690 00000 n 
+0000487754 00000 n 
+0000487817 00000 n 
+0000487880 00000 n 
+0000487943 00000 n 
+0000488006 00000 n 
+0000488132 00000 n 
+0000488195 00000 n 
+0000488320 00000 n 
+0000493886 00000 n 
+0000489535 00000 n 
+0000488589 00000 n 
+0000489659 00000 n 
+0000489722 00000 n 
+0000489844 00000 n 
+0000489907 00000 n 
+0000490033 00000 n 
+0000490096 00000 n 
+0000490222 00000 n 
+0000490285 00000 n 
+0000490348 00000 n 
+0000490411 00000 n 
+0000490475 00000 n 
+0000490539 00000 n 
+0000490603 00000 n 
+0000490667 00000 n 
+0000490731 00000 n 
+0000490795 00000 n 
+0000490921 00000 n 
+0000490984 00000 n 
+0000491047 00000 n 
+0000491110 00000 n 
+0000491173 00000 n 
+0000491236 00000 n 
+0000491299 00000 n 
+0000491362 00000 n 
+0000491424 00000 n 
+0000491488 00000 n 
+0000491551 00000 n 
+0000491614 00000 n 
+0000491677 00000 n 
+0000491741 00000 n 
+0000491867 00000 n 
+0000491929 00000 n 
+0000492055 00000 n 
+0000492181 00000 n 
+0000492307 00000 n 
+0000492370 00000 n 
+0000492496 00000 n 
+0000492558 00000 n 
+0000492684 00000 n 
+0000492747 00000 n 
+0000492810 00000 n 
+0000492873 00000 n 
+0000492937 00000 n 
+0000493001 00000 n 
+0000493127 00000 n 
+0000493190 00000 n 
+0000493253 00000 n 
+0000493316 00000 n 
+0000493379 00000 n 
+0000493443 00000 n 
+0000493570 00000 n 
+0000493633 00000 n 
+0000493760 00000 n 
+0000499636 00000 n 
+0000495206 00000 n 
+0000494030 00000 n 
+0000495330 00000 n 
+0000495393 00000 n 
+0000495520 00000 n 
+0000495583 00000 n 
+0000495710 00000 n 
+0000495773 00000 n 
+0000495900 00000 n 
+0000495963 00000 n 
+0000496026 00000 n 
+0000496089 00000 n 
+0000496153 00000 n 
+0000496217 00000 n 
+0000496281 00000 n 
+0000496345 00000 n 
+0000496472 00000 n 
+0000496535 00000 n 
+0000496598 00000 n 
+0000496661 00000 n 
+0000496724 00000 n 
+0000496788 00000 n 
+0000496850 00000 n 
+0000496912 00000 n 
+0000496975 00000 n 
+0000497039 00000 n 
+0000497166 00000 n 
+0000497228 00000 n 
+0000497355 00000 n 
+0000497481 00000 n 
+0000497608 00000 n 
+0000497671 00000 n 
+0000497798 00000 n 
+0000497862 00000 n 
+0000497989 00000 n 
+0000498052 00000 n 
+0000498115 00000 n 
+0000498179 00000 n 
+0000498243 00000 n 
+0000498307 00000 n 
+0000498371 00000 n 
+0000498435 00000 n 
+0000498562 00000 n 
+0000498625 00000 n 
+0000498688 00000 n 
+0000498751 00000 n 
+0000498814 00000 n 
+0000498878 00000 n 
+0000498941 00000 n 
+0000499004 00000 n 
+0000499067 00000 n 
+0000499131 00000 n 
+0000499258 00000 n 
+0000499320 00000 n 
+0000499383 00000 n 
+0000499510 00000 n 
+0000505527 00000 n 
+0000501099 00000 n 
+0000499780 00000 n 
+0000501223 00000 n 
+0000501349 00000 n 
+0000501476 00000 n 
+0000501539 00000 n 
+0000501666 00000 n 
+0000501729 00000 n 
+0000501856 00000 n 
+0000501919 00000 n 
+0000501982 00000 n 
+0000502045 00000 n 
+0000502109 00000 n 
+0000502173 00000 n 
+0000502237 00000 n 
+0000502301 00000 n 
+0000502428 00000 n 
+0000502491 00000 n 
+0000502554 00000 n 
+0000502617 00000 n 
+0000502680 00000 n 
+0000502744 00000 n 
+0000502806 00000 n 
+0000502868 00000 n 
+0000502931 00000 n 
+0000502995 00000 n 
+0000503122 00000 n 
+0000503185 00000 n 
+0000503311 00000 n 
+0000503437 00000 n 
+0000503564 00000 n 
+0000503627 00000 n 
+0000503754 00000 n 
+0000503818 00000 n 
+0000503945 00000 n 
+0000504008 00000 n 
+0000504071 00000 n 
+0000504134 00000 n 
+0000504198 00000 n 
+0000504262 00000 n 
+0000504326 00000 n 
+0000504390 00000 n 
+0000504517 00000 n 
+0000504580 00000 n 
+0000504643 00000 n 
+0000504706 00000 n 
+0000504769 00000 n 
+0000504833 00000 n 
+0000504896 00000 n 
+0000504959 00000 n 
+0000505022 00000 n 
+0000505085 00000 n 
+0000505212 00000 n 
+0000505275 00000 n 
+0000505402 00000 n 
+0000505465 00000 n 
+0000510615 00000 n 
+0000507209 00000 n 
+0000505671 00000 n 
+0000507333 00000 n 
+0000507396 00000 n 
+0000507523 00000 n 
+0000507586 00000 n 
+0000507711 00000 n 
+0000507774 00000 n 
+0000507901 00000 n 
+0000507965 00000 n 
+0000508092 00000 n 
+0000508154 00000 n 
+0000508217 00000 n 
+0000508280 00000 n 
+0000508344 00000 n 
+0000508408 00000 n 
+0000508535 00000 n 
+0000508598 00000 n 
+0000508660 00000 n 
+0000508722 00000 n 
+0000508785 00000 n 
+0000508849 00000 n 
+0000508976 00000 n 
+0000509039 00000 n 
+0000509166 00000 n 
+0000509356 00000 n 
+0000509482 00000 n 
+0000509609 00000 n 
+0000509672 00000 n 
+0000509797 00000 n 
+0000509860 00000 n 
+0000509987 00000 n 
+0000510050 00000 n 
+0000510177 00000 n 
+0000510240 00000 n 
+0000510303 00000 n 
+0000510365 00000 n 
+0000510428 00000 n 
+0000510490 00000 n 
+0000510552 00000 n 
+0000854425 00000 n 
+0000516173 00000 n 
+0000512574 00000 n 
+0000510759 00000 n 
+0000512698 00000 n 
+0000512761 00000 n 
+0000512824 00000 n 
+0000512887 00000 n 
+0000513015 00000 n 
+0000513140 00000 n 
+0000513267 00000 n 
+0000513329 00000 n 
+0000513455 00000 n 
+0000513519 00000 n 
+0000513646 00000 n 
+0000513709 00000 n 
+0000513836 00000 n 
+0000513899 00000 n 
+0000513962 00000 n 
+0000514025 00000 n 
+0000514089 00000 n 
+0000514153 00000 n 
+0000514217 00000 n 
+0000514280 00000 n 
+0000514344 00000 n 
+0000514408 00000 n 
+0000514472 00000 n 
+0000514536 00000 n 
+0000514599 00000 n 
+0000514662 00000 n 
+0000514726 00000 n 
+0000514789 00000 n 
+0000514852 00000 n 
+0000514916 00000 n 
+0000514978 00000 n 
+0000515041 00000 n 
+0000515105 00000 n 
+0000515168 00000 n 
+0000515231 00000 n 
+0000515294 00000 n 
+0000515357 00000 n 
+0000515420 00000 n 
+0000515484 00000 n 
+0000515543 00000 n 
+0000515605 00000 n 
+0000515669 00000 n 
+0000515732 00000 n 
+0000515795 00000 n 
+0000515858 00000 n 
+0000515985 00000 n 
+0000516048 00000 n 
+0000522371 00000 n 
+0000517504 00000 n 
+0000516303 00000 n 
+0000517628 00000 n 
+0000517691 00000 n 
+0000517817 00000 n 
+0000517880 00000 n 
+0000518007 00000 n 
+0000518070 00000 n 
+0000518197 00000 n 
+0000518260 00000 n 
+0000518323 00000 n 
+0000518386 00000 n 
+0000518450 00000 n 
+0000518514 00000 n 
+0000518578 00000 n 
+0000518642 00000 n 
+0000518705 00000 n 
+0000518769 00000 n 
+0000518896 00000 n 
+0000518959 00000 n 
+0000519022 00000 n 
+0000519085 00000 n 
+0000519148 00000 n 
+0000519211 00000 n 
+0000519274 00000 n 
+0000519337 00000 n 
+0000519400 00000 n 
+0000519464 00000 n 
+0000519527 00000 n 
+0000519590 00000 n 
+0000519653 00000 n 
+0000519717 00000 n 
+0000519844 00000 n 
+0000519968 00000 n 
+0000520095 00000 n 
+0000520158 00000 n 
+0000520285 00000 n 
+0000520349 00000 n 
+0000520476 00000 n 
+0000520539 00000 n 
+0000520602 00000 n 
+0000520665 00000 n 
+0000520729 00000 n 
+0000520793 00000 n 
+0000520857 00000 n 
+0000520921 00000 n 
+0000521048 00000 n 
+0000521110 00000 n 
+0000521173 00000 n 
+0000521236 00000 n 
+0000521299 00000 n 
+0000521363 00000 n 
+0000521426 00000 n 
+0000521489 00000 n 
+0000521552 00000 n 
+0000521616 00000 n 
+0000521680 00000 n 
+0000521807 00000 n 
+0000521932 00000 n 
+0000522059 00000 n 
+0000522121 00000 n 
+0000522246 00000 n 
+0000522309 00000 n 
+0000528978 00000 n 
+0000523729 00000 n 
+0000522515 00000 n 
+0000523853 00000 n 
+0000523916 00000 n 
+0000524043 00000 n 
+0000524106 00000 n 
+0000524167 00000 n 
+0000524230 00000 n 
+0000524294 00000 n 
+0000524358 00000 n 
+0000524422 00000 n 
+0000524486 00000 n 
+0000524613 00000 n 
+0000524676 00000 n 
+0000524739 00000 n 
+0000524802 00000 n 
+0000524865 00000 n 
+0000524929 00000 n 
+0000524992 00000 n 
+0000525055 00000 n 
+0000525118 00000 n 
+0000525182 00000 n 
+0000525246 00000 n 
+0000525372 00000 n 
+0000525498 00000 n 
+0000525625 00000 n 
+0000525688 00000 n 
+0000525815 00000 n 
+0000525879 00000 n 
+0000526006 00000 n 
+0000526069 00000 n 
+0000526132 00000 n 
+0000526195 00000 n 
+0000526259 00000 n 
+0000526323 00000 n 
+0000526387 00000 n 
+0000526451 00000 n 
+0000526578 00000 n 
+0000526641 00000 n 
+0000526704 00000 n 
+0000526767 00000 n 
+0000526830 00000 n 
+0000526894 00000 n 
+0000526957 00000 n 
+0000527020 00000 n 
+0000527083 00000 n 
+0000527146 00000 n 
+0000527273 00000 n 
+0000527336 00000 n 
+0000527400 00000 n 
+0000527464 00000 n 
+0000527591 00000 n 
+0000527718 00000 n 
+0000527781 00000 n 
+0000527908 00000 n 
+0000527972 00000 n 
+0000528099 00000 n 
+0000528162 00000 n 
+0000528224 00000 n 
+0000528287 00000 n 
+0000528351 00000 n 
+0000528415 00000 n 
+0000528479 00000 n 
+0000528543 00000 n 
+0000528669 00000 n 
+0000528731 00000 n 
+0000528792 00000 n 
+0000528853 00000 n 
+0000528915 00000 n 
+0000533911 00000 n 
+0000530438 00000 n 
+0000529122 00000 n 
+0000530562 00000 n 
+0000530625 00000 n 
+0000530688 00000 n 
+0000530751 00000 n 
+0000530814 00000 n 
+0000530877 00000 n 
+0000530941 00000 n 
+0000531069 00000 n 
+0000531132 00000 n 
+0000531196 00000 n 
+0000531323 00000 n 
+0000531450 00000 n 
+0000531513 00000 n 
+0000531640 00000 n 
+0000531703 00000 n 
+0000531830 00000 n 
+0000531893 00000 n 
+0000531956 00000 n 
+0000532019 00000 n 
+0000532083 00000 n 
+0000532147 00000 n 
+0000532211 00000 n 
+0000532275 00000 n 
+0000532401 00000 n 
+0000532464 00000 n 
+0000532527 00000 n 
+0000532590 00000 n 
+0000532652 00000 n 
+0000532716 00000 n 
+0000532778 00000 n 
+0000532840 00000 n 
+0000532903 00000 n 
+0000532967 00000 n 
+0000533031 00000 n 
+0000533158 00000 n 
+0000533281 00000 n 
+0000533408 00000 n 
+0000533470 00000 n 
+0000533596 00000 n 
+0000533660 00000 n 
+0000533787 00000 n 
+0000533850 00000 n 
+0000540399 00000 n 
+0000535907 00000 n 
+0000534055 00000 n 
+0000536031 00000 n 
+0000536158 00000 n 
+0000536221 00000 n 
+0000536284 00000 n 
+0000536347 00000 n 
+0000536411 00000 n 
+0000536475 00000 n 
+0000536538 00000 n 
+0000536602 00000 n 
+0000536664 00000 n 
+0000536727 00000 n 
+0000536791 00000 n 
+0000536855 00000 n 
+0000536918 00000 n 
+0000536981 00000 n 
+0000537044 00000 n 
+0000537108 00000 n 
+0000537171 00000 n 
+0000537235 00000 n 
+0000537297 00000 n 
+0000537360 00000 n 
+0000537424 00000 n 
+0000537488 00000 n 
+0000537552 00000 n 
+0000537615 00000 n 
+0000537678 00000 n 
+0000537742 00000 n 
+0000537806 00000 n 
+0000537870 00000 n 
+0000537932 00000 n 
+0000537995 00000 n 
+0000538059 00000 n 
+0000538123 00000 n 
+0000538186 00000 n 
+0000538249 00000 n 
+0000538312 00000 n 
+0000538374 00000 n 
+0000538437 00000 n 
+0000538500 00000 n 
+0000538564 00000 n 
+0000538626 00000 n 
+0000538689 00000 n 
+0000538753 00000 n 
+0000538817 00000 n 
+0000538880 00000 n 
+0000538943 00000 n 
+0000539006 00000 n 
+0000539069 00000 n 
+0000539132 00000 n 
+0000539196 00000 n 
+0000539259 00000 n 
+0000539322 00000 n 
+0000539386 00000 n 
+0000539449 00000 n 
+0000539512 00000 n 
+0000539576 00000 n 
+0000539702 00000 n 
+0000539765 00000 n 
+0000539829 00000 n 
+0000539955 00000 n 
+0000540082 00000 n 
+0000540145 00000 n 
+0000540272 00000 n 
+0000540336 00000 n 
+0000546085 00000 n 
+0000542793 00000 n 
+0000540529 00000 n 
+0000542917 00000 n 
+0000543044 00000 n 
+0000543107 00000 n 
+0000543234 00000 n 
+0000543297 00000 n 
+0000543360 00000 n 
+0000543423 00000 n 
+0000543486 00000 n 
+0000543549 00000 n 
+0000543612 00000 n 
+0000543676 00000 n 
+0000543739 00000 n 
+0000543801 00000 n 
+0000543865 00000 n 
+0000543928 00000 n 
+0000543991 00000 n 
+0000544055 00000 n 
+0000544118 00000 n 
+0000544181 00000 n 
+0000544245 00000 n 
+0000544309 00000 n 
+0000544373 00000 n 
+0000544436 00000 n 
+0000544499 00000 n 
+0000544562 00000 n 
+0000544625 00000 n 
+0000544688 00000 n 
+0000544752 00000 n 
+0000544816 00000 n 
+0000544880 00000 n 
+0000544944 00000 n 
+0000545008 00000 n 
+0000545072 00000 n 
+0000545136 00000 n 
+0000545200 00000 n 
+0000545264 00000 n 
+0000545327 00000 n 
+0000545390 00000 n 
+0000545453 00000 n 
+0000545516 00000 n 
+0000545579 00000 n 
+0000545643 00000 n 
+0000545706 00000 n 
+0000545769 00000 n 
+0000545833 00000 n 
+0000545960 00000 n 
+0000854550 00000 n 
+0000552385 00000 n 
+0000547081 00000 n 
+0000546215 00000 n 
+0000547205 00000 n 
+0000547268 00000 n 
+0000547395 00000 n 
+0000547458 00000 n 
+0000547585 00000 n 
+0000547648 00000 n 
+0000547775 00000 n 
+0000547838 00000 n 
+0000547901 00000 n 
+0000547965 00000 n 
+0000548029 00000 n 
+0000548093 00000 n 
+0000548157 00000 n 
+0000548221 00000 n 
+0000548348 00000 n 
+0000548411 00000 n 
+0000548474 00000 n 
+0000548537 00000 n 
+0000548600 00000 n 
+0000548664 00000 n 
+0000548726 00000 n 
+0000548788 00000 n 
+0000548851 00000 n 
+0000548978 00000 n 
+0000549102 00000 n 
+0000549165 00000 n 
+0000549292 00000 n 
+0000549356 00000 n 
+0000549483 00000 n 
+0000549545 00000 n 
+0000549608 00000 n 
+0000549672 00000 n 
+0000549736 00000 n 
+0000549800 00000 n 
+0000549863 00000 n 
+0000549927 00000 n 
+0000550054 00000 n 
+0000550117 00000 n 
+0000550178 00000 n 
+0000550239 00000 n 
+0000550302 00000 n 
+0000550364 00000 n 
+0000550427 00000 n 
+0000550490 00000 n 
+0000550552 00000 n 
+0000550679 00000 n 
+0000550806 00000 n 
+0000550869 00000 n 
+0000550996 00000 n 
+0000551060 00000 n 
+0000551187 00000 n 
+0000551250 00000 n 
+0000551313 00000 n 
+0000551377 00000 n 
+0000551441 00000 n 
+0000551505 00000 n 
+0000551569 00000 n 
+0000551633 00000 n 
+0000551760 00000 n 
+0000551823 00000 n 
+0000551886 00000 n 
+0000551949 00000 n 
+0000552012 00000 n 
+0000552075 00000 n 
+0000552137 00000 n 
+0000552199 00000 n 
+0000552261 00000 n 
+0000558418 00000 n 
+0000553811 00000 n 
+0000552529 00000 n 
+0000553935 00000 n 
+0000553998 00000 n 
+0000554125 00000 n 
+0000554188 00000 n 
+0000554315 00000 n 
+0000554378 00000 n 
+0000554505 00000 n 
+0000554568 00000 n 
+0000554631 00000 n 
+0000554695 00000 n 
+0000554759 00000 n 
+0000554823 00000 n 
+0000554886 00000 n 
+0000554950 00000 n 
+0000555077 00000 n 
+0000555140 00000 n 
+0000555203 00000 n 
+0000555266 00000 n 
+0000555328 00000 n 
+0000555392 00000 n 
+0000555454 00000 n 
+0000555516 00000 n 
+0000555579 00000 n 
+0000555643 00000 n 
+0000555770 00000 n 
+0000555896 00000 n 
+0000556023 00000 n 
+0000556086 00000 n 
+0000556212 00000 n 
+0000556276 00000 n 
+0000556402 00000 n 
+0000556465 00000 n 
+0000556528 00000 n 
+0000556590 00000 n 
+0000556653 00000 n 
+0000556716 00000 n 
+0000556779 00000 n 
+0000556842 00000 n 
+0000556968 00000 n 
+0000557031 00000 n 
+0000557094 00000 n 
+0000557157 00000 n 
+0000557220 00000 n 
+0000557284 00000 n 
+0000557347 00000 n 
+0000557410 00000 n 
+0000557473 00000 n 
+0000557537 00000 n 
+0000557664 00000 n 
+0000557727 00000 n 
+0000557789 00000 n 
+0000557852 00000 n 
+0000557978 00000 n 
+0000558104 00000 n 
+0000558167 00000 n 
+0000558293 00000 n 
+0000558356 00000 n 
+0000564118 00000 n 
+0000559753 00000 n 
+0000558562 00000 n 
+0000559877 00000 n 
+0000560004 00000 n 
+0000560067 00000 n 
+0000560128 00000 n 
+0000560192 00000 n 
+0000560256 00000 n 
+0000560320 00000 n 
+0000560447 00000 n 
+0000560510 00000 n 
+0000560573 00000 n 
+0000560636 00000 n 
+0000560699 00000 n 
+0000560826 00000 n 
+0000560953 00000 n 
+0000561016 00000 n 
+0000561143 00000 n 
+0000561207 00000 n 
+0000561334 00000 n 
+0000561397 00000 n 
+0000561460 00000 n 
+0000561524 00000 n 
+0000561588 00000 n 
+0000561652 00000 n 
+0000561779 00000 n 
+0000561842 00000 n 
+0000561905 00000 n 
+0000561968 00000 n 
+0000562031 00000 n 
+0000562095 00000 n 
+0000562221 00000 n 
+0000562284 00000 n 
+0000562411 00000 n 
+0000562538 00000 n 
+0000562601 00000 n 
+0000562728 00000 n 
+0000562792 00000 n 
+0000562919 00000 n 
+0000562982 00000 n 
+0000563045 00000 n 
+0000563108 00000 n 
+0000563172 00000 n 
+0000563236 00000 n 
+0000563363 00000 n 
+0000563426 00000 n 
+0000563489 00000 n 
+0000563552 00000 n 
+0000563615 00000 n 
+0000563679 00000 n 
+0000563806 00000 n 
+0000563869 00000 n 
+0000563994 00000 n 
+0000570201 00000 n 
+0000565583 00000 n 
+0000564262 00000 n 
+0000565707 00000 n 
+0000565770 00000 n 
+0000565897 00000 n 
+0000565960 00000 n 
+0000566087 00000 n 
+0000566150 00000 n 
+0000566277 00000 n 
+0000566340 00000 n 
+0000566403 00000 n 
+0000566466 00000 n 
+0000566530 00000 n 
+0000566594 00000 n 
+0000566721 00000 n 
+0000566784 00000 n 
+0000566847 00000 n 
+0000566910 00000 n 
+0000566972 00000 n 
+0000567036 00000 n 
+0000567163 00000 n 
+0000567289 00000 n 
+0000567416 00000 n 
+0000567479 00000 n 
+0000567606 00000 n 
+0000567670 00000 n 
+0000567797 00000 n 
+0000567860 00000 n 
+0000567922 00000 n 
+0000567985 00000 n 
+0000568048 00000 n 
+0000568112 00000 n 
+0000568176 00000 n 
+0000568240 00000 n 
+0000568304 00000 n 
+0000568368 00000 n 
+0000568432 00000 n 
+0000568496 00000 n 
+0000568622 00000 n 
+0000568685 00000 n 
+0000568748 00000 n 
+0000568811 00000 n 
+0000568874 00000 n 
+0000568938 00000 n 
+0000569001 00000 n 
+0000569064 00000 n 
+0000569127 00000 n 
+0000569191 00000 n 
+0000569254 00000 n 
+0000569317 00000 n 
+0000569380 00000 n 
+0000569444 00000 n 
+0000569506 00000 n 
+0000569568 00000 n 
+0000569631 00000 n 
+0000569695 00000 n 
+0000569822 00000 n 
+0000569885 00000 n 
+0000569948 00000 n 
+0000570075 00000 n 
+0000577507 00000 n 
+0000571877 00000 n 
+0000570345 00000 n 
+0000572001 00000 n 
+0000572064 00000 n 
+0000572127 00000 n 
+0000572254 00000 n 
+0000572317 00000 n 
+0000572444 00000 n 
+0000572507 00000 n 
+0000572634 00000 n 
+0000572697 00000 n 
+0000572760 00000 n 
+0000572823 00000 n 
+0000572887 00000 n 
+0000572950 00000 n 
+0000573014 00000 n 
+0000573078 00000 n 
+0000573142 00000 n 
+0000573206 00000 n 
+0000573270 00000 n 
+0000573334 00000 n 
+0000573398 00000 n 
+0000573462 00000 n 
+0000573525 00000 n 
+0000573589 00000 n 
+0000573716 00000 n 
+0000573779 00000 n 
+0000573842 00000 n 
+0000573905 00000 n 
+0000573968 00000 n 
+0000574031 00000 n 
+0000574094 00000 n 
+0000574157 00000 n 
+0000574220 00000 n 
+0000574284 00000 n 
+0000574347 00000 n 
+0000574410 00000 n 
+0000574473 00000 n 
+0000574537 00000 n 
+0000574600 00000 n 
+0000574663 00000 n 
+0000574726 00000 n 
+0000574790 00000 n 
+0000574853 00000 n 
+0000574916 00000 n 
+0000574979 00000 n 
+0000575043 00000 n 
+0000575106 00000 n 
+0000575169 00000 n 
+0000575232 00000 n 
+0000575296 00000 n 
+0000575423 00000 n 
+0000575486 00000 n 
+0000575613 00000 n 
+0000575739 00000 n 
+0000575866 00000 n 
+0000575929 00000 n 
+0000576056 00000 n 
+0000576120 00000 n 
+0000576247 00000 n 
+0000576310 00000 n 
+0000576373 00000 n 
+0000576436 00000 n 
+0000576499 00000 n 
+0000576563 00000 n 
+0000576627 00000 n 
+0000576691 00000 n 
+0000576755 00000 n 
+0000576817 00000 n 
+0000576944 00000 n 
+0000577007 00000 n 
+0000577070 00000 n 
+0000577133 00000 n 
+0000577196 00000 n 
+0000577259 00000 n 
+0000577321 00000 n 
+0000577383 00000 n 
+0000577444 00000 n 
+0000583548 00000 n 
+0000578927 00000 n 
+0000577651 00000 n 
+0000579051 00000 n 
+0000579114 00000 n 
+0000579177 00000 n 
+0000579240 00000 n 
+0000579303 00000 n 
+0000579366 00000 n 
+0000579494 00000 n 
+0000579556 00000 n 
+0000579620 00000 n 
+0000579684 00000 n 
+0000579811 00000 n 
+0000579937 00000 n 
+0000580064 00000 n 
+0000580127 00000 n 
+0000580254 00000 n 
+0000580317 00000 n 
+0000580444 00000 n 
+0000580507 00000 n 
+0000580570 00000 n 
+0000580633 00000 n 
+0000580697 00000 n 
+0000580761 00000 n 
+0000580825 00000 n 
+0000580887 00000 n 
+0000580951 00000 n 
+0000581015 00000 n 
+0000581142 00000 n 
+0000581205 00000 n 
+0000581268 00000 n 
+0000581331 00000 n 
+0000581394 00000 n 
+0000581457 00000 n 
+0000581520 00000 n 
+0000581583 00000 n 
+0000581646 00000 n 
+0000581710 00000 n 
+0000581773 00000 n 
+0000581836 00000 n 
+0000581899 00000 n 
+0000581963 00000 n 
+0000582090 00000 n 
+0000582153 00000 n 
+0000582217 00000 n 
+0000582281 00000 n 
+0000582408 00000 n 
+0000582534 00000 n 
+0000582660 00000 n 
+0000582723 00000 n 
+0000582849 00000 n 
+0000582913 00000 n 
+0000583040 00000 n 
+0000583103 00000 n 
+0000583166 00000 n 
+0000583229 00000 n 
+0000583293 00000 n 
+0000583357 00000 n 
+0000583421 00000 n 
+0000583485 00000 n 
+0000854675 00000 n 
+0000589013 00000 n 
+0000584970 00000 n 
+0000583692 00000 n 
+0000585094 00000 n 
+0000585221 00000 n 
+0000585284 00000 n 
+0000585345 00000 n 
+0000585406 00000 n 
+0000585469 00000 n 
+0000585533 00000 n 
+0000585596 00000 n 
+0000585660 00000 n 
+0000585787 00000 n 
+0000585850 00000 n 
+0000585977 00000 n 
+0000586103 00000 n 
+0000586227 00000 n 
+0000586290 00000 n 
+0000586417 00000 n 
+0000586481 00000 n 
+0000586608 00000 n 
+0000586669 00000 n 
+0000586732 00000 n 
+0000586795 00000 n 
+0000586859 00000 n 
+0000586923 00000 n 
+0000586987 00000 n 
+0000587051 00000 n 
+0000587115 00000 n 
+0000587179 00000 n 
+0000587306 00000 n 
+0000587369 00000 n 
+0000587432 00000 n 
+0000587495 00000 n 
+0000587558 00000 n 
+0000587622 00000 n 
+0000587685 00000 n 
+0000587748 00000 n 
+0000587811 00000 n 
+0000587875 00000 n 
+0000587938 00000 n 
+0000588001 00000 n 
+0000588064 00000 n 
+0000588128 00000 n 
+0000588255 00000 n 
+0000588318 00000 n 
+0000588445 00000 n 
+0000588570 00000 n 
+0000588697 00000 n 
+0000588760 00000 n 
+0000588887 00000 n 
+0000588950 00000 n 
+0000595167 00000 n 
+0000590363 00000 n 
+0000589157 00000 n 
+0000590487 00000 n 
+0000590614 00000 n 
+0000590677 00000 n 
+0000590738 00000 n 
+0000590801 00000 n 
+0000590865 00000 n 
+0000590929 00000 n 
+0000590993 00000 n 
+0000591055 00000 n 
+0000591119 00000 n 
+0000591183 00000 n 
+0000591308 00000 n 
+0000591371 00000 n 
+0000591434 00000 n 
+0000591497 00000 n 
+0000591560 00000 n 
+0000591624 00000 n 
+0000591687 00000 n 
+0000591750 00000 n 
+0000591813 00000 n 
+0000591877 00000 n 
+0000591940 00000 n 
+0000592003 00000 n 
+0000592065 00000 n 
+0000592129 00000 n 
+0000592256 00000 n 
+0000592319 00000 n 
+0000592383 00000 n 
+0000592510 00000 n 
+0000592636 00000 n 
+0000592761 00000 n 
+0000592824 00000 n 
+0000592951 00000 n 
+0000593015 00000 n 
+0000593142 00000 n 
+0000593204 00000 n 
+0000593267 00000 n 
+0000593330 00000 n 
+0000593394 00000 n 
+0000593457 00000 n 
+0000593521 00000 n 
+0000593585 00000 n 
+0000593649 00000 n 
+0000593713 00000 n 
+0000593840 00000 n 
+0000593903 00000 n 
+0000593966 00000 n 
+0000594029 00000 n 
+0000594092 00000 n 
+0000594156 00000 n 
+0000594219 00000 n 
+0000594282 00000 n 
+0000594345 00000 n 
+0000594409 00000 n 
+0000594472 00000 n 
+0000594535 00000 n 
+0000594598 00000 n 
+0000594662 00000 n 
+0000594789 00000 n 
+0000594852 00000 n 
+0000594916 00000 n 
+0000595043 00000 n 
+0000601121 00000 n 
+0000596566 00000 n 
+0000595311 00000 n 
+0000596690 00000 n 
+0000596753 00000 n 
+0000596880 00000 n 
+0000596943 00000 n 
+0000597070 00000 n 
+0000597133 00000 n 
+0000597260 00000 n 
+0000597323 00000 n 
+0000597386 00000 n 
+0000597449 00000 n 
+0000597513 00000 n 
+0000597577 00000 n 
+0000597641 00000 n 
+0000597705 00000 n 
+0000597769 00000 n 
+0000597833 00000 n 
+0000597897 00000 n 
+0000597961 00000 n 
+0000598088 00000 n 
+0000598151 00000 n 
+0000598214 00000 n 
+0000598277 00000 n 
+0000598340 00000 n 
+0000598403 00000 n 
+0000598466 00000 n 
+0000598529 00000 n 
+0000598591 00000 n 
+0000598655 00000 n 
+0000598718 00000 n 
+0000598781 00000 n 
+0000598844 00000 n 
+0000598908 00000 n 
+0000598971 00000 n 
+0000599034 00000 n 
+0000599097 00000 n 
+0000599161 00000 n 
+0000599288 00000 n 
+0000599414 00000 n 
+0000599541 00000 n 
+0000599604 00000 n 
+0000599731 00000 n 
+0000599795 00000 n 
+0000599921 00000 n 
+0000599984 00000 n 
+0000600047 00000 n 
+0000600109 00000 n 
+0000600172 00000 n 
+0000600235 00000 n 
+0000600362 00000 n 
+0000600425 00000 n 
+0000600488 00000 n 
+0000600551 00000 n 
+0000600614 00000 n 
+0000600678 00000 n 
+0000600805 00000 n 
+0000600868 00000 n 
+0000600995 00000 n 
+0000607252 00000 n 
+0000602322 00000 n 
+0000601265 00000 n 
+0000602446 00000 n 
+0000602509 00000 n 
+0000602572 00000 n 
+0000602699 00000 n 
+0000602762 00000 n 
+0000602889 00000 n 
+0000602952 00000 n 
+0000603079 00000 n 
+0000603142 00000 n 
+0000603205 00000 n 
+0000603268 00000 n 
+0000603332 00000 n 
+0000603396 00000 n 
+0000603523 00000 n 
+0000603586 00000 n 
+0000603649 00000 n 
+0000603712 00000 n 
+0000603775 00000 n 
+0000603839 00000 n 
+0000603966 00000 n 
+0000604092 00000 n 
+0000604218 00000 n 
+0000604281 00000 n 
+0000604408 00000 n 
+0000604472 00000 n 
+0000604599 00000 n 
+0000604662 00000 n 
+0000604725 00000 n 
+0000604788 00000 n 
+0000604852 00000 n 
+0000604916 00000 n 
+0000604980 00000 n 
+0000605044 00000 n 
+0000605108 00000 n 
+0000605172 00000 n 
+0000605299 00000 n 
+0000605362 00000 n 
+0000605425 00000 n 
+0000605488 00000 n 
+0000605551 00000 n 
+0000605615 00000 n 
+0000605678 00000 n 
+0000605741 00000 n 
+0000605804 00000 n 
+0000605868 00000 n 
+0000605931 00000 n 
+0000605994 00000 n 
+0000606057 00000 n 
+0000606121 00000 n 
+0000606247 00000 n 
+0000606373 00000 n 
+0000606499 00000 n 
+0000606562 00000 n 
+0000606689 00000 n 
+0000606753 00000 n 
+0000606878 00000 n 
+0000606940 00000 n 
+0000607002 00000 n 
+0000607064 00000 n 
+0000607127 00000 n 
+0000607190 00000 n 
+0000612890 00000 n 
+0000608413 00000 n 
+0000607396 00000 n 
+0000608537 00000 n 
+0000608600 00000 n 
+0000608727 00000 n 
+0000608790 00000 n 
+0000608851 00000 n 
+0000608912 00000 n 
+0000608975 00000 n 
+0000609103 00000 n 
+0000609229 00000 n 
+0000609356 00000 n 
+0000609419 00000 n 
+0000609546 00000 n 
+0000609610 00000 n 
+0000609737 00000 n 
+0000609800 00000 n 
+0000609863 00000 n 
+0000609927 00000 n 
+0000609991 00000 n 
+0000610055 00000 n 
+0000610182 00000 n 
+0000610245 00000 n 
+0000610308 00000 n 
+0000610371 00000 n 
+0000610434 00000 n 
+0000610561 00000 n 
+0000610686 00000 n 
+0000610749 00000 n 
+0000610876 00000 n 
+0000610940 00000 n 
+0000611067 00000 n 
+0000611130 00000 n 
+0000611193 00000 n 
+0000611257 00000 n 
+0000611321 00000 n 
+0000611385 00000 n 
+0000611512 00000 n 
+0000611574 00000 n 
+0000611637 00000 n 
+0000611700 00000 n 
+0000611763 00000 n 
+0000611890 00000 n 
+0000612016 00000 n 
+0000612079 00000 n 
+0000612206 00000 n 
+0000612270 00000 n 
+0000612395 00000 n 
+0000612457 00000 n 
+0000612519 00000 n 
+0000612580 00000 n 
+0000612642 00000 n 
+0000612704 00000 n 
+0000612766 00000 n 
+0000612828 00000 n 
+0000618534 00000 n 
+0000614178 00000 n 
+0000613034 00000 n 
+0000614302 00000 n 
+0000614429 00000 n 
+0000614492 00000 n 
+0000614553 00000 n 
+0000614614 00000 n 
+0000614677 00000 n 
+0000614741 00000 n 
+0000614804 00000 n 
+0000614868 00000 n 
+0000614995 00000 n 
+0000615121 00000 n 
+0000615248 00000 n 
+0000615311 00000 n 
+0000615438 00000 n 
+0000615502 00000 n 
+0000615629 00000 n 
+0000615692 00000 n 
+0000615754 00000 n 
+0000615817 00000 n 
+0000615880 00000 n 
+0000615944 00000 n 
+0000616071 00000 n 
+0000616134 00000 n 
+0000616196 00000 n 
+0000616258 00000 n 
+0000616321 00000 n 
+0000616385 00000 n 
+0000616512 00000 n 
+0000616638 00000 n 
+0000616765 00000 n 
+0000616828 00000 n 
+0000616955 00000 n 
+0000617019 00000 n 
+0000617146 00000 n 
+0000617209 00000 n 
+0000617272 00000 n 
+0000617335 00000 n 
+0000617399 00000 n 
+0000617462 00000 n 
+0000617526 00000 n 
+0000617590 00000 n 
+0000617716 00000 n 
+0000617779 00000 n 
+0000617842 00000 n 
+0000617905 00000 n 
+0000617968 00000 n 
+0000618032 00000 n 
+0000618095 00000 n 
+0000618158 00000 n 
+0000618221 00000 n 
+0000618284 00000 n 
+0000618410 00000 n 
+0000854800 00000 n 
+0000624236 00000 n 
+0000619682 00000 n 
+0000618678 00000 n 
+0000619806 00000 n 
+0000619869 00000 n 
+0000619932 00000 n 
+0000620059 00000 n 
+0000620122 00000 n 
+0000620249 00000 n 
+0000620312 00000 n 
+0000620439 00000 n 
+0000620502 00000 n 
+0000620565 00000 n 
+0000620628 00000 n 
+0000620691 00000 n 
+0000620755 00000 n 
+0000620882 00000 n 
+0000620945 00000 n 
+0000621008 00000 n 
+0000621071 00000 n 
+0000621134 00000 n 
+0000621198 00000 n 
+0000621325 00000 n 
+0000621451 00000 n 
+0000621578 00000 n 
+0000621641 00000 n 
+0000621768 00000 n 
+0000621832 00000 n 
+0000621959 00000 n 
+0000622022 00000 n 
+0000622085 00000 n 
+0000622148 00000 n 
+0000622212 00000 n 
+0000622276 00000 n 
+0000622403 00000 n 
+0000622466 00000 n 
+0000622529 00000 n 
+0000622592 00000 n 
+0000622655 00000 n 
+0000622719 00000 n 
+0000622846 00000 n 
+0000623095 00000 n 
+0000623222 00000 n 
+0000623284 00000 n 
+0000623410 00000 n 
+0000623474 00000 n 
+0000623601 00000 n 
+0000623664 00000 n 
+0000623727 00000 n 
+0000623791 00000 n 
+0000623855 00000 n 
+0000623919 00000 n 
+0000623983 00000 n 
+0000624047 00000 n 
+0000624110 00000 n 
+0000624174 00000 n 
+0000630769 00000 n 
+0000625900 00000 n 
+0000624380 00000 n 
+0000626024 00000 n 
+0000626087 00000 n 
+0000626214 00000 n 
+0000626277 00000 n 
+0000626338 00000 n 
+0000626399 00000 n 
+0000626462 00000 n 
+0000626526 00000 n 
+0000626589 00000 n 
+0000626653 00000 n 
+0000626715 00000 n 
+0000626777 00000 n 
+0000626840 00000 n 
+0000626904 00000 n 
+0000627031 00000 n 
+0000627094 00000 n 
+0000627158 00000 n 
+0000627285 00000 n 
+0000627412 00000 n 
+0000627475 00000 n 
+0000627602 00000 n 
+0000627666 00000 n 
+0000627793 00000 n 
+0000627856 00000 n 
+0000627919 00000 n 
+0000627982 00000 n 
+0000628046 00000 n 
+0000628110 00000 n 
+0000628237 00000 n 
+0000628300 00000 n 
+0000628363 00000 n 
+0000628426 00000 n 
+0000628488 00000 n 
+0000628614 00000 n 
+0000628741 00000 n 
+0000628804 00000 n 
+0000628931 00000 n 
+0000628995 00000 n 
+0000629122 00000 n 
+0000629185 00000 n 
+0000629248 00000 n 
+0000629311 00000 n 
+0000629375 00000 n 
+0000629439 00000 n 
+0000629503 00000 n 
+0000629567 00000 n 
+0000629631 00000 n 
+0000629694 00000 n 
+0000629758 00000 n 
+0000629822 00000 n 
+0000629886 00000 n 
+0000629950 00000 n 
+0000630014 00000 n 
+0000630078 00000 n 
+0000630205 00000 n 
+0000630268 00000 n 
+0000630330 00000 n 
+0000630392 00000 n 
+0000630455 00000 n 
+0000630518 00000 n 
+0000630581 00000 n 
+0000630644 00000 n 
+0000630706 00000 n 
+0000636908 00000 n 
+0000632358 00000 n 
+0000630913 00000 n 
+0000632482 00000 n 
+0000632545 00000 n 
+0000632608 00000 n 
+0000632671 00000 n 
+0000632734 00000 n 
+0000632798 00000 n 
+0000632861 00000 n 
+0000632925 00000 n 
+0000632988 00000 n 
+0000633051 00000 n 
+0000633113 00000 n 
+0000633177 00000 n 
+0000633239 00000 n 
+0000633301 00000 n 
+0000633364 00000 n 
+0000633428 00000 n 
+0000633555 00000 n 
+0000633618 00000 n 
+0000633682 00000 n 
+0000633809 00000 n 
+0000633935 00000 n 
+0000634061 00000 n 
+0000634124 00000 n 
+0000634250 00000 n 
+0000634314 00000 n 
+0000634441 00000 n 
+0000634504 00000 n 
+0000634567 00000 n 
+0000634630 00000 n 
+0000634694 00000 n 
+0000634758 00000 n 
+0000634822 00000 n 
+0000634886 00000 n 
+0000634950 00000 n 
+0000635013 00000 n 
+0000635140 00000 n 
+0000635203 00000 n 
+0000635266 00000 n 
+0000635329 00000 n 
+0000635392 00000 n 
+0000635456 00000 n 
+0000635519 00000 n 
+0000635582 00000 n 
+0000635645 00000 n 
+0000635709 00000 n 
+0000635772 00000 n 
+0000635835 00000 n 
+0000635897 00000 n 
+0000635961 00000 n 
+0000636088 00000 n 
+0000636151 00000 n 
+0000636215 00000 n 
+0000636342 00000 n 
+0000636468 00000 n 
+0000636595 00000 n 
+0000636658 00000 n 
+0000636784 00000 n 
+0000636847 00000 n 
+0000642874 00000 n 
+0000638265 00000 n 
+0000637052 00000 n 
+0000638389 00000 n 
+0000638516 00000 n 
+0000638579 00000 n 
+0000638640 00000 n 
+0000638703 00000 n 
+0000638767 00000 n 
+0000638831 00000 n 
+0000638895 00000 n 
+0000638959 00000 n 
+0000639086 00000 n 
+0000639149 00000 n 
+0000639212 00000 n 
+0000639275 00000 n 
+0000639338 00000 n 
+0000639402 00000 n 
+0000639465 00000 n 
+0000639528 00000 n 
+0000639591 00000 n 
+0000639655 00000 n 
+0000639781 00000 n 
+0000639844 00000 n 
+0000639971 00000 n 
+0000640097 00000 n 
+0000640222 00000 n 
+0000640285 00000 n 
+0000640412 00000 n 
+0000640476 00000 n 
+0000640602 00000 n 
+0000640664 00000 n 
+0000640727 00000 n 
+0000640790 00000 n 
+0000640854 00000 n 
+0000640918 00000 n 
+0000640982 00000 n 
+0000641046 00000 n 
+0000641173 00000 n 
+0000641236 00000 n 
+0000641298 00000 n 
+0000641360 00000 n 
+0000641423 00000 n 
+0000641487 00000 n 
+0000641550 00000 n 
+0000641613 00000 n 
+0000641675 00000 n 
+0000641739 00000 n 
+0000641866 00000 n 
+0000641992 00000 n 
+0000642119 00000 n 
+0000642182 00000 n 
+0000642309 00000 n 
+0000642373 00000 n 
+0000642499 00000 n 
+0000642562 00000 n 
+0000642624 00000 n 
+0000642686 00000 n 
+0000642749 00000 n 
+0000642812 00000 n 
+0000648297 00000 n 
+0000644190 00000 n 
+0000643018 00000 n 
+0000644314 00000 n 
+0000644441 00000 n 
+0000644504 00000 n 
+0000644565 00000 n 
+0000644626 00000 n 
+0000644689 00000 n 
+0000644816 00000 n 
+0000644943 00000 n 
+0000645006 00000 n 
+0000645133 00000 n 
+0000645196 00000 n 
+0000645323 00000 n 
+0000645386 00000 n 
+0000645449 00000 n 
+0000645513 00000 n 
+0000645577 00000 n 
+0000645640 00000 n 
+0000645767 00000 n 
+0000645830 00000 n 
+0000645893 00000 n 
+0000645956 00000 n 
+0000646018 00000 n 
+0000646082 00000 n 
+0000646209 00000 n 
+0000646272 00000 n 
+0000646399 00000 n 
+0000646526 00000 n 
+0000646589 00000 n 
+0000646716 00000 n 
+0000646780 00000 n 
+0000646907 00000 n 
+0000646968 00000 n 
+0000647031 00000 n 
+0000647094 00000 n 
+0000647157 00000 n 
+0000647221 00000 n 
+0000647285 00000 n 
+0000647349 00000 n 
+0000647476 00000 n 
+0000647539 00000 n 
+0000647602 00000 n 
+0000647665 00000 n 
+0000647728 00000 n 
+0000647791 00000 n 
+0000647854 00000 n 
+0000647917 00000 n 
+0000647980 00000 n 
+0000648044 00000 n 
+0000648171 00000 n 
+0000655442 00000 n 
+0000649873 00000 n 
+0000648441 00000 n 
+0000649997 00000 n 
+0000650060 00000 n 
+0000650250 00000 n 
+0000650377 00000 n 
+0000650440 00000 n 
+0000650567 00000 n 
+0000650631 00000 n 
+0000650758 00000 n 
+0000650821 00000 n 
+0000650884 00000 n 
+0000650947 00000 n 
+0000651011 00000 n 
+0000651075 00000 n 
+0000651139 00000 n 
+0000651203 00000 n 
+0000651267 00000 n 
+0000651331 00000 n 
+0000651457 00000 n 
+0000651520 00000 n 
+0000651583 00000 n 
+0000651646 00000 n 
+0000651709 00000 n 
+0000651773 00000 n 
+0000651836 00000 n 
+0000651899 00000 n 
+0000651962 00000 n 
+0000652026 00000 n 
+0000652089 00000 n 
+0000652152 00000 n 
+0000652215 00000 n 
+0000652279 00000 n 
+0000652406 00000 n 
+0000652532 00000 n 
+0000652659 00000 n 
+0000652722 00000 n 
+0000652849 00000 n 
+0000652913 00000 n 
+0000653040 00000 n 
+0000653102 00000 n 
+0000653165 00000 n 
+0000653228 00000 n 
+0000653292 00000 n 
+0000653355 00000 n 
+0000653419 00000 n 
+0000653483 00000 n 
+0000653547 00000 n 
+0000653610 00000 n 
+0000653674 00000 n 
+0000653738 00000 n 
+0000653802 00000 n 
+0000653866 00000 n 
+0000653930 00000 n 
+0000653994 00000 n 
+0000654121 00000 n 
+0000654184 00000 n 
+0000654247 00000 n 
+0000654310 00000 n 
+0000654373 00000 n 
+0000654437 00000 n 
+0000654500 00000 n 
+0000654563 00000 n 
+0000654626 00000 n 
+0000654689 00000 n 
+0000654752 00000 n 
+0000654815 00000 n 
+0000654878 00000 n 
+0000654942 00000 n 
+0000655005 00000 n 
+0000655068 00000 n 
+0000655130 00000 n 
+0000655193 00000 n 
+0000655255 00000 n 
+0000655317 00000 n 
+0000655379 00000 n 
+0000854925 00000 n 
+0000661465 00000 n 
+0000656972 00000 n 
+0000655586 00000 n 
+0000657096 00000 n 
+0000657159 00000 n 
+0000657222 00000 n 
+0000657285 00000 n 
+0000657348 00000 n 
+0000657411 00000 n 
+0000657539 00000 n 
+0000657601 00000 n 
+0000657665 00000 n 
+0000657792 00000 n 
+0000657918 00000 n 
+0000658045 00000 n 
+0000658108 00000 n 
+0000658235 00000 n 
+0000658298 00000 n 
+0000658425 00000 n 
+0000658488 00000 n 
+0000658551 00000 n 
+0000658614 00000 n 
+0000658678 00000 n 
+0000658742 00000 n 
+0000658806 00000 n 
+0000658870 00000 n 
+0000658934 00000 n 
+0000658997 00000 n 
+0000659124 00000 n 
+0000659187 00000 n 
+0000659250 00000 n 
+0000659313 00000 n 
+0000659376 00000 n 
+0000659439 00000 n 
+0000659502 00000 n 
+0000659565 00000 n 
+0000659628 00000 n 
+0000659692 00000 n 
+0000659755 00000 n 
+0000659818 00000 n 
+0000659881 00000 n 
+0000659945 00000 n 
+0000660072 00000 n 
+0000660135 00000 n 
+0000660199 00000 n 
+0000660326 00000 n 
+0000660452 00000 n 
+0000660579 00000 n 
+0000660642 00000 n 
+0000660769 00000 n 
+0000660833 00000 n 
+0000660959 00000 n 
+0000661022 00000 n 
+0000661085 00000 n 
+0000661148 00000 n 
+0000661212 00000 n 
+0000661275 00000 n 
+0000661339 00000 n 
+0000661403 00000 n 
+0000667133 00000 n 
+0000662783 00000 n 
+0000661609 00000 n 
+0000662907 00000 n 
+0000663034 00000 n 
+0000663097 00000 n 
+0000663158 00000 n 
+0000663219 00000 n 
+0000663282 00000 n 
+0000663346 00000 n 
+0000663409 00000 n 
+0000663473 00000 n 
+0000663600 00000 n 
+0000663663 00000 n 
+0000663790 00000 n 
+0000663916 00000 n 
+0000664041 00000 n 
+0000664104 00000 n 
+0000664231 00000 n 
+0000664295 00000 n 
+0000664422 00000 n 
+0000664483 00000 n 
+0000664546 00000 n 
+0000664609 00000 n 
+0000664673 00000 n 
+0000664736 00000 n 
+0000664800 00000 n 
+0000664864 00000 n 
+0000664991 00000 n 
+0000665054 00000 n 
+0000665117 00000 n 
+0000665180 00000 n 
+0000665243 00000 n 
+0000665306 00000 n 
+0000665369 00000 n 
+0000665432 00000 n 
+0000665495 00000 n 
+0000665559 00000 n 
+0000665686 00000 n 
+0000665812 00000 n 
+0000665937 00000 n 
+0000666000 00000 n 
+0000666127 00000 n 
+0000666191 00000 n 
+0000666317 00000 n 
+0000666379 00000 n 
+0000666442 00000 n 
+0000666505 00000 n 
+0000666569 00000 n 
+0000666632 00000 n 
+0000666759 00000 n 
+0000666822 00000 n 
+0000666884 00000 n 
+0000666946 00000 n 
+0000667008 00000 n 
+0000673190 00000 n 
+0000668443 00000 n 
+0000667277 00000 n 
+0000668567 00000 n 
+0000668630 00000 n 
+0000668757 00000 n 
+0000668820 00000 n 
+0000668947 00000 n 
+0000669010 00000 n 
+0000669137 00000 n 
+0000669200 00000 n 
+0000669263 00000 n 
+0000669327 00000 n 
+0000669391 00000 n 
+0000669455 00000 n 
+0000669582 00000 n 
+0000669645 00000 n 
+0000669708 00000 n 
+0000669771 00000 n 
+0000669833 00000 n 
+0000669897 00000 n 
+0000670024 00000 n 
+0000670087 00000 n 
+0000670214 00000 n 
+0000670341 00000 n 
+0000670404 00000 n 
+0000670531 00000 n 
+0000670595 00000 n 
+0000670722 00000 n 
+0000670785 00000 n 
+0000670847 00000 n 
+0000670911 00000 n 
+0000670975 00000 n 
+0000671038 00000 n 
+0000671102 00000 n 
+0000671166 00000 n 
+0000671230 00000 n 
+0000671294 00000 n 
+0000671420 00000 n 
+0000671483 00000 n 
+0000671546 00000 n 
+0000671609 00000 n 
+0000671672 00000 n 
+0000671736 00000 n 
+0000671799 00000 n 
+0000671862 00000 n 
+0000671925 00000 n 
+0000671989 00000 n 
+0000672052 00000 n 
+0000672115 00000 n 
+0000672177 00000 n 
+0000672304 00000 n 
+0000672431 00000 n 
+0000672494 00000 n 
+0000672621 00000 n 
+0000672685 00000 n 
+0000672811 00000 n 
+0000672874 00000 n 
+0000672937 00000 n 
+0000673000 00000 n 
+0000673064 00000 n 
+0000673128 00000 n 
+0000678710 00000 n 
+0000674410 00000 n 
+0000673334 00000 n 
+0000674534 00000 n 
+0000674661 00000 n 
+0000674724 00000 n 
+0000674785 00000 n 
+0000674846 00000 n 
+0000674909 00000 n 
+0000675036 00000 n 
+0000675163 00000 n 
+0000675226 00000 n 
+0000675353 00000 n 
+0000675416 00000 n 
+0000675543 00000 n 
+0000675606 00000 n 
+0000675669 00000 n 
+0000675732 00000 n 
+0000675796 00000 n 
+0000675860 00000 n 
+0000675924 00000 n 
+0000675988 00000 n 
+0000676114 00000 n 
+0000676177 00000 n 
+0000676240 00000 n 
+0000676303 00000 n 
+0000676366 00000 n 
+0000676430 00000 n 
+0000676493 00000 n 
+0000676556 00000 n 
+0000676619 00000 n 
+0000676683 00000 n 
+0000676810 00000 n 
+0000676936 00000 n 
+0000677062 00000 n 
+0000677125 00000 n 
+0000677252 00000 n 
+0000677316 00000 n 
+0000677443 00000 n 
+0000677506 00000 n 
+0000677569 00000 n 
+0000677633 00000 n 
+0000677697 00000 n 
+0000677760 00000 n 
+0000677887 00000 n 
+0000677950 00000 n 
+0000678013 00000 n 
+0000678076 00000 n 
+0000678139 00000 n 
+0000678266 00000 n 
+0000678393 00000 n 
+0000678456 00000 n 
+0000678583 00000 n 
+0000678647 00000 n 
+0000685252 00000 n 
+0000680196 00000 n 
+0000678854 00000 n 
+0000680320 00000 n 
+0000680383 00000 n 
+0000680510 00000 n 
+0000680573 00000 n 
+0000680634 00000 n 
+0000680698 00000 n 
+0000680762 00000 n 
+0000680826 00000 n 
+0000680953 00000 n 
+0000681016 00000 n 
+0000681079 00000 n 
+0000681142 00000 n 
+0000681205 00000 n 
+0000681458 00000 n 
+0000681585 00000 n 
+0000681647 00000 n 
+0000681773 00000 n 
+0000681837 00000 n 
+0000681964 00000 n 
+0000682027 00000 n 
+0000682090 00000 n 
+0000682154 00000 n 
+0000682218 00000 n 
+0000682282 00000 n 
+0000682346 00000 n 
+0000682410 00000 n 
+0000682473 00000 n 
+0000682537 00000 n 
+0000682664 00000 n 
+0000682727 00000 n 
+0000682790 00000 n 
+0000682853 00000 n 
+0000682915 00000 n 
+0000682979 00000 n 
+0000683042 00000 n 
+0000683105 00000 n 
+0000683168 00000 n 
+0000683232 00000 n 
+0000683295 00000 n 
+0000683358 00000 n 
+0000683421 00000 n 
+0000683485 00000 n 
+0000683612 00000 n 
+0000683738 00000 n 
+0000683865 00000 n 
+0000683928 00000 n 
+0000684055 00000 n 
+0000684119 00000 n 
+0000684246 00000 n 
+0000684309 00000 n 
+0000684372 00000 n 
+0000684435 00000 n 
+0000684499 00000 n 
+0000684563 00000 n 
+0000684627 00000 n 
+0000684689 00000 n 
+0000684753 00000 n 
+0000684817 00000 n 
+0000684943 00000 n 
+0000685005 00000 n 
+0000685066 00000 n 
+0000685127 00000 n 
+0000685189 00000 n 
+0000690562 00000 n 
+0000686579 00000 n 
+0000685396 00000 n 
+0000686703 00000 n 
+0000686766 00000 n 
+0000686829 00000 n 
+0000686892 00000 n 
+0000686955 00000 n 
+0000687019 00000 n 
+0000687082 00000 n 
+0000687209 00000 n 
+0000687336 00000 n 
+0000687399 00000 n 
+0000687526 00000 n 
+0000687589 00000 n 
+0000687716 00000 n 
+0000687779 00000 n 
+0000687842 00000 n 
+0000687905 00000 n 
+0000687969 00000 n 
+0000688033 00000 n 
+0000688160 00000 n 
+0000688223 00000 n 
+0000688286 00000 n 
+0000688349 00000 n 
+0000688412 00000 n 
+0000688476 00000 n 
+0000688603 00000 n 
+0000688856 00000 n 
+0000688981 00000 n 
+0000689044 00000 n 
+0000689171 00000 n 
+0000689235 00000 n 
+0000689361 00000 n 
+0000689424 00000 n 
+0000689487 00000 n 
+0000689551 00000 n 
+0000689615 00000 n 
+0000689679 00000 n 
+0000689805 00000 n 
+0000689868 00000 n 
+0000689931 00000 n 
+0000689994 00000 n 
+0000690057 00000 n 
+0000690121 00000 n 
+0000690248 00000 n 
+0000690310 00000 n 
+0000690437 00000 n 
+0000855050 00000 n 
+0000696815 00000 n 
+0000691825 00000 n 
+0000690706 00000 n 
+0000691949 00000 n 
+0000692012 00000 n 
+0000692075 00000 n 
+0000692202 00000 n 
+0000692265 00000 n 
+0000692392 00000 n 
+0000692455 00000 n 
+0000692518 00000 n 
+0000692645 00000 n 
+0000692708 00000 n 
+0000692771 00000 n 
+0000692834 00000 n 
+0000692898 00000 n 
+0000692962 00000 n 
+0000693089 00000 n 
+0000693152 00000 n 
+0000693215 00000 n 
+0000693278 00000 n 
+0000693341 00000 n 
+0000693468 00000 n 
+0000693594 00000 n 
+0000693657 00000 n 
+0000693784 00000 n 
+0000693848 00000 n 
+0000693974 00000 n 
+0000694037 00000 n 
+0000694100 00000 n 
+0000694163 00000 n 
+0000694227 00000 n 
+0000694291 00000 n 
+0000694418 00000 n 
+0000694481 00000 n 
+0000694544 00000 n 
+0000694607 00000 n 
+0000694670 00000 n 
+0000694734 00000 n 
+0000694861 00000 n 
+0000694923 00000 n 
+0000695049 00000 n 
+0000695176 00000 n 
+0000695239 00000 n 
+0000695366 00000 n 
+0000695429 00000 n 
+0000695556 00000 n 
+0000695619 00000 n 
+0000695682 00000 n 
+0000695745 00000 n 
+0000695809 00000 n 
+0000695873 00000 n 
+0000695937 00000 n 
+0000696001 00000 n 
+0000696065 00000 n 
+0000696127 00000 n 
+0000696254 00000 n 
+0000696317 00000 n 
+0000696380 00000 n 
+0000696443 00000 n 
+0000696505 00000 n 
+0000696568 00000 n 
+0000696629 00000 n 
+0000696690 00000 n 
+0000696752 00000 n 
+0000702937 00000 n 
+0000698133 00000 n 
+0000696959 00000 n 
+0000698257 00000 n 
+0000698320 00000 n 
+0000698383 00000 n 
+0000698446 00000 n 
+0000698509 00000 n 
+0000698637 00000 n 
+0000698699 00000 n 
+0000698826 00000 n 
+0000698951 00000 n 
+0000699078 00000 n 
+0000699141 00000 n 
+0000699268 00000 n 
+0000699332 00000 n 
+0000699459 00000 n 
+0000699522 00000 n 
+0000699585 00000 n 
+0000699649 00000 n 
+0000699713 00000 n 
+0000699777 00000 n 
+0000699840 00000 n 
+0000699904 00000 n 
+0000700031 00000 n 
+0000700094 00000 n 
+0000700157 00000 n 
+0000700220 00000 n 
+0000700283 00000 n 
+0000700347 00000 n 
+0000700410 00000 n 
+0000700473 00000 n 
+0000700536 00000 n 
+0000700661 00000 n 
+0000700788 00000 n 
+0000700850 00000 n 
+0000700976 00000 n 
+0000701040 00000 n 
+0000701167 00000 n 
+0000701230 00000 n 
+0000701293 00000 n 
+0000701356 00000 n 
+0000701420 00000 n 
+0000701484 00000 n 
+0000701547 00000 n 
+0000701611 00000 n 
+0000701675 00000 n 
+0000701739 00000 n 
+0000701866 00000 n 
+0000701928 00000 n 
+0000701991 00000 n 
+0000702054 00000 n 
+0000702117 00000 n 
+0000702181 00000 n 
+0000702244 00000 n 
+0000702307 00000 n 
+0000702370 00000 n 
+0000702434 00000 n 
+0000702497 00000 n 
+0000702560 00000 n 
+0000702623 00000 n 
+0000702687 00000 n 
+0000702813 00000 n 
+0000702875 00000 n 
+0000708662 00000 n 
+0000704542 00000 n 
+0000703081 00000 n 
+0000704666 00000 n 
+0000704793 00000 n 
+0000704919 00000 n 
+0000705046 00000 n 
+0000705109 00000 n 
+0000705236 00000 n 
+0000705300 00000 n 
+0000705427 00000 n 
+0000705490 00000 n 
+0000705553 00000 n 
+0000705617 00000 n 
+0000705681 00000 n 
+0000705745 00000 n 
+0000705809 00000 n 
+0000705873 00000 n 
+0000706000 00000 n 
+0000706063 00000 n 
+0000706126 00000 n 
+0000706189 00000 n 
+0000706252 00000 n 
+0000706316 00000 n 
+0000706379 00000 n 
+0000706442 00000 n 
+0000706505 00000 n 
+0000706632 00000 n 
+0000706759 00000 n 
+0000706822 00000 n 
+0000706949 00000 n 
+0000707013 00000 n 
+0000707140 00000 n 
+0000707203 00000 n 
+0000707266 00000 n 
+0000707329 00000 n 
+0000707393 00000 n 
+0000707457 00000 n 
+0000707521 00000 n 
+0000707585 00000 n 
+0000707712 00000 n 
+0000707775 00000 n 
+0000707838 00000 n 
+0000707901 00000 n 
+0000707964 00000 n 
+0000708028 00000 n 
+0000708091 00000 n 
+0000708154 00000 n 
+0000708217 00000 n 
+0000708281 00000 n 
+0000708345 00000 n 
+0000708472 00000 n 
+0000708535 00000 n 
+0000714575 00000 n 
+0000709901 00000 n 
+0000708806 00000 n 
+0000710025 00000 n 
+0000710088 00000 n 
+0000710151 00000 n 
+0000710278 00000 n 
+0000710341 00000 n 
+0000710468 00000 n 
+0000710531 00000 n 
+0000710658 00000 n 
+0000710721 00000 n 
+0000710784 00000 n 
+0000710847 00000 n 
+0000710911 00000 n 
+0000710975 00000 n 
+0000711102 00000 n 
+0000711165 00000 n 
+0000711228 00000 n 
+0000711291 00000 n 
+0000711354 00000 n 
+0000711418 00000 n 
+0000711545 00000 n 
+0000711671 00000 n 
+0000711798 00000 n 
+0000711861 00000 n 
+0000711988 00000 n 
+0000712052 00000 n 
+0000712179 00000 n 
+0000712242 00000 n 
+0000712305 00000 n 
+0000712368 00000 n 
+0000712432 00000 n 
+0000712496 00000 n 
+0000712560 00000 n 
+0000712624 00000 n 
+0000712751 00000 n 
+0000712814 00000 n 
+0000712877 00000 n 
+0000712940 00000 n 
+0000713003 00000 n 
+0000713067 00000 n 
+0000713130 00000 n 
+0000713193 00000 n 
+0000713256 00000 n 
+0000713320 00000 n 
+0000713446 00000 n 
+0000713572 00000 n 
+0000713699 00000 n 
+0000713762 00000 n 
+0000713889 00000 n 
+0000713953 00000 n 
+0000714077 00000 n 
+0000714140 00000 n 
+0000714203 00000 n 
+0000714264 00000 n 
+0000714326 00000 n 
+0000714388 00000 n 
+0000714450 00000 n 
+0000714512 00000 n 
+0000720913 00000 n 
+0000715920 00000 n 
+0000714719 00000 n 
+0000716044 00000 n 
+0000716107 00000 n 
+0000716234 00000 n 
+0000716297 00000 n 
+0000716358 00000 n 
+0000716419 00000 n 
+0000716482 00000 n 
+0000716546 00000 n 
+0000716608 00000 n 
+0000716672 00000 n 
+0000716799 00000 n 
+0000716925 00000 n 
+0000717052 00000 n 
+0000717115 00000 n 
+0000717242 00000 n 
+0000717306 00000 n 
+0000717433 00000 n 
+0000717496 00000 n 
+0000717559 00000 n 
+0000717622 00000 n 
+0000717686 00000 n 
+0000717750 00000 n 
+0000717877 00000 n 
+0000717940 00000 n 
+0000718003 00000 n 
+0000718066 00000 n 
+0000718129 00000 n 
+0000718193 00000 n 
+0000718320 00000 n 
+0000718383 00000 n 
+0000718446 00000 n 
+0000718510 00000 n 
+0000718637 00000 n 
+0000718763 00000 n 
+0000718890 00000 n 
+0000718953 00000 n 
+0000719079 00000 n 
+0000719143 00000 n 
+0000719270 00000 n 
+0000719333 00000 n 
+0000719396 00000 n 
+0000719459 00000 n 
+0000719523 00000 n 
+0000719587 00000 n 
+0000719650 00000 n 
+0000719714 00000 n 
+0000719778 00000 n 
+0000719841 00000 n 
+0000719967 00000 n 
+0000720030 00000 n 
+0000720093 00000 n 
+0000720156 00000 n 
+0000720219 00000 n 
+0000720283 00000 n 
+0000720347 00000 n 
+0000720410 00000 n 
+0000720473 00000 n 
+0000720536 00000 n 
+0000720600 00000 n 
+0000720663 00000 n 
+0000720726 00000 n 
+0000720788 00000 n 
+0000720851 00000 n 
+0000727171 00000 n 
+0000722868 00000 n 
+0000721057 00000 n 
+0000722992 00000 n 
+0000723119 00000 n 
+0000723246 00000 n 
+0000723308 00000 n 
+0000723370 00000 n 
+0000723434 00000 n 
+0000723498 00000 n 
+0000723562 00000 n 
+0000723625 00000 n 
+0000723687 00000 n 
+0000723751 00000 n 
+0000723815 00000 n 
+0000723879 00000 n 
+0000724006 00000 n 
+0000724132 00000 n 
+0000724259 00000 n 
+0000724322 00000 n 
+0000724448 00000 n 
+0000724512 00000 n 
+0000724639 00000 n 
+0000724702 00000 n 
+0000724765 00000 n 
+0000724828 00000 n 
+0000724892 00000 n 
+0000724956 00000 n 
+0000725019 00000 n 
+0000725083 00000 n 
+0000725147 00000 n 
+0000725210 00000 n 
+0000725272 00000 n 
+0000725336 00000 n 
+0000725462 00000 n 
+0000725525 00000 n 
+0000725588 00000 n 
+0000725651 00000 n 
+0000725714 00000 n 
+0000725778 00000 n 
+0000725841 00000 n 
+0000725904 00000 n 
+0000725967 00000 n 
+0000726031 00000 n 
+0000726094 00000 n 
+0000726157 00000 n 
+0000726220 00000 n 
+0000726284 00000 n 
+0000726347 00000 n 
+0000726410 00000 n 
+0000726473 00000 n 
+0000726537 00000 n 
+0000726663 00000 n 
+0000726726 00000 n 
+0000726790 00000 n 
+0000726854 00000 n 
+0000726918 00000 n 
+0000727045 00000 n 
+0000855175 00000 n 
+0000733571 00000 n 
+0000728635 00000 n 
+0000727315 00000 n 
+0000728759 00000 n 
+0000728822 00000 n 
+0000728949 00000 n 
+0000729012 00000 n 
+0000729139 00000 n 
+0000729202 00000 n 
+0000729329 00000 n 
+0000729392 00000 n 
+0000729455 00000 n 
+0000729518 00000 n 
+0000729582 00000 n 
+0000729646 00000 n 
+0000729710 00000 n 
+0000729774 00000 n 
+0000729838 00000 n 
+0000729902 00000 n 
+0000730029 00000 n 
+0000730092 00000 n 
+0000730155 00000 n 
+0000730218 00000 n 
+0000730280 00000 n 
+0000730344 00000 n 
+0000730406 00000 n 
+0000730468 00000 n 
+0000730531 00000 n 
+0000730595 00000 n 
+0000730658 00000 n 
+0000730721 00000 n 
+0000730784 00000 n 
+0000730847 00000 n 
+0000730974 00000 n 
+0000731037 00000 n 
+0000731164 00000 n 
+0000731290 00000 n 
+0000731417 00000 n 
+0000731480 00000 n 
+0000731607 00000 n 
+0000731671 00000 n 
+0000731798 00000 n 
+0000731861 00000 n 
+0000731924 00000 n 
+0000731987 00000 n 
+0000732051 00000 n 
+0000732115 00000 n 
+0000732179 00000 n 
+0000732243 00000 n 
+0000732370 00000 n 
+0000732433 00000 n 
+0000732496 00000 n 
+0000732559 00000 n 
+0000732622 00000 n 
+0000732686 00000 n 
+0000732749 00000 n 
+0000732812 00000 n 
+0000732875 00000 n 
+0000732939 00000 n 
+0000733066 00000 n 
+0000733129 00000 n 
+0000733193 00000 n 
+0000733255 00000 n 
+0000733319 00000 n 
+0000733446 00000 n 
+0000739564 00000 n 
+0000735004 00000 n 
+0000733715 00000 n 
+0000735128 00000 n 
+0000735191 00000 n 
+0000735318 00000 n 
+0000735381 00000 n 
+0000735508 00000 n 
+0000735571 00000 n 
+0000735698 00000 n 
+0000735761 00000 n 
+0000735824 00000 n 
+0000735888 00000 n 
+0000735952 00000 n 
+0000736016 00000 n 
+0000736080 00000 n 
+0000736144 00000 n 
+0000736208 00000 n 
+0000736272 00000 n 
+0000736399 00000 n 
+0000736462 00000 n 
+0000736525 00000 n 
+0000736588 00000 n 
+0000736651 00000 n 
+0000736715 00000 n 
+0000736777 00000 n 
+0000736839 00000 n 
+0000736901 00000 n 
+0000736965 00000 n 
+0000737029 00000 n 
+0000737093 00000 n 
+0000737156 00000 n 
+0000737219 00000 n 
+0000737282 00000 n 
+0000737346 00000 n 
+0000737473 00000 n 
+0000737599 00000 n 
+0000737726 00000 n 
+0000737789 00000 n 
+0000737916 00000 n 
+0000737980 00000 n 
+0000738107 00000 n 
+0000738170 00000 n 
+0000738233 00000 n 
+0000738296 00000 n 
+0000738360 00000 n 
+0000738424 00000 n 
+0000738551 00000 n 
+0000738614 00000 n 
+0000738677 00000 n 
+0000738740 00000 n 
+0000738803 00000 n 
+0000738867 00000 n 
+0000738994 00000 n 
+0000739120 00000 n 
+0000739247 00000 n 
+0000739310 00000 n 
+0000739437 00000 n 
+0000739501 00000 n 
+0000744896 00000 n 
+0000740596 00000 n 
+0000739708 00000 n 
+0000740720 00000 n 
+0000740847 00000 n 
+0000740910 00000 n 
+0000740971 00000 n 
+0000741035 00000 n 
+0000741099 00000 n 
+0000741163 00000 n 
+0000741290 00000 n 
+0000741353 00000 n 
+0000741416 00000 n 
+0000741479 00000 n 
+0000741542 00000 n 
+0000741795 00000 n 
+0000741922 00000 n 
+0000741984 00000 n 
+0000742110 00000 n 
+0000742174 00000 n 
+0000742301 00000 n 
+0000742364 00000 n 
+0000742427 00000 n 
+0000742491 00000 n 
+0000742555 00000 n 
+0000742619 00000 n 
+0000742746 00000 n 
+0000742808 00000 n 
+0000742871 00000 n 
+0000742934 00000 n 
+0000742997 00000 n 
+0000743124 00000 n 
+0000743251 00000 n 
+0000743314 00000 n 
+0000743440 00000 n 
+0000743504 00000 n 
+0000743631 00000 n 
+0000743694 00000 n 
+0000743757 00000 n 
+0000743821 00000 n 
+0000743885 00000 n 
+0000743949 00000 n 
+0000744075 00000 n 
+0000744138 00000 n 
+0000744201 00000 n 
+0000744264 00000 n 
+0000744327 00000 n 
+0000744454 00000 n 
+0000744581 00000 n 
+0000744644 00000 n 
+0000744771 00000 n 
+0000744834 00000 n 
+0000750927 00000 n 
+0000747003 00000 n 
+0000745040 00000 n 
+0000747127 00000 n 
+0000747190 00000 n 
+0000747317 00000 n 
+0000747380 00000 n 
+0000747441 00000 n 
+0000747505 00000 n 
+0000747569 00000 n 
+0000747633 00000 n 
+0000747760 00000 n 
+0000747823 00000 n 
+0000747886 00000 n 
+0000747949 00000 n 
+0000748012 00000 n 
+0000748139 00000 n 
+0000748266 00000 n 
+0000748329 00000 n 
+0000748456 00000 n 
+0000748520 00000 n 
+0000748647 00000 n 
+0000748710 00000 n 
+0000748773 00000 n 
+0000748837 00000 n 
+0000748900 00000 n 
+0000748964 00000 n 
+0000749091 00000 n 
+0000749154 00000 n 
+0000749217 00000 n 
+0000749280 00000 n 
+0000749343 00000 n 
+0000749661 00000 n 
+0000749724 00000 n 
+0000749787 00000 n 
+0000749850 00000 n 
+0000749914 00000 n 
+0000749978 00000 n 
+0000750041 00000 n 
+0000750105 00000 n 
+0000750169 00000 n 
+0000750233 00000 n 
+0000750296 00000 n 
+0000750360 00000 n 
+0000750423 00000 n 
+0000750487 00000 n 
+0000750550 00000 n 
+0000750612 00000 n 
+0000750675 00000 n 
+0000750738 00000 n 
+0000750802 00000 n 
+0000750865 00000 n 
+0000755708 00000 n 
+0000753559 00000 n 
+0000751071 00000 n 
+0000753683 00000 n 
+0000753746 00000 n 
+0000753810 00000 n 
+0000753874 00000 n 
+0000753938 00000 n 
+0000754124 00000 n 
+0000754187 00000 n 
+0000754250 00000 n 
+0000754314 00000 n 
+0000754377 00000 n 
+0000754440 00000 n 
+0000754503 00000 n 
+0000754567 00000 n 
+0000754631 00000 n 
+0000754695 00000 n 
+0000754759 00000 n 
+0000754822 00000 n 
+0000754885 00000 n 
+0000754948 00000 n 
+0000755011 00000 n 
+0000755075 00000 n 
+0000755138 00000 n 
+0000755202 00000 n 
+0000755266 00000 n 
+0000755329 00000 n 
+0000755392 00000 n 
+0000755455 00000 n 
+0000755518 00000 n 
+0000755582 00000 n 
+0000763425 00000 n 
+0000758868 00000 n 
+0000755838 00000 n 
+0000758992 00000 n 
+0000759119 00000 n 
+0000759182 00000 n 
+0000759246 00000 n 
+0000759309 00000 n 
+0000759372 00000 n 
+0000759435 00000 n 
+0000759499 00000 n 
+0000759562 00000 n 
+0000759625 00000 n 
+0000759689 00000 n 
+0000759752 00000 n 
+0000759816 00000 n 
+0000759880 00000 n 
+0000759944 00000 n 
+0000760008 00000 n 
+0000760072 00000 n 
+0000760135 00000 n 
+0000760198 00000 n 
+0000760262 00000 n 
+0000760326 00000 n 
+0000760389 00000 n 
+0000760453 00000 n 
+0000760517 00000 n 
+0000760580 00000 n 
+0000760644 00000 n 
+0000760708 00000 n 
+0000760772 00000 n 
+0000760835 00000 n 
+0000760898 00000 n 
+0000760961 00000 n 
+0000761024 00000 n 
+0000761087 00000 n 
+0000761150 00000 n 
+0000761213 00000 n 
+0000761277 00000 n 
+0000761340 00000 n 
+0000761403 00000 n 
+0000761467 00000 n 
+0000761530 00000 n 
+0000761593 00000 n 
+0000761657 00000 n 
+0000761721 00000 n 
+0000761785 00000 n 
+0000761849 00000 n 
+0000761912 00000 n 
+0000761975 00000 n 
+0000762039 00000 n 
+0000762102 00000 n 
+0000762164 00000 n 
+0000762227 00000 n 
+0000762290 00000 n 
+0000762354 00000 n 
+0000762418 00000 n 
+0000762481 00000 n 
+0000762545 00000 n 
+0000762609 00000 n 
+0000762672 00000 n 
+0000762736 00000 n 
+0000762800 00000 n 
+0000762861 00000 n 
+0000762924 00000 n 
+0000762987 00000 n 
+0000763049 00000 n 
+0000763112 00000 n 
+0000763175 00000 n 
+0000763237 00000 n 
+0000763300 00000 n 
+0000763363 00000 n 
+0000855300 00000 n 
+0000774037 00000 n 
+0000766734 00000 n 
+0000763555 00000 n 
+0000766858 00000 n 
+0000766921 00000 n 
+0000766985 00000 n 
+0000767049 00000 n 
+0000767112 00000 n 
+0000767176 00000 n 
+0000767240 00000 n 
+0000767303 00000 n 
+0000767367 00000 n 
+0000767431 00000 n 
+0000767494 00000 n 
+0000767557 00000 n 
+0000767620 00000 n 
+0000767683 00000 n 
+0000767747 00000 n 
+0000767811 00000 n 
+0000767873 00000 n 
+0000767937 00000 n 
+0000768001 00000 n 
+0000768064 00000 n 
+0000768128 00000 n 
+0000768192 00000 n 
+0000768255 00000 n 
+0000768319 00000 n 
+0000768383 00000 n 
+0000768446 00000 n 
+0000768510 00000 n 
+0000768574 00000 n 
+0000768637 00000 n 
+0000768701 00000 n 
+0000768765 00000 n 
+0000768828 00000 n 
+0000768892 00000 n 
+0000768956 00000 n 
+0000769019 00000 n 
+0000769083 00000 n 
+0000769147 00000 n 
+0000769210 00000 n 
+0000769272 00000 n 
+0000769334 00000 n 
+0000769397 00000 n 
+0000769461 00000 n 
+0000769525 00000 n 
+0000769589 00000 n 
+0000769651 00000 n 
+0000769715 00000 n 
+0000769779 00000 n 
+0000769842 00000 n 
+0000769906 00000 n 
+0000769970 00000 n 
+0000770033 00000 n 
+0000770097 00000 n 
+0000770161 00000 n 
+0000770224 00000 n 
+0000770287 00000 n 
+0000770350 00000 n 
+0000770414 00000 n 
+0000770477 00000 n 
+0000770541 00000 n 
+0000770604 00000 n 
+0000770667 00000 n 
+0000770731 00000 n 
+0000770795 00000 n 
+0000770859 00000 n 
+0000770922 00000 n 
+0000770986 00000 n 
+0000771050 00000 n 
+0000771114 00000 n 
+0000771177 00000 n 
+0000771241 00000 n 
+0000771305 00000 n 
+0000771369 00000 n 
+0000771433 00000 n 
+0000771497 00000 n 
+0000771560 00000 n 
+0000771624 00000 n 
+0000771688 00000 n 
+0000771752 00000 n 
+0000771816 00000 n 
+0000771880 00000 n 
+0000771943 00000 n 
+0000772007 00000 n 
+0000772071 00000 n 
+0000772135 00000 n 
+0000772198 00000 n 
+0000772262 00000 n 
+0000772326 00000 n 
+0000772390 00000 n 
+0000772453 00000 n 
+0000772516 00000 n 
+0000772579 00000 n 
+0000772642 00000 n 
+0000772705 00000 n 
+0000772769 00000 n 
+0000772833 00000 n 
+0000772897 00000 n 
+0000772960 00000 n 
+0000773024 00000 n 
+0000773088 00000 n 
+0000773152 00000 n 
+0000773215 00000 n 
+0000773279 00000 n 
+0000773343 00000 n 
+0000773407 00000 n 
+0000773470 00000 n 
+0000773533 00000 n 
+0000773596 00000 n 
+0000773658 00000 n 
+0000773722 00000 n 
+0000773786 00000 n 
+0000773849 00000 n 
+0000773912 00000 n 
+0000782122 00000 n 
+0000776865 00000 n 
+0000774153 00000 n 
+0000776989 00000 n 
+0000777116 00000 n 
+0000777179 00000 n 
+0000777243 00000 n 
+0000777307 00000 n 
+0000777371 00000 n 
+0000777435 00000 n 
+0000777499 00000 n 
+0000777563 00000 n 
+0000777627 00000 n 
+0000777690 00000 n 
+0000777753 00000 n 
+0000777816 00000 n 
+0000777879 00000 n 
+0000777943 00000 n 
+0000778006 00000 n 
+0000778069 00000 n 
+0000778133 00000 n 
+0000778196 00000 n 
+0000778259 00000 n 
+0000778323 00000 n 
+0000778387 00000 n 
+0000778450 00000 n 
+0000778512 00000 n 
+0000778576 00000 n 
+0000778639 00000 n 
+0000778702 00000 n 
+0000778893 00000 n 
+0000778956 00000 n 
+0000779083 00000 n 
+0000779146 00000 n 
+0000779273 00000 n 
+0000779335 00000 n 
+0000779398 00000 n 
+0000779462 00000 n 
+0000779526 00000 n 
+0000779590 00000 n 
+0000779654 00000 n 
+0000779717 00000 n 
+0000779781 00000 n 
+0000779845 00000 n 
+0000779909 00000 n 
+0000779973 00000 n 
+0000780037 00000 n 
+0000780101 00000 n 
+0000780165 00000 n 
+0000780229 00000 n 
+0000780293 00000 n 
+0000780356 00000 n 
+0000780419 00000 n 
+0000780483 00000 n 
+0000780546 00000 n 
+0000780609 00000 n 
+0000780671 00000 n 
+0000780734 00000 n 
+0000780797 00000 n 
+0000780924 00000 n 
+0000780987 00000 n 
+0000781049 00000 n 
+0000781113 00000 n 
+0000781240 00000 n 
+0000781303 00000 n 
+0000781366 00000 n 
+0000781429 00000 n 
+0000781493 00000 n 
+0000781556 00000 n 
+0000781620 00000 n 
+0000781684 00000 n 
+0000781746 00000 n 
+0000781809 00000 n 
+0000781872 00000 n 
+0000781935 00000 n 
+0000781996 00000 n 
+0000782059 00000 n 
+0000789584 00000 n 
+0000784379 00000 n 
+0000782252 00000 n 
+0000784503 00000 n 
+0000784566 00000 n 
+0000784629 00000 n 
+0000784692 00000 n 
+0000784755 00000 n 
+0000784819 00000 n 
+0000784882 00000 n 
+0000784946 00000 n 
+0000785010 00000 n 
+0000785073 00000 n 
+0000785136 00000 n 
+0000785199 00000 n 
+0000785263 00000 n 
+0000785326 00000 n 
+0000785390 00000 n 
+0000785454 00000 n 
+0000785517 00000 n 
+0000785580 00000 n 
+0000785643 00000 n 
+0000785706 00000 n 
+0000785769 00000 n 
+0000785833 00000 n 
+0000785896 00000 n 
+0000785960 00000 n 
+0000786024 00000 n 
+0000786087 00000 n 
+0000786150 00000 n 
+0000786213 00000 n 
+0000786277 00000 n 
+0000786340 00000 n 
+0000786404 00000 n 
+0000786467 00000 n 
+0000786531 00000 n 
+0000786594 00000 n 
+0000786657 00000 n 
+0000786721 00000 n 
+0000786784 00000 n 
+0000786848 00000 n 
+0000786910 00000 n 
+0000786972 00000 n 
+0000787036 00000 n 
+0000787099 00000 n 
+0000787289 00000 n 
+0000787352 00000 n 
+0000787479 00000 n 
+0000787541 00000 n 
+0000787668 00000 n 
+0000787731 00000 n 
+0000787794 00000 n 
+0000787858 00000 n 
+0000787922 00000 n 
+0000787986 00000 n 
+0000788050 00000 n 
+0000788114 00000 n 
+0000788178 00000 n 
+0000788242 00000 n 
+0000788306 00000 n 
+0000788370 00000 n 
+0000788434 00000 n 
+0000788498 00000 n 
+0000788562 00000 n 
+0000788626 00000 n 
+0000788690 00000 n 
+0000788754 00000 n 
+0000788818 00000 n 
+0000788881 00000 n 
+0000788945 00000 n 
+0000789009 00000 n 
+0000789073 00000 n 
+0000789137 00000 n 
+0000789201 00000 n 
+0000789265 00000 n 
+0000789329 00000 n 
+0000789393 00000 n 
+0000789457 00000 n 
+0000789521 00000 n 
+0000796632 00000 n 
+0000791883 00000 n 
+0000789714 00000 n 
+0000792007 00000 n 
+0000792134 00000 n 
+0000792197 00000 n 
+0000792260 00000 n 
+0000792324 00000 n 
+0000792388 00000 n 
+0000792516 00000 n 
+0000792579 00000 n 
+0000792642 00000 n 
+0000792705 00000 n 
+0000792769 00000 n 
+0000792831 00000 n 
+0000792895 00000 n 
+0000792959 00000 n 
+0000793021 00000 n 
+0000793084 00000 n 
+0000793147 00000 n 
+0000793211 00000 n 
+0000793274 00000 n 
+0000793338 00000 n 
+0000793401 00000 n 
+0000793464 00000 n 
+0000793527 00000 n 
+0000793591 00000 n 
+0000793654 00000 n 
+0000793718 00000 n 
+0000793782 00000 n 
+0000793845 00000 n 
+0000793908 00000 n 
+0000793971 00000 n 
+0000794034 00000 n 
+0000794097 00000 n 
+0000794161 00000 n 
+0000794224 00000 n 
+0000794288 00000 n 
+0000794352 00000 n 
+0000794416 00000 n 
+0000794479 00000 n 
+0000794542 00000 n 
+0000794606 00000 n 
+0000794669 00000 n 
+0000794732 00000 n 
+0000794795 00000 n 
+0000794858 00000 n 
+0000794921 00000 n 
+0000794985 00000 n 
+0000795047 00000 n 
+0000795111 00000 n 
+0000795175 00000 n 
+0000795237 00000 n 
+0000795299 00000 n 
+0000795363 00000 n 
+0000795426 00000 n 
+0000795490 00000 n 
+0000795554 00000 n 
+0000795617 00000 n 
+0000795680 00000 n 
+0000795744 00000 n 
+0000795807 00000 n 
+0000795871 00000 n 
+0000795934 00000 n 
+0000795998 00000 n 
+0000796061 00000 n 
+0000796124 00000 n 
+0000796188 00000 n 
+0000796251 00000 n 
+0000796315 00000 n 
+0000796378 00000 n 
+0000796441 00000 n 
+0000796505 00000 n 
+0000796568 00000 n 
+0000796762 00000 n 
+0000811251 00000 n 
+0000833715 00000 n 
+0000853155 00000 n 
+0000855416 00000 n 
+0000855542 00000 n 
+0000855668 00000 n 
+0000855767 00000 n 
+0000855849 00000 n 
+0000928650 00000 n 
+0001022297 00000 n 
+0001022338 00000 n 
+0001022378 00000 n 
+0001022610 00000 n 
+trailer
+<<
+/Size 8332
+/Root 8330 0 R
+/Info 8331 0 R
+>>
+startxref
+1022766
+%%EOF
diff --git a/lincan-0.3.3/doc/lincandoc/Makefile b/lincan-0.3.3/doc/lincandoc/Makefile
new file mode 100644 (file)
index 0000000..197fd7f
--- /dev/null
@@ -0,0 +1,26 @@
+XML_BASENAMES = lincandoc
+
+DSL_DIR = ../../dsl
+
+XML_SRC = ${XML_BASENAMES:%=%.xml}
+
+DSL_DEF = -d $(DSL_DIR)/ocera-print.dsl
+
+all: lincandoc.pdf
+
+XML_ENT_INCS = $(wildcard *.ent)
+XML_ENTITIES = $(shell cat $(XML_ENT_INCS) | \
+                 sed -n -e 's/^ *<!ENTITY *[^ ]* *SYSTEM *"\([^"]*\)" *> *$$/\1/p' | \
+                 sed -e 's/^\([^.]*\)$$/\1.*/p' )
+
+%.pdf: %.xml $(XML_ENTITIES) $(XML_ENT_INCS)
+       #echo "$(XML_ENTITIES) $(XML_ENT_INCS)"
+       docbook2pdf $(DSL_DEF) $<
+
+clean:
+       @rm -f  ${XML_BASENAMES:%=%.html}
+       @rm -f  ${XML_BASENAMES:%=%.pdf}
+       @rm -f ./*.log
+       @rm -f ./*.out
+       @rm -f ./*~
+
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.eps b/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.eps
new file mode 100644 (file)
index 0000000..9d4772a
--- /dev/null
@@ -0,0 +1,560 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /root/ocera/presentation/RTLWS03/fig/lincan_arch1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Oct  4 16:34:08 2003
+%%For: pisa@kotik (Pavel Pisa)
+%%BoundingBox: 0 0 427 413
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.598 0.797 0.996 srgb} bind def
+/col33 {0.898 0.898 0.297 srgb} bind def
+/col34 {0.996 0.996 0.598 srgb} bind def
+/col35 {0.996 0.598 0.398 srgb} bind def
+/col36 {0.000 0.680 0.000 srgb} bind def
+/col37 {0.418 0.000 0.578 srgb} bind def
+/col38 {0.500 0.000 0.500 srgb} bind def
+/col39 {0.875 0.875 0.875 srgb} bind def
+/col40 {0.000 0.000 0.500 srgb} bind def
+/col41 {0.859 0.137 0.000 srgb} bind def
+/col42 {0.719 0.277 0.000 srgb} bind def
+
+end
+save
+newpath 0 413 moveto 0 0 lineto 427 0 lineto 427 413 lineto closepath clip newpath
+-25.0 509.5 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 200
+% Polyline
+30.000 slw
+n 4800 1650 m 7500 1650 l 7500 2250 l 4800 2250 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4800 2475 m 7500 2475 l 7500 3075 l 4800 3075 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4800 3450 m 7500 3450 l 7500 4050 l 4800 4050 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4800 6150 m 7500 6150 l 7500 6750 l 4800 6750 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3450 5325 m 5250 5325 l 5250 5925 l 3450 5925 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4800 7800 m 7500 7800 l 7500 8400 l 4800 8400 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3600 6975 m 5400 6975 l 5400 7575 l 3600 7575 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 600 1950 m 2400 1950 l 2400 2550 l 600 2550 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 600 3450 m 2400 3450 l 2400 4050 l 600 4050 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 450 4950 m 2550 4950 l 2550 5550 l 450 5550 l
+ cp gs col39 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 81
+%  polyline 
+% Polyline
+7.500 slw
+n 1464 8174 m 750 8174 l 750 6870 l 2180 6870 l 2180 8174 l
+ 1464 8174 l  cp gs col39 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 50
+/Times-Roman ff 420.00 scf sf
+6150 2100 m
+gs 1 -1 sc (Testclient) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+6150 2925 m
+gs 1 -1 sc (CanMonitor #1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+6150 3900 m
+gs 1 -1 sc (CanMonitor #2) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6150 6600 m
+gs 1 -1 sc (CanDev1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+4350 5775 m
+gs 1 -1 sc (VCA lib) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6150 8250 m
+gs 1 -1 sc (CanDev1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+4500 7425 m
+gs 1 -1 sc (VCA lib) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+1500 2400 m
+gs 1 -1 sc (Canmond) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+1500 3900 m
+gs 1 -1 sc (VCA lib) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+1500 5400 m
+gs 1 -1 sc (CAN driver) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 330.00 scf sf
+1425 7575 m
+gs 1 -1 sc (controller) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 330.00 scf sf
+1425 7275 m
+gs 1 -1 sc (CAN) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 330.00 scf sf
+1425 7875 m
+gs 1 -1 sc (or virtual) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+30.000 slw
+n 1500 4950 m
+ 1500 4725 l gs col0 s gr 
+% Polyline
+n 1500 6450 m
+ 1500 6225 l gs col0 s gr 
+% Polyline
+n 1500 3450 m
+ 1500 3225 l gs col0 s gr 
+% Polyline
+gs  clippath
+1545 5535 m 1455 5535 l 1455 5795 l 1500 5615 l 1545 5795 l cp
+eoclip
+n 1500 5925 m
+ 1500 5550 l gs col0 s gr gr
+
+% arrowhead
+n 1545 5795 m 1500 5615 l 1455 5795 l 1545 5795 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1545 4035 m 1455 4035 l 1455 4295 l 1500 4115 l 1545 4295 l cp
+eoclip
+n 1500 4425 m
+ 1500 4050 l gs col0 s gr gr
+
+% arrowhead
+n 1545 4295 m 1500 4115 l 1455 4295 l 1545 4295 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1545 2535 m 1455 2535 l 1455 2795 l 1500 2615 l 1545 2795 l cp
+eoclip
+n 1500 2850 m
+ 1500 2550 l gs col0 s gr gr
+
+% arrowhead
+n 1545 2795 m 1500 2615 l 1455 2795 l 1545 2795 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4819 1993 m 4810 1903 l 4552 1928 l 4736 1956 l 4561 2018 l cp
+eoclip
+n 2475 2175 m
+ 4800 1950 l gs col0 s gr gr
+
+% arrowhead
+n 4561 2018 m 4736 1956 l 4552 1928 l 4561 2018 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4804 2822 m 4824 2734 l 4571 2677 l 4737 2761 l 4551 2765 l cp
+eoclip
+n 2475 2250 m
+ 4800 2775 l gs col0 s gr gr
+
+% arrowhead
+n 4551 2765 m 4737 2761 l 4571 2677 l 4551 2765 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4789 3796 m 4836 3719 l 4615 3583 l 4745 3716 l 4568 3660 l cp
+eoclip
+n 2475 2325 m
+ 4800 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4568 3660 m 4745 3716 l 4615 3583 l 4568 3660 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3452 5522 m 3476 5435 l 3226 5367 l 3388 5458 l 3202 5454 l cp
+eoclip
+n 2625 5250 m
+ 3450 5475 l gs col0 s gr gr
+
+% arrowhead
+n 3202 5454 m 3388 5458 l 3226 5367 l 3202 5454 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4329 7017 m 4391 6952 l 4204 6773 l 4303 6930 l 4141 6838 l cp
+eoclip
+n 2625 5325 m
+ 4350 6975 l gs col0 s gr gr
+
+% arrowhead
+n 4141 6838 m 4303 6930 l 4204 6773 l 4141 6838 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5702 6197 m 5726 6110 l 5476 6042 l 5638 6133 l 5452 6129 l cp
+eoclip
+n 4875 5925 m
+ 5700 6150 l gs col0 s gr gr
+
+% arrowhead
+n 5452 6129 m 5638 6133 l 5476 6042 l 5452 6129 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5539 7846 m 5586 7769 l 5362 7635 l 5494 7767 l 5316 7712 l cp
+eoclip
+n 5175 7575 m
+ 5550 7800 l gs col0 s gr gr
+
+% arrowhead
+n 5316 7712 m 5494 7767 l 5362 7635 l 5316 7712 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5820 4035 m 5730 4035 l 5730 4295 l 5775 4115 l 5820 4295 l cp
+eoclip
+n 5775 4575 m
+ 5775 4050 l gs col0 s gr gr
+
+% arrowhead
+n 5820 4295 m 5775 4115 l 5730 4295 l 5820 4295 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5730 6165 m 5820 6165 l 5820 5905 l 5775 6085 l 5730 5905 l cp
+eoclip
+n 5775 5175 m
+ 5775 6150 l gs col0 s gr gr
+
+% arrowhead
+n 5730 5905 m 5775 6085 l 5820 5905 l 5730 5905 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 360.00 scf sf
+750 6150 m
+gs 1 -1 sc (IO or MEM) col0 sh gr
+/Times-Roman ff 600.00 scf sf
+6150 5100 m
+gs 1 -1 sc (EDS) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+900 3150 m
+gs 1 -1 sc (VCA API) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+750 4650 m
+gs 1 -1 sc (File ops \(rd, wr, ioctl\)) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+3300 1950 m
+gs 1 -1 sc (TCP/IP) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 4500 m
+gs 1 -1 sc (parser) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 5550 m
+gs 1 -1 sc (parser or) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 5955 m
+gs 1 -1 sc (compiler) col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 0
+%  polyline 
+% Polyline
+n 825 6568 m 898 6568 l 898 6872 l 825 6872 l
+ 825 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1425 6568 m 1497 6568 l 1497 6872 l 1425 6872 l
+ 1425 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1025 6568 m 1097 6568 l 1097 6872 l 1025 6872 l
+ 1025 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1225 6568 m 1298 6568 l 1298 6872 l 1225 6872 l
+ 1225 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1625 6568 m 1697 6568 l 1697 6872 l 1625 6872 l
+ 1625 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1825 6568 m 1898 6568 l 1898 6872 l 1825 6872 l
+ 1825 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2025 6568 m 2097 6568 l 2097 6872 l 2025 6872 l
+ 2025 6568 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 821 8176 m 894 8176 l 894 8480 l 821 8480 l
+ 821 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1421 8176 m 1494 8176 l 1494 8480 l 1421 8480 l
+ 1421 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1021 8176 m 1094 8176 l 1094 8480 l 1021 8480 l
+ 1021 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1222 8176 m 1294 8176 l 1294 8480 l 1222 8480 l
+ 1222 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1621 8176 m 1694 8176 l 1694 8480 l 1621 8480 l
+ 1621 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1822 8176 m 1894 8176 l 1894 8480 l 1822 8480 l
+ 1822 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2021 8176 m 2094 8176 l 2094 8480 l 2021 8480 l
+ 2021 8176 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 8095 m 738 8130 l 435 8130 l 435 8058 l 738 8058 l
+ 738 8095 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 7526 m 738 7562 l 435 7562 l 435 7490 l 738 7490 l
+ 738 7526 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 7905 m 738 7941 l 435 7941 l 435 7869 l 738 7869 l
+ 738 7905 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 7716 m 738 7752 l 435 7752 l 435 7679 l 738 7679 l
+ 738 7716 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 7337 m 738 7373 l 435 7373 l 435 7301 l 738 7301 l
+ 738 7337 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 7148 m 738 7183 l 435 7183 l 435 7111 l 738 7111 l
+ 738 7148 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 738 6958 m 738 6994 l 435 6994 l 435 6922 l 738 6922 l
+ 738 6958 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 8087 m 2481 8122 l 2177 8122 l 2177 8050 l 2481 8050 l
+ 2481 8087 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 7518 m 2481 7554 l 2177 7554 l 2177 7482 l 2481 7482 l
+ 2481 7518 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 7897 m 2481 7933 l 2177 7933 l 2177 7861 l 2481 7861 l
+ 2481 7897 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 7708 m 2481 7744 l 2177 7744 l 2177 7671 l 2481 7671 l
+ 2481 7708 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 7329 m 2481 7365 l 2177 7365 l 2177 7293 l 2481 7293 l
+ 2481 7329 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 7140 m 2481 7175 l 2177 7175 l 2177 7103 l 2481 7103 l
+ 2481 7140 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2481 6950 m 2481 6986 l 2177 6986 l 2177 6914 l 2481 6914 l
+ 2481 6950 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+7.500 slw
+n 861 6872 m 825 6872 l 825 6568 l 898 6568 l 898 6872 l
+ 861 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1461 6872 m 1425 6872 l 1425 6568 l 1497 6568 l 1497 6872 l
+ 1461 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1261 6872 m 1225 6872 l 1225 6568 l 1298 6568 l 1298 6872 l
+ 1261 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1661 6872 m 1625 6872 l 1625 6568 l 1697 6568 l 1697 6872 l
+ 1661 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1861 6872 m 1825 6872 l 1825 6568 l 1898 6568 l 1898 6872 l
+ 1861 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2061 6872 m 2025 6872 l 2025 6568 l 2097 6568 l 2097 6872 l
+ 2061 6872 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 857 8480 m 821 8480 l 821 8176 l 894 8176 l 894 8480 l
+ 857 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1057 8480 m 1021 8480 l 1021 8176 l 1094 8176 l 1094 8480 l
+ 1057 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1258 8480 m 1222 8480 l 1222 8176 l 1294 8176 l 1294 8480 l
+ 1258 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1657 8480 m 1621 8480 l 1621 8176 l 1694 8176 l 1694 8480 l
+ 1657 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1857 8480 m 1822 8480 l 1822 8176 l 1894 8176 l 1894 8480 l
+ 1857 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2057 8480 m 2021 8480 l 2021 8176 l 2094 8176 l 2094 8480 l
+ 2057 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 7526 m 738 7562 l 435 7562 l 435 7490 l 738 7490 l
+ 738 7526 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 7905 m 738 7941 l 435 7941 l 435 7869 l 738 7869 l
+ 738 7905 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 7716 m 738 7752 l 435 7752 l 435 7679 l 738 7679 l
+ 738 7716 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 7337 m 738 7373 l 435 7373 l 435 7301 l 738 7301 l
+ 738 7337 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 7148 m 738 7183 l 435 7183 l 435 7111 l 738 7111 l
+ 738 7148 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 6958 m 738 6994 l 435 6994 l 435 6922 l 738 6922 l
+ 738 6958 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 8087 m 2481 8122 l 2177 8122 l 2177 8050 l 2481 8050 l
+ 2481 8087 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 7518 m 2481 7554 l 2177 7554 l 2177 7482 l 2481 7482 l
+ 2481 7518 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 7897 m 2481 7933 l 2177 7933 l 2177 7861 l 2481 7861 l
+ 2481 7897 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 7708 m 2481 7744 l 2177 7744 l 2177 7671 l 2481 7671 l
+ 2481 7708 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 7329 m 2481 7365 l 2177 7365 l 2177 7293 l 2481 7293 l
+ 2481 7329 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 7140 m 2481 7175 l 2177 7175 l 2177 7103 l 2481 7103 l
+ 2481 7140 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2481 6950 m 2481 6986 l 2177 6986 l 2177 6914 l 2481 6914 l
+ 2481 6950 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1457 8480 m 1421 8480 l 1421 8176 l 1494 8176 l 1494 8480 l
+ 1457 8480 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 738 8095 m 738 8130 l 435 8130 l 435 8058 l 738 8058 l
+ 738 8095 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1061 6872 m 1025 6872 l 1025 6568 l 1097 6568 l 1097 6872 l
+ 1061 6872 l  cp gs col0 s gr 
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.fig b/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.fig
new file mode 100644 (file)
index 0000000..0375fe3
--- /dev/null
@@ -0,0 +1,298 @@
+#FIG 3.2
+Portrait
+Flush left
+Inches
+Letter  
+100.00
+Single
+0
+1200 2
+0 32 #99ccff
+0 33 #e6e64c
+0 34 #ffff99
+0 35 #ff9966
+0 36 #00ae00
+0 37 #6b0094
+0 38 #800080
+0 39 #e0e0e0
+0 40 #000080
+0 41 #dc2300
+0 42 #b84700
+6 4650 1500 7650 2400
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        4800 1650 7500 1650 7500 2250 4800 2250 4800 1650
+4 1 0 50 -1 0 28 0.0000 4 285 1650 6150 2100 Testclient\001
+-6
+6 4650 2325 7650 3225
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        4800 2475 7500 2475 7500 3075 4800 3075 4800 2475
+4 1 0 50 -1 0 28 0.0000 4 285 2580 6150 2925 CanMonitor #1\001
+-6
+6 4650 3300 7650 4200
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        4800 3450 7500 3450 7500 4050 4800 4050 4800 3450
+4 1 0 50 -1 0 28 0.0000 4 285 2580 6150 3900 CanMonitor #2\001
+-6
+6 4650 6000 7650 6900
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        4800 6150 7500 6150 7500 6750 4800 6750 4800 6150
+4 1 0 50 -1 0 24 0.0000 4 240 1365 6150 6600 CanDev1\001
+-6
+6 3300 5175 5400 6075
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        3450 5325 5250 5325 5250 5925 3450 5925 3450 5325
+4 1 0 50 -1 0 24 0.0000 4 255 1230 4350 5775 VCA lib\001
+-6
+6 4650 7650 7650 8550
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        4800 7800 7500 7800 7500 8400 4800 8400 4800 7800
+4 1 0 50 -1 0 24 0.0000 4 240 1365 6150 8250 CanDev1\001
+-6
+6 3450 6825 5550 7725
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        3600 6975 5400 6975 5400 7575 3600 7575 3600 6975
+4 1 0 50 -1 0 24 0.0000 4 255 1230 4500 7425 VCA lib\001
+-6
+6 450 1800 2550 2700
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        600 1950 2400 1950 2400 2550 600 2550 600 1950
+4 1 0 50 -1 0 28 0.0000 4 285 1635 1500 2400 Canmond\001
+-6
+6 450 3300 2550 4200
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        600 3450 2400 3450 2400 4050 600 4050 600 3450
+4 1 0 50 -1 0 28 0.0000 4 285 1440 1500 3900 VCA lib\001
+-6
+6 300 4800 2700 5700
+2 2 0 3 0 39 200 -1 20 0.000 0 0 7 0 0 5
+        450 4950 2550 4950 2550 5550 450 5550 450 4950
+4 1 0 50 -1 0 28 0.0000 4 285 1980 1500 5400 CAN driver\001
+-6
+6 375 6450 2625 8550
+6 375 6525 2550 8550
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        825 6568 898 6568 898 6872 825 6872 825 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1425 6568 1497 6568 1497 6872 1425 6872 1425 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1025 6568 1097 6568 1097 6872 1025 6872 1025 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1225 6568 1298 6568 1298 6872 1225 6872 1225 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1625 6568 1697 6568 1697 6872 1625 6872 1625 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1825 6568 1898 6568 1898 6872 1825 6872 1825 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2025 6568 2097 6568 2097 6872 2025 6872 2025 6568
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        821 8176 894 8176 894 8480 821 8480 821 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1421 8176 1494 8176 1494 8480 1421 8480 1421 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1021 8176 1094 8176 1094 8480 1021 8480 1021 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1222 8176 1294 8176 1294 8480 1222 8480 1222 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1621 8176 1694 8176 1694 8480 1621 8480 1621 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1822 8176 1894 8176 1894 8480 1822 8480 1822 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2021 8176 2094 8176 2094 8480 2021 8480 2021 8176
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 8095 738 8130 435 8130 435 8058 738 8058 738 8095
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 7526 738 7562 435 7562 435 7490 738 7490 738 7526
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 7905 738 7941 435 7941 435 7869 738 7869 738 7905
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 7716 738 7752 435 7752 435 7679 738 7679 738 7716
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 7337 738 7373 435 7373 435 7301 738 7301 738 7337
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 7148 738 7183 435 7183 435 7111 738 7111 738 7148
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        738 6958 738 6994 435 6994 435 6922 738 6922 738 6958
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 8087 2481 8122 2177 8122 2177 8050 2481 8050 2481 8087
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 7518 2481 7554 2177 7554 2177 7482 2481 7482 2481 7518
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 7897 2481 7933 2177 7933 2177 7861 2481 7861 2481 7897
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 7708 2481 7744 2177 7744 2177 7671 2481 7671 2481 7708
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 7329 2481 7365 2177 7365 2177 7293 2481 7293 2481 7329
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 7140 2481 7175 2177 7175 2177 7103 2481 7103 2481 7140
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        2481 6950 2481 6986 2177 6986 2177 6914 2481 6914 2481 6950
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        861 6872 825 6872 825 6568 898 6568 898 6872 861 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1461 6872 1425 6872 1425 6568 1497 6568 1497 6872 1461 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1261 6872 1225 6872 1225 6568 1298 6568 1298 6872 1261 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1661 6872 1625 6872 1625 6568 1697 6568 1697 6872 1661 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1861 6872 1825 6872 1825 6568 1898 6568 1898 6872 1861 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2061 6872 2025 6872 2025 6568 2097 6568 2097 6872 2061 6872
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        857 8480 821 8480 821 8176 894 8176 894 8480 857 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1057 8480 1021 8480 1021 8176 1094 8176 1094 8480 1057 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1258 8480 1222 8480 1222 8176 1294 8176 1294 8480 1258 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1657 8480 1621 8480 1621 8176 1694 8176 1694 8480 1657 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1857 8480 1822 8480 1822 8176 1894 8176 1894 8480 1857 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2057 8480 2021 8480 2021 8176 2094 8176 2094 8480 2057 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 7526 738 7562 435 7562 435 7490 738 7490 738 7526
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 7905 738 7941 435 7941 435 7869 738 7869 738 7905
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 7716 738 7752 435 7752 435 7679 738 7679 738 7716
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 7337 738 7373 435 7373 435 7301 738 7301 738 7337
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 7148 738 7183 435 7183 435 7111 738 7111 738 7148
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 6958 738 6994 435 6994 435 6922 738 6922 738 6958
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 8087 2481 8122 2177 8122 2177 8050 2481 8050 2481 8087
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 7518 2481 7554 2177 7554 2177 7482 2481 7482 2481 7518
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 7897 2481 7933 2177 7933 2177 7861 2481 7861 2481 7897
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 7708 2481 7744 2177 7744 2177 7671 2481 7671 2481 7708
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 7329 2481 7365 2177 7365 2177 7293 2481 7293 2481 7329
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 7140 2481 7175 2177 7175 2177 7103 2481 7103 2481 7140
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2481 6950 2481 6986 2177 6986 2177 6914 2481 6914 2481 6950
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1457 8480 1421 8480 1421 8176 1494 8176 1494 8480 1457 8480
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        738 8095 738 8130 435 8130 435 8058 738 8058 738 8095
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1061 6872 1025 6872 1025 6568 1097 6568 1097 6872 1061 6872
+# polyline
+2 1 0 1 0 39 81 0 20 0.000 0 0 0 0 0 6
+        1464 8174 750 8174 750 6870 2180 6870 2180 8174 1464 8174
+4 1 0 50 -1 0 22 0.0000 4 225 1275 1425 7575 controller\001
+4 1 0 50 -1 0 22 0.0000 4 225 705 1425 7275 CAN\001
+4 1 0 50 -1 0 22 0.0000 4 225 1215 1425 7875 or virtual\001
+-6
+-6
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+        1500 4950 1500 4725
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+        1500 6450 1500 6225
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+        1500 3450 1500 3225
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        1500 5925 1500 5550
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        1500 4425 1500 4050
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        1500 2850 1500 2550
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2475 2175 4800 1950
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2475 2250 4800 2775
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2475 2325 4800 3750
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2625 5250 3450 5475
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2625 5325 4350 6975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        4875 5925 5700 6150
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        5175 7575 5550 7800
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        5775 4575 5775 4050
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        5775 5175 5775 6150
+4 0 0 50 -1 0 24 0.0000 4 240 1710 750 6150 IO or MEM\001
+4 1 0 50 -1 0 40 0.0000 4 420 1125 6150 5100 EDS\001
+4 0 0 50 -1 0 24 0.0000 4 240 1410 900 3150 VCA API\001
+4 0 0 50 -1 0 24 0.0000 4 330 3180 750 4650 File ops (rd, wr, ioctl)\001
+4 1 0 50 -1 0 24 0.0000 4 255 1080 3300 1950 TCP/IP\001
+4 0 0 50 -1 0 24 0.0000 4 240 885 6075 4500 parser\001
+4 0 0 50 -1 0 24 0.0000 4 240 1275 6075 5550 parser or\001
+4 0 0 50 -1 0 24 0.0000 4 330 1305 6075 5955 compiler\001
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.pdf b/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.pdf
new file mode 100644 (file)
index 0000000..e747f0f
Binary files /dev/null and b/lincan-0.3.3/doc/lincandoc/img/lincan_arch1.pdf differ
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.eps b/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.eps
new file mode 100644 (file)
index 0000000..6e26b9c
--- /dev/null
@@ -0,0 +1,929 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: lincan_canends1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Oct  4 15:43:59 2003
+%%For: pisa@kotik (Pavel Pisa)
+%%BoundingBox: 0 0 396 390
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.000 0.000 0.500 srgb} bind def
+/col33 {0.859 0.137 0.000 srgb} bind def
+/col34 {0.996 0.598 0.398 srgb} bind def
+/col35 {0.719 0.277 0.000 srgb} bind def
+/col36 {0.875 0.875 0.875 srgb} bind def
+
+end
+save
+newpath 0 390 moveto 0 0 lineto 396 0 lineto 396 390 lineto closepath clip newpath
+-61.0 464.5 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 200
+% Polyline
+30.000 slw
+n 5775 2025 m 7575 2025 l 7575 4125 l 5775 4125 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5325 1275 m 7575 1275 l 7575 1875 l 5325 1875 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5775 5400 m 7575 5400 l 7575 7500 l 5775 7500 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5325 4650 m 7575 4650 l 7575 5250 l 5325 5250 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1500 3375 m 3300 3375 l 3300 5475 l 1500 5475 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1050 2625 m 3300 2625 l 3300 3225 l 1050 3225 l
+ cp gs col36 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 151
+%  polyline 
+% Polyline
+n 5789 7110 m 5796 7095 l 5807 7081 l 5821 7068 l 5837 7059 l 5855 7054 l
+ 5871 7053 l 5888 7054 l 5904 7058 l 5919 7066 l 5934 7077 l
+ 5946 7090 l 5954 7107 l 5960 7124 l 5962 7141 l 5960 7158 l
+ 5956 7174 l 5948 7189 l 5937 7203 l 5923 7216 l 5907 7224 l
+ 5890 7229 l 5873 7231 l 5856 7230 l 5840 7225 l 5825 7217 l
+ 5811 7207 l 5798 7193 l 5790 7176 l 5784 7159 l 5783 7142 l
+ 5783 7126 l
+ 5789 7110 l  cp gs col1 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3080 4478 m 2898 4549 l 2893 4553 l 2891 4558 l 2892 4564 l 2897 4568 l
+ 3073 4656 l 3075 4657 l 3076 4657 l 3080 4656 l 3084 4654 l
+ 3086 4651 l 3087 4648 l 3094 4488 l 3093 4484 l 3092 4480 l
+ 3088 4479 l 3084 4478 l 3083 4478 l
+ 3080 4478 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 148
+%  polyline 
+% Polyline
+n 5817 7144 m 5677 7118 l 5674 7118 l 5679 7107 l 5681 7095 l 5821 7121 l
+
+ 5817 7144 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 146
+%  polyline 
+% Polyline
+n 5674 7118 m 5437 7018 l 5434 7016 l 5441 7007 l 5446 6995 l 5683 7096 l
+ 5679 7107 l
+ 5674 7118 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 144
+%  polyline 
+% Polyline
+n 5434 7016 m 5234 6875 l 5233 6873 l 5241 6865 l 5248 6855 l 5448 6997 l
+ 5441 7007 l
+ 5434 7016 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 142
+%  polyline 
+% Polyline
+n 5241 6865 m 5233 6873 l 5061 6695 l 5071 6688 l 5080 6681 l 5249 6857 l
+
+ 5241 6865 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 140
+%  polyline 
+% Polyline
+n 5071 6688 m 5061 6695 l 4913 6490 l 4923 6484 l 4933 6478 l 5080 6681 l
+
+ 5071 6688 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 138
+%  polyline 
+% Polyline
+n 4923 6484 m 4913 6490 l 4782 6266 l 4793 6261 l 4803 6255 l 4933 6478 l
+
+ 4923 6484 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 136
+%  polyline 
+% Polyline
+n 4793 6261 m 4782 6266 l 4660 6029 l 4671 6024 l 4682 6019 l 4803 6255 l
+
+ 4793 6261 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 134
+%  polyline 
+% Polyline
+n 4671 6024 m 4660 6029 l 4542 5788 l 4553 5783 l 4564 5777 l 4682 6019 l
+
+ 4671 6024 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 132
+%  polyline 
+% Polyline
+n 4553 5783 m 4542 5788 l 4421 5550 l 4431 5544 l 4441 5538 l 4564 5777 l
+
+ 4553 5783 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 130
+%  polyline 
+% Polyline
+n 4431 5544 m 4421 5550 l 4288 5322 l 4298 5315 l 4308 5308 l 4441 5538 l
+
+ 4431 5544 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 128
+%  polyline 
+% Polyline
+n 4298 5315 m 4288 5322 l 4138 5111 l 4147 5103 l 4156 5094 l 4308 5308 l
+
+ 4298 5315 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 126
+%  polyline 
+% Polyline
+n 4147 5103 m 4138 5111 l 3965 4924 l 3972 4915 l 3979 4906 l 4156 5094 l
+
+ 4147 5103 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 124
+%  polyline 
+% Polyline
+n 3965 4924 m 3758 4769 l 3766 4760 l 3770 4749 l 3773 4751 l 3979 4906 l
+ 3972 4915 l
+ 3965 4924 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 122
+%  polyline 
+% Polyline
+n 3761 4770 m 3516 4654 l 3521 4643 l 3524 4632 l 3526 4632 l 3770 4749 l
+ 3766 4760 l
+ 3761 4770 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 120
+%  polyline 
+% Polyline
+n 3519 4655 m 3229 4585 l 3232 4574 l 3232 4562 l 3234 4562 l 3524 4632 l
+ 3521 4643 l
+ 3519 4655 l  cp gs col1 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 118
+%  polyline 
+% Polyline
+n 3232 4574 m 3231 4585 l 3050 4577 l 3051 4554 l 3232 4562 l
+ 3232 4574 l  cp gs col1 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3052 5084 m 3049 5101 l 3042 5118 l 3033 5133 l 3019 5146 l 3003 5155 l
+ 2988 5161 l 2971 5165 l 2955 5164 l 2938 5161 l 2921 5154 l
+ 2906 5144 l 2893 5131 l 2884 5115 l 2877 5100 l 2874 5083 l
+ 2874 5067 l 2878 5050 l 2884 5033 l 2895 5018 l 2907 5005 l
+ 2923 4996 l 2939 4990 l 2955 4986 l 2972 4987 l 2989 4990 l
+ 3006 4996 l 3021 5007 l 3034 5020 l 3043 5035 l 3050 5051 l
+ 3053 5067 l
+ 3052 5084 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5850 2835 m 6017 2734 l 6022 2730 l 6023 2724 l 6021 2718 l 6015 2715 l
+ 5827 2659 l 5825 2658 l 5824 2658 l 5820 2660 l 5816 2662 l
+ 5815 2665 l 5815 2669 l 5834 2828 l 5836 2832 l 5838 2835 l
+ 5842 2836 l 5846 2836 l 5848 2836 l
+ 5850 2835 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 114
+%  polyline 
+% Polyline
+n 3016 5059 m 3153 5047 l 3155 5059 l 3158 5069 l 3156 5070 l 3018 5082 l
+
+ 3016 5059 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 112
+%  polyline 
+% Polyline
+n 3151 5047 m 3391 4975 l 3394 4987 l 3400 4997 l 3398 4998 l 3158 5069 l
+ 3155 5059 l
+ 3151 5047 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 110
+%  polyline 
+% Polyline
+n 3388 4976 m 3593 4864 l 3599 4875 l 3606 4884 l 3605 4885 l 3400 4997 l
+ 3394 4987 l
+ 3388 4976 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 108
+%  polyline 
+% Polyline
+n 3599 4875 m 3591 4865 l 3766 4722 l 3775 4730 l 3783 4737 l 3606 4884 l
+
+ 3599 4875 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 106
+%  polyline 
+% Polyline
+n 3775 4730 m 3766 4722 l 3918 4550 l 3928 4557 l 3938 4564 l 3783 4737 l
+
+ 3775 4730 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 104
+%  polyline 
+% Polyline
+n 3928 4557 m 3918 4550 l 4056 4358 l 4067 4364 l 4077 4370 l 3938 4564 l
+
+ 3928 4557 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 102
+%  polyline 
+% Polyline
+n 4067 4364 m 4056 4358 l 4185 4151 l 4196 4157 l 4206 4163 l 4077 4370 l
+
+ 4067 4364 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+%  polyline 
+% Polyline
+n 4196 4157 m 4185 4151 l 4312 3936 l 4322 3942 l 4332 3948 l 4206 4163 l
+
+ 4196 4157 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 98
+%  polyline 
+% Polyline
+n 4322 3942 m 4312 3936 l 4443 3719 l 4453 3726 l 4462 3732 l 4332 3948 l
+
+ 4322 3942 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 96
+%  polyline 
+% Polyline
+n 4453 3726 m 4443 3719 l 4584 3507 l 4594 3515 l 4603 3522 l 4462 3732 l
+
+ 4453 3726 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 94
+%  polyline 
+% Polyline
+n 4594 3515 m 4584 3507 l 4743 3307 l 4752 3316 l 4760 3324 l 4603 3522 l
+
+ 4594 3515 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 92
+%  polyline 
+% Polyline
+n 4752 3316 m 4743 3307 l 4926 3125 l 4933 3135 l 4940 3144 l 4760 3324 l
+
+ 4752 3316 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 90
+%  polyline 
+% Polyline
+n 4933 3135 m 4926 3125 l 5139 2968 l 5145 2979 l 5150 2989 l 4940 3144 l
+
+ 4933 3135 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 88
+%  polyline 
+% Polyline
+n 5139 2968 m 5387 2843 l 5388 2842 l 5392 2854 l 5397 2864 l 5150 2989 l
+ 5145 2979 l
+ 5139 2968 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 86
+%  polyline 
+% Polyline
+n 5392 2854 m 5388 2842 l 5681 2755 l 5683 2767 l 5684 2778 l 5396 2865 l
+
+ 5392 2854 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 84
+%  polyline 
+% Polyline
+n 5683 2767 m 5681 2755 l 5863 2732 l 5866 2755 l 5684 2778 l
+ 5683 2767 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 81
+%  polyline 
+% Polyline
+7.500 slw
+n 2289 7424 m 1575 7424 l 1575 6120 l 3005 6120 l 3005 7424 l
+ 2289 7424 l  cp gs col36 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 50
+% Polyline
+30.000 slw
+n 5925 3525 m 7425 3525 l 7425 3975 l 5925 3975 l
+ cp gs col0 s gr 
+% Polyline
+n 5925 3000 m 7425 3000 l 7425 3450 l 5925 3450 l
+ cp gs col0 s gr 
+% Polyline
+n 5925 2475 m 7425 2475 l 7425 2925 l 5925 2925 l
+ cp gs col0 s gr 
+/Times-Roman ff 360.00 scf sf
+6000 2325 m
+gs 1 -1 sc (ends) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 3375 m
+gs 1 -1 sc (idle) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 3900 m
+gs 1 -1 sc (inlist) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 2775 m
+gs 1 -1 sc (active[]) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+5475 1725 m
+gs 1 -1 sc (App/User1) col0 sh gr
+/Times-Roman ff 330.00 scf sf
+2250 6825 m
+gs 1 -1 sc (controller) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 330.00 scf sf
+2250 6525 m
+gs 1 -1 sc (CAN) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 330.00 scf sf
+2250 7125 m
+gs 1 -1 sc (or virtual) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+n 5925 6900 m 7425 6900 l 7425 7350 l 5925 7350 l
+ cp gs col0 s gr 
+% Polyline
+n 5925 6375 m 7425 6375 l 7425 6825 l 5925 6825 l
+ cp gs col0 s gr 
+% Polyline
+n 5925 5850 m 7425 5850 l 7425 6300 l 5925 6300 l
+ cp gs col0 s gr 
+/Times-Roman ff 360.00 scf sf
+6000 5700 m
+gs 1 -1 sc (ends) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 6750 m
+gs 1 -1 sc (idle) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 7275 m
+gs 1 -1 sc (inlist) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+6075 6150 m
+gs 1 -1 sc (active[]) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+5475 5100 m
+gs 1 -1 sc (App/User2) col0 sh gr
+% Polyline
+n 1650 4875 m 3150 4875 l 3150 5325 l 1650 5325 l
+ cp gs col0 s gr 
+% Polyline
+n 1650 4350 m 3150 4350 l 3150 4800 l 1650 4800 l
+ cp gs col0 s gr 
+% Polyline
+n 1650 3825 m 3150 3825 l 3150 4275 l 1650 4275 l
+ cp gs col0 s gr 
+/Times-Roman ff 360.00 scf sf
+1725 3675 m
+gs 1 -1 sc (ends) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 4725 m
+gs 1 -1 sc (idle) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 5250 m
+gs 1 -1 sc (inlist) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 4125 m
+gs 1 -1 sc (active[]) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1200 3075 m
+gs 1 -1 sc (Msg object) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+4350 2400 m
+gs 1 -1 sc (edges) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+4350 2775 m
+gs 1 -1 sc (with) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 360.00 scf sf
+4350 3150 m
+gs 1 -1 sc (FOFOs) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 0
+%  polyline 
+% Polyline
+n 1650 5818 m 1723 5818 l 1723 6122 l 1650 6122 l
+ 1650 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2250 5818 m 2322 5818 l 2322 6122 l 2250 6122 l
+ 2250 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1850 5818 m 1922 5818 l 1922 6122 l 1850 6122 l
+ 1850 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2050 5818 m 2123 5818 l 2123 6122 l 2050 6122 l
+ 2050 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2450 5818 m 2522 5818 l 2522 6122 l 2450 6122 l
+ 2450 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2650 5818 m 2723 5818 l 2723 6122 l 2650 6122 l
+ 2650 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2850 5818 m 2922 5818 l 2922 6122 l 2850 6122 l
+ 2850 5818 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1646 7426 m 1719 7426 l 1719 7730 l 1646 7730 l
+ 1646 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2246 7426 m 2319 7426 l 2319 7730 l 2246 7730 l
+ 2246 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1846 7426 m 1919 7426 l 1919 7730 l 1846 7730 l
+ 1846 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2047 7426 m 2119 7426 l 2119 7730 l 2047 7730 l
+ 2047 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2446 7426 m 2519 7426 l 2519 7730 l 2446 7730 l
+ 2446 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2647 7426 m 2719 7426 l 2719 7730 l 2647 7730 l
+ 2647 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 2846 7426 m 2919 7426 l 2919 7730 l 2846 7730 l
+ 2846 7426 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 7345 m 1563 7380 l 1260 7380 l 1260 7308 l 1563 7308 l
+ 1563 7345 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 6776 m 1563 6812 l 1260 6812 l 1260 6740 l 1563 6740 l
+ 1563 6776 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 7155 m 1563 7191 l 1260 7191 l 1260 7119 l 1563 7119 l
+ 1563 7155 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 6966 m 1563 7002 l 1260 7002 l 1260 6929 l 1563 6929 l
+ 1563 6966 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 6587 m 1563 6623 l 1260 6623 l 1260 6551 l 1563 6551 l
+ 1563 6587 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 6398 m 1563 6433 l 1260 6433 l 1260 6361 l 1563 6361 l
+ 1563 6398 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 1563 6208 m 1563 6244 l 1260 6244 l 1260 6172 l 1563 6172 l
+ 1563 6208 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 7337 m 3306 7372 l 3002 7372 l 3002 7300 l 3306 7300 l
+ 3306 7337 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 6768 m 3306 6804 l 3002 6804 l 3002 6732 l 3306 6732 l
+ 3306 6768 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 7147 m 3306 7183 l 3002 7183 l 3002 7111 l 3306 7111 l
+ 3306 7147 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 6958 m 3306 6994 l 3002 6994 l 3002 6921 l 3306 6921 l
+ 3306 6958 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 6579 m 3306 6615 l 3002 6615 l 3002 6543 l 3306 6543 l
+ 3306 6579 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 6390 m 3306 6425 l 3002 6425 l 3002 6353 l 3306 6353 l
+ 3306 6390 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3306 6200 m 3306 6236 l 3002 6236 l 3002 6164 l 3306 6164 l
+ 3306 6200 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+7.500 slw
+n 1686 6122 m 1650 6122 l 1650 5818 l 1723 5818 l 1723 6122 l
+ 1686 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2286 6122 m 2250 6122 l 2250 5818 l 2322 5818 l 2322 6122 l
+ 2286 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2086 6122 m 2050 6122 l 2050 5818 l 2123 5818 l 2123 6122 l
+ 2086 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2486 6122 m 2450 6122 l 2450 5818 l 2522 5818 l 2522 6122 l
+ 2486 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2686 6122 m 2650 6122 l 2650 5818 l 2723 5818 l 2723 6122 l
+ 2686 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2886 6122 m 2850 6122 l 2850 5818 l 2922 5818 l 2922 6122 l
+ 2886 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1682 7730 m 1646 7730 l 1646 7426 l 1719 7426 l 1719 7730 l
+ 1682 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1882 7730 m 1846 7730 l 1846 7426 l 1919 7426 l 1919 7730 l
+ 1882 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2083 7730 m 2047 7730 l 2047 7426 l 2119 7426 l 2119 7730 l
+ 2083 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2482 7730 m 2446 7730 l 2446 7426 l 2519 7426 l 2519 7730 l
+ 2482 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2682 7730 m 2647 7730 l 2647 7426 l 2719 7426 l 2719 7730 l
+ 2682 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2882 7730 m 2846 7730 l 2846 7426 l 2919 7426 l 2919 7730 l
+ 2882 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 6776 m 1563 6812 l 1260 6812 l 1260 6740 l 1563 6740 l
+ 1563 6776 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 7155 m 1563 7191 l 1260 7191 l 1260 7119 l 1563 7119 l
+ 1563 7155 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 6966 m 1563 7002 l 1260 7002 l 1260 6929 l 1563 6929 l
+ 1563 6966 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 6587 m 1563 6623 l 1260 6623 l 1260 6551 l 1563 6551 l
+ 1563 6587 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 6398 m 1563 6433 l 1260 6433 l 1260 6361 l 1563 6361 l
+ 1563 6398 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 6208 m 1563 6244 l 1260 6244 l 1260 6172 l 1563 6172 l
+ 1563 6208 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 7337 m 3306 7372 l 3002 7372 l 3002 7300 l 3306 7300 l
+ 3306 7337 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 6768 m 3306 6804 l 3002 6804 l 3002 6732 l 3306 6732 l
+ 3306 6768 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 7147 m 3306 7183 l 3002 7183 l 3002 7111 l 3306 7111 l
+ 3306 7147 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 6958 m 3306 6994 l 3002 6994 l 3002 6921 l 3306 6921 l
+ 3306 6958 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 6579 m 3306 6615 l 3002 6615 l 3002 6543 l 3306 6543 l
+ 3306 6579 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 6390 m 3306 6425 l 3002 6425 l 3002 6353 l 3306 6353 l
+ 3306 6390 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 3306 6200 m 3306 6236 l 3002 6236 l 3002 6164 l 3306 6164 l
+ 3306 6200 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 2282 7730 m 2246 7730 l 2246 7426 l 2319 7426 l 2319 7730 l
+ 2282 7730 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1563 7345 m 1563 7380 l 1260 7380 l 1260 7308 l 1563 7308 l
+ 1563 7345 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+n 1886 6122 m 1850 6122 l 1850 5818 l 1922 5818 l 1922 6122 l
+ 1886 6122 l  cp gs col0 s gr 
+%  polyline 
+% Polyline
+0.000 slw
+n 3054 5110 m 3049 5127 l 3040 5142 l 3028 5156 l 3013 5167 l 2996 5175 l
+ 2980 5179 l 2963 5179 l 2947 5177 l 2930 5171 l 2914 5162 l
+ 2901 5151 l 2890 5135 l 2883 5119 l 2879 5102 l 2878 5085 l
+ 2880 5069 l 2886 5053 l 2895 5038 l 2907 5024 l 2922 5013 l
+ 2938 5006 l 2955 5002 l 2972 5000 l 2988 5003 l 3004 5008 l
+ 3020 5017 l 3034 5030 l 3045 5045 l 3052 5061 l 3056 5078 l
+ 3057 5094 l
+ 3054 5110 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5775 6227 m 5953 6145 l 5958 6141 l 5960 6136 l 5958 6130 l 5953 6126 l
+ 5773 6049 l 5770 6049 l 5769 6049 l 5765 6049 l 5761 6052 l
+ 5759 6055 l 5758 6058 l 5761 6219 l 5762 6222 l 5764 6226 l
+ 5768 6227 l 5771 6228 l 5773 6228 l
+ 5775 6227 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3022 5081 m 3160 5087 l 3158 5099 l 3156 5110 l 3021 5104 l
+ 3022 5081 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3158 5099 m 3160 5087 l 3398 5124 l 3395 5136 l 3392 5147 l 3156 5110 l
+
+ 3158 5099 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3395 5136 m 3398 5124 l 3601 5181 l 3597 5192 l 3592 5203 l 3392 5147 l
+
+ 3395 5136 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3597 5192 m 3601 5181 l 3774 5255 l 3768 5265 l 3762 5275 l 3592 5203 l
+
+ 3597 5192 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3768 5265 m 3774 5255 l 3923 5341 l 3916 5350 l 3909 5360 l 3762 5275 l
+
+ 3768 5265 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3916 5350 m 3923 5341 l 4056 5436 l 4049 5445 l 4042 5454 l 3909 5360 l
+
+ 3916 5350 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4049 5445 m 4056 5436 l 4180 5537 l 4172 5546 l 4164 5555 l 4042 5454 l
+
+ 4049 5445 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4172 5546 m 4180 5537 l 4300 5639 l 4292 5649 l 4285 5658 l 4164 5555 l
+
+ 4172 5546 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4292 5649 m 4300 5639 l 4423 5741 l 4417 5751 l 4410 5760 l 4285 5658 l
+
+ 4292 5649 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4417 5751 m 4423 5741 l 4557 5838 l 4552 5848 l 4546 5858 l 4410 5760 l
+
+ 4417 5751 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4552 5848 m 4557 5838 l 4709 5926 l 4704 5937 l 4699 5947 l 4546 5858 l
+
+ 4552 5848 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4704 5937 m 4709 5926 l 4883 6003 l 4880 6014 l 4876 6025 l 4699 5947 l
+
+ 4704 5937 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4880 6014 m 4883 6003 l 5089 6065 l 5088 6076 l 5085 6088 l 4876 6025 l
+
+ 4880 6014 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5088 6076 m 5089 6065 l 5332 6108 l 5332 6119 l 5331 6131 l 5085 6088 l
+
+ 5088 6076 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5332 6119 m 5332 6108 l 5620 6129 l 5620 6141 l 5620 6152 l 5331 6131 l
+
+ 5332 6119 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5620 6141 m 5620 6129 l 5799 6126 l 5800 6150 l 5620 6152 l
+ 5620 6141 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3042 3967 m 2861 4039 l 2855 4043 l 2853 4048 l 2855 4054 l 2859 4058 l
+ 3035 4144 l 3038 4145 l 3039 4146 l 3043 4145 l 3047 4143 l
+ 3049 4140 l 3050 4136 l 3056 3976 l 3055 3972 l 3053 3968 l
+ 3050 3967 l 3046 3966 l 3044 3966 l
+ 3042 3967 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4831 3864 m 4834 3875 l 4683 3913 l 4680 3902 l 4677 3890 l 4828 3852 l
+
+ 4831 3864 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4680 3902 m 4683 3913 l 4528 3950 l 4525 3939 l 4523 3927 l 4677 3890 l
+
+ 4680 3902 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4525 3939 m 4528 3950 l 4363 3986 l 4361 3975 l 4359 3963 l 4523 3927 l
+
+ 4525 3939 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4361 3975 m 4363 3986 l 4182 4018 l 4181 4007 l 4179 3995 l 4359 3963 l
+
+ 4361 3975 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4181 4007 m 4182 4018 l 3982 4044 l 3981 4033 l 3979 4021 l 4179 3995 l
+
+ 4181 4007 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3981 4033 m 3982 4044 l 3753 4063 l 3753 4052 l 3752 4040 l 3979 4021 l
+
+ 3981 4033 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3753 4052 m 3753 4063 l 3493 4074 l 3493 4062 l 3493 4051 l 3752 4040 l
+
+ 3753 4052 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3493 4062 m 3493 4074 l 3195 4073 l 3195 4061 l 3195 4050 l 3493 4051 l
+
+ 3493 4062 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 3195 4061 m 3195 4073 l 3012 4066 l 3013 4043 l 3195 4050 l
+ 3195 4061 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5808 3720 m 5812 3704 l 5821 3688 l 5832 3673 l 5847 3661 l 5863 3653 l
+ 5879 3649 l 5896 3647 l 5912 3649 l 5929 3653 l 5945 3661 l
+ 5959 3673 l 5970 3687 l 5979 3703 l 5984 3720 l 5986 3737 l
+ 5984 3753 l 5979 3770 l 5970 3785 l 5959 3800 l 5945 3811 l
+ 5929 3819 l 5912 3824 l 5896 3826 l 5879 3824 l 5863 3820 l
+ 5847 3812 l 5832 3800 l 5821 3785 l 5813 3770 l 5808 3753 l
+ 5806 3737 l
+ 5808 3720 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5842 3748 m 5735 3748 l 5735 3737 l 5734 3725 l 5842 3725 l
+ 5842 3748 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5735 3737 m 5735 3748 l 5517 3760 l 5516 3748 l 5514 3737 l 5734 3725 l
+
+ 5735 3737 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5516 3748 m 5517 3760 l 5322 3780 l 5321 3769 l 5319 3757 l 5514 3737 l
+
+ 5516 3748 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5321 3769 m 5322 3780 l 5148 3807 l 5146 3796 l 5144 3784 l 5319 3757 l
+
+ 5321 3769 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 5146 3796 m 5148 3807 l 4987 3839 l 4985 3828 l 4982 3816 l 5144 3784 l
+
+ 5146 3796 l  cp gs col33 1.00 shd ef gr 
+%  polyline 
+% Polyline
+n 4985 3828 m 4987 3839 l 4834 3875 l 4831 3864 l 4828 3852 l 4982 3816 l
+
+ 4985 3828 l  cp gs col33 1.00 shd ef gr 
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.fig b/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.fig
new file mode 100644 (file)
index 0000000..116b1cc
--- /dev/null
@@ -0,0 +1,548 @@
+#FIG 3.2
+Portrait
+Flush left
+Inches
+Letter  
+100.00
+Single
+0
+1200 2
+0 32 #000080
+0 33 #dc2300
+0 34 #ff9966
+0 35 #b84700
+0 36 #e0e0e0
+6 5250 1200 7650 4200
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 3525 7425 3525 7425 3975 5925 3975 5925 3525
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 3000 7425 3000 7425 3450 5925 3450 5925 3000
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 2475 7425 2475 7425 2925 5925 2925 5925 2475
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        5775 2025 7575 2025 7575 4125 5775 4125 5775 2025
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        5325 1275 7575 1275 7575 1875 5325 1875 5325 1275
+4 0 0 50 -1 0 24 0.0000 4 255 660 6000 2325 ends\001
+4 0 0 50 -1 0 24 0.0000 4 255 555 6075 3375 idle\001
+4 0 0 50 -1 0 24 0.0000 4 255 735 6075 3900 inlist\001
+4 0 0 50 -1 0 24 0.0000 4 330 1125 6075 2775 active[]\001
+4 0 0 50 -1 0 24 0.0000 4 330 1575 5475 1725 App/User1\001
+-6
+6 1200 5775 3375 7800
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1650 5818 1723 5818 1723 6122 1650 6122 1650 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2250 5818 2322 5818 2322 6122 2250 6122 2250 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1850 5818 1922 5818 1922 6122 1850 6122 1850 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2050 5818 2123 5818 2123 6122 2050 6122 2050 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2450 5818 2522 5818 2522 6122 2450 6122 2450 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2650 5818 2723 5818 2723 6122 2650 6122 2650 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2850 5818 2922 5818 2922 6122 2850 6122 2850 5818
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1646 7426 1719 7426 1719 7730 1646 7730 1646 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2246 7426 2319 7426 2319 7730 2246 7730 2246 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        1846 7426 1919 7426 1919 7730 1846 7730 1846 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2047 7426 2119 7426 2119 7730 2047 7730 2047 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2446 7426 2519 7426 2519 7730 2446 7730 2446 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2647 7426 2719 7426 2719 7730 2647 7730 2647 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        2846 7426 2919 7426 2919 7730 2846 7730 2846 7426
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 7345 1563 7380 1260 7380 1260 7308 1563 7308 1563 7345
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 6776 1563 6812 1260 6812 1260 6740 1563 6740 1563 6776
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 7155 1563 7191 1260 7191 1260 7119 1563 7119 1563 7155
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 6966 1563 7002 1260 7002 1260 6929 1563 6929 1563 6966
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 6587 1563 6623 1260 6623 1260 6551 1563 6551 1563 6587
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 6398 1563 6433 1260 6433 1260 6361 1563 6361 1563 6398
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        1563 6208 1563 6244 1260 6244 1260 6172 1563 6172 1563 6208
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 7337 3306 7372 3002 7372 3002 7300 3306 7300 3306 7337
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 6768 3306 6804 3002 6804 3002 6732 3306 6732 3306 6768
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 7147 3306 7183 3002 7183 3002 7111 3306 7111 3306 7147
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 6958 3306 6994 3002 6994 3002 6921 3306 6921 3306 6958
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 6579 3306 6615 3002 6615 3002 6543 3306 6543 3306 6579
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 6390 3306 6425 3002 6425 3002 6353 3306 6353 3306 6390
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3306 6200 3306 6236 3002 6236 3002 6164 3306 6164 3306 6200
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1686 6122 1650 6122 1650 5818 1723 5818 1723 6122 1686 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2286 6122 2250 6122 2250 5818 2322 5818 2322 6122 2286 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2086 6122 2050 6122 2050 5818 2123 5818 2123 6122 2086 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2486 6122 2450 6122 2450 5818 2522 5818 2522 6122 2486 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2686 6122 2650 6122 2650 5818 2723 5818 2723 6122 2686 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2886 6122 2850 6122 2850 5818 2922 5818 2922 6122 2886 6122
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1682 7730 1646 7730 1646 7426 1719 7426 1719 7730 1682 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1882 7730 1846 7730 1846 7426 1919 7426 1919 7730 1882 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2083 7730 2047 7730 2047 7426 2119 7426 2119 7730 2083 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2482 7730 2446 7730 2446 7426 2519 7426 2519 7730 2482 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2682 7730 2647 7730 2647 7426 2719 7426 2719 7730 2682 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2882 7730 2846 7730 2846 7426 2919 7426 2919 7730 2882 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 6776 1563 6812 1260 6812 1260 6740 1563 6740 1563 6776
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 7155 1563 7191 1260 7191 1260 7119 1563 7119 1563 7155
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 6966 1563 7002 1260 7002 1260 6929 1563 6929 1563 6966
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 6587 1563 6623 1260 6623 1260 6551 1563 6551 1563 6587
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 6398 1563 6433 1260 6433 1260 6361 1563 6361 1563 6398
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 6208 1563 6244 1260 6244 1260 6172 1563 6172 1563 6208
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 7337 3306 7372 3002 7372 3002 7300 3306 7300 3306 7337
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 6768 3306 6804 3002 6804 3002 6732 3306 6732 3306 6768
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 7147 3306 7183 3002 7183 3002 7111 3306 7111 3306 7147
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 6958 3306 6994 3002 6994 3002 6921 3306 6921 3306 6958
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 6579 3306 6615 3002 6615 3002 6543 3306 6543 3306 6579
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 6390 3306 6425 3002 6425 3002 6353 3306 6353 3306 6390
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        3306 6200 3306 6236 3002 6236 3002 6164 3306 6164 3306 6200
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        2282 7730 2246 7730 2246 7426 2319 7426 2319 7730 2282 7730
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1563 7345 1563 7380 1260 7380 1260 7308 1563 7308 1563 7345
+# polyline
+2 1 0 1 0 0 0 0 -1 4.000 0 0 0 0 0 6
+        1886 6122 1850 6122 1850 5818 1922 5818 1922 6122 1886 6122
+# polyline
+2 1 0 1 0 36 81 0 20 0.000 0 0 0 0 0 6
+        2289 7424 1575 7424 1575 6120 3005 6120 3005 7424 2289 7424
+4 1 0 50 -1 0 22 0.0000 4 225 1275 2250 6825 controller\001
+4 1 0 50 -1 0 22 0.0000 4 225 705 2250 6525 CAN\001
+4 1 0 50 -1 0 22 0.0000 4 225 1215 2250 7125 or virtual\001
+-6
+6 5310 4635 7590 7515
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 6900 7425 6900 7425 7350 5925 7350 5925 6900
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 6375 7425 6375 7425 6825 5925 6825 5925 6375
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        5925 5850 7425 5850 7425 6300 5925 6300 5925 5850
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        5775 5400 7575 5400 7575 7500 5775 7500 5775 5400
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        5325 4650 7575 4650 7575 5250 5325 5250 5325 4650
+4 0 0 50 -1 0 24 0.0000 4 255 660 6000 5700 ends\001
+4 0 0 50 -1 0 24 0.0000 4 255 555 6075 6750 idle\001
+4 0 0 50 -1 0 24 0.0000 4 255 735 6075 7275 inlist\001
+4 0 0 50 -1 0 24 0.0000 4 330 1125 6075 6150 active[]\001
+4 0 0 50 -1 0 24 0.0000 4 330 1575 5475 5100 App/User2\001
+-6
+6 1035 2610 3315 5490
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        1650 4875 3150 4875 3150 5325 1650 5325 1650 4875
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        1650 4350 3150 4350 3150 4800 1650 4800 1650 4350
+2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+        1650 3825 3150 3825 3150 4275 1650 4275 1650 3825
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        1500 3375 3300 3375 3300 5475 1500 5475 1500 3375
+2 2 0 3 0 36 200 -1 20 0.000 0 0 -1 0 0 5
+        1050 2625 3300 2625 3300 3225 1050 3225 1050 2625
+4 0 0 50 -1 0 24 0.0000 4 255 660 1725 3675 ends\001
+4 0 0 50 -1 0 24 0.0000 4 255 555 1800 4725 idle\001
+4 0 0 50 -1 0 24 0.0000 4 255 735 1800 5250 inlist\001
+4 0 0 50 -1 0 24 0.0000 4 330 1125 1800 4125 active[]\001
+4 0 0 50 -1 0 24 0.0000 4 330 1620 1200 3075 Msg object\001
+-6
+6 2850 2625 6075 7275
+# polyline
+2 1 0 0 33 33 117 0 20 4.000 0 0 0 0 0 33
+        3052 5084 3049 5101 3042 5118 3033 5133 3019 5146 3003 5155
+        2988 5161 2971 5165 2955 5164 2938 5161 2921 5154 2906 5144
+        2893 5131 2884 5115 2877 5100 2874 5083 2874 5067 2878 5050
+        2884 5033 2895 5018 2907 5005 2923 4996 2939 4990 2955 4986
+        2972 4987 2989 4990 3006 4996 3021 5007 3034 5020 3043 5035
+        3050 5051 3053 5067 3052 5084
+# polyline
+2 1 0 0 33 33 114 0 20 4.000 0 0 0 0 0 7
+        3016 5059 3153 5047 3155 5059 3158 5069 3156 5070 3018 5082
+        3016 5059
+# polyline
+2 1 0 0 33 33 112 0 20 4.000 0 0 0 0 0 8
+        3151 5047 3391 4975 3394 4987 3400 4997 3398 4998 3158 5069
+        3155 5059 3151 5047
+# polyline
+2 1 0 0 33 33 110 0 20 4.000 0 0 0 0 0 8
+        3388 4976 3593 4864 3599 4875 3606 4884 3605 4885 3400 4997
+        3394 4987 3388 4976
+# polyline
+2 1 0 0 33 33 106 0 20 4.000 0 0 0 0 0 7
+        3775 4730 3766 4722 3918 4550 3928 4557 3938 4564 3783 4737
+        3775 4730
+# polyline
+2 1 0 0 33 33 104 0 20 4.000 0 0 0 0 0 7
+        3928 4557 3918 4550 4056 4358 4067 4364 4077 4370 3938 4564
+        3928 4557
+# polyline
+2 1 0 0 33 33 102 0 20 4.000 0 0 0 0 0 7
+        4067 4364 4056 4358 4185 4151 4196 4157 4206 4163 4077 4370
+        4067 4364
+# polyline
+2 1 0 0 33 33 100 0 20 4.000 0 0 0 0 0 7
+        4196 4157 4185 4151 4312 3936 4322 3942 4332 3948 4206 4163
+        4196 4157
+# polyline
+2 1 0 0 33 33 98 0 20 4.000 0 0 0 0 0 7
+        4322 3942 4312 3936 4443 3719 4453 3726 4462 3732 4332 3948
+        4322 3942
+# polyline
+2 1 0 0 33 33 96 0 20 4.000 0 0 0 0 0 7
+        4453 3726 4443 3719 4584 3507 4594 3515 4603 3522 4462 3732
+        4453 3726
+# polyline
+2 1 0 0 33 33 94 0 20 4.000 0 0 0 0 0 7
+        4594 3515 4584 3507 4743 3307 4752 3316 4760 3324 4603 3522
+        4594 3515
+# polyline
+2 1 0 0 33 33 92 0 20 4.000 0 0 0 0 0 7
+        4752 3316 4743 3307 4926 3125 4933 3135 4940 3144 4760 3324
+        4752 3316
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 33
+        3054 5110 3049 5127 3040 5142 3028 5156 3013 5167 2996 5175
+        2980 5179 2963 5179 2947 5177 2930 5171 2914 5162 2901 5151
+        2890 5135 2883 5119 2879 5102 2878 5085 2880 5069 2886 5053
+        2895 5038 2907 5024 2922 5013 2938 5006 2955 5002 2972 5000
+        2988 5003 3004 5008 3020 5017 3034 5030 3045 5045 3052 5061
+        3056 5078 3057 5094 3054 5110
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 20
+        5775 6227 5953 6145 5958 6141 5960 6136 5958 6130 5953 6126
+        5773 6049 5770 6049 5769 6049 5765 6049 5761 6052 5759 6055
+        5758 6058 5761 6219 5762 6222 5764 6226 5768 6227 5771 6228
+        5773 6228 5775 6227
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 6
+        3022 5081 3160 5087 3158 5099 3156 5110 3021 5104 3022 5081
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3158 5099 3160 5087 3398 5124 3395 5136 3392 5147 3156 5110
+        3158 5099
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3395 5136 3398 5124 3601 5181 3597 5192 3592 5203 3392 5147
+        3395 5136
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3597 5192 3601 5181 3774 5255 3768 5265 3762 5275 3592 5203
+        3597 5192
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3768 5265 3774 5255 3923 5341 3916 5350 3909 5360 3762 5275
+        3768 5265
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3916 5350 3923 5341 4056 5436 4049 5445 4042 5454 3909 5360
+        3916 5350
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4049 5445 4056 5436 4180 5537 4172 5546 4164 5555 4042 5454
+        4049 5445
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4172 5546 4180 5537 4300 5639 4292 5649 4285 5658 4164 5555
+        4172 5546
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4292 5649 4300 5639 4423 5741 4417 5751 4410 5760 4285 5658
+        4292 5649
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4417 5751 4423 5741 4557 5838 4552 5848 4546 5858 4410 5760
+        4417 5751
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4552 5848 4557 5838 4709 5926 4704 5937 4699 5947 4546 5858
+        4552 5848
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4704 5937 4709 5926 4883 6003 4880 6014 4876 6025 4699 5947
+        4704 5937
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4880 6014 4883 6003 5089 6065 5088 6076 5085 6088 4876 6025
+        4880 6014
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5088 6076 5089 6065 5332 6108 5332 6119 5331 6131 5085 6088
+        5088 6076
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5332 6119 5332 6108 5620 6129 5620 6141 5620 6152 5331 6131
+        5332 6119
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 6
+        5620 6141 5620 6129 5799 6126 5800 6150 5620 6152 5620 6141
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 20
+        3042 3967 2861 4039 2855 4043 2853 4048 2855 4054 2859 4058
+        3035 4144 3038 4145 3039 4146 3043 4145 3047 4143 3049 4140
+        3050 4136 3056 3976 3055 3972 3053 3968 3050 3967 3046 3966
+        3044 3966 3042 3967
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4831 3864 4834 3875 4683 3913 4680 3902 4677 3890 4828 3852
+        4831 3864
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4680 3902 4683 3913 4528 3950 4525 3939 4523 3927 4677 3890
+        4680 3902
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4525 3939 4528 3950 4363 3986 4361 3975 4359 3963 4523 3927
+        4525 3939
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4361 3975 4363 3986 4182 4018 4181 4007 4179 3995 4359 3963
+        4361 3975
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4181 4007 4182 4018 3982 4044 3981 4033 3979 4021 4179 3995
+        4181 4007
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3981 4033 3982 4044 3753 4063 3753 4052 3752 4040 3979 4021
+        3981 4033
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3753 4052 3753 4063 3493 4074 3493 4062 3493 4051 3752 4040
+        3753 4052
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        3493 4062 3493 4074 3195 4073 3195 4061 3195 4050 3493 4051
+        3493 4062
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 6
+        3195 4061 3195 4073 3012 4066 3013 4043 3195 4050 3195 4061
+# polyline
+2 1 0 0 33 33 116 0 20 4.000 0 0 0 0 0 20
+        5850 2835 6017 2734 6022 2730 6023 2724 6021 2718 6015 2715
+        5827 2659 5825 2658 5824 2658 5820 2660 5816 2662 5815 2665
+        5815 2669 5834 2828 5836 2832 5838 2835 5842 2836 5846 2836
+        5848 2836 5850 2835
+# polyline
+2 1 0 0 33 33 90 0 20 4.000 0 0 0 0 0 7
+        4933 3135 4926 3125 5139 2968 5145 2979 5150 2989 4940 3144
+        4933 3135
+# polyline
+2 1 0 0 33 33 88 0 20 4.000 0 0 0 0 0 8
+        5139 2968 5387 2843 5388 2842 5392 2854 5397 2864 5150 2989
+        5145 2979 5139 2968
+# polyline
+2 1 0 0 33 33 86 0 20 4.000 0 0 0 0 0 7
+        5392 2854 5388 2842 5681 2755 5683 2767 5684 2778 5396 2865
+        5392 2854
+# polyline
+2 1 0 0 33 33 84 0 20 4.000 0 0 0 0 0 6
+        5683 2767 5681 2755 5863 2732 5866 2755 5684 2778 5683 2767
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 33
+        5808 3720 5812 3704 5821 3688 5832 3673 5847 3661 5863 3653
+        5879 3649 5896 3647 5912 3649 5929 3653 5945 3661 5959 3673
+        5970 3687 5979 3703 5984 3720 5986 3737 5984 3753 5979 3770
+        5970 3785 5959 3800 5945 3811 5929 3819 5912 3824 5896 3826
+        5879 3824 5863 3820 5847 3812 5832 3800 5821 3785 5813 3770
+        5808 3753 5806 3737 5808 3720
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 6
+        5842 3748 5735 3748 5735 3737 5734 3725 5842 3725 5842 3748
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5735 3737 5735 3748 5517 3760 5516 3748 5514 3737 5734 3725
+        5735 3737
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5516 3748 5517 3760 5322 3780 5321 3769 5319 3757 5514 3737
+        5516 3748
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5321 3769 5322 3780 5148 3807 5146 3796 5144 3784 5319 3757
+        5321 3769
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        5146 3796 5148 3807 4987 3839 4985 3828 4982 3816 5144 3784
+        5146 3796
+# polyline
+2 1 0 0 33 33 0 0 20 4.000 0 0 0 0 0 7
+        4985 3828 4987 3839 4834 3875 4831 3864 4828 3852 4982 3816
+        4985 3828
+# polyline
+2 1 0 0 1 1 140 0 20 4.000 0 0 0 0 0 7
+        5071 6688 5061 6695 4913 6490 4923 6484 4933 6478 5080 6681
+        5071 6688
+# polyline
+2 1 0 0 1 1 134 0 20 4.000 0 0 0 0 0 7
+        4671 6024 4660 6029 4542 5788 4553 5783 4564 5777 4682 6019
+        4671 6024
+# polyline
+2 1 0 0 1 1 122 0 20 4.000 0 0 0 0 0 8
+        3761 4770 3516 4654 3521 4643 3524 4632 3526 4632 3770 4749
+        3766 4760 3761 4770
+# polyline
+2 1 0 0 33 33 108 0 20 4.000 0 0 0 0 0 7
+        3599 4875 3591 4865 3766 4722 3775 4730 3783 4737 3606 4884
+        3599 4875
+# polyline
+2 1 0 0 1 1 151 0 20 4.000 0 0 0 0 0 33
+        5789 7110 5796 7095 5807 7081 5821 7068 5837 7059 5855 7054
+        5871 7053 5888 7054 5904 7058 5919 7066 5934 7077 5946 7090
+        5954 7107 5960 7124 5962 7141 5960 7158 5956 7174 5948 7189
+        5937 7203 5923 7216 5907 7224 5890 7229 5873 7231 5856 7230
+        5840 7225 5825 7217 5811 7207 5798 7193 5790 7176 5784 7159
+        5783 7142 5783 7126 5789 7110
+# polyline
+2 1 0 0 1 1 150 0 20 4.000 0 0 0 0 0 20
+        3080 4478 2898 4549 2893 4553 2891 4558 2892 4564 2897 4568
+        3073 4656 3075 4657 3076 4657 3080 4656 3084 4654 3086 4651
+        3087 4648 3094 4488 3093 4484 3092 4480 3088 4479 3084 4478
+        3083 4478 3080 4478
+# polyline
+2 1 0 0 1 1 148 0 20 4.000 0 0 0 0 0 7
+        5817 7144 5677 7118 5674 7118 5679 7107 5681 7095 5821 7121
+        5817 7144
+# polyline
+2 1 0 0 1 1 146 0 20 4.000 0 0 0 0 0 8
+        5674 7118 5437 7018 5434 7016 5441 7007 5446 6995 5683 7096
+        5679 7107 5674 7118
+# polyline
+2 1 0 0 1 1 144 0 20 4.000 0 0 0 0 0 8
+        5434 7016 5234 6875 5233 6873 5241 6865 5248 6855 5448 6997
+        5441 7007 5434 7016
+# polyline
+2 1 0 0 1 1 142 0 20 4.000 0 0 0 0 0 7
+        5241 6865 5233 6873 5061 6695 5071 6688 5080 6681 5249 6857
+        5241 6865
+# polyline
+2 1 0 0 1 1 138 0 20 4.000 0 0 0 0 0 7
+        4923 6484 4913 6490 4782 6266 4793 6261 4803 6255 4933 6478
+        4923 6484
+# polyline
+2 1 0 0 1 1 136 0 20 4.000 0 0 0 0 0 7
+        4793 6261 4782 6266 4660 6029 4671 6024 4682 6019 4803 6255
+        4793 6261
+# polyline
+2 1 0 0 1 1 132 0 20 4.000 0 0 0 0 0 7
+        4553 5783 4542 5788 4421 5550 4431 5544 4441 5538 4564 5777
+        4553 5783
+# polyline
+2 1 0 0 1 1 130 0 20 4.000 0 0 0 0 0 7
+        4431 5544 4421 5550 4288 5322 4298 5315 4308 5308 4441 5538
+        4431 5544
+# polyline
+2 1 0 0 1 1 128 0 20 4.000 0 0 0 0 0 7
+        4298 5315 4288 5322 4138 5111 4147 5103 4156 5094 4308 5308
+        4298 5315
+# polyline
+2 1 0 0 1 1 126 0 20 4.000 0 0 0 0 0 7
+        4147 5103 4138 5111 3965 4924 3972 4915 3979 4906 4156 5094
+        4147 5103
+# polyline
+2 1 0 0 1 1 124 0 20 4.000 0 0 0 0 0 8
+        3965 4924 3758 4769 3766 4760 3770 4749 3773 4751 3979 4906
+        3972 4915 3965 4924
+# polyline
+2 1 0 0 1 1 120 0 20 4.000 0 0 0 0 0 8
+        3519 4655 3229 4585 3232 4574 3232 4562 3234 4562 3524 4632
+        3521 4643 3519 4655
+# polyline
+2 1 0 0 1 1 118 0 20 4.000 0 0 0 0 0 6
+        3232 4574 3231 4585 3050 4577 3051 4554 3232 4562 3232 4574
+-6
+4 1 0 50 -1 0 24 0.0000 4 330 825 4350 2400 edges\001
+4 1 0 50 -1 0 24 0.0000 4 255 645 4350 2775 with\001
+4 1 0 50 -1 0 24 0.0000 4 240 1035 4350 3150 FOFOs\001
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.pdf b/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.pdf
new file mode 100644 (file)
index 0000000..cc70c56
Binary files /dev/null and b/lincan-0.3.3/doc/lincandoc/img/lincan_canends1.pdf differ
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.eps b/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.eps
new file mode 100644 (file)
index 0000000..4235382
--- /dev/null
@@ -0,0 +1,1063 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: lincan_canhardware1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Oct  4 15:43:39 2003
+%%For: pisa@kotik (Pavel Pisa)
+%%BoundingBox: 0 0 706 405
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.938 0.938 0.938 srgb} bind def
+
+end
+save
+newpath 0 405 moveto 0 0 lineto 706 0 lineto 706 405 lineto closepath clip newpath
+0.7 792.7 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 999
+%  polyline 
+% Polyline
+n 0 13200 m 0 13200 l gs col0 s gr
+% here ends figure;
+% 
+% here starts figure with depth 200
+%  polyline 
+% Polyline
+30.000 slw
+n 9621 13178 m 11721 13178 l 11721 12128 l 9621 12128 l
+ 9621 13178 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 7221 13178 m 9321 13178 l 9321 12128 l 7221 12128 l
+ 7221 13178 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 4821 13178 m 6921 13178 l 6921 12128 l 4821 12128 l
+ 4821 13178 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 2421 13178 m 4521 13178 l 4521 12128 l 2421 12128 l
+ 2421 13178 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 21 13178 m 2121 13178 l 2121 12128 l 21 12128 l
+ 21 13178 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 21 11078 m 2121 11078 l 2121 10028 l 21 10028 l
+ 21 11078 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 2421 11078 m 4521 11078 l 4521 10028 l 2421 10028 l
+ 2421 11078 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 4821 11078 m 6921 11078 l 6921 10028 l 4821 10028 l
+ 4821 11078 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 7221 11078 m 9321 11078 l 9321 10028 l 7221 10028 l
+ 7221 11078 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9621 11078 m 11721 11078 l 11721 10028 l 9621 10028 l
+ 9621 11078 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8571 9503 m 10371 9503 l 10371 8903 l 8571 8903 l
+ 8571 9503 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 4971 9503 m 6771 9503 l 6771 8903 l 4971 8903 l
+ 4971 9503 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1521 9503 m 3321 9503 l 3321 8903 l 1521 8903 l
+ 1521 9503 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 2871 8453 m 5571 8453 l 5571 7853 l 2871 7853 l
+ 2871 8453 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 7971 8453 m 10671 8453 l 10671 7853 l 7971 7853 l
+ 7971 8453 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 4521 7103 m 8271 7103 l 8271 6503 l 4521 6503 l
+ 4521 7103 l  cp gs col32 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 125
+%  polyline 
+% Polyline
+15.000 slw
+n 1020 11820 m 1036 11818 l 1054 11820 l 1072 11826 l 1088 11836 l 1101 11848 l
+ 1111 11862 l 1119 11877 l 1122 11893 l 1124 11910 l 1122 11928 l
+ 1116 11945 l 1106 11961 l 1093 11974 l 1080 11985 l 1065 11992 l
+ 1049 11996 l 1032 11997 l 1014 11995 l 996 11989 l 981 11980 l
+ 968 11967 l 958 11953 l 950 11939 l 946 11922 l 945 11905 l
+ 947 11888 l 953 11870 l 962 11854 l 974 11841 l 988 11831 l
+ 1003 11823 l
+ 1020 11820 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 734 11410 m 718 11214 l 716 11208 l 712 11205 l 705 11205 l 700 11207 l
+ 566 11351 l 564 11352 l 564 11354 l 563 11358 l 564 11362 l
+ 566 11365 l 569 11367 l 721 11419 l 724 11420 l 729 11419 l
+ 731 11416 l 733 11413 l 734 11412 l
+ 734 11410 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 122
+%  polyline 
+% Polyline
+15.000 slw
+n 1014 11857 m 1012 11851 l 1023 11848 l 1032 11840 l 1033 11841 l 1034 11844 l
+ 1036 11851 l
+ 1014 11857 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 120
+%  polyline 
+% Polyline
+15.000 slw
+n 1014 11855 m 939 11767 l 948 11760 l 954 11749 l 956 11752 l 1032 11840 l
+ 1023 11848 l
+ 1014 11855 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10474 11764 m 10490 11769 l 10506 11777 l 10521 11789 l 10532 11803 l 10540 11820 l
+ 10545 11836 l 10547 11853 l 10544 11869 l 10540 11886 l 10532 11902 l
+ 10520 11916 l 10505 11927 l 10489 11935 l 10473 11940 l 10456 11941 l
+ 10440 11940 l 10423 11935 l 10408 11927 l 10393 11915 l 10381 11901 l
+ 10374 11885 l 10369 11868 l 10367 11852 l 10370 11835 l 10374 11819 l
+ 10382 11803 l 10394 11788 l 10409 11777 l 10424 11769 l 10441 11764 l
+ 10457 11762 l
+ 10474 11764 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 948 11760 m 942 11769 l 849 11716 l 854 11705 l 859 11694 l 954 11749 l
+
+ 948 11760 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10738 11383 m 10668 11200 l 10664 11195 l 10659 11192 l 10653 11194 l 10649 11198 l
+ 10560 11373 l 10559 11376 l 10559 11377 l 10560 11381 l 10561 11385 l
+ 10564 11387 l 10568 11388 l 10728 11396 l 10732 11396 l 10735 11394 l
+ 10737 11390 l 10738 11386 l
+ 10738 11383 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 116
+%  polyline 
+% Polyline
+15.000 slw
+n 854 11705 m 849 11716 l 754 11674 l 760 11664 l 766 11653 l 859 11694 l
+
+ 854 11705 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10439 11796 m 10455 11717 l 10455 11715 l 10457 11712 l 10467 11719 l 10478 11721 l
+ 10462 11801 l
+ 10439 11796 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 114
+%  polyline 
+% Polyline
+15.000 slw
+n 754 11674 m 676 11624 l 674 11622 l 672 11619 l 682 11614 l 688 11603 l
+ 766 11653 l 760 11664 l
+ 754 11674 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10457 11712 m 10488 11667 l 10491 11664 l 10498 11674 l 10508 11680 l 10476 11726 l
+ 10467 11719 l
+ 10457 11712 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 112
+%  polyline 
+% Polyline
+15.000 slw
+n 672 11619 m 627 11540 l 626 11539 l 625 11538 l 625 11534 l 637 11535 l
+ 647 11529 l 692 11607 l 682 11614 l
+ 672 11619 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10498 11674 m 10491 11664 l 10530 11632 l 10538 11641 l 10546 11650 l 10505 11683 l
+
+ 10498 11674 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 110
+%  polyline 
+% Polyline
+15.000 slw
+n 625 11534 m 629 11405 l 630 11401 l 641 11405 l 653 11405 l 648 11535 l
+ 637 11535 l
+ 625 11534 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10530 11632 m 10573 11591 l 10581 11600 l 10592 11606 l 10589 11609 l 10546 11650 l
+ 10538 11641 l
+ 10530 11632 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 108
+%  polyline 
+% Polyline
+15.000 slw
+n 641 11405 m 630 11401 l 647 11351 l 670 11359 l 652 11409 l
+ 641 11405 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10570 11595 m 10609 11521 l 10620 11527 l 10631 11529 l 10630 11532 l 10592 11606 l
+ 10581 11600 l
+ 10570 11595 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 919 11357 m 902 11353 l 886 11346 l 871 11336 l 859 11322 l 850 11306 l
+ 844 11290 l 841 11274 l 842 11257 l 846 11240 l 853 11223 l
+ 864 11209 l 878 11197 l 894 11188 l 910 11181 l 927 11179 l
+ 943 11180 l 960 11184 l 976 11191 l 991 11202 l 1003 11215 l
+ 1012 11232 l 1018 11248 l 1021 11264 l 1019 11281 l 1016 11297 l
+ 1008 11314 l 998 11329 l 984 11341 l 969 11350 l 952 11356 l
+ 936 11359 l
+ 919 11357 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1223 11841 m 1321 12010 l 1325 12015 l 1330 12017 l 1336 12014 l 1339 12009 l
+ 1400 11822 l 1400 11819 l 1399 11815 l 1397 11811 l 1393 11810 l
+ 1390 11809 l 1230 11826 l 1227 11827 l 1223 11829 l 1222 11834 l
+ 1222 11839 l
+ 1223 11841 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10620 11527 m 10608 11524 l 10636 11397 l 10648 11398 l 10659 11399 l 10631 11529 l
+
+ 10620 11527 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 104
+%  polyline 
+% Polyline
+15.000 slw
+n 945 11322 m 949 11387 l 937 11388 l 927 11393 l 926 11391 l 926 11388 l
+ 922 11323 l
+ 945 11322 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10648 11398 m 10636 11397 l 10638 11351 l 10662 11352 l 10659 11399 l
+ 10648 11398 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10809 11376 m 10793 11369 l 10778 11359 l 10765 11346 l 10755 11330 l 10749 11313 l
+ 10746 11297 l 10746 11280 l 10750 11264 l 10757 11248 l 10767 11233 l
+ 10779 11220 l 10795 11210 l 10812 11205 l 10829 11201 l 10846 11202 l
+ 10862 11205 l 10878 11212 l 10892 11222 l 10906 11235 l 10915 11250 l
+ 10921 11267 l 10924 11284 l 10924 11301 l 10921 11317 l 10914 11333 l
+ 10904 11348 l 10891 11361 l 10875 11371 l 10859 11377 l 10841 11380 l
+ 10825 11380 l
+ 10809 11376 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 948 11383 m 1003 11505 l 992 11510 l 984 11519 l 983 11518 l 981 11515 l
+ 927 11393 l 937 11388 l
+ 948 11383 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10548 11800 m 10614 11983 l 10618 11989 l 10623 11991 l 10629 11990 l 10633 11986 l
+ 10726 11813 l 10727 11811 l 10727 11809 l 10726 11805 l 10724 11802 l
+ 10722 11799 l 10718 11798 l 10558 11786 l 10554 11786 l 10551 11788 l
+ 10549 11792 l 10548 11796 l
+ 10548 11800 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+%  polyline 
+% Polyline
+15.000 slw
+n 1000 11501 m 1081 11572 l 1073 11581 l 1067 11591 l 1065 11590 l 984 11519 l
+ 992 11510 l
+ 1000 11501 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10841 11345 m 10833 11408 l 10833 11411 l 10822 11407 l 10810 11406 l 10817 11343 l
+
+ 10841 11345 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 98
+%  polyline 
+% Polyline
+15.000 slw
+n 1073 11581 m 1079 11571 l 1172 11624 l 1165 11633 l 1157 11642 l 1067 11591 l
+
+ 1073 11581 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10833 11411 m 10798 11526 l 10796 11529 l 10787 11523 l 10775 11519 l 10810 11403 l
+ 10822 11407 l
+ 10833 11411 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 96
+%  polyline 
+% Polyline
+15.000 slw
+n 1172 11624 m 1256 11692 l 1258 11692 l 1260 11695 l 1249 11701 l 1242 11710 l
+ 1157 11642 l 1165 11633 l
+ 1172 11624 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10796 11529 m 10756 11590 l 10754 11592 l 10746 11584 l 10736 11578 l 10777 11516 l
+ 10787 11523 l
+ 10796 11529 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 94
+%  polyline 
+% Polyline
+15.000 slw
+n 1260 11695 m 1321 11812 l 1321 11813 l 1322 11816 l 1310 11818 l 1299 11823 l
+ 1238 11706 l 1249 11701 l
+ 1260 11695 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10754 11592 m 10712 11635 l 10704 11627 l 10694 11620 l 10696 11618 l 10738 11576 l
+ 10746 11584 l
+ 10754 11592 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 92
+%  polyline 
+% Polyline
+15.000 slw
+n 1310 11818 m 1322 11816 l 1326 11856 l 1302 11859 l 1298 11819 l
+ 1310 11818 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10714 11633 m 10676 11692 l 10666 11685 l 10655 11682 l 10656 11679 l 10694 11620 l
+ 10704 11627 l
+ 10714 11633 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 3248 11834 m 3263 11827 l 3281 11823 l 3300 11822 l 3318 11825 l 3334 11832 l
+ 3349 11842 l 3361 11853 l 3370 11867 l 3377 11882 l 3382 11900 l
+ 3383 11918 l 3379 11936 l 3372 11953 l 3363 11967 l 3351 11980 l
+ 3338 11989 l 3322 11996 l 3305 12000 l 3286 12001 l 3268 11998 l
+ 3251 11991 l 3237 11981 l 3225 11970 l 3215 11956 l 3208 11941 l
+ 3204 11923 l 3203 11905 l 3207 11886 l 3214 11870 l 3223 11855 l
+ 3234 11844 l
+ 3248 11834 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1244 11371 m 1151 11199 l 1146 11194 l 1141 11192 l 1135 11195 l 1132 11199 l
+ 1066 11384 l 1065 11386 l 1065 11388 l 1066 11392 l 1069 11395 l
+ 1072 11397 l 1076 11398 l 1236 11386 l 1239 11385 l 1243 11382 l
+ 1244 11378 l 1245 11375 l 1245 11373 l
+ 1244 11371 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10678 11688 m 10649 11798 l 10638 11795 l 10626 11794 l 10626 11792 l 10655 11682 l
+ 10666 11685 l
+ 10678 11688 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 88
+%  polyline 
+% Polyline
+15.000 slw
+n 3266 11874 m 3111 11801 l 3117 11790 l 3119 11778 l 3121 11779 l 3275 11852 l
+
+ 3266 11874 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10638 11795 m 10649 11795 l 10647 11833 l 10623 11831 l 10626 11794 l
+ 10638 11795 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8602 11906 m 8612 11920 l 8620 11937 l 8624 11955 l 8624 11973 l 8620 11991 l
+ 8614 12007 l 8605 12021 l 8593 12033 l 8580 12042 l 8563 12050 l
+ 8546 12054 l 8527 12054 l 8509 12050 l 8493 12045 l 8479 12035 l
+ 8467 12025 l 8457 12010 l 8450 11994 l 8446 11976 l 8446 11957 l
+ 8449 11940 l 8456 11924 l 8464 11910 l 8476 11898 l 8490 11888 l
+ 8506 11880 l 8524 11876 l 8543 11876 l 8560 11880 l 8576 11886 l
+ 8590 11895 l
+ 8602 11906 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 3117 11790 m 3114 11802 l 2877 11747 l 2879 11735 l 2880 11724 l 3119 11778 l
+
+ 3117 11790 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10224 11427 m 10284 11241 l 10285 11235 l 10282 11230 l 10277 11227 l 10270 11228 l
+ 10091 11308 l 10089 11309 l 10088 11310 l 10086 11314 l 10085 11317 l
+ 10086 11321 l 10089 11325 l 10207 11432 l 10210 11434 l 10215 11434 l
+ 10219 11433 l 10221 11430 l 10222 11429 l
+ 10224 11427 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 84
+%  polyline 
+% Polyline
+15.000 slw
+n 2879 11735 m 2877 11747 l 2590 11708 l 2591 11697 l 2592 11685 l 2880 11724 l
+
+ 2879 11735 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8559 11915 m 8637 11817 l 8638 11816 l 8640 11814 l 8646 11824 l 8655 11831 l
+ 8577 11930 l
+ 8559 11915 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5643 11865 m 5660 11865 l 5678 11867 l 5695 11873 l 5711 11884 l 5723 11897 l
+ 5733 11910 l 5740 11925 l 5743 11941 l 5744 11959 l 5742 11977 l
+ 5736 11994 l 5725 12009 l 5713 12022 l 5699 12033 l 5683 12039 l
+ 5668 12043 l 5650 12043 l 5633 12041 l 5615 12034 l 5600 12025 l
+ 5587 12012 l 5577 11997 l 5570 11982 l 5567 11966 l 5566 11949 l
+ 5569 11931 l 5575 11914 l 5585 11898 l 5597 11886 l 5612 11876 l
+ 5626 11869 l
+ 5643 11865 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 2591 11697 m 2590 11708 l 2276 11677 l 2278 11666 l 2279 11654 l 2592 11685 l
+
+ 2591 11697 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5401 11407 m 5387 11212 l 5385 11206 l 5381 11202 l 5374 11202 l 5369 11205 l
+ 5234 11347 l 5232 11349 l 5232 11350 l 5231 11353 l 5232 11358 l
+ 5234 11361 l 5237 11363 l 5388 11417 l 5391 11418 l 5396 11417 l
+ 5398 11414 l 5400 11411 l 5401 11409 l
+ 5401 11407 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8640 11814 m 8872 11677 l 8874 11676 l 8878 11687 l 8884 11697 l 8652 11834 l
+ 8646 11824 l
+ 8640 11814 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 80
+%  polyline 
+% Polyline
+15.000 slw
+n 2278 11666 m 2276 11677 l 1959 11647 l 1961 11635 l 1962 11624 l 2279 11654 l
+
+ 2278 11666 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5635 11904 m 5632 11896 l 5644 11893 l 5654 11886 l 5654 11887 l 5655 11890 l
+ 5657 11897 l
+ 5635 11904 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8878 11687 m 8874 11676 l 9149 11591 l 9151 11603 l 9153 11615 l 8882 11698 l
+
+ 8878 11687 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 78
+%  polyline 
+% Polyline
+15.000 slw
+n 1961 11635 m 1959 11647 l 1661 11607 l 1664 11596 l 1666 11584 l 1962 11624 l
+
+ 1961 11635 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5634 11900 m 5564 11806 l 5574 11799 l 5581 11789 l 5584 11792 l 5654 11886 l
+ 5644 11893 l
+ 5634 11900 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9151 11603 m 9149 11591 l 9439 11539 l 9441 11550 l 9442 11562 l 9153 11615 l
+
+ 9151 11603 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 76
+%  polyline 
+% Polyline
+15.000 slw
+n 1661 11607 m 1407 11551 l 1406 11550 l 1410 11540 l 1413 11528 l 1666 11584 l
+ 1664 11596 l
+ 1661 11607 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5574 11799 m 5567 11809 l 5483 11746 l 5489 11736 l 5494 11726 l 5581 11789 l
+
+ 5574 11799 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9441 11550 m 9439 11539 l 9720 11496 l 9723 11508 l 9725 11520 l 9442 11562 l
+
+ 9441 11550 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 74
+%  polyline 
+% Polyline
+15.000 slw
+n 1406 11550 m 1219 11470 l 1217 11470 l 1214 11467 l 1223 11460 l 1228 11449 l
+ 1415 11529 l 1410 11540 l
+ 1406 11550 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5489 11736 m 5483 11746 l 5396 11694 l 5404 11686 l 5412 11677 l 5494 11726 l
+
+ 5489 11736 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9720 11496 m 9970 11443 l 9973 11454 l 9978 11465 l 9976 11466 l 9725 11520 l
+ 9723 11508 l
+ 9720 11496 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 72
+%  polyline 
+% Polyline
+15.000 slw
+n 1223 11460 m 1214 11467 l 1120 11358 l 1138 11342 l 1232 11452 l
+ 1223 11460 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5396 11694 m 5327 11635 l 5326 11634 l 5324 11631 l 5335 11627 l 5343 11618 l
+ 5412 11677 l 5404 11686 l
+ 5396 11694 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9968 11444 m 10162 11358 l 10167 11369 l 10176 11376 l 10175 11377 l 10172 11379 l
+ 9978 11465 l 9973 11454 l
+ 9968 11444 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1362 11373 m 1345 11376 l 1327 11375 l 1309 11370 l 1292 11361 l 1278 11350 l
+ 1268 11337 l 1259 11322 l 1254 11307 l 1252 11290 l 1253 11272 l
+ 1257 11254 l 1266 11238 l 1278 11224 l 1291 11212 l 1305 11204 l
+ 1321 11199 l 1339 11197 l 1356 11198 l 1374 11203 l 1390 11211 l
+ 1404 11223 l 1415 11236 l 1424 11250 l 1428 11266 l 1431 11283 l
+ 1430 11301 l 1425 11319 l 1416 11335 l 1405 11349 l 1391 11360 l
+ 1378 11368 l
+ 1362 11373 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 3496 11889 m 3655 12003 l 3661 12006 l 3667 12005 l 3671 12000 l 3672 11994 l
+ 3650 11799 l 3649 11796 l 3649 11795 l 3646 11793 l 3642 11790 l
+ 3638 11790 l 3635 11791 l 3497 11872 l 3494 11875 l 3492 11879 l
+ 3492 11883 l 3494 11887 l 3495 11888 l
+ 3496 11889 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5324 11631 m 5287 11544 l 5286 11543 l 5286 11539 l 5298 11540 l 5308 11535 l
+ 5346 11622 l 5335 11627 l
+ 5324 11631 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10167 11369 m 10158 11361 l 10171 11345 l 10189 11360 l 10176 11376 l
+ 10167 11369 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10439 11375 m 10425 11364 l 10414 11351 l 10405 11334 l 10399 11316 l 10398 11298 l
+ 10400 11282 l 10405 11266 l 10413 11251 l 10424 11237 l 10437 11225 l
+ 10453 11217 l 10471 11212 l 10489 11211 l 10506 11212 l 10522 11217 l
+ 10536 11225 l 10550 11236 l 10561 11249 l 10570 11266 l 10576 11283 l
+ 10577 11301 l 10575 11318 l 10570 11334 l 10562 11349 l 10552 11362 l
+ 10538 11374 l 10522 11383 l 10504 11388 l 10486 11389 l 10469 11387 l
+ 10453 11383 l
+ 10439 11375 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1361 11337 m 1363 11344 l 1352 11348 l 1345 11357 l 1343 11356 l 1342 11354 l
+ 1340 11351 l 1338 11344 l
+ 1361 11337 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5286 11539 m 5296 11403 l 5296 11400 l 5308 11404 l 5319 11405 l 5309 11540 l
+ 5298 11540 l
+ 5286 11539 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8743 11854 m 8739 12050 l 8741 12056 l 8745 12060 l 8751 12061 l 8756 12059 l
+ 8904 11930 l 8906 11928 l 8907 11927 l 8908 11923 l 8907 11919 l
+ 8905 11915 l 8902 11914 l 8757 11846 l 8754 11845 l 8749 11845 l
+ 8746 11848 l 8744 11851 l 8744 11852 l
+ 8743 11854 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 66
+%  polyline 
+% Polyline
+15.000 slw
+n 1358 11338 m 1505 11440 l 1498 11450 l 1494 11461 l 1491 11459 l 1345 11357 l
+ 1352 11348 l
+ 1358 11338 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5308 11404 m 5296 11400 l 5315 11348 l 5337 11356 l 5319 11408 l
+ 5308 11404 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10478 11354 m 10462 11392 l 10461 11394 l 10460 11395 l 10458 11397 l 10451 11388 l
+ 10440 11383 l 10456 11345 l
+ 10478 11354 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5549 11367 m 5533 11363 l 5517 11356 l 5501 11345 l 5489 11331 l 5480 11316 l
+ 5475 11300 l 5472 11283 l 5473 11266 l 5477 11249 l 5484 11233 l
+ 5495 11218 l 5509 11206 l 5525 11197 l 5541 11191 l 5558 11189 l
+ 5574 11190 l 5591 11195 l 5607 11202 l 5622 11213 l 5634 11226 l
+ 5643 11242 l 5648 11258 l 5651 11274 l 5650 11291 l 5646 11308 l
+ 5639 11324 l 5628 11339 l 5614 11351 l 5599 11360 l 5582 11366 l
+ 5566 11368 l
+ 5549 11367 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 1498 11450 m 1502 11438 l 1724 11508 l 1722 11520 l 1720 11531 l 1494 11461 l
+
+ 1498 11450 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5843 11888 m 5939 12058 l 5943 12062 l 5949 12064 l 5955 12061 l 5958 12056 l
+ 6019 11870 l 6020 11868 l 6020 11866 l 6019 11863 l 6016 11859 l
+ 6013 11857 l 6009 11857 l 5850 11872 l 5846 11873 l 5843 11876 l
+ 5842 11880 l 5841 11884 l 5842 11885 l
+ 5843 11888 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10458 11397 m 10290 11512 l 10287 11513 l 10284 11503 l 10277 11493 l 10444 11378 l
+ 10451 11388 l
+ 10458 11397 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 62
+%  polyline 
+% Polyline
+15.000 slw
+n 1722 11520 m 1724 11508 l 2002 11555 l 2001 11567 l 2000 11578 l 1720 11531 l
+
+ 1722 11520 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5576 11332 m 5579 11399 l 5568 11400 l 5556 11404 l 5556 11400 l 5552 11333 l
+
+ 5576 11332 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10284 11503 m 10287 11513 l 10049 11589 l 10047 11577 l 10045 11565 l 10280 11491 l
+
+ 10284 11503 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 60
+%  polyline 
+% Polyline
+15.000 slw
+n 2001 11567 m 2002 11555 l 2315 11588 l 2315 11600 l 2313 11611 l 2000 11578 l
+
+ 2001 11567 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5578 11395 m 5631 11523 l 5621 11528 l 5612 11536 l 5611 11535 l 5609 11532 l
+ 5556 11404 l 5568 11400 l
+ 5578 11395 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 10047 11577 m 10049 11589 l 9771 11639 l 9769 11627 l 9767 11615 l 10045 11565 l
+
+ 10047 11577 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 58
+%  polyline 
+% Polyline
+15.000 slw
+n 2315 11600 m 2315 11588 l 2640 11615 l 2639 11627 l 2638 11639 l 2313 11611 l
+
+ 2315 11600 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5629 11519 m 5707 11597 l 5699 11606 l 5693 11615 l 5691 11614 l 5612 11536 l
+ 5621 11528 l
+ 5629 11519 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9769 11627 m 9771 11639 l 9481 11680 l 9479 11668 l 9476 11657 l 9767 11615 l
+
+ 9769 11627 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 56
+%  polyline 
+% Polyline
+15.000 slw
+n 2639 11627 m 2640 11615 l 2955 11647 l 2953 11659 l 2951 11670 l 2638 11639 l
+
+ 2639 11627 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5699 11606 m 5706 11596 l 5796 11657 l 5788 11666 l 5780 11674 l 5693 11615 l
+
+ 5699 11606 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9479 11668 m 9481 11680 l 9206 11728 l 9203 11717 l 9199 11706 l 9476 11657 l
+
+ 9479 11668 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 54
+%  polyline 
+% Polyline
+15.000 slw
+n 2953 11659 m 2955 11647 l 3239 11692 l 3235 11703 l 3231 11714 l 2951 11670 l
+
+ 2953 11659 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5796 11657 m 5878 11732 l 5879 11733 l 5881 11735 l 5870 11741 l 5862 11749 l
+ 5780 11674 l 5788 11666 l
+ 5796 11657 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 9206 11728 m 8973 11799 l 8970 11788 l 8963 11778 l 8966 11777 l 9199 11706 l
+ 9203 11717 l
+ 9206 11728 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 52
+%  polyline 
+% Polyline
+15.000 slw
+n 3239 11692 m 3466 11759 l 3469 11760 l 3463 11770 l 3459 11781 l 3231 11714 l
+ 3235 11703 l
+ 3239 11692 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5881 11735 m 5940 11857 l 5940 11858 l 5941 11861 l 5929 11863 l 5919 11867 l
+ 5860 11745 l 5870 11741 l
+ 5881 11735 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8976 11797 m 8814 11906 l 8808 11897 l 8797 11893 l 8797 11891 l 8798 11889 l
+ 8801 11887 l 8963 11778 l 8970 11788 l
+ 8976 11797 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 50
+%  polyline 
+% Polyline
+15.000 slw
+n 3463 11770 m 3469 11760 l 3609 11850 l 3597 11870 l 3456 11780 l
+ 3463 11770 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 5929 11863 m 5941 11861 l 5945 11904 l 5921 11905 l 5918 11863 l
+ 5929 11863 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+%  polyline 
+% Polyline
+n 8808 11897 m 8819 11901 l 8813 11915 l 8791 11907 l 8797 11893 l
+ 8808 11897 l  cp gs 0.00 setgray ef gr gs col0 s gr 
+% Polyline
+30.000 slw
+gs  clippath
+4171 7762 m 4200 7847 l 4445 7765 l 4261 7780 l 4417 7680 l cp
+eoclip
+n 6225 7125 m
+ 4200 7800 l gs col0 s gr gr
+
+% arrowhead
+n 4417 7680 m 4261 7780 l 4445 7765 l 4417 7680 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9454 7847 m 9474 7759 l 9221 7702 l 9387 7786 l 9201 7790 l cp
+eoclip
+n 6450 7125 m
+ 9450 7800 l gs col0 s gr gr
+
+% arrowhead
+n 9201 7790 m 9387 7786 l 9221 7702 l 9201 7790 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2449 8809 m 2471 8897 l 2723 8834 l 2538 8834 l 2701 8746 l cp
+eoclip
+n 3975 8475 m
+ 2475 8850 l gs col0 s gr gr
+
+% arrowhead
+n 2701 8746 m 2538 8834 l 2723 8834 l 2701 8746 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5855 8897 m 5874 8809 l 5620 8753 l 5787 8836 l 5601 8841 l cp
+eoclip
+n 4125 8475 m
+ 5850 8850 l gs col0 s gr gr
+
+% arrowhead
+n 5601 8841 m 5787 8836 l 5620 8753 l 5601 8841 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1020 9938 m 1051 10022 l 1295 9930 l 1111 9952 l 1263 9846 l cp
+eoclip
+n 2250 9525 m
+ 1050 9975 l gs col0 s gr gr
+
+% arrowhead
+n 1263 9846 m 1111 9952 l 1295 9930 l 1263 9846 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3444 10022 m 3482 9940 l 3246 9831 l 3391 9948 l 3208 9913 l cp
+eoclip
+n 2475 9525 m
+ 3450 9975 l gs col0 s gr gr
+
+% arrowhead
+n 3208 9913 m 3391 9948 l 3246 9831 l 3208 9913 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5880 9990 m 5970 9990 l 5970 9730 l 5925 9910 l 5880 9730 l cp
+eoclip
+n 5925 9525 m
+ 5925 9975 l gs col0 s gr gr
+
+% arrowhead
+n 5880 9730 m 5925 9910 l 5970 9730 l 5880 9730 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9480 8865 m 9570 8865 l 9570 8605 l 9525 8785 l 9480 8605 l cp
+eoclip
+n 9525 8475 m
+ 9525 8850 l gs col0 s gr gr
+
+% arrowhead
+n 9480 8605 m 9525 8785 l 9570 8605 l 9480 8605 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+8294 9938 m 8327 10022 l 8568 9925 l 8385 9951 l 8535 9842 l cp
+eoclip
+n 9450 9525 m
+ 8325 9975 l gs col0 s gr gr
+
+% arrowhead
+n 8535 9842 m 8385 9951 l 8568 9925 l 8535 9842 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+10646 10022 m 10681 9939 l 10442 9836 l 10590 9949 l 10406 9919 l cp
+eoclip
+n 9600 9525 m
+ 10650 9975 l gs col0 s gr gr
+
+% arrowhead
+n 10406 9919 m 10590 9949 l 10442 9836 l 10406 9919 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+8438 11202 m 8386 11129 l 8174 11281 l 8347 11213 l 8226 11354 l cp
+eoclip
+n 7875 11550 m
+ 8400 11175 l gs col0 s gr gr
+
+% arrowhead
+n 8226 11354 m 8347 11213 l 8174 11281 l 8226 11354 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9924 11215 m 9904 11127 l 9651 11184 l 9837 11189 l 9671 11271 l cp
+eoclip
+n 7875 11625 m
+ 9900 11175 l gs col0 s gr gr
+
+% arrowhead
+n 9671 11271 m 9837 11189 l 9651 11184 l 9671 11271 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6021 11132 m 5957 11196 l 6141 11380 l 6046 11221 l 6205 11316 l cp
+eoclip
+n 6375 11550 m
+ 6000 11175 l gs col0 s gr gr
+
+% arrowhead
+n 6205 11316 m 6046 11221 l 6141 11380 l 6205 11316 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3291 11128 m 3278 11217 l 3535 11254 l 3364 11184 l 3548 11165 l cp
+eoclip
+n 6375 11625 m
+ 3300 11175 l gs col0 s gr gr
+
+% arrowhead
+n 3548 11165 m 3364 11184 l 3535 11254 l 3548 11165 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1564 11128 m 1555 11218 l 1813 11246 l 1639 11182 l 1822 11156 l cp
+eoclip
+n 6375 11700 m
+ 1575 11175 l gs col0 s gr gr
+
+% arrowhead
+n 1822 11156 m 1639 11182 l 1813 11246 l 1822 11156 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 480.00 scf sf
+2550 9300 m
+gs 1 -1 sc (chip_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+4200 8325 m
+gs 1 -1 sc (candevice_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+6450 6900 m
+gs 1 -1 sc (canhardware_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+5925 9300 m
+gs 1 -1 sc (chip_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+9375 8325 m
+gs 1 -1 sc (candevice_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+9525 9300 m
+gs 1 -1 sc (chip_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+1050 10500 m
+gs 1 -1 sc (msgobj_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+1050 12975 m
+gs 1 -1 sc (canuser_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+1050 10950 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+1050 12525 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+3450 10500 m
+gs 1 -1 sc (msgobj_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+3450 12975 m
+gs 1 -1 sc (canuser_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+3450 10950 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+3450 12525 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+5850 10500 m
+gs 1 -1 sc (msgobj_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+5850 12975 m
+gs 1 -1 sc (canuser_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+5850 10950 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+5850 12525 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+8250 10500 m
+gs 1 -1 sc (msgobj_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+8250 12975 m
+gs 1 -1 sc (canuser_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+8250 10950 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+8250 12525 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+10650 10500 m
+gs 1 -1 sc (msgobj_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+10650 12975 m
+gs 1 -1 sc (canuser_t) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+10650 10950 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 420.00 scf sf
+10650 12525 m
+gs 1 -1 sc (qends) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Times-Roman ff 480.00 scf sf
+7125 11775 m
+gs 1 -1 sc (minor[]) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.fig b/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.fig
new file mode 100644 (file)
index 0000000..4979012
--- /dev/null
@@ -0,0 +1,588 @@
+#FIG 3.2
+Portrait
+Flush left
+Inches
+Letter  
+100.00
+Single
+0
+1200 2
+0 32 #f0f0f0
+6 525 11100 3750 12075
+# polyline
+2 1 0 2 0 0 125 0 20 0.000 0 0 7 0 0 33
+        1020 11820 1036 11818 1054 11820 1072 11826 1088 11836 1101 11848
+        1111 11862 1119 11877 1122 11893 1124 11910 1122 11928 1116 11945
+        1106 11961 1093 11974 1080 11985 1065 11992 1049 11996 1032 11997
+        1014 11995 996 11989 981 11980 968 11967 958 11953 950 11939
+        946 11922 945 11905 947 11888 953 11870 962 11854 974 11841
+        988 11831 1003 11823 1020 11820
+# polyline
+2 1 0 2 0 0 124 0 20 0.000 0 0 7 0 0 20
+        734 11410 718 11214 716 11208 712 11205 705 11205 700 11207
+        566 11351 564 11352 564 11354 563 11358 564 11362 566 11365
+        569 11367 721 11419 724 11420 729 11419 731 11416 733 11413
+        734 11412 734 11410
+# polyline
+2 1 0 2 0 0 122 0 20 0.000 0 0 7 0 0 8
+        1014 11857 1012 11851 1023 11848 1032 11840 1033 11841 1034 11844
+        1036 11851 1014 11857
+# polyline
+2 1 0 2 0 0 120 0 20 0.000 0 0 7 0 0 8
+        1014 11855 939 11767 948 11760 954 11749 956 11752 1032 11840
+        1023 11848 1014 11855
+# polyline
+2 1 0 2 0 0 118 0 20 0.000 0 0 7 0 0 7
+        948 11760 942 11769 849 11716 854 11705 859 11694 954 11749
+        948 11760
+# polyline
+2 1 0 2 0 0 116 0 20 0.000 0 0 7 0 0 7
+        854 11705 849 11716 754 11674 760 11664 766 11653 859 11694
+        854 11705
+# polyline
+2 1 0 2 0 0 114 0 20 0.000 0 0 7 0 0 9
+        754 11674 676 11624 674 11622 672 11619 682 11614 688 11603
+        766 11653 760 11664 754 11674
+# polyline
+2 1 0 2 0 0 112 0 20 0.000 0 0 7 0 0 10
+        672 11619 627 11540 626 11539 625 11538 625 11534 637 11535
+        647 11529 692 11607 682 11614 672 11619
+# polyline
+2 1 0 2 0 0 110 0 20 0.000 0 0 7 0 0 8
+        625 11534 629 11405 630 11401 641 11405 653 11405 648 11535
+        637 11535 625 11534
+# polyline
+2 1 0 2 0 0 108 0 20 0.000 0 0 7 0 0 6
+        641 11405 630 11401 647 11351 670 11359 652 11409 641 11405
+# polyline
+2 1 0 2 0 0 107 0 20 0.000 0 0 7 0 0 33
+        919 11357 902 11353 886 11346 871 11336 859 11322 850 11306
+        844 11290 841 11274 842 11257 846 11240 853 11223 864 11209
+        878 11197 894 11188 910 11181 927 11179 943 11180 960 11184
+        976 11191 991 11202 1003 11215 1012 11232 1018 11248 1021 11264
+        1019 11281 1016 11297 1008 11314 998 11329 984 11341 969 11350
+        952 11356 936 11359 919 11357
+# polyline
+2 1 0 2 0 0 106 0 20 0.000 0 0 7 0 0 18
+        1223 11841 1321 12010 1325 12015 1330 12017 1336 12014 1339 12009
+        1400 11822 1400 11819 1399 11815 1397 11811 1393 11810 1390 11809
+        1230 11826 1227 11827 1223 11829 1222 11834 1222 11839 1223 11841
+# polyline
+2 1 0 2 0 0 104 0 20 0.000 0 0 7 0 0 8
+        945 11322 949 11387 937 11388 927 11393 926 11391 926 11388
+        922 11323 945 11322
+# polyline
+2 1 0 2 0 0 102 0 20 0.000 0 0 7 0 0 9
+        948 11383 1003 11505 992 11510 984 11519 983 11518 981 11515
+        927 11393 937 11388 948 11383
+# polyline
+2 1 0 2 0 0 100 0 20 0.000 0 0 7 0 0 8
+        1000 11501 1081 11572 1073 11581 1067 11591 1065 11590 984 11519
+        992 11510 1000 11501
+# polyline
+2 1 0 2 0 0 98 0 20 0.000 0 0 7 0 0 7
+        1073 11581 1079 11571 1172 11624 1165 11633 1157 11642 1067 11591
+        1073 11581
+# polyline
+2 1 0 2 0 0 96 0 20 0.000 0 0 7 0 0 9
+        1172 11624 1256 11692 1258 11692 1260 11695 1249 11701 1242 11710
+        1157 11642 1165 11633 1172 11624
+# polyline
+2 1 0 2 0 0 94 0 20 0.000 0 0 7 0 0 9
+        1260 11695 1321 11812 1321 11813 1322 11816 1310 11818 1299 11823
+        1238 11706 1249 11701 1260 11695
+# polyline
+2 1 0 2 0 0 92 0 20 0.000 0 0 7 0 0 6
+        1310 11818 1322 11816 1326 11856 1302 11859 1298 11819 1310 11818
+# polyline
+2 1 0 2 0 0 90 0 20 0.000 0 0 7 0 0 20
+        1244 11371 1151 11199 1146 11194 1141 11192 1135 11195 1132 11199
+        1066 11384 1065 11386 1065 11388 1066 11392 1069 11395 1072 11397
+        1076 11398 1236 11386 1239 11385 1243 11382 1244 11378 1245 11375
+        1245 11373 1244 11371
+# polyline
+2 1 0 2 0 0 76 0 20 0.000 0 0 7 0 0 8
+        1661 11607 1407 11551 1406 11550 1410 11540 1413 11528 1666 11584
+        1664 11596 1661 11607
+# polyline
+2 1 0 2 0 0 74 0 20 0.000 0 0 7 0 0 9
+        1406 11550 1219 11470 1217 11470 1214 11467 1223 11460 1228 11449
+        1415 11529 1410 11540 1406 11550
+# polyline
+2 1 0 2 0 0 72 0 20 0.000 0 0 7 0 0 6
+        1223 11460 1214 11467 1120 11358 1138 11342 1232 11452 1223 11460
+# polyline
+2 1 0 2 0 0 71 0 20 0.000 0 0 7 0 0 33
+        1362 11373 1345 11376 1327 11375 1309 11370 1292 11361 1278 11350
+        1268 11337 1259 11322 1254 11307 1252 11290 1253 11272 1257 11254
+        1266 11238 1278 11224 1291 11212 1305 11204 1321 11199 1339 11197
+        1356 11198 1374 11203 1390 11211 1404 11223 1415 11236 1424 11250
+        1428 11266 1431 11283 1430 11301 1425 11319 1416 11335 1405 11349
+        1391 11360 1378 11368 1362 11373
+# polyline
+2 1 0 2 0 0 68 0 20 0.000 0 0 7 0 0 9
+        1361 11337 1363 11344 1352 11348 1345 11357 1343 11356 1342 11354
+        1340 11351 1338 11344 1361 11337
+# polyline
+2 1 0 2 0 0 66 0 20 0.000 0 0 7 0 0 8
+        1358 11338 1505 11440 1498 11450 1494 11461 1491 11459 1345 11357
+        1352 11348 1358 11338
+# polyline
+2 1 0 2 0 0 64 0 20 0.000 0 0 7 0 0 7
+        1498 11450 1502 11438 1724 11508 1722 11520 1720 11531 1494 11461
+        1498 11450
+# polyline
+2 1 0 2 0 0 91 0 20 0.000 0 0 7 0 0 33
+        3248 11834 3263 11827 3281 11823 3300 11822 3318 11825 3334 11832
+        3349 11842 3361 11853 3370 11867 3377 11882 3382 11900 3383 11918
+        3379 11936 3372 11953 3363 11967 3351 11980 3338 11989 3322 11996
+        3305 12000 3286 12001 3268 11998 3251 11991 3237 11981 3225 11970
+        3215 11956 3208 11941 3204 11923 3203 11905 3207 11886 3214 11870
+        3223 11855 3234 11844 3248 11834
+# polyline
+2 1 0 2 0 0 88 0 20 0.000 0 0 7 0 0 7
+        3266 11874 3111 11801 3117 11790 3119 11778 3121 11779 3275 11852
+        3266 11874
+# polyline
+2 1 0 2 0 0 86 0 20 0.000 0 0 7 0 0 7
+        3117 11790 3114 11802 2877 11747 2879 11735 2880 11724 3119 11778
+        3117 11790
+# polyline
+2 1 0 2 0 0 84 0 20 0.000 0 0 7 0 0 7
+        2879 11735 2877 11747 2590 11708 2591 11697 2592 11685 2880 11724
+        2879 11735
+# polyline
+2 1 0 2 0 0 82 0 20 0.000 0 0 7 0 0 7
+        2591 11697 2590 11708 2276 11677 2278 11666 2279 11654 2592 11685
+        2591 11697
+# polyline
+2 1 0 2 0 0 80 0 20 0.000 0 0 7 0 0 7
+        2278 11666 2276 11677 1959 11647 1961 11635 1962 11624 2279 11654
+        2278 11666
+# polyline
+2 1 0 2 0 0 78 0 20 0.000 0 0 7 0 0 7
+        1961 11635 1959 11647 1661 11607 1664 11596 1666 11584 1962 11624
+        1961 11635
+# polyline
+2 1 0 2 0 0 70 0 20 0.000 0 0 7 0 0 20
+        3496 11889 3655 12003 3661 12006 3667 12005 3671 12000 3672 11994
+        3650 11799 3649 11796 3649 11795 3646 11793 3642 11790 3638 11790
+        3635 11791 3497 11872 3494 11875 3492 11879 3492 11883 3494 11887
+        3495 11888 3496 11889
+# polyline
+2 1 0 2 0 0 62 0 20 0.000 0 0 7 0 0 7
+        1722 11520 1724 11508 2002 11555 2001 11567 2000 11578 1720 11531
+        1722 11520
+# polyline
+2 1 0 2 0 0 60 0 20 0.000 0 0 7 0 0 7
+        2001 11567 2002 11555 2315 11588 2315 11600 2313 11611 2000 11578
+        2001 11567
+# polyline
+2 1 0 2 0 0 58 0 20 0.000 0 0 7 0 0 7
+        2315 11600 2315 11588 2640 11615 2639 11627 2638 11639 2313 11611
+        2315 11600
+# polyline
+2 1 0 2 0 0 56 0 20 0.000 0 0 7 0 0 7
+        2639 11627 2640 11615 2955 11647 2953 11659 2951 11670 2638 11639
+        2639 11627
+# polyline
+2 1 0 2 0 0 52 0 20 0.000 0 0 7 0 0 8
+        3239 11692 3466 11759 3469 11760 3463 11770 3459 11781 3231 11714
+        3235 11703 3239 11692
+# polyline
+2 1 0 2 0 0 50 0 20 0.000 0 0 7 0 0 6
+        3463 11770 3469 11760 3609 11850 3597 11870 3456 11780 3463 11770
+# polyline
+2 1 0 2 0 0 54 0 20 0.000 0 0 7 0 0 7
+        2953 11659 2955 11647 3239 11692 3235 11703 3231 11714 2951 11670
+        2953 11659
+-6
+6 5175 11100 6075 12150
+# polyline
+2 1 0 2 0 0 83 0 20 0.000 0 0 7 0 0 33
+        5643 11865 5660 11865 5678 11867 5695 11873 5711 11884 5723 11897
+        5733 11910 5740 11925 5743 11941 5744 11959 5742 11977 5736 11994
+        5725 12009 5713 12022 5699 12033 5683 12039 5668 12043 5650 12043
+        5633 12041 5615 12034 5600 12025 5587 12012 5577 11997 5570 11982
+        5567 11966 5566 11949 5569 11931 5575 11914 5585 11898 5597 11886
+        5612 11876 5626 11869 5643 11865
+# polyline
+2 1 0 2 0 0 82 0 20 0.000 0 0 7 0 0 20
+        5401 11407 5387 11212 5385 11206 5381 11202 5374 11202 5369 11205
+        5234 11347 5232 11349 5232 11350 5231 11353 5232 11358 5234 11361
+        5237 11363 5388 11417 5391 11418 5396 11417 5398 11414 5400 11411
+        5401 11409 5401 11407
+# polyline
+2 1 0 2 0 0 80 0 20 0.000 0 0 7 0 0 8
+        5635 11904 5632 11896 5644 11893 5654 11886 5654 11887 5655 11890
+        5657 11897 5635 11904
+# polyline
+2 1 0 2 0 0 78 0 20 0.000 0 0 7 0 0 8
+        5634 11900 5564 11806 5574 11799 5581 11789 5584 11792 5654 11886
+        5644 11893 5634 11900
+# polyline
+2 1 0 2 0 0 76 0 20 0.000 0 0 7 0 0 7
+        5574 11799 5567 11809 5483 11746 5489 11736 5494 11726 5581 11789
+        5574 11799
+# polyline
+2 1 0 2 0 0 74 0 20 0.000 0 0 7 0 0 7
+        5489 11736 5483 11746 5396 11694 5404 11686 5412 11677 5494 11726
+        5489 11736
+# polyline
+2 1 0 2 0 0 72 0 20 0.000 0 0 7 0 0 9
+        5396 11694 5327 11635 5326 11634 5324 11631 5335 11627 5343 11618
+        5412 11677 5404 11686 5396 11694
+# polyline
+2 1 0 2 0 0 70 0 20 0.000 0 0 7 0 0 9
+        5324 11631 5287 11544 5286 11543 5286 11539 5298 11540 5308 11535
+        5346 11622 5335 11627 5324 11631
+# polyline
+2 1 0 2 0 0 68 0 20 0.000 0 0 7 0 0 8
+        5286 11539 5296 11403 5296 11400 5308 11404 5319 11405 5309 11540
+        5298 11540 5286 11539
+# polyline
+2 1 0 2 0 0 66 0 20 0.000 0 0 7 0 0 6
+        5308 11404 5296 11400 5315 11348 5337 11356 5319 11408 5308 11404
+# polyline
+2 1 0 2 0 0 65 0 20 0.000 0 0 7 0 0 33
+        5549 11367 5533 11363 5517 11356 5501 11345 5489 11331 5480 11316
+        5475 11300 5472 11283 5473 11266 5477 11249 5484 11233 5495 11218
+        5509 11206 5525 11197 5541 11191 5558 11189 5574 11190 5591 11195
+        5607 11202 5622 11213 5634 11226 5643 11242 5648 11258 5651 11274
+        5650 11291 5646 11308 5639 11324 5628 11339 5614 11351 5599 11360
+        5582 11366 5566 11368 5549 11367
+# polyline
+2 1 0 2 0 0 64 0 20 0.000 0 0 7 0 0 20
+        5843 11888 5939 12058 5943 12062 5949 12064 5955 12061 5958 12056
+        6019 11870 6020 11868 6020 11866 6019 11863 6016 11859 6013 11857
+        6009 11857 5850 11872 5846 11873 5843 11876 5842 11880 5841 11884
+        5842 11885 5843 11888
+# polyline
+2 1 0 2 0 0 62 0 20 0.000 0 0 7 0 0 7
+        5576 11332 5579 11399 5568 11400 5556 11404 5556 11400 5552 11333
+        5576 11332
+# polyline
+2 1 0 2 0 0 60 0 20 0.000 0 0 7 0 0 9
+        5578 11395 5631 11523 5621 11528 5612 11536 5611 11535 5609 11532
+        5556 11404 5568 11400 5578 11395
+# polyline
+2 1 0 2 0 0 58 0 20 0.000 0 0 7 0 0 8
+        5629 11519 5707 11597 5699 11606 5693 11615 5691 11614 5612 11536
+        5621 11528 5629 11519
+# polyline
+2 1 0 2 0 0 56 0 20 0.000 0 0 7 0 0 7
+        5699 11606 5706 11596 5796 11657 5788 11666 5780 11674 5693 11615
+        5699 11606
+# polyline
+2 1 0 2 0 0 54 0 20 0.000 0 0 7 0 0 9
+        5796 11657 5878 11732 5879 11733 5881 11735 5870 11741 5862 11749
+        5780 11674 5788 11666 5796 11657
+# polyline
+2 1 0 2 0 0 52 0 20 0.000 0 0 7 0 0 9
+        5881 11735 5940 11857 5940 11858 5941 11861 5929 11863 5919 11867
+        5860 11745 5870 11741 5881 11735
+# polyline
+2 1 0 2 0 0 50 0 20 0.000 0 0 7 0 0 6
+        5929 11863 5941 11861 5945 11904 5921 11905 5918 11863 5929 11863
+-6
+6 8400 11175 10950 12150
+# polyline
+2 1 0 2 0 0 119 0 20 0.000 0 0 7 0 0 33
+        10474 11764 10490 11769 10506 11777 10521 11789 10532 11803 10540 11820
+        10545 11836 10547 11853 10544 11869 10540 11886 10532 11902 10520 11916
+        10505 11927 10489 11935 10473 11940 10456 11941 10440 11940 10423 11935
+        10408 11927 10393 11915 10381 11901 10374 11885 10369 11868 10367 11852
+        10370 11835 10374 11819 10382 11803 10394 11788 10409 11777 10424 11769
+        10441 11764 10457 11762 10474 11764
+# polyline
+2 1 0 2 0 0 118 0 20 0.000 0 0 7 0 0 19
+        10738 11383 10668 11200 10664 11195 10659 11192 10653 11194 10649 11198
+        10560 11373 10559 11376 10559 11377 10560 11381 10561 11385 10564 11387
+        10568 11388 10728 11396 10732 11396 10735 11394 10737 11390 10738 11386
+        10738 11383
+# polyline
+2 1 0 2 0 0 116 0 20 0.000 0 0 7 0 0 8
+        10439 11796 10455 11717 10455 11715 10457 11712 10467 11719 10478 11721
+        10462 11801 10439 11796
+# polyline
+2 1 0 2 0 0 114 0 20 0.000 0 0 7 0 0 8
+        10457 11712 10488 11667 10491 11664 10498 11674 10508 11680 10476 11726
+        10467 11719 10457 11712
+# polyline
+2 1 0 2 0 0 112 0 20 0.000 0 0 7 0 0 7
+        10498 11674 10491 11664 10530 11632 10538 11641 10546 11650 10505 11683
+        10498 11674
+# polyline
+2 1 0 2 0 0 110 0 20 0.000 0 0 7 0 0 8
+        10530 11632 10573 11591 10581 11600 10592 11606 10589 11609 10546 11650
+        10538 11641 10530 11632
+# polyline
+2 1 0 2 0 0 108 0 20 0.000 0 0 7 0 0 8
+        10570 11595 10609 11521 10620 11527 10631 11529 10630 11532 10592 11606
+        10581 11600 10570 11595
+# polyline
+2 1 0 2 0 0 106 0 20 0.000 0 0 7 0 0 7
+        10620 11527 10608 11524 10636 11397 10648 11398 10659 11399 10631 11529
+        10620 11527
+# polyline
+2 1 0 2 0 0 104 0 20 0.000 0 0 7 0 0 6
+        10648 11398 10636 11397 10638 11351 10662 11352 10659 11399 10648 11398
+# polyline
+2 1 0 2 0 0 103 0 20 0.000 0 0 7 0 0 33
+        10809 11376 10793 11369 10778 11359 10765 11346 10755 11330 10749 11313
+        10746 11297 10746 11280 10750 11264 10757 11248 10767 11233 10779 11220
+        10795 11210 10812 11205 10829 11201 10846 11202 10862 11205 10878 11212
+        10892 11222 10906 11235 10915 11250 10921 11267 10924 11284 10924 11301
+        10921 11317 10914 11333 10904 11348 10891 11361 10875 11371 10859 11377
+        10841 11380 10825 11380 10809 11376
+# polyline
+2 1 0 2 0 0 102 0 20 0.000 0 0 7 0 0 19
+        10548 11800 10614 11983 10618 11989 10623 11991 10629 11990 10633 11986
+        10726 11813 10727 11811 10727 11809 10726 11805 10724 11802 10722 11799
+        10718 11798 10558 11786 10554 11786 10551 11788 10549 11792 10548 11796
+        10548 11800
+# polyline
+2 1 0 2 0 0 100 0 20 0.000 0 0 7 0 0 7
+        10841 11345 10833 11408 10833 11411 10822 11407 10810 11406 10817 11343
+        10841 11345
+# polyline
+2 1 0 2 0 0 98 0 20 0.000 0 0 7 0 0 8
+        10833 11411 10798 11526 10796 11529 10787 11523 10775 11519 10810 11403
+        10822 11407 10833 11411
+# polyline
+2 1 0 2 0 0 96 0 20 0.000 0 0 7 0 0 8
+        10796 11529 10756 11590 10754 11592 10746 11584 10736 11578 10777 11516
+        10787 11523 10796 11529
+# polyline
+2 1 0 2 0 0 94 0 20 0.000 0 0 7 0 0 8
+        10754 11592 10712 11635 10704 11627 10694 11620 10696 11618 10738 11576
+        10746 11584 10754 11592
+# polyline
+2 1 0 2 0 0 92 0 20 0.000 0 0 7 0 0 8
+        10714 11633 10676 11692 10666 11685 10655 11682 10656 11679 10694 11620
+        10704 11627 10714 11633
+# polyline
+2 1 0 2 0 0 90 0 20 0.000 0 0 7 0 0 8
+        10678 11688 10649 11798 10638 11795 10626 11794 10626 11792 10655 11682
+        10666 11685 10678 11688
+# polyline
+2 1 0 2 0 0 88 0 20 0.000 0 0 7 0 0 6
+        10638 11795 10649 11795 10647 11833 10623 11831 10626 11794 10638 11795
+# polyline
+2 1 0 2 0 0 87 0 20 0.000 0 0 7 0 0 33
+        8602 11906 8612 11920 8620 11937 8624 11955 8624 11973 8620 11991
+        8614 12007 8605 12021 8593 12033 8580 12042 8563 12050 8546 12054
+        8527 12054 8509 12050 8493 12045 8479 12035 8467 12025 8457 12010
+        8450 11994 8446 11976 8446 11957 8449 11940 8456 11924 8464 11910
+        8476 11898 8490 11888 8506 11880 8524 11876 8543 11876 8560 11880
+        8576 11886 8590 11895 8602 11906
+# polyline
+2 1 0 2 0 0 86 0 20 0.000 0 0 7 0 0 20
+        10224 11427 10284 11241 10285 11235 10282 11230 10277 11227 10270 11228
+        10091 11308 10089 11309 10088 11310 10086 11314 10085 11317 10086 11321
+        10089 11325 10207 11432 10210 11434 10215 11434 10219 11433 10221 11430
+        10222 11429 10224 11427
+# polyline
+2 1 0 2 0 0 84 0 20 0.000 0 0 7 0 0 8
+        8559 11915 8637 11817 8638 11816 8640 11814 8646 11824 8655 11831
+        8577 11930 8559 11915
+# polyline
+2 1 0 2 0 0 82 0 20 0.000 0 0 7 0 0 8
+        8640 11814 8872 11677 8874 11676 8878 11687 8884 11697 8652 11834
+        8646 11824 8640 11814
+# polyline
+2 1 0 2 0 0 80 0 20 0.000 0 0 7 0 0 7
+        8878 11687 8874 11676 9149 11591 9151 11603 9153 11615 8882 11698
+        8878 11687
+# polyline
+2 1 0 2 0 0 78 0 20 0.000 0 0 7 0 0 7
+        9151 11603 9149 11591 9439 11539 9441 11550 9442 11562 9153 11615
+        9151 11603
+# polyline
+2 1 0 2 0 0 76 0 20 0.000 0 0 7 0 0 7
+        9441 11550 9439 11539 9720 11496 9723 11508 9725 11520 9442 11562
+        9441 11550
+# polyline
+2 1 0 2 0 0 74 0 20 0.000 0 0 7 0 0 8
+        9720 11496 9970 11443 9973 11454 9978 11465 9976 11466 9725 11520
+        9723 11508 9720 11496
+# polyline
+2 1 0 2 0 0 72 0 20 0.000 0 0 7 0 0 9
+        9968 11444 10162 11358 10167 11369 10176 11376 10175 11377 10172 11379
+        9978 11465 9973 11454 9968 11444
+# polyline
+2 1 0 2 0 0 70 0 20 0.000 0 0 7 0 0 6
+        10167 11369 10158 11361 10171 11345 10189 11360 10176 11376 10167 11369
+# polyline
+2 1 0 2 0 0 69 0 20 0.000 0 0 7 0 0 33
+        10439 11375 10425 11364 10414 11351 10405 11334 10399 11316 10398 11298
+        10400 11282 10405 11266 10413 11251 10424 11237 10437 11225 10453 11217
+        10471 11212 10489 11211 10506 11212 10522 11217 10536 11225 10550 11236
+        10561 11249 10570 11266 10576 11283 10577 11301 10575 11318 10570 11334
+        10562 11349 10552 11362 10538 11374 10522 11383 10504 11388 10486 11389
+        10469 11387 10453 11383 10439 11375
+# polyline
+2 1 0 2 0 0 68 0 20 0.000 0 0 7 0 0 20
+        8743 11854 8739 12050 8741 12056 8745 12060 8751 12061 8756 12059
+        8904 11930 8906 11928 8907 11927 8908 11923 8907 11919 8905 11915
+        8902 11914 8757 11846 8754 11845 8749 11845 8746 11848 8744 11851
+        8744 11852 8743 11854
+# polyline
+2 1 0 2 0 0 66 0 20 0.000 0 0 7 0 0 9
+        10478 11354 10462 11392 10461 11394 10460 11395 10458 11397 10451 11388
+        10440 11383 10456 11345 10478 11354
+# polyline
+2 1 0 2 0 0 64 0 20 0.000 0 0 7 0 0 8
+        10458 11397 10290 11512 10287 11513 10284 11503 10277 11493 10444 11378
+        10451 11388 10458 11397
+# polyline
+2 1 0 2 0 0 62 0 20 0.000 0 0 7 0 0 7
+        10284 11503 10287 11513 10049 11589 10047 11577 10045 11565 10280 11491
+        10284 11503
+# polyline
+2 1 0 2 0 0 60 0 20 0.000 0 0 7 0 0 7
+        10047 11577 10049 11589 9771 11639 9769 11627 9767 11615 10045 11565
+        10047 11577
+# polyline
+2 1 0 2 0 0 58 0 20 0.000 0 0 7 0 0 7
+        9769 11627 9771 11639 9481 11680 9479 11668 9476 11657 9767 11615
+        9769 11627
+# polyline
+2 1 0 2 0 0 56 0 20 0.000 0 0 7 0 0 7
+        9479 11668 9481 11680 9206 11728 9203 11717 9199 11706 9476 11657
+        9479 11668
+# polyline
+2 1 0 2 0 0 54 0 20 0.000 0 0 7 0 0 8
+        9206 11728 8973 11799 8970 11788 8963 11778 8966 11777 9199 11706
+        9203 11717 9206 11728
+# polyline
+2 1 0 2 0 0 52 0 20 0.000 0 0 7 0 0 10
+        8976 11797 8814 11906 8808 11897 8797 11893 8797 11891 8798 11889
+        8801 11887 8963 11778 8970 11788 8976 11797
+# polyline
+2 1 0 2 0 0 50 0 20 0.000 0 0 7 0 0 6
+        8808 11897 8819 11901 8813 11915 8791 11907 8797 11893 8808 11897
+-6
+# polyline
+2 1 0 0 0 0 999 0 20 4.000 0 0 0 0 0 1
+        0 13200
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        9621 13178 11721 13178 11721 12128 9621 12128 9621 13178
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        7221 13178 9321 13178 9321 12128 7221 12128 7221 13178
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        4821 13178 6921 13178 6921 12128 4821 12128 4821 13178
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        2421 13178 4521 13178 4521 12128 2421 12128 2421 13178
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        21 13178 2121 13178 2121 12128 21 12128 21 13178
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        21 11078 2121 11078 2121 10028 21 10028 21 11078
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        2421 11078 4521 11078 4521 10028 2421 10028 2421 11078
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        4821 11078 6921 11078 6921 10028 4821 10028 4821 11078
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        7221 11078 9321 11078 9321 10028 7221 10028 7221 11078
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        9621 11078 11721 11078 11721 10028 9621 10028 9621 11078
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        8571 9503 10371 9503 10371 8903 8571 8903 8571 9503
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        4971 9503 6771 9503 6771 8903 4971 8903 4971 9503
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        1521 9503 3321 9503 3321 8903 1521 8903 1521 9503
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        2871 8453 5571 8453 5571 7853 2871 7853 2871 8453
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        7971 8453 10671 8453 10671 7853 7971 7853 7971 8453
+# polyline
+2 1 0 3 0 32 200 0 20 4.000 0 0 0 0 0 5
+        4521 7103 8271 7103 8271 6503 4521 6503 4521 7103
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        6225 7125 4200 7800
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        6450 7125 9450 7800
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        3975 8475 2475 8850
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        4125 8475 5850 8850
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2250 9525 1050 9975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        2475 9525 3450 9975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        5925 9525 5925 9975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        9525 8475 9525 8850
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        9450 9525 8325 9975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        9600 9525 10650 9975
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        7875 11550 8400 11175
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        7875 11625 9900 11175
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        6375 11550 6000 11175
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        6375 11625 3300 11175
+2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+       1 1 3.00 90.00 180.00
+        6375 11700 1575 11175
+4 1 0 50 -1 0 32 0.0000 4 435 1200 2550 9300 chip_t\001
+4 1 0 50 -1 0 32 0.0000 4 390 2280 4200 8325 candevice_t\001
+4 1 0 50 -1 0 32 0.0000 4 390 2820 6450 6900 canhardware_t\001
+4 1 0 50 -1 0 32 0.0000 4 435 1200 5925 9300 chip_t\001
+4 1 0 50 -1 0 32 0.0000 4 390 2280 9375 8325 candevice_t\001
+4 1 0 50 -1 0 32 0.0000 4 435 1200 9525 9300 chip_t\001
+4 1 0 50 -1 0 32 0.0000 4 435 1785 1050 10500 msgobj_t\001
+4 1 0 50 -1 0 32 0.0000 4 345 1830 1050 12975 canuser_t\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 1050 10950 qends\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 1050 12525 qends\001
+4 1 0 50 -1 0 32 0.0000 4 435 1785 3450 10500 msgobj_t\001
+4 1 0 50 -1 0 32 0.0000 4 345 1830 3450 12975 canuser_t\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 3450 10950 qends\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 3450 12525 qends\001
+4 1 0 50 -1 0 32 0.0000 4 435 1785 5850 10500 msgobj_t\001
+4 1 0 50 -1 0 32 0.0000 4 345 1830 5850 12975 canuser_t\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 5850 10950 qends\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 5850 12525 qends\001
+4 1 0 50 -1 0 32 0.0000 4 435 1785 8250 10500 msgobj_t\001
+4 1 0 50 -1 0 32 0.0000 4 345 1830 8250 12975 canuser_t\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 8250 10950 qends\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 8250 12525 qends\001
+4 1 0 50 -1 0 32 0.0000 4 435 1785 10650 10500 msgobj_t\001
+4 1 0 50 -1 0 32 0.0000 4 345 1830 10650 12975 canuser_t\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 10650 10950 qends\001
+4 1 0 50 -1 0 28 0.0000 4 375 975 10650 12525 qends\001
+4 1 0 50 -1 0 32 0.0000 4 420 1485 7125 11775 minor[]\001
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.pdf b/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.pdf
new file mode 100644 (file)
index 0000000..73e8a47
Binary files /dev/null and b/lincan-0.3.3/doc/lincandoc/img/lincan_canhardware1.pdf differ
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.eps b/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.eps
new file mode 100644 (file)
index 0000000..6d3d343
--- /dev/null
@@ -0,0 +1,1104 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /root/ocera/presentation/RTLWS03/fig/lincan_canqueue1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Oct  4 15:59:58 2003
+%%For: pisa@kotik (Pavel Pisa)
+%%BoundingBox: 0 0 570 223
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.719 0.277 0.000 srgb} bind def
+/col33 {0.598 0.156 0.297 srgb} bind def
+/col34 {0.859 0.137 0.000 srgb} bind def
+/col35 {0.875 0.875 0.875 srgb} bind def
+
+end
+save
+newpath 0 223 moveto 0 0 lineto 570 0 lineto 570 223 lineto closepath clip newpath
+-38.5 260.6 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 200
+% Polyline
+30.000 slw
+n 675 675 m 3600 675 l 3600 3825 l 675 3825 l
+ cp gs col35 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 195
+%  spline 
+% Polyline
+2 slj
+n 7850 4306 m 7848 4306 l 7846 4307 l 7844 4307 l 7843 4307 l 7842 4308 l
+ 7840 4309 l 7838 4310 l 7836 4311 l 7835 4312 l 7834 4313 l
+ 7833 4315 l 7832 4316 l 7831 4317 l 7830 4319 l 7829 4321 l
+ 7829 4323 l 7829 4324 l 7829 4325 l 7829 4327 l 7830 4329 l
+ 7830 4331 l 7831 4332 l 7831 4333 l 7833 4334 l 7834 4336 l
+ 7835 4337 l 7836 4338 l 7836 4339 l 7838 4340 l 7840 4341 l
+ 7841 4341 l 7842 4341 l 7844 4342 l 7846 4342 l 7848 4343 l
+ 7849 4343 l 7850 4343 l 7852 4343 l 7854 4342 l 7856 4342 l
+ 7857 4342 l 7858 4342 l 7859 4341 l 7861 4340 l 7863 4339 l
+ 7863 4338 l 7864 4338 l 7865 4337 l 7866 4336 l 7867 4334 l
+ 7868 4334 l 7868 4333 l 7869 4331 l 7870 4329 l 7870 4327 l
+ 7871 4326 l 7871 4325 l 7871 4324 l 7871 4321 l 7871 4317 l
+ 7871 4314 l 7871 4313 l 7870 4313 l 7868 4311 l 7863 4308 l
+ 7861 4306 l 7860 4306 l 7859 4306 l 7857 4306 l 7853 4306 l
+ 7851 4306 l
+ 7850 4306 l  cp gs 0.00 setgray ef gr 
+% here ends figure;
+% 
+% here starts figure with depth 50
+/Times-Roman ff 360.00 scf sf
+975 1125 m
+gs 1 -1 sc (canqueue_fifo_t) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 1575 m
+gs 1 -1 sc (flags) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 1950 m
+gs 1 -1 sc (error_code) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 2325 m
+gs 1 -1 sc (*head) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 2700 m
+gs 1 -1 sc (**tail) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 3075 m
+gs 1 -1 sc (*flist) col0 sh gr
+/Times-Roman ff 360.00 scf sf
+1800 3450 m
+gs 1 -1 sc (*entry) col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 0
+%  polyline 
+% Polyline
+n 7051 3863 m 3997 3863 l 3993 3863 l 3990 3862 l 3986 3860 l 3983 3859 l
+ 3980 3856 l 3978 3853 l 3976 3850 l 3975 3847 l 3974 3840 l
+ 3997 3840 l 3997 3816 l 7051 3816 l 7051 3840 l
+ 7051 3863 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3974 3840 m 3974 3049 l 3974 3045 l 3975 3041 l 3976 3038 l 3978 3035 l
+ 3980 3032 l 3983 3030 l 3986 3028 l 3990 3026 l 3997 3025 l
+ 3997 3049 l 4021 3049 l 4021 3840 l 3997 3840 l
+ 3974 3840 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3997 3025 m 10106 3025 l 10109 3025 l 10113 3026 l 10116 3028 l 10119 3030 l
+ 10122 3032 l 10124 3035 l 10126 3038 l 10128 3041 l 10129 3049 l
+ 10106 3049 l 10106 3073 l 3997 3073 l 3997 3049 l
+ 3997 3025 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 10129 3049 m 10129 3840 l 10129 3843 l 10128 3847 l 10126 3850 l 10124 3853 l
+ 10122 3856 l 10119 3859 l 10116 3860 l 10113 3862 l 10106 3863 l
+ 10106 3840 l 10082 3840 l 10082 3049 l 10106 3049 l
+ 10129 3049 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 10106 3840 m 10106 3863 l 7051 3863 l 7051 3840 l 7051 3816 l 10106 3816 l
+
+ 10106 3840 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5769 3036 m 5769 3827 l 5741 3827 l 5741 3036 l
+ 5769 3036 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7380 3049 m 7380 3840 l 7351 3840 l 7351 3049 l
+ 7380 3049 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4948 3039 m 4948 3830 l 4919 3830 l 4919 3039 l
+ 4948 3039 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6558 3052 m 6558 3843 l 6529 3843 l 6529 3052 l
+ 6558 3052 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8246 3039 m 8246 3830 l 8218 3830 l 8218 3039 l
+ 8246 3039 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9164 3042 m 9164 3833 l 9136 3833 l 9136 3042 l
+ 9164 3042 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3308 3352 m 3298 3366 l 3285 3379 l 3270 3389 l 3252 3395 l 3234 3397 l
+ 3217 3396 l 3201 3392 l 3186 3385 l 3172 3375 l 3159 3363 l
+ 3150 3347 l 3144 3329 l 3141 3312 l 3142 3294 l 3146 3278 l
+ 3153 3263 l 3163 3249 l 3176 3237 l 3191 3227 l 3208 3221 l
+ 3226 3219 l 3244 3220 l 3260 3223 l 3275 3230 l 3289 3240 l
+ 3301 3253 l 3311 3269 l 3317 3286 l 3320 3304 l 3319 3321 l
+ 3316 3337 l
+ 3308 3352 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3729 3500 m 3911 3428 l 3916 3424 l 3919 3419 l 3917 3413 l 3913 3409 l
+ 3737 3322 l 3735 3321 l 3733 3321 l 3729 3322 l 3726 3323 l
+ 3723 3326 l 3722 3330 l 3716 3490 l 3716 3494 l 3718 3497 l
+ 3722 3499 l 3726 3500 l 3727 3500 l
+ 3729 3500 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3285 3314 m 3331 3330 l 3328 3342 l 3325 3353 l 3277 3337 l
+ 3285 3314 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3328 3342 m 3331 3330 l 3508 3371 l 3506 3383 l 3504 3394 l 3325 3353 l
+
+ 3328 3342 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3506 3383 m 3508 3371 l 3668 3394 l 3668 3406 l 3667 3417 l 3504 3394 l
+
+ 3506 3383 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3668 3406 m 3668 3394 l 3760 3401 l 3758 3425 l 3667 3417 l
+ 3668 3406 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5487 3640 m 5470 3639 l 5452 3636 l 5435 3628 l 5421 3616 l 5409 3602 l
+ 5401 3588 l 5395 3572 l 5393 3556 l 5394 3538 l 5398 3521 l
+ 5405 3504 l 5417 3490 l 5431 3478 l 5446 3469 l 5462 3464 l
+ 5478 3461 l 5495 3463 l 5512 3467 l 5529 3475 l 5544 3485 l
+ 5555 3500 l 5564 3515 l 5569 3530 l 5571 3547 l 5571 3563 l
+ 5567 3581 l 5559 3598 l 5547 3613 l 5534 3624 l 5519 3633 l
+ 5504 3639 l
+ 5487 3640 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5960 3797 m 5924 3605 l 5921 3599 l 5917 3596 l 5911 3596 l 5906 3600 l
+ 5787 3756 l 5786 3758 l 5785 3759 l 5785 3763 l 5787 3767 l
+ 5789 3770 l 5792 3772 l 5948 3809 l 5952 3809 l 5956 3807 l
+ 5959 3804 l 5960 3801 l 5960 3799 l
+ 5960 3797 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5507 3601 m 5541 3745 l 5530 3750 l 5519 3753 l 5483 3606 l
+ 5507 3601 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5541 3745 m 5607 3929 l 5596 3933 l 5585 3939 l 5585 3937 l 5519 3753 l
+ 5530 3750 l
+ 5541 3745 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5606 3926 m 5666 4023 l 5656 4030 l 5651 4040 l 5650 4040 l 5648 4039 l
+ 5646 4036 l 5585 3939 l 5596 3933 l
+ 5606 3926 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5661 4019 m 5717 4046 l 5713 4057 l 5718 4067 l 5716 4068 l 5714 4068 l
+ 5713 4068 l 5711 4068 l 5707 4067 l 5651 4040 l 5656 4030 l
+
+ 5661 4019 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5706 4047 m 5757 4019 l 5763 4029 l 5773 4035 l 5772 4037 l 5769 4039 l
+ 5718 4067 l 5713 4057 l
+ 5706 4047 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5753 4023 m 5798 3955 l 5808 3962 l 5818 3966 l 5817 3968 l 5773 4035 l
+ 5763 4029 l
+ 5753 4023 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5808 3962 m 5796 3957 l 5833 3869 l 5845 3872 l 5856 3876 l 5818 3966 l
+
+ 5808 3962 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5845 3872 m 5833 3869 l 5864 3771 l 5876 3775 l 5887 3777 l 5856 3876 l
+
+ 5845 3872 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5876 3775 m 5864 3771 l 5869 3749 l 5893 3754 l 5887 3777 l
+ 5876 3775 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6355 3643 m 6340 3651 l 6323 3657 l 6305 3660 l 6286 3658 l 6269 3652 l
+ 6254 3644 l 6241 3634 l 6230 3622 l 6221 3606 l 6215 3589 l
+ 6213 3571 l 6215 3553 l 6221 3536 l 6228 3520 l 6239 3507 l
+ 6251 3497 l 6267 3488 l 6283 3483 l 6302 3480 l 6320 3482 l
+ 6337 3487 l 6352 3495 l 6365 3505 l 6376 3518 l 6384 3533 l
+ 6390 3550 l 6393 3568 l 6391 3587 l 6386 3604 l 6378 3619 l
+ 6368 3632 l
+ 6355 3643 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9467 3814 m 9588 3660 l 9591 3654 l 9590 3648 l 9585 3644 l 9580 3643 l
+ 9384 3656 l 9381 3657 l 9380 3657 l 9377 3660 l 9375 3664 l
+ 9374 3667 l 9376 3671 l 9450 3812 l 9453 3815 l 9456 3818 l
+ 9460 3817 l 9464 3816 l 9465 3816 l
+ 9467 3814 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6350 3599 m 6569 3810 l 6562 3820 l 6555 3829 l 6334 3616 l
+ 6350 3599 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6562 3820 m 6569 3810 l 6887 4039 l 6881 4049 l 6876 4060 l 6555 3829 l
+
+ 6562 3820 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6881 4049 m 6887 4039 l 7198 4194 l 7195 4205 l 7191 4216 l 6876 4060 l
+
+ 6881 4049 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7195 4205 m 7198 4194 l 7500 4285 l 7499 4296 l 7497 4308 l 7191 4216 l
+
+ 7195 4205 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7499 4296 m 7500 4285 l 7792 4320 l 7792 4332 l 7792 4343 l 7497 4308 l
+
+ 7499 4296 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8071 4321 m 8069 4309 l 8332 4261 l 8335 4273 l 8339 4284 l 8073 4332 l
+
+ 8071 4321 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8335 4273 m 8332 4261 l 8576 4185 l 8581 4197 l 8585 4208 l 8339 4284 l
+
+ 8335 4273 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8581 4197 m 8576 4185 l 8800 4091 l 8805 4102 l 8811 4112 l 8585 4208 l
+
+ 8581 4197 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8805 4102 m 8800 4091 l 9002 3987 l 9008 3997 l 9013 4007 l 8811 4112 l
+
+ 8805 4102 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9008 3997 m 9002 3987 l 9178 3882 l 9184 3892 l 9190 3901 l 9013 4007 l
+
+ 9008 3997 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9184 3892 m 9178 3882 l 9327 3785 l 9333 3795 l 9339 3805 l 9190 3901 l
+
+ 9184 3892 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9333 3795 m 9327 3785 l 9441 3709 l 9454 3729 l 9339 3805 l
+ 9333 3795 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3316 2257 m 3312 2273 l 3306 2290 l 3296 2305 l 3282 2318 l 3266 2328 l
+ 3251 2333 l 3234 2337 l 3218 2337 l 3201 2333 l 3184 2327 l
+ 3169 2317 l 3156 2303 l 3147 2288 l 3140 2272 l 3137 2256 l
+ 3137 2240 l 3141 2222 l 3147 2206 l 3158 2190 l 3170 2178 l
+ 3186 2168 l 3202 2162 l 3218 2158 l 3235 2159 l 3252 2162 l
+ 3268 2169 l 3284 2179 l 3297 2192 l 3307 2207 l 3313 2223 l
+ 3316 2240 l
+ 3316 2257 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4201 3295 m 4283 3473 l 4287 3478 l 4292 3480 l 4298 3478 l 4302 3473 l
+ 4379 3293 l 4380 3290 l 4380 3289 l 4379 3286 l 4377 3282 l
+ 4374 3280 l 4370 3279 l 4210 3281 l 4206 3281 l 4203 3284 l
+ 4201 3288 l 4201 3291 l 4201 3293 l
+ 4201 3295 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3279 2231 m 3440 2217 l 3443 2217 l 3441 2229 l 3442 2240 l 3282 2255 l
+
+ 3279 2231 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3443 2217 m 3688 2250 l 3691 2250 l 3686 2262 l 3684 2273 l 3439 2240 l
+ 3441 2229 l
+ 3443 2217 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3691 2250 m 3884 2332 l 3887 2333 l 3880 2343 l 3875 2354 l 3682 2273 l
+ 3686 2262 l
+ 3691 2250 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3887 2333 m 4034 2453 l 4036 2456 l 4027 2463 l 4019 2472 l 3872 2352 l
+ 3880 2343 l
+ 3887 2333 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4036 2456 m 4144 2602 l 4145 2604 l 4134 2609 l 4124 2616 l 4017 2470 l
+ 4027 2463 l
+ 4036 2456 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4134 2609 m 4145 2604 l 4220 2769 l 4208 2772 l 4197 2775 l 4123 2614 l
+
+ 4134 2609 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4208 2772 m 4220 2769 l 4266 2939 l 4255 2940 l 4243 2942 l 4197 2775 l
+
+ 4208 2772 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4255 2940 m 4266 2939 l 4291 3102 l 4280 3103 l 4268 3104 l 4243 2942 l
+
+ 4255 2940 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4280 3103 m 4291 3102 l 4301 3249 l 4290 3249 l 4278 3249 l 4268 3104 l
+
+ 4280 3103 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4290 3249 m 4301 3249 l 4302 3320 l 4279 3320 l 4278 3249 l
+ 4290 3249 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3303 2926 m 3301 2943 l 3296 2960 l 3287 2976 l 3274 2990 l 3260 3001 l
+ 3245 3008 l 3229 3013 l 3212 3014 l 3195 3012 l 3178 3007 l
+ 3162 2998 l 3148 2985 l 3137 2970 l 3129 2955 l 3125 2939 l
+ 3124 2923 l 3127 2905 l 3132 2889 l 3141 2872 l 3153 2859 l
+ 3167 2848 l 3183 2841 l 3199 2836 l 3215 2835 l 3232 2837 l
+ 3249 2842 l 3266 2851 l 3280 2864 l 3290 2878 l 3298 2894 l
+ 3302 2909 l
+ 3303 2926 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5117 3054 m 5273 3172 l 5279 3175 l 5285 3174 l 5289 3169 l 5290 3163 l
+ 5273 2968 l 5273 2965 l 5272 2965 l 5270 2962 l 5266 2959 l
+ 5262 2959 l 5259 2960 l 5119 3037 l 5116 3040 l 5114 3043 l
+ 5114 3048 l 5115 3051 l 5116 3052 l
+ 5117 3054 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3265 2904 m 3485 2867 l 3487 2879 l 3488 2890 l 3269 2927 l
+ 3265 2904 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3487 2879 m 3485 2867 l 3804 2826 l 3805 2837 l 3806 2849 l 3488 2890 l
+
+ 3487 2879 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3805 2837 m 3804 2826 l 4084 2803 l 4084 2814 l 4084 2826 l 3806 2849 l
+
+ 3805 2837 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4084 2814 m 4084 2803 l 4326 2794 l 4326 2806 l 4326 2818 l 4084 2826 l
+
+ 4084 2814 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4326 2806 m 4326 2794 l 4534 2801 l 4533 2812 l 4532 2824 l 4326 2818 l
+
+ 4326 2806 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4533 2812 m 4534 2801 l 4710 2818 l 4708 2829 l 4706 2841 l 4532 2824 l
+
+ 4533 2812 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4708 2829 m 4710 2818 l 4857 2845 l 4854 2856 l 4850 2868 l 4706 2841 l
+
+ 4708 2829 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4854 2856 m 4857 2845 l 4977 2879 l 4973 2890 l 4969 2901 l 4850 2868 l
+
+ 4854 2856 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4973 2890 m 4977 2879 l 5074 2919 l 5068 2930 l 5062 2939 l 4969 2901 l
+
+ 4973 2890 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5068 2930 m 5074 2919 l 5149 2962 l 5142 2972 l 5135 2981 l 5062 2939 l
+
+ 5068 2930 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5142 2972 m 5149 2962 l 5206 3007 l 5198 3015 l 5189 3023 l 5135 2981 l
+
+ 5142 2972 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5198 3015 m 5206 3007 l 5234 3037 l 5216 3053 l 5189 3023 l
+ 5198 3015 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4807 3549 m 4812 3565 l 4814 3583 l 4811 3602 l 4805 3619 l 4795 3635 l
+ 4783 3647 l 4770 3657 l 4755 3664 l 4738 3669 l 4720 3670 l
+ 4702 3667 l 4685 3661 l 4670 3651 l 4657 3640 l 4647 3626 l
+ 4640 3612 l 4636 3595 l 4635 3577 l 4637 3559 l 4643 3542 l
+ 4652 3526 l 4665 3514 l 4677 3503 l 4693 3497 l 4709 3492 l
+ 4727 3491 l 4746 3493 l 4763 3500 l 4778 3509 l 4790 3521 l
+ 4801 3534 l
+ 4807 3549 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6509 3477 m 6700 3517 l 6707 3517 l 6712 3514 l 6714 3508 l 6712 3502 l
+ 6613 3333 l 6612 3331 l 6611 3330 l 6607 3329 l 6603 3328 l
+ 6599 3329 l 6596 3332 l 6503 3461 l 6501 3465 l 6501 3469 l
+ 6503 3473 l 6506 3476 l 6507 3477 l
+ 6509 3477 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4764 3542 m 4949 3431 l 4955 3442 l 4960 3452 l 4776 3562 l
+ 4764 3542 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4955 3442 m 4949 3431 l 5214 3289 l 5219 3300 l 5224 3310 l 4960 3452 l
+
+ 4955 3442 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5219 3300 m 5214 3289 l 5441 3187 l 5445 3199 l 5448 3210 l 5224 3310 l
+
+ 5219 3300 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5445 3199 m 5441 3187 l 5638 3124 l 5640 3136 l 5642 3147 l 5448 3210 l
+
+ 5445 3199 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5638 3124 m 5809 3096 l 5812 3096 l 5812 3108 l 5814 3119 l 5642 3147 l
+ 5640 3136 l
+ 5638 3124 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5812 3096 m 5966 3101 l 5968 3101 l 5966 3112 l 5965 3124 l 5811 3119 l
+ 5812 3108 l
+ 5812 3096 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5966 3112 m 5968 3101 l 6113 3135 l 6109 3146 l 6104 3157 l 5963 3124 l
+
+ 5966 3112 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6109 3146 m 6113 3135 l 6254 3195 l 6249 3205 l 6243 3215 l 6104 3157 l
+
+ 6109 3146 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6249 3205 m 6254 3195 l 6398 3279 l 6391 3289 l 6384 3298 l 6243 3215 l
+
+ 6249 3205 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6391 3289 m 6398 3279 l 6550 3383 l 6544 3392 l 6536 3402 l 6384 3298 l
+
+ 6391 3289 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6544 3392 m 6550 3383 l 6589 3411 l 6575 3430 l 6536 3402 l
+ 6544 3392 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7095 3485 m 7110 3491 l 7126 3501 l 7139 3513 l 7149 3529 l 7155 3546 l
+ 7158 3563 l 7158 3580 l 7154 3596 l 7148 3612 l 7138 3627 l
+ 7125 3640 l 7109 3650 l 7092 3656 l 7076 3659 l 7059 3659 l
+ 7043 3656 l 7027 3649 l 7012 3639 l 6999 3626 l 6989 3611 l
+ 6983 3594 l 6980 3577 l 6980 3561 l 6983 3544 l 6990 3528 l
+ 7000 3513 l 7013 3500 l 7029 3490 l 7045 3484 l 7062 3481 l
+ 7078 3481 l
+ 7095 3485 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7427 3376 m 7541 3535 l 7546 3539 l 7552 3541 l 7557 3537 l 7560 3532 l
+ 7601 3340 l 7602 3338 l 7602 3337 l 7600 3333 l 7597 3330 l
+ 7594 3328 l 7590 3328 l 7433 3360 l 7430 3362 l 7426 3365 l
+ 7426 3369 l 7426 3373 l 7426 3374 l
+ 7427 3376 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7063 3515 m 7083 3336 l 7094 3338 l 7106 3340 l 7086 3518 l
+ 7063 3515 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7094 3338 m 7083 3336 l 7124 3104 l 7135 3108 l 7146 3111 l 7106 3340 l
+
+ 7094 3338 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7124 3104 m 7168 2954 l 7169 2952 l 7179 2958 l 7190 2961 l 7146 3111 l
+ 7135 3108 l
+ 7124 3104 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7169 2952 m 7215 2871 l 7216 2870 l 7217 2868 l 7220 2866 l 7225 2877 l
+ 7235 2883 l 7189 2964 l 7179 2958 l
+ 7169 2952 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7220 2866 m 7268 2844 l 7269 2843 l 7271 2843 l 7273 2843 l 7275 2843 l
+ 7278 2844 l 7273 2854 l 7278 2865 l 7230 2888 l 7225 2877 l
+
+ 7220 2866 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7278 2844 m 7326 2870 l 7328 2871 l 7330 2873 l 7321 2880 l 7315 2890 l
+ 7267 2864 l 7273 2854 l
+ 7278 2844 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7330 2873 m 7377 2937 l 7378 2939 l 7367 2944 l 7358 2950 l 7311 2887 l
+ 7321 2880 l
+ 7330 2873 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7367 2944 m 7378 2939 l 7422 3029 l 7411 3033 l 7400 3037 l 7357 2948 l
+
+ 7367 2944 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7411 3033 m 7422 3029 l 7462 3136 l 7451 3140 l 7440 3143 l 7400 3037 l
+
+ 7411 3033 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7451 3140 m 7462 3136 l 7498 3248 l 7486 3251 l 7475 3254 l 7440 3143 l
+
+ 7451 3140 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7486 3251 m 7498 3248 l 7527 3355 l 7515 3358 l 7503 3360 l 7475 3254 l
+
+ 7486 3251 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7515 3358 m 7527 3355 l 7533 3381 l 7510 3386 l 7503 3360 l
+ 7515 3358 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7974 3475 m 7990 3481 l 8005 3491 l 8018 3504 l 8027 3520 l 8034 3537 l
+ 8036 3553 l 8037 3570 l 8033 3586 l 8026 3603 l 8017 3618 l
+ 8004 3630 l 7988 3640 l 7971 3646 l 7954 3649 l 7937 3649 l
+ 7921 3646 l 7905 3639 l 7891 3629 l 7877 3616 l 7868 3601 l
+ 7861 3584 l 7859 3566 l 7858 3550 l 7863 3534 l 7869 3518 l
+ 7879 3503 l 7892 3490 l 7907 3480 l 7924 3474 l 7941 3471 l
+ 7957 3471 l
+ 7974 3475 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8364 3365 m 8476 3525 l 8481 3529 l 8487 3530 l 8492 3527 l 8495 3522 l
+ 8539 3331 l 8539 3328 l 8539 3327 l 8537 3323 l 8534 3320 l
+ 8531 3318 l 8527 3318 l 8370 3349 l 8367 3350 l 8363 3353 l
+ 8362 3357 l 8362 3361 l 8363 3363 l
+ 8364 3365 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7942 3505 m 7962 3327 l 7974 3329 l 7985 3331 l 7966 3508 l
+ 7942 3505 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7974 3329 m 7962 3327 l 8002 3085 l 8014 3089 l 8026 3092 l 7985 3331 l
+
+ 7974 3329 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8014 3089 m 8002 3085 l 8046 2914 l 8057 2919 l 8068 2923 l 8026 3092 l
+
+ 8014 3089 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8046 2914 m 8091 2808 l 8093 2804 l 8102 2812 l 8113 2817 l 8068 2923 l
+ 8057 2919 l
+ 8046 2914 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8093 2804 m 8139 2753 l 8141 2751 l 8142 2751 l 8144 2750 l 8147 2749 l
+ 8148 2761 l 8157 2769 l 8111 2820 l 8102 2812 l
+ 8093 2804 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8147 2749 m 8194 2744 l 8196 2744 l 8197 2744 l 8199 2745 l 8202 2747 l
+ 8195 2756 l 8196 2768 l 8149 2772 l 8148 2761 l
+ 8147 2749 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8202 2747 m 8248 2781 l 8250 2784 l 8241 2791 l 8233 2800 l 8188 2765 l
+ 8195 2756 l
+ 8202 2747 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8241 2791 m 8250 2784 l 8296 2851 l 8285 2856 l 8274 2861 l 8231 2797 l
+
+ 8241 2791 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8285 2856 m 8296 2851 l 8339 2940 l 8328 2944 l 8317 2948 l 8274 2861 l
+
+ 8285 2856 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8328 2944 m 8339 2940 l 8377 3044 l 8367 3048 l 8355 3051 l 8317 2948 l
+
+ 8328 2944 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8367 3048 m 8377 3044 l 8413 3154 l 8402 3158 l 8390 3161 l 8355 3051 l
+
+ 8367 3048 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8402 3158 m 8413 3154 l 8444 3263 l 8432 3266 l 8420 3269 l 8390 3161 l
+
+ 8402 3158 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8432 3266 m 8444 3263 l 8468 3363 l 8456 3366 l 8445 3368 l 8420 3269 l
+
+ 8432 3266 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8456 3366 m 8468 3363 l 8469 3370 l 8446 3375 l 8445 3368 l
+ 8456 3366 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3290 2625 m 3289 2642 l 3283 2659 l 3273 2675 l 3261 2689 l 3246 2700 l
+ 3230 2707 l 3214 2711 l 3198 2711 l 3181 2709 l 3163 2704 l
+ 3148 2694 l 3135 2682 l 3124 2667 l 3117 2652 l 3112 2635 l
+ 3111 2619 l 3114 2602 l 3120 2585 l 3129 2569 l 3141 2555 l
+ 3156 2545 l 3172 2538 l 3188 2534 l 3205 2533 l 3222 2535 l
+ 3239 2541 l 3255 2550 l 3268 2563 l 3279 2577 l 3286 2593 l
+ 3290 2608 l
+ 3290 2625 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8762 3211 m 8874 3371 l 8879 3375 l 8884 3377 l 8890 3374 l 8892 3368 l
+ 8937 3177 l 8937 3175 l 8937 3173 l 8935 3170 l 8933 3167 l
+ 8929 3165 l 8925 3165 l 8768 3195 l 8765 3196 l 8762 3200 l
+ 8761 3204 l 8761 3207 l 8761 3209 l
+ 8762 3211 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3253 2603 m 3513 2564 l 3515 2575 l 3517 2587 l 3256 2626 l
+ 3253 2603 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3515 2575 m 3513 2564 l 3901 2502 l 3903 2514 l 3905 2525 l 3517 2587 l
+
+ 3515 2575 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 3903 2514 m 3901 2502 l 4275 2442 l 4277 2453 l 4279 2465 l 3905 2525 l
+
+ 3903 2514 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4277 2453 m 4275 2442 l 4634 2382 l 4636 2393 l 4638 2405 l 4279 2465 l
+
+ 4277 2453 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4636 2393 m 4634 2382 l 4979 2325 l 4981 2336 l 4983 2348 l 4638 2405 l
+
+ 4636 2393 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4981 2336 m 4979 2325 l 5310 2271 l 5311 2282 l 5313 2294 l 4983 2348 l
+
+ 4981 2336 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5311 2282 m 5310 2271 l 5626 2221 l 5628 2232 l 5629 2244 l 5313 2294 l
+
+ 5311 2282 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5628 2232 m 5626 2221 l 5927 2176 l 5929 2188 l 5930 2199 l 5629 2244 l
+
+ 5628 2232 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5929 2188 m 5927 2176 l 6214 2137 l 6216 2149 l 6217 2160 l 5930 2199 l
+
+ 5929 2188 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6216 2149 m 6214 2137 l 6487 2106 l 6488 2118 l 6489 2129 l 6217 2160 l
+
+ 6216 2149 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6488 2118 m 6487 2106 l 6746 2082 l 6747 2094 l 6747 2105 l 6489 2129 l
+
+ 6488 2118 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6747 2094 m 6746 2082 l 6990 2068 l 6990 2080 l 6990 2091 l 6747 2105 l
+
+ 6747 2094 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6990 2080 m 6990 2068 l 7220 2064 l 7220 2076 l 7219 2087 l 6990 2091 l
+
+ 6990 2080 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7220 2076 m 7220 2064 l 7435 2070 l 7434 2082 l 7433 2094 l 7219 2087 l
+
+ 7220 2076 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7434 2082 m 7435 2070 l 7636 2089 l 7634 2101 l 7632 2112 l 7433 2094 l
+
+ 7434 2082 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7634 2101 m 7636 2089 l 7823 2121 l 7820 2133 l 7817 2144 l 7632 2112 l
+
+ 7634 2101 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7820 2133 m 7823 2121 l 7996 2167 l 7992 2178 l 7988 2189 l 7817 2144 l
+
+ 7820 2133 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7992 2178 m 7996 2167 l 8154 2228 l 8149 2239 l 8143 2249 l 7988 2189 l
+
+ 7992 2178 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8149 2239 m 8154 2228 l 8298 2305 l 8291 2315 l 8284 2325 l 8143 2249 l
+
+ 8149 2239 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8291 2315 m 8298 2305 l 8428 2400 l 8420 2408 l 8411 2416 l 8284 2325 l
+
+ 8291 2315 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8420 2408 m 8428 2400 l 8542 2512 l 8533 2520 l 8523 2527 l 8411 2416 l
+
+ 8420 2408 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8533 2520 m 8542 2512 l 8642 2643 l 8632 2649 l 8622 2655 l 8523 2527 l
+
+ 8533 2520 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8632 2649 m 8642 2643 l 8728 2794 l 8717 2799 l 8706 2803 l 8622 2655 l
+
+ 8632 2649 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8717 2799 m 8728 2794 l 8799 2966 l 8788 2970 l 8776 2973 l 8706 2803 l
+
+ 8717 2799 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8788 2970 m 8799 2966 l 8855 3159 l 8843 3161 l 8831 3163 l 8776 2973 l
+
+ 8788 2970 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8843 3161 m 8855 3159 l 8866 3217 l 8843 3221 l 8831 3163 l
+ 8843 3161 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8879 3759 m 8698 3759 l 8694 3759 l 8691 3758 l 8687 3757 l 8684 3755 l
+ 8681 3752 l 8679 3750 l 8677 3746 l 8676 3743 l 8675 3736 l
+ 8698 3736 l 8698 3712 l 8879 3712 l 8879 3736 l
+ 8879 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8675 3736 m 8675 3403 l 8675 3399 l 8676 3395 l 8677 3392 l 8679 3389 l
+ 8681 3386 l 8684 3383 l 8687 3382 l 8691 3380 l 8698 3379 l
+ 8698 3403 l 8722 3403 l 8722 3736 l 8698 3736 l
+ 8675 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8698 3379 m 9061 3379 l 9064 3379 l 9068 3380 l 9071 3382 l 9074 3383 l
+ 9077 3386 l 9079 3389 l 9081 3392 l 9083 3395 l 9084 3403 l
+ 9061 3403 l 9061 3426 l 8698 3426 l 8698 3403 l
+ 8698 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9084 3403 m 9084 3736 l 9084 3739 l 9083 3743 l 9081 3746 l 9079 3750 l
+ 9077 3752 l 9074 3755 l 9071 3757 l 9068 3758 l 9061 3759 l
+ 9061 3736 l 9037 3736 l 9037 3403 l 9061 3403 l
+ 9084 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9061 3736 m 9061 3759 l 8879 3759 l 8879 3736 l 8879 3712 l 9061 3712 l
+
+ 9061 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7982 3759 m 7801 3759 l 7797 3759 l 7793 3758 l 7790 3757 l 7786 3755 l
+ 7784 3752 l 7781 3750 l 7779 3746 l 7778 3743 l 7777 3736 l
+ 7801 3736 l 7801 3712 l 7982 3712 l 7982 3736 l
+ 7982 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7777 3736 m 7777 3403 l 7777 3399 l 7778 3395 l 7779 3392 l 7781 3389 l
+ 7784 3386 l 7786 3383 l 7790 3382 l 7793 3380 l 7801 3379 l
+ 7801 3403 l 7824 3403 l 7824 3736 l 7801 3736 l
+ 7777 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7801 3379 m 8163 3379 l 8166 3379 l 8170 3380 l 8173 3382 l 8177 3383 l
+ 8180 3386 l 8182 3389 l 8184 3392 l 8185 3395 l 8187 3403 l
+ 8163 3403 l 8163 3426 l 7801 3426 l 7801 3403 l
+ 7801 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8187 3403 m 8187 3736 l 8186 3739 l 8185 3743 l 8184 3746 l 8182 3750 l
+ 8180 3752 l 8177 3755 l 8173 3757 l 8170 3758 l 8163 3759 l
+ 8163 3736 l 8139 3736 l 8139 3403 l 8163 3403 l
+ 8187 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 8163 3736 m 8163 3759 l 7982 3759 l 7982 3736 l 7982 3712 l 8163 3712 l
+
+ 8163 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7097 3759 m 6916 3759 l 6913 3759 l 6909 3758 l 6905 3757 l 6902 3755 l
+ 6899 3752 l 6897 3750 l 6895 3746 l 6894 3743 l 6893 3736 l
+ 6916 3736 l 6916 3712 l 7097 3712 l 7097 3736 l
+ 7097 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6893 3736 m 6893 3403 l 6893 3399 l 6894 3395 l 6895 3392 l 6897 3389 l
+ 6899 3386 l 6902 3383 l 6905 3382 l 6909 3380 l 6916 3379 l
+ 6916 3403 l 6940 3403 l 6940 3736 l 6916 3736 l
+ 6893 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6916 3379 m 7279 3379 l 7282 3379 l 7286 3380 l 7289 3382 l 7292 3383 l
+ 7295 3386 l 7298 3389 l 7299 3392 l 7301 3395 l 7302 3403 l
+ 7279 3403 l 7279 3426 l 6916 3426 l 6916 3403 l
+ 6916 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7302 3403 m 7302 3736 l 7302 3739 l 7301 3743 l 7299 3746 l 7298 3750 l
+ 7295 3752 l 7292 3755 l 7289 3757 l 7286 3758 l 7279 3759 l
+ 7279 3736 l 7255 3736 l 7255 3403 l 7279 3403 l
+ 7302 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7279 3736 m 7279 3759 l 7097 3759 l 7097 3736 l 7097 3712 l 7279 3712 l
+
+ 7279 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6289 3738 m 6120 3738 l 6116 3738 l 6112 3737 l 6109 3735 l 6106 3733 l
+ 6103 3731 l 6100 3728 l 6099 3725 l 6097 3722 l 6096 3715 l
+ 6120 3715 l 6120 3691 l 6289 3691 l 6289 3715 l
+ 6289 3738 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6096 3715 m 6096 3403 l 6096 3399 l 6097 3395 l 6099 3392 l 6100 3389 l
+ 6103 3386 l 6106 3383 l 6109 3382 l 6112 3380 l 6120 3379 l
+ 6120 3403 l 6143 3403 l 6143 3715 l 6120 3715 l
+ 6096 3715 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6120 3379 m 6459 3379 l 6463 3379 l 6467 3380 l 6470 3382 l 6473 3383 l
+ 6476 3386 l 6478 3389 l 6480 3392 l 6482 3395 l 6483 3403 l
+ 6459 3403 l 6459 3426 l 6120 3426 l 6120 3403 l
+ 6120 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6483 3403 m 6483 3715 l 6483 3718 l 6482 3722 l 6480 3725 l 6478 3728 l
+ 6476 3731 l 6473 3733 l 6470 3735 l 6467 3737 l 6459 3738 l
+ 6459 3715 l 6436 3715 l 6436 3403 l 6459 3403 l
+ 6483 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 6459 3715 m 6459 3738 l 6289 3738 l 6289 3715 l 6289 3691 l 6459 3691 l
+
+ 6459 3715 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5489 3759 m 5308 3759 l 5304 3759 l 5301 3758 l 5297 3757 l 5294 3755 l
+ 5291 3752 l 5289 3750 l 5287 3746 l 5285 3743 l 5285 3736 l
+ 5308 3736 l 5308 3712 l 5489 3712 l 5489 3736 l
+ 5489 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5285 3736 m 5285 3403 l 5285 3399 l 5285 3395 l 5287 3392 l 5289 3389 l
+ 5291 3386 l 5294 3383 l 5297 3382 l 5301 3380 l 5308 3379 l
+ 5308 3403 l 5332 3403 l 5332 3736 l 5308 3736 l
+ 5285 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5308 3379 m 5671 3379 l 5674 3379 l 5678 3380 l 5681 3382 l 5684 3383 l
+ 5687 3386 l 5689 3389 l 5691 3392 l 5693 3395 l 5694 3403 l
+ 5671 3403 l 5671 3426 l 5308 3426 l 5308 3403 l
+ 5308 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5694 3403 m 5694 3736 l 5694 3739 l 5693 3743 l 5691 3746 l 5689 3750 l
+ 5687 3752 l 5684 3755 l 5681 3757 l 5678 3758 l 5671 3759 l
+ 5671 3736 l 5647 3736 l 5647 3403 l 5671 3403 l
+ 5694 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 5671 3736 m 5671 3759 l 5489 3759 l 5489 3736 l 5489 3712 l 5671 3712 l
+
+ 5671 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4690 3759 m 4509 3759 l 4505 3759 l 4501 3758 l 4498 3757 l 4495 3755 l
+ 4492 3752 l 4489 3750 l 4488 3746 l 4486 3743 l 4485 3736 l
+ 4509 3736 l 4509 3712 l 4690 3712 l 4690 3736 l
+ 4690 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4485 3736 m 4485 3403 l 4485 3399 l 4486 3395 l 4488 3392 l 4489 3389 l
+ 4492 3386 l 4495 3383 l 4498 3382 l 4501 3380 l 4509 3379 l
+ 4509 3403 l 4532 3403 l 4532 3736 l 4509 3736 l
+ 4485 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4509 3379 m 4871 3379 l 4874 3379 l 4878 3380 l 4882 3382 l 4885 3383 l
+ 4888 3386 l 4890 3389 l 4892 3392 l 4893 3395 l 4895 3403 l
+ 4871 3403 l 4871 3426 l 4509 3426 l 4509 3403 l
+ 4509 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4895 3403 m 4895 3736 l 4894 3739 l 4893 3743 l 4892 3746 l 4890 3750 l
+ 4888 3752 l 4885 3755 l 4882 3757 l 4878 3758 l 4871 3759 l
+ 4871 3736 l 4848 3736 l 4848 3403 l 4871 3403 l
+ 4895 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 4871 3736 m 4871 3759 l 4690 3759 l 4690 3736 l 4690 3712 l 4871 3712 l
+
+ 4871 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9806 3759 m 9625 3759 l 9621 3759 l 9618 3758 l 9614 3757 l 9611 3755 l
+ 9608 3752 l 9606 3750 l 9604 3746 l 9602 3743 l 9601 3736 l
+ 9625 3736 l 9625 3712 l 9806 3712 l 9806 3736 l
+ 9806 3759 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9601 3736 m 9601 3403 l 9601 3399 l 9602 3395 l 9604 3392 l 9606 3389 l
+ 9608 3386 l 9611 3383 l 9614 3382 l 9618 3380 l 9625 3379 l
+ 9625 3403 l 9649 3403 l 9649 3736 l 9625 3736 l
+ 9601 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9625 3379 m 9987 3379 l 9991 3379 l 9995 3380 l 9998 3382 l 10001 3383 l
+ 10004 3386 l 10006 3389 l 10008 3392 l 10010 3395 l 10011 3403 l
+ 9987 3403 l 9987 3426 l 9625 3426 l 9625 3403 l
+ 9625 3379 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 10011 3403 m 10011 3736 l 10011 3739 l 10010 3743 l 10008 3746 l 10006 3750 l
+ 10004 3752 l 10001 3755 l 9998 3757 l 9995 3758 l 9987 3759 l
+ 9987 3736 l 9964 3736 l 9964 3403 l 9987 3403 l
+ 10011 3403 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 9987 3736 m 9987 3759 l 9806 3759 l 9806 3736 l 9806 3712 l 9987 3712 l
+
+ 9987 3736 l  cp gs 0.00 setgray ef gr 
+%  polyline 
+% Polyline
+n 7792 4332 m 7792 4320 l 8069 4309 l 8071 4321 l 8073 4332 l 7792 4343 l
+
+ 7792 4332 l  cp gs 0.00 setgray ef gr 
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.fig b/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.fig
new file mode 100644 (file)
index 0000000..8578d31
--- /dev/null
@@ -0,0 +1,796 @@
+#FIG 3.2
+Portrait
+Flush left
+Inches
+Letter  
+100.00
+Single
+0
+1200 2
+0 32 #b84700
+0 33 #99284c
+0 34 #dc2300
+0 35 #e0e0e0
+6 3075 2025 10200 4350
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7051 3863 3997 3863 3993 3863 3990 3862 3986 3860 3983 3859
+        3980 3856 3978 3853 3976 3850 3975 3847 3974 3840 3997 3840
+        3997 3816 7051 3816 7051 3840 7051 3863
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        3974 3840 3974 3049 3974 3045 3975 3041 3976 3038 3978 3035
+        3980 3032 3983 3030 3986 3028 3990 3026 3997 3025 3997 3049
+        4021 3049 4021 3840 3997 3840 3974 3840
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        3997 3025 10106 3025 10109 3025 10113 3026 10116 3028 10119 3030
+        10122 3032 10124 3035 10126 3038 10128 3041 10129 3049 10106 3049
+        10106 3073 3997 3073 3997 3049 3997 3025
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        10129 3049 10129 3840 10129 3843 10128 3847 10126 3850 10124 3853
+        10122 3856 10119 3859 10116 3860 10113 3862 10106 3863 10106 3840
+        10082 3840 10082 3049 10106 3049 10129 3049
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        10106 3840 10106 3863 7051 3863 7051 3840 7051 3816 10106 3816
+        10106 3840
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        5769 3036 5769 3827 5741 3827 5741 3036 5769 3036
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        7380 3049 7380 3840 7351 3840 7351 3049 7380 3049
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        4948 3039 4948 3830 4919 3830 4919 3039 4948 3039
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        6558 3052 6558 3843 6529 3843 6529 3052 6558 3052
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        8246 3039 8246 3830 8218 3830 8218 3039 8246 3039
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 5
+        9164 3042 9164 3833 9136 3833 9136 3042 9164 3042
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        3308 3352 3298 3366 3285 3379 3270 3389 3252 3395 3234 3397
+        3217 3396 3201 3392 3186 3385 3172 3375 3159 3363 3150 3347
+        3144 3329 3141 3312 3142 3294 3146 3278 3153 3263 3163 3249
+        3176 3237 3191 3227 3208 3221 3226 3219 3244 3220 3260 3223
+        3275 3230 3289 3240 3301 3253 3311 3269 3317 3286 3320 3304
+        3319 3321 3316 3337 3308 3352
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        3729 3500 3911 3428 3916 3424 3919 3419 3917 3413 3913 3409
+        3737 3322 3735 3321 3733 3321 3729 3322 3726 3323 3723 3326
+        3722 3330 3716 3490 3716 3494 3718 3497 3722 3499 3726 3500
+        3727 3500 3729 3500
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3285 3314 3331 3330 3328 3342 3325 3353 3277 3337 3285 3314
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3328 3342 3331 3330 3508 3371 3506 3383 3504 3394 3325 3353
+        3328 3342
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3506 3383 3508 3371 3668 3394 3668 3406 3667 3417 3504 3394
+        3506 3383
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3668 3406 3668 3394 3760 3401 3758 3425 3667 3417 3668 3406
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        5487 3640 5470 3639 5452 3636 5435 3628 5421 3616 5409 3602
+        5401 3588 5395 3572 5393 3556 5394 3538 5398 3521 5405 3504
+        5417 3490 5431 3478 5446 3469 5462 3464 5478 3461 5495 3463
+        5512 3467 5529 3475 5544 3485 5555 3500 5564 3515 5569 3530
+        5571 3547 5571 3563 5567 3581 5559 3598 5547 3613 5534 3624
+        5519 3633 5504 3639 5487 3640
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        5960 3797 5924 3605 5921 3599 5917 3596 5911 3596 5906 3600
+        5787 3756 5786 3758 5785 3759 5785 3763 5787 3767 5789 3770
+        5792 3772 5948 3809 5952 3809 5956 3807 5959 3804 5960 3801
+        5960 3799 5960 3797
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        5507 3601 5541 3745 5530 3750 5519 3753 5483 3606 5507 3601
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        5541 3745 5607 3929 5596 3933 5585 3939 5585 3937 5519 3753
+        5530 3750 5541 3745
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 10
+        5606 3926 5666 4023 5656 4030 5651 4040 5650 4040 5648 4039
+        5646 4036 5585 3939 5596 3933 5606 3926
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 12
+        5661 4019 5717 4046 5713 4057 5718 4067 5716 4068 5714 4068
+        5713 4068 5711 4068 5707 4067 5651 4040 5656 4030 5661 4019
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 9
+        5706 4047 5757 4019 5763 4029 5773 4035 5772 4037 5769 4039
+        5718 4067 5713 4057 5706 4047
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        5753 4023 5798 3955 5808 3962 5818 3966 5817 3968 5773 4035
+        5763 4029 5753 4023
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5808 3962 5796 3957 5833 3869 5845 3872 5856 3876 5818 3966
+        5808 3962
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5845 3872 5833 3869 5864 3771 5876 3775 5887 3777 5856 3876
+        5845 3872
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        5876 3775 5864 3771 5869 3749 5893 3754 5887 3777 5876 3775
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        6355 3643 6340 3651 6323 3657 6305 3660 6286 3658 6269 3652
+        6254 3644 6241 3634 6230 3622 6221 3606 6215 3589 6213 3571
+        6215 3553 6221 3536 6228 3520 6239 3507 6251 3497 6267 3488
+        6283 3483 6302 3480 6320 3482 6337 3487 6352 3495 6365 3505
+        6376 3518 6384 3533 6390 3550 6393 3568 6391 3587 6386 3604
+        6378 3619 6368 3632 6355 3643
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        9467 3814 9588 3660 9591 3654 9590 3648 9585 3644 9580 3643
+        9384 3656 9381 3657 9380 3657 9377 3660 9375 3664 9374 3667
+        9376 3671 9450 3812 9453 3815 9456 3818 9460 3817 9464 3816
+        9465 3816 9467 3814
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        6350 3599 6569 3810 6562 3820 6555 3829 6334 3616 6350 3599
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6562 3820 6569 3810 6887 4039 6881 4049 6876 4060 6555 3829
+        6562 3820
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6881 4049 6887 4039 7198 4194 7195 4205 7191 4216 6876 4060
+        6881 4049
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7195 4205 7198 4194 7500 4285 7499 4296 7497 4308 7191 4216
+        7195 4205
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7499 4296 7500 4285 7792 4320 7792 4332 7792 4343 7497 4308
+        7499 4296
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8071 4321 8069 4309 8332 4261 8335 4273 8339 4284 8073 4332
+        8071 4321
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8335 4273 8332 4261 8576 4185 8581 4197 8585 4208 8339 4284
+        8335 4273
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8581 4197 8576 4185 8800 4091 8805 4102 8811 4112 8585 4208
+        8581 4197
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8805 4102 8800 4091 9002 3987 9008 3997 9013 4007 8811 4112
+        8805 4102
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        9008 3997 9002 3987 9178 3882 9184 3892 9190 3901 9013 4007
+        9008 3997
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        9184 3892 9178 3882 9327 3785 9333 3795 9339 3805 9190 3901
+        9184 3892
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        9333 3795 9327 3785 9441 3709 9454 3729 9339 3805 9333 3795
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        3316 2257 3312 2273 3306 2290 3296 2305 3282 2318 3266 2328
+        3251 2333 3234 2337 3218 2337 3201 2333 3184 2327 3169 2317
+        3156 2303 3147 2288 3140 2272 3137 2256 3137 2240 3141 2222
+        3147 2206 3158 2190 3170 2178 3186 2168 3202 2162 3218 2158
+        3235 2159 3252 2162 3268 2169 3284 2179 3297 2192 3307 2207
+        3313 2223 3316 2240 3316 2257
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        4201 3295 4283 3473 4287 3478 4292 3480 4298 3478 4302 3473
+        4379 3293 4380 3290 4380 3289 4379 3286 4377 3282 4374 3280
+        4370 3279 4210 3281 4206 3281 4203 3284 4201 3288 4201 3291
+        4201 3293 4201 3295
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3279 2231 3440 2217 3443 2217 3441 2229 3442 2240 3282 2255
+        3279 2231
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        3443 2217 3688 2250 3691 2250 3686 2262 3684 2273 3439 2240
+        3441 2229 3443 2217
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        3691 2250 3884 2332 3887 2333 3880 2343 3875 2354 3682 2273
+        3686 2262 3691 2250
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        3887 2333 4034 2453 4036 2456 4027 2463 4019 2472 3872 2352
+        3880 2343 3887 2333
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        4036 2456 4144 2602 4145 2604 4134 2609 4124 2616 4017 2470
+        4027 2463 4036 2456
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4134 2609 4145 2604 4220 2769 4208 2772 4197 2775 4123 2614
+        4134 2609
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4208 2772 4220 2769 4266 2939 4255 2940 4243 2942 4197 2775
+        4208 2772
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4255 2940 4266 2939 4291 3102 4280 3103 4268 3104 4243 2942
+        4255 2940
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4280 3103 4291 3102 4301 3249 4290 3249 4278 3249 4268 3104
+        4280 3103
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        4290 3249 4301 3249 4302 3320 4279 3320 4278 3249 4290 3249
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        3303 2926 3301 2943 3296 2960 3287 2976 3274 2990 3260 3001
+        3245 3008 3229 3013 3212 3014 3195 3012 3178 3007 3162 2998
+        3148 2985 3137 2970 3129 2955 3125 2939 3124 2923 3127 2905
+        3132 2889 3141 2872 3153 2859 3167 2848 3183 2841 3199 2836
+        3215 2835 3232 2837 3249 2842 3266 2851 3280 2864 3290 2878
+        3298 2894 3302 2909 3303 2926
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        5117 3054 5273 3172 5279 3175 5285 3174 5289 3169 5290 3163
+        5273 2968 5273 2965 5272 2965 5270 2962 5266 2959 5262 2959
+        5259 2960 5119 3037 5116 3040 5114 3043 5114 3048 5115 3051
+        5116 3052 5117 3054
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3265 2904 3485 2867 3487 2879 3488 2890 3269 2927 3265 2904
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3487 2879 3485 2867 3804 2826 3805 2837 3806 2849 3488 2890
+        3487 2879
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3805 2837 3804 2826 4084 2803 4084 2814 4084 2826 3806 2849
+        3805 2837
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4084 2814 4084 2803 4326 2794 4326 2806 4326 2818 4084 2826
+        4084 2814
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4326 2806 4326 2794 4534 2801 4533 2812 4532 2824 4326 2818
+        4326 2806
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4533 2812 4534 2801 4710 2818 4708 2829 4706 2841 4532 2824
+        4533 2812
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4708 2829 4710 2818 4857 2845 4854 2856 4850 2868 4706 2841
+        4708 2829
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4854 2856 4857 2845 4977 2879 4973 2890 4969 2901 4850 2868
+        4854 2856
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4973 2890 4977 2879 5074 2919 5068 2930 5062 2939 4969 2901
+        4973 2890
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5068 2930 5074 2919 5149 2962 5142 2972 5135 2981 5062 2939
+        5068 2930
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5142 2972 5149 2962 5206 3007 5198 3015 5189 3023 5135 2981
+        5142 2972
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        5198 3015 5206 3007 5234 3037 5216 3053 5189 3023 5198 3015
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        4807 3549 4812 3565 4814 3583 4811 3602 4805 3619 4795 3635
+        4783 3647 4770 3657 4755 3664 4738 3669 4720 3670 4702 3667
+        4685 3661 4670 3651 4657 3640 4647 3626 4640 3612 4636 3595
+        4635 3577 4637 3559 4643 3542 4652 3526 4665 3514 4677 3503
+        4693 3497 4709 3492 4727 3491 4746 3493 4763 3500 4778 3509
+        4790 3521 4801 3534 4807 3549
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        6509 3477 6700 3517 6707 3517 6712 3514 6714 3508 6712 3502
+        6613 3333 6612 3331 6611 3330 6607 3329 6603 3328 6599 3329
+        6596 3332 6503 3461 6501 3465 6501 3469 6503 3473 6506 3476
+        6507 3477 6509 3477
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        4764 3542 4949 3431 4955 3442 4960 3452 4776 3562 4764 3542
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4955 3442 4949 3431 5214 3289 5219 3300 5224 3310 4960 3452
+        4955 3442
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5219 3300 5214 3289 5441 3187 5445 3199 5448 3210 5224 3310
+        5219 3300
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5445 3199 5441 3187 5638 3124 5640 3136 5642 3147 5448 3210
+        5445 3199
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        5638 3124 5809 3096 5812 3096 5812 3108 5814 3119 5642 3147
+        5640 3136 5638 3124
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        5812 3096 5966 3101 5968 3101 5966 3112 5965 3124 5811 3119
+        5812 3108 5812 3096
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5966 3112 5968 3101 6113 3135 6109 3146 6104 3157 5963 3124
+        5966 3112
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6109 3146 6113 3135 6254 3195 6249 3205 6243 3215 6104 3157
+        6109 3146
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6249 3205 6254 3195 6398 3279 6391 3289 6384 3298 6243 3215
+        6249 3205
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6391 3289 6398 3279 6550 3383 6544 3392 6536 3402 6384 3298
+        6391 3289
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        6544 3392 6550 3383 6589 3411 6575 3430 6536 3402 6544 3392
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        7095 3485 7110 3491 7126 3501 7139 3513 7149 3529 7155 3546
+        7158 3563 7158 3580 7154 3596 7148 3612 7138 3627 7125 3640
+        7109 3650 7092 3656 7076 3659 7059 3659 7043 3656 7027 3649
+        7012 3639 6999 3626 6989 3611 6983 3594 6980 3577 6980 3561
+        6983 3544 6990 3528 7000 3513 7013 3500 7029 3490 7045 3484
+        7062 3481 7078 3481 7095 3485
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        7427 3376 7541 3535 7546 3539 7552 3541 7557 3537 7560 3532
+        7601 3340 7602 3338 7602 3337 7600 3333 7597 3330 7594 3328
+        7590 3328 7433 3360 7430 3362 7426 3365 7426 3369 7426 3373
+        7426 3374 7427 3376
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        7063 3515 7083 3336 7094 3338 7106 3340 7086 3518 7063 3515
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7094 3338 7083 3336 7124 3104 7135 3108 7146 3111 7106 3340
+        7094 3338
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        7124 3104 7168 2954 7169 2952 7179 2958 7190 2961 7146 3111
+        7135 3108 7124 3104
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 10
+        7169 2952 7215 2871 7216 2870 7217 2868 7220 2866 7225 2877
+        7235 2883 7189 2964 7179 2958 7169 2952
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 12
+        7220 2866 7268 2844 7269 2843 7271 2843 7273 2843 7275 2843
+        7278 2844 7273 2854 7278 2865 7230 2888 7225 2877 7220 2866
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 9
+        7278 2844 7326 2870 7328 2871 7330 2873 7321 2880 7315 2890
+        7267 2864 7273 2854 7278 2844
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        7330 2873 7377 2937 7378 2939 7367 2944 7358 2950 7311 2887
+        7321 2880 7330 2873
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7367 2944 7378 2939 7422 3029 7411 3033 7400 3037 7357 2948
+        7367 2944
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7411 3033 7422 3029 7462 3136 7451 3140 7440 3143 7400 3037
+        7411 3033
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7451 3140 7462 3136 7498 3248 7486 3251 7475 3254 7440 3143
+        7451 3140
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7486 3251 7498 3248 7527 3355 7515 3358 7503 3360 7475 3254
+        7486 3251
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        7515 3358 7527 3355 7533 3381 7510 3386 7503 3360 7515 3358
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        7974 3475 7990 3481 8005 3491 8018 3504 8027 3520 8034 3537
+        8036 3553 8037 3570 8033 3586 8026 3603 8017 3618 8004 3630
+        7988 3640 7971 3646 7954 3649 7937 3649 7921 3646 7905 3639
+        7891 3629 7877 3616 7868 3601 7861 3584 7859 3566 7858 3550
+        7863 3534 7869 3518 7879 3503 7892 3490 7907 3480 7924 3474
+        7941 3471 7957 3471 7974 3475
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        8364 3365 8476 3525 8481 3529 8487 3530 8492 3527 8495 3522
+        8539 3331 8539 3328 8539 3327 8537 3323 8534 3320 8531 3318
+        8527 3318 8370 3349 8367 3350 8363 3353 8362 3357 8362 3361
+        8363 3363 8364 3365
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        7942 3505 7962 3327 7974 3329 7985 3331 7966 3508 7942 3505
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7974 3329 7962 3327 8002 3085 8014 3089 8026 3092 7985 3331
+        7974 3329
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8014 3089 8002 3085 8046 2914 8057 2919 8068 2923 8026 3092
+        8014 3089
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        8046 2914 8091 2808 8093 2804 8102 2812 8113 2817 8068 2923
+        8057 2919 8046 2914
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 11
+        8093 2804 8139 2753 8141 2751 8142 2751 8144 2750 8147 2749
+        8148 2761 8157 2769 8111 2820 8102 2812 8093 2804
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 11
+        8147 2749 8194 2744 8196 2744 8197 2744 8199 2745 8202 2747
+        8195 2756 8196 2768 8149 2772 8148 2761 8147 2749
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 8
+        8202 2747 8248 2781 8250 2784 8241 2791 8233 2800 8188 2765
+        8195 2756 8202 2747
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8241 2791 8250 2784 8296 2851 8285 2856 8274 2861 8231 2797
+        8241 2791
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8285 2856 8296 2851 8339 2940 8328 2944 8317 2948 8274 2861
+        8285 2856
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8328 2944 8339 2940 8377 3044 8367 3048 8355 3051 8317 2948
+        8328 2944
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8367 3048 8377 3044 8413 3154 8402 3158 8390 3161 8355 3051
+        8367 3048
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8402 3158 8413 3154 8444 3263 8432 3266 8420 3269 8390 3161
+        8402 3158
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8432 3266 8444 3263 8468 3363 8456 3366 8445 3368 8420 3269
+        8432 3266
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        8456 3366 8468 3363 8469 3370 8446 3375 8445 3368 8456 3366
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 33
+        3290 2625 3289 2642 3283 2659 3273 2675 3261 2689 3246 2700
+        3230 2707 3214 2711 3198 2711 3181 2709 3163 2704 3148 2694
+        3135 2682 3124 2667 3117 2652 3112 2635 3111 2619 3114 2602
+        3120 2585 3129 2569 3141 2555 3156 2545 3172 2538 3188 2534
+        3205 2533 3222 2535 3239 2541 3255 2550 3268 2563 3279 2577
+        3286 2593 3290 2608 3290 2625
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 20
+        8762 3211 8874 3371 8879 3375 8884 3377 8890 3374 8892 3368
+        8937 3177 8937 3175 8937 3173 8935 3170 8933 3167 8929 3165
+        8925 3165 8768 3195 8765 3196 8762 3200 8761 3204 8761 3207
+        8761 3209 8762 3211
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        3253 2603 3513 2564 3515 2575 3517 2587 3256 2626 3253 2603
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3515 2575 3513 2564 3901 2502 3903 2514 3905 2525 3517 2587
+        3515 2575
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        3903 2514 3901 2502 4275 2442 4277 2453 4279 2465 3905 2525
+        3903 2514
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4277 2453 4275 2442 4634 2382 4636 2393 4638 2405 4279 2465
+        4277 2453
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4636 2393 4634 2382 4979 2325 4981 2336 4983 2348 4638 2405
+        4636 2393
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4981 2336 4979 2325 5310 2271 5311 2282 5313 2294 4983 2348
+        4981 2336
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5311 2282 5310 2271 5626 2221 5628 2232 5629 2244 5313 2294
+        5311 2282
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5628 2232 5626 2221 5927 2176 5929 2188 5930 2199 5629 2244
+        5628 2232
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5929 2188 5927 2176 6214 2137 6216 2149 6217 2160 5930 2199
+        5929 2188
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6216 2149 6214 2137 6487 2106 6488 2118 6489 2129 6217 2160
+        6216 2149
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6488 2118 6487 2106 6746 2082 6747 2094 6747 2105 6489 2129
+        6488 2118
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6747 2094 6746 2082 6990 2068 6990 2080 6990 2091 6747 2105
+        6747 2094
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6990 2080 6990 2068 7220 2064 7220 2076 7219 2087 6990 2091
+        6990 2080
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7220 2076 7220 2064 7435 2070 7434 2082 7433 2094 7219 2087
+        7220 2076
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7434 2082 7435 2070 7636 2089 7634 2101 7632 2112 7433 2094
+        7434 2082
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7634 2101 7636 2089 7823 2121 7820 2133 7817 2144 7632 2112
+        7634 2101
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7820 2133 7823 2121 7996 2167 7992 2178 7988 2189 7817 2144
+        7820 2133
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7992 2178 7996 2167 8154 2228 8149 2239 8143 2249 7988 2189
+        7992 2178
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8149 2239 8154 2228 8298 2305 8291 2315 8284 2325 8143 2249
+        8149 2239
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8291 2315 8298 2305 8428 2400 8420 2408 8411 2416 8284 2325
+        8291 2315
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8420 2408 8428 2400 8542 2512 8533 2520 8523 2527 8411 2416
+        8420 2408
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8533 2520 8542 2512 8642 2643 8632 2649 8622 2655 8523 2527
+        8533 2520
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8632 2649 8642 2643 8728 2794 8717 2799 8706 2803 8622 2655
+        8632 2649
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8717 2799 8728 2794 8799 2966 8788 2970 8776 2973 8706 2803
+        8717 2799
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8788 2970 8799 2966 8855 3159 8843 3161 8831 3163 8776 2973
+        8788 2970
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 6
+        8843 3161 8855 3159 8866 3217 8843 3221 8831 3163 8843 3161
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        8879 3759 8698 3759 8694 3759 8691 3758 8687 3757 8684 3755
+        8681 3752 8679 3750 8677 3746 8676 3743 8675 3736 8698 3736
+        8698 3712 8879 3712 8879 3736 8879 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        8675 3736 8675 3403 8675 3399 8676 3395 8677 3392 8679 3389
+        8681 3386 8684 3383 8687 3382 8691 3380 8698 3379 8698 3403
+        8722 3403 8722 3736 8698 3736 8675 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        8698 3379 9061 3379 9064 3379 9068 3380 9071 3382 9074 3383
+        9077 3386 9079 3389 9081 3392 9083 3395 9084 3403 9061 3403
+        9061 3426 8698 3426 8698 3403 8698 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        9084 3403 9084 3736 9084 3739 9083 3743 9081 3746 9079 3750
+        9077 3752 9074 3755 9071 3757 9068 3758 9061 3759 9061 3736
+        9037 3736 9037 3403 9061 3403 9084 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        9061 3736 9061 3759 8879 3759 8879 3736 8879 3712 9061 3712
+        9061 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7982 3759 7801 3759 7797 3759 7793 3758 7790 3757 7786 3755
+        7784 3752 7781 3750 7779 3746 7778 3743 7777 3736 7801 3736
+        7801 3712 7982 3712 7982 3736 7982 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7777 3736 7777 3403 7777 3399 7778 3395 7779 3392 7781 3389
+        7784 3386 7786 3383 7790 3382 7793 3380 7801 3379 7801 3403
+        7824 3403 7824 3736 7801 3736 7777 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7801 3379 8163 3379 8166 3379 8170 3380 8173 3382 8177 3383
+        8180 3386 8182 3389 8184 3392 8185 3395 8187 3403 8163 3403
+        8163 3426 7801 3426 7801 3403 7801 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        8187 3403 8187 3736 8186 3739 8185 3743 8184 3746 8182 3750
+        8180 3752 8177 3755 8173 3757 8170 3758 8163 3759 8163 3736
+        8139 3736 8139 3403 8163 3403 8187 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        8163 3736 8163 3759 7982 3759 7982 3736 7982 3712 8163 3712
+        8163 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7097 3759 6916 3759 6913 3759 6909 3758 6905 3757 6902 3755
+        6899 3752 6897 3750 6895 3746 6894 3743 6893 3736 6916 3736
+        6916 3712 7097 3712 7097 3736 7097 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6893 3736 6893 3403 6893 3399 6894 3395 6895 3392 6897 3389
+        6899 3386 6902 3383 6905 3382 6909 3380 6916 3379 6916 3403
+        6940 3403 6940 3736 6916 3736 6893 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6916 3379 7279 3379 7282 3379 7286 3380 7289 3382 7292 3383
+        7295 3386 7298 3389 7299 3392 7301 3395 7302 3403 7279 3403
+        7279 3426 6916 3426 6916 3403 6916 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        7302 3403 7302 3736 7302 3739 7301 3743 7299 3746 7298 3750
+        7295 3752 7292 3755 7289 3757 7286 3758 7279 3759 7279 3736
+        7255 3736 7255 3403 7279 3403 7302 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7279 3736 7279 3759 7097 3759 7097 3736 7097 3712 7279 3712
+        7279 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6289 3738 6120 3738 6116 3738 6112 3737 6109 3735 6106 3733
+        6103 3731 6100 3728 6099 3725 6097 3722 6096 3715 6120 3715
+        6120 3691 6289 3691 6289 3715 6289 3738
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6096 3715 6096 3403 6096 3399 6097 3395 6099 3392 6100 3389
+        6103 3386 6106 3383 6109 3382 6112 3380 6120 3379 6120 3403
+        6143 3403 6143 3715 6120 3715 6096 3715
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6120 3379 6459 3379 6463 3379 6467 3380 6470 3382 6473 3383
+        6476 3386 6478 3389 6480 3392 6482 3395 6483 3403 6459 3403
+        6459 3426 6120 3426 6120 3403 6120 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        6483 3403 6483 3715 6483 3718 6482 3722 6480 3725 6478 3728
+        6476 3731 6473 3733 6470 3735 6467 3737 6459 3738 6459 3715
+        6436 3715 6436 3403 6459 3403 6483 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        6459 3715 6459 3738 6289 3738 6289 3715 6289 3691 6459 3691
+        6459 3715
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        5489 3759 5308 3759 5304 3759 5301 3758 5297 3757 5294 3755
+        5291 3752 5289 3750 5287 3746 5285 3743 5285 3736 5308 3736
+        5308 3712 5489 3712 5489 3736 5489 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        5285 3736 5285 3403 5285 3399 5285 3395 5287 3392 5289 3389
+        5291 3386 5294 3383 5297 3382 5301 3380 5308 3379 5308 3403
+        5332 3403 5332 3736 5308 3736 5285 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        5308 3379 5671 3379 5674 3379 5678 3380 5681 3382 5684 3383
+        5687 3386 5689 3389 5691 3392 5693 3395 5694 3403 5671 3403
+        5671 3426 5308 3426 5308 3403 5308 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        5694 3403 5694 3736 5694 3739 5693 3743 5691 3746 5689 3750
+        5687 3752 5684 3755 5681 3757 5678 3758 5671 3759 5671 3736
+        5647 3736 5647 3403 5671 3403 5694 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        5671 3736 5671 3759 5489 3759 5489 3736 5489 3712 5671 3712
+        5671 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        4690 3759 4509 3759 4505 3759 4501 3758 4498 3757 4495 3755
+        4492 3752 4489 3750 4488 3746 4486 3743 4485 3736 4509 3736
+        4509 3712 4690 3712 4690 3736 4690 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        4485 3736 4485 3403 4485 3399 4486 3395 4488 3392 4489 3389
+        4492 3386 4495 3383 4498 3382 4501 3380 4509 3379 4509 3403
+        4532 3403 4532 3736 4509 3736 4485 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        4509 3379 4871 3379 4874 3379 4878 3380 4882 3382 4885 3383
+        4888 3386 4890 3389 4892 3392 4893 3395 4895 3403 4871 3403
+        4871 3426 4509 3426 4509 3403 4509 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        4895 3403 4895 3736 4894 3739 4893 3743 4892 3746 4890 3750
+        4888 3752 4885 3755 4882 3757 4878 3758 4871 3759 4871 3736
+        4848 3736 4848 3403 4871 3403 4895 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        4871 3736 4871 3759 4690 3759 4690 3736 4690 3712 4871 3712
+        4871 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        9806 3759 9625 3759 9621 3759 9618 3758 9614 3757 9611 3755
+        9608 3752 9606 3750 9604 3746 9602 3743 9601 3736 9625 3736
+        9625 3712 9806 3712 9806 3736 9806 3759
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        9601 3736 9601 3403 9601 3399 9602 3395 9604 3392 9606 3389
+        9608 3386 9611 3383 9614 3382 9618 3380 9625 3379 9625 3403
+        9649 3403 9649 3736 9625 3736 9601 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        9625 3379 9987 3379 9991 3379 9995 3380 9998 3382 10001 3383
+        10004 3386 10006 3389 10008 3392 10010 3395 10011 3403 9987 3403
+        9987 3426 9625 3426 9625 3403 9625 3379
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 16
+        10011 3403 10011 3736 10011 3739 10010 3743 10008 3746 10006 3750
+        10004 3752 10001 3755 9998 3757 9995 3758 9987 3759 9987 3736
+        9964 3736 9964 3403 9987 3403 10011 3403
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        9987 3736 9987 3759 9806 3759 9806 3736 9806 3712 9987 3712
+        9987 3736
+# polyline
+2 1 0 0 0 0 0 0 20 4.000 0 0 0 0 0 7
+        7792 4332 7792 4320 8069 4309 8071 4321 8073 4332 7792 4343
+        7792 4332
+# spline
+3 4 0 0 0 0 195 0 20 4.000 0 0 0 19
+        7850 4306 7844 4307 7838 4310 7834 4313 7830 4319 7829 4325
+        7830 4331 7834 4336 7838 4340 7844 4342 7850 4343 7856 4342
+        7861 4340 7866 4336 7869 4331 7871 4325 7871 4313 7860 4306
+        7850 4306
+        0.000 0.000 -1.000 -1.000 -1.000 0.000 0.000 -1.000
+        -1.000 -1.000 0.000 0.000 -1.000 -1.000 -1.000 0.000
+        0.000 0.000 0.000
+-6
+2 2 0 3 0 35 200 -1 20 0.000 0 0 -1 0 0 5
+        675 675 3600 675 3600 3825 675 3825 675 675
+4 0 0 50 -1 0 24 0.0000 4 330 2370 975 1125 canqueue_fifo_t\001
+4 0 0 50 -1 0 24 0.0000 4 330 705 1800 1575 flags\001
+4 0 0 50 -1 0 24 0.0000 4 300 1575 1800 1950 error_code\001
+4 0 0 50 -1 0 24 0.0000 4 255 870 1800 2325 *head\001
+4 0 0 50 -1 0 24 0.0000 4 255 840 1800 2700 **tail\001
+4 0 0 50 -1 0 24 0.0000 4 255 750 1800 3075 *flist\001
+4 0 0 50 -1 0 24 0.0000 4 330 930 1800 3450 *entry\001
diff --git a/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.pdf b/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.pdf
new file mode 100644 (file)
index 0000000..28c2636
Binary files /dev/null and b/lincan-0.3.3/doc/lincandoc/img/lincan_canqueue1.pdf differ
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/can_arch.xml b/lincan-0.3.3/doc/lincandoc/lincan/can_arch.xml
new file mode 100644 (file)
index 0000000..40e5d70
--- /dev/null
@@ -0,0 +1,492 @@
+<!DOCTYPE book  PUBLIC "-//OASIS//DTD DocBook V4.1//EN"
+
+<book lang="en">
+<!-- DocBook file was created by LyX 1.3
+  See http://www.lyx.org/ for more information -->
+ <bookinfo>
+  <title>
+Open Source Components for CAN Bus
+ </title>
+ <author>
+P. P\'{\i}\v{s}a, F. Vacek
+ </author>
+<para>
+Department of Control Engineering, Faculty of Electrical Engineering
+Karlovo nám\v{e}st\'{\i} 13, 121 35 Praha 2
+CZECH REPUBLIC
+pisa@cmp.felk.cvut.cz
+vacek@.vol.cz
+ </para>
+ <abstract>
+ <para>
+This article deals with implementation of virtual CAN API, CANopen 
+slave device and CAN/CANopen monitor. This open source code, written 
+under OCERA project, is destined for Linux and RT Linux. The virtual 
+CAN API is the interface used to connect the application threads 
+either with the CAN hardware card or with other software layers 
+substituting CAN bus. The application thread can live either in the 
+Hard RT space (RT Linux) or in the Soft RT space (Linux). In the other 
+words we can say that VCA is a layer between the CAN driver and the 
+application threads. CANopen device is a software solution based on 
+CANopen FSM (Finite State Machine) threads, EDS (Electronic Data 
+Sheet) file and HDS (Handler Definition Sheet) file. The device can be 
+CANopen master or CANopen slave. CAN monitor is a component used to 
+scan a CAN bus. It can receive, send and log messages. If CAN device 
+EDS (Electronic Data Sheet) is available CanMonitor offers also basic 
+SDO functionality. Written in Java the CAN monitor is a multi-platform 
+application. </para> <para>Keywords: CAN, CANopen, Linux, RT-Linux, 
+LinCAN. </para> </abstract>  <sect1>   <title>Introduction  </title>  
+<para>The OCERA CAN framework offers fundamental components for 
+development of CAN and CANopensolutions. The framework defines Virtual 
+CAN API, which defines interactions between CANdriver and other 
+components. Each CAN solution requires access to CAN bus. The Linux 
+LinCANdriver performs this role in OCERA CAN framework. The real-time 
+port of the LinCAN driverfor RT-Linux is developed under name ORTCAN.  
+</para>  <para>The higher communication layers support is oriented to 
+industrial applications.The CANopen and DeviceNET protocols are used 
+in this area. The OCERA frameworkhas selected CANopen layer support 
+because OCERA industrial partners have moreinterest in this protocol.  
+</para>  <para>The CANopen defines process data objects (PDO) and 
+device dictionary (servicedata objects SDO) access protocol and 
+communication profiles for commonly usedindustrial devices (sensors, 
+actuators, controllers). The concrete device specializedprofile is 
+distributed in the form of the Electronic Data Sheets (EDS). The 
+presentedframework can use existing EDS for purposes of the CAN 
+communication monitoring andtesting (CAN monitor component) or for 
+building new devices conforming suppliedcommunication profile (CAN
+device component). The one CAN bus based network isrestricted to 
+territorial local communication. The provided CAN monitor 
+daemonconcept extends the possible distance between CAN monitor and 
+monitored CAN networkbecause all communication between monitored 
+system (CAN bus network) and host system running CAN monitor is 
+realized by means of TCP/IP protocol.  </para>  </sect1>  <sect1>   
+<title>LinCAN Driver
+  </title>
+  <para>
+The LinCAN driver is the loadable module for the Linux kernel which 
+implements CAN driver. The driver communicates and controls one or 
+more CAN controllers chips. Each chip/CAN interface is represented to 
+the applications as one or more CAN message objects accessible as 
+character devices. The application can open the character device and 
+use read/write system calls for CAN messages transmission or reception 
+through the connected message object. The parameters of the message 
+object can be modified by the IOCTL system call. The closing of the 
+character device releases resources allocated by the application. The 
+present version of the driver supports three most common CAN 
+controllers:  </para>  <itemizedlist>   <listitem>   <para>Intel 
+i82527 chips    </para>  </listitem>   <listitem>   <para>Philips 
+82c200 chips    </para>
+
+  </listitem>
+   <listitem>
+   <para>
+Philips SJA1000 chips in standard and PeliCAN mode 
+   </para>
+
+  </listitem>
+
+  </itemizedlist>
+  <para>
+The intelligent CAN/CANopen cards should be supported by future 
+versions. One of such cards is P-CAN series of cards produced by 
+Unicontrols. The driver contains support for more than ten CAN cards 
+basic types with different combinations of the above mentioned chips. 
+Not all card types are held by OCERA members, but CTU has and tested 
+more SJA1000 type cards and will test some i82527 cards in near 
+future.  </para>   <sect2>    <title>Driver Background   </title>   
+<para>The development of the CAN drivers for Linux has long history. 
+We have been faced before two basic alternatives, start new project 
+from scratch or use some other project as basis of our development. 
+The first approach would probably lead faster to more simple and clean 
+internal architecture but it would mean to introduce new driver with 
+probably incompatible interface unusable for already existing 
+applications. The reimplementation of support for all existing cards 
+would take long time as well. More existing projects aimed to 
+development of a Linux CAN driver has been analyzed (LDDK CAN driver, 
+can4linux-0.9 by PORT GmbH, CanFestival, can-0.7.1 by Arnaud 
+Westenberg). The latest version has been selected as base for our 
+work, because this version of the driver had most mature support for 
+multiple cards of different kind. The internal infrastructure of this 
+driver did not fulfill our demands and most of it has been rewritten 
+between LinCAN 0.1 and 0.2 driver versions. The driver version 0.2 
+supports 2.2.x, 2.4.x and 2.6.0-test Linux kernels.   </para>   
+</sect2>   <sect2>    <title>Driver Application Interface   </title>   
+<para><figure><para><graphic 
+fileref="&graph1001;"></para><title><anchor 
+id="cap:lincan_arch1">LinCAN architecture</title></figure>The LinCAN 
+provides simultaneous queued communication for more concurrent running 
+applications. Even each of communication object can be used by one or 
+more applications, which connects to the communication object internal 
+representation by means of CAN FIFO queues. This enables to build 
+complex systems based even on card and chips, which provides only one 
+communication objects (for example SJA1000).    </para>   <para>The 
+driver can be configured to provide virtual CAN board (software 
+emulated message object) to test CAN components on the Linux system 
+without hardware required to connect to the real CAN bus. The example 
+configuration of the CAN network components connected to one real or 
+virtual communication object of LinCAN driver is shown in figure <xref 
+linkend="cap:lincan_arch1">. The communication object is used by the 
+CAN monitor daemon and two CANopen devices implemented by OCERA CanDev 
+component. The actual system dependent driver API is hidden to 
+applications under VCA library. The CAN monitor daemon translates CAN 
+messages to TCP/IP network for Java based platform independent CAN 
+monitor and C based test client.   </para>   <para>Each communication 
+object is represented as character device file. The devices can be 
+opened and closed by applications in blocking or non-blocking mode. 
+LinCAN client application state, chip and object configurations are 
+controlled by IOCTL system call. One or more CAN messages can be sent 
+or received through write/read system calls. The data read from or 
+written to the driver are formed from sequence of fixed size 
+structures representing CAN messages.   </para>   
+<programlisting><![CDATA[struct canmsg_t {]]><![CDATA[ int 
+flags;]]><![CDATA[ int   cob;]]><![CDATA[ unsigned long 
+id;]]><![CDATA[ canmsg_tstamp_t timestamp;]]><![CDATA[ unsigned short  
+length;]]><![CDATA[ unsigned char 
+data[CAN_MSG_LENGTH];]]><![CDATA[};]]>   </programlisting>   </sect2>  
+ <sect2>    <title>Driver Implementation   </title>   <para>The LinCAN 
+driver version 0.2 has rewritten infrastructure based on message FIFOs 
+organized into oriented edges between chip drivers (structure chip_t) 
+message objects representations (structure msgobj_t) and open device 
+file instances state (structure canuser_t). The complete relationship 
+between CAN hardware representation and open instances is illustrated 
+in the figure <xref linkend="cap:lincan_canhardware1">.   </para>   
+<para><figure><para><graphic 
+fileref="&graph1002;"></para><title><anchor 
+id="cap:lincan_canqueue1">LinCAN message FIFO 
+implementation</title></figure>The message FIFO (structure 
+canque_fifo_t) initialization code allocates configurable number of 
+slots capable to hold one message. The all slots are linked to the 
+free list after initialization. The slot can be requested by FIFO 
+input side by function canque_fifo_get_inslot. The slot is filled by 
+message data and is linked into FIFO queue by function 
+canque_fifo_put_inslot. If previously requested slot is not 
+successfully filled by data, it can be released by 
+canque_fifo_abort_inslot. The output side of the FIFO tests presence 
+of ready slots by function canque_fifo_test_outslot. If the slot is 
+returned by this function, it is processed and released by function 
+canque_fifo_free_outslot. The processing can be postponed in the case 
+of bus error or higher priority message processing request by 
+canque_fifo_again_outslot function. All these functions are extremely 
+simple and fast, which enables to synchronize them by spin-lock 
+semaphores and guarantee atomic nature of them. The FIFO 
+implementation is illustrated in the figure <xref 
+linkend="cap:lincan_canqueue1">.   </para>   
+<para><figure><para><graphic 
+fileref="&graph1003;"></para><title><anchor 
+id="cap:lincan_canends1">LinCAN driver message flow graph 
+edges</title></figure> The low level message FIFOs are wrapped by CAN 
+edges structures (canque_edge_t), which are used for message passing 
+between all components of the driver. The actual version of LinCAN 
+driver uses oriented edges to connect clients/users with chips and 
+communication objects. Each entity, which is able to hold edge ends, 
+has to be equipped by canque_ends_t structure. The input ends of 
+edges/FIFOs are held on inlist. The inactive/empty out ends of th 
+edges are held on a idle list and active out ends are held on a active 
+list corresponding to the edge priority. The canque_fifo_test_outslot 
+function can determine by examination of active lists if there is 
+message to accept/process. This concept makes possible to use same 
+type of edges for outgoing and incoming directions. The concept of 
+edges can be even used for message filtering by priority or acceptance 
+masks. It is prepared for future targeting messages to predefined 
+message objects according to their priority or type and for redundant 
+and fault tolerant message distribution into more CAN buses. Message 
+concentration, virtual nodes and other special processing can be 
+implemented above this concept as well. The example of interconnection 
+of one communication object with two users/open instances is 
+illustrated in the picture <xref linkend="cap:lincan_canends1">. Three 
+edges/FIFOs are in the active state and one edge/FIFO is empty in the 
+shown example.   </para>   <para><figure><para><graphic 
+fileref="&graph1004;"></para><title><anchor 
+id="cap:lincan_canhardware1">CAN hardware model in the LinCAN 
+driver</title></figure>The figure <xref 
+linkend="cap:lincan_canhardware1"> is example of object inside LinCAN 
+driver representing system with two boards, three chips and more 
+communication objects. Some of these objects are used by one or more 
+applications. The object open instances are represented as canuser_t 
+structures.   </para>   </sect2>  </sect1>  <sect1>   <title>CanDevice 
+ </title>  <para>CANopen device is a software library based on CANopen 
+FSM (Finite State Machine). CANopen device should be compatible with 
+standard industrial CANopen devices according to CiA Draft Standard 
+301. There are two main CANopen device applications - CANmaster and 
+CANslave.   </para>  <para>CANslave is an application written in C, 
+which can read EDS (Electronic Data Sheet) file to build its OD 
+(Object Dictionary). When the EDS is loaded, one can upload/download 
+SDO object using CAN bus.  </para>  <para><figure><para><graphic 
+fileref="&graph1005;"></para><title><anchor 
+id="cap:slave_concept">CANslave concept</title></figure>  </para>  
+<para>CANslave consist of next main components  </para>  
+<itemizedlist>   <listitem>   <para>FSM   </para>  </listitem>   
+<listitem>   <para>PDO handlers module   </para>  </listitem>   
+<listitem>   <para>OD   </para>  </listitem>   <listitem>   <para>EDS  
+ </para>  </listitem>
+   <listitem>
+   <para>
+HDS
+   </para>
+
+  </listitem>
+
+  </itemizedlist>
+  <variablelist>
+   <varlistentry>
+   <term>
+FSM
+</term><listitem><para>(Finite State Machine) means set of RT-Linux 
+threads providing PDO and SDO communication via CAN driver . Slave FSM 
+also calls appropriate handler PDO communication and looks into the 
+slave's object dictionary using SDO API in case of SDO request.   
+</para>  </listitem>
+  </varlistentry>
+   <varlistentry>
+   <term>
+PDO_handlers_module
+</term><listitem><para>is an user written module containing handlers 
+for reading/writing PDO mapped object data from/to hardware.   </para>
+
+  </listitem>
+
+  </varlistentry>
+   <varlistentry>
+   <term>
+EDS
+</term><listitem><para>(Electronic Data Sheet) is a text file 
+describing all objects in the slave OD (Object Dictionary). EDS is 
+parsed in order to create the slave OD.   </para>
+  </listitem>
+
+  </varlistentry>
+   <varlistentry>
+   <term>
+HDS
+</term><listitem><para>(Handler Definition Sheet) means a text file 
+describing the linking PDO's COB-ID with required handler in order to
+grant correspondence between the CANopen object value and 
+technological process data from the hardware. In other words it 
+describe how to get/set object value from/to hardware using PDO 
+handlers module functions. For example a thermometer with the analog
+output connected to PC A/D converter card needs handler which reads 
+temperature from the card output port and gives it to the FSM. The 
+slave designer have to write this handler code and put link between
+this handler and temperature_object in OD. The FSM source code remains 
+always the same, OCERA written.   </para>  </listitem>  
+</varlistentry>  </variablelist>  <para>According the application hard 
+real-time demands the CANslave can be placed either in the kernel 
+space or in the user one.  </para>   <sect2>    <title>User space 
+CANslave concept   </title>
+   <para>
+This solution is suitable for debug purposes or in situations where 
+hard real-time is not so important condition.   </para>
+   <para>
+<figure><para>
+<graphic fileref="&graph1006;">
+</para>
+<title>
+User space CANslave solution
+</title>
+</figure>
+   </para>
+   <para>
+As can be seen on figure above CAN driver sends the CAN messages to 
+CANslave FSM via VCA. FSM handles messages of two main categories, 
+process data (PDO) and service data (SDO, NMT, SFO).   </para>   
+<para>The process data (PDO objects) are handled separately of the 
+service (SDO) ones. Slave FSM exploits CAN driver message buffers as 
+the buffers for the slave PDOs. This approach is necessary because 
+some CAN chips have such buffers integrated. On the other hand this 
+can speed up PDO object handling. Slave FSM role lies in updating this 
+buffers after device specific event such is timer event or process 
+object value change. The CAN driver sends objects from its buffers 
+when needed (after SYNC object or as a response to RTR object). 
+Consequently slave FSM has to read this buffers after WPDO object 
+arrival.   </para>   <para>The PDO handler module is used to 
+synchronize PDO mapped objects values and real world data examined or 
+set by computer hardware. Every PDO mapped object has assigned its 
+reading and writing routine called PDO handler. These handlers are 
+written by control system developer in order to fit general FSM 
+concept to specific hardware and real world process.   </para>   
+<para>Some of SFO (Special Function Objects) are handled directly by 
+CAN driver. Such objects are the SYNC or RTR frames.   </para>   
+<para>Service objects (SDO) are sent through the SDO API to OD driver. 
+OD driver is responsible for all object dictionary manipulations, that 
+means getting and setting object values. If the PDO mapping change 
+occurs due to SDO object processing, OD driver informs slave FSM (via 
+SDO API) to correct PDO handlers table to reflect PDO mapping status 
+in OD properly.   </para>   <para>OD driver communicates with OD 
+daemon, which resides in the user space, through RT FIFOs. OD daemon 
+offers set of primitives to provide basic manipulations with OD like 
+get/set object value, add object, delete object etc. OD daemon also 
+owns slave OD in its memory space.   </para>   <para>Slave OD can be 
+loaded onto OD daemon memory by EDS parser. EDS parser is the 
+graphical front end to the OD daemon connected with it via Unix 
+socket. This gives us the opportunity to control the daemon and slave 
+OD remotely using TCP/IP. EDS parser is also responsible to read HDS 
+and make appropriate changes in daemon OD and also (via daemon SDO 
+API) in slave FSM PDO handler table. This ensures that the proper 
+handlers will be called for certain PDO objects.   </para>   </sect2>  
+ <sect2>    <title>Kernel space CANslave concept   </title>   
+<para>This solution is suitable for embedded devices or for hard 
+real-time control.   </para>   <para><figure><para><graphic 
+fileref="&graph1007;"></para><title>Kernel space CANslave 
+solution</title></figure>   </para>   <para>This architecture is very 
+similar to the previous one. The main difference lies in OD position 
+which is a part of OD driver module now. Every other part of slave 
+remain the same. OD driver module is compiled from source code 
+generated by EDS parser from the slave EDS, HDS and the empty OD 
+driver template. This means that in this case the OD is hardwired in 
+the CANslave source code.   </para>   <para>Benefits of the kernel 
+space solution   </para>   <itemizedlist>    <listitem>    
+<para>Faster PDO and SDO object processing (in deterministic time 
+horizon).    </para>
+   </listitem>
+    <listitem>
+    <para>
+Slave does not need user space applications to work properly.
+    </para>
+
+   </listitem>
+    <listitem>
+    <para>
+Slave can be implemented to other POSIX compliant real-time OS like 
+RTEMS.    </para>
+
+   </listitem>
+    <listitem>
+    <para>
+Suitable for CANopen slave realization in embedded systems.
+    </para>
+
+   </listitem>
+
+   </itemizedlist>
+   <para>
+Disadvantages of the kernel space solution
+   </para>
+   <itemizedlist>
+    <listitem>
+    <para>
+OD is static, its structure can not be dynamically changed during 
+slave run.    </para>
+
+   </listitem>
+    <listitem>
+    <para>
+EDS parser can not explore OD any more for debug purposes. Standard 
+EDS communication on CAN bus can be used for that purpose.    </para>
+
+   </listitem>
+
+   </itemizedlist>
+
+   </sect2>
+
+   <sect2>
+    <title>
+CANmaster
+   </title>
+   <para>
+CANmaster architecture is very similar to the user space slave one. 
+CAN driver, FSM, OD driver and OD daemon are the same. New blocks, PDO 
+processor and PDO object table are introduced and OD daemon contains 
+OD of all slaves connected till now. PDO processor is necessary to 
+give control system designer an opportunity to process (ie. subtract) 
+technology values stored in PDO and then send the result to the CAN 
+bus. CANmaster is also responsible for CANopen network management.   
+</para>   <para><figure><para><graphic 
+fileref="&graph1008;"></para><title>CANmaster implementation</title>
+</figure>
+   </para>
+
+   </sect2>
+
+
+  </sect1>
+
+  <sect1>
+   <title>
+CanMonitor
+  </title>
+  <para>
+CanMonitor is a component primary used to scan a CAN bus. It can log 
+messages and also send ones. If CAN device EDS (Electronic Data Sheet) 
+is available CanMonitor offers also basic SDO functionality as reading 
+from and writing to device OD. Package consists of three programs.  
+</para>   <sect2>    <title>canmond
+   </title>
+   <para>
+Canmond works like CAN/CANopen proxy. It translates every CAN message 
+to the textual, platform independent form and send it to the all 
+connected applications. TCP connection allows clients to be placed 
+wherever on the Internet. This gives us also opportunity to read/send 
+CAN messages using a java applet in HTML browser.   </para>   
+<para><figure><para><graphic fileref="&graph1009;"></para>
+<title>
+canmond usage
+</title>
+</figure>
+   </para>
+
+   </sect2>
+
+   <sect2>
+    <title>
+testclient
+   </title>
+   <para>
+Testclient is an simple console application based application for 
+communication with canmond. It provides us basic operation on 
+CAN/CANopen bus like sending messages and SDO communication.   </para>
+   </sect2>
+
+   <sect2>
+    <title>
+CanMonitor
+   </title>
+   <para>
+CanMonitor is a GUI Java based application connected to the canmond. 
+Like testclient it provides us basic CAN/CANopen communication 
+primitives. If one has CANopen device EDS (Electronic Data Sheet), he 
+can load it to the CanMonitor and read/write CANopen objects just 
+clicking on the mouse.   </para>   <para><figure><para><graphic 
+fileref="&graph1010;"></para>
+<title>
+CanMonitor log screen
+</title>
+</figure>
+   </para>
+   <para>
+CAN monitor can serve as application showing all messages on CAN bus. 
+You can also send a raw CAN messages to the CAN bus clicking on Send 
+button.   </para>   <para>
+<figure><para>
+<graphic fileref="&graph1011;">
+</para>
+<title>
+CanMonitor OD tree view
+</title>
+</figure>
+   </para>
+   <para>
+With loaded EDS you can upload/download CANopen objects values 
+straight to the device object dictionary (OD).   </para>
+   <itemizedlist>
+    <listitem>
+    <para>
+Hanz\'alek, Z. - P\'{\i}\v{s}a, P. - Vacek, F. - \v{S}ebek, Z. - 
+Smol\'{\i}k, P., 2002, Architecture and Components Integration - 
+Communication Components. OCERA - Workshop I, 2002, pp 1-40    </para>
+   </listitem>
+
+   </itemizedlist>
+
+   </sect2>
+
+
+  </sect1>
+
+
+ </bookinfo>
+
+
+
+
+</book>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/can_driver.xml b/lincan-0.3.3/doc/lincandoc/lincan/can_driver.xml
new file mode 100644 (file)
index 0000000..0895831
--- /dev/null
@@ -0,0 +1,605 @@
+<?xml version='1.0'?>
+<!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V4.1.2//EN" 
+               "/usr/lib/sgml/dtd/docbook-xml/docbookx.dtd">
+
+<book id="CANDeviceDriver">
+ <bookinfo>
+  <title>CAN Device Driver</title>
+  
+  <authorgroup>
+   <author>
+    <firstname>Pavel</firstname>
+    <surname>Pisa</surname>
+    <affiliation>
+     <address>
+      <email>pisa@cmp.felk.cvut.cz</email>
+     </address>
+    </affiliation>
+   </author>
+  </authorgroup>
+
+  <copyright>
+   <year>2002</year>
+   <holder>Pavel Pisa</holder>
+  </copyright>
+
+  <legalnotice>
+   <para>
+     This documentation 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.
+   </para>
+      
+   <para>
+     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.
+   </para>
+      
+   <para>
+     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
+   </para>
+      
+   <para>
+     For more details see the file COPYING in the source
+     distribution of CAN driver.
+   </para>
+
+  </legalnotice>
+ </bookinfo>
+
+<toc></toc>
+
+  <chapter id="intro">
+      <title>Introduction</title>
+  <para>
+      The Linux CAN driver.
+  </para>
+  </chapter>
+
+  <chapter id="Basics">
+     <title>Driver Basics</title>
+     <sect1><title>Driver Entry and Exit points</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-request-io">template_request_io</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_request_io</refname>
+ <refpurpose>
+   reserve io memory
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_request_io </function></funcdef>
+   <paramdef>unsigned long <parameter>io_addr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>io_addr</parameter></term>
+   <listitem>
+    <para>
+      The reserved memory starts at <parameter>io_addr</parameter>, wich is the module 
+     parameter <parameter>io</parameter>.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_request_io</function> is used to reserve the io-memory. If your
+   hardware uses a dedicated memory range as hardware control registers you
+   will have to add the code to reserve this memory as well. 
+   <constant>IO_RANGE</constant> is the io-memory range that gets reserved, please adjust according
+   your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+   #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-release-io">template_release_io</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_release_io</refname>
+ <refpurpose>
+      free reserved io-memory
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_release_io </function></funcdef>
+   <paramdef>unsigned long <parameter>io_addr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>io_addr</parameter></term>
+   <listitem>
+    <para>
+      Start of the memory range to be released.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_release_io</function> is used to free reserved io-memory.
+   In case you have reserved more io memory, don't forget to free it here.
+   IO_RANGE is the io-memory range that gets released, please adjust according
+   your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+   #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-reset">template_reset</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_reset</refname>
+ <refpurpose>
+      hardware reset routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_reset </function></funcdef>
+   <paramdef>int <parameter>card</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>card</parameter></term>
+   <listitem>
+    <para>
+      Number of the hardware card.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_reset</function> is used to give a hardware reset. This is 
+   rather hardware specific so I haven't included example code. Don't forget to 
+   check the reset status of the chip before returning.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-hw-data">template_init_hw_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_hw_data</refname>
+ <refpurpose>
+      Initialze hardware cards
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_hw_data </function></funcdef>
+   <paramdef>int <parameter>card</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>card</parameter></term>
+   <listitem>
+    <para>
+      Number of the hardware card.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_hw_data</function> is used to initialize the hardware
+   structure containing information about the installed CAN-board.
+   <constant>RESET_ADDR</constant> represents the io-address of the hardware reset register.
+   <constant>NR_82527</constant> represents the number of intel 82527 chips on the board.
+   <constant>NR_SJA1000</constant> represents the number of philips sja1000 chips on the board.
+   The flags entry can currently only be <constant>PROGRAMMABLE_IRQ</constant> to indicate that
+   the hardware uses programmable interrupts.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-chip-data">template_init_chip_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_chip_data</refname>
+ <refpurpose>
+      Initialize chips
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_chip_data </function></funcdef>
+   <paramdef>int <parameter>card</parameter></paramdef>
+   <paramdef>int <parameter>chipnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>card</parameter></term>
+   <listitem>
+    <para>
+      Number of the hardware card
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chipnr</parameter></term>
+   <listitem>
+    <para>
+      Number of the CAN chip on the hardware card
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_chip_data</function> is used to initialize the hardware
+   structure containing information about the CAN chips.
+   <constant>CHIP_TYPE</constant> represents the type of CAN chip. <constant>CHIP_TYPE</constant> can be <quote>i82527</quote> or
+   <quote>sja1000</quote>.
+   The <parameter>chip_base_addr</parameter> entry represents the start of the 'official' memory map
+   of the installed chip. It's likely that this is the same as the <parameter>io_addr</parameter>
+   argument supplied at module loading time.
+   The <parameter>clock</parameter> entry holds the chip clock value in Hz.
+   The entry <parameter>sja_cdr_reg</parameter> holds hardware specific options for the Clock Divider
+   register. Options defined in the <constant>sja1000</constant>.h file:
+   <constant>CDR_CLKOUT_MASK</constant>, <constant>CDR_CLK_OFF</constant>, <constant>CDR_RXINPEN</constant>, <constant>CDR_CBP</constant>, <constant>CDR_PELICAN</constant>
+   The entry <parameter>sja_ocr_reg</parameter> holds hardware specific options for the Output Control
+   register. Options defined in the <constant>sja1000</constant>.h file:
+   <constant>OCR_MODE_BIPHASE</constant>, <constant>OCR_MODE_TEST</constant>, <constant>OCR_MODE_NORMAL</constant>, <constant>OCR_MODE_CLOCK</constant>,
+   <constant>OCR_TX0_LH</constant>, <constant>OCR_TX1_ZZ</constant>.
+   The entry <parameter>int_clk_reg</parameter> holds hardware specific options for the Clock Out
+   register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iCLK_CD0</constant>, <constant>iCLK_CD1</constant>, <constant>iCLK_CD2</constant>, <constant>iCLK_CD3</constant>, <constant>iCLK_SL0</constant>, <constant>iCLK_SL1</constant>.
+   The entry <parameter>int_bus_reg</parameter> holds hardware specific options for the Bus 
+   Configuration register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iBUS_DR0</constant>, <constant>iBUS_DR1</constant>, <constant>iBUS_DT1</constant>, <constant>iBUS_POL</constant>, <constant>iBUS_CBY</constant>.
+   The entry <parameter>int_cpu_reg</parameter> holds hardware specific options for the cpu interface
+   register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iCPU_CEN</constant>, <constant>iCPU_MUX</constant>, <constant>iCPU_SLP</constant>, <constant>iCPU_PWD</constant>, <constant>iCPU_DMC</constant>, <constant>iCPU_DSC</constant>, <constant>iCPU_RST</constant>.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-obj-data">template_init_obj_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_obj_data</refname>
+ <refpurpose>
+      Initialize message buffers
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_obj_data </function></funcdef>
+   <paramdef>int <parameter>chipnr</parameter></paramdef>
+   <paramdef>int <parameter>objnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chipnr</parameter></term>
+   <listitem>
+    <para>
+      Number of the CAN chip
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>objnr</parameter></term>
+   <listitem>
+    <para>
+      Number of the message buffer
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_obj_data</function> is used to initialize the hardware
+   structure containing information about the different message objects on the
+   CAN chip. In case of the sja1000 there's only one message object but on the
+   i82527 chip there are 15.
+   The code below is for a i82527 chip and initializes the object base addresses
+   The entry <parameter>obj_base_addr</parameter> represents the first memory address of the message 
+   object. In case of the sja1000 <parameter>obj_base_addr</parameter> is taken the same as the chips
+   base address.
+   Unless the hardware uses a segmented memory map, flags can be set zero.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-program-irq">template_program_irq</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_program_irq</refname>
+ <refpurpose>
+      program interrupts
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_program_irq </function></funcdef>
+   <paramdef>int <parameter>card</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>card</parameter></term>
+   <listitem>
+    <para>
+      Number of the hardware card.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_program_irq</function> is used for hardware that uses 
+   programmable interrupts. If your hardware doesn't use programmable interrupts
+   you should not set the <parameter>candevices_t</parameter>-&gt;flags entry to <constant>PROGRAMMABLE_IRQ</constant> and 
+   leave this function unedited. Again this function is hardware specific so 
+   there's no example code.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-write-register">template_write_register</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_write_register</refname>
+ <refpurpose>
+      Low level write register routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>template_write_register </function></funcdef>
+   <paramdef>unsigned char <parameter>data</parameter></paramdef>
+   <paramdef>unsigned long <parameter>address</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>data</parameter></term>
+   <listitem>
+    <para>
+      data to be written
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>address</parameter></term>
+   <listitem>
+    <para>
+      memory address to write to
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_write_register</function> is used to write to hardware registers
+   on the CAN chip. You should only have to edit this function if your hardware
+   uses some specific write process.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function does not return a value
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-read-register">template_read_register</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_read_register</refname>
+ <refpurpose>
+      Low level read register routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>unsigned <function>template_read_register </function></funcdef>
+   <paramdef>unsigned long <parameter>address</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>address</parameter></term>
+   <listitem>
+    <para>
+      memory address to read from
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_read_register</function> is used to read from hardware registers
+   on the CAN chip. You should only have to edit this function if your hardware
+   uses some specific read process.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns the value stored in <parameter>address</parameter>
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+     </sect1>
+  </chapter>
+</book>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/can_lincan.xml b/lincan-0.3.3/doc/lincandoc/lincan/can_lincan.xml
new file mode 100644 (file)
index 0000000..b23c456
--- /dev/null
@@ -0,0 +1,2792 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section>
+  <title>Linux CAN Driver (LINCAN)</title>
+
+  <para>The LINCAN is an implementation of the Linux device driver supporting
+  more CAN controller chips and many CAN interface boards. Its
+  implementation has long history already. The OCERA version of the driver
+  adds new features, continuous enhancements and reimplementation of
+  structure of the driver. The usage of the driver is tightly coupled to
+  the virtual CAN API interface component which hides driver low level
+  interface to the application programmers.</para>
+
+  <section>
+    <title>Summary</title>
+
+    <variablelist>
+      <varlistentry>
+        <term>Name of the component</term>
+
+        <listitem>
+          <para>Linux CAN Driver (LINCAN)</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Author</term>
+
+        <listitem>
+          <para>Arnaud Westenberg</para>
+
+          <para>Tomasz Motylewski</para>
+
+          <para>Pavel Pisa</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Reviewer</term>
+
+        <listitem>
+          <para>The previous driver versions were tested by more users. The
+          actual version was tested at CTU by more OCERA developers and by
+          BFAD GmbH, which use pre-OCERA and current version of the driver
+          in their products.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Layer</term>
+
+        <listitem>
+          <para>High-level available</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Version</term>
+
+        <listitem>
+          <para>0.7-pi3.4 alpha</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Status</term>
+
+        <listitem>
+          <para>Alpha</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Dependencies</term>
+
+        <listitem>
+          <para>The driver requires CAN interface hardware.</para>
+
+          <para>Linux kernels from 2.2.x and 2.4.x series are fully
+          supported.</para>
+
+          <para>Support for latest 2.5.x and future 2.6.x. is in
+          preparation</para>
+
+          <para>The use of VCA API library is suggested for seamless
+          application transitions between driver kinds and versions.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>Release date</term>
+
+        <listitem>
+          <para>N/A</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </section>
+
+  <section>
+    <title>Description</title>
+
+    <para id="LINCAN" xreflabel="LINCAN">The LINCAN driver is the loadable
+    module for the Linux kernel which implements CAN driver. The driver
+    communicates and controls one or more CAN controllers chips. The each
+    chip/CAN interface is represented to the applications as one or more CAN
+    message objects through the character device interface. The application
+    can open the character device and use <function>read</function>/<function>write</function>
+    system calls for CAN messages transmission or reception through
+    the connected message object. The parameters of the message object can be
+    modified by the <function>IOCTL</function> system call. The closing of
+    the character device releases resources allocated by the application.</para>
+
+    <para>The present version of the driver supports three most common CAN
+    controllers:<itemizedlist><listitem><para>Intel i82527 chips</para></listitem><listitem><para>Philips
+    82c200 chips</para></listitem><listitem><para>Philips SJA1000 chips in
+    standard and PeliCAN mode</para></listitem></itemizedlist>The
+    intelligent CAN/CANopen cards should be supported by future versions.
+    One of such cards is P-CAN series of cards produced by Unicontrols.
+    The driver contains support for more than ten CAN cards basic types
+    with different combinations of the above mentioned chips. Not all card
+    types are held by OCERA members, but CTU has and tested more SJA1000
+    type cards and will test some i82527 cards in near future.</para>
+  </section>
+
+  <section id="lincan-api" xreflabel="lincan-api-fops">
+    <title>API / Compatibility</title>
+
+    <section>
+      <title>Driver API Overview</title>
+
+      <para>Each driver is a subsystem which has no direct application level
+      API. The operating system is responsible for user space calls
+      transformation into driver functions calls or dispatch routines
+      invocations. The CAN driver is implemented as a character device with
+      the standard device node names <filename>/dev/can0</filename>,
+      <filename>/dev/can1</filename>, etc. The application program
+      communicates with the driver through the standard system low level
+      input/output primitives (<function>open</function>,
+      <function>close</function>, <function>read</function>,
+      <function>write</function>, <function>select</function> and 
+      <function>ioctl</function>). The CAN driver convention of usage of
+      these functions is described in the next subsection.</para>
+
+      <para>The <function>read</function> and <function>write</function>
+      functions need to transfer one or more CAN messages. The structure
+      <structname>canmsg_t</structname> is defined for this purpose and is
+      defined in include file <filename>can/can.h</filename>. The
+      <structname>canmsg_t</structname> structure has next fields:</para>
+
+      <programlisting>
+      struct canmsg_t { 
+          int flags; 
+          int cob; 
+          unsigned long   id; 
+          canmsg_tstamp_t timestamp; 
+          unsigned short  length; 
+          unsigned char   data[CAN_MSG_LENGTH]; 
+      };</programlisting>
+
+      <variablelist>
+        <varlistentry>
+          <term>flags</term>
+
+          <listitem>
+            <para>The flags field holds information about message type.
+            The bit <constant>MSG_RTR</constant> marks remote transmission
+            request messages. Writing of such message into the CAN message object
+            handle results in transmission of the RTR message. The RTR message
+            can be received by the read call if no buffer with corresponding
+            ID is pre-filled in the driver. The bit <constant>MSG_EXT</constant>
+            indicates that the message with extended (29&#x00A0;bit) ID will
+            be send or was received. The bit <constant>MSG_OVR</constant>
+            is intended for fast indication of the reception message queue
+            overfill.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>cob</term>
+
+          <listitem>
+            <para>The field reserved for a holding message communication
+            object number. It could be used for serialization of
+            received messages from more message object into one message
+            queue in the future.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>id</term>
+
+          <listitem>
+            <para>CAN message ID.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>timestamp</term>
+
+          <listitem>
+            <para>The field intended for storing of the message reception
+            time.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>length</term>
+
+          <listitem>
+            <para>The number of the data bytes send or received in the CAN message.
+            The number of data load bytes is from 0 to 8.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>data</term>
+
+          <listitem>
+            <para>The byte array holding message data.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+
+      <para>As was mentioned above, direct communication with the driver
+      through system calls is not encouraged because this interface is
+      partially system dependent and cannot be ported to all environments.
+      The suggested alternative is to use OCERA provided VCA library which
+      defines the portable and clean interface to the CAN driver implementation.</para>
+
+      <para>The other issue is addition of the support for new CAN
+      interface boards and CAN controller chips. The subsection <link
+      linkend="lincan-api-board">Driver Board Support Interface</link>
+      describes template functions, which needs to be implemented for
+      newly supported board. The template of board support can be found in
+      the file <filename>src/template.c</filename>.</para>
+
+      <para>The other task for more brave souls is addition of the support for
+      the unsupported chip type. The source supporting the SJA1000 chip in the
+      PeliCAN mode can serve as an example. The full source of this chip
+      support is stored in the file <filename>src/sja1000p.c</filename>. The
+      subsection <link linkend="lincan-api-board">Driver Chip Support
+      Interface</link> describes basic functions necessary for the new chip
+      support.</para>
+    </section>
+
+    <section id="lincan-api-fops" xreflabel="lincan-api-fops">
+      <title>CAN Driver File Operations</title>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="LINCAN-open">open</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>open</refname>
+
+          <refpurpose>message communication object open system call</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>open </function></funcdef>
+
+              <paramdef>const char * <parameter>pathname</parameter></paramdef>
+
+              <paramdef>int <parameter>flags</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>pathname</parameter></term>
+
+              <listitem>
+                <para>The path to driver device node is specified there.
+                The conventional device names for Linux CAN driver are
+                <filename>/dev/can0</filename>, <filename>/dev/can1</filename>,
+                etc.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>flags</parameter></term>
+
+              <listitem>
+                <para>flags modifying style of open call. The standard
+                <constant>O_RDWR</constant> mode should be used for CAN
+                device. The mode <constant>O_NOBLOCK</constant> can be
+                used with driver as well. This mode results in immediate
+                return of <function>read</function> and
+                <function>write</function>.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>Returns negative number in the case of error. Returns the
+          file descriptor for named CAN message object in other cases.</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="LINCAN-close">close</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>close</refname>
+
+          <refpurpose>message communication object close system call</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>close </function></funcdef>
+
+              <paramdef>int <parameter>fd</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>fd</parameter></term>
+
+              <listitem>
+                <para>file descriptor to opened can message communication
+                object</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>Returns negative number in the case of error.</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="LINCAN-read">read</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>read</refname>
+
+          <refpurpose>reads received CAN messages from message object</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>ssize_t <function>read</function></funcdef>
+
+              <paramdef>int <parameter>fd</parameter></paramdef>
+
+              <paramdef>void * <parameter>buf</parameter></paramdef>
+
+              <paramdef>size_t <parameter>count</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>fd</parameter></term>
+
+              <listitem>
+                <para>file descriptor to opened can message communication
+                object</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>buf</parameter></term>
+
+              <listitem>
+                <para>pointer to array of <structname>canmsg_t</structname>
+                structures.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>count</parameter></term>
+
+              <listitem>
+                <para>size of message array buffer in number of bytes</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>Returns negative value in the case of error else returns
+          number of read bytes which is multiple of
+          <structname>canmsg_t</structname> structure size.</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="LINCAN-write">write</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>write</refname>
+
+          <refpurpose>writes CAN messages to message object for
+          transmission</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>ssize_t <function>write</function></funcdef>
+
+              <paramdef>int <parameter>fd</parameter></paramdef>
+
+              <paramdef>const void * <parameter>buf</parameter></paramdef>
+
+              <paramdef>size_t <parameter>count</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>fd</parameter></term>
+
+              <listitem>
+                <para>file descriptor to opened can message communication
+                object</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>buf</parameter></term>
+
+              <listitem>
+                <para>pointer to array of <structname>canmsg_t</structname>
+                structures.</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>count</parameter></term>
+
+              <listitem>
+                <para>size of message array buffer in number of bytes. The
+                parameter informs driver about number of messages prepared
+                for transmission and should be multiple of
+                <structname>canmsg_t</structname> structure size.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>Returns negative value in the case of error else returns
+          number of bytes successfully stored into message object
+          transmission queue. The positive returned number is multiple of
+          <structname>canmsg_t</structname> structure size.</para>
+        </refsect1>
+      </refentry>
+    </section>
+
+    <section id="lincan-api-board" xreflabel="lincan-api-board">
+      <title>Driver Board Support Interface</title>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-request-io">template_request_io</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_request_io</refname>
+
+          <refpurpose>reserve io memory</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_request_io </function></funcdef>
+
+              <paramdef>unsigned long <parameter>io_addr</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>io_addr</parameter></term>
+
+              <listitem>
+                <para>The reserved memory starts at
+                <parameter>io_addr</parameter>, which is the module
+                parameter <parameter>io</parameter>.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_request_io</function> is
+          used to reserve the io-memory. If your hardware uses a dedicated
+          memory range as hardware control registers you will have to add
+          the code to reserve this memory as well. <constant>IO_RANGE</constant>
+          is the io-memory range that gets reserved, please adjust
+          according your hardware. Example: #define IO_RANGE 0x100 for
+          i82527 chips or #define IO_RANGE 0x20 for sja1000 chips in basic
+          CAN mode.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function returns zero on success or
+          <constant>-ENODEV</constant> on failure</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-release-io">template_release_io</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_release_io</refname>
+
+          <refpurpose>free reserved io-memory</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_release_io </function></funcdef>
+
+              <paramdef>unsigned long <parameter>io_addr</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>io_addr</parameter></term>
+
+              <listitem>
+                <para>Start of the memory range to be released.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_release_io</function> is
+          used to free reserved io-memory. In case you have reserved more
+          io memory, don&#39;t forget to free it here. IO_RANGE is the
+          io-memory range that gets released, please adjust according your
+          hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+          #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function always returns zero</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-reset">template_reset</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_reset</refname>
+
+          <refpurpose>hardware reset routine</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_reset </function></funcdef>
+
+              <paramdef>int <parameter>card</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>card</parameter></term>
+
+              <listitem>
+                <para>Number of the hardware card.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_reset</function> is used
+          to give a hardware reset. This is rather hardware specific so I
+          haven&#39;t included example code. Don&#39;t forget to check the
+          reset status of the chip before returning.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function returns zero on success or
+          <constant>-ENODEV</constant> on failure</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-init-hw-data">template_init_hw_data</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_init_hw_data</refname>
+
+          <refpurpose>Initialize hardware cards</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_init_hw_data </function></funcdef>
+
+              <paramdef>int <parameter>card</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>card</parameter></term>
+
+              <listitem>
+                <para>Number of the hardware card.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_init_hw_data</function> is
+          used to initialize the hardware structure containing information
+          about the installed CAN-board. <constant>RESET_ADDR</constant>
+          represents the io-address of the hardware reset register.
+          <constant>NR_82527</constant> represents the number of Intel
+          82527 chips on the board. <constant>NR_SJA1000</constant>
+          represents the number of Philips sja1000 chips on the board. The
+          flags entry can currently only be <constant>PROGRAMMABLE_IRQ</constant>
+          to indicate that the hardware uses programmable interrupts.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function always returns zero</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-init-chip-data">template_init_chip_data</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_init_chip_data</refname>
+
+          <refpurpose>Initialize chips</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_init_chip_data </function></funcdef>
+
+              <paramdef>int <parameter>card</parameter></paramdef>
+
+              <paramdef>int <parameter>chipnr</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>card</parameter></term>
+
+              <listitem>
+                <para>Number of the hardware card</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>chipnr</parameter></term>
+
+              <listitem>
+                <para>Number of the CAN chip on the hardware card</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_init_chip_data</function>
+          is used to initialize the hardware structure containing
+          information about the CAN chips. <constant>CHIP_TYPE</constant>
+          represents the type of CAN chip. <constant>CHIP_TYPE</constant>
+          can be <quote>i82527</quote> or <quote>sja1000</quote>. The
+          <parameter>chip_base_addr</parameter> entry represents the start
+          of the &#39;official&#39; memory map of the installed chip.
+          It&#39;s likely that this is the same as the
+          <parameter>io_addr</parameter> argument supplied at module
+          loading time. The <parameter>clock</parameter> entry holds the
+          chip clock value in Hz. The entry <parameter>sja_cdr_reg</parameter>
+          holds hardware specific options for the Clock Divider register.
+          Options defined in the <constant>sja1000</constant>.h file:
+          <constant>CDR_CLKOUT_MASK</constant>, <constant>CDR_CLK_OFF</constant>,
+          <constant>CDR_RXINPEN</constant>, <constant>CDR_CBP</constant>,
+          <constant>CDR_PELICAN</constant> The entry
+          <parameter>sja_ocr_reg</parameter> holds hardware specific
+          options for the Output Control register. Options defined in the
+          <constant>sja1000</constant>.h file: <constant>OCR_MODE_BIPHASE</constant>,
+          <constant>OCR_MODE_TEST</constant>, <constant>OCR_MODE_NORMAL</constant>,
+          <constant>OCR_MODE_CLOCK</constant>, <constant>OCR_TX0_LH</constant>,
+          <constant>OCR_TX1_ZZ</constant>. The entry
+          <parameter>int_clk_reg</parameter> holds hardware specific
+          options for the Clock Out register. Options defined in the
+          <constant>i82527</constant>.h file: <constant>iCLK_CD0</constant>,
+          <constant>iCLK_CD1</constant>, <constant>iCLK_CD2</constant>,
+          <constant>iCLK_CD3</constant>, <constant>iCLK_SL0</constant>,
+          <constant>iCLK_SL1</constant>. The entry <parameter>int_bus_reg</parameter>
+          holds hardware specific options for the Bus Configuration
+          register. Options defined in the <constant>i82527</constant>.h
+          file: <constant>iBUS_DR0</constant>, <constant>iBUS_DR1</constant>,
+          <constant>iBUS_DT1</constant>, <constant>iBUS_POL</constant>,
+          <constant>iBUS_CBY</constant>. The entry <parameter>int_cpu_reg</parameter>
+          holds hardware specific options for the cpu interface register.
+          Options defined in the <constant>i82527</constant>.h file:
+          <constant>iCPU_CEN</constant>, <constant>iCPU_MUX</constant>,
+          <constant>iCPU_SLP</constant>, <constant>iCPU_PWD</constant>,
+          <constant>iCPU_DMC</constant>, <constant>iCPU_DSC</constant>,
+          <constant>iCPU_RST</constant>.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function always returns zero</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-init-obj-data">template_init_obj_data</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_init_obj_data</refname>
+
+          <refpurpose>Initialize message buffers</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_init_obj_data </function></funcdef>
+
+              <paramdef>int <parameter>chipnr</parameter></paramdef>
+
+              <paramdef>int <parameter>objnr</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chipnr</parameter></term>
+
+              <listitem>
+                <para>Number of the CAN chip</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>objnr</parameter></term>
+
+              <listitem>
+                <para>Number of the message buffer</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_init_obj_data</function>
+          is used to initialize the hardware structure containing
+          information about the different message objects on the CAN chip.
+          In case of the sja1000 there&#39;s only one message object but
+          on the i82527 chip there are 15. The code below is for a i82527
+          chip and initializes the object base addresses The entry
+          <parameter>obj_base_addr</parameter> represents the first memory
+          address of the message object. In case of the sja1000
+          <parameter>obj_base_addr</parameter> is taken the same as the
+          chips base address. Unless the hardware uses a segmented memory
+          map, flags can be set zero.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function always returns zero</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-program-irq">template_program_irq</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_program_irq</refname>
+
+          <refpurpose>program interrupts</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>template_program_irq </function></funcdef>
+
+              <paramdef>int <parameter>card</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>card</parameter></term>
+
+              <listitem>
+                <para>Number of the hardware card.</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_program_irq</function> is
+          used for hardware that uses programmable interrupts. If your
+          hardware doesn&#39;t use programmable interrupts you should not
+          set the <parameter>candevices_t</parameter>-&#62;flags entry to
+          <constant>PROGRAMMABLE_IRQ</constant> and leave this function
+          unedited. Again this function is hardware specific so
+          there&#39;s no example code.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return value</title>
+
+          <para>The function returns zero on success or
+          <constant>-ENODEV</constant> on failure</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-write-register">template_write_register</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_write_register</refname>
+
+          <refpurpose>Low level write register routine</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>void <function>template_write_register </function></funcdef>
+
+              <paramdef>unsigned char <parameter>data</parameter></paramdef>
+
+              <paramdef>unsigned long <parameter>address</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>data</parameter></term>
+
+              <listitem>
+                <para>data to be written</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>address</parameter></term>
+
+              <listitem>
+                <para>memory address to write to</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_write_register</function>
+          is used to write to hardware registers on the CAN chip. You
+          should only have to edit this function if your hardware uses
+          some specific write process.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function does not return a value</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-template-read-register">template_read_register</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>template_read_register</refname>
+
+          <refpurpose>Low level read register routine</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>unsigned <function>template_read_register
+              </function></funcdef>
+
+              <paramdef>unsigned long <parameter>address</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>address</parameter></term>
+
+              <listitem>
+                <para>memory address to read from</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The function <function>template_read_register</function>
+          is used to read from hardware registers on the CAN chip. You
+          should only have to edit this function if your hardware uses
+          some specific read process.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>The function returns the value stored in
+          <parameter>address</parameter></para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/template.c</para>
+        </refsect1>
+      </refentry>
+    </section>
+
+    <section id="lincan-api-chip" xreflabel="lincan-api-chip">
+      <title>Driver Chip Support Interface</title>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-chip-config">sja1000p_chip_config</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_chip_config</refname>
+
+          <refpurpose>can chip configuration</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_chip_config </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>This function configures chip and prepares it for message
+          transmission and reception. The function resets chip, resets
+          mask for acceptance of all messages by call to
+          <function>sja1000p_extended_mask</function> function and then
+          computes and sets baudrate with use of function
+          <function>sja1000p_baud_rate</function>.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-extended-mask">sja1000p_extended_mask</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_extended_mask</refname>
+
+          <refpurpose>setup of extended mask for message filtering</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_extended_mask </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>unsigned long <parameter>code</parameter></paramdef>
+
+              <paramdef>unsigned long <parameter>mask</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>code</parameter></term>
+
+              <listitem>
+                <para>can message acceptance code</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>mask</parameter></term>
+
+              <listitem>
+                <para>can message acceptance mask</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-baud-rate">sja1000p_baud_rate</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_baud_rate</refname>
+
+          <refpurpose>set communication parameters.</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_baud_rate </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>int <parameter>rate</parameter></paramdef>
+
+              <paramdef>int <parameter>clock</parameter></paramdef>
+
+              <paramdef>int <parameter>sjw</parameter></paramdef>
+
+              <paramdef>int <parameter>sampl_pt</parameter></paramdef>
+
+              <paramdef>int <parameter>flags</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>rate</parameter></term>
+
+              <listitem>
+                <para>baud rate in Hz</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>clock</parameter></term>
+
+              <listitem>
+                <para>frequency of sja1000 clock in Hz (ISA osc is
+                14318000)</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>sjw</parameter></term>
+
+              <listitem>
+                <para>synchronization jump width (0-3) prescaled clock
+                cycles</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>sampl_pt</parameter></term>
+
+              <listitem>
+                <para>sample point in % (0-100) sets
+                (TSEG1+1)/(TSEG1+TSEG2+2) ratio</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>flags</parameter></term>
+
+              <listitem>
+                <para>fields <constant>BTR1_SAM</constant>,
+                <constant>OCMODE</constant>, <constant>OCPOL</constant>,
+                <constant>OCTP</constant>, <constant>OCTN</constant>,
+                <constant>CLK_OFF</constant>, <constant>CBP</constant></para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-read">sja1000p_read</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_read</refname>
+
+          <refpurpose>reads and distributes one or more received messages</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>void <function>sja1000p_read </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct canfifo_t * <parameter>fifo</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>fifo</parameter></term>
+
+              <listitem>
+                <para>pinter to CAN message queue information</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-pre-read-config">sja1000p_pre_read_config</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_pre_read_config</refname>
+
+          <refpurpose>prepares message object for message reception</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_pre_read_config </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>obj</parameter></term>
+
+              <listitem>
+                <para>pointer to message object state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error. Positive value indicates
+          immediate reception of message.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-pre-write-config">sja1000p_pre_write_config</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_pre_write_config</refname>
+
+          <refpurpose>prepares message object for message transmission</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_pre_write_config </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+
+              <paramdef>struct canmsg_t * <parameter>msg</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>obj</parameter></term>
+
+              <listitem>
+                <para>pointer to message object state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>msg</parameter></term>
+
+              <listitem>
+                <para>pointer to CAN message</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>This function prepares selected message object for future
+          initiation of message transmission by <function>sja1000p_send_msg</function>
+          function. The CAN message data and message ID are transfered
+          from <parameter>msg</parameter> slot into chip buffer in this
+          function.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-send-msg">sja1000p_send_msg</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_send_msg</refname>
+
+          <refpurpose>initiate message transmission</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>iint <function>sja1000p_send_msg </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+
+              <paramdef>struct canmsg_t * <parameter>msg</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>obj</parameter></term>
+
+              <listitem>
+                <para>pointer to message object state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>msg</parameter></term>
+
+              <listitem>
+                <para>pointer to CAN message</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>This function is called after <function>sja1000p_pre_write_config</function>
+          function, which prepares data in chip buffer.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-check-tx-stat">sja1000p_check_tx_stat</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_check_tx_stat</refname>
+
+          <refpurpose>checks state of transmission engine</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_check_tx_stat </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error. Positive return value
+          indicates transmission under way status. Zero value indicates
+          finishing of all issued transmission requests.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-set-btregs">sja1000p_set_btregs</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_set_btregs</refname>
+
+          <refpurpose>configures bitrate registers</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_set_btregs </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>unsigned short <parameter>btr0</parameter></paramdef>
+
+              <paramdef>unsigned short <parameter>btr1</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>btr0</parameter></term>
+
+              <listitem>
+                <para>bitrate register 0</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>btr1</parameter></term>
+
+              <listitem>
+                <para>bitrate register 1</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-start-chip">sja1000p_start_chip</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_start_chip</refname>
+
+          <refpurpose>starts chip message processing</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_start_chip </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-stop-chip">sja1000p_stop_chip</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_stop_chip</refname>
+
+          <refpurpose>stops chip message processing</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_stop_chip </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-remote-request">sja1000p_remote_request</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_remote_request</refname>
+
+          <refpurpose>configures message object and asks for RTR message</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_remote_request </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>obj</parameter></term>
+
+              <listitem>
+                <para>pointer to message object structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-standard-mask">sja1000p_standard_mask</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_standard_mask</refname>
+
+          <refpurpose>setup of mask for message filtering</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_standard_mask </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>unsigned short <parameter>code</parameter></paramdef>
+
+              <paramdef>unsigned short <parameter>mask</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>code</parameter></term>
+
+              <listitem>
+                <para>can message acceptance code</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>mask</parameter></term>
+
+              <listitem>
+                <para>can message acceptance mask</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-clear-objects">sja1000p_clear_objects</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_clear_objects</refname>
+
+          <refpurpose>clears state of all message object residing in chip</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_clear_objects </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-config-irqs">sja1000p_config_irqs</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_config_irqs</refname>
+
+          <refpurpose>tunes chip hardware interrupt delivery</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>int <function>sja1000p_config_irqs </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>short <parameter>irqs</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>irqs</parameter></term>
+
+              <listitem>
+                <para>requested chip IRQ configuration</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Return Value</title>
+
+          <para>negative value reports error.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-irq-write-handler">sja1000p_irq_write_handler</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_irq_write_handler</refname>
+
+          <refpurpose>part of ISR code responsible for transmit events</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>void <function>sja1000p_irq_write_handler
+              </function></funcdef>
+
+              <paramdef>struct chip_t * <parameter>chip</parameter></paramdef>
+
+              <paramdef>struct canfifo_t * <parameter>fifo</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>chip</parameter></term>
+
+              <listitem>
+                <para>pointer to chip state structure</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>fifo</parameter></term>
+
+              <listitem>
+                <para>pointer to attached queue description</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>The main purpose of this function is to read message from
+          attached queues and transfer message contents into CAN
+          controller chip. This subroutine is called by
+          <function>sja1000p_irq_write_handler</function> for transmit
+          events.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+
+      <refentry>
+        <refmeta>
+          <refentrytitle><phrase id="API-sja1000p-irq-handler">sja1000p_irq_handler</phrase></refentrytitle>
+        </refmeta>
+
+        <refnamediv>
+          <refname>sja1000p_irq_handler</refname>
+
+          <refpurpose>interrupt service routine</refpurpose>
+        </refnamediv>
+
+        <refsynopsisdiv>
+          <title>Synopsis</title>
+
+          <funcsynopsis>
+            <funcprototype>
+              <funcdef>void <function>sja1000p_irq_handler </function></funcdef>
+
+              <paramdef>int <parameter>irq</parameter></paramdef>
+
+              <paramdef>void * <parameter>dev_id</parameter></paramdef>
+
+              <paramdef>struct pt_regs * <parameter>regs</parameter></paramdef>
+            </funcprototype>
+          </funcsynopsis>
+        </refsynopsisdiv>
+
+        <refsect1>
+          <title>Arguments</title>
+
+          <variablelist>
+            <varlistentry>
+              <term><parameter>irq</parameter></term>
+
+              <listitem>
+                <para>interrupt vector number, this value is system
+                specific</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>dev_id</parameter></term>
+
+              <listitem>
+                <para>driver private pointer registered at time of
+                <function>request_irq</function> call. The CAN driver uses
+                this pointer to store relationship of interrupt to chip
+                state structure - <parameter>struct</parameter> chip_t</para>
+              </listitem>
+            </varlistentry>
+
+            <varlistentry>
+              <term><parameter>regs</parameter></term>
+
+              <listitem>
+                <para>system dependent value pointing to registers stored
+                in exception frame</para>
+              </listitem>
+            </varlistentry>
+          </variablelist>
+        </refsect1>
+
+        <refsect1>
+          <title>Description</title>
+
+          <para>Interrupt handler is activated when state of CAN
+          controller chip changes, there is message to be read or there is
+          more space for new messages or error occurs. The receive events
+          results in reading of the message from CAN controller chip and
+          distribution of message through attached message queues.</para>
+        </refsect1>
+
+        <refsect1>
+          <title>File</title>
+
+          <para>src/sja1000p.c</para>
+        </refsect1>
+      </refentry>
+    </section>
+  </section>
+
+  <section>
+    <title>Implementation issues</title>
+
+    <para>The development of the CAN drivers for Linux has long history.
+    We have been faced before two basic alternatives, start new project
+    from scratch or use some other project as basis of our development.
+    The first approach would probably lead faster to more simple and clean
+    internal architecture but it would mean to introduce new driver with
+    probably incompatible interface unusable for already existing
+    applications. The support of many types of cards is thing which takes
+    long time as well. More existing projects aimed to development of
+    a Linux CAN driver has been analyzed:</para>
+
+    <variablelist>
+      <varlistentry>
+        <term>Original LDDK CAN driver project</term>
+
+        <listitem>
+          <para>The driver project aborted on the kernel evolution and LDDK
+          concept. The LDDK tried to prepare infrastructure for
+          development of the kernel version independent character device
+          drivers written in meta code. The goal was top-ranking, but it
+          proves, that well written &#34;C&#34; language driver can be
+          more portable than the LDDK complex infrastructure.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>can4linux-0.9 by PORT GmbH</term>
+
+        <listitem>
+          <para>This is version of the above LDDK driver maintained by Port
+          GmbH. The card type is hard compiled into the driver by selected
+          defines and only Philips 82c200 chips are supported.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>CanFestival</term>
+
+        <listitem>
+          <para>The big advantage of this driver is an integrated support for
+          the RT-Linux, but driver implementation is highly coupled to one
+          card. Some concepts of the driver are interesting but the driver has
+          the hardcoded number of message queues.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>can-0.7.1 by Arnaud Westenberg</term>
+
+        <listitem>
+          <para>This driver has its roots in the LDDK project as well. The
+          original LDDK concept has been eliminated in the driver source
+          and necessary adaptation of the driver for the different Linux kernel
+          versions is achieved by the controllable number of defines and
+          conditional compilation. There is more independent contributors.
+          The main advantages of the driver are support of many cards working
+          in parallel, IO and memory space chip connection support and more
+          cards of different types can be selected at module load time.
+          There exist more users and applications compatible with the driver
+         interface. Disadvantages of the original version of this driver are
+         non-optimal infrastructure, non-portable make system and lack of the 
+         select support.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <para>The responsible OCERA developers selected the 
+    <interfacename>can-0.7.1</interfacename> driver as a base of their
+    development for next reasons:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>Best support for more cards in system</para>
+      </listitem>
+
+      <listitem>
+        <para>Supports for many types of cards</para>
+      </listitem>
+
+      <listitem>
+        <para>The internal abstraction of the peripheral access method and
+       the chip support</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>The most important features added in the first stage of OCERA
+    development are:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>Added the select system call support</para>
+      </listitem>
+
+      <listitem>
+        <para>The support for our memory mapped ISA card added, which proved
+        simplicity of addition of the support for new type of CAN cards</para>
+      </listitem>
+
+      <listitem>
+        <para>Revised and bug-fixed the IRQ support</para>
+      </listitem>
+
+      <listitem>
+        <para>Rebuilt the make system to compile options fully follow the running
+        kernel options, cross-compilation still possible when the kernel
+        location and compiler is specified. The driver checked with more 2.2.x
+        and 2.4.x kernels and hardware configurations. (compiles even with
+        latest 2.5.x kernels for UP, but needs more work to be ready for
+        2.6.x kernels)</para>
+      </listitem>
+
+      <listitem>
+        <para>Added devfs support</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>We are planning next changes in the driver in the next stage of
+    the development</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>Full support for 2.6.x kernels</para>
+      </listitem>
+
+      <listitem>
+        <para>The second deeper rebuilt of the driver infrastructure to enable porting to
+        more systems (most important RT-Linux). The big advantage of continuous
+        development should be ability to keep compatibility with many
+        cards and applications</para>
+      </listitem>
+
+      <listitem>
+        <para>Support for multiple opening of the single minor device</para>
+      </listitem>
+
+      <listitem>
+        <para>Support for intelligent CAN/CANopen cards</para>
+      </listitem>
+
+      <listitem>
+        <para>PCI and USB hardware hot-swapping and PnP recognition</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>The</para>
+  </section>
+
+  <section>
+    <title>Tests</title>
+
+    <para>No heavy tests have been run yet. The driver has been used with
+    more CAN devices (commercial and CTU made) on more Linux system setups
+    (different kernels 2.4.18, 2.4.19, 2.2.19, 2.2.22) with more compilers
+    (GCC 2.95.3 and 3.2.x). The test application from the driver sources
+    and VCA API sources has been tested. The driver is used for the CanMonitor
+    development and other CTU CAN related projects. The success has been
+    reported from the BFAD company as well.</para>
+  </section>
+
+  <section>
+    <title>Examples</title>
+
+    <para>The simple test utilities can be found in the <filename>utils</filename>
+    subdirectory of the LINCAN driver source subtree. These utilities can
+    be used as base for user programs directly communicating with the LINCAN
+    driver. We do not suggest to build applications directly dependent on
+    the driver operating system specific interface. We suggest to use the VCA
+    API library for communication with the driver which brings higher level of
+    system interface abstraction and ensures compatibility with the future
+    versions of LINCAN driver and RT-Linux driver clone versions.</para>
+
+    <para>The basic utilities provided with LINCAN driver are:</para>
+
+    <variablelist>
+      <varlistentry>
+        <term>rxtx</term>
+
+        <listitem>
+          <para>the simple utility to receive or send message which guides
+          user through operation, the message type, the message ID and the 
+         message contents by simple prompts</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>send</term>
+
+        <listitem>
+          <para>even more simplistic message sending program</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>readburst</term>
+
+        <listitem>
+          <para>the utility for continuous messages reception and printing of
+          the message contents. This utility can be used as an example of the
+          <function>select</function> system call usage.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>sendburst</term>
+
+        <listitem>
+          <para>the periodic message generator. Each message is filled by
+          the constant pattern and the message sequence number. This utility
+          can be used for throughput and message drops tests.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>can-proxy</term>
+
+        <listitem>
+          <para>the simple TCP/IP to CAN proxy. The proxy receives simple
+          commands from IP datagrams and processes command sending and
+          state manipulations. Received messages are packed into IP
+          datagrams and send back to the client.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </section>
+
+  <section>
+    <title>Installation Instructions</title>
+
+    <section>
+      <title>Installation Prerequisites</title>
+
+      <para>The next basic conditions are necessary for the LINCAN driver
+      usage</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>some of supported types of CAN interface boards (high or
+          low speed)</para>
+        </listitem>
+      </itemizedlist>
+
+      <itemizedlist>
+        <listitem>
+          <para>cables and at least one device compatible with the board or
+          the second computer with an another CAN interface board</para>
+        </listitem>
+      </itemizedlist>
+
+      <itemizedlist>
+        <listitem>
+          <para>working Linux system with any recent 2.4.x or 2.2.x kernel
+          (successfully tested on 2.4.18, 2.4.19, 2.2.19, 2.2.20, 2.2.22
+          kernels) or working setup for kernel cross-compilation</para>
+        </listitem>
+      </itemizedlist>
+
+      <itemizedlist>
+        <listitem>
+          <para>installed native and or target specific development tools
+          (GCC and binutils) and pre-configured kernel sources
+          corresponding to the running kernel or intended target for
+          cross-compilation</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>Every non-archaic Linux distribution should provide good
+      starting point for the LINCAN driver installation.</para>
+    </section>
+
+    <section>
+      <title>Quick Installation Instructions</title>
+
+      <para>Change current directory into the LINCAN driver source root
+      directory <programlisting>cd lincan-dir</programlisting>invoke make
+      utility. Just type &#39;<command>make</command>&#39; at the command
+      line and driver should compile without errors<programlisting>make</programlisting></para>
+
+      <para>If there is problem with compilation, look at first lines
+      produced by &#39;make&#39; command or store make output in file.
+      More about possible problems and more complex compilation examples
+      is in the next subsection.</para>
+
+      <para>Install built LINCAN driver object file (<filename>can.o</filename>)
+      into Linux kernel loadable module directory (<filename>/lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/kernel/drivers/char</filename>).
+      This and next commands needs root privileges to proceed
+      successfully.<programlisting>make install</programlisting>If device
+      filesystem (devfs) is not used on the computer, device nodes have to
+      be created manually.<programlisting>
+      mknod -m666 /dev/can0 c 91 0
+      mknod -m666 /dev/can1 c 91 1 
+      ... 
+      mknod -m666 /dev/can7 c 97 7
+      </programlisting></para>
+
+      <para>The parameters, IO address and interrupt line of inserted CAN
+      interface card need to be determined and configured. The manual
+      driver load can be invoked from the command line with parameters
+      similar to example below
+      <programlisting>
+      insmod can.o hw=pip5 irq=4 io=0x8000
+      </programlisting>This commands loads module with selected
+      one card support for PIP5 board type with IO port base address
+      <constant>0x8000</constant> and interrupt line <constant>4</constant>.
+      The full description of module parameters is in the next subsection.
+      If module starts correctly utilities from <filename>utils</filename>
+      subdirectory can be used to test CAN message interchange with device
+      or another computer. The parameters should be written into file
+      <filename>/etc/modules.conf </filename>for subsequent module startup
+      by modprobe command.</para>
+
+      <para>Line added to file <filename>/etc/modules.conf</filename>
+      follows<programlisting>options can hw=pip5 irq=4 io=0x8000</programlisting>The
+      module dependencies should be updated by command
+      <programlisting>depmod -a</programlisting>The driver can be now stopped and started by
+      simple <command>modprobe</command> command
+      <programlisting>modprobe -r can modprobe can</programlisting></para>
+    </section>
+
+    <section>
+      <title>Installation instructions</title>
+
+      <para>The LINCAN make solutions tries to fully automate native
+      kernel out of tree module compilation. Make system recurses through
+      kernel <filename>Makefile</filename> to achieve selection of right
+      preprocessor, compiler and linker directives. The description of
+      make targets after make invocation in driver top directory follows</para>
+
+      <variablelist>
+        <varlistentry>
+          <term>lincan-drv/Makefile (all)</term>
+
+          <listitem>
+            <para>LINCAN driver top makefile</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>lincan-drv/src/Makefile (default or all -&#62;
+          make_this_module)</term>
+
+          <listitem>
+            <para>Needs to resolve target system kernel sources location.
+            This can be selected manually by uncommenting the
+            <filename>Makefile</filename> definition <command>KERNEL_LOCATION=/usr/src/linux-2.2.22</command>.
+            The default behavior is to find the running kernel version and
+            look for path to sources of found kernel version in
+            <filename>/lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/build</filename>
+            directory. If no such directory exists, older version of
+            kernel is assumed and makefile tries the <filename>/usr/src/linux</filename>
+            directory.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/build/Makefile
+          <envar>SUBDIRS</envar>=.../lincan-drv/src (modules)</term>
+
+          <listitem>
+            <para>The kernel supplied <filename>Makefile</filename> is
+            responsible for defining of right defines for preprocessor,
+            compiler and linker. If the Linux kernel is cross-compiled,
+            Linux kernel sources root <filename>Makefile</filename> needs
+            be edited before Linux kernel compilation. The variable
+            <envar>CROSS_COMPILE</envar> should contain development
+            toolchain prefix, for example <command>arm-linux-</command>.
+            The Linux kernel make process recurses back into LINCAN driver
+            <filename>src/Makefile</filename>.</para>
+          </listitem>
+        </varlistentry>
+
+        <varlistentry>
+          <term>lincan-drv/src/Makefile (modules)</term>
+
+          <listitem>
+            <para>This pass starts real LINCAN driver build actions.</para>
+          </listitem>
+        </varlistentry>
+      </variablelist>
+
+      <para>If there is problem with automatic build process, the next
+      commands can help to diagnose the problem.</para>
+
+      <para><programlisting>make clean make &#62;make.out 2&#62;&#38;1</programlisting></para>
+
+      <para>The first lines of file <filename>make.out</filename>
+      indicates autodetected values and can help with resolving of
+      possible problems.</para>
+
+      <screen>
+      make -C src default ; 
+      make -C utils default ; 
+      make[1]: /scripts/pathdown.sh: Command not found 
+      make[1]: Entering directory `/usr/src/can-0.7.1-pi3.4/src&#39; 
+      echo &#62;.supported_cards.h echo \#define ENABLE_CARD_pip 1 &#62;&#62;.supported_cards.h ; ... 
+      Linux kernel version 2.4.19 
+      echo Linux kernel sources /lib/modules/2.4.19/build 
+      Linux kernel sources /lib/modules/2.4.19/build 
+      echo Module target can.o 
+      Module target can.o 
+      echo Module objects proc.o pip.o pccan.o smartcan.o nsi.o ...
+      make[2]: Entering directory `/usr/src/linux-2.4.19&#39;</screen>
+
+      <para>The driver size can be decreased by restricting of number of
+      supported types of boards. This can be done by editing of definition
+      for <envar>SUPPORTED_CARDS</envar> variable.</para>
+
+      <para> There is complete description of driver supported parameters.
+      <programlisting>
+      insmod can.o hw=<replaceable>&#39;your hardware&#39;</replaceable> irq=<replaceable>&#39;irq number&#39;</replaceable> io=<replaceable>&#39;io address&#39;</replaceable> <replaceable>&#60;more options&#62;</replaceable>
+      </programlisting>
+      </para>
+      <para>The more values can be specified for <parameter>hw</parameter>,
+      <parameter>irq</parameter> and <parameter>io</parameter> parameters
+      if more cards is used. Values are separated by commas in such case.
+      The <parameter>hw</parameter> argument can be one of:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para><option>pip5</option>, for the PIP5 computer by MPL AG</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pip6</option>, for the PIP6 computer by MPL AG</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pip7</option>, for the PIP7 computer by MPL AG</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pip8</option>, for the PIP8 computer by MPL AG</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pccan-q</option>, for the PCcan-Q ISA card by
+          KVASER</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pccan-f</option>, for the PCcan-F ISA card by
+          KVASER</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pccan-s</option>, for the PCcan-S ISA card by
+          KVASER</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pccan-d</option>, for the PCcan-D ISA card by
+          KVASER</para>
+        </listitem>
+
+        <listitem>
+          <para><option>nsican</option>, for the CAN104 PC/104 card by NSI</para>
+        </listitem>
+
+        <listitem>
+          <para><option>cc104</option>, for the CAN104 PC/104 card by
+          Contemporary Controls</para>
+        </listitem>
+
+        <listitem>
+          <para><option>aim104</option>, for the AIM104CAN PC/104 card by
+          Arcom Control Systems </para>
+        </listitem>
+
+        <listitem>
+          <para><option>pc-i03</option>, for the PC-I03 ISA card by IXXAT</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pcm3680</option>, for the PCM-3680 PC/104 card by
+          Advantech </para>
+        </listitem>
+
+        <listitem>
+          <para><option>m437</option>, for the M436 PC/104 card by SECO</para>
+        </listitem>
+
+        <listitem>
+          <para><option>bfadcan</option> for sja1000 CAN embedded card
+          made by BFAD GmbH</para>
+        </listitem>
+
+        <listitem>
+          <para><option>pikronisa</option> for ISA memory mapped sja1000
+          CAN card made by PiKRON Ltd.</para>
+        </listitem>
+
+        <listitem>
+          <para><option>template</option>, for yet unsupported hardware
+          (you need to edit <filename>src/template.c</filename>)</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>The <parameter>&#60;more options&#62;</parameter> can be one
+      or more of:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para><parameter>major</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          major specifies the major number of the driver.</para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>minor</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          you can specify which minor numbers the driver should use for
+          your hardware</para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>extended</parameter>=<replaceable>[</replaceable>1<replaceable>|</replaceable>0<replaceable>]</replaceable>,
+          configures the driver to use extended message format</para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>pelican</parameter>=<replaceable>[</replaceable>1<replaceable>|</replaceable>0<replaceable>]</replaceable>,
+          configures the driver to set the CAN chips into pelican mode.</para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>baudrate</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          sets the baudrate of the device(s) </para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>clock_freq</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          the frequency of the CAN quartz </para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>stdmask</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          sets the standard mask of the device </para>
+        </listitem>
+
+        <listitem>
+          <para><parameter>mo15mask</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+          sets the mask for message object 15 (i82527 only)</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+  </section>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_api.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_api.xml
new file mode 100644 (file)
index 0000000..d8018fe
--- /dev/null
@@ -0,0 +1,597 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan-api">
+  <title>LinCAN Driver System Level API</title>
+
+  <section id="lincan-api-dev-and-msg">
+    <title>Device Files and Message Structure</title>
+    <para>Each driver is a subsystem which has no direct application level
+    API. The operating system is responsible for user space calls
+    transformation into driver functions calls or dispatch routines
+    invocations. The CAN driver is implemented as a character device with
+    the standard device node names <filename>/dev/can0</filename>,
+    <filename>/dev/can1</filename>, etc. The application program
+    communicates with the driver through the standard system low level
+    input/output primitives (<function>open</function>,
+    <function>close</function>, <function>read</function>,
+    <function>write</function>, <function>select</function> and
+    <function>ioctl</function>). The CAN driver convention of usage of
+    these functions is described in the next subsection.</para>
+
+    <para>The <function>read</function> and <function>write</function>
+    functions need to transfer one or more CAN messages. The structure
+    <structname>canmsg_t</structname> is defined for this purpose and is
+    defined in include file <filename>can/can.h</filename>. The
+    <structname>canmsg_t</structname> structure has next fields:</para>
+
+    <programlisting>
+    struct canmsg_t {
+        int flags;
+        int cob;
+        unsigned long   id;
+        canmsg_tstamp_t timestamp;
+        unsigned short  length;
+        unsigned char   data[CAN_MSG_LENGTH];
+    } PACKED;</programlisting>
+
+    <variablelist>
+      <varlistentry>
+        <term>flags</term>
+
+        <listitem>
+          <para>The flags field holds information about message type.
+          The bit <constant>MSG_RTR</constant> marks remote transmission
+          request messages. Writing of such message into the CAN message object
+          handle results in transmission of the RTR message. The RTR message
+          can be received by the read call if no buffer with corresponding
+          ID is pre-filled in the driver. The bit <constant>MSG_EXT</constant>
+          indicates that the message with extended (bit 29 set) ID will
+          be send or was received. The bit <constant>MSG_OVR</constant>
+          is intended for fast indication of the reception message queue
+          overfill. The transmitted messages could be distributed back to the
+          local clients after transmition to the CAN bus.
+          Such messages are marked by <constant>MSG_LOCAL</constant> bit.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>cob</term>
+
+        <listitem>
+          <para>The field reserved for a holding message communication
+          object number. It could be used for serialization of
+          received messages from more message object into one message
+          queue in the future.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>id</term>
+
+        <listitem>
+          <para>CAN message ID.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>timestamp</term>
+
+        <listitem>
+          <para>The field intended for storing of the message reception
+          time.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>length</term>
+
+        <listitem>
+          <para>The number of the data bytes send or received in the CAN message.
+          The number of data load bytes is from 0 to 8.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>data</term>
+
+        <listitem>
+          <para>The byte array holding message data.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <para>As was mentioned above, direct communication with the driver
+    through system calls is not encouraged because this interface is
+    partially system dependent and cannot be ported to all environments.
+    The suggested alternative is to use OCERA provided VCA library which
+    defines the portable and clean interface to the CAN driver implementation.</para>
+
+    <para>The other issue is addition of the support for new CAN
+    interface boards and CAN controller chips. The subsection <link
+    linkend="lincan-api-board">Board Support Functions</link>
+    describes template functions, which needs to be implemented for
+    newly supported board. The template of board support can be found in
+    the file <filename>src/template.c</filename>.</para>
+
+    <para>The other task for more brave souls is addition of the support for
+    the unsupported chip type. The source supporting the SJA1000 chip in the
+    PeliCAN mode can serve as an example. The full source of this chip
+    support is stored in the file <filename>src/sja1000p.c</filename>. The
+    subsection <link linkend="lincan-api-chip">Chip Support Functions</link>
+    describes basic functions necessary for the new chip support.</para>
+  </section>
+
+  <section id="lincan-api-fops" xreflabel="lincan-api-fops">
+    <title>CAN Driver File Operations</title>
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-open">open</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>open</refname>
+
+        <refpurpose>message communication object open system call</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>int <function>open </function></funcdef>
+
+            <paramdef>const char * <parameter>pathname</parameter></paramdef>
+
+            <paramdef>int <parameter>flags</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>pathname</parameter></term>
+
+            <listitem>
+              <para>The path to driver device node is specified there.
+              The conventional device names for Linux CAN driver are
+              <filename>/dev/can0</filename>, <filename>/dev/can1</filename>,
+              etc.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>flags</parameter></term>
+
+            <listitem>
+              <para>flags modifying style of open call. The standard
+              <constant>O_RDWR</constant> mode should be used for CAN
+              device. The mode <constant>O_NOBLOCK</constant> can be
+              used with driver as well. This mode results in immediate
+              return of <function>read</function> and
+              <function>write</function>.</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>Returns negative number in the case of error. Returns the
+        file descriptor for named CAN message object in other cases.</para>
+      </refsect1>
+    </refentry>
+
+<!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-close">close</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>close</refname>
+
+        <refpurpose>message communication object close system call</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>int <function>close </function></funcdef>
+
+            <paramdef>int <parameter>fd</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>fd</parameter></term>
+
+            <listitem>
+              <para>file descriptor to opened can message communication
+              object</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>Returns negative number in the case of error.</para>
+      </refsect1>
+    </refentry>
+
+<!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-read">read</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>read</refname>
+
+        <refpurpose>reads received CAN messages from message object</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>ssize_t <function>read</function></funcdef>
+
+            <paramdef>int <parameter>fd</parameter></paramdef>
+
+            <paramdef>void * <parameter>buf</parameter></paramdef>
+
+            <paramdef>size_t <parameter>count</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>fd</parameter></term>
+
+            <listitem>
+              <para>file descriptor to opened can message communication
+              object</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>buf</parameter></term>
+
+            <listitem>
+              <para>pointer to array of <structname>canmsg_t</structname>
+              structures.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>count</parameter></term>
+
+            <listitem>
+              <para>size of message array buffer in number of bytes</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>Returns negative value in the case of error else returns
+        number of read bytes which is multiple of
+        <structname>canmsg_t</structname> structure size.</para>
+      </refsect1>
+    </refentry>
+
+<!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-write">write</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>write</refname>
+
+        <refpurpose>writes CAN messages to message object for
+        transmission</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>ssize_t <function>write</function></funcdef>
+
+            <paramdef>int <parameter>fd</parameter></paramdef>
+
+            <paramdef>const void * <parameter>buf</parameter></paramdef>
+
+            <paramdef>size_t <parameter>count</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>fd</parameter></term>
+
+            <listitem>
+              <para>file descriptor to opened can message communication
+              object</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>buf</parameter></term>
+
+            <listitem>
+              <para>pointer to array of <structname>canmsg_t</structname>
+              structures.</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>count</parameter></term>
+
+            <listitem>
+              <para>size of message array buffer in number of bytes. The
+              parameter informs driver about number of messages prepared
+              for transmission and should be multiple of
+              <structname>canmsg_t</structname> structure size.</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>Returns negative value in the case of error else returns
+        number of bytes successfully stored into message object
+        transmission queue. The positive returned number is multiple of
+        <structname>canmsg_t</structname> structure size.</para>
+      </refsect1>
+    </refentry>
+
+<!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="API-struct-canfilt-t">struct canfilt_t</phrase></refentrytitle>
+      </refmeta>
+      <refnamediv>
+        <refname>struct canfilt_t</refname>
+        <refpurpose>
+              structure for acceptance filter setup
+        </refpurpose>
+      </refnamediv>
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+        <programlisting>
+        struct canfilt_t {
+          int flags;
+          int queid;
+          int cob;
+          unsigned long id;
+          unsigned long mask;
+        };  </programlisting>
+      </refsynopsisdiv>
+      <refsect1>
+        <title>Members</title>
+        <variablelist>
+          <varlistentry>
+            <term>flags</term>
+            <listitem>
+              <para>message flags</para>
+              <para><constant>MSG_RTR</constant> .. message is Remote Transmission Request,</para>
+              <para><constant>MSG_EXT</constant> .. message with extended ID,</para>
+              <para><constant>MSG_OVR</constant> .. indication of queue overflow condition,</para>
+              <para><constant>MSG_LOCAL</constant> .. message originates from this node.</para>
+              <para>there are corresponding mask bits
+              <constant>MSG_RTR_MASK</constant>, <constant>MSG_EXT_MASK</constant>,
+              <constant>MSG_LOCAL_MASK</constant>.</para>
+              <para><constant>MSG_PROCESSLOCAL</constant> enables local messages processing in the
+              combination with global setting</para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>      <term>queid</term>
+            <listitem><para>
+              CAN queue identification in the case of the multiple
+              queues per one user (open instance)
+            </para></listitem>
+          </varlistentry>
+          <varlistentry>      <term>cob</term>
+            <listitem><para>
+              communication object number (not used)
+            </para></listitem>
+          </varlistentry>
+          <varlistentry>      <term>id</term>
+            <listitem><para>
+              selected required value of cared ID id bits
+            </para></listitem>
+          </varlistentry>
+          <varlistentry>      <term>mask</term>
+            <listitem>
+              <para>select bits significant for the comparison;</para>
+              <para>1 .. take care about corresponding ID bit,</para>
+              <para>0 .. don't care</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+    </refentry>
+
+ <!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-ioctl-que-filter">IOCTL CANQUE_FILTER</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>IOCTL CANQUE_FILTER</refname>
+
+        <refpurpose>Sets acceptance filter for CAN queue connected to client state</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>int <function>ioctl</function></funcdef>
+
+            <paramdef>int <parameter>fd</parameter></paramdef>
+
+            <paramdef>int <parameter>command</parameter> = CANQUE_FILTER</paramdef>
+
+            <paramdef>struct canfilt_t * <parameter>filt</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>fd</parameter></term>
+
+            <listitem>
+              <para>file descriptor to opened can message communication
+              object</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>command</parameter></term>
+
+            <listitem>
+              <para>Denotes CAN queue filter command, <constant>CANQUE_FILTER</constant></para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>filt</parameter></term>
+
+            <listitem>
+              <para>pointer to the <structname>canfilt_t</structname>
+              structure.</para>
+
+
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>The <constant>CANQUE_FILTER</constant> IOCTL invocation
+        sets acceptance mask of associated canqueue to specified parameters.
+        Actual version of the driver changes filter of the default
+        receiption queue. The filed <structfield>queid</structfield> should
+        be initialized to zero to support compatibility with future driver
+        versions.</para>
+        <para>The call returns negative value in the case of error.</para>
+      </refsect1>
+    </refentry>
+
+ <!-- ************************************************************************* -->
+
+    <refentry>
+      <refmeta>
+        <refentrytitle><phrase id="LinCAN-ioctl-que-flush">IOCTL CANQUE_FLUSH</phrase></refentrytitle>
+      </refmeta>
+
+      <refnamediv>
+        <refname>IOCTL CANQUE_FLUSH</refname>
+
+        <refpurpose>Flushes messages from receiption CAN queue</refpurpose>
+      </refnamediv>
+
+      <refsynopsisdiv>
+        <title>Synopsis</title>
+
+        <funcsynopsis>
+          <funcprototype>
+            <funcdef>int <function>ioctl</function></funcdef>
+
+            <paramdef>int <parameter>fd</parameter></paramdef>
+
+            <paramdef>int <parameter>command</parameter> = CANQUE_FLUSH</paramdef>
+
+            <paramdef>int <parameter>queid</parameter></paramdef>
+          </funcprototype>
+        </funcsynopsis>
+      </refsynopsisdiv>
+
+      <refsect1>
+        <title>Arguments</title>
+
+        <variablelist>
+          <varlistentry>
+            <term><parameter>fd</parameter></term>
+
+            <listitem>
+              <para>file descriptor to opened can message communication
+              object</para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>command</parameter></term>
+
+            <listitem>
+              <para>Denotes CAN queue flush command, <constant>CANQUE_FLUSH</constant></para>
+            </listitem>
+          </varlistentry>
+
+          <varlistentry>
+            <term><parameter>queid</parameter></term>
+
+            <listitem>
+              <para>Should be initialized to zero to support
+              compatibility with future driver versions</para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </refsect1>
+
+      <refsect1>
+        <title>Description</title>
+
+        <para>The call flushes all messages from the CAN queue.</para>
+
+        <para>The call returns negative value in the case of error.</para>
+      </refsect1>
+    </refentry>
+
+  </section>
+</section>
+
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_arch.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_arch.xml
new file mode 100644 (file)
index 0000000..8482a64
--- /dev/null
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan_arch">
+  <title>LinCAN Driver Architecture</title>
+  <para>The LinCAN  provides simultaneous queued communication for more concurrent running
+  applications.
+  <figure id="cap:lincan_arch1">
+    <title>LinCAN architecture</title>
+    <mediaobject>
+      <imageobject>
+        <imagedata align="center" fileref="&lincan_arch1_img;"
+          format="EPS" scale="45" srccredit="OCERA CTU 2003" />
+      </imageobject>
+    </mediaobject>
+  </figure>
+  Even each of communication object can be used by one or
+  more applications, which connects to the communication object internal
+  representation by means of CAN FIFO queues. This enables to build
+  complex systems based even on card and chips, which provides only one
+  communication objects (for example SJA1000).</para>
+
+  <para>The driver can be configured to provide virtual CAN board (software
+  emulated message object) to test CAN components on the Linux system
+  without hardware required to connect to the real CAN bus. The example
+  configuration of the CAN network components connected to one real or
+  virtual communication object of LinCAN driver is shown in figure
+  <xref linkend="cap:lincan_arch1"/>. The communication object is used by the
+  CAN monitor daemon and two CANopen devices implemented by OCERA CanDev
+  component. The actual system dependent driver API is hidden to
+  applications under VCA library. The CAN monitor daemon translates CAN
+  messages to TCP/IP network for Java based platform independent CAN
+  monitor and C based test client.</para>
+
+  <para>Each communication object is represented as character device file.
+  The devices can be opened and closed by applications in blocking or
+  non-blocking mode. LinCAN client application state, chip and object
+  configurations are controlled by IOCTL system call. One or more CAN
+  messages can be sent or received through write/read system calls.
+  The data read from or written to the driver are formed from sequence
+  of fixed size structures representing CAN messages.</para>
+
+  <programlisting>
+   <![CDATA[
+]]><![CDATA[struct canmsg_t {
+]]><![CDATA[ int   flags;
+]]><![CDATA[ int   cob;
+]]><![CDATA[ unsigned long   id;
+]]><![CDATA[ canmsg_tstamp_t timestamp;
+]]><![CDATA[ unsigned short  length;
+]]><![CDATA[ unsigned char   data[CAN_MSG_LENGTH];
+]]><![CDATA[};
+]]>
+  </programlisting>
+
+  <para>The LinCAN driver version 0.2 has rewritten infrastructure based
+  on message FIFOs organized into oriented edges between chip drivers
+  (<structname>structure chip_t</structname>)  message objects representations
+  (<structname>structure msgobj_t</structname>) and open device
+  file instances state (<structname>structure canuser_t</structname>).
+  The complete relationship between CAN hardware representation and open
+  instances is illustrated in the figure <xref linkend="cap:lincan_canhardware1"/>.
+  </para>
+
+  <para>The message FIFO (<structname>structure canque_fifo_t</structname>)
+  initialization code allocates  configurable number of slots capable
+  to hold one message.
+  <figure id="cap:lincan_canqueue1">
+    <title>LinCAN message FIFO implementation</title>
+    <mediaobject>
+      <imageobject>
+        <imagedata align="center" fileref="&lincan_canqueue1_img;"
+          format="EPS" scale="45" srccredit="OCERA CTU 2003" />
+      </imageobject>
+    </mediaobject>
+  </figure>
+  The all slots are linked to the free list after initialization.
+  The slot can be requested by FIFO input side by function
+  <function>canque_fifo_get_inslot</function>. The slot is filled
+  by message data and is linked into FIFO queue by function
+  <function>canque_fifo_put_inslot</function>. If previously requested slot
+  is not successfully filled by data, it can be released by
+  <function>canque_fifo_abort_inslot</function>. The output side of
+  the FIFO tests presence of ready slots by function
+  <function>canque_fifo_test_outslot</function>. If the slot is
+  returned by this function, it is processed and released by function
+  <function>canque_fifo_free_outslot</function>. The processing can be postponed
+  in the case of bus error or higher priority message processing request by
+  <function>canque_fifo_again_outslot</function> function. All these functions
+  are optimized to be fast and short, which enables to synchronize them by
+  spin-lock semaphores and guarantee atomic nature of them. The FIFO
+  implementation is illustrated in the figure <xref linkend="cap:lincan_canqueue1"/>.
+  </para>
+
+  <figure id="cap:lincan_canends1">
+    <title>LinCAN driver message flow graph edges</title>
+    <mediaobject>
+      <imageobject>
+        <imagedata align="center" fileref="&lincan_canends1_img;"
+          format="EPS" scale="45" srccredit="OCERA CTU 2003" />
+      </imageobject>
+    </mediaobject>
+  </figure>
+
+  <para>The low level message FIFOs are wrapped by CAN  edges structures
+  (<structname>canque_edge_t</structname>), which are used for message
+  passing between all components of the driver. The actual version of LinCAN
+  driver uses oriented edges to connect Linux and RT-Linux clients/users with
+  chips and communication objects. Each entity, which is able to hold edge ends,
+  has to be equipped by <structname>canque_ends_t</structname> structure.
+  The input ends of edges/FIFOs are held on <structfield>inlist</structfield>.
+  The inactive/empty out ends of the edges are held on a <structfield>idle</structfield>
+  list and active out ends are held on a <structfield>active</structfield>
+  list corresponding to the edge priority. The <function>canque_fifo_test_outslot</function>
+  function can determine by examination of active lists if there is
+  message to accept/process. This concept makes possible to use same
+  type of edges for outgoing and incoming directions. The concept of
+  edges can be even used for message filtering by priority or acceptance
+  masks. It is prepared for future targeting messages to predefined
+  message objects according to their priority or type and for redundant
+  and fault tolerant message distribution into more CAN buses. Message
+  concentration, virtual nodes and other special processing can be
+  implemented above this concept as well. The example of interconnection
+  of one communication object with two users/open instances is
+  illustrated in the picture <xref linkend="cap:lincan_canends1"/>.
+  Three edges/FIFOs are in the active state and one edge/FIFO is empty in the
+  shown example.</para>
+
+  <figure id="cap:lincan_canhardware1">
+    <title>CAN hardware model in the LinCAN driver</title>
+    <mediaobject>
+      <imageobject>
+        <imagedata align="center" fileref="&lincan_canhardware1_img;"
+          format="EPS" scale="45" srccredit="OCERA CTU 2003" />
+      </imageobject>
+    </mediaobject>
+  </figure>
+
+  <para>The figure <xref linkend="cap:lincan_canhardware1"/> is example of object
+  inside LinCAN driver representing system with two boards, three chips and more
+  communication objects. Some of these objects are used by one or more
+  applications. The object open instances are represented as
+  <structname>canuser_t</structname> structures.</para>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_history.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_history.xml
new file mode 100644 (file)
index 0000000..ee0943d
--- /dev/null
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan_history">
+  <title>Driver History and Implementation Issues</title>
+
+  <para>The development of the CAN drivers for Linux has long history.
+  We have been faced before two basic alternatives, start new project
+  from scratch or use some other project as basis of our development.
+  The first approach could lead faster to more simple and clean
+  internal architecture but it would mean to introduce new driver with
+  probably incompatible interface unusable for already existing
+  applications. The support of many types of cards is thing which takes
+  long time as well. More existing projects aimed to development of
+  a Linux CAN driver has been analyzed:</para>
+
+  <variablelist>
+    <varlistentry>
+      <term>Original LDDK CAN driver project</term>
+
+      <listitem>
+        <para>The driver project aborted on the kernel evolution and LDDK
+        concept. The LDDK tried to prepare infrastructure for
+        development of the kernel version independent character device
+        drivers written in meta code. The goal was top-ranking, but it
+        proves, that well written &#34;C&#34; language driver can be
+        more portable than the LDDK complex infrastructure.</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>can4linux-0.9 by PORT GmbH</term>
+
+      <listitem>
+        <para>This is version of the above LDDK driver maintained by Port
+        GmbH. The card type is hard compiled into the driver by selected
+        defines and only Philips 82c200 chips are supported.</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>CanFestival</term>
+
+      <listitem>
+        <para>The big advantage of this driver is an integrated support for
+        the RT-Linux, but driver implementation is highly coupled to one
+        card. Some concepts of the driver are interesting but the driver has
+        the hard-coded number of message queues.</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>can-0.7.1 by Arnaud Westenberg</term>
+
+      <listitem>
+        <para>This driver has its roots in the LDDK project as well. The
+        original LDDK concept has been eliminated in the driver source
+        and necessary adaptation of the driver for the different Linux kernel
+        versions is achieved by the controllable number of defines and
+        conditional compilation. There is more independent contributors.
+        The main advantages of the driver are support of many cards working
+        in parallel, IO and memory space chip connection support and more
+        cards of different types can be selected at module load time.
+        There exist more users and applications compatible with the driver
+        interface. Disadvantages of the original version of this driver are
+        non-optimal infrastructure, non-portable make system and lack of the
+        select support.</para>
+      </listitem>
+    </varlistentry>
+  </variablelist>
+
+  <para>The responsible OCERA developers selected the
+  <interfacename>can-0.7.1</interfacename> driver as a base of their
+  development for next reasons:</para>
+
+  <itemizedlist>
+    <listitem>
+      <para>Best support for more cards in system</para>
+    </listitem>
+
+    <listitem>
+      <para>Supports for many types of cards</para>
+    </listitem>
+
+    <listitem>
+      <para>The internal abstraction of the peripheral access method and
+      the chip support</para>
+    </listitem>
+  </itemizedlist>
+
+  <para>The most important features added by OCERA
+  development team are:</para>
+
+  <itemizedlist>
+    <listitem>
+      <para>Added the select system call support</para>
+    </listitem>
+
+    <listitem>
+      <para>The support for our memory mapped ISA card added, which proved
+      simplicity of addition of the support for new type of CAN cards</para>
+    </listitem>
+
+    <listitem>
+      <para>Added devfs support</para>
+    </listitem>
+
+    <listitem>
+      <para>Revised and bug-fixed the IRQ support in the first phase</para>
+    </listitem>
+
+    <listitem>
+      <para>Added support for 2.6.x kernels</para>
+    </listitem>
+
+    <listitem>
+      <para>Rebuilt the make system to compile options fully follow the running
+      kernel options, cross-compilation still possible when the kernel
+      location and compiler is specified. The driver checked with more 2.2.x,
+      2.4.x and 2.6.x kernels and hardware configurations.</para>
+    </listitem>
+
+    <listitem>
+      <para>Cleaned-up synchronization required to support 2.6.x SMP kernels
+      and enhanced 2.4.x kernels performance</para>
+    </listitem>
+
+    <listitem>
+      <para>The deeper rebuilt of the driver infrastructure to enable porting to
+      more systems (most important RT-Linux). The naive FIFO implementation
+      has been replaced by robust CAN queues, edges and ends framework.
+      The big advantage of continuous development is ability to keep compatibility
+      with many cards and applications</para>
+    </listitem>
+
+    <listitem>
+      <para>The infrastructure rewrite enabled to support multiple opening
+      of the single minor device</para>
+    </listitem>
+
+    <listitem>
+      <para>Support for individual queues message acceptance filters added</para>
+    </listitem>
+
+    <listitem>
+      <para>The driver setup functions modified to enable PCI and USB hardware
+      hot-swapping and PnP recognition in the future</para>
+    </listitem>
+
+    <listitem>
+      <para>Added support for KVASER PCI cards family</para>
+    </listitem>
+
+    <listitem>
+      <para>Added support for virtual can board for more CAN/CANopen components interworking
+      testing on single computer without real CAN hardware.</para>
+    </listitem>
+
+    <listitem>
+      <para>The conditional compilation mode for Linux/RT-Linux support has been added.
+      The driver manipulates with chips and boards from RT-Linux hard real-time
+      worker threads in that compilation mode. The POSIX device file interface
+      is provided for RT-Linux threads in parallel to the standard Linux
+      device interface.</para>
+    </listitem>
+
+    <listitem>
+      <para>Work on support for first of intelligent CAN/CANopen cards has
+      been started</para>
+    </listitem>
+  </itemizedlist>
+
+  <para>The possible future enhancements</para>
+
+  <itemizedlist>
+    <listitem>
+      <para>Cleanup and enhance RTR processing. Add some support for
+      emulated RTR processing for SJA1000 chips</para>
+    </listitem>
+
+    <listitem>
+      <para>Enhance clients API to gain full advantages of possibility
+      to connect more CAN queues with different priorities 
+      to the one user state structure</para>
+    </listitem>
+
+    <listitem>
+      <para>Add support for more CAN cards and chips (82C900 comes to mind)</para>
+    </listitem>
+
+    <listitem>
+      <para>Add support for XILINX FPGA based board in development at CTU.
+      There already exists VHDL source for the chip core, connect it
+      to PC-104 bus and LinCAN driver</para>
+    </listitem>
+
+    <listitem>
+      <para>Do next steps in the PCI cards support cleanup and add Linux 2.6.x
+      sysfs support</para>
+    </listitem>
+  </itemizedlist>
+
+</section>
+
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.empty b/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.empty
new file mode 100644 (file)
index 0000000..c23cb02
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan-internals">
+  <title>LinCAN Driver Internals</title>
+  <section id="lincan-api-main" xreflabel="lincan-api-main">
+    <title>Basic Driver Data Structures</title>
+<para>!F../include/main.h</para>
+  </section>
+  <section id="lincan-api-board" xreflabel="lincan-api-board">
+    <title>Board Support Functions</title>
+    <para>
+      The functions, which should be implemented for each supported board,
+      are described in the next section. The functions are prefixed
+      by boardname. The prefix <replaceable>template</replaceable> has
+      been selected for next description.
+    </para>
+<para>!F../src/template.c</para>
+  </section>
+  <section id="lincan-api-chip" xreflabel="lincan-api-chip">
+    <title>Chip Support Functions</title>
+    <para>
+      The controller chip specific functions are described in the next section.
+      The functions should be prefixed by chip type.
+      Because documentation of chip functions has been retrieved from
+      the actual SJA1000 PeliCAN support, the function prefix
+      is <replaceable>sja1000p</replaceable>.
+    </para>
+<para>!F../src/sja1000p.c</para>
+  </section>
+  <section id="lincan-api-queues" xreflabel="lincan-api-queues">
+    <title>CAN Queues Common Structures and Functions</title>
+    <para>
+      This part of the driver implements basic CAN queues infrastructure.
+      It is written as much generic as possible and then specialization for each
+      category of CAN queues clients is implemented in separate subsystem.
+      The only synchronization mechanism required from target system
+      are spin-lock synchronization and atomic bit manipulation.
+      Locked sections are narrowed to the short operations.
+      Even can message 8 bytes movement is excluded from the locked
+      sections of the code.
+    </para>
+<para>!F../include/can_queue.h</para>
+<para>!F../src/can_queue.c</para>
+  </section>
+  <section>
+    <title>CAN Queues Kernel Specific Functions</title>
+<para>!F../src/can_quekern.c</para>
+  </section>
+  <section>
+    <title>CAN Queues RT-Linux Specific Functions</title>
+<para>!F../src/can_quertl.c</para>
+  </section>
+  <section>
+    <title>CAN Queues CAN Chips Specific Functions</title>
+<para>!F../src/devcommon.c</para>
+  </section>
+  <section>
+    <title>CAN Boards and Chip Setup specific Functions</title>
+<para>!F../src/setup.c</para>
+  </section>
+  <section>
+    <title>CAN Boards and Chip Finalization Functions</title>
+<para>!F../src/finish.c</para>
+  </section>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.tmpl b/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.tmpl
new file mode 100644 (file)
index 0000000..4896b87
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan-internals">
+  <title>LinCAN Driver Internals</title>
+  <section id="lincan-api-main" xreflabel="lincan-api-main">
+    <title>Basic Driver Data Structures</title>
+!F../include/main.h
+  </section>
+  <section id="lincan-api-board" xreflabel="lincan-api-board">
+    <title>Board Support Functions</title>
+    <para>
+      The functions, which should be implemented for each supported board,
+      are described in the next section. The functions are prefixed
+      by boardname. The prefix <replaceable>template</replaceable> has
+      been selected for next description.
+    </para>
+!F../src/template.c
+  </section>
+  <section id="lincan-api-chip" xreflabel="lincan-api-chip">
+    <title>Chip Support Functions</title>
+    <para>
+      The controller chip specific functions are described in the next section.
+      The functions should be prefixed by chip type.
+      Because documentation of chip functions has been retrieved from
+      the actual SJA1000 PeliCAN support, the function prefix
+      is <replaceable>sja1000p</replaceable>.
+    </para>
+!F../src/sja1000p.c
+  </section>
+  <section id="lincan-api-queues" xreflabel="lincan-api-queues">
+    <title>CAN Queues Common Structures and Functions</title>
+    <para>
+      This part of the driver implements basic CAN queues infrastructure.
+      It is written as much generic as possible and then specialization for each
+      category of CAN queues clients is implemented in separate subsystem.
+      The only synchronization mechanism required from target system 
+      are spin-lock synchronization and atomic bit manipulation.
+      Locked sections are narrowed to the short operations.
+      Even can message 8 bytes movement is excluded from the locked 
+      sections of the code.
+    </para>
+!F../include/can_queue.h
+!F../src/can_queue.c
+  </section>
+  <section>
+    <title>CAN Queues Kernel Specific Functions</title>
+!F../src/can_quekern.c
+  </section>
+  <section>
+    <title>CAN Queues RT-Linux Specific Functions</title>
+!F../src/can_quertl.c
+  </section>
+  <section>
+    <title>CAN Queues CAN Chips Specific Functions</title>
+!F../src/devcommon.c
+  </section>
+  <section>
+    <title>CAN Boards and Chip Setup specific Functions</title>
+!F../src/setup.c
+  </section>
+  <section>
+    <title>CAN Boards and Chip Finalization Functions</title>
+!F../src/finish.c
+  </section>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_internals.xml
new file mode 100644 (file)
index 0000000..b458b65
--- /dev/null
@@ -0,0 +1,6983 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan-internals">
+  <title>LinCAN Driver Internals</title>
+  <section id="lincan-api-main" xreflabel="lincan-api-main">
+    <title>Basic Driver Data Structures</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canhardware-t">struct canhardware_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canhardware_t</refname>
+ <refpurpose>
+   structure representing pointers to all CAN boards
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canhardware_t {
+  int nr_boards;
+  struct rtr_id * rtr_queue;
+  can_spinlock_t rtr_lock;
+  struct candevice_t * candevice[MAX_HW_CARDS];
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>nr_boards</term>
+      <listitem><para>
+ number of present boards
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>rtr_queue</term>
+      <listitem><para>
+ RTR - remote transmission request queue (expect some changes there)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>rtr_lock</term>
+      <listitem><para>
+ locking for RTR queue
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>candevice[MAX_HW_CARDS]</term>
+      <listitem><para>
+ array of pointers to CAN devices/boards
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-candevice-t">struct candevice_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct candevice_t</refname>
+ <refpurpose>
+      CAN device/board structure
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct candevice_t {
+  char * hwname;
+  int candev_idx;
+  unsigned long io_addr;
+  unsigned long res_addr;
+  unsigned long dev_base_addr;
+  unsigned int flags;
+  int nr_all_chips;
+  int nr_82527_chips;
+  int nr_sja1000_chips;
+  struct canchip_t * chip[MAX_HW_CHIPS];
+  struct hwspecops_t * hwspecops;
+  struct canhardware_t * hosthardware_p;
+  union sysdevptr;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>hwname</term>
+      <listitem><para>
+    text string with board type
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>candev_idx</term>
+      <listitem><para>
+    board index in canhardware_t.candevice[]
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>io_addr</term>
+      <listitem><para>
+    IO/physical MEM address
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>res_addr</term>
+      <listitem><para>
+    optional reset register port
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>dev_base_addr</term>
+      <listitem><para>
+    CPU translated IO/virtual MEM address
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>flags</term>
+      <listitem><para>
+    board flags: <constant>PROGRAMMABLE_IRQ</constant> .. interrupt number
+   can be programmed into board
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>nr_all_chips</term>
+      <listitem><para>
+    number of chips present on the board
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>nr_82527_chips</term>
+      <listitem><para>
+    number of Intel 8257 chips 
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>nr_sja1000_chips</term>
+      <listitem><para>
+    number of Philips SJA100 chips
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip[MAX_HW_CHIPS]</term>
+      <listitem><para>
+    array of pointers to the chip structures
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>hwspecops</term>
+      <listitem><para>
+    pointer to board specific operations
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>hosthardware_p</term>
+      <listitem><para>
+    pointer to the root hardware structure
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>sysdevptr</term>
+      <listitem><para>
+    union reserved for pointer to bus specific
+   device structure (case <parameter>pcidev</parameter> is used for PCI devices)
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The structure represent configuration and state of associated board.
+   The driver infrastructure prepares this structure and calls
+   board type specific <function>board_register</function> function. The board support provided
+   register function fills right function pointers in <parameter>hwspecops</parameter> structure.
+   Then driver setup calls functions <function>init_hw_data</function>, <function>init_chip_data</function>,
+   <function>init_chip_data</function>, <function>init_obj_data</function> and <function>program_irq</function>. Function <function>init_hw_data</function>
+   and <function>init_chip_data</function> have to specify number and types of connected chips
+   or objects respectively.
+   The use of <parameter>nr_all_chips</parameter> is preferred over use of fields <parameter>nr_82527_chips</parameter>
+   and <parameter>nr_sja1000_chips</parameter> in the board non-specific functions.
+   The <parameter>io_addr</parameter> and <parameter>dev_base_addr</parameter> is filled from module parameters
+   to the same value. The request_io function can fix-up <parameter>dev_base_addr</parameter>
+   field if virtual address is different than bus address.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canchip-t">struct canchip_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canchip_t</refname>
+ <refpurpose>
+      CAN chip state and type information
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canchip_t {
+  char * chip_type;
+  int chip_idx;
+  int chip_irq;
+  unsigned long chip_base_addr;
+  unsigned int flags;
+  long clock;
+  long baudrate;
+  void (* write_register) (unsigned data,unsigned long address);
+  unsigned (* read_register) (unsigned long address);
+  void * chip_data;
+  unsigned short sja_cdr_reg;
+  unsigned short sja_ocr_reg;
+  unsigned short int_cpu_reg;
+  unsigned short int_clk_reg;
+  unsigned short int_bus_reg;
+  struct msgobj_t * msgobj[MAX_MSGOBJS];
+  struct chipspecops_t * chipspecops;
+  struct candevice_t * hostdevice;
+  int max_objects;
+  can_spinlock_t chip_lock;
+#ifdef CAN_WITH_RTL
+  pthread_t worker_thread;
+  unsigned long pend_flags;
+#endif
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>chip_type</term>
+      <listitem><para>
+    text string describing chip type
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip_idx</term>
+      <listitem><para>
+    index of the chip in candevice_t.chip[] array
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip_irq</term>
+      <listitem><para>
+    chip interrupt number if any
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip_base_addr</term>
+      <listitem><para>
+    chip base address in the CPU IO or virtual memory space
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>flags</term>
+      <listitem><para>
+    chip flags: <constant>CHIP_CONFIGURED</constant> .. chip is configured,
+   <constant>CHIP_SEGMENTED</constant> .. access to the chip is segmented (mainly for i82527 chips)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>clock</term>
+      <listitem><para>
+    chip base clock frequency in Hz
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>baudrate</term>
+      <listitem><para>
+    selected chip baudrate in Hz
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>write_register</term>
+      <listitem><para>
+    write chip register function copy
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>read_register</term>
+      <listitem><para>
+    read chip register function copy
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip_data</term>
+      <listitem><para>
+    pointer for optional chip specific data extension
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>sja_cdr_reg</term>
+      <listitem><para>
+    SJA specific register -
+   holds hardware specific options for the Clock Divider
+   register. Options defined in the sja1000.h file:
+   <constant>CDR_CLKOUT_MASK</constant>, <constant>CDR_CLK_OFF</constant>, <constant>CDR_RXINPEN</constant>, <constant>CDR_CBP</constant>, <constant>CDR_PELICAN</constant>
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>sja_ocr_reg</term>
+      <listitem><para>
+    SJA specific register -
+   hold hardware specific options for the Output Control
+   register. Options defined in the sja1000.h file:
+   <constant>OCR_MODE_BIPHASE</constant>, <constant>OCR_MODE_TEST</constant>, <constant>OCR_MODE_NORMAL</constant>, <constant>OCR_MODE_CLOCK</constant>,
+   <constant>OCR_TX0_LH</constant>, <constant>OCR_TX1_ZZ</constant>.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>int_cpu_reg</term>
+      <listitem><para>
+    Intel specific register -
+   holds hardware specific options for the CPU Interface
+   register. Options defined in the i82527.h file:
+   <constant>iCPU_CEN</constant>, <constant>iCPU_MUX</constant>, <constant>iCPU_SLP</constant>, <constant>iCPU_PWD</constant>, <constant>iCPU_DMC</constant>, <constant>iCPU_DSC</constant>, <constant>iCPU_RST</constant>.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>int_clk_reg</term>
+      <listitem><para>
+    Intel specific register -
+   holds hardware specific options for the Clock Out
+   register. Options defined in the i82527.h file:
+   <constant>iCLK_CD0</constant>, <constant>iCLK_CD1</constant>, <constant>iCLK_CD2</constant>, <constant>iCLK_CD3</constant>, <constant>iCLK_SL0</constant>, <constant>iCLK_SL1</constant>.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>int_bus_reg</term>
+      <listitem><para>
+    Intel specific register -
+   holds hardware specific options for the Bus Configuration
+   register. Options defined in the i82527.h file:
+   <constant>iBUS_DR0</constant>, <constant>iBUS_DR1</constant>, <constant>iBUS_DT1</constant>, <constant>iBUS_POL</constant>, <constant>iBUS_CBY</constant>.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>msgobj[MAX_MSGOBJS]</term>
+      <listitem><para>
+    array of pointers to individual communication objects
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chipspecops</term>
+      <listitem><para>
+    pointer to the set of chip specific object filled by <function>init_chip_data</function> function
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>hostdevice</term>
+      <listitem><para>
+    pointer to chip hosting board
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>max_objects</term>
+      <listitem><para>
+    maximal number of communication objects connected to this chip
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>chip_lock</term>
+      <listitem><para>
+    reserved for synchronization of the chip supporting routines
+   (not used in the current driver version)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>worker_thread</term>
+      <listitem><para>
+    chip worker thread ID (RT-Linux specific field)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pend_flags</term>
+      <listitem><para>
+    holds information about pending interrupt and <function>tx_wake</function> operations
+   (RT-Linux specific field). Masks values:
+   <constant>MSGOBJ_TX_REQUEST</constant> .. some of the message objects requires <function>tx_wake</function> call, 
+   <constant>MSGOBJ_IRQ_REQUEST</constant> .. chip interrupt processing required
+   <constant>MSGOBJ_WORKER_WAKE</constant> .. marks, that worker thread should be waked
+   for some of above reasons
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The fields <parameter>write_register</parameter> and <parameter>read_register</parameter> are copied from
+   corresponding fields from <parameter>hwspecops</parameter> structure
+   (chip-&gt;hostdevice-&gt;hwspecops-&gt;write_register and 
+   chip-&gt;hostdevice-&gt;hwspecops-&gt;read_register)
+   to speedup <function>can_write_reg</function> and <function>can_read_reg</function> functions.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-msgobj-t">struct msgobj_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct msgobj_t</refname>
+ <refpurpose>
+      structure holding communication object state
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct msgobj_t {
+  unsigned long obj_base_addr;
+  unsigned int minor;
+  unsigned int object;
+  unsigned long obj_flags;
+  int ret;
+  struct canque_ends_t * qends;
+  struct canque_edge_t * tx_qedge;
+  struct canque_slot_t * tx_slot;
+  int tx_retry_cnt;
+  struct timer_list tx_timeout;
+  struct canmsg_t rx_msg;
+  struct canchip_t * hostchip;
+  unsigned long rx_preconfig_id;
+  atomic_t obj_used;
+  struct list_head obj_users;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>obj_base_addr</term>
+      <listitem><para>
+    
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>minor</term>
+      <listitem><para>
+    associated device minor number
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>object</term>
+      <listitem><para>
+    object number in canchip_t structure +1
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>obj_flags</term>
+      <listitem><para>
+    message object specific flags. Masks values:
+   <constant>MSGOBJ_TX_REQUEST</constant> .. the message object requests TX activation
+   <constant>MSGOBJ_TX_LOCK</constant> .. some IRQ routine or callback on some CPU 
+   is running inside TX activation processing code
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>ret</term>
+      <listitem><para>
+    field holding status of the last Tx operation
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>qends</term>
+      <listitem><para>
+    pointer to message object corresponding ends structure
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>tx_qedge</term>
+      <listitem><para>
+    edge corresponding to transmitted message
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>tx_slot</term>
+      <listitem><para>
+    slot holding transmitted message, slot is taken from
+   <function>canque_test_outslot</function> call and is freed by <function>canque_free_outslot</function>
+   or rescheduled <function>canque_again_outslot</function>
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>tx_retry_cnt</term>
+      <listitem><para>
+    transmission attempt counter
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>tx_timeout</term>
+      <listitem><para>
+    can be used by chip driver to check for the transmission timeout
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>rx_msg</term>
+      <listitem><para>
+    temporary storage to hold received messages before
+   calling to <function>canque_filter_msg2edges</function>
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>hostchip</term>
+      <listitem><para>
+    pointer to the &amp;canchip_t structure this object belongs to
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>rx_preconfig_id</term>
+      <listitem><para>
+    place to store RX message identifier for some chip types
+   that reuse same object for TX
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>obj_used</term>
+      <listitem><para>
+    counter of users (associated file structures for Linux
+   userspace clients) of this object
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>obj_users</term>
+      <listitem><para>
+    list of user structures of type &amp;canuser_t.
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canuser-t">struct canuser_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canuser_t</refname>
+ <refpurpose>
+      structure holding CAN user/client state
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canuser_t {
+  unsigned long flags;
+  struct list_head peers;
+  struct canque_ends_t * qends;
+  struct msgobj_t * msgobj;
+  struct canque_edge_t * rx_edge0;
+  union {} userinfo;
+  int magic;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>flags</term>
+      <listitem><para>
+    used to distinguish Linux/RT-Linux type
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>peers</term>
+      <listitem><para>
+    for connection into list of object users
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>qends</term>
+      <listitem><para>
+    pointer to the ends structure corresponding for this user
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>msgobj</term>
+      <listitem><para>
+    communication object the user is connected to
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>rx_edge0</term>
+      <listitem><para>
+    default receive queue for filter IOCTL
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>userinfo</term>
+      <listitem><para>
+    stores user context specific information.
+   The field <parameter>fileinfo</parameter>.file holds pointer to open device file state structure
+   for the Linux user-space client applications
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>magic</term>
+      <listitem><para>
+    magic number to check consistency when pointer is retrieved
+   from file private field
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-hwspecops-t">struct hwspecops_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct hwspecops_t</refname>
+ <refpurpose>
+      hardware/board specific operations
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct hwspecops_t {
+  int (* request_io) (struct candevice_t *candev);
+  int (* release_io) (struct candevice_t *candev);
+  int (* reset) (struct candevice_t *candev);
+  int (* init_hw_data) (struct candevice_t *candev);
+  int (* init_chip_data) (struct candevice_t *candev, int chipnr);
+  int (* init_obj_data) (struct canchip_t *chip, int objnr);
+  int (* program_irq) (struct candevice_t *candev);
+  void (* write_register) (unsigned data,unsigned long address);
+  unsigned (* read_register) (unsigned long address);
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>request_io</term>
+      <listitem><para>
+    reserve io or memory range for can board
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>release_io</term>
+      <listitem><para>
+    free reserved io memory range
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>reset</term>
+      <listitem><para>
+    hardware reset routine
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>init_hw_data</term>
+      <listitem><para>
+    called to initialize &amp;candevice_t structure, mainly 
+   <parameter>res_add</parameter>, <parameter>nr_all_chips</parameter>, <parameter>nr_82527_chips</parameter>, <parameter>nr_sja1000_chips</parameter>
+   and <parameter>flags</parameter> fields
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>init_chip_data</term>
+      <listitem><para>
+    called initialize each &amp;canchip_t structure, mainly
+   <parameter>chip_type</parameter>, <parameter>chip_base_addr</parameter>, <parameter>clock</parameter> and chip specific registers.
+   It is responsible to setup &amp;canchip_t-&gt;<parameter>chipspecops</parameter> functions
+   for non-standard chip types (type other than <quote>i82527</quote>, <quote>sja1000</quote> or <quote>sja1000p</quote>)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>init_obj_data</term>
+      <listitem><para>
+    called initialize each &amp;msgobj_t structure,
+   mainly <parameter>obj_base_addr</parameter> field.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>program_irq</term>
+      <listitem><para>
+    program interrupt generation hardware of the board
+   if flag <constant>PROGRAMMABLE_IRQ</constant> is present for specified device/board 
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>write_register</term>
+      <listitem><para>
+    low level write register routine
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>read_register</term>
+      <listitem><para>
+    low level read register routine
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-chipspecops-t">struct chipspecops_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct chipspecops_t</refname>
+ <refpurpose>
+      can controller chip specific operations
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct chipspecops_t {
+  int (* chip_config) (struct canchip_t *chip);
+  int (* baud_rate) (struct canchip_t *chip, int rate, int clock, int sjw,int sampl_pt, int flags);
+  int (* standard_mask) (struct canchip_t *chip, unsigned short code,unsigned short mask);
+  int (* extended_mask) (struct canchip_t *chip, unsigned long code,unsigned long mask);
+  int (* message15_mask) (struct canchip_t *chip, unsigned long code,unsigned long mask);
+  int (* clear_objects) (struct canchip_t *chip);
+  int (* config_irqs) (struct canchip_t *chip, short irqs);
+  int (* pre_read_config) (struct canchip_t *chip, struct msgobj_t *obj);
+  int (* pre_write_config) (struct canchip_t *chip, struct msgobj_t *obj,struct canmsg_t *msg);
+  int (* send_msg) (struct canchip_t *chip, struct msgobj_t *obj,struct canmsg_t *msg);
+  int (* remote_request) (struct canchip_t *chip, struct msgobj_t *obj);
+  int (* check_tx_stat) (struct canchip_t *chip);
+  int (* wakeup_tx) (struct canchip_t *chip, struct msgobj_t *obj);
+  int (* filtch_rq) (struct canchip_t *chip, struct msgobj_t *obj);
+  int (* enable_configuration) (struct canchip_t *chip);
+  int (* disable_configuration) (struct canchip_t *chip);
+  int (* set_btregs) (struct canchip_t *chip, unsigned short btr0,unsigned short btr1);
+  int (* attach_to_chip) (struct canchip_t *chip);
+  int (* release_chip) (struct canchip_t *chip);
+  int (* start_chip) (struct canchip_t *chip);
+  int (* stop_chip) (struct canchip_t *chip);
+  int (* irq_handler) (int irq, struct canchip_t *chip);
+  int (* irq_accept) (int irq, struct canchip_t *chip);
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>chip_config</term>
+      <listitem><para>
+    CAN chip configuration
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>baud_rate</term>
+      <listitem><para>
+    set communication parameters
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>standard_mask</term>
+      <listitem><para>
+    setup of mask for message filtering
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>extended_mask</term>
+      <listitem><para>
+    setup of extended mask for message filtering
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>message15_mask</term>
+      <listitem><para>
+    set mask of i82527 message object 15
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>clear_objects</term>
+      <listitem><para>
+    clears state of all message object residing in chip
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>config_irqs</term>
+      <listitem><para>
+    tunes chip hardware interrupt delivery
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pre_read_config</term>
+      <listitem><para>
+    prepares message object for message reception
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pre_write_config</term>
+      <listitem><para>
+    prepares message object for message transmission
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>send_msg</term>
+      <listitem><para>
+    initiate message transmission
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>remote_request</term>
+      <listitem><para>
+    configures message object and asks for RTR message
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>check_tx_stat</term>
+      <listitem><para>
+    checks state of transmission engine
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>wakeup_tx</term>
+      <listitem><para>
+    wakeup TX processing
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>filtch_rq</term>
+      <listitem><para>
+    optional routine for propagation of outgoing edges filters to HW
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>enable_configuration</term>
+      <listitem><para>
+    enable chip configuration mode
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>disable_configuration</term>
+      <listitem><para>
+    disable chip configuration mode
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>set_btregs</term>
+      <listitem><para>
+    configures bitrate registers
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>attach_to_chip</term>
+      <listitem><para>
+    attaches to the chip, setups registers and possibly state informations
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>release_chip</term>
+      <listitem><para>
+    called before chip structure removal if <constant>CHIP_ATTACHED</constant> is set
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>start_chip</term>
+      <listitem><para>
+    starts chip message processing
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>stop_chip</term>
+      <listitem><para>
+    stops chip message processing
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>irq_handler</term>
+      <listitem><para>
+    interrupt service routine
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>irq_accept</term>
+      <listitem><para>
+    optional fast irq accept routine responsible for blocking further interrupts
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+</refentry>
+
+  </section>
+  <section id="lincan-api-board" xreflabel="lincan-api-board">
+    <title>Board Support Functions</title>
+    <para>
+      The functions, which should be implemented for each supported board,
+      are described in the next section. The functions are prefixed
+      by boardname. The prefix <replaceable>template</replaceable> has
+      been selected for next description.
+    </para>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-request-io">template_request_io</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_request_io</refname>
+ <refpurpose>
+   reserve io or memory range for can board
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_request_io </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to candevice/board which asks for io. Field <parameter>io_addr</parameter>
+     of <parameter>candev</parameter> is used in most cases to define start of the range
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_request_io</function> is used to reserve the io-memory. If your
+   hardware uses a dedicated memory range as hardware control registers you
+   will have to add the code to reserve this memory as well. 
+   <constant>IO_RANGE</constant> is the io-memory range that gets reserved, please adjust according
+   your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+   #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-release-io">template_release_io</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_release_io</refname>
+ <refpurpose>
+      free reserved io memory range
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_release_io </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to candevice/board which releases io
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_release_io</function> is used to free reserved io-memory.
+   In case you have reserved more io memory, don't forget to free it here.
+   IO_RANGE is the io-memory range that gets released, please adjust according
+   your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+   #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-reset">template_reset</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_reset</refname>
+ <refpurpose>
+      hardware reset routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_reset </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      Pointer to candevice/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_reset</function> is used to give a hardware reset. This is 
+   rather hardware specific so I haven't included example code. Don't forget to 
+   check the reset status of the chip before returning.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-hw-data">template_init_hw_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_hw_data</refname>
+ <refpurpose>
+      Initialize hardware cards
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_hw_data </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      Pointer to candevice/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_hw_data</function> is used to initialize the hardware
+   structure containing information about the installed CAN-board.
+   <constant>RESET_ADDR</constant> represents the io-address of the hardware reset register.
+   <constant>NR_82527</constant> represents the number of Intel 82527 chips on the board.
+   <constant>NR_SJA1000</constant> represents the number of Philips sja1000 chips on the board.
+   The flags entry can currently only be <constant>CANDEV_PROGRAMMABLE_IRQ</constant> to indicate that
+   the hardware uses programmable interrupts.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-chip-data">template_init_chip_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_chip_data</refname>
+ <refpurpose>
+      Initialize chips
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_chip_data </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+   <paramdef>int <parameter>chipnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      Pointer to candevice/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chipnr</parameter></term>
+   <listitem>
+    <para>
+      Number of the CAN chip on the hardware card
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_chip_data</function> is used to initialize the hardware
+   structure containing information about the CAN chips.
+   <constant>CHIP_TYPE</constant> represents the type of CAN chip. <constant>CHIP_TYPE</constant> can be <quote>i82527</quote> or
+   <quote>sja1000</quote>.
+   The <parameter>chip_base_addr</parameter> entry represents the start of the 'official' memory map
+   of the installed chip. It's likely that this is the same as the <parameter>io_addr</parameter>
+   argument supplied at module loading time.
+   The <parameter>clock</parameter> entry holds the chip clock value in Hz.
+   The entry <parameter>sja_cdr_reg</parameter> holds hardware specific options for the Clock Divider
+   register. Options defined in the <constant>sja1000</constant>.h file:
+   <constant>sjaCDR_CLKOUT_MASK</constant>, <constant>sjaCDR_CLK_OFF</constant>, <constant>sjaCDR_RXINPEN</constant>, <constant>sjaCDR_CBP</constant>, <constant>sjaCDR_PELICAN</constant>
+   The entry <parameter>sja_ocr_reg</parameter> holds hardware specific options for the Output Control
+   register. Options defined in the <constant>sja1000</constant>.h file:
+   <constant>sjaOCR_MODE_BIPHASE</constant>, <constant>sjaOCR_MODE_TEST</constant>, <constant>sjaOCR_MODE_NORMAL</constant>, <constant>sjaOCR_MODE_CLOCK</constant>,
+   <constant>sjaOCR_TX0_LH</constant>, <constant>sjaOCR_TX1_ZZ</constant>.
+   The entry <parameter>int_clk_reg</parameter> holds hardware specific options for the Clock Out
+   register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iCLK_CD0</constant>, <constant>iCLK_CD1</constant>, <constant>iCLK_CD2</constant>, <constant>iCLK_CD3</constant>, <constant>iCLK_SL0</constant>, <constant>iCLK_SL1</constant>.
+   The entry <parameter>int_bus_reg</parameter> holds hardware specific options for the Bus 
+   Configuration register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iBUS_DR0</constant>, <constant>iBUS_DR1</constant>, <constant>iBUS_DT1</constant>, <constant>iBUS_POL</constant>, <constant>iBUS_CBY</constant>.
+   The entry <parameter>int_cpu_reg</parameter> holds hardware specific options for the cpu interface
+   register. Options defined in the <constant>i82527</constant>.h file:
+   <constant>iCPU_CEN</constant>, <constant>iCPU_MUX</constant>, <constant>iCPU_SLP</constant>, <constant>iCPU_PWD</constant>, <constant>iCPU_DMC</constant>, <constant>iCPU_DSC</constant>, <constant>iCPU_RST</constant>.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-init-obj-data">template_init_obj_data</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_init_obj_data</refname>
+ <refpurpose>
+      Initialize message buffers
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_init_obj_data </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>int <parameter>objnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      Pointer to chip specific structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>objnr</parameter></term>
+   <listitem>
+    <para>
+      Number of the message buffer
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_init_obj_data</function> is used to initialize the hardware
+   structure containing information about the different message objects on the
+   CAN chip. In case of the sja1000 there's only one message object but on the
+   i82527 chip there are 15.
+   The code below is for a i82527 chip and initializes the object base addresses
+   The entry <parameter>obj_base_addr</parameter> represents the first memory address of the message 
+   object. In case of the sja1000 <parameter>obj_base_addr</parameter> is taken the same as the chips
+   base address.
+   Unless the hardware uses a segmented memory map, flags can be set zero.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function always returns zero
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-program-irq">template_program_irq</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_program_irq</refname>
+ <refpurpose>
+      program interrupts
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>template_program_irq </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      Pointer to candevice/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_program_irq</function> is used for hardware that uses 
+   programmable interrupts. If your hardware doesn't use programmable interrupts
+   you should not set the <parameter>candevices_t</parameter>-&gt;flags entry to <constant>CANDEV_PROGRAMMABLE_IRQ</constant> and 
+   leave this function unedited. Again this function is hardware specific so 
+   there's no example code.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return value</title>
+ <para>
+    The function returns zero on success or <constant>-ENODEV</constant> on failure
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-write-register">template_write_register</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_write_register</refname>
+ <refpurpose>
+      Low level write register routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>template_write_register </function></funcdef>
+   <paramdef>unsigned <parameter>data</parameter></paramdef>
+   <paramdef>unsigned long <parameter>address</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>data</parameter></term>
+   <listitem>
+    <para>
+      data to be written
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>address</parameter></term>
+   <listitem>
+    <para>
+      memory address to write to
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_write_register</function> is used to write to hardware registers
+   on the CAN chip. You should only have to edit this function if your hardware
+   uses some specific write process.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function does not return a value
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-template-read-register">template_read_register</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>template_read_register</refname>
+ <refpurpose>
+      Low level read register routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>unsigned <function>template_read_register </function></funcdef>
+   <paramdef>unsigned long <parameter>address</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>address</parameter></term>
+   <listitem>
+    <para>
+      memory address to read from
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function <function>template_read_register</function> is used to read from hardware registers
+   on the CAN chip. You should only have to edit this function if your hardware
+   uses some specific read process.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns the value stored in <parameter>address</parameter>
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/template.c
+ </para>
+</refsect1>
+</refentry>
+
+  </section>
+  <section id="lincan-api-chip" xreflabel="lincan-api-chip">
+    <title>Chip Support Functions</title>
+    <para>
+      The controller chip specific functions are described in the next section.
+      The functions should be prefixed by chip type.
+      Because documentation of chip functions has been retrieved from
+      the actual SJA1000 PeliCAN support, the function prefix
+      is <replaceable>sja1000p</replaceable>.
+    </para>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-enable-configuration">sja1000p_enable_configuration</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_enable_configuration</refname>
+ <refpurpose>
+   enable chip configuration mode
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_enable_configuration </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-disable-configuration">sja1000p_disable_configuration</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_disable_configuration</refname>
+ <refpurpose>
+      disable chip configuration mode
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_disable_configuration </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-chip-config">sja1000p_chip_config</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_chip_config</refname>
+ <refpurpose>
+      can chip configuration
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_chip_config </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function configures chip and prepares it for message
+   transmission and reception. The function resets chip,
+   resets mask for acceptance of all messages by call to
+   <function>sja1000p_extended_mask</function> function and then 
+   computes and sets baudrate with use of function <function>sja1000p_baud_rate</function>.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-extended-mask">sja1000p_extended_mask</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_extended_mask</refname>
+ <refpurpose>
+      setup of extended mask for message filtering
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_extended_mask </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>unsigned long <parameter>code</parameter></paramdef>
+   <paramdef>unsigned long <parameter>mask</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>code</parameter></term>
+   <listitem>
+    <para>
+      can message acceptance code
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>mask</parameter></term>
+   <listitem>
+    <para>
+      can message acceptance mask
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-baud-rate">sja1000p_baud_rate</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_baud_rate</refname>
+ <refpurpose>
+      set communication parameters.
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_baud_rate </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>int <parameter>rate</parameter></paramdef>
+   <paramdef>int <parameter>clock</parameter></paramdef>
+   <paramdef>int <parameter>sjw</parameter></paramdef>
+   <paramdef>int <parameter>sampl_pt</parameter></paramdef>
+   <paramdef>int <parameter>flags</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>rate</parameter></term>
+   <listitem>
+    <para>
+      baud rate in Hz
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>clock</parameter></term>
+   <listitem>
+    <para>
+      frequency of sja1000 clock in Hz (ISA osc is 14318000)
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>sjw</parameter></term>
+   <listitem>
+    <para>
+      synchronization jump width (0-3) prescaled clock cycles
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>sampl_pt</parameter></term>
+   <listitem>
+    <para>
+      sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>flags</parameter></term>
+   <listitem>
+    <para>
+      fields <constant>BTR1_SAM</constant>, <constant>OCMODE</constant>, <constant>OCPOL</constant>, <constant>OCTP</constant>, <constant>OCTN</constant>, <constant>CLK_OFF</constant>, <constant>CBP</constant>
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-read">sja1000p_read</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_read</refname>
+ <refpurpose>
+      reads and distributes one or more received messages
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>sja1000p_read </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pinter to CAN message queue information
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-pre-read-config">sja1000p_pre_read_config</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_pre_read_config</refname>
+ <refpurpose>
+      prepares message object for message reception
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_pre_read_config </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to message object state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+   Positive value indicates immediate reception of message.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-pre-write-config">sja1000p_pre_write_config</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_pre_write_config</refname>
+ <refpurpose>
+      prepares message object for message transmission
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_pre_write_config </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+   <paramdef>struct canmsg_t * <parameter>msg</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to message object state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>msg</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function prepares selected message object for future initiation
+   of message transmission by <function>sja1000p_send_msg</function> function.
+   The CAN message data and message ID are transfered from <parameter>msg</parameter> slot
+   into chip buffer in this function.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-send-msg">sja1000p_send_msg</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_send_msg</refname>
+ <refpurpose>
+      initiate message transmission
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_send_msg </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+   <paramdef>struct canmsg_t * <parameter>msg</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to message object state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>msg</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function is called after <function>sja1000p_pre_write_config</function> function,
+   which prepares data in chip buffer.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-check-tx-stat">sja1000p_check_tx_stat</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_check_tx_stat</refname>
+ <refpurpose>
+      checks state of transmission engine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_check_tx_stat </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+   Positive return value indicates transmission under way status.
+   Zero value indicates finishing of all issued transmission requests.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-set-btregs">sja1000p_set_btregs</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_set_btregs</refname>
+ <refpurpose>
+       configures bitrate registers
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_set_btregs </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>unsigned short <parameter>btr0</parameter></paramdef>
+   <paramdef>unsigned short <parameter>btr1</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>btr0</parameter></term>
+   <listitem>
+    <para>
+      bitrate register 0
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>btr1</parameter></term>
+   <listitem>
+    <para>
+      bitrate register 1
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-start-chip">sja1000p_start_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_start_chip</refname>
+ <refpurpose>
+       starts chip message processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_start_chip </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-stop-chip">sja1000p_stop_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_stop_chip</refname>
+ <refpurpose>
+       stops chip message processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_stop_chip </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-attach-to-chip">sja1000p_attach_to_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_attach_to_chip</refname>
+ <refpurpose>
+      attaches to the chip, setups registers and state
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_attach_to_chip </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-release-chip">sja1000p_release_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_release_chip</refname>
+ <refpurpose>
+      called before chip structure removal if <constant>CHIP_ATTACHED</constant> is set
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_release_chip </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-remote-request">sja1000p_remote_request</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_remote_request</refname>
+ <refpurpose>
+      configures message object and asks for RTR message
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_remote_request </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to message object structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-standard-mask">sja1000p_standard_mask</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_standard_mask</refname>
+ <refpurpose>
+      setup of mask for message filtering
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_standard_mask </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>unsigned short <parameter>code</parameter></paramdef>
+   <paramdef>unsigned short <parameter>mask</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>code</parameter></term>
+   <listitem>
+    <para>
+      can message acceptance code
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>mask</parameter></term>
+   <listitem>
+    <para>
+      can message acceptance mask
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-clear-objects">sja1000p_clear_objects</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_clear_objects</refname>
+ <refpurpose>
+      clears state of all message object residing in chip
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_clear_objects </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-config-irqs">sja1000p_config_irqs</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_config_irqs</refname>
+ <refpurpose>
+      tunes chip hardware interrupt delivery
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_config_irqs </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>short <parameter>irqs</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>irqs</parameter></term>
+   <listitem>
+    <para>
+      requested chip IRQ configuration
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-irq-write-handler">sja1000p_irq_write_handler</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_irq_write_handler</refname>
+ <refpurpose>
+      part of ISR code responsible for transmit events
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>sja1000p_irq_write_handler </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to attached queue description
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The main purpose of this function is to read message from attached queues
+   and transfer message contents into CAN controller chip.
+   This subroutine is called by
+   <function>sja1000p_irq_write_handler</function> for transmit events.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-irq-handler">sja1000p_irq_handler</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_irq_handler</refname>
+ <refpurpose>
+      interrupt service routine
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_irq_handler </function></funcdef>
+   <paramdef>int <parameter>irq</parameter></paramdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>irq</parameter></term>
+   <listitem>
+    <para>
+      interrupt vector number, this value is system specific
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Interrupt handler is activated when state of CAN controller chip changes,
+   there is message to be read or there is more space for new messages or
+   error occurs. The receive events results in reading of the message from
+   CAN controller chip and distribution of message through attached
+   message queues.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-wakeup-tx">sja1000p_wakeup_tx</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_wakeup_tx</refname>
+ <refpurpose>
+      wakeups TX processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_wakeup_tx </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip state structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to message object structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function is responsible for initiating message transmition.
+   It is responsible for clearing of object TX_REQUEST flag
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    negative value reports error.
+ </para>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/sja1000p.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-sja1000p-fill-chipspecops">sja1000p_fill_chipspecops</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>sja1000p_fill_chipspecops</refname>
+ <refpurpose>
+      fills chip specific operations
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>sja1000p_fill_chipspecops </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to chip representation structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function fills chip specific operations for sja1000 (PeliCAN) chip.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+  </section>
+  <section id="lincan-api-queues" xreflabel="lincan-api-queues">
+    <title>CAN Queues Common Structures and Functions</title>
+    <para>
+      This part of the driver implements basic CAN queues infrastructure.
+      It is written as much generic as possible and then specialization for each
+      category of CAN queues clients is implemented in separate subsystem.
+      The only synchronization mechanism required from target system 
+      are spin-lock synchronization and atomic bit manipulation.
+      Locked sections are narrowed to the short operations.
+      Even can message 8 bytes movement is excluded from the locked 
+      sections of the code.
+    </para>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canque-slot-t">struct canque_slot_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canque_slot_t</refname>
+ <refpurpose>
+   one CAN message slot in the CAN FIFO queue 
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canque_slot_t {
+  struct canque_slot_t * next;
+  unsigned long slot_flags;
+  struct canmsg_t msg;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>next</term>
+      <listitem><para>
+ pointer to the next/younger slot
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>slot_flags</term>
+      <listitem><para>
+ space for flags and optional command describing action
+associated with slot data
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>msg</term>
+      <listitem><para>
+ space for one CAN message
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This structure is used to store CAN messages in the CAN FIFO queue.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canque-fifo-t">struct canque_fifo_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canque_fifo_t</refname>
+ <refpurpose>
+      CAN FIFO queue representation
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canque_fifo_t {
+  unsigned long fifo_flags;
+  unsigned long error_code;
+  struct canque_slot_t * head;
+  struct canque_slot_t ** tail;
+  struct canque_slot_t * flist;
+  struct canque_slot_t * entry;
+  can_spinlock_t fifo_lock;
+  int slotsnr;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>fifo_flags</term>
+      <listitem><para>
+    this field holds global flags describing state of the FIFO.
+   <constant>CAN_FIFOF_ERROR</constant> is set when some error condition occurs.
+   <constant>CAN_FIFOF_ERR2BLOCK</constant> defines, that error should lead to the FIFO block state.
+   <constant>CAN_FIFOF_BLOCK</constant> state blocks insertion of the next messages. 
+   <constant>CAN_FIFOF_OVERRUN</constant> attempt to acquire new slot, when FIFO is full. 
+   <constant>CAN_FIFOF_FULL</constant> indicates FIFO full state. 
+   <constant>CAN_FIFOF_EMPTY</constant> indicates no allocated slot in the FIFO.
+   <constant>CAN_FIFOF_DEAD</constant> condition indication. Used when FIFO is beeing destroyed.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>error_code</term>
+      <listitem><para>
+    futher description of error condition
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>head</term>
+      <listitem><para>
+    pointer to the FIFO head, oldest slot
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>tail</term>
+      <listitem><para>
+    pointer to the location, where pointer to newly inserted slot
+   should be added
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>flist</term>
+      <listitem><para>
+    pointer to list of the free slots associated with queue
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>entry</term>
+      <listitem><para>
+    pointer to the memory allocated for the list slots.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>fifo_lock</term>
+      <listitem><para>
+    the lock to ensure atomicity of slot manipulation operations.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>slotsnr</term>
+      <listitem><para>
+     number of allocated slots
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This structure represents CAN FIFO queue. It is implemented as 
+   a single linked list of slots prepared for processing. The empty slots
+   are stored in single linked list (<parameter>flist</parameter>).
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-get-inslot">canque_fifo_get_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_get_inslot</refname>
+ <refpurpose>
+      allocate slot for the input of one CAN message 
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_get_inslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+   <paramdef>int <parameter>cmd</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      pointer to location to store pointer to the allocated slot.
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>cmd</parameter></term>
+   <listitem>
+    <para>
+      optional command associated with allocated slot.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function returns negative value if there is no
+   free slot in the FIFO queue.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-put-inslot">canque_fifo_put_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_put_inslot</refname>
+ <refpurpose>
+      releases slot to further processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_put_inslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the slot previously acquired by <function>canque_fifo_get_inslot</function>.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The nonzero return value indicates, that the queue was empty
+   before call to the function. The caller should wake-up output side of the queue.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-abort-inslot">canque_fifo_abort_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_abort_inslot</refname>
+ <refpurpose>
+      release and abort slot
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_abort_inslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the slot previously acquired by <function>canque_fifo_get_inslot</function>.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The nonzero value indicates, that fifo was full
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-test-outslot">canque_fifo_test_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_test_outslot</refname>
+ <refpurpose>
+      test and get ready slot from the FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_test_outslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      pointer to location to store pointer to the oldest slot from the FIFO.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The negative value indicates, that queue is empty.
+   The positive or zero value represents command stored into slot by
+   the call to the function <function>canque_fifo_get_inslot</function>.
+   The successfully acquired FIFO output slot has to be released by
+   the call <function>canque_fifo_free_outslot</function> or <function>canque_fifo_again_outslot</function>.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-free-outslot">canque_fifo_free_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_free_outslot</refname>
+ <refpurpose>
+      free processed FIFO slot
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_free_outslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the slot previously acquired by <function>canque_fifo_test_outslot</function>.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The returned value informs about FIFO state change.
+   The mask <constant>CAN_FIFOF_FULL</constant> indicates, that the FIFO was full before
+   the function call. The mask <constant>CAN_FIFOF_EMPTY</constant> informs, that last ready slot
+   has been processed.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-again-outslot">canque_fifo_again_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_again_outslot</refname>
+ <refpurpose>
+      interrupt and postpone processing of the slot
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_again_outslot </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the slot previously acquired by <function>canque_fifo_test_outslot</function>.
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The function cannot fail..
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canque-edge-t">struct canque_edge_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canque_edge_t</refname>
+ <refpurpose>
+      CAN message delivery subsystem graph edge
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canque_edge_t {
+  struct canque_fifo_t fifo;
+  unsigned long filtid;
+  unsigned long filtmask;
+  struct list_head inpeers;
+  struct list_head outpeers;
+  struct list_head activepeers;
+  struct canque_ends_t * inends;
+  struct canque_ends_t * outends;
+  atomic_t edge_used;
+  int edge_prio;
+  int edge_num;
+#ifdef CAN_WITH_RTL
+  struct list_head pending_peers;
+  unsigned long pending_inops;
+  unsigned long pending_outops;
+#endif
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>fifo</term>
+      <listitem><para>
+    place where primitive <parameter>struct</parameter> canque_fifo_t FIFO is located.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>filtid</term>
+      <listitem><para>
+    the possible CAN message identifiers filter.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>filtmask</term>
+      <listitem><para>
+    the filter mask, the comparison considers only
+   <parameter>filtid</parameter> bits corresponding to set bits in the <parameter>filtmask</parameter> field.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>inpeers</term>
+      <listitem><para>
+    the lists of all peers FIFOs connected by their
+   input side (<parameter>inends</parameter>) to the same terminal (<parameter>struct</parameter> canque_ends_t).
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>outpeers</term>
+      <listitem><para>
+    the lists of all peers FIFOs connected by their
+   output side (<parameter>outends</parameter>) to the same terminal (<parameter>struct</parameter> canque_ends_t).
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>activepeers</term>
+      <listitem><para>
+    the lists of peers FIFOs connected by their
+   output side (<parameter>outends</parameter>) to the same terminal (<parameter>struct</parameter> canque_ends_t)
+   with same priority and active state.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>inends</term>
+      <listitem><para>
+    the pointer to the FIFO input side terminal (<parameter>struct</parameter> canque_ends_t).
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>outends</term>
+      <listitem><para>
+    the pointer to the FIFO output side terminal (<parameter>struct</parameter> canque_ends_t).
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>edge_used</term>
+      <listitem><para>
+    the atomic usage counter, mainly used for safe destruction of the edge.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>edge_prio</term>
+      <listitem><para>
+    the assigned queue priority from the range 0 to <constant>CANQUEUE_PRIO_NR-1</constant>
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>edge_num</term>
+      <listitem><para>
+    edge sequential number intended for debugging purposes only
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pending_peers</term>
+      <listitem><para>
+    edges with pending delayed events (RTL-&gt;Linux calls)
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pending_inops</term>
+      <listitem><para>
+    bitmask of pending operations
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>pending_outops</term>
+      <listitem><para>
+    bitmask of pending operations
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This structure represents one direction connection from messages source 
+   (<parameter>inends</parameter>) to message consumer (<parameter>outends</parameter>) fifo ends hub. The edge contains
+   &amp;struct canque_fifo_t for message fifo implementation.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-struct-canque-ends-t">struct canque_ends_t</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>struct canque_ends_t</refname>
+ <refpurpose>
+      CAN message delivery subsystem graph vertex (FIFO ends)
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <programlisting>
+struct canque_ends_t {
+  unsigned long ends_flags;
+  struct list_head active[CANQUEUE_PRIO_NR];
+  struct list_head idle;
+  struct list_head inlist;
+  struct list_head outlist;
+  can_spinlock_t ends_lock;
+  void (* notify) (struct canque_ends_t *qends, struct canque_edge_t *qedge, int what);
+  void * context;
+  union {} endinfo;
+  struct list_head dead_peers;
+};  </programlisting>
+</refsynopsisdiv>
+ <refsect1>
+  <title>Members</title>
+  <variablelist>
+    <varlistentry>      <term>ends_flags</term>
+      <listitem><para>
+    this field holds flags describing state of the ENDS structure.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>active[CANQUEUE_PRIO_NR]</term>
+      <listitem><para>
+    the array of the lists of active edges directed to the ends structure
+   with ready messages. The array is indexed by the edges priorities. 
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>idle</term>
+      <listitem><para>
+    the list of the edges directed to the ends structure with empty FIFOs.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>inlist</term>
+      <listitem><para>
+    the list of outgoing edges input sides.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>outlist</term>
+      <listitem><para>
+    the list of all incoming edges output sides. Each of there edges
+   is listed on one of <parameter>active</parameter> or <parameter>idle</parameter> lists.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>ends_lock</term>
+      <listitem><para>
+    the lock synchronizing operations between threads accessing
+   same ends structure.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>notify</term>
+      <listitem><para>
+    pointer to notify procedure. The next state changes are notified.
+   <constant>CANQUEUE_NOTIFY_EMPTY</constant> (out-&gt;in call) - all slots are processed by FIFO out side. 
+   <constant>CANQUEUE_NOTIFY_SPACE</constant> (out-&gt;in call) - full state negated =&gt; there is space for new message.
+   <constant>CANQUEUE_NOTIFY_PROC</constant>  (in-&gt;out call) - empty state negated =&gt; out side is requested to process slots.
+   <constant>CANQUEUE_NOTIFY_NOUSR</constant> (both) - notify, that the last user has released the edge usage
+   called with some lock to prevent edge disappear.
+   <constant>CANQUEUE_NOTIFY_DEAD</constant>  (both) - edge is in progress of deletion.
+   <constant>CANQUEUE_NOTIFY_ATACH</constant> (both) - new edge has been attached to end.
+   <constant>CANQUEUE_NOTIFY_FILTCH</constant> (out-&gt;in call) - edge filter rules changed
+   <constant>CANQUEUE_NOTIFY_ERROR</constant>  (out-&gt;in call) - error in messages processing.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>context</term>
+      <listitem><para>
+    space to store ends user specific information
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>endinfo</term>
+      <listitem><para>
+    space to store some other ends usage specific informations
+   mainly for waking-up by the notify calls.
+      </para></listitem>
+    </varlistentry>
+    <varlistentry>      <term>dead_peers</term>
+      <listitem><para>
+    used to chain ends wanting for postponed destruction
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+ </refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Structure represents place to connect edges to for CAN communication entity.
+   The zero, one or more incoming and outgoing edges can be connected to
+   this structure.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-notify-inends">canque_notify_inends</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_notify_inends</refname>
+ <refpurpose>
+      request to send notification to the input ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_notify_inends </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-notify-outends">canque_notify_outends</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_notify_outends</refname>
+ <refpurpose>
+      request to send notification to the output ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_notify_outends </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-notify-bothends">canque_notify_bothends</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_notify_bothends</refname>
+ <refpurpose>
+      request to send notification to the both ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_notify_bothends </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-activate-edge">canque_activate_edge</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_activate_edge</refname>
+ <refpurpose>
+      mark output end of the edge as active
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_activate_edge </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>inends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>inends</parameter></term>
+   <listitem>
+    <para>
+      input side of the edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function call moves output side of the edge from idle onto active edges
+   list. This function has to be called with edge reference count held.
+   that is same as for most of other edge functions.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-filtid2internal">canque_filtid2internal</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_filtid2internal</refname>
+ <refpurpose>
+      converts message ID and filter flags into internal format
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>unsigned int <function>canque_filtid2internal </function></funcdef>
+   <paramdef>unsigned long <parameter>id</parameter></paramdef>
+   <paramdef>int <parameter>filtflags</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>id</parameter></term>
+   <listitem>
+    <para>
+      CAN message 11 or 29 bit identifier
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>filtflags</parameter></term>
+   <listitem>
+    <para>
+      CAN message flags
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function maps message ID and <constant>MSG_RTR</constant>, <constant>MSG_EXT</constant> and <constant>MSG_LOCAL</constant> into one 32 bit number
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-edge-incref">canque_edge_incref</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_edge_incref</refname>
+ <refpurpose>
+      increments edge reference count
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_edge_incref </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>edge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>edge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-edge-decref">canque_edge_decref</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_edge_decref</refname>
+ <refpurpose>
+      decrements edge reference count
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canque_edge_decref </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>edge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>edge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function has to be called without lock held for both ends of edge.
+   If reference count drops to 0, function <function>canque_edge_do_dead</function>
+   is called.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-flush-slots">canque_fifo_flush_slots</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_flush_slots</refname>
+ <refpurpose>
+   free all ready slots from the FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_flush_slots </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The caller should be prepared to handle situations, when some
+   slots are held by input or output side slots processing.
+   These slots cannot be flushed or their processing interrupted.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The nonzero value indicates, that queue has not been
+   empty before the function call.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-init-slots">canque_fifo_init_slots</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_init_slots</refname>
+ <refpurpose>
+      initializes slot chain of one CAN FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_init_slots </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The negative value indicates, that there is no memory
+   to allocate space for the requested number of the slots.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-inslot">canque_get_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_inslot</refname>
+ <refpurpose>
+      finds one outgoing edge and allocates slot from it
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_inslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+   <paramdef>int <parameter>cmd</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to  allocated slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>cmd</parameter></term>
+   <listitem>
+    <para>
+      command type for slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function looks for the first non-blocked outgoing edge in <parameter>qends</parameter> structure
+   and tries to allocate slot from it.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    If there is no usable edge or there is no free slot in edge
+   negative value is returned.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-inslot4id">canque_get_inslot4id</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_inslot4id</refname>
+ <refpurpose>
+      finds best outgoing edge and slot for given ID
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_inslot4id </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+   <paramdef>int <parameter>cmd</parameter></paramdef>
+   <paramdef>unsigned long <parameter>id</parameter></paramdef>
+   <paramdef>int <parameter>prio</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to  allocated slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>cmd</parameter></term>
+   <listitem>
+    <para>
+      command type for slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>id</parameter></term>
+   <listitem>
+    <para>
+      communication ID of message to send into edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>prio</parameter></term>
+   <listitem>
+    <para>
+      optional priority of message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function looks for the non-blocked outgoing edge accepting messages
+   with given ID. If edge is found, slot is allocated from that edge.
+   The edges with non-zero mask are preferred over edges open to all messages.
+   If more edges with mask accepts given message ID, the edge with
+   highest priority below or equal to required priority is selected.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    If there is no usable edge or there is no free slot in edge
+   negative value is returned.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-put-inslot">canque_put_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_put_inslot</refname>
+ <refpurpose>
+      schedules filled slot for processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_put_inslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge slot belong to
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the prepared slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Puts slot previously acquired by <function>canque_get_inslot</function> or <function>canque_get_inslot4id</function>
+   function call into FIFO queue and activates edge processing if needed.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Positive value informs, that activation of output end
+   has been necessary
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-abort-inslot">canque_abort_inslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_abort_inslot</refname>
+ <refpurpose>
+      aborts preparation of the message in the slot
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_abort_inslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge slot belong to
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the previously allocated slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Frees slot previously acquired by <function>canque_get_inslot</function> or <function>canque_get_inslot4id</function>
+   function call. Used when message copying into slot fails.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Positive value informs, that queue full state has been negated.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-filter-msg2edges">canque_filter_msg2edges</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_filter_msg2edges</refname>
+ <refpurpose>
+      sends message into all edges which accept its ID
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_filter_msg2edges </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canmsg_t * <parameter>msg</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>msg</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Sends message to all outgoing edges connected to the given ends, which accepts
+   message communication ID.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Returns number of edges message has been send to
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-test-outslot">canque_test_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_test_outslot</refname>
+ <refpurpose>
+      test and retrieve ready slot for given ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_test_outslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to received slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function takes highest priority active incoming edge and retrieves
+   oldest ready slot from it.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs, that there is no ready output
+   slot for given ends. Positive value is equal to the command
+   slot has been allocated by the input side.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-free-outslot">canque_free_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_free_outslot</refname>
+ <refpurpose>
+      frees processed output slot
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_free_outslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge slot belong to
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the processed slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function releases processed slot previously acquired by <function>canque_test_outslot</function>
+   function call.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Return value informs if input side has been notified
+   to know about change of edge state
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-again-outslot">canque_again_outslot</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_again_outslot</refname>
+ <refpurpose>
+      reschedule output slot to process it again later
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_again_outslot </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>struct canque_slot_t * <parameter>slot</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge slot belong to
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slot</parameter></term>
+   <listitem>
+    <para>
+      pointer to the slot for re-processing
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Function reschedules slot previously acquired by <function>canque_test_outslot</function>
+   function call for second time processing.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Function cannot fail.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-set-filt">canque_set_filt</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_set_filt</refname>
+ <refpurpose>
+      sets filter for specified edge
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_set_filt </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>unsigned long <parameter>filtid</parameter></paramdef>
+   <paramdef>unsigned long <parameter>filtmask</parameter></paramdef>
+   <paramdef>int <parameter>filtflags</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>filtid</parameter></term>
+   <listitem>
+    <para>
+      ID to set for the edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>filtmask</parameter></term>
+   <listitem>
+    <para>
+      mask used for ID match check
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>filtflags</parameter></term>
+   <listitem>
+    <para>
+      required filer flags
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value is returned if edge is in the process of delete.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-flush">canque_flush</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_flush</refname>
+ <refpurpose>
+      fluesh all ready slots in the edge
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_flush </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to the edge
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Tries to flush all allocated slots from the edge, but there could
+   exist some slots associated to edge which are processed by input
+   or output side and cannot be flushed at this moment.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The nonzero value indicates, that queue has not been
+   empty before the function call.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-init-gen">canqueue_ends_init_gen</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_init_gen</refname>
+ <refpurpose>
+      subsystem independent routine to initialize ends state
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_init_gen </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Cannot fail.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-connect-edge">canqueue_connect_edge</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_connect_edge</refname>
+ <refpurpose>
+      connect edge between two communication entities
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_connect_edge </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>struct canque_ends_t * <parameter>inends</parameter></paramdef>
+   <paramdef>struct canque_ends_t * <parameter>outends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>inends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends the input of the edge should be connected to
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>outends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends the output of the edge should be connected to
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs about failed operation.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-disconnect-edge">canqueue_disconnect_edge</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_disconnect_edge</refname>
+ <refpurpose>
+      disconnect edge from communicating entities
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_disconnect_edge </function></funcdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to edge
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value means, that edge is used by somebody
+   other and cannot be disconnected. Operation has to be delayed.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-block-inlist">canqueue_block_inlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_block_inlist</refname>
+ <refpurpose>
+      block slot allocation of all outgoing edges of specified ends  
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_block_inlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-block-outlist">canqueue_block_outlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_block_outlist</refname>
+ <refpurpose>
+      block slot allocation of all incoming edges of specified ends  
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_block_outlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-kill-inlist">canqueue_ends_kill_inlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_kill_inlist</refname>
+ <refpurpose>
+      sends request to die to all outgoing edges
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_kill_inlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>int <parameter>send_rest</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>send_rest</parameter></term>
+   <listitem>
+    <para>
+      select, whether already allocated slots should be processed
+     by FIFO output side
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Non-zero value means, that not all edges could be immediately
+   disconnected and that ends structure memory release has to be delayed
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-kill-outlist">canqueue_ends_kill_outlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_kill_outlist</refname>
+ <refpurpose>
+      sends request to die to all incoming edges
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_kill_outlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Non-zero value means, that not all edges could be immediately
+   disconnected and that ends structure memory release has to be delayed
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-filt-conjuction">canqueue_ends_filt_conjuction</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_filt_conjuction</refname>
+ <refpurpose>
+      computes conjunction of incoming edges filters filters
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_filt_conjuction </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canfilt_t * <parameter>filt</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>filt</parameter></term>
+   <listitem>
+    <para>
+      pointer the filter structure filled by computed filters conjunction
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Number of incoming edges
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-flush-inlist">canqueue_ends_flush_inlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_flush_inlist</refname>
+ <refpurpose>
+      flushes all messages in incoming edges
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_flush_inlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs about unsuccessful result
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-flush-outlist">canqueue_ends_flush_outlist</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_flush_outlist</refname>
+ <refpurpose>
+      flushes all messages in outgoing edges
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_flush_outlist </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs about unsuccessful result
+ </para>
+</refsect1>
+</refentry>
+
+  </section>
+  <section>
+    <title>CAN Queues Kernel Specific Functions</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-notify-kern">canqueue_notify_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_notify_kern</refname>
+ <refpurpose>
+   notification callback handler for Linux userspace clients
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_notify_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the callback side ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge which invoked notification 
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The notification event is handled directly by call of this function except case,
+   when called from RT-Linux context in mixed mode Linux/RT-Linux compilation.
+   It is not possible to directly call Linux kernel synchronization primitives
+   in such case. The notification request is postponed and signaled by <parameter>pending_inops</parameter> flags
+   by call <function>canqueue_rtl2lin_check_and_pend</function> function. 
+   The edge reference count is increased until until all pending notifications are processed.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-init-kern">canqueue_ends_init_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_init_kern</refname>
+ <refpurpose>
+      Linux userspace clients specific ends initialization
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_init_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the callback side ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-inslot4id-wait-kern">canque_get_inslot4id_wait_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_inslot4id_wait_kern</refname>
+ <refpurpose>
+      find or wait for best outgoing edge and slot for given ID
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_inslot4id_wait_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+   <paramdef>int <parameter>cmd</parameter></paramdef>
+   <paramdef>unsigned long <parameter>id</parameter></paramdef>
+   <paramdef>int <parameter>prio</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to  allocated slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>cmd</parameter></term>
+   <listitem>
+    <para>
+      command type for slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>id</parameter></term>
+   <listitem>
+    <para>
+      communication ID of message to send into edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>prio</parameter></term>
+   <listitem>
+    <para>
+      optional priority of message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Same as <function>canque_get_inslot4id</function>, except, that it waits for free slot
+   in case, that queue is full. Function is specific for Linux userspace clients.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    If there is no usable edge negative value is returned.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-outslot-wait-kern">canque_get_outslot_wait_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_outslot_wait_kern</refname>
+ <refpurpose>
+      receive or wait for ready slot for given ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_outslot_wait_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to received slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The same as <function>canque_test_outslot</function>, except it waits in the case, that there is
+   no ready slot for given ends. Function is specific for Linux userspace clients.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs, that there is no ready output
+   slot for given ends. Positive value is equal to the command
+   slot has been allocated by the input side.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-sync-wait-kern">canque_sync_wait_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_sync_wait_kern</refname>
+ <refpurpose>
+      wait for all slots processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_sync_wait_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to edge
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Functions waits for ends transition into empty state.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Positive value indicates, that edge empty state has been reached.
+   Negative or zero value informs about interrupted wait or other problem.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-init-kern">canque_fifo_init_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_init_kern</refname>
+ <refpurpose>
+      initialize one CAN FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_init_kern </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>int <parameter>slotsnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotsnr</parameter></term>
+   <listitem>
+    <para>
+      number of requested slots
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The negative value indicates, that there is no memory
+   to allocate space for the requested number of the slots.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-done-kern">canque_fifo_done_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_done_kern</refname>
+ <refpurpose>
+      frees slots allocated for CAN FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_done_kern </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-new-edge-kern">canque_new_edge_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_new_edge_kern</refname>
+ <refpurpose>
+      allocate new edge structure in the Linux kernel context
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>struct canque_edge_t * <function>canque_new_edge_kern </function></funcdef>
+   <paramdef>int <parameter>slotsnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>slotsnr</parameter></term>
+   <listitem>
+    <para>
+      required number of slots in the newly allocated edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Returns pointer to allocated slot structure or <constant>NULL</constant> if
+   there is not enough memory to process operation.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-dispose-kern">canqueue_ends_dispose_kern</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_dispose_kern</refname>
+ <refpurpose>
+      finalizing of the ends structure for Linux kernel clients
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_dispose_kern </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>int <parameter>sync</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>sync</parameter></term>
+   <listitem>
+    <para>
+      flag indicating, that user wants to wait for processing of all remaining
+     messages
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Function should be designed such way to not fail.
+ </para>
+</refsect1>
+</refentry>
+
+  </section>
+  <section>
+    <title>CAN Queues RT-Linux Specific Functions</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-rtl2lin-check-and-pend">canqueue_rtl2lin_check_and_pend</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_rtl2lin_check_and_pend</refname>
+ <refpurpose>
+   postpones edge notification if called from RT-Linux 
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_rtl2lin_check_and_pend </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      notification target ends
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge delivering notification
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+       notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    if called from Linux context, returns 0 and lefts notification processing
+   on caller responsibility. If called from RT-Linux contexts, schedules postponed
+   event delivery and returns 1
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-inslot4id-wait-rtl">canque_get_inslot4id_wait_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_inslot4id_wait_rtl</refname>
+ <refpurpose>
+      find or wait for best outgoing edge and slot for given ID
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_inslot4id_wait_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+   <paramdef>int <parameter>cmd</parameter></paramdef>
+   <paramdef>unsigned long <parameter>id</parameter></paramdef>
+   <paramdef>int <parameter>prio</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to  allocated slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>cmd</parameter></term>
+   <listitem>
+    <para>
+      command type for slot
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>id</parameter></term>
+   <listitem>
+    <para>
+      communication ID of message to send into edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>prio</parameter></term>
+   <listitem>
+    <para>
+      optional priority of message
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Same as <function>canque_get_inslot4id</function>, except, that it waits for free slot
+   in case, that queue is full. Function is specific for Linux userspace clients.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    If there is no usable edge negative value is returned.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-get-outslot-wait-rtl">canque_get_outslot_wait_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_get_outslot_wait_rtl</refname>
+ <refpurpose>
+      receive or wait for ready slot for given ends
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_get_outslot_wait_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t ** <parameter>qedgep</parameter></paramdef>
+   <paramdef>struct canque_slot_t ** <parameter>slotp</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedgep</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to found edge
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotp</parameter></term>
+   <listitem>
+    <para>
+      place to store pointer to received slot
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The same as <function>canque_test_outslot</function>, except it waits in the case, that there is
+   no ready slot for given ends. Function is specific for Linux userspace clients.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Negative value informs, that there is no ready output
+   slot for given ends. Positive value is equal to the command
+   slot has been allocated by the input side.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-sync-wait-rtl">canque_sync_wait_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_sync_wait_rtl</refname>
+ <refpurpose>
+      wait for all slots processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_sync_wait_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      ends structure belonging to calling communication object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      pointer to edge
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Functions waits for ends transition into empty state.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Positive value indicates, that edge empty state has been reached.
+   Negative or zero value informs about interrupted wait or other problem.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-init-rtl">canque_fifo_init_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_init_rtl</refname>
+ <refpurpose>
+      initialize one CAN FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_init_rtl </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+   <paramdef>int <parameter>slotsnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>slotsnr</parameter></term>
+   <listitem>
+    <para>
+      number of requested slots
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    The negative value indicates, that there is no memory
+   to allocate space for the requested number of the slots.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-fifo-done-rtl">canque_fifo_done_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_fifo_done_rtl</refname>
+ <refpurpose>
+      frees slots allocated for CAN FIFO
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canque_fifo_done_rtl </function></funcdef>
+   <paramdef>struct canque_fifo_t * <parameter>fifo</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>fifo</parameter></term>
+   <listitem>
+    <para>
+      pointer to the FIFO structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canque-new-edge-rtl">canque_new_edge_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canque_new_edge_rtl</refname>
+ <refpurpose>
+      allocate new edge structure in the RT-Linux context
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>struct canque_edge_t * <function>canque_new_edge_rtl </function></funcdef>
+   <paramdef>int <parameter>slotsnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>slotsnr</parameter></term>
+   <listitem>
+    <para>
+      required number of slots in the newly allocated edge structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Returns pointer to allocated slot structure or <constant>NULL</constant> if
+   there is not enough memory to process operation.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-notify-rtl">canqueue_notify_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_notify_rtl</refname>
+ <refpurpose>
+      notification callback handler for Linux userspace clients
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_notify_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the callback side ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge which invoked notification 
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-init-rtl">canqueue_ends_init_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_init_rtl</refname>
+ <refpurpose>
+      RT-Linux clients specific ends initialization
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_init_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the callback side ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-dispose-rtl">canqueue_ends_dispose_rtl</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_dispose_rtl</refname>
+ <refpurpose>
+      finalizing of the ends structure for Linux kernel clients
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_dispose_rtl </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>int <parameter>sync</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>sync</parameter></term>
+   <listitem>
+    <para>
+      flag indicating, that user wants to wait for processing of all remaining
+     messages
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Function should be designed such way to not fail.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-rtl-initialize">canqueue_rtl_initialize</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_rtl_initialize</refname>
+ <refpurpose>
+      initialization of global RT-Linux specific features
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_rtl_initialize </function></funcdef>
+   <paramdef> <parameter>void</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>void</parameter></term>
+   <listitem>
+    <para>
+     no arguments
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-rtl-done">canqueue_rtl_done</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_rtl_done</refname>
+ <refpurpose>
+      finalization of glopal RT-Linux specific features
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_rtl_done </function></funcdef>
+   <paramdef> <parameter>void</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>void</parameter></term>
+   <listitem>
+    <para>
+     no arguments
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+  </section>
+  <section>
+    <title>CAN Queues CAN Chips Specific Functions</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-notify-chip">canqueue_notify_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_notify_chip</refname>
+ <refpurpose>
+   notification callback handler for CAN chips ends of queues
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canqueue_notify_chip </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canque_edge_t * <parameter>qedge</parameter></paramdef>
+   <paramdef>int <parameter>what</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the callback side ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>qedge</parameter></term>
+   <listitem>
+    <para>
+      edge which invoked notification 
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>what</parameter></term>
+   <listitem>
+    <para>
+      notification type
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function has to deal with more possible cases. It can be called from
+   the kernel or interrupt context for Linux only compilation of driver.
+   The function can be called from kernel context or RT-Linux thread context
+   for mixed mode Linux/RT-Linux compilation.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-init-chip">canqueue_ends_init_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_init_chip</refname>
+ <refpurpose>
+      CAN chip specific ends initialization
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_init_chip </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to the ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to the corresponding CAN chip structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to the corresponding message object structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canqueue-ends-done-chip">canqueue_ends_done_chip</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canqueue_ends_done_chip</refname>
+ <refpurpose>
+      finalizing of the ends structure for CAN chips
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>canqueue_ends_done_chip </function></funcdef>
+   <paramdef>struct canque_ends_t * <parameter>qends</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>qends</parameter></term>
+   <listitem>
+    <para>
+      pointer to ends structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    Function should be designed such way to not fail.
+ </para>
+</refsect1>
+</refentry>
+
+  </section>
+  <section>
+    <title>CAN Boards and Chip Setup specific Functions</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-checked-malloc">can_checked_malloc</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_checked_malloc</refname>
+ <refpurpose>
+   memory allocation with registering of requested blocks
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void * <function>can_checked_malloc </function></funcdef>
+   <paramdef>size_t <parameter>size</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>size</parameter></term>
+   <listitem>
+    <para>
+      size of the requested block
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function is used in the driver initialization phase to catch possible memory
+   leaks for future driver finalization or case, that driver initialization fail.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    pointer to the allocated memory or NULL in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-checked-free">can_checked_free</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_checked_free</refname>
+ <refpurpose>
+      free memory allocated by  <function>can_checked_malloc</function>
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_checked_free </function></funcdef>
+   <paramdef>void * <parameter>address_p</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>address_p</parameter></term>
+   <listitem>
+    <para>
+      pointer to the memory block
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-del-mem-list">can_del_mem_list</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_del_mem_list</refname>
+ <refpurpose>
+      check for stale memory allocations at driver finalization
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_del_mem_list </function></funcdef>
+   <paramdef> <parameter>void</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>void</parameter></term>
+   <listitem>
+    <para>
+     no arguments
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   </para><para>
+
+   Checks, if there are still some memory blocks allocated and releases memory
+   occupied by such blocks back to the system
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-request-io-region">can_request_io_region</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_request_io_region</refname>
+ <refpurpose>
+      request IO space region
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_request_io_region </function></funcdef>
+   <paramdef>unsigned long <parameter>start</parameter></paramdef>
+   <paramdef>unsigned long <parameter>n</parameter></paramdef>
+   <paramdef>const char * <parameter>name</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>start</parameter></term>
+   <listitem>
+    <para>
+      the first IO port address
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>n</parameter></term>
+   <listitem>
+    <para>
+      number of the consecutive IO port addresses
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>name</parameter></term>
+   <listitem>
+    <para>
+      name/label for the requested region
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function hides system specific implementation of the feature.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns positive value (1) in the case, that region could
+   be reserved for the driver. Returns zero (0) if there is collision with
+   other driver or region cannot be taken for some other reason.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-release-io-region">can_release_io_region</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_release_io_region</refname>
+ <refpurpose>
+      release IO space region
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>can_release_io_region </function></funcdef>
+   <paramdef>unsigned long <parameter>start</parameter></paramdef>
+   <paramdef>unsigned long <parameter>n</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>start</parameter></term>
+   <listitem>
+    <para>
+      the first IO port address
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>n</parameter></term>
+   <listitem>
+    <para>
+      number of the consecutive IO port addresses
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-request-mem-region">can_request_mem_region</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_request_mem_region</refname>
+ <refpurpose>
+      request memory space region
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_request_mem_region </function></funcdef>
+   <paramdef>unsigned long <parameter>start</parameter></paramdef>
+   <paramdef>unsigned long <parameter>n</parameter></paramdef>
+   <paramdef>const char * <parameter>name</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>start</parameter></term>
+   <listitem>
+    <para>
+      the first memory port physical address
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>n</parameter></term>
+   <listitem>
+    <para>
+      number of the consecutive memory port addresses
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>name</parameter></term>
+   <listitem>
+    <para>
+      name/label for the requested region
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function hides system specific implementation of the feature.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns positive value (1) in the case, that region could
+   be reserved for the driver. Returns zero (0) if there is collision with
+   other driver or region cannot be taken for some other reason.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-release-mem-region">can_release_mem_region</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_release_mem_region</refname>
+ <refpurpose>
+      release memory space region
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>can_release_mem_region </function></funcdef>
+   <paramdef>unsigned long <parameter>start</parameter></paramdef>
+   <paramdef>unsigned long <parameter>n</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>start</parameter></term>
+   <listitem>
+    <para>
+      the first memory port physical address
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>n</parameter></term>
+   <listitem>
+    <para>
+      number of the consecutive memory port addresses
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-base-addr-fixup">can_base_addr_fixup</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_base_addr_fixup</refname>
+ <refpurpose>
+      relocates board physical memory addresses to the CPU accessible ones
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_base_addr_fixup </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+   <paramdef>unsigned long <parameter>new_base</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to the previously filled device/board, chips and message objects structures
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>new_base</parameter></term>
+   <listitem>
+    <para>
+      <parameter>candev</parameter> new base address
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   This function adapts base addresses of all structures of one board
+   to the new board base address.
+   It is required for translation between physical and virtual address mappings.
+   This function is prepared to simplify board specific <function>xxx_request_io</function> function
+   for memory mapped devices.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-check-dev-taken">can_check_dev_taken</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_check_dev_taken</refname>
+ <refpurpose>
+      checks if bus device description is already taken by driver
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_check_dev_taken </function></funcdef>
+   <paramdef>void * <parameter>anydev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>anydev</parameter></term>
+   <listitem>
+    <para>
+       pointer to bus specific Linux device description 
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Returns</title>
+ <para>
+    Returns 1 if device is already used by LinCAN driver, 0 otherwise.
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-register-obj-struct">register_obj_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>register_obj_struct</refname>
+ <refpurpose>
+      registers message object into global array
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>register_obj_struct </function></funcdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+   <paramdef>int <parameter>minorbase</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      the initialized message object being registered
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>minorbase</parameter></term>
+   <listitem>
+    <para>
+      wanted minor number, if (-1) automatically selected
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-register-chip-struct">register_chip_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>register_chip_struct</refname>
+ <refpurpose>
+      registers chip into global array
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>register_chip_struct </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+   <paramdef>int <parameter>minorbase</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      the initialized chip structure being registered
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>minorbase</parameter></term>
+   <listitem>
+    <para>
+      wanted minor number base, if (-1) automatically selected
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-init-hw-struct">init_hw_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>init_hw_struct</refname>
+ <refpurpose>
+      initializes driver hardware description structures
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>init_hw_struct </function></funcdef>
+   <paramdef> <parameter>void</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>void</parameter></term>
+   <listitem>
+    <para>
+     no arguments
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   </para><para>
+
+   The function <function>init_hw_struct</function> is used to initialize the hardware structure.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-init-device-struct">init_device_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>init_device_struct</refname>
+ <refpurpose>
+      initializes single CAN device/board
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>init_device_struct </function></funcdef>
+   <paramdef>int <parameter>card</parameter></paramdef>
+   <paramdef>int * <parameter>chan_param_idx_p</parameter></paramdef>
+   <paramdef>int * <parameter>irq_param_idx_p</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>card</parameter></term>
+   <listitem>
+    <para>
+      index into <parameter>hardware_p</parameter> HW description
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chan_param_idx_p</parameter></term>
+   <listitem>
+    <para>
+      pointer to the index into arrays of the CAN channel parameters
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>irq_param_idx_p</parameter></term>
+   <listitem>
+    <para>
+      pointer to the index into arrays of the per CAN channel IRQ parameters
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function builds representation of the one board from parameters provided
+ </para>
+</refsect1>
+<refsect1>
+ <title>in the module parameters arrays</title>
+ <para>
+    
+   <parameter>hw</parameter>[card] .. hardware type,
+   <parameter>io</parameter>[card] .. base IO address,
+   <parameter>baudrate</parameter>[chan_param_idx] .. per channel baudrate,
+   <parameter>minor</parameter>[chan_param_idx] .. optional specification of requested channel minor base,
+   <parameter>irq</parameter>[irq_param_idx] .. one or more board/chips IRQ parameters.
+   The indexes are advanced after consumed parameters if the registration is successful.
+   </para><para>
+
+   The hardware specific operations of the device/board are initialized by call to
+   <function>init_hwspecops</function> function. Then board data are initialized by board specific 
+   <function>init_hw_data</function> function. Then chips and objects representation is build by
+   <function>init_chip_struct</function> function. If all above steps are successful, chips and
+   message objects are registered into global arrays. 
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-init-chip-struct">init_chip_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>init_chip_struct</refname>
+ <refpurpose>
+      initializes one CAN chip structure
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>init_chip_struct </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+   <paramdef>int <parameter>chipnr</parameter></paramdef>
+   <paramdef>int <parameter>irq</parameter></paramdef>
+   <paramdef>long <parameter>baudrate</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to the corresponding CAN device/board
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>chipnr</parameter></term>
+   <listitem>
+    <para>
+      index of the chip in the corresponding device/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>irq</parameter></term>
+   <listitem>
+    <para>
+      chip IRQ number or (-1) if not appropriate
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>baudrate</parameter></term>
+   <listitem>
+    <para>
+      baudrate in the units of 1Bd
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   Chip structure is allocated and chip specific operations are filled by 
+   call to board specific <function>init_chip_data</function> which calls chip specific
+   <function>fill_chipspecops</function>. The message objects are generated by 
+   calls to <function>init_obj_struct</function> function.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-init-obj-struct">init_obj_struct</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>init_obj_struct</refname>
+ <refpurpose>
+      initializes one CAN message object structure
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>init_obj_struct </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+   <paramdef>struct canchip_t * <parameter>hostchip</parameter></paramdef>
+   <paramdef>int <parameter>objnr</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to the corresponding CAN device/board
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>hostchip</parameter></term>
+   <listitem>
+    <para>
+      pointer to the chip containing this object
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>objnr</parameter></term>
+   <listitem>
+    <para>
+      index of the builded object in the chip structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function initializes message object structure and allocates and initializes
+   CAN queue chip ends structure.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-init-hwspecops">init_hwspecops</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>init_hwspecops</refname>
+ <refpurpose>
+      finds and initializes board/device specific operations
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>init_hwspecops </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+   <paramdef>int * <parameter>irqnum_p</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to the corresponding CAN device/board
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>irqnum_p</parameter></term>
+   <listitem>
+    <para>
+      optional pointer to the number of interrupts required by board
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Description</title>
+ <para>
+   The function searches board <parameter>hwname</parameter> in the list of supported boards types.
+   The board type specific <function>board_register</function> function is used to initialize
+   <parameter>hwspecops</parameter> operations.
+ </para>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-default-irq-dispatch">can_default_irq_dispatch</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_default_irq_dispatch</refname>
+ <refpurpose>
+      the first level interrupt dispatch handler
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>can_irqreturn_t <function>can_default_irq_dispatch </function></funcdef>
+   <paramdef>int <parameter>irq</parameter></paramdef>
+   <paramdef>void * <parameter>dev_id</parameter></paramdef>
+   <paramdef>struct pt_regs * <parameter>regs</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>irq</parameter></term>
+   <listitem>
+    <para>
+      interrupt vector number, this value is system specific
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>dev_id</parameter></term>
+   <listitem>
+    <para>
+      driver private pointer registered at time of <function>request_irq</function> call.
+     The CAN driver uses this pointer to store relationship of interrupt
+     to chip state structure - <parameter>struct</parameter> canchip_t
+    </para>
+   </listitem>
+  </varlistentry>
+  <varlistentry>
+   <term><parameter>regs</parameter></term>
+   <listitem>
+    <para>
+      system dependent value pointing to registers stored in exception frame
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>File</title>
+ <para>
+    src/setup.c
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-chip-setup-irq">can_chip_setup_irq</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_chip_setup_irq</refname>
+ <refpurpose>
+      attaches chip to the system interrupt processing
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>int <function>can_chip_setup_irq </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN chip structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+<refsect1>
+ <title>Return Value</title>
+ <para>
+    returns negative number in the case of fail
+ </para>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-can-chip-free-irq">can_chip_free_irq</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>can_chip_free_irq</refname>
+ <refpurpose>
+      unregisters chip interrupt handler from the system
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>can_chip_free_irq </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN chip structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+  </section>
+  <section>
+    <title>CAN Boards and Chip Finalization Functions</title>
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-msgobj-done">msgobj_done</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>msgobj_done</refname>
+ <refpurpose>
+   destroys one CAN message object
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>msgobj_done </function></funcdef>
+   <paramdef>struct msgobj_t * <parameter>obj</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>obj</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN message object structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canchip-done">canchip_done</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canchip_done</refname>
+ <refpurpose>
+      destroys one CAN chip representation
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canchip_done </function></funcdef>
+   <paramdef>struct canchip_t * <parameter>chip</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>chip</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN chip structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-candevice-done">candevice_done</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>candevice_done</refname>
+ <refpurpose>
+      destroys representation of one CAN device/board
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>candevice_done </function></funcdef>
+   <paramdef>struct candevice_t * <parameter>candev</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>candev</parameter></term>
+   <listitem>
+    <para>
+      pointer to CAN device/board structure
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+<refentry>
+<refmeta>
+<refentrytitle><phrase id="API-canhardware-done">canhardware_done</phrase></refentrytitle>
+</refmeta>
+<refnamediv>
+ <refname>canhardware_done</refname>
+ <refpurpose>
+      destroys representation of all CAN devices/boards
+ </refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <title>Synopsis</title>
+  <funcsynopsis><funcprototype>
+   <funcdef>void <function>canhardware_done </function></funcdef>
+   <paramdef>struct canhardware_t * <parameter>canhw</parameter></paramdef>
+  </funcprototype></funcsynopsis>
+</refsynopsisdiv>
+<refsect1>
+ <title>Arguments</title>
+ <variablelist>
+  <varlistentry>
+   <term><parameter>canhw</parameter></term>
+   <listitem>
+    <para>
+      pointer to the root of all CAN hardware representation
+    </para>
+   </listitem>
+  </varlistentry>
+ </variablelist>
+</refsect1>
+</refentry>
+
+  </section>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_intro.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_intro.xml
new file mode 100644 (file)
index 0000000..1c0dbe1
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan_intro">
+  <title>Introduction</title>
+  <para>
+  The LinCAN driver is the loadable module for the Linux kernel which
+  implements CAN driver. The driver communicates and controls one or
+  more CAN controllers chips. Each chip/CAN interface is represented to
+  the applications as one or more CAN message objects accessible as
+  character devices. The application can open the character device and
+  use <function>read</function>/<function>write</function> system calls
+  for CAN messages transmission or reception through the connected message
+  object. The parameters of the message object can be modified by the
+  <function>IOCTL</function> system call. The closing of the
+  character device releases resources allocated by the application. The
+  present version of the driver supports three most common CAN
+  controllers:</para>
+  <itemizedlist>
+    <listitem>
+      <para>Intel i82527 chips</para>
+    </listitem>
+    <listitem>
+      <para>Philips 82c200 chips</para>
+    </listitem>
+    <listitem>
+      <para>Philips SJA1000 chips in standard and PeliCAN mode</para>
+    </listitem>
+  </itemizedlist>
+
+  <para>The intelligent CAN/CANopen cards should be supported by
+  in the near future. One of such cards is P-CAN series of cards produced by
+  Unicontrols. The driver contains support for more than ten CAN cards
+  basic types with different combinations of the above mentioned chips.
+  Not all card types are held by OCERA members, but CTU has and tested
+  more SJA1000 type cards and will test some i82527 cards in near
+  future.</para>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_summary.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_summary.xml
new file mode 100644 (file)
index 0000000..7485d9d
--- /dev/null
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section>
+<title>Summary</title>
+
+  <variablelist>
+    <varlistentry>
+      <term>Name of the component</term>
+
+      <listitem>
+        <para>Linux CAN Driver (LINCAN)</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Author</term>
+
+      <listitem>
+        <para><author><firstname>Pavel</firstname> <surname>Pisa</surname></author></para>
+
+        <para><author><firstname>Arnaud</firstname> <surname>Westenberg</surname></author></para>
+
+        <para><author><firstname>Tomasz</firstname> <surname>Motylewski</surname></author></para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Maintainer</term>
+
+      <listitem>
+        <para><author>
+          <firstname>Pavel</firstname><surname>Pisa</surname>
+          <affiliation>
+            <address>E-mail: <email>pisa@cmp.felk.cvut.cz</email></address>
+            <address>WWW: <otheraddr><ulink url="http://cmp.felk.cvut.cz/~pisa"></ulink></otheraddr></address>
+          </affiliation>
+        </author></para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>LinCAN Internet resources</term>
+
+      <listitem>
+        <para><ulink url="http://www.ocera.org"></ulink> OCERA project home page</para>
+
+        <para><ulink url="http://sourceforge.net/projects/ocera"></ulink>
+        OCERA SourceForge project page. The OCERA CVS relative path to LinCAN
+        driver sources is</para>
+        <para><ulink url="http://cvs.sourceforge.net/viewcvs.py/ocera/ocera/components/comm/can/lincan/">
+        <filename>ocera/components/comm/can/lincan</filename></ulink>.</para>
+
+        <para><ulink url="http://cmp.felk.cvut.cz/~pisa/can"></ulink> local testing directory</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Reviewer</term>
+
+      <listitem>
+        <para>The previous driver versions were tested by more users. The
+        actual version has been tested at CTU by more OCERA developers,
+        by Unicontrols and  by BFAD GmbH, which use pre-OCERA and current
+        version of the driver in their products.</para>
+
+        <itemizedlist>
+          <title>List of the cards tested with latest version of the driver:</title>
+          <listitem>
+            <para>PC104 Advantech PCM3680 dual channel board on 2.4 RT-Linux enabled kernel</para>
+          </listitem>
+          <listitem>
+            <para>PiKRON ISA card on 2.4.and 2.6 Linux kernels</para>
+          </listitem>
+          <listitem>
+            <para>BfaD DIMM PC card on 2.4 RT-Linux enabled kernel</para>
+          </listitem>
+          <listitem>
+            <para>KVASER pcican-q on 2.6 Linux kernel and on 2.4 RT-Linux enabled kernel</para>
+          </listitem>
+          <listitem>
+            <para>virtual board tested on all systems as well</para>
+          </listitem>
+        </itemizedlist>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Supported layers</term>
+      <listitem>
+        <itemizedlist>
+          <listitem>
+            <para>High-level available</para>
+            <para>Linux device interface available for soft real-time Linux only
+            and for mixed-mode RT-Linux/Linux driver compilation</para>
+          </listitem>
+          <listitem>
+            <para>Low-level available</para>
+            <para>RT-Linux device is registered only for mixed-mode RT-Linux/Linux driver
+            compilation. The driver messages transmition and receiption runs in hard real-time
+            threads in such case.</para>
+          </listitem>
+        </itemizedlist>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Version</term>
+
+      <listitem>
+        <para>lincan-0.3</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Status</term>
+
+      <listitem>
+        <para>Beta</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Dependencies</term>
+
+      <listitem>
+        <para>The driver requires CAN interface hardware for access to real CAN bus.</para>
+        <para>Driver can be used even without hardware if a virtual board is configured.
+        This setup is useful for testing of interworking of other CAN components.</para>
+
+        <para>Linux kernels from 2.2.x, 2.4.x and 2.6.x series are fully
+        supported.</para>
+
+        <para>The RT-Linux version 3.2 or OCERA RT-Linux enabled system is required
+        for hard real-time use.</para>
+
+        <para>The RT-Linux version requires RT-Linux <function>malloc</function>,
+        which is part of OCERA RT-Linux version and can be downloaded for
+        older RT-Linux versions .</para>
+
+        <para>The use of VCA API library is suggested for seamless
+        application transitions between driver kinds and versions.</para>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Supported hardware (some not tested)</term>
+
+      <listitem>
+        <itemizedlist>
+          <listitem>
+            <para>Advantech PC-104 PCM3680 dual channel board</para>
+          </listitem>
+          <listitem>
+            <para>PiKRON ISA card</para>
+          </listitem>
+          <listitem>
+            <para>BfaD DIMM PC card</para>
+          </listitem>
+          <listitem>
+            <para>KVASER PCIcan-Q, PCIcan-D, PCIcan-S</para>
+          </listitem>
+          <listitem>
+            <para>KVASER PCcan-Q, PCcan-D, PCcan-S, PCcan-F</para>
+          </listitem>
+          <listitem>
+            <para>MPL AG PIP5, PIP6, PIP7, PIP8</para>
+          </listitem>
+          <listitem>
+            <para>NSI PC-104 board CAN104</para>
+          </listitem>
+          <listitem>
+            <para>Contemporary Controls PC-104 board CAN104</para>
+          </listitem>
+          <listitem>
+            <para>Arcom Control Systems PC-104 board AIM104CAN</para>
+          </listitem>
+          <listitem>
+            <para>IXXAT ISA board PC-I03</para>
+          </listitem>
+          <listitem>
+            <para>SECO PC-104 board M436</para>
+          </listitem>
+          <listitem>
+            <para>Board support template sources for yet unsupported hardware</para>
+          </listitem>
+          <listitem>
+            <para>Virtual board</para>
+          </listitem>
+        </itemizedlist>
+      </listitem>
+    </varlistentry>
+
+    <varlistentry>
+      <term>Release date</term>
+
+      <listitem>
+        <para>February 2004</para>
+      </listitem>
+    </varlistentry>
+  </variablelist>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/lincan_usage.xml b/lincan-0.3.3/doc/lincandoc/lincan/lincan_usage.xml
new file mode 100644 (file)
index 0000000..a08521c
--- /dev/null
@@ -0,0 +1,461 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section id="lincan-usage">
+  <title>LinCAN Usage Information</title>
+
+  <section>
+    <title>Installation Prerequisites</title>
+
+    <para>The next basic conditions are necessary for the LinCAN driver
+    usage</para>
+
+    <itemizedlist>
+      <listitem>
+        <para>some of supported types of CAN interface boards (high or
+        low speed). Not required for <emphasis>virtual</emphasis> board setup.</para>
+      </listitem>
+      <listitem>
+        <para>cables and at least one device compatible with the board or
+        the second computer with an another CAN interface board.
+        Not required for <emphasis>virtual</emphasis> board setup.
+        Even more clients can communicate each with another if
+        <emphasis>process local</emphasis> is enabled for real chip driver.</para>
+      </listitem>
+      <listitem>
+        <para>working Linux system with any recent 2.6.x, 2.4.x or 2.2.x kernel
+        (successfully tested on 2.4.18, 2.4.22, 2.2.19, 2.2.20, 2.2.22, 2.6.0
+        kernels) or working setup for kernel cross-compilation</para>
+      </listitem>
+      <listitem>
+        <para>installed native and or target specific development tools
+        (GCC and binutils) and pre-configured kernel sources
+        corresponding to the running kernel or intended target for
+        cross-compilation</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>Every non-archaic Linux distribution should provide good
+    starting point for the LinCAN driver installation.</para>
+
+    <para>If mixed mode compilation for Linux/RT-Linux is required, additional
+    conditions has to be fulfilled:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>RT-Linux version 3.2 or higher is required and RT-Linux enabled
+        Linux kernel sources and configuration has to be prepared.
+        The recommended is use of OCERA Linux/RT-Linux release
+        (<ulink url="http://www.ocera.org"></ulink>).</para>
+      </listitem>
+      <listitem>
+        <para>RT-Linux real-time <function>malloc</function> support. It is already
+        included in the OCERA release. It can be downloaded from OCERA web site
+        for older RT-Linux releases as well
+        (<ulink url="http://www.ocera.org/download/components/index.html"></ulink>).</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>The RT-Linux specific Makefiles infrastructure is not distributed
+    with the current standard LinCAN distribution yet. Please, download full OCERA-CAN package
+    or retrieve sources from CVS by next command:</para>
+    <programlisting>
+    cvs -d:pserver:anonymous@cvs.ocera.sourceforge.net:/cvsroot/ocera login
+    cvs -z3 -d:pserver:anonymous@cvs.ocera.sourceforge.net:/cvsroot/ocera co ocera/components/comm/can
+    </programlisting>
+
+  </section>
+
+  <section>
+    <title>Quick Installation Instructions</title>
+
+    <para>Change current directory into the LinCAN driver source root
+    directory <programlisting>cd lincan-dir</programlisting>invoke make
+    utility. Just type &#39;<command>make</command>&#39; at the command
+    line and driver should compile without errors<programlisting>make</programlisting></para>
+
+    <para>If there is problem with compilation, look at first lines
+    produced by &#39;make&#39; command or store make output in file.
+    More about possible problems and more complex compilation examples
+    is in the next subsection.</para>
+
+    <para>Install built LinCAN driver object file (<filename>can.o</filename>)
+    into Linux kernel loadable module directory (<filename>/lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/kernel/drivers/char</filename>).
+    This and next commands needs root privileges to proceed
+    successfully.<programlisting>make install</programlisting>If device
+    filesystem (devfs) is not used on the computer, device nodes have to
+    be created manually.<programlisting>
+    mknod -m666 /dev/can0 c 91 0
+    mknod -m666 /dev/can1 c 91 1
+    ...
+    mknod -m666 /dev/can7 c 97 7
+    </programlisting></para>
+
+    <para>The parameters, IO address and interrupt line of inserted CAN
+    interface card need to be determined and configured. The manual
+    driver load can be invoked from the command line with parameters
+    similar to example below
+    <programlisting>
+    insmod can.o hw=pip5 irq=4 io=0x8000
+    </programlisting>This commands loads module with selected
+    one card support for PIP5 board type with IO port base address
+    <constant>0x8000</constant> and interrupt line <constant>4</constant>.
+    The full description of module parameters is in the next subsection.
+    If module starts correctly utilities from <filename>utils</filename>
+    subdirectory can be used to test CAN message interchange with device
+    or another computer. The parameters should be written into file
+    <filename>/etc/modules.conf </filename>for subsequent module startup
+    by modprobe command.</para>
+
+    <para>Line added to file <filename>/etc/modules.conf</filename>
+    follows<programlisting>options can hw=pip5 irq=4 io=0x8000</programlisting>The
+    module dependencies should be updated by command
+    <programlisting>depmod -a</programlisting>The driver can be now stopped and started by
+    simple <command>modprobe</command> command
+    <programlisting>modprobe -r can modprobe can</programlisting></para>
+  </section>
+
+  <section>
+    <title>Installation instructions</title>
+
+    <para>The LinCAN make solutions tries to fully automate native
+    kernel out of tree module compilation. Make system recurses through
+    kernel <filename>Makefile</filename> to achieve selection of right
+    preprocessor, compiler and linker directives. The description of
+    make targets after make invocation in driver top directory follows</para>
+
+    <variablelist>
+      <varlistentry>
+        <term>lincan-drv/Makefile (all)</term>
+
+        <listitem>
+          <para>LinCAN driver top makefile</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>lincan-drv/src/Makefile (default or all -&#62;
+        make_this_module)</term>
+
+        <listitem>
+          <para>Needs to resolve target system kernel sources location.
+          This can be selected manually by uncommenting the
+          <filename>Makefile</filename> definition <command>KERNEL_LOCATION=/usr/src/linux-2.2.22</command>.
+          The default behavior is to find the running kernel version and
+          look for path to sources of found kernel version in
+          <filename>/lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/build</filename>
+          directory. If no such directory exists, older version of
+          kernel is assumed and makefile tries the <filename>/usr/src/linux</filename>
+          directory.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>lib/modules/2.<replaceable>x</replaceable>.<replaceable>y</replaceable>/build/Makefile
+        <envar>SUBDIRS</envar>=.../lincan-drv/src (modules)</term>
+
+        <listitem>
+          <para>The kernel supplied <filename>Makefile</filename> is
+          responsible for defining of right defines for preprocessor,
+          compiler and linker. If the Linux kernel is cross-compiled,
+          Linux kernel sources root <filename>Makefile</filename> needs
+          be edited before Linux kernel compilation. The variable
+          <envar>CROSS_COMPILE</envar> should contain development
+          tool-chain prefix, for example <command>arm-linux-</command>.
+          The Linux kernel make process recurses back into LinCAN driver
+          <filename>src/Makefile</filename>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>lincan-drv/src/Makefile (modules)</term>
+
+        <listitem>
+          <para>This pass starts real LinCAN driver build actions.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <para>If there is problem with automatic build process, the next
+    commands can help to diagnose the problem.</para>
+
+    <para><programlisting>make clean make &#62;make.out 2&#62;&#38;1</programlisting></para>
+
+    <para>The first lines of file <filename>make.out</filename>
+    indicates auto-detected values and can help with resolving of
+    possible problems.</para>
+
+    <screen>
+    make -C src default ;
+    make -C utils default ;
+    make[1]: /scripts/pathdown.sh: Command not found
+    make[1]: Entering directory `/usr/src/can-0.7.1-pi3.4/src&#39;
+    echo &#62;.supported_cards.h echo \#define ENABLE_CARD_pip 1 &#62;&#62;.supported_cards.h ; ...
+    Linux kernel version 2.4.19
+    echo Linux kernel sources /lib/modules/2.4.19/build
+    Linux kernel sources /lib/modules/2.4.19/build
+    echo Module target can.o
+    Module target can.o
+    echo Module objects proc.o pip.o pccan.o smartcan.o nsi.o ...
+    make[2]: Entering directory `/usr/src/linux-2.4.19&#39;</screen>
+
+    <para>The driver size can be decreased by restricting of number of
+    supported types of boards. This can be done by editing of definition
+    for <envar>SUPPORTED_CARDS</envar> variable.</para>
+
+    <para>There is complete description of driver supported parameters.
+    <programlisting>
+    insmod can.o hw=<replaceable>&#39;your hardware&#39;</replaceable> irq=<replaceable>&#39;irq number&#39;</replaceable> io=<replaceable>&#39;io address&#39;</replaceable> <replaceable>&#60;more options&#62;</replaceable>
+    </programlisting>
+    </para>
+    <para>The more values can be specified for <parameter>hw</parameter>,
+    <parameter>irq</parameter> and <parameter>io</parameter> parameters
+    if more cards is used. Values are separated by commas in such case.
+    The <parameter>hw</parameter> argument can be one of:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para><option>pip5</option>, for the PIP5 computer by MPL AG</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pip6</option>, for the PIP6 computer by MPL AG</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pip7</option>, for the PIP7 computer by MPL AG</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pip8</option>, for the PIP8 computer by MPL AG</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pccan-q</option>, for the PCcan-Q ISA card by
+        KVASER</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pccan-f</option>, for the PCcan-F ISA card by
+        KVASER</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pccan-s</option>, for the PCcan-S ISA card by
+        KVASER</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pccan-d</option>, for the PCcan-D ISA card by
+        KVASER</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pcican-q</option>, for the PCIcan-Q PCI card by KVASER (4x SJA1000)</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pcican-d</option>, for the PCIcan-D PCI card by KVASER (2x SJA1000)</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pcican-s</option>, for the PCIcan-S PCI card by KVASER (1x SJA1000)</para>
+      </listitem>
+
+      <listitem>
+        <para><option>nsican</option>, for the CAN104 PC/104 card by NSI</para>
+      </listitem>
+
+      <listitem>
+        <para><option>cc104</option>, for the CAN104 PC/104 card by
+        Contemporary Controls</para>
+      </listitem>
+
+      <listitem>
+        <para><option>aim104</option>, for the AIM104CAN PC/104 card by
+        Arcom Control Systems </para>
+      </listitem>
+
+      <listitem>
+        <para><option>pc-i03</option>, for the PC-I03 ISA card by IXXAT</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pcm3680</option>, for the PCM-3680 PC/104 card by
+        Advantech </para>
+      </listitem>
+
+      <listitem>
+        <para><option>m437</option>, for the M436 PC/104 card by SECO</para>
+      </listitem>
+
+      <listitem>
+        <para><option>bfadcan</option> for sja1000 CAN embedded card
+        made by BFAD GmbH</para>
+      </listitem>
+
+      <listitem>
+        <para><option>pikronisa</option> for ISA memory mapped sja1000
+        CAN card made by PiKRON Ltd.</para>
+      </listitem>
+
+      <listitem>
+        <para><option>template</option>, for yet unsupported hardware
+        (you need to edit <filename>src/template.c</filename>)</para>
+      </listitem>
+      <listitem>
+        <para><option>virtual</option>, virtual/dummy board support for testing
+        of driver and software devices and applications</para>
+      </listitem>
+    </itemizedlist>
+
+    <para>The lists of values for board hardware type (<parameter>hw</parameter>)
+    and board base IO address (<parameter>io</parameter>)  parameters have to contain
+    same number of values. If the value of <parameter>io</parameter> has no meaning
+    for specified hardware type (<option>virtual</option> or PCI board), it has
+    to be substituted by <option>0</option>.</para>
+    <para>The number of required <parameter>irq</parameter> values per board is variable.
+    The <option>virtual</option> and PCI board demands no value, most of the other
+    boards requires one <parameter>irq</parameter> value per each chip/channel.</para>
+
+    <para>The <parameter>&#60;more options&#62;</parameter> can be one
+    or more of:</para>
+
+    <itemizedlist>
+      <listitem>
+        <para><parameter>major</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        major specifies the major number of the driver. Default value is 91</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>minor</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        you can specify which base minor number the driver should use for
+        each can channel/chip. Consecutive numbers are taken in the case, that
+        chip supports more communication objects. The values for channels
+        are separated by comas</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>extended</parameter>=<replaceable>[</replaceable>1<replaceable>|</replaceable>0<replaceable>]</replaceable>,
+        enables automatic switching to extended format if ID>2047, selects extended frames reception for i82527</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>pelican</parameter>=<replaceable>[</replaceable>1<replaceable>|</replaceable>0<replaceable>]</replaceable>,
+        unused parameter, PeliCAN used by default for sja1000p chips now</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>baudrate</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        baudrate for each channel in step of 1kBd </para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>clock_freq</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        the frequency of the CAN quartz for BfaD board</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>stdmask</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        default standard mask for some (i82527) chips</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>extmask</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        default extended mask for some (i82527) chips</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>mo15mask</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        sets the mask for message object 15 (i82527 only)</para>
+      </listitem>
+
+      <listitem>
+        <para><parameter>processlocal</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        select post-processing/loop-back of transmitted messages</para>
+        <para>0 .. disabled</para>
+        <para>1 .. can be enabled by application by FIFO filter setup</para>
+        <para>2 .. enabled by default</para>
+      </listitem>
+      <listitem>
+        <para><parameter>can_rtl_priority</parameter>=<replaceable>&#60;nr&#62;</replaceable>,
+        select priority of chip worker thread for driver compiled with RT-Linux support</para>
+      </listitem>
+    </itemizedlist>
+    <para>Actual list of supported CAN module parameters and short description can be
+    reached by invocation of the command <programlisting>modinfo can</programlisting>.
+    </para>
+  </section>
+
+  <section id="lincan-utils">
+    <title>Simple Utilities</title>
+    <para>The simple test utilities can be found in the <filename>utils</filename>
+    subdirectory of the LinCAN driver source subtree. These utilities can
+    be used as base for user programs directly communicating with the LinCAN
+    driver. We do not suggest to build applications directly dependent on
+    the driver operating system specific interface. We suggest to use the VCA
+    API library for communication with the driver which brings higher level of
+    system interface abstraction and ensures compatibility with the future
+    versions of LinCAN driver and RT-Linux driver clone versions.
+    The actual low level RT-Linux API to LinCAN driver closely matches
+    <function>open</function>/<function>close</function>,
+    <function>read</function>/<function>write</function> and <function>ioctl</function>
+    interface. Only <function>select</function> cannot be provided directly
+    by RT-Linux API.</para>
+
+    <para>The basic utilities provided with LinCAN driver are:</para>
+
+    <variablelist>
+      <varlistentry>
+        <term>rxtx</term>
+
+        <listitem>
+          <para>the simple utility to receive or send message which guides
+          user through operation, the message type, the message ID and the
+          message contents by simple prompts</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>send</term>
+
+        <listitem>
+          <para>even more simplistic message sending program</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>readburst</term>
+
+        <listitem>
+          <para>the utility for continuous messages reception and printing of
+          the message contents. This utility can be used as an example of the
+          <function>select</function> system call usage.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>sendburst</term>
+
+        <listitem>
+          <para>the periodic message generator. Each message is filled by
+          the constant pattern and the message sequence number. This utility
+          can be used for throughput and message drops tests.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>can-proxy</term>
+
+        <listitem>
+          <para>the simple TCP/IP to CAN proxy. The proxy receives simple
+          commands from IP datagrams and processes command sending and
+          state manipulations. Received messages are packed into IP
+          datagrams and send back to the client.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    &lincan_readburst;
+    &lincan_sendburst;
+
+  </section>
+</section>
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/readburst.xml b/lincan-0.3.3/doc/lincandoc/lincan/readburst.xml
new file mode 100644 (file)
index 0000000..3ccf714
--- /dev/null
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<refentry>
+  <!--
+  <refentryinfo>
+    <address>
+      <email>pisa@cmp.felk.cvut.cz</email>
+    </address>
+    <author>
+      <firstname>Pavel</firstname>
+      <surname>Pisa</surname>
+    </author>
+    <date>2004-04-27</date>
+  </refentryinfo>
+  -->
+  <refmeta>
+    <refentrytitle>readburst</refentrytitle>
+    <manvolnum>1</manvolnum>
+  </refmeta>
+  <refnamediv>
+    <refname>readburst</refname>
+    <refpurpose>the utility for continuous messages reception and printing of the message contents</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>readburst</command>
+      <arg><option>-d <replaceable>candev</replaceable></option></arg>
+      <arg><option>-m <replaceable>mask</replaceable></option></arg>
+      <arg><option>-i <replaceable>id</replaceable></option></arg>
+      <arg><option>-f <replaceable>flags</replaceable></option></arg>
+      <arg><option>-w <replaceable>sec</replaceable></option></arg>
+      <arg><option>-p <replaceable>prefix</replaceable></option></arg>
+      <arg><option>-V</option></arg>
+      <arg><option>-h</option></arg>
+      <!-- <arg rep='repeat'><option><replaceable>file</replaceable></option></arg> -->
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>Description</title>
+    <para>
+      The utility <command>readburst</command> can be used to monitor
+      or log CAN messages received by one CAN message communication object.
+      Even outgoing transmitted messages can be logged if <emphasis>process local</emphasis>
+      is globally or explicitly enabled.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>OPTIONS</title>
+    <variablelist>
+      <varlistentry>
+        <term><option>-d</option> <option>--device</option></term>
+        <listitem>
+          <para>
+            This options selects <command>readburst</command> target
+            CAN device. If the option is not specified, default
+            device name <filename>/dev/can0</filename> is used.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-m</option> <option>--mask</option></term>
+        <listitem>
+          <para>
+            This option enables to change default mask accepting all messages
+            to the specified CAN message id mask. The hexadecimal value
+            has to be prefixed by prefix <constant>0x</constant>.
+            Numeric value without any prefix is considered as decimal one.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-i</option> <option>--id</option></term>
+        <listitem>
+          <para>
+            This option specifies CAN message identifier in the acceptance
+            mask. The accepted CAN messages are then printed by
+            <command>readburst</command> command.
+            Only bits corresponding to the non-zero bits of acceptance mask
+            are compared. Hexadecimal value  has to be prefixed by
+            any prefix <constant>0x</constant>. Numeric value without
+            prefix is considered as decimal one.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-f</option> <option>--flags</option></term>
+        <listitem>
+          <para>
+          Specification of modifiers flags of receiption CAN queur.
+          Hexadecimal value  has to be prefixed by
+          prefix <constant>0x</constant>. Numeric value without
+          any prefix is considered as decimal one.
+        </para>
+        <informaltable frame='none'>
+          <tgroup cols='4'>
+          <colspec align="left" colwidth="15*"/>
+          <colspec align="right" colwidth="8*"/>
+          <colspec align="right" colwidth="10*"/>
+          <colspec align="left" colwidth="40*"/>
+          <thead>
+          <row>
+            <entry align="center">Bit name</entry>
+            <entry align="center">Bit number</entry>
+            <entry align="center">Mask</entry>
+            <entry align="center">Description</entry>
+          </row>
+          </thead>
+          <tbody>
+          <row><entry><constant>MSG_RTR</constant></entry><entry>0</entry><entry>0x1</entry>
+            <entry>Receive RTR or non-RTR messages</entry></row>
+          <row><entry><constant>MSG_EXT</constant></entry><entry>2</entry><entry>0x4</entry>
+            <entry>Receive extended/standard messages</entry></row>
+          <row><entry><constant>MSG_LOCAL</constant></entry><entry>3</entry><entry>0x8</entry>
+            <entry>Receive local or external messages</entry></row>
+          <row><entry><constant>MSG_RTR_MASK</constant></entry><entry>8</entry><entry>0x100</entry>
+            <entry>Take care about <constant>MSG_RTR</constant> bit else
+              RTR and non-RTR messages are accepted</entry></row>
+          <row><entry><constant>MSG_EXT_MASK</constant></entry><entry>10</entry><entry>0x400</entry>
+            <entry>Take care about <constant>MSG_EXT</constant> bit else
+              extended and standard messages are accepted</entry></row>
+          <row><entry><constant>MSG_LOCAL_MASK</constant></entry><entry>11</entry><entry>0x800</entry>
+            <entry>Take care about <constant>MSG_LOCAL</constant> bit else
+              both local and external messages are accepted</entry></row>
+          <row><entry><constant>MSG_PROCESSLOCAL</constant></entry><entry>9</entry><entry>0x200</entry>
+            <entry>Enable processing of the local messages if not explicitly enabled globally
+            or disabled globally.</entry></row>
+          </tbody>
+          </tgroup>
+          </informaltable>
+
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-w</option> <option>--wait</option></term>
+        <listitem>
+          <para>
+            The number of second the <command>readburst</command>
+            waits in the <function>select</function> call.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-p</option> <option>--prefix</option></term>
+        <listitem>
+          <para>
+            The <replaceable>prefix</replaceable> string can is added at beginning
+            of each printed line. The format specifies <constant>%s</constant>
+            could be used to add device name into prefix.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-V</option> <option>--version</option></term>
+        <listitem>
+          <para>
+            Print command version.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-h</option> <option>--help</option>
+        </term>
+        <listitem>
+          <para>
+            Print command usage information
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <!--
+  <refsect1>
+    <title>BACKWARDS COMPATIBILITY</title>
+
+    <para>
+      This.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>ENVIRONMENT</title>
+    <para>
+      The.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>COPYRIGHT</title>
+    <para>
+      This.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>SEE ALSO</title>
+    <para>
+      <citerefentry>
+       <refentrytitle>readburst</refentrytitle><manvolnum>5</manvolnum>
+      </citerefentry>
+    </para>
+  </refsect1>
+  -->
+</refentry>
+
diff --git a/lincan-0.3.3/doc/lincandoc/lincan/sendburst.xml b/lincan-0.3.3/doc/lincandoc/lincan/sendburst.xml
new file mode 100644 (file)
index 0000000..b5ab59a
--- /dev/null
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<refentry>
+  <!--
+  <refentryinfo>
+    <address>
+      <email>pisa@cmp.felk.cvut.cz</email>
+    </address>
+    <author>
+      <firstname>Pavel</firstname>
+      <surname>Pisa</surname>
+    </author>
+    <date>2004-04-27</date>
+  </refentryinfo>
+  -->
+  <refmeta>
+    <refentrytitle>sendburst</refentrytitle>
+    <manvolnum>1</manvolnum>
+  </refmeta>
+  <refnamediv>
+    <refname>sendburst</refname>
+    <refpurpose>the utility for continuous messages reception and printing of the message contents</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <cmdsynopsis>
+      <command>sendburst</command>
+      <arg><option>-d <replaceable>candev</replaceable></option></arg>
+      <arg><option>-i <replaceable>id</replaceable></option></arg>
+      <arg><option>-s</option></arg>
+      <arg><option>-f <replaceable>flags</replaceable></option></arg>
+      <arg><option>-w <replaceable>sec</replaceable></option></arg>
+      <arg><option>-b <replaceable>blocksize</replaceable></option></arg>
+      <arg><option>-c <replaceable>count</replaceable></option></arg>
+      <arg><option>-p <replaceable>prefix</replaceable></option></arg>
+      <arg><option>-V</option></arg>
+      <arg><option>-h</option></arg>
+      <!-- <arg rep='repeat'><option><replaceable>file</replaceable></option></arg> -->
+    </cmdsynopsis>
+  </refsynopsisdiv>
+  <refsect1>
+    <title>Description</title>
+    <para>
+      The utility <command>sendburst</command> generates blocks of messages
+      with specified CAN message ID. The burst block of <replaceable>blocksize</replaceable>
+      messages is generated and pushed into can device. If <replaceable>count</replaceable>
+      is specified, the command stops and exits after <replaceable>count</replaceable>
+      of message blocks send.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>OPTIONS</title>
+    <variablelist>
+      <varlistentry>
+        <term><option>-d</option> <option>--device</option></term>
+        <listitem>
+          <para>
+            This options selects <command>sendburst</command> target
+            CAN device. If the option is not specified, default
+            device name <filename>/dev/can0</filename> is used.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-i</option> <option>--id</option></term>
+        <listitem>
+          <para>
+            This option specifies which CAN message ID
+            is used for transmitted blocks of messages. Hexadecimal value has
+            to be prefixed by prefix <constant>0x</constant>. Numeric value without
+            any prefix is considered as decimal one.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-f</option> <option>--flags</option></term>
+        <listitem>
+          <para>
+          Specification of modifiers flags of the send message.
+          Hexadecimal value  has to be prefixed by
+          prefix <constant>0x</constant>. Numeric value without
+          prefix is considered as decimal one.
+        </para>
+        <informaltable frame='none'>
+          <tgroup cols='4'>
+          <colspec align="left" colwidth="1*"/>
+          <colspec align="right" colwidth="1*"/>
+          <colspec align="right" colwidth="1*"/>
+          <colspec align="left" colwidth="4*"/>
+          <thead>
+          <row>
+            <entry align="center">Bit name</entry>
+            <entry align="center">Bit number</entry>
+            <entry align="center">Mask</entry>
+            <entry align="center">Description</entry>
+          </row>
+          </thead>
+          <tbody>
+          <row><entry><constant>MSG_RTR</constant></entry><entry>0</entry><entry>0x1</entry>
+            <entry>Generate RTR messages if specified</entry></row>
+          <row><entry><constant>MSG_EXT</constant></entry><entry>2</entry><entry>0x4</entry>
+            <entry>Use extended messages identifiers if specified</entry></row>
+          </tbody>
+          </tgroup>
+          </informaltable>
+
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-s</option> <option>--sync</option></term>
+        <listitem>
+          <para>
+            Open device in the synchronous mode. The <function>send</function>
+            and <function>close</function> blocks until message is sent to
+            to CAN bus.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-w</option> <option>--wait</option></term>
+        <listitem>
+          <para>
+            The number of second the <command>sendburst</command>
+            waits between sending burst blocks.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-b</option> <option>--block</option></term>
+        <listitem>
+          <para>
+            The number of messages in the one burst block. Default value is
+            <constant>10</constant>.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-c</option> <option>--count</option></term>
+        <listitem>
+          <para>
+            The number of block send after command invocation.
+            If specified, command finishes and returns after specified
+            number of blocks. If unspecified, the <command>sendburst</command>
+            runs for infinite time.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-p</option> <option>--prefix</option></term>
+        <listitem>
+          <para>
+            The <replaceable>prefix</replaceable> string can is added at beginning
+            of each printed line. The format specifies <constant>%s</constant>
+            could be used to add device name into prefix.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-V</option> <option>--version</option></term>
+        <listitem>
+          <para>
+            Print command version.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><option>-h</option> <option>--help</option>
+        </term>
+        <listitem>
+          <para>
+            Print command usage information
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <!--
+  <refsect1>
+    <title>BACKWARDS COMPATIBILITY</title>
+
+    <para>
+      This.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>ENVIRONMENT</title>
+    <para>
+      The.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>COPYRIGHT</title>
+    <para>
+      This.
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>SEE ALSO</title>
+    <para>
+      <citerefentry>
+       <refentrytitle>sendburst</refentrytitle><manvolnum>5</manvolnum>
+      </citerefentry>
+    </para>
+  </refsect1>
+  -->
+</refentry>
+
diff --git a/lincan-0.3.3/doc/lincandoc/lincan_incl.ent b/lincan-0.3.3/doc/lincandoc/lincan_incl.ent
new file mode 100644 (file)
index 0000000..4c1467a
--- /dev/null
@@ -0,0 +1,22 @@
+<!ENTITY lincan SYSTEM "lincandoc.xml">
+<!--<!ENTITY % lincanpath ".">-->
+
+<!ENTITY lincan_summary   SYSTEM "lincan/lincan_summary.xml">
+<!ENTITY lincan_intro     SYSTEM "lincan/lincan_intro.xml">
+<!ENTITY lincan_arch      SYSTEM "lincan/lincan_arch.xml">
+<!ENTITY lincan_api       SYSTEM "lincan/lincan_api.xml">
+<!ENTITY lincan_usage     SYSTEM "lincan/lincan_usage.xml">
+<!ENTITY lincan_internals SYSTEM "lincan/lincan_internals.xml">
+<!ENTITY lincan_history   SYSTEM "lincan/lincan_history.xml">
+<!ENTITY lincan_readburst SYSTEM "lincan/readburst.xml">
+<!ENTITY lincan_sendburst SYSTEM "lincan/sendburst.xml">
+
+<!ENTITY lincan_arch1_img "%lincanpath;/img/lincan_arch1">
+<!ENTITY lincan_canqueue1_img "%lincanpath;/img/lincan_canqueue1">
+<!ENTITY lincan_canends1_img "%lincanpath;/img/lincan_canends1">
+<!ENTITY lincan_canhardware1_img "%lincanpath;/img/lincan_canhardware1">
+
+
+
+
+
diff --git a/lincan-0.3.3/doc/lincandoc/lincandoc.xml b/lincan-0.3.3/doc/lincandoc/lincandoc.xml
new file mode 100644 (file)
index 0000000..747dd97
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version='1.0'?>
+<chapter>
+  <title>Linux/RT-Linux CAN Driver (LinCAN)</title>
+  <para>The LINCAN is an implementation of the Linux device driver supporting
+    more CAN controller chips and many CAN interface boards. Its
+    implementation has long history already. The OCERA version of the driver
+    adds new features, continuous enhancements and reimplementation of
+    structure of the driver. Most important feature is that driver supports multiple
+    open of one communication object from more Linux and even RT-Linux
+    applications and threads. The usage of the driver is tightly coupled to
+    the virtual CAN API interface component which hides driver low level
+    interface to the application programmers.
+  </para>
+
+  <section>
+    <title>LinCAN Summary</title>
+    &lincan_summary;
+  </section>
+
+  <section>
+    <title>LinCAN Driver Description</title>
+    &lincan_intro;
+  </section>
+  
+  &lincan_api;
+  &lincan_arch;
+  &lincan_history;
+  &lincan_internals;
+  &lincan_usage;
+
+</chapter>
diff --git a/lincan-0.3.3/include/aim104.h b/lincan-0.3.3/include/aim104.h
new file mode 100644 (file)
index 0000000..0426441
--- /dev/null
@@ -0,0 +1,19 @@
+/* aim104.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int aim104_request_io(struct candevice_t *candev);
+int aim104_release_io(struct candevice_t *candev);
+int aim104_reset(struct candevice_t *candev); 
+int aim104_init_hw_data(struct candevice_t *candev);
+int aim104_init_chip_data(struct candevice_t *candev, int chipnr);
+int aim104_init_obj_data(struct canchip_t *chip, int objnr);
+void aim104_write_register(unsigned data, unsigned long address);
+unsigned aim104_read_register(unsigned long address);
+int aim104_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/c_can.h b/lincan-0.3.3/include/c_can.h
new file mode 100644 (file)
index 0000000..f5d9d10
--- /dev/null
@@ -0,0 +1,254 @@
+/* c_can.h - Hynix HMS30c7202 ARM generic C_CAN module handling
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+/* 
+ * optimized inline version, may it be, that it can be too fast for the chip
+ */
+extern inline void c_can_write_reg_w(const struct canchip_t *pchip, u16 data, unsigned reg)
+{
+       u32 address = pchip->chip_base_addr + reg;
+    #ifndef CONFIG_OC_LINCAN_DYNAMICIO
+       writew(data,address);
+    #else /*CONFIG_OC_LINCAN_DYNAMICIO*/
+       pchip->write_register(data, address);
+    #endif /*CONFIG_OC_LINCAN_DYNAMICIO*/
+}
+
+extern inline u16 c_can_read_reg_w(const struct canchip_t *pchip, unsigned reg)
+{
+       u32 address = pchip->chip_base_addr + reg;
+    #ifndef CONFIG_OC_LINCAN_DYNAMICIO
+       return readw(address);
+    #else /*CONFIG_OC_LINCAN_DYNAMICIO*/
+       return pchip->read_register(address);
+    #endif /*CONFIG_OC_LINCAN_DYNAMICIO*/
+}
+
+extern can_spinlock_t c_can_spwlock; // Spin lock for write operations
+extern can_spinlock_t c_can_sprlock; // Spin lock for read operations
+extern can_spinlock_t c_can_if1lock; // spin lock for the if1 register
+extern can_spinlock_t c_can_if2lock; // spin lcok for the if2 register
+
+int c_can_if1_busycheck(struct canchip_t *pchip);
+int c_can_if2_busycheck(struct canchip_t *pchip);
+
+int c_can_enable_configuration(struct canchip_t *pchip);
+int c_can_disable_configuration(struct canchip_t *pchip);
+int c_can_chip_config(struct canchip_t *pchip);
+int c_can_baud_rate(struct canchip_t *chip, int rate, int clock,
+                       int sjw, int sampl_pt, int flags);
+int c_can_mask(struct msgobj_t *pmsgobj,
+              u32 mask,
+              u16 usedirbit);
+int c_can_use_mask(struct msgobj_t *pmsgobj,
+                  u16 useflag);
+int c_can_clear_objects(struct canchip_t *pchip);
+int c_can_config_irqs(struct canchip_t *pchip,
+                      u16 irqs);
+int c_can_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
+int c_can_send_msg(struct canchip_t *pchip, struct msgobj_t *pmsgobj,
+                       struct canmsg_t *pmsg);
+int c_can_remote_request(struct canchip_t *pchip, struct msgobj_t *pmsgobj );
+int c_can_set_btregs(struct canchip_t *chip,
+                     u16 btr0,
+                    u16 btr1);
+int c_can_start_chip(struct canchip_t *pchip);
+int c_can_stop_chip(struct canchip_t *pchip);
+int c_can_check_tx_stat(struct canchip_t *pchip);
+
+int c_can_register(struct chipspecops_t *chipspecops);
+
+void c_can_registerdump(struct canchip_t *pchip);
+
+void c_can_if1_registerdump(struct canchip_t *pchip);
+
+void c_can_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj);
+
+int c_can_irq_handler(int irq, struct canchip_t *pchip);
+
+int c_can_fill_chipspecops(struct canchip_t *pchip);
+
+/* The CCCE register is not implemented in version 1.2 of C_CAN */
+#undef C_CAN_WITH_CCCE
+
+/* The mask of C_CAN registers offsets */
+#define C_CAN_REGOFFS_MASK     0xFF
+
+/* SSEE C_CAN Memory map */
+/* BasicCAN offsets are multiplied by two */
+#define CCCR           0x00    /* Control Register */
+#define CCSR           0x02    /* Status Register */
+#define CCEC           0x04    /* Error Counting Register */
+#define CCBT           0x06    /* Bit Timing Register */
+#define CCINTR         0x08    /* Interrupt Register */
+#define CCTR           0x0A    /* Test Register */
+#define CCBRPE                 0x0C    /* Baud Rate Prescaler Extension Register */
+
+#ifdef C_CAN_WITH_CCCE
+#define CCCE           0x0E    /* CAN Enable Register */
+#endif /*C_CAN_WITH_CCCE*/
+
+#define CCIF1CR                0x10    /* Interface 1 Command Request Register */
+#define CCIF1CM                0x12    /* IF1 Command Mask Register */
+#define CCIF1M1                0x14    /* IF1 Mask 1 Register */
+#define CCIF1M2                0x16    /* IF1 Mask 2 Register */
+#define CCIF1A1                0x18    /* IF1 Arbitration 1 Register */
+#define CCIF1A2                0x1A    /* IF1 Arbitration 2 Register */
+#define CCIF1DMC       0x1C    /* IF1 Message Control Register */
+#define CCIF1DA1       0x1E    /* IF1 Data A 1 Register */
+#define CCIF1DA2       0x20    /* IF1 Data A 2 Register */
+#define CCIF1DB1       0x22    /* IF1 Data B 1 Register */
+#define CCIF1DB2       0x24    /* IF1 Data B 2 Register */
+
+#define CCIF2CR                0x40    /* Interface 2 Command Request Register */
+#define CCIF2CM                0x42    /* IF2 Command Mask Register */
+#define CCIF2M1                0x44    /* IF2 Mask 1 Register */
+#define CCIF2M2                0x46    /* IF2 Mask 2 Register */
+#define CCIF2A1                0x48    /* IF2 Arbitration 1 Register */
+#define CCIF2A2                0x4A    /* IF2 Arbitration 2 Register */
+#define CCIF2DMC       0x4C    /* IF2 Message Control Register */
+#define CCIF2DA1       0x4E    /* IF2 Data A 1 Register */
+#define CCIF2DA2       0x50    /* IF2 Data A 2 Register */
+#define CCIF2DB1       0x52    /* IF2 Data B 1 Register */
+#define CCIF2DB2       0x54    /* IF2 Data B 2 Register */
+
+#define CCTREQ1        0x80    /* Transmission Request 1 Register */
+#define CCTREQ2        0x82    /* Transmission Request 2 Register */
+
+#define CCND1          0x90    /* New Data 1 Register */
+#define CCND2          0x92    /* New Data 2 Register */
+
+#define CCINTP1        0xA0    /* Interrupt Pending 1 Register */
+#define CCINTP2                0xA2    /* Interrupt Pending 2 Register */
+
+#define CCIMV1         0xB0    /* Message Valid 1 Register   */
+#define CCIMV2         0xB2    /* Message Valid 2 Register   */
+
+/* Control register */
+enum c_can_BASIC_CR
+{
+   CR_INIT = 1,                // Internal Initialization Pending
+     CR_MIE  = 1<<1,  // Module Interrupt Enable
+     CR_SIE  = 1<<2,   // Status-change Interrupt Enable
+     CR_EIE  = 1<<3,   // Error Interrupt Enable
+     CR_DAR  = 1<<5,   // Disable Automatic Retransmission
+     CR_CCE  = 1<<6,  // Configuration Change Enable
+     CR_TEST = 1<<7   // Test Mode Enable
+};
+
+/* Status Register */
+enum c_can_BASIC_SR
+{
+   SR_TXOK  = 1<<3,    // Transmitted a Message Successfully
+     SR_RXOK  = 1<<4,  // Received a Message Successfully
+     SR_EPASS = 1<<5,  // Error Passive
+     SR_EWARN = 1<<6,  // Error Warning Status
+     SR_BOFF  = 1<<7,  // Bus Off Status
+};
+
+/* Status Register Last Error Codes */
+enum c_can_BASIC_SRLEC
+{
+   SRLEC_NE = 0,     // Last Error Code: No Error
+     SRLEC_SE = 1,     // LEC: Stuff Error
+     SRLEC_FE = 2,     // LEC: Form Error
+     SRLEC_AE = 3,     // LEC: Acknowledgement Error
+     SRLEC_B1 = 4,     // LEC: Bit1 Error
+     SRLEC_B0 = 5,     // LEC: Bit0 Error
+     SRLEC_CR = 6      // LEC: CRC Error
+};
+
+/* Error Counting Register */
+enum c_can_BASIC_EC
+{
+   EC_REP = 1<<15              // Receive Error Passive
+};
+
+/* Interrupt Register */
+enum c_can_BASIC_INT
+{
+   INT_NOINT = 0,                 // No Interrupt is pending
+     INT_STAT  = 0x8000   // Status Interrupt
+};
+
+/* CAN Test Register */
+enum c_can_BASIC_TR
+{
+   TR_BASIC = 1<<2,  // Basic Mode
+     TR_SLNT  = 1<<3,  // Silent Mode
+     TR_LOOPB = 1<<4,  // Loop Back Mode
+     TR_RX    = 1<<7   // Receive (CAN_RX Pin)
+};
+
+/* CAN Test Register TX Control*/
+enum c_can_BASIC_TRTX
+{
+   TRTX_RST = 0,     // Reset value, CAN_TX is controlled by the CAN Core
+     TRTX_MON = 1,     // Sample Point can be monitored at CAN_TX pin
+     TRTX_DOM = 2,     // CAN_TX pin drives a dominant('0') value
+     TRTX_REC = 3      // CAN_TX pin drives a recessive('1') value
+};
+
+/* CAN Enable Register */
+enum c_can_BASIC_CE
+{
+   CE_EN  = 1                  // CAN Enable Bit
+};
+
+/* Interface X Command Request Register */
+enum c_can_BASIC_IFXCR
+{
+   IFXCR_BUSY = 1<<15   // Busy Flag (Write Access only when Busy='0')
+};
+
+/* Interface X Command Mask Register */
+enum c_can_BASIC_IFXCM
+{
+   IFXCM_DB        = 1,                // R/W Data Byte 4-7
+     IFXCM_DA        = 1<<1,   // R/W Data Byte 0-3
+     IFXCM_TRND      = 1<<2,   // Transmit Request (WRRD=1) or Reset New Date Bit (WRRD=0)
+     IFXCM_CLRINTPND = 1<<3,   // Clear Interrupt Pending Bit when reading the Message Object
+     IFXCM_CNTRL     = 1<<4,   // Access Interface X Message Control Bits
+     IFXCM_ARB       = 1<<5,   // Access Interface X Arbitration
+     IFXCM_MASK      = 1<<6,   // Access Interface X Mask Bits
+     IFXCM_WRRD      = 1<<7    // Read/Write (write data from Interface Registers to Message Object if ='1')
+     //            (read data from Message Object to Interface Registers if ='0')
+};
+
+/* Interface X Mask 2 Register */
+enum c_can_BASIC_IFXMSK2
+{
+   IFXMSK2_MDIR = 1<<14, // Mask Message Direction (message direction bit(RTR) used for acceptance filt. or not)
+     IFXMSK2_MXTD = 1<<15  // Mask Extended Identifier (extended id bit(IDE) used for acceptance filt. or not)
+};
+
+/* Interface X Arbitration 2 Register */
+enum c_can_BASIC_IFXARB2
+{
+   IFXARB2_DIR  = 1<<13,  // Message Direction (transmit='1')
+     IFXARB2_XTD  = 1<<14,  // Use Extended Identifier
+     IFXARB2_MVAL = 1<<15   // Message Validation
+};
+
+/* Interface X Message Control Register */
+enum c_can_BASIC_IFXMC
+{
+   IFXMC_EOB    = 1<<7,    // End of Buffer (marks last Message Object of FIFO Buffer)
+     IFXMC_TXRQST = 1<<8,    // Transmit Request
+     IFXMC_RMTEN  = 1<<9,    // Remote Enable
+     IFXMC_RXIE   = 1<<10,   // Receive Interrupt Enable
+     IFXMC_TXIE   = 1<<11,   // Transmit Interrupt Enable
+     IFXMC_UMASK  = 1<<12,   // Use Identifier Mask
+     IFXMC_INTPND = 1<<13,   // Interrupt Pending
+     IFXMC_MSGLST = 1<<14,   // Message Lost (Only valid for direction = receive)
+     IFXMC_NEWDAT = 1<<15    // New Data
+};
+
diff --git a/lincan-0.3.3/include/can.h b/lincan-0.3.3/include/can.h
new file mode 100644 (file)
index 0000000..b3b265c
--- /dev/null
@@ -0,0 +1,86 @@
+/* can.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef _CAN_DRVAPI_T_H
+#define _CAN_DRVAPI_T_H
+
+#ifdef __KERNEL__
+
+#include <linux/time.h>
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#else /* __KERNEL__ */
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#endif /* __KERNEL__ */
+
+#include "./canmsg.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* CAN ioctl magic number */
+#define CAN_IOC_MAGIC 'd'
+
+typedef unsigned long bittiming_t;
+typedef unsigned short channel_t;
+
+/**
+ * struct can_baudparams_t - datatype for calling CONF_BAUDPARAMS IOCTL 
+ * @flags: reserved for additional flags for chip configuration, should be written -1 or 0
+ * @baudrate: baud rate in Hz
+ * @sjw: synchronization jump width (0-3) prescaled clock cycles
+ * @sampl_pt: sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
+ * 
+ * The structure is used to configure new set of parameters into CAN controller chip.
+ * If default value of some field should be preserved, fill field by value -1.
+ */
+struct can_baudparams_t {
+       long flags;
+       long baudrate;
+       long sjw;
+       long sample_pt;
+};
+
+/* CAN ioctl functions */
+#define CAN_DRV_QUERY _IO(CAN_IOC_MAGIC, 0)
+#define CAN_DRV_QRY_BRANCH    0        /* returns driver branch value - "LINC" for LinCAN driver */
+#define CAN_DRV_QRY_VERSION   1        /* returns driver version as (major<<16) | (minor<<8) | patch */
+#define CAN_DRV_QRY_MSGFORMAT 2        /* format of canmsg_t structure */
+
+#define CMD_START _IOW(CAN_IOC_MAGIC, 1, channel_t)
+#define CMD_STOP _IOW(CAN_IOC_MAGIC, 2, channel_t)
+//#define CMD_RESET 3
+
+#define CONF_BAUD _IOW(CAN_IOC_MAGIC, 4, bittiming_t)
+//#define CONF_ACCM
+//#define CONF_XTDACCM
+//#define CONF_TIMING
+//#define CONF_OMODE
+#define CONF_FILTER _IOW(CAN_IOC_MAGIC, 8, unsigned char)
+
+//#define CONF_FENABLE
+//#define CONF_FDISABLE
+
+#define STAT _IO(CAN_IOC_MAGIC, 9)
+#define CANQUE_FILTER _IOW(CAN_IOC_MAGIC, 10, struct canfilt_t)
+#define CANQUE_FLUSH  _IO(CAN_IOC_MAGIC, 11)
+#define CONF_BAUDPARAMS  _IOW(CAN_IOC_MAGIC, 11, struct can_baudparams_t)
+#define CANRTR_READ  _IOWR(CAN_IOC_MAGIC, 12, struct canmsg_t)
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_CAN_DRVAPI_T_H*/
diff --git a/lincan-0.3.3/include/can_iortl.h b/lincan-0.3.3/include/can_iortl.h
new file mode 100644 (file)
index 0000000..69664d4
--- /dev/null
@@ -0,0 +1,28 @@
+/* can_iortl.h - RT-Linux Posix file IO interface
+ * Linux CAN-bus device driver.
+ * RT-Linux support by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef _CAN_IORTL_H
+#define _CAN_IORTL_H
+
+#ifdef CAN_WITH_RTL
+
+int can_open_rtl_posix(struct rtl_file *fptr);
+
+int can_release_rtl_posix(struct rtl_file *fptr);
+
+ssize_t can_read_rtl_posix(struct rtl_file *fptr, char *buffer,
+                               size_t length, loff_t *ppos);
+
+ssize_t can_write_rtl_posix(struct rtl_file *fptr, const char *buffer,
+                                size_t length, loff_t *ppos);
+
+int can_ioctl_rtl_posix(struct rtl_file *, unsigned int, unsigned long);
+
+#endif /*CAN_WITH_RTL*/
+
+#endif /*_CAN_IORTL_H*/
diff --git a/lincan-0.3.3/include/can_queue.h b/lincan-0.3.3/include/can_queue.h
new file mode 100644 (file)
index 0000000..42eeef4
--- /dev/null
@@ -0,0 +1,809 @@
+/* can_queue.h - CAN queues and message passing infrastructure 
+ * Linux CAN-bus device driver.
+ * Written by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef _CAN_QUEUE_H
+#define _CAN_QUEUE_H
+
+#include "./canmsg.h"
+#include "./constants.h"
+#include "./can_sysdep.h"
+
+/**
+ * struct canque_slot_t - one CAN message slot in the CAN FIFO queue 
+ * @next: pointer to the next/younger slot
+ * @slot_flags: space for flags and optional command describing action
+ *     associated with slot data
+ * @msg: space for one CAN message
+ *
+ * This structure is used to store CAN messages in the CAN FIFO queue.
+ */
+ struct canque_slot_t {
+       struct canque_slot_t *next;
+       unsigned long slot_flags;
+       struct canmsg_t msg;
+};
+
+#define CAN_SLOTF_CMD  0x00ff  /*  */
+
+/**
+ * struct canque_fifo_t - CAN FIFO queue representation
+ * @fifo_flags: this field holds global flags describing state of the FIFO.
+ *     %CAN_FIFOF_ERROR is set when some error condition occurs.
+ *     %CAN_FIFOF_ERR2BLOCK defines, that error should lead to the FIFO block state.
+ *     %CAN_FIFOF_BLOCK state blocks insertion of the next messages. 
+ *     %CAN_FIFOF_OVERRUN attempt to acquire new slot, when FIFO is full. 
+ *     %CAN_FIFOF_FULL indicates FIFO full state. 
+ *     %CAN_FIFOF_EMPTY indicates no allocated slot in the FIFO.
+ *     %CAN_FIFOF_DEAD condition indication. Used when FIFO is beeing destroyed.
+ * @error_code: futher description of error condition
+ * @head: pointer to the FIFO head, oldest slot
+ * @tail: pointer to the location, where pointer to newly inserted slot
+ *     should be added
+ * @flist: pointer to list of the free slots associated with queue
+ * @entry: pointer to the memory allocated for the list slots.
+ * @fifo_lock: the lock to ensure atomicity of slot manipulation operations.
+ * @slotsnr:  number of allocated slots
+ *
+ * This structure represents CAN FIFO queue. It is implemented as 
+ * a single linked list of slots prepared for processing. The empty slots
+ * are stored in single linked list (@flist).
+ */
+struct canque_fifo_t {
+       unsigned long fifo_flags;
+       unsigned long error_code;
+       struct canque_slot_t *head;     /* points to the oldest entry */
+       struct canque_slot_t **tail;    /* points to NULL pointer for chaining */
+       struct canque_slot_t *flist;    /* points the first entry in the free list */
+       struct canque_slot_t *entry;    /* points to first allocated entry */
+       can_spinlock_t fifo_lock;       /* can_spin_lock_irqsave / can_spin_unlock_irqrestore */
+       int    slotsnr;
+};
+
+#define CAN_FIFOF_DESTROY_b    15
+#define CAN_FIFOF_ERROR_b      14
+#define CAN_FIFOF_ERR2BLOCK_b  13
+#define CAN_FIFOF_BLOCK_b      12
+#define CAN_FIFOF_OVERRUN_b    11
+#define CAN_FIFOF_FULL_b       10
+#define CAN_FIFOF_EMPTY_b      9
+#define CAN_FIFOF_DEAD_b       8
+#define CAN_FIFOF_INACTIVE_b   7
+#define CAN_FIFOF_FREEONEMPTY_b        6
+#define CAN_FIFOF_READY_b      5
+#define CAN_FIFOF_NOTIFYPEND_b 4
+#define CAN_FIFOF_RTL_MEM_b    3
+
+#define CAN_FIFOF_DESTROY      (1<<CAN_FIFOF_DESTROY_b)
+#define CAN_FIFOF_ERROR                (1<<CAN_FIFOF_ERROR_b)
+#define CAN_FIFOF_ERR2BLOCK    (1<<CAN_FIFOF_ERR2BLOCK_b)
+#define CAN_FIFOF_BLOCK                (1<<CAN_FIFOF_BLOCK_b)
+#define CAN_FIFOF_OVERRUN      (1<<CAN_FIFOF_OVERRUN_b)
+#define CAN_FIFOF_FULL         (1<<CAN_FIFOF_FULL_b)
+#define CAN_FIFOF_EMPTY                (1<<CAN_FIFOF_EMPTY_b)
+#define CAN_FIFOF_DEAD         (1<<CAN_FIFOF_DEAD_b)
+#define CAN_FIFOF_INACTIVE     (1<<CAN_FIFOF_INACTIVE_b)
+#define CAN_FIFOF_FREEONEMPTY  (1<<CAN_FIFOF_FREEONEMPTY_b)
+#define CAN_FIFOF_READY                (1<<CAN_FIFOF_READY_b)
+#define CAN_FIFOF_NOTIFYPEND    (1<<CAN_FIFOF_NOTIFYPEND_b)
+#define CAN_FIFOF_RTL_MEM       (1<<CAN_FIFOF_RTL_MEM_b)
+
+#define canque_fifo_test_fl(fifo,fifo_fl) \
+  test_bit(CAN_FIFOF_##fifo_fl##_b,&(fifo)->fifo_flags)
+#define canque_fifo_set_fl(fifo,fifo_fl) \
+  set_bit(CAN_FIFOF_##fifo_fl##_b,&(fifo)->fifo_flags)
+#define canque_fifo_clear_fl(fifo,fifo_fl) \
+  clear_bit(CAN_FIFOF_##fifo_fl##_b,&(fifo)->fifo_flags)
+#define canque_fifo_test_and_set_fl(fifo,fifo_fl) \
+  test_and_set_bit(CAN_FIFOF_##fifo_fl##_b,&(fifo)->fifo_flags)
+#define canque_fifo_test_and_clear_fl(fifo,fifo_fl) \
+  test_and_clear_bit(CAN_FIFOF_##fifo_fl##_b,&(fifo)->fifo_flags)
+
+
+/**
+ * canque_fifo_get_inslot - allocate slot for the input of one CAN message 
+ * @fifo: pointer to the FIFO structure
+ * @slotp: pointer to location to store pointer to the allocated slot.
+ * @cmd: optional command associated with allocated slot.
+ *
+ * Return Value: The function returns negative value if there is no
+ *     free slot in the FIFO queue.
+ */
+static inline
+int canque_fifo_get_inslot(struct canque_fifo_t *fifo, struct canque_slot_t **slotp, int cmd)
+{
+       can_spin_irqflags_t flags;
+       struct canque_slot_t *slot;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       /* get the first free slot slot from flist */
+       if(!(slot=fifo->flist)) {
+               canque_fifo_set_fl(fifo,OVERRUN);
+               canque_fifo_set_fl(fifo,FULL);
+               can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+               *slotp=NULL;
+               return -1;
+       }
+       /* adjust free slot list */
+       if(!(fifo->flist=slot->next))
+               canque_fifo_set_fl(fifo,FULL);
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       *slotp=slot;
+       slot->slot_flags=cmd&CAN_SLOTF_CMD;
+       return 1;
+}
+
+/**
+ * canque_fifo_put_inslot - releases slot to further processing
+ * @fifo: pointer to the FIFO structure
+ * @slot: pointer to the slot previously acquired by canque_fifo_get_inslot().
+ *
+ * Return Value: The nonzero return value indicates, that the queue was empty
+ *     before call to the function. The caller should wake-up output side of the queue.
+ */
+static inline
+int canque_fifo_put_inslot(struct canque_fifo_t *fifo, struct canque_slot_t *slot)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+       slot->next=NULL;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       if(*fifo->tail) can_printk(KERN_CRIT "canque_fifo_put_inslot: fifo->tail != NULL\n");
+       *fifo->tail=slot;
+       fifo->tail=&slot->next;
+       ret=0;
+       if(canque_fifo_test_and_clear_fl(fifo,EMPTY))
+         ret=CAN_FIFOF_EMPTY;  /* Fifo has been empty before put */
+       if(canque_fifo_test_and_clear_fl(fifo,INACTIVE))
+         ret=CAN_FIFOF_INACTIVE; /* Fifo has been empty before put */
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       return ret;
+}
+
+/**
+ * canque_fifo_abort_inslot - release and abort slot
+ * @fifo: pointer to the FIFO structure
+ * @slot: pointer to the slot previously acquired by canque_fifo_get_inslot().
+ *
+ * Return Value: The nonzero value indicates, that fifo was full
+ */
+static inline
+int canque_fifo_abort_inslot(struct canque_fifo_t *fifo, struct canque_slot_t *slot)
+{
+       int ret=0;
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       slot->next=fifo->flist;
+       fifo->flist=slot;
+       if(canque_fifo_test_and_clear_fl(fifo,FULL))
+               ret=CAN_FIFOF_FULL;
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       return ret;
+}
+
+/**
+ * canque_fifo_test_outslot - test and get ready slot from the FIFO
+ * @fifo: pointer to the FIFO structure
+ * @slotp: pointer to location to store pointer to the oldest slot from the FIFO.
+ *
+ * Return Value: The negative value indicates, that queue is empty.
+ *     The positive or zero value represents command stored into slot by
+ *     the call to the function canque_fifo_get_inslot().
+ *     The successfully acquired FIFO output slot has to be released by
+ *     the call canque_fifo_free_outslot() or canque_fifo_again_outslot().
+ */
+static inline
+int canque_fifo_test_outslot(struct canque_fifo_t *fifo, struct canque_slot_t **slotp)
+{
+       can_spin_irqflags_t flags;
+       int cmd;
+       struct canque_slot_t *slot;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       if(!(slot=fifo->head)){;
+               canque_fifo_set_fl(fifo,EMPTY);
+               can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+               *slotp=NULL;
+               return -1;
+       }
+       if(!(fifo->head=slot->next))
+               fifo->tail=&fifo->head;
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+
+       *slotp=slot;
+       cmd=slot->slot_flags;
+       return cmd&CAN_SLOTF_CMD;
+}
+
+
+/**
+ * canque_fifo_free_outslot - free processed FIFO slot
+ * @fifo: pointer to the FIFO structure
+ * @slot: pointer to the slot previously acquired by canque_fifo_test_outslot().
+ *
+ * Return Value: The returned value informs about FIFO state change.
+ *     The mask %CAN_FIFOF_FULL indicates, that the FIFO was full before
+ *     the function call. The mask %CAN_FIFOF_EMPTY informs, that last ready slot
+ *     has been processed.
+ */
+static inline
+int canque_fifo_free_outslot(struct canque_fifo_t *fifo, struct canque_slot_t *slot)
+{
+       int ret=0;
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       slot->next=fifo->flist;
+       fifo->flist=slot;
+       if(canque_fifo_test_and_clear_fl(fifo,FULL))
+               ret=CAN_FIFOF_FULL;
+       if(!(fifo->head)){
+               canque_fifo_set_fl(fifo,EMPTY);
+               ret|=CAN_FIFOF_EMPTY;
+       }
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       return ret;
+}
+
+/**
+ * canque_fifo_again_outslot - interrupt and postpone processing of the slot
+ * @fifo: pointer to the FIFO structure
+ * @slot: pointer to the slot previously acquired by canque_fifo_test_outslot().
+ *
+ * Return Value: The function cannot fail..
+ */
+static inline
+int canque_fifo_again_outslot(struct canque_fifo_t *fifo, struct canque_slot_t *slot)
+{
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       if(!(slot->next=fifo->head))
+               fifo->tail=&slot->next;
+       fifo->head=slot;
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       return 1;
+}
+
+int canque_fifo_flush_slots(struct canque_fifo_t *fifo);
+
+int canque_fifo_init_slots(struct canque_fifo_t *fifo);
+
+#define CANQUEUE_PRIO_NR  3
+
+/* Forward declarations for external types */
+struct msgobj_t;
+struct canchip_t;
+
+/**
+ * struct canque_edge_t - CAN message delivery subsystem graph edge
+ * @fifo: place where primitive @struct canque_fifo_t FIFO is located.
+ * @filtid: the possible CAN message identifiers filter.
+ * @filtmask: the filter mask, the comparison considers only
+ *     @filtid bits corresponding to set bits in the @filtmask field.
+ * @inpeers: the lists of all peers FIFOs connected by their
+ *     input side (@inends) to the same terminal (@struct canque_ends_t).
+ * @outpeers: the lists of all peers FIFOs connected by their
+ *     output side (@outends) to the same terminal (@struct canque_ends_t).
+ * @activepeers: the lists of peers FIFOs connected by their
+ *     output side (@outends) to the same terminal (@struct canque_ends_t)
+ *     with same priority and active state.
+ * @inends: the pointer to the FIFO input side terminal (@struct canque_ends_t).
+ * @outends: the pointer to the FIFO output side terminal (@struct canque_ends_t).
+ * @edge_used: the atomic usage counter, mainly used for safe destruction of the edge.
+ * @edge_prio: the assigned queue priority from the range 0 to %CANQUEUE_PRIO_NR-1
+ * @edge_num: edge sequential number intended for debugging purposes only
+ * @pending_peers: edges with pending delayed events (RTL->Linux calls)
+ * @pending_inops: bitmask of pending operations
+ * @pending_outops: bitmask of pending operations
+ *
+ * This structure represents one direction connection from messages source 
+ * (@inends) to message consumer (@outends) fifo ends hub. The edge contains
+ * &struct canque_fifo_t for message fifo implementation.
+ */
+struct canque_edge_t {
+       struct canque_fifo_t fifo;
+       unsigned long filtid;
+       unsigned long filtmask;
+       struct list_head inpeers;
+       struct list_head outpeers;
+       struct list_head activepeers;
+       struct canque_ends_t *inends;
+       struct canque_ends_t *outends;
+       atomic_t edge_used;
+       int edge_prio;
+       int edge_num;
+    #ifdef CAN_WITH_RTL
+       struct list_head pending_peers;
+       unsigned long pending_inops;
+       unsigned long pending_outops;
+    #endif /*CAN_WITH_RTL*/
+};
+
+/**
+ * struct canque_ends_t - CAN message delivery subsystem graph vertex (FIFO ends)
+ * @ends_flags: this field holds flags describing state of the ENDS structure.
+ * @active: the array of the lists of active edges directed to the ends structure
+ *     with ready messages. The array is indexed by the edges priorities. 
+ * @idle: the list of the edges directed to the ends structure with empty FIFOs.
+ * @inlist: the list of outgoing edges input sides.
+ * @outlist: the list of all incoming edges output sides. Each of there edges
+ *     is listed on one of @active or @idle lists.
+ * @ends_lock: the lock synchronizing operations between threads accessing
+ *     same ends structure.
+ * @notify: pointer to notify procedure. The next state changes are notified.
+ *     %CANQUEUE_NOTIFY_EMPTY (out->in call) - all slots are processed by FIFO out side. 
+ *     %CANQUEUE_NOTIFY_SPACE (out->in call) - full state negated => there is space for new message.
+ *     %CANQUEUE_NOTIFY_PROC  (in->out call) - empty state negated => out side is requested to process slots.
+ *     %CANQUEUE_NOTIFY_NOUSR (both) - notify, that the last user has released the edge usage
+ *             called with some lock to prevent edge disappear.
+ *     %CANQUEUE_NOTIFY_DEAD  (both) - edge is in progress of deletion.
+ *     %CANQUEUE_NOTIFY_ATACH (both) - new edge has been attached to end.
+ *     %CANQUEUE_NOTIFY_FILTCH (out->in call) - edge filter rules changed
+ *     %CANQUEUE_NOTIFY_ERROR  (out->in call) - error in messages processing.
+ * @context: space to store ends user specific information
+ * @endinfo: space to store some other ends usage specific informations
+ *     mainly for waking-up by the notify calls.
+ * @dead_peers: used to chain ends wanting for postponed destruction
+ *
+ * Structure represents place to connect edges to for CAN communication entity.
+ * The zero, one or more incoming and outgoing edges can be connected to
+ * this structure.
+ */
+struct canque_ends_t {
+       unsigned long ends_flags;
+       struct list_head active[CANQUEUE_PRIO_NR];
+       struct list_head idle;
+       struct list_head inlist;
+       struct list_head outlist;
+       can_spinlock_t ends_lock;       /* can_spin_lock_irqsave / can_spin_unlock_irqrestore */
+       void (*notify)(struct canque_ends_t *qends, struct canque_edge_t *qedge, int what);
+       void *context;
+       union {
+               struct {
+                       wait_queue_head_t readq;
+                       wait_queue_head_t writeq;
+                       wait_queue_head_t emptyq;
+                   #ifdef CAN_ENABLE_KERN_FASYNC
+                       struct fasync_struct *fasync;
+                   #endif /*CAN_ENABLE_KERN_FASYNC*/
+               } fileinfo;
+           #ifdef CAN_WITH_RTL
+               struct {
+                       rtl_spinlock_t rtl_lock;
+                       rtl_wait_t rtl_readq;
+                       atomic_t   rtl_readq_age;
+                       rtl_wait_t rtl_writeq;
+                       atomic_t   rtl_writeq_age;
+                       rtl_wait_t rtl_emptyq;
+                       atomic_t   rtl_emptyq_age;
+                       unsigned long pend_flags;
+               } rtlinfo;
+           #endif /*CAN_WITH_RTL*/
+               struct {
+                       struct msgobj_t *msgobj;
+                       struct canchip_t *chip;
+                   #ifndef CAN_WITH_RTL
+                       wait_queue_head_t daemonq;
+                   #else /*CAN_WITH_RTL*/
+                       pthread_t worker_thread;
+                   #endif /*CAN_WITH_RTL*/
+               } chipinfo;
+       } endinfo;
+       struct list_head dead_peers;
+};
+
+#define CANQUEUE_NOTIFY_EMPTY  1 /* out -> in - all slots are processed by FIFO out side */
+#define CANQUEUE_NOTIFY_SPACE  2 /* out -> in - full state negated => there is space for new message */
+#define CANQUEUE_NOTIFY_PROC   3 /* in -> out - empty state negated => out side is requested to process slots */
+#define CANQUEUE_NOTIFY_NOUSR  4 /* called with some lock to prevent edge disappear */
+#define CANQUEUE_NOTIFY_DEAD   5 /*  */
+#define CANQUEUE_NOTIFY_DEAD_WANTED 6 /*  */
+#define CANQUEUE_NOTIFY_ATTACH 7 /*  */
+#define CANQUEUE_NOTIFY_FILTCH 8 /* filter changed */
+#define CANQUEUE_NOTIFY_ERROR      0x10000 /* error notifiers */
+#define CANQUEUE_NOTIFY_ERRTX_PREP 0x11001 /* tx preparation error */
+#define CANQUEUE_NOTIFY_ERRTX_SEND 0x11002 /* tx send error */
+#define CANQUEUE_NOTIFY_ERRTX_BUS  0x11003 /* tx bus error */
+
+#define CAN_ENDSF_DEAD   (1<<0)
+#define CAN_ENDSF_MEM_RTL (1<<1)
+
+/**
+ * canque_notify_inends - request to send notification to the input ends
+ * @qedge: pointer to the edge structure
+ * @what: notification type
+ */
+static inline
+void canque_notify_inends(struct canque_edge_t *qedge, int what)
+{
+       if(qedge->inends)
+               if(qedge->inends->notify)
+                       qedge->inends->notify(qedge->inends,qedge,what);
+}
+
+/**
+ * canque_notify_outends - request to send notification to the output ends
+ * @qedge: pointer to the edge structure
+ * @what: notification type
+ */
+static inline
+void canque_notify_outends(struct canque_edge_t *qedge, int what)
+{
+       if(qedge->outends)
+               if(qedge->outends->notify)
+                       qedge->outends->notify(qedge->outends,qedge,what);
+}
+
+/**
+ * canque_notify_bothends - request to send notification to the both ends
+ * @qedge: pointer to the edge structure
+ * @what: notification type
+ */
+static inline
+void canque_notify_bothends(struct canque_edge_t *qedge, int what)
+{
+       canque_notify_inends(qedge, what);
+       canque_notify_outends(qedge, what);
+}
+
+/**
+ * canque_activate_edge - mark output end of the edge as active
+ * @qedge: pointer to the edge structure
+ * @inends: input side of the edge
+ *
+ * Function call moves output side of the edge from idle onto active edges
+ * list. This function has to be called with edge reference count held.
+ * that is same as for most of other edge functions.
+ */
+static inline
+void canque_activate_edge(struct canque_ends_t *inends, struct canque_edge_t *qedge)
+{
+       can_spin_irqflags_t flags;
+       struct canque_ends_t *outends;
+       if(qedge->edge_prio>=CANQUEUE_PRIO_NR)
+               qedge->edge_prio=CANQUEUE_PRIO_NR-1;
+       if((outends=qedge->outends)){
+               can_spin_lock_irqsave(&outends->ends_lock, flags);
+               can_spin_lock(&qedge->fifo.fifo_lock);
+               if(!canque_fifo_test_fl(&qedge->fifo,EMPTY)){
+                       list_del(&qedge->activepeers);
+                       list_add_tail(&qedge->activepeers,&outends->active[qedge->edge_prio]);
+               }
+               can_spin_unlock(&qedge->fifo.fifo_lock);
+               can_spin_unlock_irqrestore(&outends->ends_lock, flags);
+       }
+}
+
+/**
+ * canque_filtid2internal - converts message ID and filter flags into internal format
+ * @id: CAN message 11 or 29 bit identifier
+ * @filtflags: CAN message flags
+ *
+ * This function maps message ID and %MSG_RTR, %MSG_EXT and %MSG_LOCAL into one 32 bit number
+ */
+static inline
+unsigned int canque_filtid2internal(unsigned long id, int filtflags)
+{
+       filtflags &= MSG_RTR|MSG_EXT|MSG_LOCAL;
+       filtflags += filtflags&MSG_RTR;
+       return (id&MSG_ID_MASK) | (filtflags<<28);
+}
+
+int canque_get_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp, int cmd);
+       
+int canque_get_inslot4id(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio);
+       
+int canque_put_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot);
+
+int canque_abort_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot);
+
+int canque_filter_msg2edges(struct canque_ends_t *qends, struct canmsg_t *msg);
+
+int canque_test_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp);
+
+int canque_free_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot);
+
+int canque_again_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot);
+
+int canque_set_filt(struct canque_edge_t *qedge,
+       unsigned long filtid, unsigned long filtmask, int flags);
+       
+int canque_flush(struct canque_edge_t *qedge);
+
+int canqueue_disconnect_edge(struct canque_edge_t *qedge);
+
+int canqueue_connect_edge(struct canque_edge_t *qedge, struct canque_ends_t *inends, struct canque_ends_t *outends);
+
+int canqueue_ends_init_gen(struct canque_ends_t *qends);
+
+void canqueue_block_inlist(struct canque_ends_t *qends);
+
+void canqueue_block_outlist(struct canque_ends_t *qends);
+
+int canqueue_ends_kill_inlist(struct canque_ends_t *qends, int send_rest);
+
+int canqueue_ends_kill_outlist(struct canque_ends_t *qends);
+
+int canqueue_ends_filt_conjuction(struct canque_ends_t *qends, struct canfilt_t *filt);
+
+int canqueue_ends_flush_inlist(struct canque_ends_t *qends);
+
+int canqueue_ends_flush_outlist(struct canque_ends_t *qends);
+
+/* edge reference and traversal functions */
+
+void canque_edge_do_dead(struct canque_edge_t *edge);
+
+/**
+ * canque_edge_incref - increments edge reference count
+ * @edge: pointer to the edge structure
+ */
+static inline
+void canque_edge_incref(struct canque_edge_t *edge)
+{
+       atomic_inc(&edge->edge_used);
+}
+
+static inline
+can_spin_irqflags_t canque_edge_lock_both_ends(struct canque_ends_t *inends, struct canque_ends_t *outends)
+{
+       can_spin_irqflags_t  flags;
+       if(inends<outends) {
+               can_spin_lock_irqsave(&inends->ends_lock, flags);
+               can_spin_lock(&outends->ends_lock);
+       }else{
+               can_spin_lock_irqsave(&outends->ends_lock, flags);
+               if(outends!=inends) can_spin_lock(&inends->ends_lock);
+       }
+       return flags;   
+}
+
+static inline
+void canque_edge_unlock_both_ends(struct canque_ends_t *inends, struct canque_ends_t *outends, can_spin_irqflags_t flags)
+{
+       if(outends!=inends) can_spin_unlock(&outends->ends_lock);
+       can_spin_unlock_irqrestore(&inends->ends_lock, flags);
+}
+
+/* Non-inlined version of edge reference decrement */
+void __canque_edge_decref(struct canque_edge_t *edge);
+
+static inline
+void __canque_edge_decref_body(struct canque_edge_t *edge)
+{
+       can_spin_irqflags_t flags;
+       int dead_fl=0;
+       struct canque_ends_t *inends=edge->inends;
+       struct canque_ends_t *outends=edge->outends;
+       
+       flags=canque_edge_lock_both_ends(inends, outends);
+       if(atomic_dec_and_test(&edge->edge_used)) {
+               dead_fl=!canque_fifo_test_and_set_fl(&edge->fifo,DEAD);
+               /* Because of former evolution of edge references 
+                  management notify of CANQUEUE_NOTIFY_NOUSR could
+                  be moved to canque_edge_do_dead :-) */
+       }
+       canque_edge_unlock_both_ends(inends, outends, flags);
+       if(dead_fl) canque_edge_do_dead(edge);
+}
+
+#ifndef CAN_HAVE_ARCH_CMPXCHG
+/**
+ * canque_edge_decref - decrements edge reference count
+ * @edge: pointer to the edge structure
+ *
+ * This function has to be called without lock held for both ends of edge.
+ * If reference count drops to 0, function canque_edge_do_dead()
+ * is called.
+ */
+static inline
+void canque_edge_decref(struct canque_edge_t *edge)
+{
+       __canque_edge_decref_body(edge);
+}
+#else
+static inline
+void canque_edge_decref(struct canque_edge_t *edge)
+{
+       int x, y;
+       
+        x = atomic_read(&edge->edge_used);
+        do{
+               if(x<=1)
+                       return __canque_edge_decref(edge);
+               y=x;
+               /* This code strongly depends on the definition of atomic_t !!!! */
+               /* x=cmpxchg(&edge->edge_used, x, x-1); */
+               /* Next alternative could be more portable */
+               x=__cmpxchg(&edge->edge_used, x, x-1, sizeof(atomic_t));
+               /* If even this does not help, comment out CAN_HAVE_ARCH_CMPXCHG in can_sysdep.h */
+       } while(x!=y);
+}
+#endif
+
+static inline
+struct canque_edge_t *canque_first_inedge(struct canque_ends_t *qends)
+{
+       can_spin_irqflags_t flags;
+       struct list_head *entry;
+       struct canque_edge_t *edge;
+       
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       entry=qends->inlist.next;
+    skip_dead:
+       if(entry != &qends->inlist) {
+               edge=list_entry(entry,struct canque_edge_t,inpeers);
+               if(canque_fifo_test_fl(&edge->fifo,DEAD)) {
+                       entry=entry->next;
+                       goto skip_dead;
+               }
+               canque_edge_incref(edge);
+       } else {
+               edge=NULL;
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       return edge;
+}
+
+
+static inline
+struct canque_edge_t *canque_next_inedge(struct canque_ends_t *qends, struct canque_edge_t *edge)
+{
+       can_spin_irqflags_t flags;
+       struct list_head *entry;
+       struct canque_edge_t *next;
+       
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       entry=edge->inpeers.next;
+    skip_dead:
+       if(entry != &qends->inlist) {
+               next=list_entry(entry,struct canque_edge_t,inpeers);
+               if(canque_fifo_test_fl(&edge->fifo,DEAD)) {
+                       entry=entry->next;
+                       goto skip_dead;
+               }
+               canque_edge_incref(next);
+       } else {
+               next=NULL;
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       canque_edge_decref(edge);
+       return next;
+}
+
+#define canque_for_each_inedge(qends, edge) \
+           for(edge=canque_first_inedge(qends);edge;edge=canque_next_inedge(qends, edge))
+
+static inline
+struct canque_edge_t *canque_first_outedge(struct canque_ends_t *qends)
+{
+       can_spin_irqflags_t flags;
+       struct list_head *entry;
+       struct canque_edge_t *edge;
+       
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       entry=qends->outlist.next;
+    skip_dead:
+       if(entry != &qends->outlist) {
+               edge=list_entry(entry,struct canque_edge_t,outpeers);
+               if(canque_fifo_test_fl(&edge->fifo,DEAD)) {
+                       entry=entry->next;
+                       goto skip_dead;
+               }
+               canque_edge_incref(edge);
+       } else {
+               edge=NULL;
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       return edge;
+}
+
+
+static inline
+struct canque_edge_t *canque_next_outedge(struct canque_ends_t *qends, struct canque_edge_t *edge)
+{
+       can_spin_irqflags_t flags;
+       struct list_head *entry;
+       struct canque_edge_t *next;
+       
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       entry=edge->outpeers.next;
+    skip_dead:
+       if(entry != &qends->outlist) {
+               next=list_entry(entry,struct canque_edge_t,outpeers);
+               if(canque_fifo_test_fl(&edge->fifo,DEAD)) {
+                       entry=entry->next;
+                       goto skip_dead;
+               }
+               canque_edge_incref(next);
+       } else {
+               next=NULL;
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       canque_edge_decref(edge);
+       return next;
+}
+
+#define canque_for_each_outedge(qends, edge) \
+           for(edge=canque_first_outedge(qends);edge;edge=canque_next_outedge(qends, edge))
+
+/* Linux kernel specific functions */
+
+int canque_fifo_init_kern(struct canque_fifo_t *fifo, int slotsnr);
+
+int canque_fifo_done_kern(struct canque_fifo_t *fifo);
+
+struct canque_edge_t *canque_new_edge_kern(int slotsnr);
+
+int canque_get_inslot4id_wait_kern(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio);
+
+int canque_get_outslot_wait_kern(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp);
+
+int canque_sync_wait_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge);
+
+int canqueue_ends_init_kern(struct canque_ends_t *qends);
+
+int canqueue_ends_dispose_kern(struct canque_ends_t *qends, int sync);
+
+void canqueue_ends_dispose_postpone(struct canque_ends_t *qends);
+
+void canqueue_kern_initialize(void);
+
+#ifdef CAN_WITH_RTL
+
+extern struct tasklet_struct canque_dead_tl;   /*publication required only for RTL*/
+
+/* RT-Linux specific functions and variables */
+
+extern int canqueue_rtl_irq;
+
+extern unsigned long canqueue_rtl2lin_pend;
+
+#define CAN_RTL2LIN_PEND_DEAD_b 0
+
+void canqueue_rtl_initialize(void);
+void canqueue_rtl_done(void);
+
+int canqueue_rtl2lin_check_and_pend(struct canque_ends_t *qends,
+                        struct canque_edge_t *qedge, int what);
+
+struct canque_edge_t *canque_new_edge_rtl(int slotsnr);
+
+void canque_dispose_edge_rtl(struct canque_edge_t *qedge);
+
+int canque_get_inslot4id_wait_rtl(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio);
+
+int canque_get_outslot_wait_rtl(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp);
+
+int canque_sync_wait_rtl(struct canque_ends_t *qends, struct canque_edge_t *qedge);
+
+void canque_ends_free_rtl(struct canque_ends_t *qends);
+
+int canqueue_ends_init_rtl(struct canque_ends_t *qends);
+
+int canqueue_ends_dispose_rtl(struct canque_ends_t *qends, int sync);
+
+#else /*CAN_WITH_RTL*/
+
+static inline int canqueue_rtl2lin_check_and_pend(struct canque_ends_t *qends,
+                       struct canque_edge_t *qedge, int what) { return 0; }
+
+#endif /*CAN_WITH_RTL*/
+
+
+#endif /*_CAN_QUEUE_H*/
diff --git a/lincan-0.3.3/include/can_sysdep.h b/lincan-0.3.3/include/can_sysdep.h
new file mode 100644 (file)
index 0000000..5a3b86c
--- /dev/null
@@ -0,0 +1,226 @@
+/* can_sysdep.h - hides differences between individual Linux kernel 
+ *                versions and RT extensions 
+ * Linux CAN-bus device driver.
+ * Written by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef _CAN_SYSDEP_H
+#define _CAN_SYSDEP_H
+
+#ifdef CAN_WITH_RTL
+#include <rtl.h>
+#include <rtl_sync.h>
+#include <rtl_core.h>
+#include <rtl_mutex.h>
+#include <rtl_sched.h>
+#include <time.h>
+#endif /*CAN_WITH_RTL*/
+
+/*#define __NO_VERSION__*/
+/*#include <linux/module.h>*/
+
+#include <linux/version.h>
+#include <linux/wait.h>
+#include <linux/list.h>
+#include <linux/fs.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <asm/errno.h>
+
+#include <asm/io.h>
+#include <asm/atomic.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+
+#include "lincan_config.h"
+
+/*optional features*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0))
+#define CAN_ENABLE_KERN_FASYNC
+#ifdef CONFIG_PCI
+#define CAN_ENABLE_PCI_SUPPORT
+#endif
+#ifdef CONFIG_OC_LINCANVME
+#define CAN_ENABLE_VME_SUPPORT
+#endif
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+#include <linux/malloc.h>
+#else
+#include <linux/slab.h>
+#endif
+
+#ifdef CAN_ENABLE_PCI_SUPPORT
+#include "linux/pci.h"
+#endif /*CAN_ENABLE_PCI_SUPPORT*/
+
+/* Next is not sctrictly correct, because of 2.3.0, 2.3.1, 2.3.2
+   kernels need next definitions  too */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,2,19)) /* may need correction */
+  #define wait_queue_head_t struct wait_queue *
+  #define wait_queue_t      struct wait_queue
+  #define init_waitqueue_head(queue_head) (*queue_head=NULL)
+  #define init_waitqueue_entry(qentry,qtask) \
+                        (qentry->next=NULL,qentry->task=qtask)
+  #define DECLARE_WAIT_QUEUE_HEAD(name) \
+        struct wait_queue * name=NULL
+  #define DECLARE_WAITQUEUE(wait, current) \
+        struct wait_queue wait = { current, NULL }
+  #define init_MUTEX(sem) (*sem=MUTEX)
+  #define DECLARE_MUTEX(name) struct semaphore name=MUTEX
+#endif /* 2.2.19 */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) && !defined(DECLARE_TASKLET)
+  #define tasklet_struct tq_struct
+  #define DECLARE_TASKLET(_name, _func, _data) \
+                struct tq_struct _name = { sync: 0, routine: _func, data: (void*)_data }
+
+  /* void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); */
+  #define tasklet_init(_tasklet, _func, _data) \
+    do{ \
+       /* (_tasklet)->next=NULL; */ \
+       /* Above not needed for 2.2.x and buggy for 2.4.x */ \
+       (_tasklet)->sync=0; \
+       (_tasklet)->routine=_func; \
+       (_tasklet)->data=(void*)_data; \
+    }while(0)
+
+  /* void tasklet_schedule(struct tasklet_struct *t) */
+  #define tasklet_schedule(_tasklet) \
+    do{ \
+       queue_task(_tasklet,&tq_immediate); \
+       mark_bh(IMMEDIATE_BH); \
+    }while(0)
+
+  /* void tasklet_kill(struct tasklet_struct *t); */
+  #define tasklet_kill(_tasklet) \
+                synchronize_irq()
+
+#endif /* 2.4.0 */
+
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,7)) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+
+#define MINOR_NR \
+       (MINOR(file->f_dentry->d_inode->i_rdev))
+
+#else /* Linux kernel < 2.5.7 or >= 2.6.0 */
+
+#define MINOR_NR \
+       (minor(file->f_dentry->d_inode->i_rdev))
+
+#endif /* Linux kernel < 2.5.7 or >= 2.6.0 */
+
+#ifndef CAN_WITH_RTL
+#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,5,68)) && !defined(IRQ_RETVAL))
+  typedef void can_irqreturn_t;
+  #define CAN_IRQ_NONE
+  #define CAN_IRQ_HANDLED
+  #define CAN_IRQ_RETVAL(x)
+#else /* <=2.5.67 */
+  typedef irqreturn_t can_irqreturn_t;
+  #define CAN_IRQ_NONE    IRQ_NONE
+  #define CAN_IRQ_HANDLED IRQ_HANDLED
+  #define CAN_IRQ_RETVAL  IRQ_RETVAL
+#endif /* <=2.5.67 */
+#else /*CAN_WITH_RTL*/
+  typedef int can_irqreturn_t;
+  #define CAN_IRQ_NONE        0
+  #define CAN_IRQ_HANDLED     1
+  #define CAN_IRQ_RETVAL(x)   ((x) != 0)
+#endif /*CAN_WITH_RTL*/
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,33))
+   #define can_synchronize_irq(irqnum) synchronize_irq()
+#else /* >=2.5.33 */
+   #define can_synchronize_irq synchronize_irq
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+  #define del_timer_sync del_timer
+#endif /* <2.4.0 */
+
+#ifdef __HAVE_ARCH_CMPXCHG
+  #define CAN_HAVE_ARCH_CMPXCHG
+#endif
+
+#ifndef CAN_WITH_RTL
+/* Standard LINUX kernel */
+
+#define can_spinlock_t             spinlock_t
+#define can_spin_irqflags_t        unsigned long
+#define can_spin_lock              spin_lock
+#define can_spin_unlock            spin_unlock
+#define can_spin_lock_irqsave      spin_lock_irqsave
+#define can_spin_unlock_irqrestore spin_unlock_irqrestore
+#define can_spin_lock_init         spin_lock_init
+
+#ifndef DEFINE_SPINLOCK
+#define CAN_DEFINE_SPINLOCK(x)     can_spinlock_t x = SPIN_LOCK_UNLOCKED
+#else /*DEFINE_SPINLOCK*/
+#define CAN_DEFINE_SPINLOCK        DEFINE_SPINLOCK
+#endif /*DEFINE_SPINLOCK*/
+
+#if defined(CONFIG_PREEMPT) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+#define can_preempt_disable        preempt_disable
+#define can_preempt_enable         preempt_enable
+#else /*CONFIG_PREEMPT*/
+#define can_preempt_disable()      do { } while (0)
+#define can_preempt_enable()       do { } while (0)
+#endif /*CONFIG_PREEMPT*/
+
+#define can_enable_irq             enable_irq
+#define can_disable_irq            disable_irq
+
+#define can_printk                 printk
+
+/* CAN message timestamp source, it is called from interrupt context */
+#define can_gettimeofday do_gettimeofday
+
+#else /*CAN_WITH_RTL*/
+
+#define can_spinlock_t             rtl_spinlock_t
+#define can_spin_irqflags_t        rtl_irqstate_t
+#define can_spin_lock              rtl_spin_lock
+#define can_spin_unlock            rtl_spin_unlock
+#define can_spin_lock_irqsave      rtl_spin_lock_irqsave
+#define can_spin_unlock_irqrestore rtl_spin_unlock_irqrestore
+#define can_spin_lock_init         rtl_spin_lock_init
+
+#define CAN_DEFINE_SPINLOCK(x)     can_spinlock_t x = SPIN_LOCK_UNLOCKED
+
+#define can_preempt_disable()      do { } while (0)
+#define can_preempt_enable()       do { } while (0)
+
+#define can_enable_irq             rtl_hard_enable_irq
+#define can_disable_irq            rtl_hard_disable_irq
+
+#define can_printk                 rtl_printf
+
+/*
+ * terrible hack to test rtl_file private_data concept, ugh !!!
+ * this would result in crash on architectures,  where 
+ * sizeof(int) < sizeof(void *)
+ */
+#define can_set_rtl_file_private_data(fptr, p) do{ fptr->f_minor=(long)(p); } while(0)
+#define can_get_rtl_file_private_data(fptr) ((void*)((fptr)->f_minor))
+
+extern can_spinlock_t can_irq_manipulation_lock;
+
+/* CAN message timestamp source, it is called from interrupt context */
+#define can_gettimeofday(ptr) do {\
+         struct timespec temp_timespec;\
+         clock_gettime(CLOCK_REALTIME,&temp_timespec);\
+         ptr->tv_usec=temp_timespec.tv_nsec/1000;\
+         ptr->tv_sec=temp_timespec.tv_sec;\
+       } while(0)
+
+#endif /*CAN_WITH_RTL*/
+
+#endif /*_CAN_SYSDEP_H*/
diff --git a/lincan-0.3.3/include/canmsg.h b/lincan-0.3.3/include/canmsg.h
new file mode 100644 (file)
index 0000000..779f68c
--- /dev/null
@@ -0,0 +1,136 @@
+/* canmsg.h - common kernel-space and user-space CAN message structure
+ * Linux CAN-bus device driver.
+ * Written by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef _CANMSG_T_H
+#define _CANMSG_T_H
+
+#ifdef __KERNEL__
+
+#include <linux/time.h>
+#include <linux/types.h>
+
+#else /* __KERNEL__ */
+
+#include <sys/time.h>
+#include <sys/types.h>
+
+#endif /* __KERNEL__ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* 
+ * CAN_MSG_VERSION_2 enables new canmsg_t layout compatible with
+ * can4linux project from http://www.port.de/
+ * 
+ */
+#define CAN_MSG_VERSION_2
+
+/* Number of data bytes in one CAN message */
+#define CAN_MSG_LENGTH 8
+
+#ifdef CAN_MSG_VERSION_2
+
+typedef struct timeval canmsg_tstamp_t ;
+
+typedef unsigned long canmsg_id_t;
+
+/**
+ * struct canmsg_t - structure representing CAN message
+ * @flags:  message flags
+ *      %MSG_RTR .. message is Remote Transmission Request,
+ *     %MSG_EXT .. message with extended ID, 
+ *      %MSG_OVR .. indication of queue overflow condition,
+ *     %MSG_LOCAL .. message originates from this node.
+ * @cob:    communication object number (not used)
+ * @id:     ID of CAN message
+ * @timestamp: not used
+ * @length: length of used data
+ * @data:   data bytes buffer
+ *
+ * Header: canmsg.h
+ */
+struct canmsg_t {
+       int             flags;
+       int             cob;
+       canmsg_id_t     id;
+       canmsg_tstamp_t timestamp;
+       unsigned short  length;
+       unsigned char   data[CAN_MSG_LENGTH];
+};
+
+#else /*CAN_MSG_VERSION_2*/
+#ifndef PACKED
+#define PACKED __attribute__((packed))
+#endif
+/* Old, deprecated version of canmsg_t structure */
+struct canmsg_t {
+       short           flags;
+       int             cob;
+       canmsg_id_t     id;
+       unsigned long   timestamp;
+       unsigned int    length;
+       unsigned char   data[CAN_MSG_LENGTH];
+} PACKED;
+#endif /*CAN_MSG_VERSION_2*/
+
+typedef struct canmsg_t canmsg_t;
+
+/**
+ * struct canfilt_t - structure for acceptance filter setup
+ * @flags:  message flags
+ *      %MSG_RTR .. message is Remote Transmission Request,
+ *     %MSG_EXT .. message with extended ID, 
+ *      %MSG_OVR .. indication of queue overflow condition,
+ *     %MSG_LOCAL .. message originates from this node.
+ *     there are corresponding mask bits
+ *     %MSG_RTR_MASK, %MSG_EXT_MASK, %MSG_LOCAL_MASK.
+ *     %MSG_PROCESSLOCAL enables local messages processing in the
+ *     combination with global setting
+ * @queid:  CAN queue identification in the case of the multiple
+ *         queues per one user (open instance)
+ * @cob:    communication object number (not used)
+ * @id:     selected required value of cared ID id bits
+ * @mask:   select bits significand for the comparation;
+ *          1 .. take care about corresponding ID bit, 0 .. don't care
+ *
+ * Header: canmsg.h
+ */
+struct canfilt_t {
+       int             flags;
+       int             queid;
+       int             cob;
+       canmsg_id_t     id;
+       canmsg_id_t     mask;
+};
+
+typedef struct canfilt_t canfilt_t;
+
+/* Definitions to use for canmsg_t and canfilt_t flags */
+#define MSG_RTR   (1<<0)
+#define MSG_OVR   (1<<1)
+#define MSG_EXT   (1<<2)
+#define MSG_LOCAL (1<<3)
+/* If you change above lines, check canque_filtid2internal function */
+
+/* Additional definitions used for canfilt_t only */
+#define MSG_FILT_MASK_SHIFT   8
+#define MSG_RTR_MASK   (MSG_RTR<<MSG_FILT_MASK_SHIFT)
+#define MSG_EXT_MASK   (MSG_EXT<<MSG_FILT_MASK_SHIFT)
+#define MSG_LOCAL_MASK (MSG_LOCAL<<MSG_FILT_MASK_SHIFT)
+#define MSG_PROCESSLOCAL (MSG_OVR<<MSG_FILT_MASK_SHIFT)
+
+/* Can message ID mask */
+#define MSG_ID_MASK ((1l<<29)-1)
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_CANMSG_T_H*/
diff --git a/lincan-0.3.3/include/cc_can104.h b/lincan-0.3.3/include/cc_can104.h
new file mode 100644 (file)
index 0000000..722746a
--- /dev/null
@@ -0,0 +1,19 @@
+/* cc_can104.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int cc104_request_io(struct candevice_t *candev);
+int cc104_release_io(struct candevice_t *candev);
+int cc104_reset(struct candevice_t *candev); 
+int cc104_init_hw_data(struct candevice_t *candev);
+int cc104_init_chip_data(struct candevice_t *candev, int chipnr);
+int cc104_init_obj_data(struct canchip_t *chip, int objnr);
+void cc104_write_register(unsigned data, unsigned long address);
+unsigned cc104_read_register(unsigned long address);
+int cc104_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/close.h b/lincan-0.3.3/include/close.h
new file mode 100644 (file)
index 0000000..1b552f1
--- /dev/null
@@ -0,0 +1,11 @@
+/* close.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int can_close(struct inode *inode, struct file *file);
+
diff --git a/lincan-0.3.3/include/constants.h b/lincan-0.3.3/include/constants.h
new file mode 100644 (file)
index 0000000..8ba9ba4
--- /dev/null
@@ -0,0 +1,113 @@
+/* constants.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef __CONSTANTS_H__
+#define __CONSTANTS_H__
+
+/* Device name as it will appear in /proc/devices */
+#define DEVICE_NAME "can"
+
+/* Branch of the driver */
+#define CAN_DRV_BRANCH (('L'<<24)|('I'<<16)|('N'<<8)|'C')
+
+/* Version of the driver */
+#define CAN_DRV_VER_MAJOR 0
+#define CAN_DRV_VER_MINOR 3
+#define CAN_DRV_VER_PATCH 3
+#define CAN_DRV_VER ((CAN_DRV_VER_MAJOR<<16) | (CAN_DRV_VER_MINOR<<8) | CAN_DRV_VER_PATCH)
+
+/* Default driver major number, see /usr/src/linux/Documentation/devices.txt */
+#define CAN_MAJOR 91
+
+/* Definition of the maximum number of concurrent supported hardware boards,
+ * chips per board, total number of chips, interrupts and message objects.
+ * Obviously there are no 32 different interrupts, but each chip can have its
+ * own interrupt so we have to check for it MAX_IRQ == MAX_TOT_CHIPS times.
+ */
+#define MAX_HW_CARDS 8
+#define MAX_HW_CHIPS 4
+#define MAX_TOT_CHIPS (MAX_HW_CHIPS*MAX_HW_CARDS)
+#define MAX_TOT_CHIPS_STR 32   /* must be explicit for MODULE_PARM */
+#define MAX_IRQ 32
+#define MAX_MSGOBJS 32
+#define MAX_TOT_MSGOBJS (MAX_TOT_CHIPS*MAX_MSGOBJS)
+#define MAX_BUF_LENGTH 64
+//#define MAX_BUF_LENGTH 4
+
+
+/* These flags can be used for the msgobj_t structure flags data entry */
+#define MSGOBJ_OPENED_b                   0
+#define MSGOBJ_TX_REQUEST_b       1
+#define MSGOBJ_TX_LOCK_b           2
+#define MSGOBJ_IRQ_REQUEST_b       3
+#define MSGOBJ_WORKER_WAKE_b       4
+#define MSGOBJ_FILTCH_REQUEST_b    5
+#define MSGOBJ_RX_MODE_b           6
+#define MSGOBJ_RX_MODE_EXT_b       7
+#define MSGOBJ_TX_PENDING_b        8
+
+#define MSGOBJ_OPENED              (1<<MSGOBJ_OPENED_b)
+#define MSGOBJ_TX_REQUEST          (1<<MSGOBJ_TX_REQUEST_b)
+#define MSGOBJ_TX_LOCK             (1<<MSGOBJ_TX_LOCK_b)
+#define MSGOBJ_IRQ_REQUEST         (1<<MSGOBJ_IRQ_REQUEST_b)
+#define MSGOBJ_WORKER_WAKE         (1<<MSGOBJ_WORKER_WAKE_b)
+#define MSGOBJ_FILTCH_REQUEST      (1<<MSGOBJ_FILTCH_REQUEST_b)
+#define MSGOBJ_RX_MODE             (1<<MSGOBJ_RX_MODE_b)
+#define MSGOBJ_RX_MODE_EXT         (1<<MSGOBJ_RX_MODE_EXT_b)
+#define MSGOBJ_TX_PENDING          (1<<MSGOBJ_TX_PENDING_b)
+
+#define can_msgobj_test_fl(obj,obj_fl) \
+  test_bit(MSGOBJ_##obj_fl##_b,&(obj)->obj_flags)
+#define can_msgobj_set_fl(obj,obj_fl) \
+  set_bit(MSGOBJ_##obj_fl##_b,&(obj)->obj_flags)
+#define can_msgobj_clear_fl(obj,obj_fl) \
+  clear_bit(MSGOBJ_##obj_fl##_b,&(obj)->obj_flags)
+#define can_msgobj_test_and_set_fl(obj,obj_fl) \
+  test_and_set_bit(MSGOBJ_##obj_fl##_b,&(obj)->obj_flags)
+#define can_msgobj_test_and_clear_fl(obj,obj_fl) \
+  test_and_clear_bit(MSGOBJ_##obj_fl##_b,&(obj)->obj_flags)
+
+
+/* These flags can be used for the canchip_t structure flags data entry */
+#define CHIP_ATTACHED    (1<<0)  /* chip is attached to HW, release_chip() has to be called */
+#define CHIP_CONFIGURED  (1<<1)  /* chip is configured and prepared for communication */
+#define CHIP_SEGMENTED   (1<<2)  /* segmented access, ex: i82527 with 16 byte window*/
+#define CHIP_IRQ_SETUP   (1<<3)  /* IRQ handler has been set */
+#define CHIP_IRQ_PCI     (1<<4)  /* chip is on PCI board and uses PCI interrupt  */
+#define CHIP_IRQ_VME     (1<<5)  /* interrupt is VME bus and requires VME bridge */
+#define CHIP_IRQ_CUSTOM  (1<<6)  /* custom interrupt provided by board or chip code */
+#define CHIP_IRQ_FAST    (1<<7)  /* interrupt handler only schedules postponed processing */
+
+#define CHIP_MAX_IRQLOOP 1000
+
+/* System independent defines of IRQ handled state */
+#define CANCHIP_IRQ_NONE     0
+#define CANCHIP_IRQ_HANDLED  1
+#define CANCHIP_IRQ_ACCEPTED 2
+#define CANCHIP_IRQ_STUCK    3
+
+/* These flags can be used for the candevices_t structure flags data entry */
+#define CANDEV_PROGRAMMABLE_IRQ (1<<0)
+#define CANDEV_IO_RESERVED     (1<<1)
+
+/* Next flags are specific for struct canuser_t applications connection */
+#define CANUSER_RTL_CLIENT      (1<<0)
+#define CANUSER_RTL_MEM         (1<<1)
+#define CANUSER_DIRECT          (1<<2)
+
+
+enum timing_BTR1 {
+       MAX_TSEG1 = 15,
+       MAX_TSEG2 = 7
+};
+
+/* Flags for baud_rate function */
+#define BTR1_SAM (1<<1)
+
+#endif
diff --git a/lincan-0.3.3/include/devcommon.h b/lincan-0.3.3/include/devcommon.h
new file mode 100644 (file)
index 0000000..837ffb6
--- /dev/null
@@ -0,0 +1,15 @@
+/* devcommon.h - common device code
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "./canmsg.h"
+#include "./can_sysdep.h"
+#include "./constants.h"
+#include "./can_queue.h"
+
+int canqueue_ends_init_chip(struct canque_ends_t *qends, struct canchip_t *chip, struct msgobj_t *obj);
+int canqueue_ends_done_chip(struct canque_ends_t *qends);
diff --git a/lincan-0.3.3/include/eb8245.h b/lincan-0.3.3/include/eb8245.h
new file mode 100644 (file)
index 0000000..f076f38
--- /dev/null
@@ -0,0 +1,21 @@
+/* eb8245.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Added by Pavel Pisa pisa@cmp.felk.cvut.cz
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ *
+ * Support for Kontron EB8245 onboard CAN using 
+ * memory mapped SJA1000 controller
+ */
+
+int eb8245_request_io(struct candevice_t *candev);
+int eb8245_release_io(struct candevice_t *candev);
+int eb8245_reset(struct candevice_t *candev); 
+int eb8245_init_hw_data(struct candevice_t *candev);
+int eb8245_init_chip_data(struct candevice_t *candev, int chipnr);
+int eb8245_init_obj_data(struct canchip_t *chip, int objnr);
+int eb8245_program_irq(struct candevice_t *candev);
+void eb8245_write_register(unsigned data, unsigned long address);
+unsigned eb8245_read_register(unsigned long address);
diff --git a/lincan-0.3.3/include/fasync.h b/lincan-0.3.3/include/fasync.h
new file mode 100644 (file)
index 0000000..53eb6b0
--- /dev/null
@@ -0,0 +1,11 @@
+/* fasync.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int can_fasync(int fd, struct file *filp, int on);
+
diff --git a/lincan-0.3.3/include/finish.h b/lincan-0.3.3/include/finish.h
new file mode 100644 (file)
index 0000000..87df046
--- /dev/null
@@ -0,0 +1,13 @@
+/* finish.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+void msgobj_done(struct msgobj_t *obj);
+void canchip_done(struct canchip_t *chip);
+void candevice_done(struct candevice_t *candev);
+void canhardware_done(struct canhardware_t *candev);
diff --git a/lincan-0.3.3/include/hms30c7202_can.h b/lincan-0.3.3/include/hms30c7202_can.h
new file mode 100644 (file)
index 0000000..9b4704e
--- /dev/null
@@ -0,0 +1,28 @@
+/* hms30c7202_can.h - Hynix HMS30c7202 ARM device specific code\r
+ * Linux CAN-bus device driver.\r
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de\r
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl\r
+ * and Ake Hedman, eurosource, akhe@eurosource.se\r
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member\r
+ * email:pisa@cmp.felk.cvut.cz\r
+ * This software is released under the GPL-License.\r
+ * Version lincan-0.3  17 Jun 2004\r
+ */\r
+\r
+#ifndef __HMS30C7202_CAN__\r
+# define __HMS30C7202_CAN__\r
+\r
+int hms30c7202_init_hw_data(struct candevice_t *candev);\r
+int hms30c7202_init_chip_data(struct candevice_t *candev, int chipnr);\r
+int hms30c7202_request_io(struct candevice_t *candev);\r
+int hms30c7202_release_io(struct candevice_t *candev);\r
+int hms30c7202_reset(  struct candevice_t *candev);\r
+void hms30c7202_write_register(unsigned data, unsigned long address);\r
+unsigned hms30c7202_read_register(unsigned long address);\r
+\r
+\r
+\r
+int hms30c7202_init_obj_data(struct canchip_t *chip, int objnr);\r
+int hms30c7202_program_irq(struct candevice_t *candev);\r
+\r
+#endif /* __HMS30C7202_CAN__ */\r
diff --git a/lincan-0.3.3/include/i82527.h b/lincan-0.3.3/include/i82527.h
new file mode 100644 (file)
index 0000000..1747396
--- /dev/null
@@ -0,0 +1,177 @@
+/* i82527.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int i82527_enable_configuration(struct canchip_t *chip);
+int i82527_disable_configuration(struct canchip_t *chip);
+int i82527_chip_config(struct canchip_t *chip);
+int i82527_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw, 
+                                               int sampl_pt, int flags);
+int i82527_standard_mask(struct canchip_t *chip, unsigned short code, 
+                                                       unsigned short mask);
+int i82527_extended_mask(struct canchip_t *chip, unsigned long code, 
+                                                       unsigned long mask);
+int i82527_message15_mask(struct canchip_t *chip, unsigned long code, 
+                                                       unsigned long mask);
+int i82527_clear_objects(struct canchip_t *chip);
+int i82527_config_irqs(struct canchip_t *chip, short irqs);
+int i82527_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
+int i82527_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg);
+int i82527_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg);
+int i82527_remote_request(struct canchip_t *chip, struct msgobj_t *obj);
+int i82527_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1);
+int i82527_start_chip(struct canchip_t *chip);
+int i82527_stop_chip(struct canchip_t *chip);
+int i82527_check_tx_stat(struct canchip_t *chip);
+int i82527_irq_handler(int irq, struct canchip_t *chip);
+int i82527_fill_chipspecops(struct canchip_t *chip);
+
+
+#define MSG_OFFSET(object) ((object)*0x10)
+
+#define iCTL 0x00              // Control Register
+#define iSTAT 0x01             // Status Register
+#define iCPU 0x02              // CPU Interface Register
+#define iHSR 0x04              // High Speed Read
+#define iSGM0 0x06             // Standard Global Mask byte 0
+#define iSGM1 0x07
+#define iEGM0 0x08             // Extended Global Mask byte 0
+#define iEGM1 0x09
+#define iEGM2 0x0a
+#define iEGM3 0x0b
+#define i15M0 0x0c             // Message 15 Mask byte 0
+#define i15M1 0x0d
+#define i15M2 0x0e
+#define i15M3 0x0f
+#define iCLK 0x1f              // Clock Out Register
+#define iBUS 0x2f              // Bus Configuration Register
+#define iBT0 0x3f              // Bit Timing Register byte 0
+#define iBT1 0x4f
+#define iIRQ 0x5f              // Interrupt Register
+#define iP1C 0x9f              // Port 1 Register
+#define iP2C 0xaf              // Port 2 Register
+#define iP1I 0xbf              // Port 1 Data In Register
+#define iP2I 0xcf              // Port 2 Data In Register
+#define iP1O 0xdf              // Port 1 Data Out Register
+#define iP2O 0xef              // Port 2 Data Out Register
+#define iSRA 0xff              // Serial Reset Address
+
+#define iMSGCTL0       0x00    /* First Control register */
+#define iMSGCTL1       0x01    /* Second Control register */
+#define iMSGID0                0x02    /* First Byte of Message ID */
+#define iMSGID1                0x03
+#define iMSGID2                0x04
+#define iMSGID3                0x05
+#define iMSGCFG                0x06    /* Message Configuration */
+#define iMSGDAT0       0x07    /* First Data Byte */
+#define iMSGDAT1       0x08
+#define iMSGDAT2       0x09
+#define iMSGDAT3       0x0a
+#define iMSGDAT4       0x0b
+#define iMSGDAT5       0x0c
+#define iMSGDAT6       0x0d
+#define iMSGDAT7       0x0e
+
+/* Control Register (0x00) */
+enum i82527_iCTL {
+       iCTL_INI = 1,           // Initialization
+       iCTL_IE  = 1<<1,        // Interrupt Enable
+       iCTL_SIE = 1<<2,        // Status Interrupt Enable
+       iCTL_EIE = 1<<3,        // Error Interrupt Enable
+       iCTL_CCE = 1<<6         // Change Configuration Enable
+};
+
+/* Status Register (0x01) */
+enum i82527_iSTAT {
+       iSTAT_TXOK = 1<<3,      // Transmit Message Successfully
+       iSTAT_RXOK = 1<<4,      // Receive Message Successfully
+       iSTAT_WAKE = 1<<5,      // Wake Up Status
+       iSTAT_WARN = 1<<6,      // Warning Status
+       iSTAT_BOFF = 1<<7       // Bus Off Status
+};
+
+/* CPU Interface Register (0x02) */
+enum i82527_iCPU {
+       iCPU_CEN = 1,           // Clock Out Enable
+       iCPU_MUX = 1<<2,        // Multiplex
+       iCPU_SLP = 1<<3,        // Sleep
+       iCPU_PWD = 1<<4,        // Power Down Mode
+       iCPU_DMC = 1<<5,        // Divide Memory Clock
+       iCPU_DSC = 1<<6,        // Divide System Clock
+       iCPU_RST = 1<<7         // Hardware Reset Status
+};
+
+/* Clock Out Register (0x1f) */
+enum i82527_iCLK {
+       iCLK_CD0 = 1,           // Clock Divider bit 0
+       iCLK_CD1 = 1<<1,
+       iCLK_CD2 = 1<<2,
+       iCLK_CD3 = 1<<3,
+       iCLK_SL0 = 1<<4,        // Slew Rate bit 0
+       iCLK_SL1 = 1<<5
+};
+
+/* Bus Configuration Register (0x2f) */
+enum i82527_iBUS {
+       iBUS_DR0 = 1,           // Disconnect RX0 Input
+       iBUS_DR1 = 1<<1,        // Disconnect RX1 Input
+       iBUS_DT1 = 1<<3,        // Disconnect TX1 Output
+       iBUS_POL = 1<<5,        // Polarity
+       iBUS_CBY = 1<<6         // Comparator Bypass
+};
+
+#define RESET 1                        // Bit Pair Reset Status
+#define SET 2                  // Bit Pair Set Status
+#define UNCHANGED 3            // Bit Pair Unchanged
+
+/* Message Control Register 0 (Base Address + 0x0) */
+enum i82527_iMSGCTL0 {
+       INTPD_SET = SET,                // Interrupt pending
+       INTPD_RES = RESET,              // No Interrupt pending
+       INTPD_UNC = UNCHANGED,
+       RXIE_SET  = SET<<2,             // Receive Interrupt Enable
+       RXIE_RES  = RESET<<2,           // Receive Interrupt Disable
+       RXIE_UNC  = UNCHANGED<<2,
+       TXIE_SET  = SET<<4,             // Transmit Interrupt Enable
+       TXIE_RES  = RESET<<4,           // Transmit Interrupt Disable
+       TXIE_UNC  = UNCHANGED<<4,
+       MVAL_SET  = SET<<6,             // Message Valid
+       MVAL_RES  = RESET<<6,           // Message Invalid
+       MVAL_UNC  = UNCHANGED<<6
+};
+
+/* Message Control Register 1 (Base Address + 0x01) */
+enum i82527_iMSGCTL1 {
+       NEWD_SET = SET,                 // New Data
+       NEWD_RES = RESET,               // No New Data
+       NEWD_UNC = UNCHANGED,
+       MLST_SET = SET<<2,              // Message Lost
+       MLST_RES = RESET<<2,            // No Message Lost
+       MLST_UNC = UNCHANGED<<2,
+       CPUU_SET = SET<<2,              // CPU Updating
+       CPUU_RES = RESET<<2,            // No CPU Updating
+       CPUU_UNC = UNCHANGED<<2,
+       TXRQ_SET = SET<<4,              // Transmission Request
+       TXRQ_RES = RESET<<4,            // No Transmission Request
+       TXRQ_UNC = UNCHANGED<<4,
+       RMPD_SET = SET<<6,              // Remote Request Pending
+       RMPD_RES = RESET<<6,            // No Remote Request Pending
+       RMPD_UNC = UNCHANGED<<6
+};
+
+/* Message Configuration Register (Base Address + 0x06) */
+enum i82527_iMSGCFG {
+       MCFG_XTD = 1<<2,                // Extended Identifier
+       MCFG_DIR = 1<<3                 // Direction is Transmit
+};
+
+void i82527_seg_write_reg(const struct canchip_t *chip, unsigned char data, unsigned address);
+unsigned i82527_seg_read_reg(const struct canchip_t *chip, unsigned address);
diff --git a/lincan-0.3.3/include/ioctl.h b/lincan-0.3.3/include/ioctl.h
new file mode 100644 (file)
index 0000000..e780c28
--- /dev/null
@@ -0,0 +1,13 @@
+/* ioctl.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int can_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
+int can_ioctl_query(struct canuser_t *canuser, unsigned long what);
+int can_ioctl_remote_read(struct canuser_t *canuser, struct canmsg_t *rtr_msg,
+                          unsigned long rtr_id, int options);
diff --git a/lincan-0.3.3/include/ipci165.h b/lincan-0.3.3/include/ipci165.h
new file mode 100644 (file)
index 0000000..7f50484
--- /dev/null
@@ -0,0 +1,182 @@
+/* ipci165.h
+ * Linux CAN-bus device driver for IXXAT iPC-I 165 (PCI) compatible HW.
+ * Written for new CAN driver version by Radim Kalas
+ * email:kalas@unicontrols.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/kthread.h"
+
+/* PCI device identification */
+#define IPCI165_VENDOR_ID    PCI_VENDOR_ID_PLX
+#define IPCI165_DEVICE_ID    PCI_DEVICE_ID_PLX_9050
+
+#define IPCI165_SUBSYSTEM_ID 0x1067   /* subsystem ID for IXXAT iPC-I 165 card */
+#define CP350_SUBSYSTEM_ID   0x1089   /* subsystem ID for PEP/Kontron CP350 card */
+
+
+/*****************************************************************************
+ * Control Registers Memory specific defines                                 *
+ *****************************************************************************/
+#define CRM_SIZE             0x80     /* region size */
+
+#define CRM_UCR              0x50     /* user control register */
+#define CRM_ICR              0x4C     /* interrupt control register */
+
+/*****************************************************************************
+ * DP-RAM (PCI Memory Window 2) specific defines                             *
+ *****************************************************************************/
+#define DPRAM_SIZE                 8*1024   /* DP-RAM size - PCI Memory Window 2 */
+
+#define OF_CMD_BUFFER                   0   /* Offset of Command Buffer \
+                                               (normal mode) */
+
+#define OF_CH1_TX_QUEUE              0x50   /* offset to TX queue for channel 1 */
+#define OF_CH2_TX_QUEUE             0x438   /* offset to TX queue for channel 2 */
+#define OF_CH1_RX_QUEUE             0x820   /* offset to RX queue for channel 1 */
+#define OF_CH2_RX_QUEUE             0xc08   /* offset to RX queue for channel 2 */
+
+#define OF_STATUS_BUFFER            0xff0   /* offset to status buffer */
+
+#define BCI_QUEUE_SIZE                 50   /* Size of TX and RX message queues \
+                                               (number of messages) */
+#define BCI_MSG_SIZE                   20   /* Size of one message */
+
+/*****************************************************************************
+ * Bootstrap loader specific defines                                         *
+ *****************************************************************************/
+
+/* identification strings offsets & lengths */
+#define BOARD_NAME_OFS               0x00   /* Name (string) */
+#define BOARD_NAME_LEN                  7   /* String length */
+
+#define HW_VERSION_OFS               0x20   /* Version (string) */
+#define HW_VERSION_LEN                  6   /* String length */
+
+#define MODE_OFS                    0x102   /* Mode (string) */
+#define MODE_LEN                       14   /* String length */
+
+#define TYPE_LEN                       11   /* Type length */
+
+/* FW loader command buffer offsets */
+#define OF_LD_SYNC                  0x100   /* Synchronization flag */
+#define OF_LD_CMD                   0x101   /* Command code */
+#define OF_LD_NUM                   0x102   /* Size of FW block */
+#define OF_LD_ADDRESS               0x104   /* Start Address of FW block */
+#define OF_LD_DATA                  0x108   /* Data of FW block */
+
+/* FW commands */
+#define LD_CMD_DOWNLOAD                 1   /* Download FW block */
+#define LD_CMD_START_FW                 2   /* Start FW */
+
+/*****************************************************************************
+ * BCI specific defines                                                      *
+ *****************************************************************************/
+
+/* BCI command buffer offsets */
+#define OF_BCI_SYNC                  0x00   /* Synchronization flag */
+#define OF_BCI_NUM                   0x01   /* Command size */
+#define OF_BCI_CMD                   0x04   /* Command code */
+#define OF_BCI_DATA                  0x05   /* Command data */
+#define BCI_CMD_MAX_LEN                76   /* Max command length */
+
+/* BCI commands */
+#define CMD_ID                          1   /* Get identification string */
+#define CMD_VERSION                     2   /* Get version number string */
+#define CMD_TEST                        3   /* Test the command buffer, invert data bytes */
+#define CMD_INIT_CAN                    4   /* Initialization of the CAN controller */
+#define CMD_START_CAN                   6   /* Start the CAN controller */
+#define CMD_STOP_CAN                    7   /* Stop the CAN controller */
+#define CMD_RESET_CAN                   8   /* Reset the CAN controller */
+#define CMD_SET_EXT_FILTER_MASK         9   /* Set global filter mask */
+#define CMD_CONFIG_RX_QUEUE            11   /* Config receive queue mode */
+#define CMD_GET_BOARD_INFO             12   /* Get board information */
+#define CMD_START_TIMER                13   /* Start cyclic timer */
+#define CMD_STOP_TIMER                 14   /* Stop cyclic timer */
+#define CMD_SET_ACC_MASK               15   /* Set acceptance mask */
+
+/* CMD_BOARD_INFO offsets */
+#define BOARD_INFO_SIZE                26   /* Size */
+#define OF_BOARD_INFO_VER               1   /* Version in BCD, UINT16 */
+#define OF_BOARD_INFO_CHIPS             3   /* Num of chips, UINT16 */
+#define OF_BOARD_INFO_CHIP1_TYPE        5   /* Type of first chip, UINT8[10] */
+#define OF_BOARD_INFO_CHIP2_TYPE       15   /* Type of second chip, UINT8[10] */
+
+/* baud rates BTR0, BTR1 for SJA1000 */
+#define BCI_10KB                0x67,0x2F
+#define BCI_20KB                0x53,0x2F
+#define BCI_50KB                0x47,0x2F
+#define BCI_100KB               0x43,0x2F
+#define BCI_125KB               0x03,0x1C
+#define BCI_250KB               0x01,0x1C
+#define BCI_500KB               0x00,0x1C
+#define BCI_1000KB              0x00,0x14
+
+#define CAN_FRAME_MIN_BIT_LEN          47   /* Min no of bits in CAN standard data frame */
+#define CAN_FRAME_MAX_BIT_LEN         111   /* Max no of bits in CAN standard data frame */
+
+/* BCI_CONFIG_RX Queue Modes */
+#define BCI_POLL_MODE                   0
+#define BCI_LATENCY_MODE                1
+#define BCI_THROUGHPUT_MODE             2
+
+/* BCI queue info */
+struct bci_queue_t {
+  int           idx;                       /* points to the active record in buffer */
+  unsigned long addr;                      /* start address of the message queue    */
+};
+
+/* ipci165 chip data */
+struct ipci165_chip_t {
+  struct bci_queue_t rx_queue;             /* RX queue info */
+  struct bci_queue_t tx_queue;             /* TX queue info */
+  kthread_t  kthread;                      /* kernel thread info  */
+  long       flags;                        /* flag for syncing with kernel thread */
+};
+
+#define CHIP_FLAG_BUS_OFF               1  /* bus-off signal to kthread */
+#define CHIP_FLAG_RESET                 2  /* chip is being reseted */
+
+
+/* RX & TX Queue message structure */
+#define BCI_MSG_STATUS                  0  /* status       (U8) */
+#define BCI_MSG_NUM                     1  /* size         (U8) */
+#define BCI_MSG_TIMESTAMP               2  /* timestamp    (U32)*/
+#define BCI_MSG_TYPE                    6  /* message type (U8) */
+
+/* CAN message */
+#define BCI_MSG_FRAME                   7  /* frame info   (U8) */
+#define BCI_MSG_ID                      8  /* ID 11/29b    (U16/U32) */
+#define BCI_MSG_STD_DATA               10  /* message data */
+#define BCI_MSG_EXT_DATA               12  /* message data */
+
+/* status message */
+#define BCI_MSG_CAN_STATUS              8  /* status info  (U16) */
+
+#define BCI_MSG_STATUS_FREE             0  /* message buffer is free */
+#define BCI_MSG_STATUS_FULL             1  /* message buffer is used */
+
+#define BCI_MSG_TYPE_CAN                0  /* message containing CAN frame */
+#define BCI_MSG_TYPE_STATUS             1  /* message containing status info */
+
+#define BCI_MSG_FRAME_RTR            0x40  /* RTR flag          */
+#define BCI_MSG_FRAME_EXT            0x80  /* Extended Frame    */
+
+#define BCI_TIMESTAMP_RES             125  /* Time stamp resolution in usec */
+
+/* status buffer */
+#define OF_CAN1_STATUS    (OF_STATUS_BUFFER + 0)
+#define OF_CAN1_LOAD      (OF_STATUS_BUFFER + 2)
+#define OF_CAN2_STATUS    (OF_STATUS_BUFFER + 4)
+#define OF_CAN2_LOAD      (OF_STATUS_BUFFER + 6)
+#define OF_CPU_LOAD       (OF_STATUS_BUFFER + 8)
+#define OF_LIFE_COUNTER   (OF_STATUS_BUFFER + 10)
+
+#define BCI_CAN_STATUS_INIT           0x0001 /* ctrl is in init mode */
+#define BCI_CAN_STATUS_WARNING_LEVEL  0x0002 /* warning level has been reached */
+#define BCI_CAN_STATUS_BUS_OFF        0x0004 /* ctrl disconnected from net */
+#define BCI_CAN_STATUS_DATA_OVERRUN   0x0008 /* overrun of can message happend */
+#define BCI_CAN_STATUS_RX             0x0010 /* ctrl is recieving */
+#define BCI_CAN_STATUS_TX             0x0020 /* ctrl is sending */
+#define BCI_CAN_STATUS_QUEUE_OVERRUN  0x0100 /* queue overrun */
diff --git a/lincan-0.3.3/include/ipci165_fw.h b/lincan-0.3.3/include/ipci165_fw.h
new file mode 100644 (file)
index 0000000..d0a0da4
--- /dev/null
@@ -0,0 +1,15 @@
+/* ipci165_fw.h
+ * Linux CAN-bus device driver firmware for IXXAT iPC-I 165 (PCI) compatible HW.
+ *
+ * email:kalas@unicontrols.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+struct ipci165_fw_t {
+  unsigned char len;
+  unsigned long addr;
+  unsigned char a_data[16];
+};
+
+extern struct ipci165_fw_t ipci165_fw[];
diff --git a/lincan-0.3.3/include/irq.h b/lincan-0.3.3/include/irq.h
new file mode 100644 (file)
index 0000000..e2601d7
--- /dev/null
@@ -0,0 +1,13 @@
+/* irq.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int i82527_irq_handler(int irq, struct canchip_t *chip);
+int sja1000_irq_handler(int irq, struct canchip_t *chip);
+int sja1000p_irq_handler(int irq, struct canchip_t *chip);
+int dummy_irq_handler(int irq, struct canchip_t *chip);
diff --git a/lincan-0.3.3/include/kthread.h b/lincan-0.3.3/include/kthread.h
new file mode 100644 (file)
index 0000000..1450f81
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef _KTHREAD_H
+#define _KTHREAD_H
+#include <linux/config.h>
+#include <linux/version.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,40))
+  #include <linux/tqueue.h>
+  #define tasklet_struct tq_struct
+#else
+  #include <linux/devfs_fs_kernel.h>
+#endif
+
+#include <linux/wait.h>
+#include <linux/interrupt.h>
+
+#include <asm/unistd.h>
+#include <asm/semaphore.h>
+
+/* a structure to store all information we need
+   for our thread */
+typedef struct kthread_struct
+{
+        /* private data */
+
+        /* Linux task structure of thread */
+        struct task_struct *thread;
+        /* Task queue/Tasklet need to launch thread */
+        struct tasklet_struct tq;
+        /* function to be started as thread */
+        void (*function) (struct kthread_struct *kthread);
+        /* semaphore needed on start and creation of thread. */
+        struct semaphore startstop_sem;
+
+        /* public data */
+
+        /* queue thread is waiting on. Gets initialized by
+           init_kthread, can be used by thread itself.
+        */
+        wait_queue_head_t queue;
+        /* flag to tell thread whether to die or not.
+           When the thread receives a signal, it must check
+           the value of terminate and call exit_kthread and terminate
+           if set.
+        */
+        int terminate;
+        /* additional data to pass to kernel thread */
+        void *arg;
+} kthread_t;
+
+/* prototypes */
+
+/* start new kthread (called by creator) */
+void start_kthread(void (*func)(kthread_t *), kthread_t *kthread);
+
+/* stop a running thread (called by "killer") */
+void stop_kthread(kthread_t *kthread);
+
+/* setup thread environment (called by new thread) */
+void init_kthread(kthread_t *kthread, char *name);
+
+/* cleanup thread environment (called by thread upon receiving termination signal) */
+void exit_kthread(kthread_t *kthread);
+
+#endif
diff --git a/lincan-0.3.3/include/m437.h b/lincan-0.3.3/include/m437.h
new file mode 100644 (file)
index 0000000..351e3a3
--- /dev/null
@@ -0,0 +1,21 @@
+/* m437.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ *
+ * Header file for the SECO M437 (see m437.c for details)
+ */
+
+int m437_request_io(struct candevice_t *candev);
+int m437_release_io(struct candevice_t *candev);
+int m437_reset(struct candevice_t *candev); 
+int m437_init_hw_data(struct candevice_t *candev);
+int m437_init_chip_data(struct candevice_t *candev, int chipnr);
+int m437_init_obj_data(struct canchip_t *chip, int objnr);
+void m437_write_register(unsigned data, unsigned long address);
+unsigned m437_read_register(unsigned long address);
+int m437_program_irq(struct candevice_t *candev);
+int m437_register(struct hwspecops_t *hwspecops);
diff --git a/lincan-0.3.3/include/main.h b/lincan-0.3.3/include/main.h
new file mode 100644 (file)
index 0000000..99a493d
--- /dev/null
@@ -0,0 +1,512 @@
+/* main.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "./can.h"
+#include "./constants.h"
+#include "./can_sysdep.h"
+#include "./can_queue.h"
+
+#ifdef CAN_DEBUG
+       #define DEBUGMSG(fmt,args...) can_printk(KERN_ERR "can.o (debug): " fmt,\
+       ##args)
+#else
+       #define DEBUGMSG(fmt,args...)
+#endif
+
+#define CANMSG(fmt,args...) can_printk(KERN_ERR "can.o: " fmt,##args)
+
+
+extern can_spinlock_t canuser_manipulation_lock;
+
+/**
+ * struct canhardware_t - structure representing pointers to all CAN boards
+ * @nr_boards: number of present boards
+ * @rtr_queue: RTR - remote transmission request queue (expect some changes there)
+ * @rtr_lock: locking for RTR queue
+ * @candevice: array of pointers to CAN devices/boards
+ */
+struct canhardware_t {
+       int nr_boards;
+       struct rtr_id *rtr_queue;
+       can_spinlock_t rtr_lock;
+       struct candevice_t *candevice[MAX_HW_CARDS];
+};
+
+/**
+ * struct candevice_t - CAN device/board structure
+ * @hwname: text string with board type
+ * @candev_idx: board index in canhardware_t.candevice[]
+ * @io_addr: IO/physical MEM address
+ * @res_addr: optional reset register port
+ * @dev_base_addr: CPU translated IO/virtual MEM address
+ * @flags: board flags: %PROGRAMMABLE_IRQ .. interrupt number
+ *     can be programmed into board
+ * @nr_all_chips: number of chips present on the board
+ * @nr_82527_chips: number of Intel 8257 chips 
+ * @nr_sja1000_chips: number of Philips SJA100 chips
+ * @chip: array of pointers to the chip structures
+ * @hwspecops: pointer to board specific operations
+ * @hosthardware_p: pointer to the root hardware structure
+ * @sysdevptr: union reserved for pointer to bus specific
+ *     device structure (case @pcidev is used for PCI devices)
+ *
+ * The structure represent configuration and state of associated board.
+ * The driver infrastructure prepares this structure and calls
+ * board type specific board_register() function. The board support provided
+ * register function fills right function pointers in @hwspecops structure.
+ * Then driver setup calls functions init_hw_data(), init_chip_data(),
+ * init_chip_data(), init_obj_data() and program_irq(). Function init_hw_data()
+ * and init_chip_data() have to specify number and types of connected chips
+ * or objects respectively.
+ * The use of @nr_all_chips is preferred over use of fields @nr_82527_chips
+ * and @nr_sja1000_chips in the board non-specific functions.
+ * The @io_addr and @dev_base_addr is filled from module parameters
+ * to the same value. The request_io function can fix-up @dev_base_addr
+ * field if virtual address is different than bus address.
+ */
+struct candevice_t {
+       char *hwname;                   /* text board type */
+       int candev_idx;                 /* board index in canhardware_t.candevice[] */
+       unsigned long io_addr;          /* IO/physical MEM address */
+       unsigned long res_addr;         /* optional reset register port */
+       unsigned long dev_base_addr;    /* CPU translated IO/virtual MEM address */
+       unsigned int flags;
+       int nr_all_chips;
+       int nr_82527_chips;
+       int nr_sja1000_chips;
+       can_spinlock_t device_lock;
+       struct canchip_t *chip[MAX_HW_CHIPS];
+
+       struct hwspecops_t *hwspecops;
+
+       struct canhardware_t *hosthardware_p;
+       
+       union {
+               void *anydev;
+           #ifdef CAN_ENABLE_PCI_SUPPORT
+               struct pci_dev *pcidev;
+           #endif /*CAN_ENABLE_PCI_SUPPORT*/
+       } sysdevptr;
+
+};
+
+/**
+ * struct canchip_t - CAN chip state and type information
+ * @chip_type: text string describing chip type
+ * @chip_idx: index of the chip in candevice_t.chip[] array
+ * @chip_irq: chip interrupt number if any
+ * @chip_base_addr: chip base address in the CPU IO or virtual memory space
+ * @flags: chip flags: %CHIP_CONFIGURED .. chip is configured,
+ *     %CHIP_SEGMENTED .. access to the chip is segmented (mainly for i82527 chips)
+ * @clock: chip base clock frequency in Hz
+ * @baudrate: selected chip baudrate in Hz
+ * @write_register: write chip register function copy
+ * @read_register: read chip register function copy
+ * @chip_data: pointer for optional chip specific data extension
+ * @sja_cdr_reg: SJA specific register -
+ *     holds hardware specific options for the Clock Divider
+ *     register. Options defined in the sja1000.h file:
+ *     %CDR_CLKOUT_MASK, %CDR_CLK_OFF, %CDR_RXINPEN, %CDR_CBP, %CDR_PELICAN
+ * @sja_ocr_reg: SJA specific register -
+ *     hold hardware specific options for the Output Control
+ *     register. Options defined in the sja1000.h file:
+ *     %OCR_MODE_BIPHASE, %OCR_MODE_TEST, %OCR_MODE_NORMAL, %OCR_MODE_CLOCK,
+ *     %OCR_TX0_LH, %OCR_TX1_ZZ.
+ * @int_cpu_reg: Intel specific register -
+ *     holds hardware specific options for the CPU Interface
+ *     register. Options defined in the i82527.h file:
+ *     %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * @int_clk_reg: Intel specific register -
+ *     holds hardware specific options for the Clock Out
+ *     register. Options defined in the i82527.h file:
+ *     %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * @int_bus_reg: Intel specific register -
+ *     holds hardware specific options for the Bus Configuration
+ *     register. Options defined in the i82527.h file:
+ *     %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * @msgobj: array of pointers to individual communication objects
+ * @chipspecops: pointer to the set of chip specific object filled by init_chip_data() function
+ * @hostdevice: pointer to chip hosting board
+ * @max_objects: maximal number of communication objects connected to this chip
+ * @chip_lock: reserved for synchronization of the chip supporting routines
+ *     (not used in the current driver version)
+ * @worker_thread: chip worker thread ID (RT-Linux specific field)
+ * @pend_flags: holds information about pending interrupt and tx_wake() operations
+ *     (RT-Linux specific field). Masks values:
+ *     %MSGOBJ_TX_REQUEST .. some of the message objects requires tx_wake() call, 
+ *     %MSGOBJ_IRQ_REQUEST .. chip interrupt processing required
+ *     %MSGOBJ_WORKER_WAKE .. marks, that worker thread should be waked
+ *             for some of above reasons
+ *
+ * The fields @write_register and @read_register are copied from
+ * corresponding fields from @hwspecops structure
+ * (chip->hostdevice->hwspecops->write_register and 
+ * chip->hostdevice->hwspecops->read_register)
+ * to speedup can_write_reg() and can_read_reg() functions.
+ */
+struct canchip_t {
+       char *chip_type;
+       int chip_idx;   /* chip index in candevice_t.chip[] */
+       int chip_irq;
+       unsigned long chip_base_addr;
+       unsigned int flags;
+       long clock; /* Chip clock in Hz */
+       long baudrate;
+
+       void (*write_register)(unsigned data,unsigned long address);
+       unsigned (*read_register)(unsigned long address);
+       
+       void *chip_data;
+       
+       unsigned short sja_cdr_reg; /* sja1000 only! */
+       unsigned short sja_ocr_reg; /* sja1000 only! */
+       unsigned short int_cpu_reg; /* intel 82527 only! */
+       unsigned short int_clk_reg; /* intel 82527 only! */
+       unsigned short int_bus_reg; /* intel 82527 only! */
+
+       struct msgobj_t *msgobj[MAX_MSGOBJS];
+
+       struct chipspecops_t *chipspecops;
+
+       struct candevice_t *hostdevice;
+       
+       int max_objects;        /* 1 for sja1000, 15 for i82527 */
+
+       can_spinlock_t chip_lock;
+
+    #ifdef CAN_WITH_RTL
+       pthread_t worker_thread;
+       unsigned long pend_flags;
+    #endif /*CAN_WITH_RTL*/
+};
+
+/**
+ * struct msgobj_t - structure holding communication object state
+ * @obj_base_addr: 
+ * @minor: associated device minor number
+ * @object: object number in canchip_t structure +1
+ * @flags: message object flags
+ * @ret: field holding status of the last Tx operation
+ * @qends: pointer to message object corresponding ends structure
+ * @tx_qedge: edge corresponding to transmitted message
+ * @tx_slot: slot holding transmitted message, slot is taken from
+ *     canque_test_outslot() call and is freed by canque_free_outslot()
+ *     or rescheduled canque_again_outslot()
+ * @tx_retry_cnt: transmission attempt counter
+ * @tx_timeout: can be used by chip driver to check for the transmission timeout
+ * @rx_msg: temporary storage to hold received messages before
+ *     calling to canque_filter_msg2edges()
+ * @hostchip: pointer to the &canchip_t structure this object belongs to
+ * @obj_used: counter of users (associated file structures for Linux
+ *     userspace clients) of this object
+ * @obj_users: list of user structures of type &canuser_t.
+ * @obj_flags: message object specific flags. Masks values:
+ *     %MSGOBJ_TX_REQUEST .. the message object requests TX activation
+ *     %MSGOBJ_TX_LOCK .. some IRQ routine or callback on some CPU 
+ *             is running inside TX activation processing code
+ * @rx_preconfig_id: place to store RX message identifier for some chip types
+ *              that reuse same object for TX
+ */
+struct msgobj_t {
+       unsigned long obj_base_addr;
+       unsigned int minor;     /* associated device minor number  */
+       unsigned int object;    /* object number in canchip_t +1 for debug printk */
+       unsigned long obj_flags; 
+       int ret;
+
+       struct canque_ends_t *qends;
+
+       struct canque_edge_t *tx_qedge;
+       struct canque_slot_t *tx_slot;
+       int tx_retry_cnt;
+       struct timer_list tx_timeout;
+       
+       struct canmsg_t rx_msg;
+
+       struct canchip_t *hostchip;
+       unsigned long rx_preconfig_id;
+
+       atomic_t obj_used;
+       struct list_head obj_users;
+};
+
+#define CAN_USER_MAGIC 0x05402033
+
+/**
+ * struct canuser_t - structure holding CAN user/client state
+ * @flags: used to distinguish Linux/RT-Linux type
+ * @peers: for connection into list of object users
+ * @qends: pointer to the ends structure corresponding for this user
+ * @msgobj: communication object the user is connected to
+ * @rx_edge0: default receive queue for filter IOCTL
+ * @userinfo: stores user context specific information.
+ *     The field @fileinfo.file holds pointer to open device file state structure
+ *     for the Linux user-space client applications
+ * @magic: magic number to check consistency when pointer is retrieved
+ *     from file private field
+ */
+struct canuser_t {
+       unsigned long flags;
+       struct list_head peers;
+       struct canque_ends_t *qends;
+       struct msgobj_t *msgobj;
+       struct canque_edge_t *rx_edge0; /* simplifies IOCTL */
+        union {
+               struct {
+                       struct file *file;  /* back ptr to file */
+               } fileinfo;
+           #ifdef CAN_WITH_RTL
+               struct {
+                       struct rtl_file *file;
+               } rtlinfo;
+           #endif /*CAN_WITH_RTL*/
+       } userinfo;
+       int magic;
+};
+
+/**
+ * struct hwspecops_t - hardware/board specific operations
+ * @request_io: reserve io or memory range for can board
+ * @release_io: free reserved io memory range
+ * @reset: hardware reset routine
+ * @init_hw_data: called to initialize &candevice_t structure, mainly 
+ *     @res_add, @nr_all_chips, @nr_82527_chips, @nr_sja1000_chips
+ *     and @flags fields
+ * @init_chip_data: called initialize each &canchip_t structure, mainly
+ *     @chip_type, @chip_base_addr, @clock and chip specific registers.
+ *     It is responsible to setup &canchip_t->@chipspecops functions
+ *     for non-standard chip types (type other than "i82527", "sja1000" or "sja1000p")
+ * @init_obj_data: called initialize each &msgobj_t structure,
+ *     mainly @obj_base_addr field.
+ * @program_irq: program interrupt generation hardware of the board
+ *     if flag %PROGRAMMABLE_IRQ is present for specified device/board 
+ * @write_register: low level write register routine
+ * @read_register: low level read register routine
+ */
+struct hwspecops_t {
+       int (*request_io)(struct candevice_t *candev);
+       int (*release_io)(struct candevice_t *candev);
+       int (*reset)(struct candevice_t *candev);
+       int (*init_hw_data)(struct candevice_t *candev);
+       int (*init_chip_data)(struct candevice_t *candev, int chipnr);
+       int (*init_obj_data)(struct canchip_t *chip, int objnr);
+       int (*program_irq)(struct candevice_t *candev);
+       void (*write_register)(unsigned data,unsigned long address);
+       unsigned (*read_register)(unsigned long address);
+};
+
+/**
+ * struct chipspecops_t - can controller chip specific operations
+ * @chip_config: CAN chip configuration
+ * @baud_rate: set communication parameters
+ * @standard_mask: setup of mask for message filtering
+ * @extended_mask: setup of extended mask for message filtering
+ * @message15_mask: set mask of i82527 message object 15
+ * @clear_objects: clears state of all message object residing in chip
+ * @config_irqs: tunes chip hardware interrupt delivery
+ * @pre_read_config: prepares message object for message reception
+ * @pre_write_config: prepares message object for message transmission
+ * @send_msg: initiate message transmission
+ * @remote_request: configures message object and asks for RTR message
+ * @check_tx_stat: checks state of transmission engine
+ * @wakeup_tx: wakeup TX processing
+ * @filtch_rq: optional routine for propagation of outgoing edges filters to HW
+ * @enable_configuration: enable chip configuration mode
+ * @disable_configuration: disable chip configuration mode
+ * @set_btregs: configures bitrate registers
+ * @attach_to_chip: attaches to the chip, setups registers and possibly state informations
+ * @release_chip: called before chip structure removal if %CHIP_ATTACHED is set
+ * @start_chip: starts chip message processing
+ * @stop_chip: stops chip message processing
+ * @irq_handler: interrupt service routine
+ * @irq_accept: optional fast irq accept routine responsible for blocking further interrupts
+ */
+struct chipspecops_t {
+       int (*chip_config)(struct canchip_t *chip);
+       int (*baud_rate)(struct canchip_t *chip, int rate, int clock, int sjw,
+                                               int sampl_pt, int flags);
+       int (*standard_mask)(struct canchip_t *chip, unsigned short code, 
+                                                       unsigned short mask);
+       int (*extended_mask)(struct canchip_t *chip, unsigned long code, 
+                                                       unsigned long mask);
+       int (*message15_mask)(struct canchip_t *chip, unsigned long code, 
+                                                       unsigned long mask);
+       int (*clear_objects)(struct canchip_t *chip);
+       int (*config_irqs)(struct canchip_t *chip, short irqs);
+       int (*pre_read_config)(struct canchip_t *chip, struct msgobj_t *obj);
+       int (*pre_write_config)(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg);
+       int (*send_msg)(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg);
+       int (*remote_request)(struct canchip_t *chip, struct msgobj_t *obj);
+       int (*check_tx_stat)(struct canchip_t *chip);
+       int (*wakeup_tx)(struct canchip_t *chip, struct msgobj_t *obj);
+       int (*filtch_rq)(struct canchip_t *chip, struct msgobj_t *obj);
+       int (*enable_configuration)(struct canchip_t *chip);
+       int (*disable_configuration)(struct canchip_t *chip);
+       int (*set_btregs)(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1);
+       int (*attach_to_chip)(struct canchip_t *chip);
+       int (*release_chip)(struct canchip_t *chip);
+       int (*start_chip)(struct canchip_t *chip);
+       int (*stop_chip)(struct canchip_t *chip);
+       int (*irq_handler)(int irq, struct canchip_t *chip);
+       int (*irq_accept)(int irq, struct canchip_t *chip);
+};
+
+struct mem_addr {
+       void *address;
+       struct mem_addr *next;
+       size_t size;
+};
+
+/* Structure for the RTR queue */
+struct rtr_id {
+       unsigned long id;
+       struct canmsg_t *rtr_message;
+       wait_queue_head_t rtr_wq;
+       struct rtr_id *next;
+};
+
+extern int major;
+extern int minor[MAX_TOT_CHIPS];
+extern int extended;
+extern int baudrate[MAX_TOT_CHIPS];
+extern char *hw[MAX_HW_CARDS];
+extern int irq[MAX_IRQ];
+extern unsigned long io[MAX_HW_CARDS];
+extern int processlocal;
+
+extern struct canhardware_t *hardware_p;
+extern struct canchip_t *chips_p[MAX_TOT_CHIPS];
+extern struct msgobj_t *objects_p[MAX_TOT_MSGOBJS];
+
+extern struct mem_addr *mem_head;
+
+
+#if defined(CONFIG_OC_LINCAN_PORTIO_ONLY)
+extern inline void can_write_reg(const struct canchip_t *chip, unsigned char data, unsigned address)
+{
+       outb(data, chip->chip_base_addr+address);
+}
+extern inline unsigned can_read_reg(const struct canchip_t *chip, unsigned address)
+{
+       return inb(chip->chip_base_addr+address);
+}
+extern inline void canobj_write_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned char data, unsigned address)
+{
+       outb(data, obj->obj_base_addr+address);
+}
+extern inline unsigned canobj_read_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned address)
+{
+       return inb(obj->obj_base_addr+address);
+}
+
+#elif defined(CONFIG_OC_LINCAN_MEMIO_ONLY)
+extern inline void can_write_reg(const struct canchip_t *chip, unsigned char data, unsigned address)
+{
+       writeb(data, chip->chip_base_addr+address);
+}
+extern inline unsigned can_read_reg(const struct canchip_t *chip, unsigned address)
+{
+       return readb(chip->chip_base_addr+address);
+}
+extern inline void canobj_write_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned char data, unsigned address)
+{
+       writeb(data, obj->obj_base_addr+address);
+}
+extern inline unsigned canobj_read_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned address)
+{
+       return readb(obj->obj_base_addr+address);
+}
+
+#else /*CONFIG_OC_LINCAN_DYNAMICIO*/
+#ifndef CONFIG_OC_LINCAN_DYNAMICIO
+#define CONFIG_OC_LINCAN_DYNAMICIO
+#endif
+
+/* Inline function to write to the hardware registers. The argument address is 
+ * relative to the memory map of the chip and not the absolute memory address.
+ */
+extern inline void can_write_reg(const struct canchip_t *chip, unsigned char data, unsigned address)
+{
+       unsigned long address_to_write;
+       address_to_write = chip->chip_base_addr+address;
+       chip->write_register(data, address_to_write);
+}
+
+extern inline unsigned can_read_reg(const struct canchip_t *chip, unsigned address)
+{
+       unsigned long address_to_read;
+       address_to_read = chip->chip_base_addr+address;
+       return chip->read_register(address_to_read);
+}
+
+extern inline void canobj_write_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned char data, unsigned address)
+{
+       unsigned long address_to_write;
+       address_to_write = obj->obj_base_addr+address;
+       chip->write_register(data, address_to_write);
+}
+
+extern inline unsigned canobj_read_reg(const struct canchip_t *chip, const struct msgobj_t *obj,
+                               unsigned address)
+{
+       unsigned long address_to_read;
+       address_to_read = obj->obj_base_addr+address;
+       return chip->read_register(address_to_read);
+}
+
+#endif /*CONFIG_OC_LINCAN_DYNAMICIO*/
+
+int can_base_addr_fixup(struct candevice_t *candev, unsigned long new_base);
+int can_request_io_region(unsigned long start, unsigned long n, const char *name);
+void can_release_io_region(unsigned long start, unsigned long n);
+int can_request_mem_region(unsigned long start, unsigned long n, const char *name);
+void can_release_mem_region(unsigned long start, unsigned long n);
+
+struct boardtype_t {
+       const char *boardtype;
+       int (*board_register)(struct hwspecops_t *hwspecops);
+       int irqnum;
+};
+
+const struct boardtype_t* boardtype_find(const char *str);
+
+int can_check_dev_taken(void *anydev);
+
+#if defined(can_gettimeofday) && defined(CAN_MSG_VERSION_2) && 1
+static inline
+void can_filltimestamp(canmsg_tstamp_t *ptimestamp)
+{
+       can_gettimeofday(ptimestamp);
+}
+#else /* No timestamp support, set field to zero */
+static inline
+void can_filltimestamp(canmsg_tstamp_t *ptimestamp)
+{
+    #ifdef CAN_MSG_VERSION_2
+       ptimestamp->tv_sec = 0;
+       ptimestamp->tv_usec = 0;
+    #else /* CAN_MSG_VERSION_2 */
+       *ptimestamp = 0;
+    #endif /* CAN_MSG_VERSION_2 */
+
+}
+#endif /* End of timestamp source selection */
+
+#ifdef CAN_WITH_RTL
+extern int can_rtl_priority;
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/include/modparms.h b/lincan-0.3.3/include/modparms.h
new file mode 100644 (file)
index 0000000..6691931
--- /dev/null
@@ -0,0 +1,10 @@
+/* mod_parms.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int parse_mod_parms(void);
diff --git a/lincan-0.3.3/include/msmcan.h b/lincan-0.3.3/include/msmcan.h
new file mode 100644 (file)
index 0000000..9f5b387
--- /dev/null
@@ -0,0 +1,19 @@
+/* nsi.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int msmcan_request_io(struct candevice_t *candev);
+int msmcan_release_io(struct candevice_t *candev);
+int msmcan_reset(struct candevice_t *candev); 
+int msmcan_init_hw_data(struct candevice_t *candev);
+int msmcan_init_chip_data(struct candevice_t *candev, int chipnr);
+int msmcan_init_obj_data(struct canchip_t *chip, int objnr);
+void msmcan_write_register(unsigned data, unsigned long address);
+unsigned msmcan_read_register(unsigned long address);
+int msmcan_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/ns_dev_can.h b/lincan-0.3.3/include/ns_dev_can.h
new file mode 100644 (file)
index 0000000..79be115
--- /dev/null
@@ -0,0 +1,38 @@
+/* ns_dev_can.h - FPGA version of C_CAN ARM device specific code
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * Ported to FS Forth-Systeme GmbH A9M9750DEVx development boards
+ * email:nbryan@embebidos.com
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ * This port 19 May 2005
+ *
+ */
+
+#ifndef __NS_DEV_CAN__
+#define __NS_DEV_CAN__
+
+int ns_dev_init_hw_data(struct candevice_t *candev);
+int ns_dev_init_chip_data(struct candevice_t *candev, int chipnr);
+int ns_dev_request_io(struct candevice_t *candev);
+int ns_dev_release_io(struct candevice_t *candev);
+int ns_dev_reset(struct candevice_t *candev);
+void ns_dev_write_register(unsigned data, unsigned long address);
+unsigned ns_dev_read_register(unsigned long address);
+
+int ns_dev_init_obj_data(struct canchip_t *chip, int objnr);
+int ns_dev_program_irq(struct candevice_t *candev);
+
+#define NS9750_PERIPHERAL_BASE_ADDRESS    0xA0700000
+#define NS9750_PERIPHERAL_MAP_SIZE        0x400
+#define NS9750_SYSTEM_CONTROLLER_OFFSET   0x240
+
+#define BUS_WIDTH_16BIT                   1
+#define ACTIVE_LOW_CHIP_SELECT            (1<<7)
+
+#define C_CAN_CLOCK_INPUT_FREQUENCY       20000000
+
+#endif /* __NS_DEV_CAN__ */
diff --git a/lincan-0.3.3/include/nsi.h b/lincan-0.3.3/include/nsi.h
new file mode 100644 (file)
index 0000000..c48e4ef
--- /dev/null
@@ -0,0 +1,19 @@
+/* nsi.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int nsi_request_io(struct candevice_t *candev);
+int nsi_release_io(struct candevice_t *candev);
+int nsi_reset(struct candevice_t *candev); 
+int nsi_init_hw_data(struct candevice_t *candev);
+int nsi_init_chip_data(struct candevice_t *candev, int chipnr);
+int nsi_init_obj_data(struct canchip_t *chip, int objnr);
+void nsi_write_register(unsigned data, unsigned long address);
+unsigned nsi_read_register(unsigned long address);
+int nsi_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/nsi_canpci.h b/lincan-0.3.3/include/nsi_canpci.h
new file mode 100644 (file)
index 0000000..d59f927
--- /dev/null
@@ -0,0 +1,19 @@
+/* nsi.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int nsi_canpci_request_io(struct candevice_t *candev);
+int nsi_canpci_release_io(struct candevice_t *candev);
+int nsi_canpci_reset(struct candevice_t *candev); 
+int nsi_canpci_init_hw_data(struct candevice_t *candev);
+int nsi_canpci_init_chip_data(struct candevice_t *candev, int chipnr);
+int nsi_canpci_init_obj_data(struct canchip_t *chip, int objnr);
+void nsi_canpci_write_register(unsigned data, unsigned long address);
+unsigned nsi_canpci_read_register(unsigned long address);
+int nsi_canpci_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/open.h b/lincan-0.3.3/include/open.h
new file mode 100644 (file)
index 0000000..c25e1ba
--- /dev/null
@@ -0,0 +1,10 @@
+/* open.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int can_open(struct inode *inode, struct file *file);
diff --git a/lincan-0.3.3/include/oscar.h b/lincan-0.3.3/include/oscar.h
new file mode 100644 (file)
index 0000000..50cca0c
--- /dev/null
@@ -0,0 +1,19 @@
+/* oscar.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int oscar_request_io(struct candevice_t *candev);
+int oscar_release_io(struct candevice_t *candev);
+int oscar_reset(struct candevice_t *candev); 
+int oscar_init_hw_data(struct candevice_t *candev);
+int oscar_init_chip_data(struct candevice_t *candev, int chipnr);
+int oscar_init_obj_data(struct canchip_t *chip, int objnr);
+void oscar_write_register(unsigned data, unsigned long address);
+unsigned oscar_read_register(unsigned long address);
+int oscar_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/pc-i03.h b/lincan-0.3.3/include/pc-i03.h
new file mode 100644 (file)
index 0000000..0e8ec4f
--- /dev/null
@@ -0,0 +1,19 @@
+/* pc-i03.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int pci03_request_io(struct candevice_t *candev);
+int pci03_release_io(struct candevice_t *candev);
+int pci03_reset(struct candevice_t *candev); 
+int pci03_init_hw_data(struct candevice_t *candev);
+int pci03_init_chip_data(struct candevice_t *candev, int chipnr);
+int pci03_init_obj_data(struct canchip_t *chip, int objnr);
+void pci03_write_register(unsigned data, unsigned long address);
+unsigned pci03_read_register(unsigned long address);
+int pci03_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/pcan_dongle.h b/lincan-0.3.3/include/pcan_dongle.h
new file mode 100644 (file)
index 0000000..ca5a14d
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef __PCAN_DONGLE_H__
+#define __PCAN_DONGLE_H__
+
+/****************************************************************************/
+// Ingenieria Almudi (www.almudi.com)
+// Ported to LinCAN by Jose Pascual Ramírez (josepascual@almudi.com)
+//
+//
+// Copyright (C) 2001,2002,2003,2004  PEAK System-Technik GmbH
+//
+// linux@peak-system.com
+// www.peak-system.com
+//
+// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// Maintainer(s): Klaus Hitschler (klaus.hitschler@gmx.de)
+/****************************************************************************/
+
+/****************************************************************************/
+//
+// all parts to handle device interface specific parts of pcan-dongle
+//
+// Revision 1.13  2004/04/11 22:03:29  klaus
+// cosmetic changes
+//
+// Revision 1.12  2003/03/02 10:58:07  klaus
+// merged USB thread into main path
+//
+// Revision 1.11  2003/03/02 10:58:07  klaus
+// merged USB thread into main path
+//
+// Revision 1.10.2.3  2003/01/29 20:34:20  klaus
+// release_20030129_a and release_20030129_u released
+//
+// Revision 1.10.2.2  2003/01/29 20:34:19  klaus
+// release_20030129_a and release_20030129_u released
+//
+// Revision 1.10.2.1  2003/01/28 23:28:26  klaus
+// reorderd pcan_usb.c and pcan_usb_kernel.c, tidied up
+//
+// Revision 1.10  2002/01/30 20:54:27  klaus
+// simple source file header change
+//
+/****************************************************************************/
+
+/****************************************************************************/
+// parameter wHardwareType, used by open 
+#define HW_ISA             1 // not supported with LINUX, 82C200 chip 
+#define HW_DONGLE_SJA      5
+#define HW_DONGLE_SJA_EPP  6 
+#define HW_DONGLE_PRO      7 // not yet supported with LINUX
+#define HW_DONGLE_PRO_EPP  8 // not yet supported with LINUX
+#define HW_ISA_SJA         9 // use this also for PC/104
+#define HW_PCI                 10 // PCI carries always SJA1000 chips
+#define HW_USB            11 // don't know if this is common over peak products
+
+
+struct DONGLE_PORT
+{
+  u32  dwPort;                                             // the port of the transport layer
+  u16  wIrq;                                               // the associated irq 
+  struct pardevice *pardev;                                // points to the associated parallel port (PARPORT subsytem)
+  u16  wEcr;                                               // ECR register in case of EPP
+  u8   ucOldDataContent;                                   // the overwritten contents of the port registers
+  u8   ucOldControlContent;
+  u8   ucOldECRContent;
+
+
+  u16  wInitStep;                                          // device specific init state
+  u16  wType;                                              // (number type) to distinguish sp and epp
+  int  nMinor;                                             // the associated minor
+  char *type;                                              // the literal type of the device, info only
+
+  struct canchip_t *chip;
+};
+
+
+/****************************************************************************/
+// DEFINES
+
+int pcan_dongle_request_io(struct candevice_t *candev);
+int pcan_dongle_release_io(struct candevice_t *candev);
+int pcan_dongle_reset(struct candevice_t *candev); 
+int pcan_dongle_init_hw_data(struct candevice_t *candev);
+int pcan_dongle_init_chip_data(struct candevice_t *candev, int chipnr);
+int pcan_dongle_init_obj_data(struct canchip_t *chip, int objnr);
+void pcan_dongle_write_register(unsigned data, unsigned long address);
+unsigned pcan_dongle_read_register(unsigned long address);
+int pcan_dongle_program_irq(struct candevice_t *candev);
+
+#endif // __PCAN_DONGLE_H__
diff --git a/lincan-0.3.3/include/pccan.h b/lincan-0.3.3/include/pccan.h
new file mode 100644 (file)
index 0000000..918e7cd
--- /dev/null
@@ -0,0 +1,26 @@
+/* pccan.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int pccanf_request_io(struct candevice_t *candev);
+int pccanf_release_io(struct candevice_t *candev);
+int pccand_request_io(struct candevice_t *candev);
+int pccand_release_io(struct candevice_t *candev);
+int pccanq_request_io(struct candevice_t *candev);
+int pccanq_release_io(struct candevice_t *candev);
+int pccanf_reset(struct candevice_t *candev);
+int pccand_reset(struct candevice_t *candev);
+int pccanq_reset(struct candevice_t *candev); 
+int pccan_init_hw_data(struct candevice_t *candev);
+int pccan_init_chip_data(struct candevice_t *candev, int chipnr);
+int pccan_init_obj_data(struct canchip_t *chip, int objnr);
+void pccan_write_register(unsigned data, unsigned long address);
+unsigned pccan_read_register(unsigned long address);
+int pccan_program_irq(struct candevice_t *candev);
+
+
diff --git a/lincan-0.3.3/include/pcccan.h b/lincan-0.3.3/include/pcccan.h
new file mode 100644 (file)
index 0000000..50039c1
--- /dev/null
@@ -0,0 +1,19 @@
+/* pcccan.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int pcccan_request_io(struct candevice_t *candev);
+int pcccan_release_io(struct candevice_t *candev);
+int pcccan_reset(struct candevice_t *candev); 
+int pcccan_init_hw_data(struct candevice_t *candev);
+int pcccan_init_chip_data(struct candevice_t *candev, int chipnr);
+int pcccan_init_obj_data(struct canchip_t *chip, int objnr);
+void pcccan_write_register(unsigned data, unsigned long address);
+unsigned pcccan_read_register(unsigned long address);
+int pcccan_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/pcm3680.h b/lincan-0.3.3/include/pcm3680.h
new file mode 100644 (file)
index 0000000..d97cbd2
--- /dev/null
@@ -0,0 +1,19 @@
+/* pcm3680.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int pcm3680_request_io(struct candevice_t *candev);
+int pcm3680_release_io(struct candevice_t *candev);
+int pcm3680_reset(struct candevice_t *candev); 
+int pcm3680_init_hw_data(struct candevice_t *candev);
+int pcm3680_init_chip_data(struct candevice_t *candev, int chipnr);
+int pcm3680_init_obj_data(struct canchip_t *chip, int objnr);
+void pcm3680_write_register(unsigned data, unsigned long address);
+unsigned pcm3680_read_register(unsigned long address);
+int pcm3680_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/pikronisa.h b/lincan-0.3.3/include/pikronisa.h
new file mode 100644 (file)
index 0000000..a6ba399
--- /dev/null
@@ -0,0 +1,22 @@
+/* pikronisa.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Added by Pavel Pisa pisa@cmp.felk.cvut.cz
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ *
+ * Support for PiKRON Ltd ISA CAN card using 
+ * memory mapped SJA1000 controller
+ */
+
+int pikronisa_request_io(struct candevice_t *candev);
+int pikronisa_release_io(struct candevice_t *candev);
+int pikronisa_reset(struct candevice_t *candev); 
+int pikronisa_init_hw_data(struct candevice_t *candev);
+int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr);
+int pikronisa_init_obj_data(struct canchip_t *chip, int objnr);
+int pikronisa_program_irq(struct candevice_t *candev);
+void pikronisa_write_register(unsigned data, unsigned long address);
+unsigned pikronisa_read_register(unsigned long address);
+
diff --git a/lincan-0.3.3/include/pip.h b/lincan-0.3.3/include/pip.h
new file mode 100644 (file)
index 0000000..5feddfe
--- /dev/null
@@ -0,0 +1,21 @@
+/* pip.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ * Modified for PIP5,PIP6,PIP7 and PIP8
+ * Stefan Peter, MPL AG, info@mpl.ch
+ */
+
+int pip_request_io(struct candevice_t *candev);
+int pip_release_io(struct candevice_t *candev);
+int pip_reset(struct candevice_t *candev); 
+int pip_init_hw_data(struct candevice_t *candev);
+int pip_init_chip_data(struct candevice_t *candev, int chipnr);
+int pip_init_obj_data(struct canchip_t *chip, int objnr);
+void pip_write_register(unsigned data, unsigned long address);
+unsigned pip_read_register(unsigned long address);
+int pip_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/proc.h b/lincan-0.3.3/include/proc.h
new file mode 100644 (file)
index 0000000..c2a3c96
--- /dev/null
@@ -0,0 +1,34 @@
+/* proc.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include <linux/proc_fs.h>
+#include "./constants.h"
+
+int can_init_procdir(void);
+int can_delete_procdir(void);
+
+struct canproc_t {
+       struct proc_dir_entry *can_proc_entry;
+       struct channelproc_t *channel[MAX_TOT_CHIPS];
+};
+
+struct channelproc_t {
+       char ch_name[20];
+       struct proc_dir_entry *ch_entry;
+       struct objectproc_t *object[MAX_MSGOBJS];
+};
+
+
+struct objectproc_t {
+       char obj_name[20];
+       struct proc_dir_entry *obj_entry;
+       char lnk_name[20];
+       char lnk_dev[20];
+       struct proc_dir_entry *lnk;
+}; 
diff --git a/lincan-0.3.3/include/read.h b/lincan-0.3.3/include/read.h
new file mode 100644 (file)
index 0000000..ae06c63
--- /dev/null
@@ -0,0 +1,10 @@
+/* read.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+ssize_t can_read(struct file *file,char *buffer,size_t length,loff_t *offset);
diff --git a/lincan-0.3.3/include/select.h b/lincan-0.3.3/include/select.h
new file mode 100644 (file)
index 0000000..c79b956
--- /dev/null
@@ -0,0 +1,10 @@
+/* select.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Added by Pavel Pisa pisa@cmp.felk.cvut.cz
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+unsigned int can_poll(struct file *file, poll_table *wait);
diff --git a/lincan-0.3.3/include/setup.h b/lincan-0.3.3/include/setup.h
new file mode 100644 (file)
index 0000000..d35a8b1
--- /dev/null
@@ -0,0 +1,16 @@
+/* setup.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int init_hw_struct(void);
+int list_hw(void);
+void *can_checked_malloc(size_t size);
+int can_checked_free(void *address_p);
+int can_del_mem_list(void);
+int can_chip_setup_irq(struct canchip_t *chip);
+void can_chip_free_irq(struct canchip_t *chip);
diff --git a/lincan-0.3.3/include/sja1000.h b/lincan-0.3.3/include/sja1000.h
new file mode 100644 (file)
index 0000000..574fefc
--- /dev/null
@@ -0,0 +1,140 @@
+/* sja1000.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int sja1000_enable_configuration(struct canchip_t *chip);
+int sja1000_disable_configuration(struct canchip_t *chip);
+int sja1000_chip_config(struct canchip_t *chip);
+int sja1000_standard_mask(struct canchip_t *chip, unsigned short code, unsigned short mask);
+int sja1000_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw, 
+                                               int sampl_pt, int flags);
+int sja1000_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
+int sja1000_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg);
+int sja1000_send_msg(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg);
+int sja1000_check_tx_stat(struct canchip_t *chip);
+int sja1000_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1);
+int sja1000_start_chip(struct canchip_t *chip);
+int sja1000_stop_chip(struct canchip_t *chip);
+int sja1000_irq_handler(int irq, struct canchip_t *chip);
+int sja1000_fill_chipspecops(struct canchip_t *chip);
+
+/* BasicCAN mode address map */
+#define SJACR          0x00    /* Control register */
+#define SJACMR         0x01    /* Command register */
+#define SJASR          0x02    /* Status register */
+#define SJAIR          0x03    /* Interrupt register */
+#define SJAACR         0x04    /* Acceptance Code register */
+#define SJAAMR         0x05    /* Acceptance Mask Register */
+#define SJABTR0                0x06    /* Bus Timing register 0 */
+#define SJABTR1                0x07    /* Bus Timing register 1 */
+#define SJAOCR         0x08    /* Output Control register */
+#define SJACDR         0x1f    /* Clock Divider register */
+
+#define SJATXID1       0x0a    /* Identifier byte 1 */
+#define SJATXID0       0x0b    /* Identifier byte 0 */
+#define SJATXDAT0      0x0c    /* First data byte */
+#define SJATXDAT1      0x0d
+#define SJATXDAT2      0x0e
+#define SJATDDAT3      0x0f
+#define SJATXDAT4      0x10
+#define SJATXDAT5      0x11
+#define SJATXDAT6      0x12
+#define SJATXDAT7      0x13
+
+#define SJARXID1       0x14    /* Identifier byte 1 */
+#define SJARXID0       0x15    /* Identifier byte 0 */
+#define SJARXDAT0      0x16    /* First data byte */
+#define SJARXDAT1      0x17
+#define SJARXDAT2      0x18
+#define SJARXDAT3      0x19
+#define SJARXDAT4      0x1a
+#define SJARXDAT5      0x1b
+#define SJARXDAT6      0x1c
+#define SJARXDAT7      0x1d
+
+/* Command register */
+enum sja1000_BASIC_CMR {
+       sjaCMR_TR  = 1,         // Transmission request
+       sjaCMR_AT  = 1<<1,      // Abort Transmission
+       sjaCMR_RRB = 1<<2,      // Release Receive Buffer
+       sjaCMR_CDO = 1<<3,      // Clear Data Overrun
+       sjaCMR_GTS = 1<<4       // Go To Sleep
+};
+
+/* Status Register */
+enum sja1000_BASIC_SR {
+       sjaSR_RBS = 1,          // Receive Buffer Status
+       sjaSR_DOS = 1<<1,       // Data Overrun Status
+       sjaSR_TBS = 1<<2,       // Transmit Buffer Status
+       sjaSR_TCS = 1<<3,       // Transmission Complete Status
+       sjaSR_RS  = 1<<4,       // Receive Status
+       sjaSR_TS  = 1<<5,       // Transmit Status
+       sjaSR_ES  = 1<<6,       // Error Status
+       sjaSR_BS  = 1<<7        // Bus Status
+};
+
+/* Control Register */
+enum sja1000_BASIC_CR {
+       sjaCR_RR  = 1,          // Reset Request
+       sjaCR_RIE = 1<<1,       // Receive Interrupt Enable
+       sjaCR_TIE = 1<<2,       // Transmit Interrupt Enable
+       sjaCR_EIE = 1<<3,       // Error Interrupt Enable
+       sjaCR_OIE = 1<<4        // Overrun Interrupt Enable
+};
+
+/* Interrupt (status) Register */
+enum sja1000_BASIC_IR {
+       sjaIR_RI  = 1,          // Receive Interrupt
+       sjaIR_TI  = 1<<1,       // Transmit Interrupt
+       sjaIR_EI  = 1<<2,       // Error Interrupt
+       sjaIR_DOI = 1<<3,       // Data Overrun Interrupt
+       sjaIR_WUI = 1<<4        // Wake-Up Interrupt
+};
+
+/* Clock Divider Register */
+enum sja1000_CDR {
+       /* f_out = f_osc/(2*(CDR[2:0]+1)) or f_osc if CDR[2:0]==7 */
+       sjaCDR_CLKOUT_DIV1 = 7,
+       sjaCDR_CLKOUT_DIV2 = 0,
+       sjaCDR_CLKOUT_DIV4 = 1,
+       sjaCDR_CLKOUT_DIV6 = 2,
+       sjaCDR_CLKOUT_DIV8 = 3,
+       sjaCDR_CLKOUT_DIV10 = 4,
+       sjaCDR_CLKOUT_DIV12 = 5,
+       sjaCDR_CLKOUT_DIV14 = 6,
+       sjaCDR_CLKOUT_MASK = 7,
+       sjaCDR_CLK_OFF = 1<<3,  // Clock Off
+       sjaCDR_RXINPEN = 1<<5,  // TX1 output is RX irq output
+       sjaCDR_CBP = 1<<6,      // Input Comparator By-Pass
+       sjaCDR_PELICAN = 1<<7   // PeliCAN Mode 
+};
+
+/* Output Control Register */
+enum sja1000_OCR {
+       sjaOCR_MODE_BIPHASE = 0,
+       sjaOCR_MODE_TEST = 1,
+       sjaOCR_MODE_NORMAL = 2,
+       sjaOCR_MODE_CLOCK = 3,
+// TX0 push-pull not inverted
+       sjaOCR_TX0_LH = 0x18,
+// TX0 push-pull inverted
+       sjaOCR_TX0_HL = 0x1c,
+// TX1 floating (off)
+       sjaOCR_TX1_ZZ = 0,
+// TX1 pull-down not inverted
+       sjaOCR_TX1_LZ = 0x40
+};
+
+/** Frame format information 0x11 */
+enum sja1000_BASIC_ID0 {
+       sjaID0_RTR = 1<<4,      // Remote request
+       sjaID0_DLC_M = (1<<4)-1 // Length Mask
+};
diff --git a/lincan-0.3.3/include/sja1000p.h b/lincan-0.3.3/include/sja1000p.h
new file mode 100644 (file)
index 0000000..1aa0923
--- /dev/null
@@ -0,0 +1,200 @@
+/* sja1000p.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Added by T.Motylewski@bfad.de
+ * See app. note an97076.pdf from Philips Semiconductors 
+ * and SJA1000 data sheet
+ * PELICAN mode
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int sja1000p_chip_config(struct canchip_t *chip);
+int sja1000p_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask);
+int sja1000p_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+               int sampl_pt, int flags);
+int sja1000p_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
+int sja1000p_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+               struct canmsg_t *msg);
+int sja1000p_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
+               struct canmsg_t *msg);
+int sja1000p_fill_chipspecops(struct canchip_t *chip);
+int sja1000p_irq_handler(int irq, struct canchip_t *chip);
+
+
+/* PeliCAN mode */
+enum SJA1000_PeliCAN_regs {
+       SJAMOD  = 0x00,
+/// Command register
+       SJACMR  = 0x01,
+/// Status register
+       SJASR   = 0x02,
+/// Interrupt register
+       SJAIR   = 0x03,
+/// Interrupt Enable
+       SJAIER  = 0x04,
+/// Bus Timing register 0
+       SJABTR0 = 0x06,
+/// Bus Timing register 1
+       SJABTR1 = 0x07,
+/// Output Control register
+       SJAOCR  = 0x08,
+/// Arbitration Lost Capture
+       SJAALC  = 0x0b,
+/// Error Code Capture
+       SJAECC  = 0x0c,
+/// Error Warning Limit
+       SJAEWLR = 0x0d,
+/// RX Error Counter
+       SJARXERR = 0x0e,
+/// TX Error Counter
+       SJATXERR0 = 0x0e,
+       SJATXERR1 = 0x0f,
+/// Rx Message Counter (number of msgs. in RX FIFO
+       SJARMC  = 0x1d,
+/// Rx Buffer Start Addr. (address of current MSG)
+       SJARBSA = 0x1e,
+/// Transmit Buffer (write) Receive Buffer (read) Frame Information
+       SJAFRM = 0x10,
+/// ID bytes (11 bits in 0 and 1 or 16 bits in 0,1 and 13 bits in 2,3 (extended))
+       SJAID0 = 0x11, SJAID1 = 0x12, 
+/// ID cont. for extended frames
+       SJAID2 = 0x13, SJAID3 = 0x14,
+/// Data start standard frame
+       SJADATS = 0x13,
+/// Data start extended frame
+       SJADATE = 0x15,
+/// Acceptance Code (4 bytes) in RESET mode
+       SJAACR0 = 0x10,
+/// Acceptance Mask (4 bytes) in RESET mode
+       SJAAMR0 = 0x14,
+/// 4 bytes
+       SJA_PeliCAN_AC_LEN = 4, 
+/// Clock Divider
+       SJACDR = 0x1f
+};
+
+/** Mode Register 0x00 */
+enum sja1000_PeliCAN_MOD {
+       sjaMOD_SM = 1<<4,  // Sleep Mode (writable only in OPERATING mode)
+       sjaMOD_AFM= 1<<3,  // Acceptance Filter Mode (writable only in RESET)
+       sjaMOD_STM= 1<<2,  // Self Test Mode (writable only in RESET)
+       sjaMOD_LOM= 1<<1,  // Listen Only Mode (writable only in RESET)
+       sjaMOD_RM = 1      // Reset Mode
+};
+
+/** Command Register 0x01 */
+enum sja1000_PeliCAN_CMR { 
+       sjaCMR_SRR= 1<<4,  // Self Reception Request (GoToSleep in BASIC mode)
+       sjaCMR_CDO= 1<<3,  // Clear Data Overrun
+       sjaCMR_RRB= 1<<2,  // Release Receive Buffer
+       sjaCMR_AT = 1<<1,  // Abort Transmission
+       sjaCMR_TR = 1 };   // Transmission Request
+
+/** Status Register 0x02 */
+enum sja1000_SR {
+       sjaSR_BS  = 1<<7,  // Bus Status
+       sjaSR_ES  = 1<<6,  // Error Status
+       sjaSR_TS  = 1<<5,  // Transmit Status
+       sjaSR_RS  = 1<<4,  // Receive Status
+       sjaSR_TCS = 1<<3,  // Transmission Complete Status
+       sjaSR_TBS = 1<<2,  // Transmit Buffer Status
+       sjaSR_DOS = 1<<1,  // Data Overrun Status
+       sjaSR_RBS = 1 };   // Receive Buffer Status
+
+/** Interrupt Enable Register 0x04 */
+enum sja1000_PeliCAN_IER {
+       sjaIER_BEIE= 1<<7, // Bus Error Interrupt Enable
+       sjaIER_ALIE= 1<<6, // Arbitration Lost Interrupt Enable
+       sjaIER_EPIE= 1<<5, // Error Passive Interrupt Enable
+       sjaIER_WUIE= 1<<4, // Wake-Up Interrupt Enable
+       sjaIER_DOIE= 1<<3, // Data Overrun Interrupt Enable
+       sjaIER_EIE = 1<<2, // Error Warning Interrupt Enable
+       sjaIER_TIE = 1<<1, // Transmit Interrupt Enable
+       sjaIER_RIE = 1,    // Receive Interrupt Enable
+       sjaENABLE_INTERRUPTS = sjaIER_BEIE|sjaIER_EPIE|sjaIER_DOIE|sjaIER_EIE|sjaIER_TIE|sjaIER_RIE,
+       sjaDISABLE_INTERRUPTS = 0
+// WARNING: the chip automatically enters RESET (bus off) mode when 
+       // error counter > 255
+};
+
+/** Arbitration Lost Capture Register 0x0b.
+ * Counting starts from 0 (bit1 of ID). Bits 5-7 reserved*/
+enum sja1000_PeliCAN_ALC {
+       sjaALC_SRTR = 0x0b,// Arbitration lost in bit SRTR
+       sjaALC_IDE  = 0x1c, // Arbitration lost in bit IDE
+       sjaALC_RTR  = 0x1f, // Arbitration lost in RTR
+};
+
+/** Error Code Capture Register 0x0c*/
+enum sja1000_PeliCAN_ECC {
+       sjaECC_ERCC1 = 1<<7,
+       sjaECC_ERCC0 = 1<<6,
+       sjaECC_BIT   = 0,
+       sjaECC_FORM  = sjaECC_ERCC0,
+       sjaECC_STUFF = sjaECC_ERCC1,
+       sjaECC_OTHER = sjaECC_ERCC0 | sjaECC_ERCC1,
+       sjaECC_DIR   = 1<<5,    // 1 == RX, 0 == TX
+       sjaECC_SEG_M = (1<<5) -1 // Segment mask, see page 37 of SJA1000 Data Sheet
+};
+
+/** Frame format information 0x10 */
+enum sja1000_PeliCAN_FRM {
+       sjaFRM_FF = 1<<7, // Frame Format 1 == extended, 0 == standard
+       sjaFRM_RTR = 1<<6, // Remote request
+       sjaFRM_DLC_M = (1<<4)-1 // Length Mask
+};
+
+
+/** Interrupt (status) Register 0x03 */
+enum sja1000_PeliCAN_IR {
+       sjaIR_BEI = 1<<7,  // Bus Error Interrupt
+       sjaIR_ALI = 1<<6,  // Arbitration Lost Interrupt
+       sjaIR_EPI = 1<<5,  // Error Passive Interrupt (entered error passive state or error active state)
+       sjaIR_WUI = 1<<4,  // Wake-Up Interrupt
+       sjaIR_DOI = 1<<3,  // Data Overrun Interrupt
+       sjaIR_EI  = 1<<2,  // Error Interrupt
+       sjaIR_TI  = 1<<1,  // Transmit Interrupt
+       sjaIR_RI  = 1      // Receive Interrupt
+};
+
+/** Bus Timing 1 Register 0x07 */
+enum sja1000_BTR1 {
+       sjaMAX_TSEG1 = 15,
+       sjaMAX_TSEG2 = 7
+};
+
+/** Output Control Register 0x08 */
+enum sja1000_OCR {
+       sjaOCR_MODE_BIPHASE = 0,
+       sjaOCR_MODE_TEST = 1,
+       sjaOCR_MODE_NORMAL = 2,
+       sjaOCR_MODE_CLOCK = 3,
+/// TX0 push-pull not inverted
+       sjaOCR_TX0_LH = 0x18,
+/// TX1 floating (off)
+       sjaOCR_TX1_ZZ = 0
+};
+
+/** Clock Divider register 0x1f */
+enum sja1000_CDR {
+       sjaCDR_PELICAN = 1<<7,
+/// bypass input comparator
+       sjaCDR_CBP = 1<<6,
+/// switch TX1 to generate RX INT
+       sjaCDR_RXINPEN = 1<<5,
+       sjaCDR_CLK_OFF = 1<<3,
+/// f_out = f_osc/(2*(CDR[2:0]+1)) or f_osc if CDR[2:0]==7
+       sjaCDR_CLKOUT_DIV1 = 7,
+       sjaCDR_CLKOUT_DIV2 = 0,
+       sjaCDR_CLKOUT_DIV4 = 1,
+       sjaCDR_CLKOUT_DIV6 = 2,
+       sjaCDR_CLKOUT_DIV8 = 3,
+       sjaCDR_CLKOUT_DIV10 = 4,
+       sjaCDR_CLKOUT_DIV12 = 5,
+       sjaCDR_CLKOUT_DIV14 = 6,
+       sjaCDR_CLKOUT_MASK = 7
+};
+
+/** flags for sja1000_baud_rate */
+#define BTR1_SAM (1<<1)
diff --git a/lincan-0.3.3/include/smartcan.h b/lincan-0.3.3/include/smartcan.h
new file mode 100644 (file)
index 0000000..58c0d42
--- /dev/null
@@ -0,0 +1,18 @@
+/* smartcan.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int smartcan_request_io(struct candevice_t *candev);
+int smartcan_release_io(struct candevice_t *candev);
+int smartcan_reset(struct candevice_t *candev);
+int smartcan_init_hw_data(struct candevice_t *candev);
+int smartcan_init_chip_data(struct candevice_t *candev, int chipnr);
+int smartcan_init_obj_data(struct canchip_t *chip, int objnr);
+void smartcan_write_register(unsigned data, unsigned long address);
+unsigned smartcan_read_register(unsigned long address);
+
diff --git a/lincan-0.3.3/include/ssv.h b/lincan-0.3.3/include/ssv.h
new file mode 100644 (file)
index 0000000..6395782
--- /dev/null
@@ -0,0 +1,17 @@
+/* ssv.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@casema.net
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int ssv_request_io(struct candevice_t *candev);
+int ssv_release_io(struct candevice_t *candev);
+int ssv_reset(struct candevice_t *candev);
+int ssv_init_hw_data(struct candevice_t *candev);
+int ssv_init_chip_data(struct candevice_t *candev, int chipnr);
+int ssv_init_obj_data(struct canchip_t *chip, int objnr);
+void ssv_write_register(unsigned data, unsigned long address);
+unsigned ssv_read_register(unsigned long address);
+int ssv_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/template.h b/lincan-0.3.3/include/template.h
new file mode 100644 (file)
index 0000000..88f162c
--- /dev/null
@@ -0,0 +1,19 @@
+/* template.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+int template_request_io(struct candevice_t *candev);
+int template_release_io(struct candevice_t *candev);
+int template_reset(struct candevice_t *candev); 
+int template_init_hw_data(struct candevice_t *candev);
+int template_init_chip_data(struct candevice_t *candev, int chipnr);
+int template_init_obj_data(struct canchip_t *chip, int objnr);
+void template_write_register(unsigned data, unsigned long address);
+unsigned template_read_register(unsigned long address);
+int template_program_irq(struct candevice_t *candev);
+
diff --git a/lincan-0.3.3/include/tscan1.h b/lincan-0.3.3/include/tscan1.h
new file mode 100644 (file)
index 0000000..97efdb6
--- /dev/null
@@ -0,0 +1,67 @@
+/* template.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+//Ids SECTION
+#define TSCAN1_ID0             0xF6
+#define TSCAN1_ID1             0xB9
+#define TS7KV_ID0              0x41
+#define TS7KV_ID1              0x20
+
+//MEMORY SECTION
+#ifdef CONFIG_ARM
+#include <asm-arm/arch-ep93xx/regmap.h>
+#define TSXXX_BASE_IO  0x01E00000
+#endif
+
+#define TSCAN1_BASE_IO 0x150
+#define TS7KV_BASE_IO  0xE0
+#define TSXXX_IO_RANGE 0x8
+#define TSXXX_CAN_RANGE        0x20
+
+#define TSXXX_ID0_REG  0x0
+#define TSXXX_ID1_REG  0x1
+#define TSXXX_PLD_REG  0x2
+
+#define TSCAN1_WIN_REG 0x4
+#define TSCAN1_MOD_REG 0x5
+#define TSCAN1_JMP_REG 0x6
+
+#define TS7KV_CTR1_REG 0x4
+#define TS7KV_CTR2_REG 0x5
+#define TS7KV_FPGA_REG 0x6
+#define TS7KV_JMP_REG  0x7
+#define TS7KV_WIN_REG  0x1E
+
+//IRQs
+#ifdef CONFIG_ARM
+#define TSXXX_IRQ5             5
+#define TSXXX_IRQ6             33
+#define TSXXX_IRQ7             40
+#endif
+
+#ifdef CONFIG_X86
+#define TSXXX_IRQ5             5
+#define TSXXX_IRQ6             6
+#define TSXXX_IRQ7             7
+#endif
+
+
+int tscan1_request_io(struct candevice_t *candev);
+int tscan1_release_io(struct candevice_t *candev);
+int tscan1_reset(struct candevice_t *candev);
+int tscan1_init_hw_data(struct candevice_t *candev);
+int tscan1_init_chip_data(struct candevice_t *candev, int chipnr);
+int tscan1_init_obj_data(struct canchip_t *chip, int objnr);
+void tscan1_write_register(unsigned data, unsigned long address);
+unsigned tscan1_read_register(unsigned long address);
+int tscan1_program_irq(struct candevice_t *candev);
+
+unsigned long tscan1_getmappedaddr(unsigned long address);
+unsigned short tscan1_getcandevidx(unsigned long address);
+unsigned long tscan1_setpage_getaddr(unsigned long address, signed short *nwinbak, unsigned long *winaddr);
diff --git a/lincan-0.3.3/include/unican_cl2.h b/lincan-0.3.3/include/unican_cl2.h
new file mode 100644 (file)
index 0000000..7bb715a
--- /dev/null
@@ -0,0 +1,946 @@
+/******************************************************************************
+
+Cl2.H - PCAN and VCAN cards hardware access library
+""""""""
+                   (C) Copyright 1997   Unicontrols a.s.
+
+PROJEKT            :    CANopen
+AUTOR              :    F.Spurny
+FIRMA              :    CVUT FEL, Dept. of Measurement
+PORTING            :    Adapted for LinCAN driver by Pavel Pisa, OCERA team member
+
+DULEZITE UPOZORNENI:
+
+ARCHIVACNI INFORMACE:
+Log: unican_cl2.h,v 
+
+27.1.1999 - corected value of CL2_ERROR_WARNING and CL2_ERROR_BUS_OFF constants
+
+12.12.2000 - CL2_STATUS_RESET_CARD, CL2_ERROR_RESET_CARD added
+             fields of sCAN_MESSAGE aligned
+
+10.8.2001 - PCI PCAN ID registers content defined
+       - cl2_find_card function prototype added
+       - cl2_get_ID function prototype added
+
+10.2.2004 - Start of PCAN support porting to RT-Linux and Linux environment
+
+===============================================================================
+
+UCEL A FUNKCE:
+
+******************************************************************************/
+
+#ifndef __INC_CL2_H
+#define __INC_CL2_H
+
+
+/****** includes ******/
+
+#ifndef __INC_ANCTYPES_H
+#include "unican_types.h"
+#endif
+
+/****** Definitions of constants  ******/
+
+/* PCI card Configuration Space Constants */
+#define PCANDeviceID                   0x0101
+#define PCANVendorID                   0xFA3C
+#define PCANSubsystemID                        0x0001
+#define PCANSubsystemVendorID          0x7A52
+
+
+/* Description of card and card registers location. Registers location are
+ * mapped relative to card base address (BA) */
+
+#define CL2_RAM_SIZE                   0x1000  /* size of dual-port RAM */
+#define CL2_RX_BUFFER_DEFAULT          0x800   /* off(BA->rx buffer) */
+#define CL2_SYNC_BUFFER_DEFAULT                0x400   /* off(BA->sync buffer) */
+#define CL2_ASYNC_BUFFER_DEFAULT       0x600   /* off(BA->async buffer) */
+#define CL2_COMMAND_REGISTER           0x3FE   /* off(BA->command register )*/
+#define CL2_VERSION_REGISTER           0x3F6   /* off(BA->version register )*/
+#define CL2_ID_REGISTER                        0x3EE   /* off(BA->ID register) */
+#define CL2_GEN_INT_REGISTER           0x3E4   /* off(BA->generate interrupt reg.)*/
+#define CL2_CLEAR_INT_REGISTER         0x3E2   /* off(BA->clear interrupt reg)*/
+#define CL2_RESET_REGISTER             0x3E0   /* off(BA->reset register)*/
+#define CL2_ERROR_REGISTER             0x3F8   /* off(BA->error register)*/
+#define CL2_TIME_REGISTER                      0x3FC   /* currently not used */
+#define CL2_START_IT_REGISTER          0x3E6   /* off(BA->start inhibit time reg.) */
+#define CL2_STATUS_REGISTER            0x3FA   /* off(BA->status register)*/
+#define CL2_VME_INT_VECTOR             0x3F0
+#define CL2_DATA_BUFFER                        0x100   /* off(BA->data buffer)*/
+
+/* Default sizes of buffers (in messages)
+ * FYI: 1 message needs 16 bytes to be stored */
+#define CL2_RX_BUFFER_SIZE                             128     /* size of receive (rx) buffer */
+#define CL2_TX_SYNC_BUFFER_SIZE                32              /* size of synchronnous buffer */
+#define CL2_TX_ASYNC_BUFFER_SIZE               32              /* size of asynchronnous buffer*/
+
+/* Command valid flag */
+#define CL2_COMMAND_VALID                       0x0080
+
+/* Message flags */
+#define CL2_MESSAGE_VALID         0x0001
+
+/* status bits */
+#define CL2_DATA_IN_RBUF          0x0001   /* message is in rx buffer*/
+#define CL2_X_DATA_IN_RBUF        0x0002   /* more than LIMIT messages are in
+                                                                                                                 * rx buffer*/
+#define CL2_RBUF_OVERFLOW         0x0004   /* owerflow of rx buffer, some
+                                            * messages are lost*/
+#define CL2_SYNC_QUEUE_EMPTY      0x0010   /* sync queue is empty */
+#define CL2_ASYNC_QUEUE_EMPTY     0x0020   /* async queue is empty */
+#define CL2_CARD_ERROR            0x0040   /* card reports an error */
+#define CL2_STATUS_VALID_FLAG     0x0080   /* bit indicating that status
+                                            * register contains valid data*/
+#define CL2_CARD_READY            0x0100   /* card is ready */
+#define CL2_SYNC_PASSIVE          0x0200   /* passive SYNC mode */
+#define CL2_SYNC_ACTIVE           0x0400   /* active SYNC mode */
+#define CL2_RTR_LIST              0x0800   /* RTR list sending */
+#define CL2_STATUS_RESET_CARD     0x8000   /* card reset occurred */
+
+/* error bits */
+#define CL2_ERROR_LL              0x0007   /*  */
+#define CL2_ERROR_WARNING         0x0040   /* bus warning detected */
+#define CL2_ERROR_BUS_OFF         0x0080   /* bus error detected */
+#define CL2_ERROR_RESET_CARD      0x0100   /* card reset occurred */
+#define CL2_ERROR_FIRMWARE        0x1000   /* firmware error detected */
+#define CL2_ERROR_DPRAM           0x2000   /* dual port RAM error detected */
+#define CL2_ERROR_RAM             0x4000   /* internal RAM error detected */
+#define CL2_ERROR_CAN             0x8000   /* CAN controller error detected */
+
+/* interrupt generation */
+#define INT_MODE_RX               0x01     /* if data are in receive buffer*/
+#define INT_MODE_ERROR            0x02     /* if any error occurs */
+#define INT_MODE_SYNC_EMPTY       0x04     /* if tx sync. queue is empty*/
+#define INT_MODE_ASYNC_EMPTY      0x08     /* if tx async. queue is empty*/
+#define INT_MODE_ALL              0x0F     /* if any event occurs*/
+
+/* CAN message types */
+#define CL2_REMOTE_FRAME          0x08     /* frame is a remote frame*/
+#define CL2_LINE_FLAG             0x80
+#define CL2_EXT_FRAME             0x04     /* frame is extended format*/
+
+/* Receive message flags */
+#define CL2_FRAME_VALID           0x01     /* message in buffer is valid */
+#define CL2_RX_OVERFLOW           0x02     /* stored unread message was
+                                            * overwritten by another one */
+
+/* Bitrates */
+#define CL2_BITRATE_5K            0x7f7f   /* bit-rate 5 kb/s */
+#define CL2_BITRATE_10K           0x5c67   /* bit-rate 10 kb/s */
+#define CL2_BITRATE_20K           0x5c53   /* bit-rate 20 kb/s */
+#define CL2_BITRATE_50K           0x5c47   /* bit-rate 50 kb/s */
+#define CL2_BITRATE_100K          0x5c43   /* bit-rate 100 kb/s */
+#define CL2_BITRATE_125K          0x6743   /* bit-rate 125 kb/s */
+#define CL2_BITRATE_200K          0x5c41   /* bit-rate 200 kb/s */
+#define CL2_BITRATE_250K          0x6741   /* bit-rate 250 kb/s */
+#define CL2_BITRATE_500K          0x6740   /* bit-rate 500 kb/s */
+#define CL2_BITRATE_800K          0x3440   /* bit-rate 800 kb/s */
+#define CL2_BITRATE_1M            0x2340   /* bit-rate 1 Mb/s */
+
+
+/****** Definition of structures  ******/
+
+typedef struct  /*** card definition structure ***/
+       {
+       U16  intNumber;         /* Card interrupt (IRQ) number */
+       U8   *baseAddressPtr;   /* Pointer to card base address (BA) */
+       U8   *rxBufPtr;         /* Pointer to receive buffer */
+       U8   *rxBufBase;        /* Pointer to empty receive buffer */
+       U8   *asyncTxBufPtr;    /* Pointer to async transmit buffer */
+       U8   *asyncTxBufBase;   /* Pointer to empty async. transmit buffer */
+       U8   *syncTxBufPtr;     /* Pointer to sync. transmit buffer */
+       U8   *syncTxBufBase;    /* Pointer to empty sync. transmit buffer */
+       U8   *commandRegister;  /* Pointer to command register */
+       U8   *dataPtr;          /* Pointer to command data buffer */
+       U16  rxBufSize;         /* size of receive buffer (x16 bytes) */
+       U16  syncTxBufSize;     /* size of sync. transmit buffer (x16 bytes)*/
+       U16  asyncTxBufSize;    /* size of async. transmit buffer (x 16 bytes)*/
+       U16  status;            /* last card status */
+       U16  error;             /* last not reported card error */
+       U32 rtrSub[10];
+       } sCAN_CARD;
+
+//typedef struct  /*** CAN message formet ***/
+//     {
+//     U8   data[8];           /* Data message buffer (8 bytes) */
+//     U8   dataLength;        /* Data length (in bytes) */
+//     U32  COB_ID;            /* COB_ID */
+//     U16  timeStamp;         /* Message time stamp */
+//     U8   dataType;          /* Message data type */
+//     } sCAN_MESSAGE;
+
+typedef struct
+   {
+   U32  COB_ID;             /* COB identifier */
+   U8   dataType;          /* Message data type */
+   U8   dataLength;        /* Data length (in bytes) */
+   U8   data[8];           /* Data message buffer (8 bytes) */
+   U16  timeStamp;         /* Message time stamp [us] */
+   } sCAN_MESSAGE;
+
+
+typedef        struct  /*** Remote Request RTR frame ***/
+   {
+   U32  cob_id;           /* RTR frame ID */
+   U16  period;           /* RTR period */
+   U16  subperiod;        /* RTR subperiod */
+   } sRTR_FRAME;
+
+typedef struct  /*** Remote Request (RTR) list ***/
+       {
+       sRTR_FRAME *data;       /* RTR data */
+       U32 nb;                 /* Number of RTR definitions */
+       } sRTR_LIST;
+
+typedef enum  /*** CL2 functions return codes ***/
+       {
+       CL2_OK = 0,           /* OK */
+       CL2_NO_REQUEST,       /* No request*/
+       CL2_HW_FAILURE,       /* HW failure */
+       CL2_HW_QUEUE_FULL,    /* Transmit queue full */
+       CL2_BAD_PARAM,        /* Bad number of parameters */
+   CL2_HW_QUEUE_EMPTY,   /* Receive queue empty */
+       CL2_COMMAND_BUSY,     /* Command busy - previous command not completed */
+       CL2_UNKNOWN_COMMAND,  /* Unknown command */
+       CL2_NO_PCI_BIOS          /* missing PCI BIOS support */
+   } eCL2_RESULT;
+
+typedef enum  /*** CL2 commands ***/
+   {
+   cmCL2_INT_MODE = 0x01,            /**01 - Set Interrupt mode */
+   cmCL2_IIT_MODE,                   /**02 - Inhibit Interrupt Time mode */
+   cmCL2_SYNC_MODE,                  /**03 - SYNC mode */
+       cmCL2_RTR_MODE,                   /**04 - RTR list mode */
+       cmCL2_BUF_SIZE,                   /**05 - Set buffers sizes */
+   cmCL2_SET_IIT,                    /**06 - Start Inhibit Interrupt Time */
+   cmCL2_START_FIRMWARE,             /**07 - Start firmware */
+   cmCL2_LOAD_FIRMWARE,              /* 08 - Load firmware */
+       cmCL2_SET_REC_MODE,               /**09 - Set Receive mode */
+
+   cmCL2_CLR_RX_BUFFER = 0x10,       /**10 - Clear receive buffer */
+   cmCL2_CLR_SYNC_BUFFER,            /**11 - Clear synchronous buffer */
+   cmCL2_CLR_ASYNC_BUFFER,           /**12 - Clear asynchronous buffer */
+       cmCL2_SEND_TIME_SYNC,             /**13 - Sends time synchronization */
+       cmCL2_SET_TIME_COBID,             /**14 - Sets time frames COB-ID */
+   cmCL2_SET_RECEIVE_LIMIT,          /* 15 - Sets receive limit */
+
+       cmCL2_DOWNLOAD_RTR_LIST = 0x20,   /**20 - Download RTR list */
+   cmCL2_SUBSCRIBE_RTR,              /**21 - Subscribe RTR */
+   cmCL2_DESUBSCRIBE_RTR,            /* 22 - Desubscribe RTR */
+
+   cmCL2_SET_COBID = 0x30,           /**30 - Set COB-ID */
+   cmCL2_SET_SYNC_PERIOD,            /**31 - Set SYNC period */
+   cmCL2_SET_SYNC_WINDOW,            /**32 - Set SYNC period window */
+
+       cmCL2_SET_BITRATE = 0x40,         /**40 - Set CAN bit rate */
+       cmCL2_BUS_RESET                   /* 41 - CAN controller reset */
+
+       } eCLU2_COMMAND;
+
+
+/****** prototypes ******/
+
+
+/*******************************************************************************
+* cl2_find_card - find PCIPCAN card
+* """""""""""""
+*
+* Searches for PCIPCAN cards in the system. The mapping (memory and interrupt)
+* of the card is found. An index parameter specifies how many PCIPCAN cards have
+* to be skipped in search.
+*
+* RETURNS:
+*   CL2_OK - card found and mapped under 1 MB
+*   CL2_HW_FAILURE - card not found or not mapped under 1 MB
+*/
+eCL2_RESULT cl2_find_card
+        (
+        U16 *baseAddress,               /* card's physical base address */
+        U16 *intNumber,                 /* card's interrupt level */
+        U16 index                  /* number of PCIPCAN cards to be skipped */
+        );
+
+
+/*******************************************************************************
+* cl2_init_card - initialize card to default parameters
+* """""""""""""
+*
+* Command installs card. The data in sCAN_CARD structure pointed
+* by *card are initialized to their predefined default values.
+* Command must be called before any operation with sCAN_CARD
+* structure.
+*
+* RETURNS:
+*   CL2_OK - command completed succesfuly
+*
+*/
+eCL2_RESULT cl2_init_card
+       (
+       sCAN_CARD *card,            /* Pointer to card structure */
+       void *baseAddress,          /* Card base address pointer */
+       U16 intNumber               /* Card interrupt number */
+       );
+
+
+/*******************************************************************************
+* cl2_test_card - test card
+* """""""""""""
+*
+* Test whether the card is installed in system and working properly
+* or not. If this function fails (return value is CL2_HW_FAILURE)
+* check if the card is present and card base address.
+*
+* RETURNS:
+*   CL2_OK - card is present and working properly
+*   CL2_HW_FAILURE - card not found or card error
+*
+*/
+eCL2_RESULT cl2_test_card
+       (
+       sCAN_CARD *card           /* Pointer to card structure */
+       );
+
+
+/*******************************************************************************
+* cl2_reset_card - reset card
+* """"""""""""""
+*
+* Card pointed by *card gets hardware reset. This command resets
+* card processor, card settings are restored to their default
+* values.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_reset_card
+   (
+   sCAN_CARD *card             /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_get_version - read card version
+* """""""""""""""
+*
+* Fucntion reads a value from card version register.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_get_version
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 *version                /* returns card version */
+   );
+
+
+/*******************************************************************************
+* cl2_get_ID - read card ID
+* """""""""""""""
+*
+* Fucntion reads a value from card ID register.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_get_ID
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U32 *IDlow,
+   U32 *IDhigh                         /* returns card version */
+   );
+
+
+/*******************************************************************************
+* cl2_gen_interrupt - request for interrupt
+* """""""""""""""""
+*
+* CAN card is requested to generate interrupt if there is any reason
+* to do it. The condition for interrupt generation is defined by
+* cl2_int_mode command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_gen_interrupt
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_start_it - start inhibit time
+* """"""""""""
+*
+* Command starts interrupt inhibit time. If there is any reason for
+* interrupt geneation, the card generates interrupt after end of
+* specified time interval. Time interval is set by cl2_set_iit command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_start_it
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_clear_interrupt - clear interrupt
+* """""""""""""""""""
+*
+* Comand clears interrupt (IRQ) generated by a card.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_clear_interrupt
+   (
+   sCAN_CARD *card          /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_int_mode - set interrupt mode
+* """"""""""""
+*
+* Command controls, which event will generate interrupt. Constants
+* CL2_INT_XXXX are used for setting of interrupt mode.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_BAD_PARAM - bad command parameter
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_int_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 mode                    /* Interrupt mode */
+   );
+
+
+/*******************************************************************************
+* cl2_iit_mode - inhibit interrupt time mode
+* """"""""""""
+*
+* Command enables/disables inhibit interupt time mode.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_iit_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* IIT mode - TRUE=on, FALSE=off */
+   );
+
+
+/*******************************************************************************
+* cl2_sync_mode - sync mode
+* """""""""""""
+*
+* Command enables/disables transmission of SYNC frames.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_sync_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* Sync mode - TRUE=on, FALSE=off */
+   );
+
+
+/*******************************************************************************
+* cl2_rtr_mode - rtr mode
+* """"""""""""
+*
+* Command enables/disables automatic transmission of RTR frames
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_rtr_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* RTR mode - TRUE=on, FALSE=off */
+   );
+
+
+/*******************************************************************************
+* cl2_buf_size - size of synchronous queue
+* """"""""""""
+*
+* Command sets the size of synchronous send buffer. The size is
+* in numbers of messages. Default buffer size is 32 messages.
+* The sum of synchronous_buffer_size and asynchronous_buffer_size
+* is constant and equal to 64. So, if the size od synchronous
+* buffer increases, the size of asynchronous buffer decreases and
+* vice versa.
+* NOTE: 1 message = 16 bytes
+*
+* RETURNS:
+*   CL2_OK - command completed successfully
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter (bufSize>64)
+*
+*/
+eCL2_RESULT cl2_buf_size
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 bufSize                 /* Size of synchronous buffer */
+   );
+
+
+/*******************************************************************************
+* cl2_set_iit - set value of inhibit interrupt time
+* """""""""""
+*
+* Command sets value of inhibit interrupt time. If inhibit
+* interrupt time mode is enabled and started, generation of
+* interrupt (IRQ) is disabled during this time period.
+* Inhibit interrupt time can be set from 100 us to 6.5535 s
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_iit
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 iit                     /* time period in x100 us */
+   );
+
+
+/*******************************************************************************
+* cl2_start_firmware - start firmware
+* """"""""""""""""""
+*
+* Command starts card firmware
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_start_firmware
+   (
+   sCAN_CARD *card             /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_set_rec_mode - set receive mode
+* """"""""""""""""
+*
+* Command sets card receive mode. This enable reception of standard
+* or extended frames according to CAN 2.0A and 2.0B specifications.
+* If value of mode is TRUE, card receives extended frames, if mode
+* is FALSE, card receives standard massage format (default).
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_rec_mode
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   BOOLEAN1 mode              /* Mode - TRUE=ext, FALSE=std */
+   );
+
+
+/*******************************************************************************
+* cl2_clr_rx_buffer - clear RX buffer
+* """""""""""""""""
+*
+* Command clears receive (rx) buffer. All messages stored in
+* rx buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_rx_buffer
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_clr_sync_buffer - clear synchronous buffer
+* """""""""""""""""""
+*
+* Command clears synchronous send buffer. All messages stored
+* in synchronous buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_sync_buffer
+   (
+   sCAN_CARD *card             /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_clr_async_buffer - clear asynchronous buffer
+* """"""""""""""""""""
+*
+* Command clears asynchronnous send buffer. All messages stored
+* in async buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_async_buffer
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_send_time_sync - send time synchronization
+* """"""""""""""""""
+*
+* Command forces the card to start the High Resolution Synchronization
+* Protocol according to the CANopen Communication profile. The SYNC
+* mode has to be enabled (cl2_sync_mode) otherwise this command has
+* no effect.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_send_time_sync
+   (
+   sCAN_CARD *card             /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_set_time_cobid - set time COB-ID
+* """"""""""""""""""
+*
+* Command sets the COB-ID for high resolution synchronization
+* frame. The synchronization can be then made by means of
+* cl2_send_time_sync command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_time_cobid
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   U32 COBID                  /* HRS frame COB-ID */
+   );
+
+
+/*******************************************************************************
+* cl2_set_receive_limit - set limit for receive signaling
+* """""""""""""""""""""
+*
+* Command is used to set the receive limit signalized by bit
+* RL (in CL2.H CL2_X_DATA_IN_RBUF) of the Status Register.
+* This bit is set when more then the limit number of frames
+* was received since the last interrupt was generated (in interrupt
+* mode) or since the Status Register was last time read.
+*
+* RETURNS:
+*   CL2_OK
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*/
+eCL2_RESULT cl2_set_receive_limit
+   (
+   sCAN_CARD *card,          /* pointer to card structure */
+   U16 limit                 /* limit of messages in receive buffer */
+   );
+
+
+/*******************************************************************************
+* cl2_download_rtr_list - download rtr list
+* """""""""""""""""""""
+*
+* Command downloads a list of up to 64 RTR frames. These frames are
+* periodically transmitted by the card. The parameters, how often
+* frames are send and in which SYNC period is defined by period and
+* subperiod in sRTR_FRAME structure.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_download_rtr_list
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   sRTR_LIST *rtrList         /* RTR list */
+   );
+
+
+/*******************************************************************************
+* cl2_subscribe_rtr - subscribe RTR frame
+* """""""""""""""""
+*
+* Command subscribes RTR frame. Incoming RTR frames which were
+* subscribed are accepted, while other are ignored. Up to 10
+* RTR frames can be subscribed.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_subscribe_rtr
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage,   /* RTR frame */
+   U16 RTRnumber               /* number of RTR */
+   );
+
+
+/*******************************************************************************
+* cl2_desubscribe_rtr - desubscribe rtr frame
+* """""""""""""""""""
+*
+* Command desubscribes RTR frame. Card will not accept RTR frames
+* with this identifier.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_desubscribe_rtr
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage    /* RTR frame */
+   );
+
+
+/*******************************************************************************
+* cl2_set_sync_cobid - set COB-ID
+* """"""""""""""""""
+*
+* Command sets COB-ID of SYNC frame. In active SYNC mode, the SYNC
+* frame with this COB-ID is periodically sent with period defined
+* by cl2_set_sync_period command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_cobid
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U32 COBID                   /* COB-ID */
+   );
+
+
+/*******************************************************************************
+* cl2_set_sync_period - set SYNC period
+* """""""""""""""""""
+*
+* Coomand sets the SYNC frame send period in active SYNC mode in
+* x100 us. The period range is from 0 to 0xFFFF (SYNC period can
+* be set from 100us to 6.5535s).
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_period
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 period                  /* period in x100 us */
+   );
+
+
+/*******************************************************************************
+* cl2_set_sync_window - set SYNC window
+* """""""""""""""""""
+*
+* Command sets the SYNC window length. Only during this time period
+* after SYNC frame was send or receive the frames from the synchronous
+* send buffer can be sent.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_window
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 window                  /* period in x100 us */
+   );
+
+
+/*******************************************************************************
+* cl2_set_bitrate - set CAN bit-rate
+* """""""""""""""
+*
+* Command switches the bus bit-rate. There are some predefined
+* constants CL2_BITRATE_XXXX.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_bitrate
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 bitrate                 /* CAN bitrate */
+   );
+
+
+/*******************************************************************************
+* cl2_bus_reset - resets CAN controller
+* """""""""""""
+*
+* Command resets CAN controller
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previously command not completed
+*
+*/
+eCL2_RESULT cl2_bus_reset
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   );
+
+
+/*******************************************************************************
+* cl2_send_sync - sends synchronous frame
+* """""""""""""
+*
+* Command stores massage in synchronous send buffer.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_HW_QUEUE_FULL - synchronous send buffer is full
+*   CL2_BAD_PARAM - bad command parameter
+*   CL2_HW_FAILURE - error in HW configuration
+*
+*/
+eCL2_RESULT cl2_send_sync
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   sCAN_MESSAGE *message      /* message to be sent */
+   );
+
+
+/*******************************************************************************
+* cl2_send_async - sends asynchronous frame
+* """"""""""""""
+*
+* Command stores message in asynchronous send buffer.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_HW_QUEUE_FULL - asynchronous buffer full
+*   CL2_HW_FAILURE - error in HW configuration
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_send_async
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   sCAN_MESSAGE *message      /* message */
+   );
+
+
+/*******************************************************************************
+* cl2_get_status - reads card status
+* """"""""""""""
+*
+* Command reads card status register. If data in status register
+* are valid (status valid flag is set), the value of status is read
+* and stored in status and sCAN_CARD structure.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_NO_REQUEST - status is not valid
+*
+*/
+eCL2_RESULT cl2_get_status
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   U16 *status                /* Returned status */
+   );
+
+
+/*******************************************************************************
+* cl2_get_error - reads card error
+* """""""""""""
+*
+* Command reads card error register. If data in error register
+* are valid (error register valid flag is set), the value of error
+* register is read and stored in error and sCAN_CARD structure.
+*
+* RETURNS:
+*   Cl2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_get_error
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   U16 *error                 /* Returned card error code */
+   );
+
+
+/*******************************************************************************
+* cl2_receive_data - reads received frame
+* """"""""""""""""
+*
+* Command reads new messages received by a card.
+*
+* RETURNS:
+*   CL2_OK - command commpleted successfuly
+*   CL2_NO_REQUEST - there is no new message
+*
+*/
+eCL2_RESULT cl2_receive_data
+   (
+   sCAN_CARD *card,             /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage     /* Message */
+   );
+
+
+/* *********************************************************************** *
+ * END OF CL2.H                                                            *
+ * *********************************************************************** */
+
+#endif /* ifndef __INC_CL2_H */
diff --git a/lincan-0.3.3/include/unican_types.h b/lincan-0.3.3/include/unican_types.h
new file mode 100644 (file)
index 0000000..76f9fec
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _UNICAN_TYPES_H
+#define _UNICAN_TYPES_H
+
+#include <linux/types.h>
+
+#ifndef U8
+#define U8  __u8
+#endif
+#ifndef U16
+#define U16 __u16
+#endif
+#ifndef U32
+#define U32 __u32
+#endif
+
+#define BOOLEAN1 __u8
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE  1
+#endif
+
+#ifdef CONFIG_PPC
+#define unican_readw(addr) in_be16((volatile u16 *)(addr))
+#define unican_writew(b,addr) out_be16((volatile u16 *)(addr),(b))
+/* #define unican_readw(addr) (*(volatile __u16 *)(addr)) */
+/* #define unican_writew(v, addr) (*(volatile __u16 *)(addr) = (v)) */
+#else  /* CONFIG_PPC */
+#define unican_readw(addr) readw(addr)
+#define unican_writew(v, addr) writew(v, addr)
+#endif /* CONFIG_PPC */
+
+#endif /*_UNICAN_TYPES_H*/
diff --git a/lincan-0.3.3/include/write.h b/lincan-0.3.3/include/write.h
new file mode 100644 (file)
index 0000000..00b85a7
--- /dev/null
@@ -0,0 +1,8 @@
+/* write.h
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t *offset);
diff --git a/lincan-0.3.3/kernelcfg2mk b/lincan-0.3.3/kernelcfg2mk
new file mode 100755 (executable)
index 0000000..a90b7c3
--- /dev/null
@@ -0,0 +1,184 @@
+#!/bin/bash
+
+if [ $# -lt 1 ] ; then
+  echo "kernelcfg2mk: requires linux kernel directory as the first argument"
+  exit 2
+fi
+
+LINUX_DIR="$1"
+
+if [ $# -gt 1 ] ; then
+  KERN_MODULES_DIR="$2"
+fi
+
+if [ ! -e $LINUX_DIR/.config ] ; then
+  echo "kernelcfg2mk: the provided locations doesnot point to configured kernel sources"
+  echo "        check directory $LINUX_DIR"
+  exit 2
+fi
+
+if [ ! -e $LINUX_DIR/.config ] ; then
+  echo "kernelcfg2mk: the provided locations doesnot point to configured kernel sources"
+  echo "        check directory $LINUX_DIR"
+  exit 2
+fi
+
+if [ -z "$KERN_BUILD_DIR" ]  ; then
+  KERN_BUILD_DIR=`pwd`
+fi
+
+if [ -z "$KERN_MODULES_DIR" ]  ; then
+  KERN_MODULES_DIR=`pwd`
+fi
+
+
+if [ -z "$MAKE" ]  ; then
+  MAKE="make"
+fi
+
+
+KERN_TEST_DIR="$KERN_BUILD_DIR/kern-test-mk"
+
+mkdir -p $KERN_TEST_DIR
+
+#echo MAKERULES_DIR $MAKERULES_DIR
+#echo LINUX_DIR $LINUX_DIR
+#echo KERN_BUILD_DIR $KERN_BUILD_DIR
+#echo KERN_MODULES_DIR $KERN_MODULES_DIR
+
+RETVAL="0"
+
+LINUX_VERSION=$(grep UTS_RELEASE ${LINUX_DIR}/include/linux/version.h | \
+               sed 's/[^"]*"\(.*\)\{1\}"/\1/')
+
+LINUX_VERSION_MAJOR=$(echo ${LINUX_VERSION} | cut -d. -f1)
+LINUX_VERSION_MINOR=$(echo ${LINUX_VERSION} | cut -d. -f2)
+
+#echo $LINUX_VERSION
+#echo $LINUX_VERSION_MAJOR
+#echo $LINUX_VERSION_MINOR
+
+
+case $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR in
+
+
+#=====================================================================
+# test for 2.4.x kernels
+    2.[01234])
+
+       rm -f ${KERN_BUILD_DIR}/kernel.mk
+       rm -rf ${KERN_TEST_DIR}
+       mkdir ${KERN_TEST_DIR}
+       if [ $? -ne 0 ] ; then
+               echo "Cannot create Linux kernel test build directory \"${KERN_TEST_DIR}\""
+               exit 3
+       fi
+       cd ${KERN_TEST_DIR}
+
+       cat >${KERN_TEST_DIR}/Makefile <<EOF
+
+.PHONY: modules
+modules:
+       @echo LINUX_ARCH="\$(ARCH)" >>flags
+       @echo LINUX_LDFLAGS="" >>flags
+       @echo LINUX_ARFLAGS="\$(ARFLAGS)" >>flags
+       @echo LINUX_CROSS_COMPILE="\$(CROSS_COMPILE)" >>flags
+       @echo LINUX_KERNELRELEASE="\$(KERNELRELEASE)" >>flags
+       @echo LINUX_AFLAGS="\$(AFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>flags
+       @echo LINUX_CFLAGS="\$(CFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>flags
+       @echo LINUX_MODFLAGS="\$(MODFLAGS)"
+       @echo LINUX_CC="\$(CC)" >>flags
+       @echo LINUX_LD="\$(LD) \$(LDFLAGS)" >>flags
+       @echo LINUX_AS="\$(AS)" >>flags
+       @echo LINUX_AR="\$(AR)" >>flags
+       @echo LINUX_MODULE_EXT=".o" >>flags
+
+EOF
+
+       #echo ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} modules
+       ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} modules
+       if [ $? == 0 ] ; then
+               cp -v flags ${KERN_MODULES_DIR}/kernel.mk       
+               if [ ! $? == 0 ] ; then
+                       RETVAL="2"
+               fi
+       else
+               RETVAL="1"
+       fi
+
+       cd ${KERN_BUILD_DIR}
+       rm -rf ${KERN_TEST_DIR}
+       ;;
+
+#=====================================================================
+# test for 2.6.x kernels
+
+    2.6)
+
+       rm -f ${KERN_BUILD_DIR}/kernel.mk
+       rm -rf ${KERN_TEST_DIR}
+       mkdir ${KERN_TEST_DIR}
+       if [ $? -ne 0 ] ; then
+               echo "Cannot create Linux kernel test build directory \"${KERN_TEST_DIR}\""
+               exit 3
+       fi
+       cd ${KERN_TEST_DIR}
+
+       cat >${KERN_TEST_DIR}/Makefile <<EOF
+obj-m += fake.o
+
+\$(obj)/fake.c: flags
+       touch \$(obj)/fake.c
+
+ifeq (\$(KBUILD_SRC),)
+OMK_LINUX_SRC = \$(LINUXDIR)
+else
+OMK_LINUX_SRC = \$(KBUILD_SRC)
+endif
+#\$(warning Test \$OMK_LINUX_SRC)
+
+.PHONY: flags
+flags:
+       @echo LINUX_SRC="\$(OMK_LINUX_SRC)" >>\$(obj)/flags
+       @echo LINUX_ARCH="\$(ARCH)" >>\$(obj)/flags
+       @echo LINUX_LDFLAGS="" >>\$(obj)/flags
+       @echo LINUX_ARFLAGS="\$(ARFLAGS)" >>\$(obj)/flags
+       @echo LINUX_CROSS_COMPILE="\$(CROSS_COMPILE)" >>\$(obj)/flags
+       @echo LINUX_KERNELRELEASE="\$(KERNELRELEASE)" >>\$(obj)/flags
+       @echo LINUX_CPPFLAGS="\$(CPPFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>\$(obj)/flags
+       @echo LINUX_AFLAGS="\$(AFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+       @echo LINUX_CFLAGS="\$(CFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+       @echo LINUX_CFLAGS_MODULE="\$(CFLAGS_MODULE)" >>\$(obj)/flags
+       @echo LINUX_CC="\$(CC)" >>\$(obj)/flags
+       @echo LINUX_LD="\$(LD) \$(LDFLAGS) \$(LDFLAGS_MODULE)" >>\$(obj)/flags
+       @echo LINUX_AS="\$(AS)" >>\$(obj)/flags
+       @echo LINUX_AR="\$(AR)" >>\$(obj)/flags
+       @echo LINUX_MODULE_EXT=".ko" >>\$(obj)/flags
+       @echo LINUX_QUOTE_MODNAME=\$(if \$(findstring KBUILD_STR,\$(basename_flags)),y,) >>\$(obj)/flags
+EOF
+
+       #  V=1
+       #echo ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} LINUXDIR=${LINUX_DIR} MODVERDIR=${KERN_TEST_DIR} modules
+       ${MAKE} -C ${LINUX_DIR} M=${KERN_TEST_DIR} LINUXDIR=${LINUX_DIR} MODVERDIR=${KERN_TEST_DIR}/modver modules
+       #if [ $? == 0 ] ; then
+               cp -v flags ${KERN_MODULES_DIR}/kernel.mk       
+               if [ ! $? == 0 ] ; then
+                       RETVAL="2"
+               fi
+       #else
+       #       RETVAL="1"
+       #fi
+
+       cd ${KERN_BUILD_DIR}
+       rm -rf ${KERN_TEST_DIR}
+       ;;
+
+#=====================================================================
+
+    *)
+       echo "Unsupported Linux version $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR"
+    ;;
+esac
+
+
+exit ${RETVAL}
diff --git a/lincan-0.3.3/lincan.xml b/lincan-0.3.3/lincan.xml
new file mode 100644 (file)
index 0000000..df7135a
--- /dev/null
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--DOCTYPE component PUBLIC "-//OCERA//DTD component XML V1.0//EN" "file:component.dtd"-->
+<component id="lincan" name="Linux CAN Driver" >
+<!-- id = id of the component (candev,canmon,canvca,lincan,ethanal,ethdev,verbus or versched) -->
+<!-- name = short title of the component -->
+       <title>Linux CAN Driver (LinCAN)</title>
+       
+       <info>
+               <authorgroup>
+                       <author>
+                               <firstname>Pavel</firstname>
+                               <surname>Pisa</surname>
+                               <affiliation>
+                                       <orgname>CTU</orgname>
+                               </affiliation>
+                               <email>
+                                       <!-- url = mailto:your_email -->
+                                       <ulink url="mailto:pisa@cmp.felk.cvut.cz">pisa@cmp.felk.cvut.cz</ulink>
+                               </email>
+                       </author>
+                       <author>
+                               <firstname>Arnaud</firstname>
+                               <surname>Westenberg</surname>
+                               <affiliation>
+                                       <orgname>Unknown</orgname>
+                               </affiliation>
+                               <email>
+                                       <!-- url = mailto:your_email -->
+                                       <ulink url="mailto:arnaud@wanadoo.nl">arnaud@wanadoo.nl</ulink>
+                               </email>
+                       </author>
+                       <author>
+                               <firstname>Tomasz</firstname>
+                               <surname>Motylewski</surname>
+                               <affiliation>
+                                       <orgname>BFAD GmbH</orgname>
+                               </affiliation>
+                               <email>
+                                       <!-- url = mailto:your_email -->
+                                       <ulink url="mailto:T.Motylewski@bfad.de">T.Motylewski@bfad.de</ulink>
+                               </email>
+                       </author>
+               </authorgroup>
+               <copyright>
+                       <year>2004</year>
+                       <holder>OCERA Consortium</holder>
+               </copyright>
+               <!-- id = number of workpackage -->
+               <deliverable file="ms4-month24/WP7/D7.4.pdf" />
+                <doc src="doc/lincandoc-0.3.pdf">PDF</doc>
+    <workpackage id="WP7"></workpackage>
+               <!-- release = release date -->
+               <!-- start = 01/07/2002 -->
+               <date release="28/05/2006" start="01/07/2002"></date>
+               <!-- value = version number -->
+               <version value="0.3.3" 
+                         cvs="comm/can/lincan"></version>
+               <notice>
+                This component can be used outside of the OCERA framework.
+               </notice>
+               <license value="GPL"></license>
+               <!-- value = status (Analysis, Design, Alpha, Beta, Testing or Stable) -->
+               <status value="Stable"></status>
+               <home-page url="http://www.ocera.org">OCERA</home-page>
+               <home-page url="http://freshmeat.net/projects/lincan/">FreshMeat</home-page>
+               <home-page url="http://sourceforge.net/project/showfiles.php?group_id=51629&amp;package_id=108731">Sourceforge</home-page>
+               <!-- processor = target procesor (i386, PowerPC, ARM or Independent) -->
+               <!-- board = optional attribute - board model -->
+               <hardware processor="Independent"></hardware>
+               <!-- rtlinux = version of target OS -->
+               <!-- linux = version of target OS -->
+               <platform rtlinux="3.1"></platform>
+               <!-- value = type of the component (LowLevel, HighLevel or Application) -->
+               <componenttype value="HighLevel"></componenttype>               
+               <keywords>CAN, Linux, device driver</keywords>
+               <!-- reviewer info -->
+               <reviewergroup>
+                       <author>
+                               <firstname>Frantisek</firstname>
+                               <surname>Vacek</surname>
+                               <affiliation>
+                                       <orgname>CTU</orgname>
+                               </affiliation>
+                               <!-- url = mailto:his/her_email -->
+                               <email><ulink url="milto:vacek@rtime.felk.cvut.cz">vacek@rtime.felk.cvut.cz</ulink>
+                               </email>
+                       </author>
+               </reviewergroup>
+       </info>
+       <!-- ================================================== Description -->
+       <description>
+               The LinCAN is an implementation of the Linux device driver supporting
+               more CAN controller chips and many CAN interface boards. The driver
+               roots can be traced to LDDK project. The OCERA version of the LinCAN driver
+               adds new features, continuous enhancements and reimplementation of
+               structure of the driver. The usage of the driver is tightly coupled to
+               the virtual CAN API interface component which hides driver low level
+               interface to the application programmers. Driver enables multiple opens
+               of each communication objects from more Linux and RT-Linux applications.
+               The message processing is based on the oriented graph of FIFOs concept.
+       </description>
+       <!-- ================================================== Readme -->
+       <readme>
+               The LinCAN version 0.3.x has been successfully tested with 
+                 - PC104 Advantech PCM3680 dual channel board on 2.4 RT-Linux enabled kernel
+                 - PiKRON ISA card on 2.4.and 2.6 Linux kernels
+                 - PiKRON CAN extension board for PiMCX1 ARM BCC on 2.6 Linux kernels
+                 - BfaD DIMM PC card on 2.4 RT-Linux enabled kernel
+                 - KVASER pcican-q on 2.6 Linux kernel
+                 - MICROSPACE msmcan on 2.4 Linux kernel with and without RT-Linux support
+                 - virtual board tested on all systems as well
+               There is included support for more than 15 other boards in the LinCAN driver,
+               but we do not possess these cards and cannot test support for these cards.
+       </readme>
+       <!-- ================================================== Readme -->
+       <install>
+               <!-- Install info if any. Example:-->
+               <!-- The code is distributed as a patch file against rtlinux-3.1 source
+    code plus some new files (examples + doc). In order to install,
+    please follow next steps:
+       (1) Configure Makfile variables.
+               edit Makefile and set RTLINUX variable 
+               to your RTLinux copy path.
+       (2) Type make install
+       (3) Change to the RTLinux directory. (3.a) type make xconfig. (3.b)              
+               enable posix signals.
+               (3.c)type make clean ; make-->
+               The LinCAN make solutions tries to fully automate native
+               kernel out of tree module compilation. Make system recurses through
+               kernel Makefile to achieve selection of right
+               preprocessor, compiler and linker directives. 
+               The cross-compilation is also possible. Read README file, please.
+               
+               Change current directory into the LinCAN driver source root
+                directory ("cd lincan-dir") and invoke "make" and "make install".
+               
+               Then insert module into the running Linux kernel with parameters
+               appropriate to your CAN card ("insmod can.o hw=pip5 irq=4 io=0x8000").
+               Please, read associated README file to find full description
+               of module parameters.
+       </install>
+</component>
+
diff --git a/lincan-0.3.3/scripts/kernel-doc b/lincan-0.3.3/scripts/kernel-doc
new file mode 100755 (executable)
index 0000000..bf157a1
--- /dev/null
@@ -0,0 +1,1874 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
+## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
+## Copyright (C) 2001  Simon Huggins                             ##
+##                                                              ##
+## #define enhancements by Armin Kuster <akuster@mvista.com>    ##
+## Copyright (c) 2000 MontaVista Software, Inc.                         ##
+##                                                              ##
+## This software falls under the GNU General Public License.     ##
+## Please read the COPYING file for more information             ##
+
+# w.o. 03-11-2000: added the '-filelist' option.
+
+# 18/01/2001 -         Cleanups
+#              Functions prototyped as foo(void) same as foo()
+#              Stop eval'ing where we don't need to.
+# -- huggie@earth.li
+
+# 27/06/2001 -  Allowed whitespace after initial "/**" and
+#               allowed comments before function declarations.
+# -- Christian Kreibich <ck@whoop.org>
+
+# Still to do:
+#      - add perldoc documentation
+#      - Look more closely at some of the scarier bits :)
+
+# 26/05/2001 -         Support for separate source and object trees.
+#              Return error code.
+#              Keith Owens <kaos@ocs.com.au>
+
+# 23/09/2001 - Added support for typedefs, structs, enums and unions
+#              Support for Context section; can be terminated using empty line
+#              Small fixes (like spaces vs. \s in regex)
+# -- Tim Jansen <tim@tjansen.de>
+
+
+#
+# This will read a 'c' file and scan for embedded comments in the
+# style of gnome comments (+minor extensions - see below).
+#
+
+# Note: This only supports 'c'.
+
+# usage:
+# kerneldoc [ -docbook | -html | -text | -man ]
+#           [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
+# or
+#           [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
+#
+#  Set output format using one of -docbook -html -text or -man.  Default is man.
+#
+#  -function funcname
+#      If set, then only generate documentation for the given function(s).  All
+#      other functions are ignored.
+#
+#  -nofunction funcname
+#      If set, then only generate documentation for the other function(s).  All
+#      other functions are ignored. Cannot be used with -function together
+#      (yes thats a bug - perl hackers can fix it 8))
+#
+#  c files - list of 'c' files to process
+#
+#  All output goes to stdout, with errors to stderr.
+
+#
+# format of comments.
+# In the following table, (...)? signifies optional structure.
+#                         (...)* signifies 0 or more structure elements
+# /**
+#  * function_name(:)? (- short description)?
+# (* @parameterx: (description of parameter x)?)*
+# (* a blank line)?
+#  * (Description:)? (Description of function)?
+#  * (section header: (section description)? )*
+#  (*)?*/
+#
+# So .. the trivial example would be:
+#
+# /**
+#  * my_function
+#  **/
+#
+# If the Description: header tag is ommitted, then there must be a blank line
+# after the last parameter specification.
+# e.g.
+# /**
+#  * my_function - does my stuff
+#  * @my_arg: its mine damnit
+#  *
+#  * Does my stuff explained. 
+#  */
+#
+#  or, could also use:
+# /**
+#  * my_function - does my stuff
+#  * @my_arg: its mine damnit
+#  * Description: Does my stuff explained. 
+#  */
+# etc.
+#
+# Beside functions you can also write documentation for structs, unions, 
+# enums and typedefs. Instead of the function name you must write the name 
+# of the declaration;  the struct/union/enum/typedef must always precede 
+# the name. Nesting of declarations is not supported. 
+# Use the argument mechanism to document members or constants.
+# e.g.
+# /**
+#  * struct my_struct - short description
+#  * @a: first member
+#  * @b: second member
+#  * 
+#  * Longer description
+#  */
+# struct my_struct {
+#     int a;
+#     int b;
+# };
+#
+# All descriptions can be multiline, except the short function description.
+# 
+# You can also add additional sections. When documenting kernel functions you 
+# should document the "Context:" of the function, e.g. whether the functions 
+# can be called form interrupts. Unlike other sections you can end it with an
+# empty line. 
+# Example-sections should contain the string EXAMPLE so that they are marked 
+# appropriately in DocBook.
+#
+# Example:
+# /**
+#  * user_function - function that can only be called in user context
+#  * @a: some argument
+#  * Context: !in_interrupt()
+#  * 
+#  * Some description
+#  * Example:
+#  *    user_function(22);
+#  */
+# ...
+#
+#
+# All descriptive text is further processed, scanning for the following special
+# patterns, which are highlighted appropriately.
+#
+# 'funcname()' - function
+# '$ENVVAR' - environmental variable
+# '&struct_name' - name of a structure (up to two words including 'struct')
+# '@parameter' - name of a parameter
+# '%CONST' - name of a constant.
+
+my $errors = 0;
+my $warnings = 0;
+
+# match expressions used to find embedded type information
+my $type_constant = '\%([-_\w]+)';
+my $type_func = '(\w+)\(\)';
+my $type_param = '\@(\w+)';
+my $type_struct = '\&((struct\s*)?[_\w]+)';
+my $type_env = '(\$\w+)';
+
+# Output conversion substitutions.
+#  One for each output format
+
+# these work fairly well
+my %highlights_html = ( $type_constant, "<i>\$1</i>",
+                       $type_func, "<b>\$1</b>",
+                       $type_struct, "<i>\$1</i>",
+                       $type_param, "<tt><b>\$1</b></tt>" );
+my $blankline_html = "<p>";
+
+# sgml, docbook format
+my %highlights_sgml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",
+                       $type_constant, "<constant>\$1</constant>",
+                       $type_func, "<function>\$1</function>",
+                       $type_struct, "<structname>\$1</structname>",
+                       $type_env, "<envar>\$1</envar>",
+                       $type_param, "<parameter>\$1</parameter>" );
+my $blankline_sgml = "</para><para>\n";
+
+# gnome, docbook format
+my %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
+                        $type_func, "<function>\$1</function>",
+                        $type_struct, "<structname>\$1</structname>",
+                        $type_env, "<envar>\$1</envar>",
+                        $type_param, "<parameter>\$1</parameter>" );
+my $blankline_gnome = "</para><para>\n";
+
+# these are pretty rough
+my %highlights_man = ( $type_constant, "\$1",
+                      $type_func, "\\\\fB\$1\\\\fP",
+                      $type_struct, "\\\\fI\$1\\\\fP",
+                      $type_param, "\\\\fI\$1\\\\fP" );
+my $blankline_man = "";
+
+# text-mode
+my %highlights_text = ( $type_constant, "\$1",
+                       $type_func, "\$1",
+                       $type_struct, "\$1",
+                       $type_param, "\$1" );
+my $blankline_text = "";
+
+
+sub usage {
+    print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ]\n";
+    print "         [ -sgmlreferencetitle title ]\n";
+    print "         [ -function funcname [ -function funcname ...] ]\n";
+    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n";
+    print "         [ -no-dummy-per-file ]\n";
+    print "         c source file(s) > outputfile\n";
+    exit 1;
+}
+
+# read arguments
+if ($#ARGV==-1) {
+    usage();
+}
+
+my $verbose = 0;
+my $add_dummy_entry_per_file = 1;
+my $sgml_reference_title = "";
+my $output_mode = "man";
+my %highlights = %highlights_man;
+my $blankline = $blankline_man;
+my $modulename = "Kernel API";
+my $function_only = 0;
+my $man_date = ('January', 'February', 'March', 'April', 'May', 'June', 
+               'July', 'August', 'September', 'October', 
+               'November', 'December')[(localtime)[4]] . 
+  " " . ((localtime)[5]+1900);
+
+# Essentially these are globals
+# They probably want to be tidied up made more localised or summat.
+# CAVEAT EMPTOR!  Some of the others I localised may not want to be which
+# could cause "use of undefined value" or other bugs.
+my ($function, %function_table,%parametertypes,$declaration_purpose);
+my ($type,$declaration_name,$return_type);
+my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map);
+
+# Generated docbook code is inserted in a template at a point where 
+# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
+# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
+# We keep track of number of generated entries and generate a dummy
+# if needs be to ensure the expanded template can be postprocessed
+# into html.
+my $section_counter = 0;
+
+my $lineprefix="";
+
+# states
+# 0 - normal code
+# 1 - looking for function name
+# 2 - scanning field start.
+# 3 - scanning prototype.
+# 4 - documentation block
+my $state;
+
+#declaration types: can be
+# 'function', 'struct', 'union', 'enum', 'typedef'
+my $decl_type;
+
+my $doc_special = "\@\%\$\&";
+
+my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
+my $doc_end = '\*/';
+my $doc_com = '\s*\*\s*';
+my $doc_decl = $doc_com.'(\w+)';
+my $doc_sect = $doc_com.'(['.$doc_special.']?[\w ]+):(.*)';
+my $doc_content = $doc_com.'(.*)';
+my $doc_block = $doc_com.'DOC:\s*(.*)?';
+
+my %constants;
+my %parameterdescs;
+my @parameterlist;
+my %sections;
+my @sectionlist;
+
+my $contents = "";
+my $section_default = "Description";   # default section
+my $section_intro = "Introduction";
+my $section = $section_default;
+my $section_context = "Context";
+
+my $undescribed = "-- undescribed --";
+
+reset_state();
+
+while ($ARGV[0] =~ m/^-(.*)/) {
+    my $cmd = shift @ARGV;
+    if ($cmd eq "-html") {
+       $output_mode = "html";
+       %highlights = %highlights_html;
+       $blankline = $blankline_html;
+    } elsif ($cmd eq "-man") {
+       $output_mode = "man";
+       %highlights = %highlights_man;
+       $blankline = $blankline_man;
+    } elsif ($cmd eq "-text") {
+       $output_mode = "text";
+       %highlights = %highlights_text;
+       $blankline = $blankline_text;
+    } elsif ($cmd eq "-docbook") {
+       $output_mode = "sgml";
+       %highlights = %highlights_sgml;
+       $blankline = $blankline_sgml;
+    } elsif ($cmd eq "-gnome") {
+       $output_mode = "gnome";
+       %highlights = %highlights_gnome;
+       $blankline = $blankline_gnome;
+    } elsif ($cmd eq "-module") { # not needed for sgml, inherits from calling document
+       $modulename = shift @ARGV;
+    } elsif ($cmd eq "-sgmlreferencetitle") { # valid XML document
+        $sgml_reference_title = shift @ARGV;
+    } elsif ($cmd eq "-no-dummy-per-file") {
+       $add_dummy_entry_per_file = 0;
+    } elsif ($cmd eq "-function") { # to only output specific functions
+       $function_only = 1;
+       $function = shift @ARGV;
+       $function_table{$function} = 1;
+    } elsif ($cmd eq "-nofunction") { # to only output specific functions
+       $function_only = 2;
+       $function = shift @ARGV;
+       $function_table{$function} = 1;
+    } elsif ($cmd eq "-v") {
+       $verbose = 1;
+    } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
+       usage();
+    } elsif ($cmd eq '-filelist') {
+           $filelist = shift @ARGV;
+    }
+}
+
+
+# generate a sequence of code that will splice in highlighting information
+# using the s// operator.
+my $dohighlight = "";
+foreach my $pattern (keys %highlights) {
+#    print "scanning pattern $pattern ($highlights{$pattern})\n";
+    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
+}
+
+##
+# dumps section contents to arrays/hashes intended for that purpose.
+#
+sub dump_section {
+    my $name = shift;
+    my $contents = join "\n", @_;
+
+    if ($name =~ m/$type_constant/) {
+       $name = $1;
+#      print STDERR "constant section '$1' = '$contents'\n";
+       $constants{$name} = $contents;
+    } elsif ($name =~ m/$type_param/) {
+#      print STDERR "parameter def '$1' = '$contents'\n";
+       $name = $1;
+       $parameterdescs{$name} = $contents;
+    } else {
+#      print STDERR "other section '$name' = '$contents'\n";
+       $sections{$name} = $contents;
+       push @sectionlist, $name;
+    }
+}
+
+##
+# output function
+#
+# parameterdescs, a hash.
+#  function => "function name"
+#  parameterlist => @list of parameters
+#  parameterdescs => %parameter descriptions
+#  sectionlist => @list of sections
+#  sections => %descriont descriptions
+#  
+
+sub output_highlight {
+    my $contents = join "\n",@_;
+    my $line;
+
+#   DEBUG
+#   if (!defined $contents) {
+#      use Carp;
+#      confess "output_highlight got called with no args?\n";
+#   }
+
+    eval $dohighlight;
+    die $@ if $@;
+    foreach $line (split "\n", $contents) {
+      if ($line eq ""){
+           print $lineprefix, $blankline;
+       } else {
+            $line =~ s/\\\\\\/\&/g;
+           print $lineprefix, $line;
+       }
+       print "\n";
+    }
+}
+
+#output sections in html
+sub output_section_html(%) {
+    my %args = %{$_[0]};
+    my $section;
+
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "<h3>$section</h3>\n";
+       print "<blockquote>\n";
+       output_highlight($args{'sections'}{$section});
+       print "</blockquote>\n";
+    }  
+}
+
+# output enum in html
+sub output_enum_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "<h2>enum ".$args{'enum'}."</h2>\n";
+
+    print "<b>enum ".$args{'enum'}."</b> {<br>\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+        print " <b>".$parameter."</b>";
+       if ($count != $#{$args{'parameterlist'}}) {
+           $count++;
+           print ",\n";
+       }
+       print "<br>";
+    }
+    print "};<br>\n";
+
+    print "<h3>Constants</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       print "<dt><b>".$parameter."</b>\n";
+       print "<dd>";
+       output_highlight($args{'parameterdescs'}{$parameter});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output tyepdef in html
+sub output_typedef_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "<h2>typedef ".$args{'typedef'}."</h2>\n";
+
+    print "<b>typedef ".$args{'typedef'}."</b>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output struct in html
+sub output_struct_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+    print "<h2>".$args{'type'}." ".$args{'struct'}."</h2>\n";
+    print "<b>".$args{'type'}." ".$args{'struct'}."</b> {<br>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       if ($parameter =~ /^#/) {
+               print "$parameter<br>\n";
+               next;
+       }
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print " <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n";
+       } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+           print " <i>$1</i> <b>$parameter</b>$2;<br>\n";
+       } else {
+           print " <i>$type</i> <b>$parameter</b>;<br>\n";
+       }
+    }
+    print "};<br>\n";
+
+    print "<h3>Members</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       ($parameter =~ /^#/) && next;
+
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       print "<dt><b>".$parameter."</b>\n";
+       print "<dd>";
+       output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output function in html
+sub output_function_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    print "<h2>Function</h2>\n";
+
+    print "<i>".$args{'functiontype'}."</i>\n";
+    print "<b>".$args{'function'}."</b>\n";
+    print "(";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
+       } else {
+           print "<i>".$type."</i> <b>".$parameter."</b>";
+       }
+       if ($count != $#{$args{'parameterlist'}}) {
+           $count++;
+           print ",\n";
+       }
+    }
+    print ")\n";
+
+    print "<h3>Arguments</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       print "<dt><b>".$parameter."</b>\n";
+       print "<dd>";
+       output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output intro in html
+sub output_intro_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "<h3>$section</h3>\n";
+       print "<ul>\n";
+       output_highlight($args{'sections'}{$section});
+       print "</ul>\n";
+    }
+    print "<hr>\n";
+}
+
+sub output_section_sgml(%) {
+    my %args = %{$_[0]};
+    my $section;    
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "<refsect1>\n <title>$section</title>\n <para>\n";
+       if ($section =~ m/EXAMPLE/i) {
+           print "<example><para>\n";
+       }
+       output_highlight($args{'sections'}{$section});
+       if ($section =~ m/EXAMPLE/i) {
+           print "</para></example>\n";
+       }
+       print " </para>\n</refsect1>\n";
+    }
+}
+
+# output function in sgml DocBook
+sub output_function_sgml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-".$args{'function'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    if ($verbose) {
+        print STDERR "generating doc for function ".$args{'function'}."\n";
+    }
+    print "<refentry>\n";
+    print "<refmeta>\n";
+    print "<refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'function'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <funcsynopsis><funcprototype>\n";
+    print "   <funcdef>".$args{'functiontype'}." ";
+    print "<function>".$args{'function'}." </function></funcdef>\n";
+
+    $count = 0;
+    if ($#{$args{'parameterlist'}} >= 0) {
+       foreach $parameter (@{$args{'parameterlist'}}) {
+           $type = $args{'parametertypes'}{$parameter};
+           if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+               # pointer-to-function
+               print "   <paramdef>$1<parameter>$parameter</parameter>)\n";
+               print "     <funcparams>$2</funcparams></paramdef>\n";
+           } else {
+               print "   <paramdef>".$type;
+               print " <parameter>$parameter</parameter></paramdef>\n";
+           }
+       }
+    } else {
+       print "  <void>\n";
+    }
+    print "  </funcprototype></funcsynopsis>\n";
+    print "</refsynopsisdiv>\n";
+
+    # print parameters
+    print "<refsect1>\n <title>Arguments</title>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+       print " <variablelist>\n";
+       foreach $parameter (@{$args{'parameterlist'}}) {
+           my $parameter_name = $parameter;
+           $parameter_name =~ s/\[.*//;
+
+           print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
+           print "   <listitem>\n    <para>\n";
+           $lineprefix="     ";
+           output_highlight($args{'parameterdescs'}{$parameter_name});
+           print "    </para>\n   </listitem>\n  </varlistentry>\n";
+       }
+       print " </variablelist>\n";
+    } else {
+       print " <para>\n  None\n </para>\n";
+    }
+    print "</refsect1>\n";
+
+    output_section_sgml(@_);
+    print "</refentry>\n\n";
+}
+
+# output struct in sgml DocBook
+sub output_struct_sgml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $id;
+
+    $id = "API-struct-".$args{'struct'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+    
+    if ($verbose) {
+        print STDERR "generating doc for struct ".$args{'struct'}."\n";
+    }
+    print "<refentry>\n";
+    print "<refmeta>\n";
+    print "<refentrytitle><phrase id=\"$id\">".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'type'}." ".$args{'struct'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <programlisting>\n";
+    print $args{'type'}." ".$args{'struct'}." {\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       if ($parameter =~ /^#/) {
+           print "$parameter\n";
+           next;
+       }
+
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+       defined($args{'parameterdescs'}{$parameter_name}) || next;
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print "  $1 $parameter) ($2);\n";
+       } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+           print "  $1 $parameter$2;\n";
+       } else {
+           print "  ".$type." ".$parameter.";\n";
+       }
+    }
+    print "};";
+    print "  </programlisting>\n";
+    print "</refsynopsisdiv>\n";
+
+    print " <refsect1>\n";
+    print "  <title>Members</title>\n";
+
+    print "  <variablelist>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+      ($parameter =~ /^#/) && next;
+
+      my $parameter_name = $parameter;
+      $parameter_name =~ s/\[.*//;
+
+      defined($args{'parameterdescs'}{$parameter_name}) || next;
+      ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+      print "    <varlistentry>";
+      print "      <term>$parameter</term>\n";
+      print "      <listitem><para>\n";
+      output_highlight($args{'parameterdescs'}{$parameter_name});
+      print "      </para></listitem>\n";
+      print "    </varlistentry>\n";
+    }
+    print "  </variablelist>\n";
+    print " </refsect1>\n";
+
+    output_section_sgml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output enum in sgml DocBook
+sub output_enum_sgml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-enum-".$args{'enum'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    if ($verbose) {
+        print STDERR "generating doc for enum ".$args{'enum'}."\n";
+    }
+    print "<refentry>\n";
+    print "<refmeta>\n";
+    print "<refentrytitle><phrase id=\"$id\">enum ".$args{'enum'}."</phrase></refentrytitle>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>enum ".$args{'enum'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <programlisting>\n";
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+        print "  $parameter";
+        if ($count != $#{$args{'parameterlist'}}) {
+           $count++;
+           print ",";
+        }
+       print "\n";
+    }
+    print "};";
+    print "  </programlisting>\n";
+    print "</refsynopsisdiv>\n";
+
+    print "<refsect1>\n";
+    print " <title>Constants</title>\n";    
+    print "  <variablelist>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+      my $parameter_name = $parameter;
+      $parameter_name =~ s/\[.*//;
+
+      print "    <varlistentry>";
+      print "      <term>$parameter</term>\n";
+      print "      <listitem><para>\n";
+      output_highlight($args{'parameterdescs'}{$parameter_name});
+      print "      </para></listitem>\n";
+      print "    </varlistentry>\n";
+    }
+    print "  </variablelist>\n";
+    print "</refsect1>\n";
+
+    output_section_sgml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output typedef in sgml DocBook
+sub output_typedef_sgml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $id;
+
+    $id = "API-typedef-".$args{'typedef'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    if ($verbose) {
+        print STDERR "generating doc for typedef ".$args{'typedef'}."\n";
+    }
+    print "<refentry>\n";
+    print "<refmeta>\n";
+    print "<refentrytitle><phrase id=\"$id\">typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>typedef ".$args{'typedef'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <synopsis>typedef ".$args{'typedef'}.";</synopsis>\n";
+    print "</refsynopsisdiv>\n";
+
+    output_section_sgml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output in sgml DocBook
+sub output_intro_sgml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    my $id = $args{'module'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "<refsect1>\n <title>$section</title>\n <para>\n";
+       if ($section =~ m/EXAMPLE/i) {
+           print "<example><para>\n";
+       }
+       output_highlight($args{'sections'}{$section});
+       if ($section =~ m/EXAMPLE/i) {
+           print "</para></example>\n";
+       }
+       print " </para>\n</refsect1>\n";
+    }
+
+    print "\n\n";
+}
+
+# output in sgml DocBook
+sub output_function_gnome {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = $args{'module'}."-".$args{'function'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<sect2>\n";
+    print " <title id=\"$id\">".$args{'function'}."</title>\n";
+
+    print "  <funcsynopsis>\n";
+    print "   <funcdef>".$args{'functiontype'}." ";
+    print "<function>".$args{'function'}." ";
+    print "</function></funcdef>\n";
+
+    $count = 0;
+    if ($#{$args{'parameterlist'}} >= 0) {
+       foreach $parameter (@{$args{'parameterlist'}}) {
+           $type = $args{'parametertypes'}{$parameter};
+           if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+               # pointer-to-function
+               print "   <paramdef>$1 <parameter>$parameter</parameter>)\n";
+               print "     <funcparams>$2</funcparams></paramdef>\n";
+           } else {
+               print "   <paramdef>".$type;
+               print " <parameter>$parameter</parameter></paramdef>\n";
+           }
+       }
+    } else {
+       print "  <void>\n";
+    }
+    print "  </funcsynopsis>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+       print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
+       print "<tgroup cols=\"2\">\n";
+       print "<colspec colwidth=\"2*\">\n";
+       print "<colspec colwidth=\"8*\">\n";
+       print "<tbody>\n";
+       foreach $parameter (@{$args{'parameterlist'}}) {
+           my $parameter_name = $parameter;
+           $parameter_name =~ s/\[.*//;
+
+           print "  <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
+           print "   <entry>\n";
+           $lineprefix="     ";
+           output_highlight($args{'parameterdescs'}{$parameter_name});
+           print "    </entry></row>\n";
+       }
+       print " </tbody></tgroup></informaltable>\n";
+    } else {
+       print " <para>\n  None\n </para>\n";
+    }
+
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "<simplesect>\n <title>$section</title>\n";
+       if ($section =~ m/EXAMPLE/i) {
+           print "<example><programlisting>\n";
+       } else {
+       }
+       print "<para>\n";
+       output_highlight($args{'sections'}{$section});
+       print "</para>\n";
+       if ($section =~ m/EXAMPLE/i) {
+           print "</programlisting></example>\n";
+       } else {
+       }
+       print " </simplesect>\n";
+    }
+
+    print "</sect2>\n\n";
+}
+
+##
+# output function in man
+sub output_function_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print $args{'function'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+    $count = 0;
+    my $parenth = "(";
+    my $post = ",";
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+       if ($count == $#{$args{'parameterlist'}}) {
+           $post = ");";
+       }
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print ".BI \"".$parenth.$1."\" ".$parameter." \") (".$2.")".$post."\"\n";
+       } else {
+           $type =~ s/([^\*])$/$1 /;
+           print ".BI \"".$parenth.$type."\" ".$parameter." \"".$post."\"\n";
+       }
+       $count++;
+       $parenth = "";
+    }
+
+    print ".SH ARGUMENTS\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+       print ".IP \"".$parameter."\" 12\n";
+       output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+       print ".SH \"", uc $section, "\"\n";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output enum in man
+sub output_enum_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print "enum ".$args{'enum'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+        print ".br\n.BI \"    $parameter\"\n";
+       if ($count == $#{$args{'parameterlist'}}) {
+           print "\n};\n";
+           last;
+       }
+       else {
+           print ", \n.br\n";
+       }
+       $count++;
+    }
+
+    print ".SH Constants\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+       print ".IP \"".$parameter."\" 12\n";
+       output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+       print ".SH \"$section\"\n";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output struct in man
+sub output_struct_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    print ".TH \"$args{'module'}\" 9 \"".$args{'type'}." ".$args{'struct'}."\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print $args{'type'}." ".$args{'struct'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    print $args{'type'}." ".$args{'struct'}." {\n.br\n";
+
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+       if ($parameter =~ /^#/) {
+           print ".BI \"$parameter\"\n.br\n";
+           next;
+       }
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print ".BI \"    ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n";
+       } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+           print ".BI \"    ".$1."\" ".$parameter.$2." \""."\"\n;\n";
+       } else {
+           $type =~ s/([^\*])$/$1 /;
+           print ".BI \"    ".$type."\" ".$parameter." \""."\"\n;\n";
+       }
+       print "\n.br\n";
+    }
+    print "};\n.br\n";
+
+    print ".SH Arguments\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       ($parameter =~ /^#/) && next;
+
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       print ".IP \"".$parameter."\" 12\n";
+       output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+       print ".SH \"$section\"\n";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output typedef in man
+sub output_typedef_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print "typedef ".$args{'typedef'}." \\- ".$args{'purpose'}."\n";
+
+    foreach $section (@{$args{'sectionlist'}}) {
+       print ".SH \"$section\"\n";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+sub output_intro_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    foreach $section (@{$args{'sectionlist'}}) {
+       print ".SH \"$section\"\n";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output in text
+sub output_function_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    print "Function:\n\n";
+    my $start=$args{'functiontype'}." ".$args{'function'}." (";
+    print $start;
+    my $count = 0;
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print $1.$parameter.") (".$2;
+       } else {
+           print $type." ".$parameter;
+       }
+       if ($count != $#{$args{'parameterlist'}}) {
+           $count++;
+           print ",\n";
+           print " " x length($start);
+       } else {
+           print ");\n\n";
+       }
+    }
+
+    print "Arguments:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+       print $parameter."\n\t".$args{'parameterdescs'}{$parameter_name}."\n";
+    }
+    output_section_text(@_);
+}
+
+#output sections in text
+sub output_section_text(%) {
+    my %args = %{$_[0]};
+    my $section;
+
+    print "\n";
+    foreach $section (@{$args{'sectionlist'}}) {
+       print "$section:\n\n";
+       output_highlight($args{'sections'}{$section});
+    }  
+    print "\n\n";
+}
+
+# output enum in text
+sub output_enum_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "Enum:\n\n";
+
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+        print "\t$parameter";
+       if ($count != $#{$args{'parameterlist'}}) {
+           $count++;
+           print ",";
+       }
+       print "\n";
+    }
+    print "};\n\n";
+
+    print "Constants:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       print "$parameter\n\t";
+       print $args{'parameterdescs'}{$parameter}."\n";
+    }
+
+    output_section_text(@_);
+}
+
+# output typedef in text
+sub output_typedef_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "Typedef:\n\n";
+
+    print "typedef ".$args{'typedef'}."\n";
+    output_section_text(@_);
+}
+
+# output struct as text
+sub output_struct_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+    print $args{'type'}." ".$args{'struct'}.":\n\n";
+    print $args{'type'}." ".$args{'struct'}." {\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       if ($parameter =~ /^#/) {
+           print "$parameter\n";
+           next;
+       }
+
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       $type = $args{'parametertypes'}{$parameter};
+       if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+           # pointer-to-function
+           print "\t$1 $parameter) ($2);\n";
+       } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+           print "\t$1 $parameter$2;\n";
+       } else {
+           print "\t".$type." ".$parameter.";\n";
+       }
+    }
+    print "};\n\n";
+
+    print "Members:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+       ($parameter =~ /^#/) && next;
+
+       my $parameter_name = $parameter;
+       $parameter_name =~ s/\[.*//;
+
+        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+       print "$parameter\n\t";
+       print $args{'parameterdescs'}{$parameter_name}."\n";
+    }
+    print "\n";
+    output_section_text(@_);
+}
+
+sub output_intro_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    foreach $section (@{$args{'sectionlist'}}) {
+       print " $section:\n";
+       print "    -> ";
+       output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# generic output function for typedefs
+sub output_declaration {
+    no strict 'refs';
+    my $name = shift;
+    my $functype = shift;
+    my $func = "output_${functype}_$output_mode";
+    #if ($verbose) {
+    #  print STDERR "Info(): function_only: $function_only output_declaration for $name\n";
+    #  if(defined($function_table{$name})) {
+    #      print STDERR "Info(): function $name defined in function_table\n";
+    #  }
+    #}
+    if (($function_only==0) || 
+       ( $function_only == 1 && defined($function_table{$name})) || 
+       ( $function_only == 2 && !defined($function_table{$name})))
+    {
+        &$func(@_);    
+        #if ($verbose) {
+       #   print STDERR "Info(): incrementing section_counter: $section_counter\n";
+       #}      
+       $section_counter++;
+    }
+}
+
+##
+# generic output function - calls the right one based
+# on current output mode.
+sub output_intro {
+    no strict 'refs';
+    my $func = "output_intro_".$output_mode;
+    &$func(@_);
+    $section_counter++;
+}
+
+##
+# takes a declaration (struct, union, enum, typedef) and 
+# invokes the right handler. NOT called for functions.
+sub dump_declaration($$) {
+    no strict 'refs';
+    my ($prototype, $file) = @_;
+    my $func = "dump_".$decl_type;
+    &$func(@_);
+}
+
+sub dump_union($$) {
+    dump_struct(@_);
+}
+
+sub dump_struct($$) {
+    my $x = shift;
+    my $file = shift;
+
+    if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) {
+        $declaration_name = $2;
+        my $members = $3;
+
+       # ignore embedded structs or unions
+       $members =~ s/{.*?}//g;
+
+       create_parameterlist($members, ';', $file);
+
+       output_declaration($declaration_name,
+                          'struct',
+                          {'struct' => $declaration_name,
+                           'module' => $modulename,
+                           'parameterlist' => \@parameterlist,
+                           'parameterdescs' => \%parameterdescs,
+                           'parametertypes' => \%parametertypes,
+                           'sectionlist' => \@sectionlist,
+                           'sections' => \%sections,
+                           'purpose' => $declaration_purpose,
+                           'type' => $decl_type
+                          });
+    }
+    else {
+        print STDERR "Error(${file}:$.): Cannot parse struct or union!\n";
+       ++$errors;
+    }
+}
+
+sub dump_enum($$) {
+    my $x = shift;
+    my $file = shift;
+
+    if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
+        $declaration_name = $1;
+        my $members = $2;
+
+       foreach my $arg (split ',', $members) {
+           $arg =~ s/^\s*(\w+).*/$1/;
+           push @parameterlist, $arg;
+           if (!$parameterdescs{$arg}) {
+               $parameterdescs{$arg} = $undescribed;
+               print STDERR "Warning(${file}:$.): Enum value '$arg' ".
+                   "not described in enum '$declaration_name'\n";
+           }
+
+       }
+       
+       output_declaration($declaration_name,
+                          'enum',
+                          {'enum' => $declaration_name,
+                           'module' => $modulename,
+                           'parameterlist' => \@parameterlist,
+                           'parameterdescs' => \%parameterdescs,
+                           'sectionlist' => \@sectionlist,
+                           'sections' => \%sections,
+                           'purpose' => $declaration_purpose
+                          });
+    }
+    else {
+        print STDERR "Error(${file}:$.): Cannot parse enum!\n";
+       ++$errors;
+    }
+}
+
+sub dump_typedef($$) {
+    my $x = shift;
+    my $file = shift;
+
+    while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
+        $x =~ s/\(*.\)\s*;$/;/;
+       $x =~ s/\[*.\]\s*;$/;/;
+    }
+
+    if ($x =~ /typedef.*\s+(\w+)\s*;/) {
+        $declaration_name = $1;
+
+       output_declaration($declaration_name,
+                          'typedef',
+                          {'typedef' => $declaration_name,
+                           'module' => $modulename,
+                           'sectionlist' => \@sectionlist,
+                           'sections' => \%sections,
+                           'purpose' => $declaration_purpose
+                          });
+    }
+    else {
+        print STDERR "Error(${file}:$.): Cannot parse typedef!\n";
+       ++$errors;
+    }
+}
+
+sub create_parameterlist($$$) {
+    my $args = shift;
+    my $splitter = shift;
+    my $file = shift;
+    my $type;
+    my $param;
+
+    while ($args =~ /(\([^\),]+),/) {
+        $args =~ s/(\([^\),]+),/$1#/g;
+    }
+    
+    foreach my $arg (split($splitter, $args)) {
+       # strip comments
+       $arg =~ s/\/\*.*\*\///;
+        # strip leading/trailing spaces
+        $arg =~ s/^\s*//;
+       $arg =~ s/\s*$//;
+       $arg =~ s/\s+/ /;
+
+       if ($arg =~ /^#/) {
+           # Treat preprocessor directive as a typeless variable just to fill
+           # corresponding data structures "correctly". Catch it later in
+           # output_* subs.
+           push_parameter($arg, "", $file);
+       } elsif ($arg =~ m/\(/) {
+           # pointer-to-function
+           $arg =~ tr/#/,/;
+           $arg =~ m/[^\(]+\(\*([^\)]+)\)/;
+           $param = $1;
+           $type = $arg;
+           $type =~ s/([^\(]+\(\*)$param/$1/;
+           push_parameter($param, $type, $file);
+       } else {
+           $arg =~ s/\s*:\s*/:/g;
+           $arg =~ s/\s*\[/\[/g;
+
+           my @args = split('\s*,\s*', $arg);
+           if ($args[0] =~ m/\*/) {
+               $args[0] =~ s/(\*+)\s*/ $1/;
+           }
+           my @first_arg = split('\s+', shift @args);
+           unshift(@args, pop @first_arg);
+           $type = join " ", @first_arg;
+
+           foreach $param (@args) {
+               if ($param =~ m/^(\*+)\s*(.*)/) {
+                   push_parameter($2, "$type $1", $file);
+               }
+               elsif ($param =~ m/(.*?):(\d+)/) {
+                   push_parameter($1, "$type:$2", $file)
+               }
+               else {
+                   push_parameter($param, $type, $file);
+               }
+           }
+       }
+    }
+}
+
+sub push_parameter($$$) {
+       my $param = shift;
+       my $type = shift;
+       my $file = shift;
+
+       my $param_name = $param;
+       $param_name =~ s/\[.*//;
+
+       if ($type eq "" && $param eq "...")
+       {
+           $type="";
+           $param="...";
+           $parameterdescs{"..."} = "variable arguments";
+       }
+       elsif ($type eq "" && ($param eq "" or $param eq "void"))
+       {
+           $type="";
+           $param="void";
+           $parameterdescs{void} = "no arguments";
+       }
+       if (defined $type && $type && !defined $parameterdescs{$param_name}) {
+           $parameterdescs{$param_name} = $undescribed;
+
+           if (($type eq 'function') || ($type eq 'enum')) {
+               print STDERR "Warning(${file}:$.): Function parameter ".
+                   "or member '$param' not " .
+                   "described in '$declaration_name'\n";
+           }
+           print STDERR "Warning(${file}:$.):".
+                        " No description found for parameter '$param'\n";
+           ++$warnings;
+        }
+
+       push @parameterlist, $param;
+       $parametertypes{$param} = $type;
+}
+
+##
+# takes a function prototype and the name of the current file being
+# processed and spits out all the details stored in the global
+# arrays/hashes.
+sub dump_function($$) {
+    my $prototype = shift;
+    my $file = shift;
+
+    $prototype =~ s/^static +//;
+    $prototype =~ s/^extern +//;
+    $prototype =~ s/^fastcall +//;
+    $prototype =~ s/^asmlinkage +//;
+    $prototype =~ s/^inline +//;
+    $prototype =~ s/^__inline__ +//;
+    $prototype =~ s/^#define +//; #ak added
+    $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//;
+
+    # Yes, this truly is vile.  We are looking for:
+    # 1. Return type (may be nothing if we're looking at a macro)
+    # 2. Function name
+    # 3. Function parameters.
+    #
+    # All the while we have to watch out for function pointer parameters
+    # (which IIRC is what the two sections are for), C types (these
+    # regexps don't even start to express all the possibilities), and
+    # so on.
+    #
+    # If you mess with these regexps, it's a good idea to check that
+    # the following functions' documentation still comes out right:
+    # - parport_register_device (function pointer parameters)
+    # - atomic_set (macro)
+    # - pci_match_device (long return type)
+
+    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+       $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
+       $return_type = $1;
+       $declaration_name = $2;
+       my $args = $3;
+
+       create_parameterlist($args, ',', $file);
+    } else {
+       print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
+       ++$errors;
+       return;
+    }
+
+    output_declaration($declaration_name, 
+                      'function',
+                      {'function' => $declaration_name,
+                       'module' => $modulename,
+                       'functiontype' => $return_type,
+                       'parameterlist' => \@parameterlist,
+                       'parameterdescs' => \%parameterdescs,
+                       'parametertypes' => \%parametertypes,
+                       'sectionlist' => \@sectionlist,
+                       'sections' => \%sections,
+                       'purpose' => $declaration_purpose
+                      });
+}
+
+sub process_file($);
+
+# Read the file that maps relative names to absolute names for
+# separate source and object directories and for shadow trees.
+if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
+       my ($relname, $absname);
+       while(<SOURCE_MAP>) {
+               chop();
+               ($relname, $absname) = (split())[0..1];
+               $relname =~ s:^/+::;
+               $source_map{$relname} = $absname;
+       }
+       close(SOURCE_MAP);
+}
+
+if (! ($sgml_reference_title eq "")) {
+       print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+       print "<section><title>$sgml_reference_title</title>\n";
+}
+
+if ($filelist) {
+       open(FLIST,"<$filelist") or die "Can't open file list $filelist";
+       while(<FLIST>) {
+               chop;
+               process_file($_);
+       }
+}
+
+foreach (@ARGV) {
+    chomp;
+    process_file($_);
+}
+
+if (! ($sgml_reference_title eq "")) {
+       print "</section>\n";
+}
+if ($verbose && $errors) {
+  print STDERR "$errors errors\n";
+}
+if ($verbose && $warnings) {
+  print STDERR "$warnings warnings\n";
+}
+
+exit($errors);
+
+sub reset_state {
+    $function = "";
+    %constants = ();
+    %parameterdescs = ();
+    %parametertypes = ();
+    @parameterlist = ();
+    %sections = ();
+    @sectionlist = ();
+    $prototype = "";
+    
+    $state = 0;
+}
+
+sub process_state3_function($$) { 
+    my $x = shift;
+    my $file = shift;
+
+    if ($x =~ m#\s*/\*\s+MACDOC\s*#io) {
+       # do nothing
+    }
+    elsif ($x =~ /([^\{]*)/) {
+        $prototype .= $1;
+    }
+    if (($x =~ /\{/) || ($x =~ /\#/) || ($x =~ /;/)) {
+        $prototype =~ s@/\*.*?\*/@@gos;        # strip comments.
+       $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+       $prototype =~ s@^\s+@@gos; # strip leading spaces
+       dump_function($prototype,$file);
+       reset_state();
+    }
+}
+
+sub process_state3_type($$) { 
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@/\*.*?\*/@@gos;    # strip comments.
+    $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+    $x =~ s@^\s+@@gos; # strip leading spaces
+    $x =~ s@\s+$@@gos; # strip trailing spaces
+    if ($x =~ /^#/) {
+       # To distinguish preprocessor directive from regular declaration later.
+       $x .= ";";
+    }
+
+    while (1) {
+        if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
+           $prototype .= $1 . $2;
+           ($2 eq '{') && $brcount++;
+           ($2 eq '}') && $brcount--;
+           if (($2 eq ';') && ($brcount == 0)) {
+               dump_declaration($prototype,$file);
+               reset_state();
+               last;
+           }
+           $x = $3;
+        } else {
+           $prototype .= $x;
+           last;
+       }
+    }
+}
+
+sub process_file($) {
+    #my ($file) = "$ENV{'SRCTREE'}@_";
+    my ($file) = @_;
+    my $identifier;
+    my $func;
+    my $initial_section_counter = $section_counter;
+
+    if (defined($source_map{$file})) {
+       $file = $source_map{$file};
+    }
+
+    if (!open(IN,"<$file")) {
+       print STDERR "Error: Cannot open file $file\n";
+       ++$errors;
+       return;
+    }
+
+    print STDERR "Parsing file $file\n";
+    #$section_counter = 0;
+    while (<IN>) {
+       if ($state == 0) {
+           if (/$doc_start/o) {
+               $state = 1;             # next line is always the function name
+               #print STDERR "found doc start\n";
+           }
+       } elsif ($state == 1) { # this line is the function name (always)
+           if (/$doc_block/o) {
+               $state = 4;
+               $contents = "";
+               if ( $1 eq "" ) {
+                       $section = $section_intro;
+               } else {
+                       $section = $1;
+               }
+            }
+           elsif (/$doc_decl/o) {
+               $identifier = $1;
+               if (/\s*([\w\s]+?)\s*-/) {
+                   $identifier = $1;
+               }
+
+               $state = 2;
+               if (/-(.*)/) {
+                   $declaration_purpose = $1;
+               } else {
+                   $declaration_purpose = "";
+               }
+               if ($identifier =~ m/^struct/) {
+                   $decl_type = 'struct';
+               } elsif ($identifier =~ m/^union/) {
+                   $decl_type = 'union';
+               } elsif ($identifier =~ m/^enum/) {
+                   $decl_type = 'enum';
+               } elsif ($identifier =~ m/^typedef/) {
+                   $decl_type = 'typedef';
+               } else {
+                   $decl_type = 'function';
+               }
+
+               if ($verbose) {
+                   print STDERR "Info(${file}:$.): Scanning doc for $identifier\n";
+               }
+           } else {
+               print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.",
+               " - I thought it was a doc line\n";
+               ++$warnings;
+               $state = 0;
+           }
+       } elsif ($state == 2) { # look for head: lines, and include content
+           if (/$doc_sect/o) {
+               $newsection = $1;
+               $newcontents = $2;
+
+               if ($contents ne "") {
+                   $contents =~ s/\&/\\\\\\amp;/g;
+                   $contents =~ s/\</\\\\\\lt;/g;
+                   $contents =~ s/\>/\\\\\\gt;/g;
+                   dump_section($section, $contents);
+                   $section = $section_default;
+               }
+
+               $contents = $newcontents;
+               if ($contents ne "") {
+                   $contents .= "\n";
+               }
+               $section = $newsection;
+           } elsif (/$doc_end/) {
+
+               if ($contents ne "") {
+                   $contents =~ s/\&/\\\\\\amp;/g;
+                   $contents =~ s/\</\\\\\\lt;/g;
+                   $contents =~ s/\>/\\\\\\gt;/g;
+                   dump_section($section, $contents);
+                   $section = $section_default;
+                   $contents = "";
+               }
+
+               $prototype = "";
+               $state = 3;
+               $brcount = 0;
+#          print STDERR "end of doc comment, looking for prototype\n";
+           } elsif (/$doc_content/) {
+               # miguel-style comment kludge, look for blank lines after
+               # @parameter line to signify start of description
+               if ($1 eq "" && 
+                       ($section =~ m/^@/ || $section eq $section_context)) {
+                   $contents =~ s/\&/\\\\\\amp;/g;
+                   $contents =~ s/\</\\\\\\lt;/g;
+                   $contents =~ s/\>/\\\\\\gt;/g;
+                   dump_section($section, $contents);
+                   $section = $section_default;
+                   $contents = "";
+               } else {
+                   $contents .= $1."\n";
+               }
+           } else {
+               # i dont know - bad line?  ignore.
+               print STDERR "Warning(${file}:$.): bad line: $_"; 
+               ++$warnings;
+           }
+       } elsif ($state == 3) { # scanning for function { (end of prototype)
+           if ($decl_type eq 'function') {
+               process_state3_function($_, $file);
+           } else {
+               process_state3_type($_, $file);
+           }
+       } elsif ($state == 4) {
+               # Documentation block
+               if (/$doc_block/) {
+                       dump_section($section, $contents);
+                       output_intro({'sectionlist' => \@sectionlist,
+                                     'sections' => \%sections });
+                       $contents = "";
+                       $function = "";
+                       %constants = ();
+                       %parameterdescs = ();
+                       %parametertypes = ();
+                       @parameterlist = ();
+                       %sections = ();
+                       @sectionlist = ();
+                       $prototype = "";
+                       if ( $1 eq "" ) {
+                               $section = $section_intro;
+                       } else {
+                               $section = $1;
+                       }
+                }
+               elsif (/$doc_end/)
+               {
+                       dump_section($section, $contents);
+                       output_intro({'sectionlist' => \@sectionlist,
+                                     'sections' => \%sections });
+                       $contents = "";
+                       $function = "";
+                       %constants = ();
+                       %parameterdescs = ();
+                       %parametertypes = ();
+                       @parameterlist = ();
+                       %sections = ();
+                       @sectionlist = ();
+                       $prototype = "";
+                       $state = 0;
+               }
+               elsif (/$doc_content/)
+               {
+                       if ( $1 eq "" )
+                       {
+                               $contents .= $blankline;
+                       }
+                       else
+                       {
+                               $contents .= $1 . "\n";
+                       }       
+               }
+          }
+    }
+    if ($initial_section_counter == $section_counter) {
+       print STDERR "Warning(${file}): no structured comments found\n";
+       if ($output_mode eq "sgml" && $add_dummy_entry_per_file > 0) {
+           # The template wants at least one RefEntry here; make one.
+           print "<refentry>\n";
+           print " <refnamediv>\n";
+           print "  <refname>\n";
+           print "   ${file}\n";
+           print "  </refname>\n";
+           print "  <refpurpose>\n";
+           print "   Document generation inconsistency\n";
+           print "  </refpurpose>\n";
+           print " </refnamediv>\n";
+           print " <refsect1>\n";
+           print "  <title>\n";
+           print "   Oops\n";
+           print "  </title>\n";
+           print "  <warning>\n";
+           print "   <para>\n";
+           print "    The template for this document tried to insert\n";
+           print "    the structured comment from the file\n";
+           print "    <filename>${file}</filename> at this point,\n";
+           print "    but none was found.\n";
+           print "    This dummy section is inserted to allow\n";
+           print "    generation to continue.\n";
+           print "   </para>\n";
+           print "  </warning>\n";
+           print " </refsect1>\n";
+           print "</refentry>\n";
+       }
+    }
+}
diff --git a/lincan-0.3.3/scripts/tmpl2sgml b/lincan-0.3.3/scripts/tmpl2sgml
new file mode 100755 (executable)
index 0000000..9c0424f
--- /dev/null
@@ -0,0 +1,23 @@
+#!/usr/bin/perl
+#warn "No digit found.\n";
+
+use Env qw(PATH TMPL2SGML KERNELDOC);
+
+warn "Processing $ARGV[0]\n" ;
+#warn "PATH=$PATH\n" ;
+warn "KERNELDOC=$KERNELDOC\n" ;
+
+open (TMPLFILE, "$ARGV[0]");
+
+while (<TMPLFILE>) {
+       $line=$_;
+       if($line=~m/^![EIF]/){
+               ($srctype,$srcfile)= $line =~ /^!([EIF])(.*)$/ ;
+               warn "Found $srctype : $srcfile\n" ;
+               system "$KERNELDOC -docbook $srcfile";
+       }else{
+               print $line
+       }
+}
+
+close TMPLFILE;
diff --git a/lincan-0.3.3/src/Makefile b/lincan-0.3.3/src/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/lincan-0.3.3/src/Makefile.omk b/lincan-0.3.3/src/Makefile.omk
new file mode 100644 (file)
index 0000000..d643574
--- /dev/null
@@ -0,0 +1,61 @@
+lincan_cards_NAMES = pip pccan smartcan nsi cc_can104 ems_cpcpci \
+               pc_i03 pcm3680 aim104 m437 pcccan ssv bfadcan pikronisa eb8245 \
+               kv_pcican msmcan oscar adlink7841 unican virtual template
+
+lincan_morecards_NAMES = hms30c7202_can ns_dev_can ipci165 pimx1 tscan1 nsi_canpci
+
+default_CONFIG = CONFIG_OC_LINCAN=y CONFIG_OC_LINCANRTL=n CONFIG_OC_LINCANVME=n
+default_CONFIG += CONFIG_OC_LINCAN_PORTIO_ONLY=n CONFIG_OC_LINCAN_MEMIO_ONLY=n
+default_CONFIG += CONFIG_OC_LINCAN_DETAILED_ERRORS=y
+default_CONFIG += $(foreach n, $(lincan_cards_NAMES), CONFIG_OC_LINCAN_CARD_$(n)=y)
+default_CONFIG += $(foreach n, $(lincan_morecards_NAMES), CONFIG_OC_LINCAN_CARD_$(n)=n)
+
+
+lincan_cards_SELECTED =        $(filter %.y, $(foreach x, $(lincan_cards_NAMES) $(lincan_morecards_NAMES), $(x).$(CONFIG_OC_LINCAN_CARD_$(x))))
+lincan_cards_SELECTED := $(lincan_cards_SELECTED:%.y=%)
+
+LOCAL_CONFIG_H = lincan_config.h
+
+ifeq ($(CONFIG_OC_LINCAN),y)
+
+rtlinux_INCLUDES = -I $(srcdir)/../include -I .
+kernel_INCLUDES = -I $(srcdir)/../include -I .
+#kernel_INCLUDES += -DCAN_DEBUG
+kernel_INCLUDES += -DWITH_DEVFS_FS
+
+lincan_cards_SOURCES = $(lincan_cards_SELECTED:%=%.c)
+
+ifeq ($(CONFIG_OC_LINCAN_CARD_unican),y)
+lincan_cards_SOURCES += unican_cl2.c
+endif
+
+ifeq ($(CONFIG_OC_LINCAN_CARD_ipci165),y)
+lincan_cards_SOURCES += ipci165_fw.c kthread.c
+endif
+
+ifneq ($(filter hms30c7202_can ns_dev_can,$(lincan_cards_SELECTED)),)
+$(warning Not finished C_CAN support requested)
+lincan_cards_SOURCES += c_can.c c_can_irq.c 
+endif
+
+ifneq ($(CONFIG_OC_LINCANRTL),y)
+
+kernel_MODULES = lincan
+
+else #CONFIG_OC_LINCANRTL
+
+rtlinux_MODULES = lincan
+
+rtlinux_INCLUDES +=  -DCAN_WITH_RTL
+lincan_rtl_SOURCES = open_rtl.c close_rtl.c read_rtl.c write_rtl.c ioctl_rtl.c \
+               can_quertl.c can_devrtl.c
+endif #CONFIG_OC_LINCANRTL
+
+lincan_SOURCES = can_queue.c can_quekern.c main.c modparms.c \
+               devcommon.c setup.c finish.c irq.c sysdep_lnx.c boardlist.c \
+               sja1000p.c sja1000.c i82527.c  \
+               open.c close.c read.c write.c ioctl.c select.c fasync.c \
+               proc.c ioctl_query.c ioctl_remote.c \
+               $(lincan_cards_SOURCES) $(lincan_rtl_SOURCES)
+               
+endif #CONFIG_OC_LINCAN
diff --git a/lincan-0.3.3/src/Makefile.std b/lincan-0.3.3/src/Makefile.std
new file mode 100644 (file)
index 0000000..b71ca95
--- /dev/null
@@ -0,0 +1,209 @@
+# Makefile for the Linux CAN-bus driver.
+# Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+# This software is released under the GPL-License.
+# Version lincan-0.2  9 Aug 2003
+#
+# This Makefile version is adapted from uLan Communication driver
+# (C) Copyright 1999 by Pavel Pisa pisa@cmp.felk.cvut.cz
+#
+#*****************************************************************
+
+# Begin of OCERA framework header
+ifdef SUBDIRS
+SUBDIRS =
+endif
+ifneq ($(wildcard ../Standalone.mk),)
+# Standalone make outside of OCERA framework
+
+all : default
+
+.PHONY: kernel-pass utils-pass
+
+kernel-pass : default
+
+else
+# Build in structure of OCERA framework
+
+ifneq ($(wildcard ../../../../../ocera.mk),)
+ifndef TOPDIR
+include ../../../../../ocera.mk
+else
+LINUX_DIR = ../../../../../kernel/linux/
+endif
+else
+all: 
+       @echo -e "\nTo build LinCAN driver for OCERA framework, ocera.mk file have"
+       @echo -e "to be generated first. Go to ocera/ directory and do 'make', please."
+       @echo -e "If standalone build is required, mark lincan/ by 'touch ../Standalone.mk'.\n"
+endif
+ifdef LINUX_DIR
+KERNEL_LOCATION = $(LINUX_DIR)
+endif
+endif
+# End of OCERA framework header
+
+# Where to look for kernel
+# if not defined, sources of current running kernel are found
+#KERNEL_LOCATION=/usr/src/linux
+#KERNEL_LOCATION=/usr/src/linux-2.2.19
+#KERNEL_LOCATION=/usr/src/linux-2.2.22
+#KERNEL_LOCATION=/usr/src/linux-2.6.0
+#KERNEL_LOCATION=/home/cvs/ocera/ocera-build/kernel/linux
+
+
+# Enable debugging messages
+#DEBUG = y
+
+# You can comment out the hardware you don't need. This will result in a smaller
+# driver. By default, all hardware is supported in the driver. See the README 
+# file for a description of the supported hardware.
+#   pccan      Not to be confused with PCCCAN!!!
+#   pcccan     Not to be confused with PCCAN!!!
+
+SUPPORTED_CARDS = pip pccan smartcan nsi cc_can104 \
+                 pc_i03 pcm3680 aim104 m437 pcccan ssv \
+                 bfadcan pikronisa kv_pcican msmcan virtual template \
+                 unican unican_cl2 ems_cpcpci adlink7841 oscar
+#                hms30c7202_can c_can c_can_irq tscan1
+#                pcan_dongle
+
+#SUPPORTED_CARDS = pcm3680 bfadcan pikronisa template
+
+#SUPPORTED_CARDS = virtual
+
+########## Don't change anything under this line ################
+
+# currently running kernel
+CURRENT=$(shell uname -r)
+KERNEL_NEW=$(shell if [ -d /lib/modules/$(CURRENT)/build ] ; \
+               then echo yes ; else echo no ; fi )
+
+#KERNEL_LOCATION=/usr/src/kernel/$(CURRENT)
+#KERNEL_LOCATION=/lib/modules/$(CURRENT)/build
+
+ifndef KERNEL_LOCATION
+ifeq ($(KERNEL_NEW),yes)
+KERNEL_LOCATION=/lib/modules/$(CURRENT)/build
+MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/kernel/drivers/char
+else
+KERNEL_LOCATION=/usr/src/linux
+MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/misc
+endif
+endif
+
+TOPDIR = $(KERNEL_LOCATION)
+CONFIG_SHELL = TOPDIR=$(TOPDIR)
+
+KERNEL_VERSION := $(shell awk -F\" '/REL/ {print $$2}' \
+       $(KERNEL_LOCATION)/include/linux/version.h | awk -F\- '{print $$1}')
+
+PROC_FS := $(shell awk -F\  '/PROC_FS/ {print $$3}' \
+       $(KERNEL_LOCATION)/include/linux/autoconf.h)
+
+DEVFS_FS := $(shell awk -F\  '/DEVFS_FS/ {print $$3}' \
+       $(KERNEL_LOCATION)/include/linux/autoconf.h)
+
+KERNEL_MODULE_V26 := $(shell echo $(KERNEL_VERSION) \
+       | sed -n 's/^.*2\.[5-9]\..*$$/yes/p')
+
+ifdef DEBUG
+       EXTRA_CFLAGS += -DCAN_DEBUG
+       EXTRA_CFLAGS += -ggdb
+endif
+
+ifndef MODVERSIONS
+#      EXTRA_CFLAGS += -DNOVER
+#else
+#      EXTRA_CFLAGS += -DMODVERSIONS
+endif
+
+ifdef DEVFS_FS
+       EXTRA_CFLAGS += -DWITH_DEVFS_FS
+endif
+
+ifdef PROC_FS
+       O_OBJS += proc.o
+endif
+
+ifdef SUBDIRS
+EXTRA_CFLAGS += -I $(SUBDIRS)
+else
+EXTRA_CFLAGS += -I .
+endif
+
+# Target object file if any
+# this must be undefined for 2.5.xx kernels
+ifndef KERNEL_MODULE_V26
+O_TARGET     = can.o
+endif
+# Regular object files
+O_OBJS      += $(SUPPORTED_CARDS:%=%.o)
+O_OBJS       += can_queue.o can_quekern.o devcommon.o main.o modparms.o \
+               setup.o finish.o irq.o sysdep_lnx.o boardlist.o \
+               sja1000p.o sja1000.o i82527.o  \
+               open.o proc.o close.o write.o read.o \
+               ioctl.o ioctl_query.o ioctl_remote.o select.o fasync.o
+# Objects with exported symbols (-DEXPORT_SYMTAB)
+OX_OBJS      = 
+# Module objects 
+M_OBJS       = $(O_TARGET)
+# Module only objects with exported symbols (-DEXPORT_SYMTAB)
+MX_OBJS      = 
+# Kernel only objects 
+L_OBJS       = 
+# Kernel only objects with exported symbols (-DEXPORT_SYMTAB)
+LX_OBJS      = 
+# Additional CFLAGS
+EXTRA_CFLAGS +=
+
+# Linux 2.4.2 and newer build system needs next
+can-objs = $(O_OBJS)
+obj-y = $(O_OBJS)
+obj-m = can.o
+
+ifndef KERNEL_MODULE_V26
+FINAL_MODULE_OBJS=$(obj-m)
+else
+FINAL_MODULE_OBJS=$(obj-m:%.o=%.ko)
+endif
+
+########## Source/target independent build of module #############
+
+default : make_this_module
+       cp $(FINAL_MODULE_OBJS) ../$(FINAL_MODULE_OBJS)
+
+dep: make_this_module_dep
+
+install : install_this_module
+
+lincan_config.h: Makefile
+       echo >lincan_config.h
+       $(foreach card, $(SUPPORTED_CARDS), \
+         echo \#define CONFIG_OC_LINCAN_CARD_$(card) 1 >>lincan_config.h ;)
+
+make_this_module: lincan_config.h
+       echo Linux kernel version $(KERNEL_VERSION)
+       echo Linux kernel sources $(KERNEL_LOCATION)
+       echo Module target $(obj-m)
+       echo Module objects $(can-objs)
+       DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR modules)
+
+make_this_module_dep:
+       DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR dep)
+
+install_this_module: make_this_module
+       su -c "mkdir -v -p $(MODULE_CHAR_LOC) && cp -v $(FINAL_MODULE_OBJS) $(MODULE_CHAR_LOC)"
+
+clean:
+       rm -f $(M_OBJS) $(MX_OBJS) $(O_OBJS) $(OX_OBJS) $(obj-m) \
+             .*.o.flags .*.o.cmd .*.ko.cmd .depend lincan_config.h *~ \
+             $(obj-m:%.o=%.mod.o) $(obj-m:%.o=%.mod.c) \
+             $(FINAL_MODULE_OBJS) ../$(FINAL_MODULE_OBJS)
+
+distclean: clean
+
+
+ifndef KERNEL_MODULE_V26
+include $(KERNEL_LOCATION)/Rules.make
+endif
+
diff --git a/lincan-0.3.3/src/adlink7841.c b/lincan-0.3.3/src/adlink7841.c
new file mode 100644 (file)
index 0000000..59107d4
--- /dev/null
@@ -0,0 +1,237 @@
+/* adlink7841.c - support for ADLINK 7841 cards
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#ifdef CAN_ENABLE_PCI_SUPPORT
+
+#define ADLINK7841_PCI_VENDOR_ID       0x144A  /* ADLINK vednor id */
+#define ADLINK7841_PCI_PRODUCT_ID      0x7841  /* PCI 7841 device ID */
+
+/* PCI to local bus bridge PLX9050 */
+
+#define PLX9050_INTCSR 0x4c    /* interrupt control register */
+
+#define ADLINK7841_BYTES_PER_CIRCUIT 0x80
+
+// Standard value: Pushpull  (OCTP1|OCTN1|OCPOL1|OCTP0|OCTN0|OCM1)
+#define ADLINK7841_OCR_DEFAULT_STD 0xFA
+
+/*
+
+You need to know the following: 
+" RX1 is connected to ground. 
+" TX1 is not connected. 
+" CLKO is not connected. 
+" Setting the OCR register to 0xFA is a good idea. 
+  This means  normal output mode , push-pull and the correct polarity. 
+" In the CDR register, you should set CBP to 1. 
+  You will probably also want to set the clock divider value to 0 (meaning divide-by-2),
+  the Pelican bit, and the clock-off bit (you have no need for CLKOUT anyway.)
+
+*/
+
+
+
+void adlink7841_disconnect_irq(struct candevice_t *candev)
+{
+}
+
+void adlink7841_connect_irq(struct candevice_t *candev)
+{
+}
+
+
+int adlink7841_request_io(struct candevice_t *candev)
+{
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       if(pci_request_region(candev->sysdevptr.pcidev, 1, "adlink7841_plx9050") != 0){
+               CANMSG("Request of adlink7841_plx9050 range failed\n");
+               return -ENODEV;
+       }else if(pci_request_region(candev->sysdevptr.pcidev, 2, "adlink7841_io") != 0){
+               CANMSG("Request of adlink7841_io range failed\n");
+               goto error_io;
+       }
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       if(pci_request_regions(candev->sysdevptr.pcidev, "adlink7841") != 0){
+               CANMSG("Request of adlink7841_plx9050 regions failed\n");
+               return -ENODEV;
+       }
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       adlink7841_disconnect_irq(candev);
+
+       return 0;
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+    error_io:
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       
+       return -ENODEV;
+}
+
+int adlink7841_release_io(struct candevice_t *candev)
+{
+       adlink7841_disconnect_irq(candev);
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(candev->sysdevptr.pcidev, 2);
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(candev->sysdevptr.pcidev);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       return 0;
+}
+
+
+void adlink7841_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address); 
+}
+
+unsigned adlink7841_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+int adlink7841_reset(struct candevice_t *candev)
+{
+       int i=0,chip_nr;
+       struct canchip_t *chip;
+       unsigned cdr;
+
+       DEBUGMSG("Resetting adlink7841 hardware ...\n");
+
+       adlink7841_disconnect_irq(candev);
+
+       for(chip_nr=0;chip_nr<candev->nr_all_chips;chip_nr++){
+               if(!candev->chip[chip_nr]) continue;
+               chip=candev->chip[chip_nr];
+
+               adlink7841_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+               udelay(1000);
+
+               cdr=adlink7841_read_register(chip->chip_base_addr+SJACDR);
+               adlink7841_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               adlink7841_write_register(0, chip->chip_base_addr+SJAIER);
+
+               i=20;
+               adlink7841_write_register(0, chip->chip_base_addr+SJAMOD);
+               while (adlink7841_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+                       if(!i--) return -ENODEV;
+                       udelay(1000);
+                       adlink7841_write_register(0, chip->chip_base_addr+SJAMOD);
+               }
+
+               cdr=adlink7841_read_register(chip->chip_base_addr+SJACDR);
+               adlink7841_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               adlink7841_write_register(0, chip->chip_base_addr+SJAIER);
+               
+               adlink7841_read_register(chip->chip_base_addr+SJAIR);
+       }
+       
+
+       adlink7841_connect_irq(candev);
+
+       return 0;
+}      
+
+int adlink7841_init_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = NULL;
+       int i;
+
+       do {
+               pcidev = pci_find_device(ADLINK7841_PCI_VENDOR_ID, ADLINK7841_PCI_PRODUCT_ID, pcidev);
+               if(pcidev == NULL) return -ENODEV;
+       } while(can_check_dev_taken(pcidev));
+       
+       if (pci_enable_device (pcidev)){
+               printk(KERN_CRIT "Setup of ADLINK7841 failed\n");
+               return -EIO;
+       }
+       candev->sysdevptr.pcidev=pcidev;
+       
+       for(i=1;i<3;i++){
+               if(!(pci_resource_flags(pcidev,i)&IORESOURCE_IO)){
+                       printk(KERN_CRIT "ADLINK7841 region %d is not IO\n",i);
+                       return -EIO;
+               }
+       }
+       candev->dev_base_addr=pci_resource_start(pcidev,1); /* PLX 9050 BASE*/
+       candev->io_addr=pci_resource_start(pcidev,2); /*IO window for SJA1000 chips*/
+       candev->res_addr=pci_resource_start(pcidev,1); /*reserved*/
+       
+       /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/
+
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=2;
+       candev->nr_all_chips=2;
+
+       return 0;
+}
+
+int adlink7841_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+
+       if(candev->sysdevptr.pcidev==NULL)
+               return -ENODEV;
+       
+       candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
+
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=
+                       candev->io_addr+chipnr*ADLINK7841_BYTES_PER_CIRCUIT;
+       candev->chip[chipnr]->flags = 0;
+       candev->chip[chipnr]->int_cpu_reg = 0;
+       candev->chip[chipnr]->int_clk_reg = 0;
+       candev->chip[chipnr]->int_bus_reg = 0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = ADLINK7841_OCR_DEFAULT_STD;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->flags |= CHIP_IRQ_PCI;
+
+       return 0;
+}      
+
+int adlink7841_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+int adlink7841_program_irq(struct candevice_t *candev)
+{
+
+       return 0;
+}
+
+int adlink7841_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = adlink7841_request_io;
+       hwspecops->release_io = adlink7841_release_io;
+       hwspecops->reset = adlink7841_reset;
+       hwspecops->init_hw_data = adlink7841_init_hw_data;
+       hwspecops->init_chip_data = adlink7841_init_chip_data;
+       hwspecops->init_obj_data = adlink7841_init_obj_data;
+       hwspecops->write_register = adlink7841_write_register;
+       hwspecops->read_register = adlink7841_read_register;
+       hwspecops->program_irq = adlink7841_program_irq;
+       return 0;
+}
+
+
+#endif /*CAN_ENABLE_PCI_SUPPORT*/
diff --git a/lincan-0.3.3/src/aim104.c b/lincan-0.3.3/src/aim104.c
new file mode 100644 (file)
index 0000000..485186b
--- /dev/null
@@ -0,0 +1,259 @@
+/* aim104.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/aim104.h"
+#include "../include/sja1000.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x20
+
+/**
+ * template_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function template_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int aim104_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * template_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function template_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int aim104_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * template_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int aim104_reset(struct candevice_t *candev)
+{
+       int i=0;
+
+       DEBUGMSG("Resetting aim104 hardware ...\n");
+
+       aim104_write_register(0x00, candev->io_addr + SJACR);
+                                                                       
+       /* Check hardware reset status chip 0 */
+       i=0;
+       while ( (aim104_read_register(candev->io_addr + SJACR) 
+                                                       & sjaCR_RR) && (i<=15) ) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip reset status ok.\n");
+
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * template_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int aim104_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=0;
+        candev->nr_sja1000_chips=1;
+       candev->nr_all_chips=1;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * template_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function template_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int aim104_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       sja1000_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->flags = 0;
+       candev->chip[chipnr]->sja_cdr_reg = 0x08;
+       candev->chip[chipnr]->sja_ocr_reg = 0xfa;
+
+       return 0;
+}
+
+/**
+ * template_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function template_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int aim104_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       chip->msgobj[objnr]->obj_flags=0;
+       
+       return 0;
+}
+
+/**
+ * template_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int aim104_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * template_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function template_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void aim104_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address);
+}
+
+/**
+ * template_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function template_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned aim104_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+/* !!! Don't change this function !!! */
+int aim104_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = aim104_request_io;
+       hwspecops->release_io = aim104_release_io;
+       hwspecops->reset = aim104_reset;
+       hwspecops->init_hw_data = aim104_init_hw_data;
+       hwspecops->init_chip_data = aim104_init_chip_data;
+       hwspecops->init_obj_data = aim104_init_obj_data;
+       hwspecops->write_register = aim104_write_register;
+       hwspecops->read_register = aim104_read_register;
+       hwspecops->program_irq = aim104_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/bfadcan.c b/lincan-0.3.3/src/bfadcan.c
new file mode 100644 (file)
index 0000000..f6d831b
--- /dev/null
@@ -0,0 +1,318 @@
+/* bfadcan.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+/* This file is intended as a bfadcan file for currently unsupported hardware.
+ * Once you've changed/added the functions specific to your hardware it is
+ * possible to load the driver with the hardware option hw=bfadcan.
+ */
+
+
+#define WINDOWED_ACCESS
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+long clock_freq;
+MODULE_PARM(clock_freq,"i");
+
+/* cli and sti are not allowed in 2.5.5x SMP kernels */
+#ifdef WINDOWED_ACCESS
+static CAN_DEFINE_SPINLOCK(bfadcan_win_lock);
+#endif
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#ifdef WINDOWED_ACCESS
+#define IO_RANGE 0x4
+#else
+#define IO_RANGE 0x100
+#endif
+
+unsigned bfadcan_read_register(unsigned long address);
+void bfadcan_write_register(unsigned data, unsigned long address);
+
+
+/**
+ * bfadcan_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function bfadcan_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/bfadcan.c
+ */
+int bfadcan_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * bfadcan_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function bfadcan_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/bfadcan.c
+ */
+int bfadcan_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * bfadcan_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function bfadcan_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/bfadcan.c
+ */
+int bfadcan_reset(struct candevice_t *candev)
+{
+
+       int i;
+       struct canchip_t *chip=candev->chip[0];
+       unsigned cdr;
+       
+       bfadcan_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+       udelay(1000);
+       
+       cdr=bfadcan_read_register(chip->chip_base_addr+SJACDR);
+       bfadcan_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       bfadcan_write_register(0, chip->chip_base_addr+SJAIER);
+
+       i=20;
+       bfadcan_write_register(0, chip->chip_base_addr+SJAMOD);
+       while (bfadcan_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+               if(!i--) return -ENODEV;
+               udelay(1000);
+               bfadcan_write_register(0, chip->chip_base_addr+SJAMOD);
+       }
+
+       cdr=bfadcan_read_register(chip->chip_base_addr+SJACDR);
+       bfadcan_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       bfadcan_write_register(0, chip->chip_base_addr+SJAIER);
+       
+       return 0;
+}
+
+#define RESET_ADDR 0x202
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * bfadcan_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function bfadcan_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/bfadcan.c
+ */
+int bfadcan_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags |= 0 /* CANDEV_PROGRAMMABLE_IRQ */ ;
+
+       return 0;
+}
+
+/**
+ * bfadcan_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function bfadcan_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/bfadcan.c
+ */
+int bfadcan_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       unsigned int id1, id2;
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = clock_freq;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+       id1 = inb(0xe284);
+       id2 = inb(0xe285);
+
+
+       CANMSG("can driver ver lincan-0.3, at %04lx, CPLD v%d.%d.%d.%d\n",
+                                       candev->chip[chipnr]->chip_base_addr,
+                                                       id1>>4, id1&0x0f, id2>>4, id2&0x0f);
+
+
+       return 0;
+}
+
+/**
+ * bfadcan_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function bfadcan_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/bfadcan.c
+ */
+int bfadcan_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/**
+ * bfadcan_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function bfadcan_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/bfadcan.c
+ */
+int bfadcan_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * bfadcan_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function bfadcan_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/bfadcan.c
+ */
+void bfadcan_write_register(unsigned data, unsigned long address)
+{
+#ifdef WINDOWED_ACCESS
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&bfadcan_win_lock,flags);
+       outb(address&0x00ff,0x200);
+       outb(data, 0x201);
+       can_spin_unlock_irqrestore(&bfadcan_win_lock,flags);
+#else
+       outb(data,address);
+#endif
+}
+
+/**
+ * bfadcan_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function bfadcan_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/bfadcan.c
+ */
+unsigned bfadcan_read_register(unsigned long address)
+{
+#ifdef WINDOWED_ACCESS
+       can_spin_irqflags_t flags;
+       int ret;
+       can_spin_lock_irqsave(&bfadcan_win_lock,flags);
+       outb(address&0x00ff,0x200);
+       ret = inb(0x201);
+       can_spin_unlock_irqrestore(&bfadcan_win_lock,flags);
+       return ret;
+#else
+       return inb(address);
+#endif
+}
+
+/* !!! Don't change this function !!! */
+int bfadcan_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = bfadcan_request_io;
+       hwspecops->release_io = bfadcan_release_io;
+       hwspecops->reset = bfadcan_reset;
+       hwspecops->init_hw_data = bfadcan_init_hw_data;
+       hwspecops->init_chip_data = bfadcan_init_chip_data;
+       hwspecops->init_obj_data = bfadcan_init_obj_data;
+       hwspecops->write_register = bfadcan_write_register;
+       hwspecops->read_register = bfadcan_read_register;
+       hwspecops->program_irq = bfadcan_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/boardlist.c b/lincan-0.3.3/src/boardlist.c
new file mode 100644 (file)
index 0000000..7c848d4
--- /dev/null
@@ -0,0 +1,164 @@
+/* boards_list.c
+ * Linux CAN-bus device driver.
+ * Written for new CAN driver version by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+extern int template_register(struct hwspecops_t *hwspecops);
+extern int virtual_register(struct hwspecops_t *hwspecops);
+extern int oscar_register(struct hwspecops_t *hwspecops);
+extern int pip_register(struct hwspecops_t *hwspecops);
+extern int m437_register(struct hwspecops_t *hwspecops);
+extern int smartcan_register(struct hwspecops_t *hwspecops);
+extern int pccanf_register(struct hwspecops_t *hwspecops);
+extern int pccand_register(struct hwspecops_t *hwspecops);
+extern int pccanq_register(struct hwspecops_t *hwspecops);
+extern int kv_pcican_register(struct hwspecops_t *hwspecops);
+extern int ems_cpcpci_register(struct hwspecops_t *hwspecops);
+extern int nsi_register(struct hwspecops_t *hwspecops);
+extern int cc104_register(struct hwspecops_t *hwspecops);
+extern int pci03_register(struct hwspecops_t *hwspecops);
+extern int pcm3680_register(struct hwspecops_t *hwspecops);
+extern int aim104_register(struct hwspecops_t *hwspecops);
+extern int pcccan_register(struct hwspecops_t *hwspecops);
+extern int ssv_register(struct hwspecops_t *hwspecops);
+extern int bfadcan_register(struct hwspecops_t *hwspecops);
+extern int pikronisa_register(struct hwspecops_t *hwspecops);
+extern int pimx1_register(struct hwspecops_t *hwspecops);
+extern int msmcan_register(struct hwspecops_t *hwspecops);
+extern int unican_register(struct hwspecops_t *hwspecops);
+extern int unican_pci_register(struct hwspecops_t *hwspecops);
+extern int unican_vme_register(struct hwspecops_t *hwspecops);
+extern int ipci165_register(struct hwspecops_t *hwspecops);
+extern int pcan_dongle_register(struct hwspecops_t *hwspecops);
+extern int eb8245_register(struct hwspecops_t *hwspecops);
+extern int adlink7841_register(struct hwspecops_t *hwspecops);
+extern int tscan1_register(struct hwspecops_t *hwspecops);
+extern int ts7kv_register(struct hwspecops_t *hwspecops);
+extern int ns_dev_register(struct hwspecops_t *hwspecops);
+extern int hms30c7202_register(struct hwspecops_t *hwspecops);
+extern int nsi_canpci_register(struct hwspecops_t *hwspecops);
+
+const struct boardtype_t can_boardtypes[]={
+    #ifdef CONFIG_OC_LINCAN_CARD_template
+       {"template", template_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_virtual
+       {"virtual", virtual_register, 0},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_oscar
+       {"oscar", oscar_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pip
+       {"pip5", pip_register, 1},
+       {"pip6", pip_register, 1},
+       {"pip7", pip_register, 1},
+       {"pip8", pip_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_smartcan
+       {"smartcan", smartcan_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_nsi
+       {"nsican", nsi_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_cc_can104
+       {"cc104", cc104_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_aim104
+       {"aim104", aim104_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pc_i03
+       {"pc-i03", pci03_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pcm3680
+       {"pcm3680", pcm3680_register, 2},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pccan
+       {"pccan-f", pccanf_register, 1},
+       {"pccan-s", pccanf_register, 1},
+       {"pccan-d", pccand_register, 2},
+       {"pccan-q", pccanq_register, 4},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_kv_pcican)&&defined(CAN_ENABLE_PCI_SUPPORT)
+       {"pcican-s", kv_pcican_register, 0},
+       {"pcican-d", kv_pcican_register, 0},
+       {"pcican-q", kv_pcican_register, 0},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_ems_cpcpci)&&defined(CAN_ENABLE_PCI_SUPPORT)
+       {"ems_cpcpci", ems_cpcpci_register, 0},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_m437
+       {"m437", m437_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pcccan
+       {"pcccan", pcccan_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_ssv
+       {"ssv", ssv_register, 2},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_bfadcan
+       {"bfadcan", bfadcan_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pikronisa
+       {"pikronisa", pikronisa_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_pimx1
+       {"pimx1", pimx1_register, 0},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_msmcan
+       {"msmcan", msmcan_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_unican
+       {"unican", unican_register, 1},
+    #endif
+    #ifdef CONFIG_OC_LINCAN_CARD_ipci165
+       {"ipci165", ipci165_register, 0},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_unican)&&defined(CAN_ENABLE_PCI_SUPPORT)
+       {"unican-pci", unican_pci_register, 0},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_unican)&&defined(CAN_ENABLE_VME_SUPPORT)
+       {"unican-vme", unican_vme_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_pcan_dongle)
+       {"pcan_dongle", pcan_dongle_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_eb8245)
+       {"eb8245", eb8245_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_adlink7841)
+       {"adlink7841", adlink7841_register, 0},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_tscan1)
+       {"tscan1", tscan1_register, 1},
+       {"ts7kv",  ts7kv_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_ns_dev_can)
+       {"ns_dev", ns_dev_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_hms30c7202_can)
+       {"hms30c7202", hms30c7202_register, 1},
+    #endif
+    #if defined(CONFIG_OC_LINCAN_CARD_nsi_canpci)&&defined(CAN_ENABLE_PCI_SUPPORT)
+       {"nsicanpci", nsi_canpci_register, 1},
+    #endif
+       {NULL}
+};
+
+const struct boardtype_t* boardtype_find(const char *str)
+{
+       const struct boardtype_t *brp;
+
+       for(brp=can_boardtypes;brp->boardtype;brp++) {
+               if(!strcmp(str,brp->boardtype))
+                       return brp;
+       }
+
+       return NULL;
+}
diff --git a/lincan-0.3.3/src/c_can.c b/lincan-0.3.3/src/c_can.c
new file mode 100644 (file)
index 0000000..9929467
--- /dev/null
@@ -0,0 +1,995 @@
+/* c_can.c - Hynix HMS30c7202 ARM generic C_CAN module handling
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#define __NO_VERSION__
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/c_can.h"
+
+extern int stdmask;
+extern int extmask;
+
+CAN_DEFINE_SPINLOCK(c_can_spwlock);    // Spin lock for write operations
+CAN_DEFINE_SPINLOCK(c_can_sprlock);    // Spin lock for read operations
+CAN_DEFINE_SPINLOCK(c_can_if1lock);    // spin lock for the if1 register
+CAN_DEFINE_SPINLOCK(c_can_if2lock);    // spin lcok for the if2 register
+
+/**
+ * c_can_enable_configuration - enable chip configuration mode
+ * @pchip: pointer to chip state structure
+ */
+int c_can_enable_configuration(struct canchip_t *pchip)
+{
+       int i = 0;
+       u16 flags;
+       DEBUGMSG("(c%d)calling c_can_enable_configuration(...)\n",
+                pchip->chip_idx);
+/*
+   DEBUGMSG("Trying disable_irq(...) : ");
+   //disable IRQ
+       disable_irq(chip->chip_irq);
+*/
+       //read Control Register
+       flags = c_can_read_reg_w(pchip, CCCR);
+       //set Init-Bit in the Control Register (10 tries)
+       while ((!(flags & CR_INIT)) && (i <= 10)) {
+               c_can_write_reg_w(pchip, flags | CR_INIT, CCCR);
+               udelay(1000);
+               i++;
+               flags = c_can_read_reg_w(pchip, CCCR);
+       }
+       if (i >= 10) {
+               CANMSG("Reset error\n");
+               //enable_irq(chip->chip_irq);
+               return -ENODEV;
+       }
+
+       DEBUGMSG("-> ok\n");
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_disable_configuration(struct canchip_t *pchip)
+{
+       int i = 0;
+       u16 flags;
+
+       DEBUGMSG("(c%d)calling c_can_disable_configuration(...)\n",
+                pchip->chip_idx);
+       //read Control Register
+       flags = c_can_read_reg_w(pchip, CCCR);
+
+       //reset Init-Bit in the Control Register (10 tries)
+       while ((flags & CR_INIT) && (i <= 10)) {
+               c_can_write_reg_w(pchip, flags & ~CR_INIT, CCCR);
+               udelay(1000);   //100 microseconds
+               i++;
+               flags = c_can_read_reg_w(pchip, CCCR);
+       }
+       if (i >= 10) {
+               CANMSG("Error leaving reset status\n");
+               return -ENODEV;
+       }
+       //enable IRQ
+       //enable_irq(chip->chip_irq);
+       DEBUGMSG("-> ok\n");
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_chip_config(struct canchip_t *pchip)
+{
+
+       DEBUGMSG("(c%d)calling c_can_chip_config(...)\n", pchip->chip_idx);
+       // Validate pointer
+       if (NULL == pchip)
+               return -1;
+
+       if (pchip->baudrate == 0)
+               pchip->baudrate = 1000;
+
+       if (c_can_baud_rate
+           (pchip, pchip->baudrate * 1000, pchip->clock, 0, 75, 0)) {
+               CANMSG("Error configuring baud rate\n");
+               return -ENODEV;
+       }
+       /*if (extended){
+          if (c_can_extended_mask(pchip,0x0000000,extmask)) {
+          CANMSG("Error configuring extended mask\n");
+          return -ENODEV;
+          }
+          }else{
+          if (c_can_standard_mask(pchip,0x0000,stdmask)) {
+          CANMSG("Error configuring standard mask\n");
+          return -ENODEV;
+          }
+          } */
+       if (c_can_clear_objects(pchip)) {
+               CANMSG("Error clearing message objects\n");
+               return -ENODEV;
+       }
+       if (c_can_config_irqs(pchip, CR_MIE | CR_SIE | CR_EIE)) {
+               CANMSG("Error configuring interrupts\n");
+               return -ENODEV;
+       }
+
+       DEBUGMSG("-> Configured successfully\n");
+
+#ifdef REGDUMP
+       c_can_registerdump(pchip);
+#endif
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ * Checks if the Busy-Bit in the IF1-Command-Request Register is set
+ */
+int c_can_if1_busycheck(struct canchip_t *pchip)
+{
+
+       int i = 0;
+       unsigned short comreg = 0;
+
+       comreg = c_can_read_reg_w(pchip, CCIF1CR);
+       while ((comreg & IFXCR_BUSY) && (i <= 10)) {
+               udelay(100);    //100 microseconds
+               i++;
+               comreg = c_can_read_reg_w(pchip, CCIF1CR);
+       }
+       if (i >= 10) {
+               CANMSG("Error Busy-Bit stays set\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ * Checks if the Busy-Bit in the IF2-Command-Request Register is set
+ */
+int c_can_if2_busycheck(struct canchip_t *pchip)
+{
+
+       int i = 0;
+       unsigned short comreg = 0;
+
+       comreg = c_can_read_reg_w(pchip, CCIF2CR);
+       while ((comreg & IFXCR_BUSY) && (i <= 10)) {
+               udelay(100);    //100 microseconds
+               i++;
+               comreg = c_can_read_reg_w(pchip, CCIF2CR);
+       }
+       if (i >= 10) {
+               CANMSG("Error Busy-Bit stays set\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ * Though the C-CAN Chip can handle one mask for each Message Object, this Method defines
+ * one mask for all MOs. That means every MO gets the same mask.
+ */
+
+/* Set communication parameters.
+ * param rate baud rate in Hz
+ * param clock frequency of C-CAN clock in Hz
+ * param sjw synchronization jump width (0-3) prescaled clock cycles
+ * param sampl_pt sample point in % (0-100) sets (TSEG1+2)/(TSEG1+TSEG2+3) ratio
+ * param flags fields BTR1_SAM, OCMODE, OCPOL, OCTP, OCTN, CLK_OFF, CBP
+ */
+int c_can_baud_rate(struct canchip_t *pchip, int rate, int clock,
+                   int sjw, int sampl_pt, int flags)
+{
+       int best_error = 1000000000, error;
+       int best_tseg = 0, best_brp = 0, best_rate = 0, brp = 0;
+       int tseg = 0, tseg1 = 0, tseg2 = 0;
+
+       unsigned short tempCR = 0;
+
+       DEBUGMSG("(c%d)calling c_can_baud_rate(...)\n", pchip->chip_idx);
+
+       if (c_can_enable_configuration(pchip))
+               return -ENODEV;
+
+       /* tseg even = round down, odd = round up */
+       for (tseg = (0 + 0 + 2) * 2;
+            tseg <= (MAX_TSEG2 + MAX_TSEG1 + 2) * 2 + 1; tseg++) {
+               brp = clock / ((1 + tseg / 2) * rate) + tseg % 2;
+               if (brp == 0 || brp > 64)
+                       continue;
+               error = rate - clock / (brp * (1 + tseg / 2));
+               if (error < 0)
+                       error = -error;
+               if (error <= best_error) {
+                       best_error = error;
+                       best_tseg = tseg / 2;
+                       best_brp = brp - 1;
+                       best_rate = clock / (brp * (1 + tseg / 2));
+               }
+       }
+       if (best_error && (rate / best_error < 10)) {
+               CANMSG("baud rate %d is not possible with %d Hz clock\n",
+                      rate, clock);
+               CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
+                      best_rate, best_brp, best_tseg, tseg1, tseg2);
+               return -EINVAL;
+       }
+       tseg2 = best_tseg - (sampl_pt * (best_tseg + 1)) / 100;
+       if (tseg2 < 0)
+               tseg2 = 0;
+       if (tseg2 > MAX_TSEG2)
+               tseg2 = MAX_TSEG2;
+       tseg1 = best_tseg - tseg2 - 2;
+       if (tseg1 > MAX_TSEG1) {
+               tseg1 = MAX_TSEG1;
+               tseg2 = best_tseg - tseg1 - 2;
+       }
+
+       DEBUGMSG("-> Setting %d bps.\n", best_rate);
+       DEBUGMSG("->brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
+                best_brp, best_tseg, tseg1, tseg2,
+                (100 * (best_tseg - tseg2) / (best_tseg + 1)));
+
+       //read Control Register
+       tempCR = c_can_read_reg_w(pchip, CCCR);
+       //Configuration Change Enable
+       c_can_write_reg_w(pchip, tempCR | CR_CCE, CCCR);
+       c_can_write_reg_w(pchip,
+                         ((unsigned short)tseg2) << 12 | ((unsigned short)
+                                                          tseg1) << 8 |
+                         (unsigned short)sjw << 6 | (unsigned short)best_brp,
+                         CCBT);
+
+       if (c_can_disable_configuration(pchip))
+               return -ENODEV;
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_mask(struct msgobj_t *pmsgobj, u32 mask, u16 usedirbit)
+{
+       unsigned short tempreg = 0;
+       unsigned short readMaskCM;
+       unsigned short writeMaskCM;
+
+       DEBUGMSG("(c%dm%d)calling c_can_mask(...)\n",
+                pmsgobj->hostchip->chip_idx, pmsgobj->object);
+
+       readMaskCM = IFXCM_CNTRL | IFXCM_ARB | IFXCM_MASK;
+       writeMaskCM = IFXCM_CNTRL | IFXCM_ARB | IFXCM_MASK | IFXCM_WRRD;
+
+       spin_lock(&c_can_if1lock);
+
+       //load Message Object in IF1
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       //setting Message Valid Bit to zero
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, tempreg & ~(IFXARB2_MVAL),
+                         CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       //setting UMask, MsgVal and Mask Register
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+
+       //writing acceptance mask for extended or standart mode
+       if (can_msgobj_test_fl(pmsgobj, RX_MODE_EXT)) {
+               if (usedirbit)
+                       c_can_write_reg_w(pmsgobj->hostchip,
+                                         (mask >> 16 & 0x1FFF) | IFXMSK2_MXTD |
+                                         IFXMSK2_MDIR, CCIF1M2);
+               else
+                       c_can_write_reg_w(pmsgobj->hostchip,
+                                         (mask >> 16 & 0x1FFF) | IFXMSK2_MXTD,
+                                         CCIF1M2);
+               c_can_write_reg_w(pmsgobj->hostchip, (mask & 0xFFFF), CCIF1M1);
+       } else {
+               if (usedirbit)
+                       c_can_write_reg_w(pmsgobj->hostchip,
+                                         ((mask << 2) & 0x1FFC) | IFXMSK2_MDIR,
+                                         CCIF1M2);
+               else
+                       c_can_write_reg_w(pmsgobj->hostchip,
+                                         ((mask << 2) & 0x1FFC), CCIF1M2);
+               c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF1M1);
+       }
+       //seting Message Valid Bit to one
+       tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, tempreg | IFXARB2_MVAL, CCIF1A2);
+       //write to chip
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       spin_unlock(&c_can_if1lock);
+
+       DEBUGMSG("-> Setting acceptance mask to 0x%lx\n", (unsigned long)mask);
+
+#ifdef REGDUMP
+       c_can_registerdump(pmsgobj->hostchip);
+#endif
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_use_mask(struct msgobj_t *pmsgobj, u16 useflag)
+{
+       unsigned short tempreg = 0;
+       unsigned short readMaskCM;
+       unsigned short writeMaskCM;
+
+#ifdef DEBUG
+       char *boolstring = "false";
+       if (useflag)
+               boolstring = "true";
+#endif
+       DEBUGMSG("(c%dm%d)calling c_can_use_mask(...)\n",
+                pmsgobj->hostchip->chip_idx, pmsgobj->object);
+
+       readMaskCM = IFXCM_CNTRL | IFXCM_ARB;
+       writeMaskCM = IFXCM_CNTRL | IFXCM_ARB | IFXCM_WRRD;;
+
+       spin_lock(&c_can_if1lock);
+
+       //load Message Object in IF1
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       //setting Message Valid Bit to zero
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, tempreg & ~IFXARB2_MVAL, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       //setting UMask bit
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       if (useflag) {
+               tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1DMC);
+               c_can_write_reg_w(pmsgobj->hostchip, tempreg | IFXMC_UMASK,
+                                 CCIF1DMC);
+       } else {
+               tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1DMC);
+               c_can_write_reg_w(pmsgobj->hostchip, tempreg & ~IFXMC_UMASK,
+                                 CCIF1DMC);
+       }
+       //seting Message Valid Bit to one
+       tempreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, tempreg | IFXARB2_MVAL, CCIF1A2);
+       //write to chip
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       spin_unlock(&c_can_if1lock);
+
+#ifdef DEBUG
+       DEBUGMSG("-> Setting umask bit to %s\n", boolstring);
+#endif
+#ifdef REGDUMP
+       c_can_registerdump(pmsgobj->hostchip);
+#endif
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_clear_objects(struct canchip_t *pchip)
+{
+       unsigned short i = 0;
+       unsigned short tempreg = 0;
+
+       unsigned short maskCM = IFXCM_ARB;
+
+       DEBUGMSG("(c%d)calling c_can_clear_objects(...)\n", pchip->chip_idx);
+
+       spin_lock(&c_can_if1lock);
+       spin_lock(&c_can_if2lock);
+
+       for (i = 0; i < 0x10; i++) {
+
+               //loading Message Objects in IF1 and IF2
+               if (c_can_if1_busycheck(pchip))
+                       return -ENODEV;
+               c_can_write_reg_w(pchip, maskCM, CCIF1CM);
+               c_can_write_reg_w(pchip, i, CCIF1CR);
+               if (c_can_if2_busycheck(pchip))
+                       return -ENODEV;
+               c_can_write_reg_w(pchip, maskCM, CCIF2CM);
+               c_can_write_reg_w(pchip, i + 0x10, CCIF2CR);
+
+               //setting Message Valid Bit to zero
+               if (c_can_if1_busycheck(pchip))
+                       return -ENODEV;
+               tempreg = c_can_read_reg_w(pchip, CCIF1A2);
+               c_can_write_reg_w(pchip, tempreg & ~IFXARB2_MVAL, CCIF1A2);
+               c_can_write_reg_w(pchip, i, CCIF1CR);
+               if (c_can_if2_busycheck(pchip))
+                       return -ENODEV;
+               tempreg = c_can_read_reg_w(pchip, CCIF2A2);
+               c_can_write_reg_w(pchip, tempreg & ~IFXARB2_MVAL, CCIF2A2);
+               c_can_write_reg_w(pchip, i + 0x10, CCIF2CR);
+       }
+
+       for (i = 0; i < pchip->max_objects; i++) {
+               if (can_msgobj_test_fl(pchip->msgobj[i], OPENED)) {
+                       // In- and output buffer re-initialization
+                       canqueue_ends_flush_inlist(pchip->msgobj[i]->qends);
+                       canqueue_ends_flush_outlist(pchip->msgobj[i]->qends);
+
+               }
+       }
+
+       spin_unlock(&c_can_if1lock);
+       spin_unlock(&c_can_if2lock);
+
+       DEBUGMSG("-> Message Objects reset\n");
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_config_irqs(struct canchip_t *pchip, u16 irqs)
+{
+       u16 tempreg;
+
+       DEBUGMSG("(c%d)calling c_can_config_irqs(...)\n", pchip->chip_idx);
+
+       tempreg = c_can_read_reg_w(pchip, CCCR);
+       DEBUGMSG("-> CAN Control Register: 0x%4lx\n", (long)tempreg);
+       c_can_write_reg_w(pchip, tempreg | (irqs & 0xe), CCCR);
+       DEBUGMSG("-> Configured hardware interrupt delivery\n");
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_pre_read_config(struct canchip_t *pchip, struct msgobj_t *pmsgobj)
+{
+       unsigned short readMaskCM = IFXCM_CNTRL | IFXCM_ARB;
+       unsigned short writeMaskCM = IFXCM_CNTRL | IFXCM_ARB | IFXCM_WRRD;
+       unsigned short mcreg = 0;
+       u32 id = pmsgobj->rx_preconfig_id;
+
+       DEBUGMSG("(c%dm%d)calling c_can_pre_read_config(...)\n",
+                pmsgobj->hostchip->chip_idx, pmsgobj->object);
+
+       spin_lock(&c_can_if1lock);
+
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               goto error_enodev;
+
+       //loading Message Object in IF1
+       c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               goto error_enodev;
+
+       //setting Message Valid Bit to zero
+       c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF1A2);
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       /* Only access when the C_CAN controller is idle */
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               goto error_enodev;
+
+       //Configuring Message-Object
+       mcreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1DMC);
+       c_can_write_reg_w(pmsgobj->hostchip,
+                         ((mcreg & IFXMC_UMASK) | IFXMC_EOB | IFXMC_RXIE),
+                         CCIF1DMC);
+
+       //writing arbitration mask for extended or standart mode
+       if (can_msgobj_test_fl(pmsgobj, RX_MODE_EXT)) {
+               c_can_write_reg_w(pmsgobj->hostchip,
+                                 IFXARB2_XTD | IFXARB2_MVAL | (id >> 16 &
+                                                               0x1FFF),
+                                 CCIF1A2);
+               c_can_write_reg_w(pmsgobj->hostchip, id & 0xFFFF, CCIF1A1);
+       } else {
+               c_can_write_reg_w(pmsgobj->hostchip,
+                                 IFXARB2_MVAL | (id << 2 & 0x1FFC), CCIF1A2);
+               //c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF1A1);
+       }
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       spin_unlock(&c_can_if1lock);
+
+       DEBUGMSG("-> Receiving through message object %d with id=%d\n",
+                pmsgobj->object, id);
+#ifdef REGDUMP
+       c_can_registerdump(pmsgobj->hostchip);
+#endif
+
+       return 0;
+
+      error_enodev:
+       CANMSG("Timeout in c_can_if1_busycheck\n");
+       spin_unlock(&c_can_if1lock);
+       return -ENODEV;
+
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+                          struct canmsg_t *msg)
+{
+       return 0;
+}
+
+ ///////////////////////////////////////////////////////////////////////
+/*
+ *Prepare the Chip to send specified Message over specified Messageobject
+ *In this version the method also sends the message.
+ */
+
+int c_can_send_msg(struct canchip_t *pchip, struct msgobj_t *pmsgobj,
+                  struct canmsg_t *pmsg)
+{
+       unsigned short readMaskCM =
+           IFXCM_CNTRL | IFXCM_ARB | IFXCM_DA | IFXCM_DB;
+       unsigned short writeMaskCM =
+           IFXCM_CNTRL | IFXCM_ARB | IFXCM_DA | IFXCM_DB | IFXCM_WRRD;
+       unsigned short writeSendMskCM =
+           IFXCM_CNTRL | IFXCM_ARB | IFXCM_DA | IFXCM_DB | IFXCM_WRRD |
+           IFXCM_TRND;
+       unsigned short mcreg = 0;
+       //unsigned short arbreg = 0;
+       unsigned short dataA1 = 0;
+       unsigned short dataA2 = 0;
+       unsigned short dataB1 = 0;
+       unsigned short dataB2 = 0;
+
+       DEBUGMSG("(c%dm%d)calling c_can_send_msg(...)\n",
+                pmsgobj->hostchip->chip_idx, pmsgobj->object);
+
+       spin_lock(&c_can_if2lock);
+
+       can_msgobj_clear_fl(pmsgobj, RX_MODE);
+
+       //loading Message Object in IF1
+       if (c_can_if2_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF2CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF2CR);
+       //setting Message Valid Bit to zero
+       if (c_can_if2_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF2A2);
+       c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF2CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF2CR);
+       //Configuring MO
+       if (c_can_if2_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       mcreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF2CM);
+       //remote enable?
+       //define Command Mask
+       c_can_write_reg_w(pmsgobj->hostchip,
+                         (mcreg & IFXMC_UMASK) | IFXMC_EOB | IFXMC_TXIE |
+                         IFXMC_RMTEN | IFXMC_NEWDAT | IFXMC_TXRQST | (pmsg->
+                                                                      length &
+                                                                      0xF),
+                         CCIF2DMC);
+       //set Arbitration Bits
+       if (can_msgobj_test_fl(pmsgobj, RX_MODE_EXT)) {
+               c_can_write_reg_w(pmsgobj->hostchip, (u16) (pmsg->id), CCIF2A1);
+               c_can_write_reg_w(pmsgobj->hostchip,
+                                 IFXARB2_XTD | IFXARB2_MVAL | IFXARB2_DIR |
+                                 ((u16) (pmsg->id >> 16) & 0x1FFF), CCIF2A2);
+       } else {
+               c_can_write_reg_w(pmsgobj->hostchip,
+                                 (IFXARB2_MVAL | IFXARB2_DIR |
+                                  ((u16) (pmsg->id << 2) & 0x1FFC)), CCIF2A2);
+               c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF1A1);
+       }
+       //write Data
+       if (pmsg->length > 0) {
+               dataA1 = pmsg->data[0] | (u16) pmsg->data[1] << 8;
+               dataA2 = pmsg->data[2] | (u16) pmsg->data[3] << 8;
+               dataB1 = pmsg->data[4] | (u16) pmsg->data[5] << 8;
+               dataB2 = pmsg->data[6] | (u16) pmsg->data[7] << 8;
+
+               c_can_write_reg_w(pmsgobj->hostchip, dataA1, CCIF2DA1);
+               c_can_write_reg_w(pmsgobj->hostchip, dataA2, CCIF2DA2);
+               c_can_write_reg_w(pmsgobj->hostchip, dataB1, CCIF2DB1);
+               c_can_write_reg_w(pmsgobj->hostchip, dataB2, CCIF2DB2);
+       }
+
+       c_can_write_reg_w(pmsgobj->hostchip, writeSendMskCM, CCIF2CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF2CR);
+
+       spin_unlock(&c_can_if2lock);
+
+       DEBUGMSG("-> ok\n");
+#ifdef REGDUMP
+       c_can_registerdump(pmsgobj->hostchip);
+#endif
+
+       return 0;
+}
+
+//////////////////////////////////////////////////////////////////////
+int c_can_remote_request(struct canchip_t *pchip, struct msgobj_t *pmsgobj)
+{
+       unsigned short readMaskCM = IFXCM_CNTRL;        // | IFXCM_ARB;
+       //unsigned short writeMaskCM = IFXCM_CNTRL | IFXCM_ARB | IFXCM_WRRD;
+       unsigned short mcreg = 0;
+
+       DEBUGMSG("(c%dm%d)calling c_can_remote_request(...)\n",
+                pmsgobj->hostchip->chip_idx, pmsgobj->object);
+
+       //Remote request is only available when the message object is in receiving mode
+       if (!can_msgobj_test_fl(pmsgobj, RX_MODE)) {
+               return 1;
+       }
+
+       spin_lock(&c_can_if1lock);
+
+       //loading Message Object in IF1
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF1CM);
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+       //setting Transmit-Request-Bit
+       if (c_can_if1_busycheck(pmsgobj->hostchip))
+               return -ENODEV;
+       mcreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1DMC);
+       c_can_write_reg_w(pmsgobj->hostchip, mcreg | IFXMC_TXRQST, CCIF1DMC);
+
+       c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
+       spin_unlock(&c_can_if1lock);
+
+       DEBUGMSG("-> Sent remote request through message object %d\n",
+                pmsgobj->object);
+#ifdef REGDUMP
+       c_can_registerdump(pmsgobj->hostchip);
+#endif
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_set_btregs(struct canchip_t *pchip, u16 btr0, u16 btr1)
+{
+       unsigned short tempCR = 0;
+
+       DEBUGMSG("(c%d)calling c_can_set_btregs(...)\n", pchip->chip_idx);
+
+       // Validate pointer
+       if (NULL == pchip)
+               return -1;
+
+       if (c_can_enable_configuration(pchip))
+               return -ENODEV;
+
+       //read Control Register
+       tempCR = c_can_read_reg_w(pchip, CCCR);
+       //Configuration Change Enable
+       c_can_write_reg_w(pchip, tempCR | CR_CCE, CCCR);
+       c_can_write_reg_w(pchip, btr0 | (btr1 << 8), CCBT);
+
+       if (c_can_disable_configuration(pchip))
+               return -ENODEV;
+
+       DEBUGMSG("-> ok\n");
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ * Starts the Chip, by setting the CAN Enable Bit
+ */
+int c_can_start_chip(struct canchip_t *pchip)
+{
+       u16 flags = 0;
+
+       DEBUGMSG("(c%d)calling c_can_start_chip(...)\n", pchip->chip_idx);
+
+       // Validate pointer
+       if (NULL == pchip) {
+               DEBUGMSG("-> Error Chip not available.\n");
+               return -1;
+       }
+#ifdef C_CAN_WITH_CCCE
+       flags = c_can_read_reg_w(pchip, CCCE) | CE_EN;
+       c_can_write_reg_w(pchip, flags, CCCE);
+#endif
+
+       DEBUGMSG("-> ok\n");
+#ifdef REGDUMP
+       c_can_registerdump(pchip);
+#endif
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ * Stops the Chip, by deleting the CAN Enable Bit
+ */
+int c_can_stop_chip(struct canchip_t *pchip)
+{
+       u16 flags = 0;
+
+       DEBUGMSG("(c%d)calling c_can_stop_chip(...)\n", pchip->chip_idx);
+
+       // Validate pointer
+       if (NULL == pchip) {
+               DEBUGMSG("-> Error Chip not available.\n");
+               return -1;
+       }
+#ifdef C_CAN_WITH_CCCE
+       flags = c_can_read_reg_w(pchip, CCCE) & ~CE_EN;
+       c_can_write_reg_w(pchip, flags, CCCE);
+#endif
+
+       DEBUGMSG("-> ok\n");
+       return 0;
+}
+
+int c_can_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int c_can_release_chip(struct canchip_t *chip)
+{
+       int temp;
+
+       temp = c_can_read_reg_w(chip, CCCR);
+
+       /* Disable IRQ generation */
+       c_can_config_irqs(chip, 0);
+
+       temp = c_can_read_reg_w(chip, CCCR);
+
+       /* Power-down C_CAN, except this does nothing in the version 1.2 */
+       c_can_stop_chip(chip);
+
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+/*
+ *Check the TxOK bit of the Status Register and resets it afterwards.
+ */
+int c_can_check_tx_stat(struct canchip_t *pchip)
+{
+       unsigned long tempstat = 0;
+
+       DEBUGMSG("(c%d)calling c_can_check_tx_stat(...)\n", pchip->chip_idx);
+
+       // Validate pointer
+       if (NULL == pchip)
+               return -1;
+
+       tempstat = c_can_read_reg_w(pchip, CCSR);
+
+       if (tempstat & SR_TXOK) {
+               c_can_write_reg_w(pchip, tempstat & ~SR_TXOK, CCSR);
+               return 0;
+       } else {
+               return 1;
+       }
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+
+       can_msgobj_set_fl(obj, TX_REQUEST);
+
+       /* calls c_can_irq_write_handler synchronized with other invocations
+          from kernel and IRQ context */
+       c_can_irq_sync_activities(chip, obj);
+
+       can_preempt_enable();
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+int c_can_filtch_rq(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+
+       can_msgobj_set_fl(obj, FILTCH_REQUEST);
+
+       /* setups filter synchronized with other invocations from kernel and IRQ context */
+       c_can_irq_sync_activities(chip, obj);
+
+       can_preempt_enable();
+       return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
+void c_can_registerdump(struct canchip_t *pchip)
+{
+       CANMSG("------------------------------------\n");
+       CANMSG("---------C-CAN Register Dump--------\n");
+       CANMSG("------------at 0x%.8lx-----------\n",
+              (unsigned long)pchip->chip_base_addr);
+       CANMSG("Control Register:             0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCCR)));
+       CANMSG("Status Register:              0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCSR)));
+       CANMSG("Error Counting Register:      0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCEC)));
+       CANMSG("Bit Timing Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCBT)));
+       CANMSG("Interrupt Register:           0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCINTR)));
+       CANMSG("Test Register:                0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCTR)));
+       CANMSG("Baud Rate Presc. Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCBRPE)));
+#ifdef C_CAN_WITH_CCCE
+       CANMSG("CAN Enable Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCCE)));
+#endif
+       CANMSG("Transm. Req. 1 Register:      0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCTREQ1)));
+       CANMSG("Transm. Req. 2 Register:      0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCTREQ2)));
+       CANMSG("New Data 1 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCND1)));
+       CANMSG("New Data 2 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCND2)));
+       CANMSG("Interrupt Pend. 1 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCINTP1)));
+       CANMSG("Interrupt Pend. 2 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCINTP2)));
+       CANMSG("------------------------------------\n");
+       CANMSG("IF1 Command Req. Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1CR)));
+       CANMSG("IF1 Command Mask Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1CM)));
+       CANMSG("IF1 Mask 1 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1M1)));
+       CANMSG("IF1 Mask 2 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1M2)));
+       CANMSG("IF1 Arbitration 1 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1A1)));
+       CANMSG("IF1 Arbitration 2 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1A2)));
+       CANMSG("IF1 Message Control Register: 0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DMC)));
+       CANMSG("IF1 Data A1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DA1)));
+       CANMSG("IF1 Data A2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DA2)));
+       CANMSG("IF1 Data B1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DB1)));
+       CANMSG("IF1 Data B2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DB2)));
+       CANMSG("------------------------------------\n");
+       CANMSG("IF2 Command Req. Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2CR)));
+       CANMSG("IF2 Command Mask Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2CM)));
+       CANMSG("IF2 Mask 1 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2M1)));
+       CANMSG("IF2 Mask 2 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2M2)));
+       CANMSG("IF2 Arbitration 1 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2A1)));
+       CANMSG("IF2 Arbitration 2 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2A2)));
+       CANMSG("IF2 Message Control Register: 0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2DMC)));
+       CANMSG("IF2 Data A1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2DA1)));
+       CANMSG("IF2 Data A2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2DA2)));
+       CANMSG("IF2 Data B1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2DB1)));
+       CANMSG("IF2 Data B2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF2DB2)));
+       CANMSG("------------------------------------\n");
+       CANMSG("------------------------------------\n");
+}
+
+void c_can_if1_registerdump(struct canchip_t *pchip)
+{
+       CANMSG("----------------------------------------\n");
+       CANMSG("Error Counting Register:      0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCEC)));
+       CANMSG("---------C-CAN IF1 Register Dump--------\n");
+       CANMSG("IF1 Command Req. Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1CR)));
+       CANMSG("IF1 Command Mask Register:    0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1CM)));
+       CANMSG("IF1 Mask 1 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1M1)));
+       CANMSG("IF1 Mask 2 Register:          0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1M2)));
+       CANMSG("IF1 Arbitration 1 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1A1)));
+       CANMSG("IF1 Arbitration 2 Register:   0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1A2)));
+       CANMSG("IF1 Message Control Register: 0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DMC)));
+       CANMSG("IF1 Data A1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DA1)));
+       CANMSG("IF1 Data A2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DA2)));
+       CANMSG("IF1 Data B1 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DB1)));
+       CANMSG("IF1 Data B2 Register:         0x%.4lx\n",
+              (long)(c_can_read_reg_w(pchip, CCIF1DB2)));
+}
+
+///////////////////////////////////////////////////////////////////////
+
+int c_can_register(struct chipspecops_t *chipspecops)
+{
+       CANMSG("initializing c_can chip operations\n");
+       chipspecops->chip_config = c_can_chip_config;
+       chipspecops->baud_rate = c_can_baud_rate;
+       /*chipspecops->standard_mask=c_can_standard_mask;
+          chipspecops->extended_mask=c_can_extended_mask;
+          chipspecops->message15_mask=c_can_extended_mask; */
+       chipspecops->clear_objects = c_can_clear_objects;
+       /*chipspecops->config_irqs=c_can_config_irqs; */
+       chipspecops->pre_read_config = c_can_pre_read_config;
+       chipspecops->pre_write_config = c_can_pre_write_config;
+       chipspecops->send_msg = c_can_send_msg;
+       chipspecops->check_tx_stat = c_can_check_tx_stat;
+       chipspecops->wakeup_tx = c_can_wakeup_tx;
+       chipspecops->filtch_rq = c_can_filtch_rq;
+       chipspecops->remote_request = c_can_remote_request;
+       chipspecops->enable_configuration = c_can_enable_configuration;
+       chipspecops->disable_configuration = c_can_disable_configuration;
+       chipspecops->attach_to_chip = c_can_attach_to_chip;
+       chipspecops->release_chip = c_can_release_chip;
+       chipspecops->set_btregs = c_can_set_btregs;
+       chipspecops->start_chip = c_can_start_chip;
+       chipspecops->stop_chip = c_can_stop_chip;
+       chipspecops->irq_handler = c_can_irq_handler;
+       chipspecops->irq_accept = NULL;
+       return 0;
+}
+
+int c_can_fill_chipspecops(struct canchip_t *chip)
+{
+       chip->chip_type = "c_can";
+       if (MAX_MSGOBJS >= 32) {
+               chip->max_objects = 32;
+       } else {
+               CANMSG("C_CAN requires 32 message objects per chip,"
+                      " but only %d is compiled maximum\n", MAX_MSGOBJS);
+               chip->max_objects = MAX_MSGOBJS;
+       }
+       c_can_register(chip->chipspecops);
+       return 0;
+}
diff --git a/lincan-0.3.3/src/c_can_irq.c b/lincan-0.3.3/src/c_can_irq.c
new file mode 100644 (file)
index 0000000..4ba6042
--- /dev/null
@@ -0,0 +1,565 @@
+/* c_can_irq.c - Hynix HMS30c7202 ARM IRQ handling code
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/c_can.h"
+
+union c_can_data {
+       unsigned short wdata[4];
+       unsigned char bdata[8];
+};
+
+// prototypes
+inline void c_can_irq_read_handler(struct canchip_t *pchip, int idxobj,
+                                  u32 msgid);
+
+inline void c_can_irq_write_handler(struct canchip_t *pchip, int idxobj);
+
+void c_can_irq_rtr_handler(struct canchip_t *pchip, int idxobj, u32 msgid);
+
+u16 readMaskCM = IFXCM_ARB | IFXCM_CNTRL | IFXCM_CLRINTPND
+    | IFXCM_TRND | IFXCM_DA | IFXCM_DB;
+
+u16 msgLstReadMaskCM = IFXCM_CNTRL;
+u16 msgLstWriteMaskCM = IFXCM_CNTRL | IFXCM_WRRD;
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_write_handler
+//
+// Send a message from the output fifo ( if any ).
+//
+
+inline void c_can_irq_write_handler(struct canchip_t *pchip, int idxobj)
+{
+       int cmd;
+       struct msgobj_t *pmsgobj = pchip->msgobj[idxobj];
+
+       DEBUGMSG("(c%dm%d)calling c_can_irq_write_handler(...)\n",
+                pchip->chip_idx, pmsgobj->object);
+
+       if (pmsgobj->tx_slot) {
+               /* Do local transmitted message distribution if enabled */
+               if (processlocal) {
+                       /* fill CAN message timestamp */
+                       can_filltimestamp(&pmsgobj->tx_slot->msg.timestamp);
+
+                       pmsgobj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(pmsgobj->qends,
+                                               &pmsgobj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(pmsgobj->qends, pmsgobj->tx_qedge,
+                                   pmsgobj->tx_slot);
+               pmsgobj->tx_slot = NULL;
+       }
+       // Get ready to send next message
+       spin_lock(&c_can_spwlock);
+
+       cmd =
+           canque_test_outslot(pmsgobj->qends, &pmsgobj->tx_qedge,
+                               &pmsgobj->tx_slot);
+       if (cmd < 0) {
+               DEBUGMSG("(c%dm%d)Nothin to write\n",
+                        pchip->chip_idx, pmsgobj->object);
+               spin_unlock(&c_can_spwlock);
+               return;
+       }
+       // Send the message
+       if (pchip->chipspecops->
+           send_msg(pchip, pmsgobj, &pmsgobj->tx_slot->msg)) {
+               pmsgobj->ret = -1;
+               canque_notify_inends(pmsgobj->tx_qedge,
+                                    CANQUEUE_NOTIFY_ERRTX_SEND);
+               canque_free_outslot(pmsgobj->qends, pmsgobj->tx_qedge,
+                                   pmsgobj->tx_slot);
+               pmsgobj->tx_slot = NULL;
+               spin_unlock(&c_can_spwlock);
+               DEBUGMSG("(c%dm%d)c_can_irq_handler: Unable to send message\n",
+                        pchip->chip_idx, pmsgobj->object);
+               return;
+       } else {
+               // Another message sent
+#ifdef CAN_WITH_STATISTICS
+               pchip->stat.cntTxPkt++;
+               pchip->stat.cntTxData += pmsgobj->tx_slot->length;
+#endif /*CAN_WITH_STATISTICS */
+       }
+       spin_unlock(&c_can_spwlock);
+
+       // Wake up any waiting writer
+       return;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_read_handler
+//
+// Message received form the line. Write it in the input fifo->
+//
+
+inline void c_can_irq_read_handler(struct canchip_t *pchip,
+                                  int idxobj, u32 msgid)
+{
+       int i = 0;
+       u16 bDataAvail = 1;
+       u16 msgCntlReg = 0;
+       union c_can_data readData;
+       struct msgobj_t *pmsgobj = pchip->msgobj[idxobj];
+
+       DEBUGMSG("(c%dm%d)calling c_can_irq_read_handler(...)\n",
+                pchip->chip_idx, pmsgobj->object);
+
+       while (bDataAvail) {
+
+#ifdef CAN_WITH_STATISTICS
+               pchip->stat.cntRxFifoOvr++;
+#endif /*CAN_WITH_STATISTICS */
+               // Message length
+               msgCntlReg = c_can_read_reg_w(pchip, CCIF1DMC);
+
+               pmsgobj->rx_msg.length = msgCntlReg & 0x000F;
+
+               // Message id
+               pmsgobj->rx_msg.id = (u32) msgid;
+
+               // Fetch message bytes
+               if (pmsgobj->rx_msg.length > 0)
+                       readData.wdata[0] = c_can_read_reg_w(pchip, CCIF1DA1);
+               if (pmsgobj->rx_msg.length > 2)
+                       readData.wdata[1] = c_can_read_reg_w(pchip, CCIF1DA2);
+               if (pmsgobj->rx_msg.length > 4)
+                       readData.wdata[2] = c_can_read_reg_w(pchip, CCIF1DB1);
+               if (pmsgobj->rx_msg.length > 6)
+                       readData.wdata[3] = c_can_read_reg_w(pchip, CCIF1DB2);
+
+               for (i = 0; i < pmsgobj->rx_msg.length; i++) {
+                       pmsgobj->rx_msg.data[i] = readData.bdata[i];
+               }
+               DEBUGMSG("(c%dm%d)Received Message:\n",
+                        pchip->chip_idx, pmsgobj->object);
+               DEBUGMSG(" id = %ld\n", pmsgobj->rx_msg.id);
+               DEBUGMSG(" length = %d\n", pmsgobj->rx_msg.length);
+               for (i = 0; i < pmsgobj->rx_msg.length; i++)
+                       DEBUGMSG(" data[%d] = 0x%.2x\n", i,
+                                pmsgobj->rx_msg.data[i]);
+
+               /* fill CAN message timestamp */
+               can_filltimestamp(&pmsgobj->rx_msg.timestamp);
+
+               canque_filter_msg2edges(pmsgobj->qends, &pmsgobj->rx_msg);
+
+#ifdef CAN_WITH_STATISTICS
+               // Another received packet
+               pchip->stat.cntRxPkt++;
+
+               // Add databytes read to statistics block
+               pchip->stat.cntRxData += pmsgobj->rx_msg.length;
+#endif /*CAN_WITH_STATISTICS */
+
+               // Check if new data arrived
+               if (c_can_if1_busycheck(pchip)) ;
+               c_can_write_reg_w(pchip, readMaskCM, CCIF1CM);
+               c_can_write_reg_w(pchip, idxobj + 1, CCIF1CR);
+               if (c_can_if1_busycheck(pchip)) ;
+               if (!((bDataAvail = c_can_read_reg_w(pchip, CCIF1DMC)) &
+                     IFXMC_NEWDAT)) {
+                       break;
+               }
+
+               if (bDataAvail & IFXMC_MSGLST) {
+                       CANMSG("(c%dm%d)c-can fifo full: Message lost!\n",
+                              pchip->chip_idx, pmsgobj->object);
+               }
+
+       }
+       // while
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_update_filter
+//
+// update acceptance filter for given object.
+//
+
+void c_can_irq_update_filter(struct canchip_t *pchip, struct msgobj_t *obj)
+{
+       struct canfilt_t filt;
+
+       if(canqueue_ends_filt_conjuction(obj->qends, &filt)) {
+               obj->rx_preconfig_id=filt.id;
+
+               if (filt.flags&MSG_EXT)
+                       can_msgobj_set_fl(obj,RX_MODE_EXT);
+               else
+                       can_msgobj_clear_fl(obj,RX_MODE_EXT);
+
+               c_can_mask(obj, filt.mask, 0);
+
+               c_can_pre_read_config(pchip, obj);
+
+               CANMSG("c_can_irq_update_filter: obj #%d\n",obj->object);
+       }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_sync_activities
+//
+// ensure, that not requests for object activities are serialized.
+//
+
+void c_can_irq_sync_activities(struct canchip_t *pchip, struct msgobj_t *obj)
+{
+       while (!can_msgobj_test_and_set_fl(obj, TX_LOCK)) {
+
+               if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) {
+                       int cctreqx;
+                       int idxobj = obj->object-1;
+                       
+                       if(idxobj<0) {
+                               DEBUGMSG("c_can_irq_sync_activities wrong idxobj\n");
+                               break;
+                       }
+
+                       if(idxobj < 16)
+                               cctreqx = c_can_read_reg_w(pchip, CCTREQ1);
+                       else
+                               cctreqx = c_can_read_reg_w(pchip, CCTREQ2);
+
+                       if (!(cctreqx & (1 << (idxobj & 0xf)))) {
+                               can_msgobj_clear_fl(obj, TX_REQUEST);
+                               c_can_irq_write_handler(pchip, idxobj);
+                       }
+               }
+
+               if(!obj->tx_slot) {
+                       if(can_msgobj_test_and_clear_fl(obj,FILTCH_REQUEST)) {
+                               c_can_irq_update_filter(pchip, obj);
+                       }
+               }
+
+               can_msgobj_clear_fl(obj, TX_LOCK);
+
+               mb();
+
+               if (can_msgobj_test_fl(obj, TX_REQUEST))
+                       continue;
+               if (can_msgobj_test_fl(obj, FILTCH_REQUEST) && !obj->tx_slot)
+                       continue;
+               break;
+       }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_handler
+//
+
+int c_can_irq_handler(int irq, struct canchip_t *pchip)
+{
+       struct rtr_id *rtr_search = hardware_p->rtr_queue;
+       u16 chip_status;
+       int id0 = 0, id1 = 0;
+       u16 errcount = 0;
+       u16 irqreg = 0;
+       u32 msgid = 0;
+       u16 tempCntlReg = 0;
+
+       irqreg = c_can_read_reg_w(pchip, CCINTR);
+
+       if (!irqreg) {
+               DEBUGMSG("\n(c%d)IRQ handler: addr=%.8lx spurious interrupt\n",
+                        pchip->chip_idx,
+                        (long)(pchip-> /*v */ chip_base_addr /* + CCSR */ ));
+               return CANCHIP_IRQ_NONE;
+       }
+
+       DEBUGMSG("\n(c%d)IRQ handler: addr=%.8lx irqreg=0x%.4x\n",
+                pchip->chip_idx,
+                (long)(pchip-> /*v */ chip_base_addr /* + CCSR */ ),
+                irqreg);
+
+#ifdef REGDUMP
+       c_can_registerdump(pchip);
+#endif
+
+       while (irqreg) {
+               // Handle change in status register
+
+               if (irqreg == INT_STAT) {
+                       chip_status = c_can_read_reg_w(pchip, CCSR);
+                       DEBUGMSG("(c%d)Status register: 0x%x\n",
+                                pchip->chip_idx, chip_status);
+
+                       if (chip_status & SR_EWARN) {
+                               // There is an abnormal # of errors
+#ifdef CAN_WITH_STATISTICS
+                               pchip->stat.cntWarnings++;
+#endif /*CAN_WITH_STATISTICS */
+                               errcount = c_can_read_reg_w(pchip, CCEC);
+                               DEBUGMSG
+                                   ("(c%d)stat: c_can_irq_handler: Abnormal number of Errors Warning\n"
+                                    "       txErr=%d, rxErr=%d\n",
+                                    pchip->chip_idx, (errcount & 0x00ff),
+                                    ((errcount & 0x7f00) >> 8));
+
+                               /*
+                                  // this code deactivates the chip if the transmiterrorcounter grew above 127
+                                  if ((pchip->stat.cntWarnings > 100) && ((errcount&0x00ff) > 127))
+                                  {
+                                  CANMSG("(c%d)to much Errornumber warnings (>100), deactivating chip",
+                                  pchip->chip_idx);
+                                  pchip->config_irqs(pchip, 0);
+                                  pchip->enable_configuration(pchip);
+                                  pchip->clear_objects(pchip);
+                                  pchip->flags &= ~CHANNEL_CONFIGURED;
+                                  return;
+                                  } */
+                       }
+
+                       if (chip_status & SR_EPASS) {
+                               // There is an abnormal # of errors
+#ifdef CAN_WITH_STATISTICS
+                               pchip->stat.cntErrPassive++;
+#endif /*CAN_WITH_STATISTICS */
+                               DEBUGMSG
+                                   ("(c%d)stat: c_can_irq_handler: Chip entering Error Passive Mode\n",
+                                    pchip->chip_idx);
+                       }
+
+                       if (chip_status & SR_BOFF) {
+                               // We have a bus off condition
+#ifdef CAN_WITH_STATISTICS
+                               pchip->stat.cntBusOff++;
+#endif /*CAN_WITH_STATISTICS */
+                               //pchip->fifo->tx_in_progress = 0;
+                               //reset init bit
+                               CANMSG
+                                   ("(c%d)stat: c_can_irq_handler: Bus Off\n",
+                                    pchip->chip_idx);
+                               /*if (pchip->stat.cntBusOff > 100)
+                                  {
+                                  CANMSG("(c%d)to much busoff warnings (>100), deactivating chip",
+                                  pchip->chip_idx);
+                                  pchip->config_irqs(pchip, 0);
+                                  pchip->enable_configuration(pchip);
+                                  pchip->clear_objects(pchip);
+                                  pchip->flags &= ~CHANNEL_CONFIGURED;
+                                  return;
+                                  }
+                                  else */
+                               CANMSG("(c%d)try to reconnect",
+                                      pchip->chip_idx);
+                               pchip->chipspecops->
+                                   disable_configuration(pchip);
+                       }
+
+                       if (chip_status & SR_TXOK) {
+                               DEBUGMSG
+                                   ("(c%d)stat: Transmitted a Message successfully\n",
+                                    pchip->chip_idx);
+                               c_can_write_reg_w(pchip, chip_status & ~SR_TXOK,
+                                                 CCSR);
+                       }
+
+                       if (chip_status & SR_RXOK) {
+                               DEBUGMSG
+                                   ("(c%d)stat: Received a Message successfully\n",
+                                    pchip->chip_idx);
+                               c_can_write_reg_w(pchip, chip_status & ~SR_RXOK,
+                                                 CCSR);
+                       }
+#ifdef CAN_WITH_STATISTICS
+                       // Errors to statistics
+                       switch (chip_status & 0x07) {
+                       case SRLEC_NE:  // No error
+                               break;
+                       case SRLEC_SE:  // Stuff error
+                               pchip->stat.cntStuffErr++;
+                               break;
+                       case SRLEC_FE:  // Form error
+                               pchip->stat.cntFormErr++;
+                               break;
+                       case SRLEC_AE:  // Ack error
+                               pchip->stat.cntAckErr++;
+                               break;
+                       case SRLEC_B1:  // Bit 1 error
+                               pchip->stat.cntBit1Err++;
+                               break;
+                       case SRLEC_B0:  // Bit 0 error
+                               pchip->stat.cntBit0Err++;
+                               break;
+                       case SRLEC_CR:  // CRC error
+                               pchip->stat.cntCrcErr++;
+                               break;
+                       case 7: // unused
+                               break;
+                       }
+#endif /*CAN_WITH_STATISTICS */
+                       //return; // continue?
+               } else {
+                       if (irqreg >= 1 && irqreg <= 32) {
+                               struct msgobj_t *pmsgobj;
+                               int idxobj;
+
+                               //get id
+                               idxobj = irqreg - 1;
+                               pmsgobj = pchip->msgobj[idxobj];
+
+                               //DEBUGMSG( "Interrupt handler: addr=%lx devid=%lx irqreq=%x status=0x%x\n",
+                               //            (unsigned long)pchip->vbase_addr + iIRQ,
+                               //      (unsigned long)dev_id,
+                               //      irqreg,
+                               //      statreg );
+                               //
+                               spin_lock(&c_can_if1lock);
+
+                               //Message Lost Check
+                               if (c_can_if1_busycheck(pchip)) ;       /*?????????? */
+                               c_can_write_reg_w(pchip, msgLstReadMaskCM,
+                                                 CCIF1CM);
+                               c_can_write_reg_w(pchip, idxobj + 1, CCIF1CR);
+
+                               if (c_can_if1_busycheck(pchip)) ;       /*?????????? */
+                               tempCntlReg = c_can_read_reg_w(pchip, CCIF1DMC);
+
+                               if (tempCntlReg & IFXMC_MSGLST) {
+                                       CANMSG("(c%dm%d)Chip lost a message\n",
+                                              pchip->chip_idx,
+                                              pmsgobj->object);
+#ifdef CAN_WITH_STATISTICS
+                                       pchip->stat.cntMsgLst++;
+#endif /*CAN_WITH_STATISTICS */
+
+                                       //Reset Message Lost Bit
+                                       tempCntlReg =
+                                           tempCntlReg & (~IFXMC_MSGLST);
+                                       c_can_write_reg_w(pchip, tempCntlReg,
+                                                         CCIF1DMC);
+                                       c_can_write_reg_w(pchip,
+                                                         msgLstWriteMaskCM,
+                                                         CCIF1CM);
+                                       c_can_write_reg_w(pchip, idxobj + 1,
+                                                         CCIF1CR);
+                               }
+                               //transfer Message Object to IF1 Buffer
+                               if (c_can_if1_busycheck(pchip)) ;
+
+                               c_can_write_reg_w(pchip, readMaskCM, CCIF1CM);
+                               c_can_write_reg_w(pchip, idxobj + 1, CCIF1CR);
+
+                               if (c_can_if1_busycheck(pchip)) ;
+                               if (c_can_read_reg_w(pchip, CCIF1A2) &
+                                   IFXARB2_DIR) {
+                                       spin_unlock(&c_can_if1lock);
+                                       c_can_irq_write_handler(pchip, idxobj);
+
+                                       if(!pmsgobj->tx_slot){
+                                               if(can_msgobj_test_and_clear_fl(pmsgobj, FILTCH_REQUEST)) {
+                                                       c_can_irq_update_filter(pchip, pmsgobj);
+                                               }
+                                       }
+                               } else {
+                                       if (can_msgobj_test_fl
+                                           (pmsgobj, RX_MODE_EXT)) {
+                                               id0 =
+                                                   c_can_read_reg_w(pchip,
+                                                                    CCIF1A1);
+                                               id1 =
+                                                   (c_can_read_reg_w
+                                                    (pchip,
+                                                     CCIF1A2) & 0x1FFF) << 16;
+                                               msgid = id0 | id1;
+                                       } else {
+                                               msgid =
+                                                   ((c_can_read_reg_w
+                                                     (pchip,
+                                                      CCIF1A2) & 0x1FFC) >> 2)
+                                                   & 0x7FF;
+                                       }
+                                       spin_unlock(&c_can_if1lock);
+
+                                       spin_lock(&hardware_p->rtr_lock);
+                                       while (rtr_search != NULL) {
+                                               if (rtr_search->id == msgid) {
+                                                       break;
+                                               }
+                                               rtr_search = rtr_search->next;
+                                       }
+                                       spin_unlock(&hardware_p->rtr_lock);
+
+                                       spin_lock(&c_can_if1lock);
+
+                                       //transfer Message Object to IF1 Buffer
+                                       if (c_can_if1_busycheck(pchip)) ;
+                                       c_can_write_reg_w(pchip, readMaskCM,
+                                                         CCIF1CM);
+                                       c_can_write_reg_w(pchip, idxobj + 1,
+                                                         CCIF1CR);
+
+                                       if (c_can_if1_busycheck(pchip)) ;
+
+                                       if ((rtr_search != NULL)
+                                           && (rtr_search->id == msgid)) {
+                                               c_can_irq_rtr_handler(pchip,
+                                                                     idxobj,
+                                                                     msgid);
+                                       } else {
+                                               c_can_irq_read_handler(pchip,
+                                                                      idxobj,
+                                                                      msgid);
+                                       }
+                                       spin_unlock(&c_can_if1lock);
+
+                               }
+                               //else
+                       }
+                       //if (irqreg >= 1 && irqreg <= 32)
+               }
+               // Get irq status again
+               irqreg = c_can_read_reg_w(pchip, CCINTR);
+       }
+       return CANCHIP_IRQ_HANDLED;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// c_can_irq_rtr_handler
+//
+
+void c_can_irq_rtr_handler(struct canchip_t *pchip, int idxobj, u32 msgid)
+{
+       short int i = 0;
+       struct rtr_id *prtr_search = hardware_p->rtr_queue;
+       union c_can_data rtrData;
+
+       spin_lock(&hardware_p->rtr_lock);
+
+       prtr_search->rtr_message->id = msgid;
+       prtr_search->rtr_message->length =
+           (c_can_read_reg_w(pchip, CCIF1DMC) & 0x000f);
+
+       // Fetch message bytes
+       if (prtr_search->rtr_message->length > 0)
+               rtrData.wdata[0] = c_can_read_reg_w(pchip, CCIF1DA1);
+       if (prtr_search->rtr_message->length > 2)
+               rtrData.wdata[1] = c_can_read_reg_w(pchip, CCIF1DA2);
+       if (prtr_search->rtr_message->length > 4)
+               rtrData.wdata[2] = c_can_read_reg_w(pchip, CCIF1DB1);
+       if (prtr_search->rtr_message->length > 6)
+               rtrData.wdata[3] = c_can_read_reg_w(pchip, CCIF1DB2);
+
+       for (i = 0; i < prtr_search->rtr_message->length; i++) {
+               prtr_search->rtr_message->data[i] = rtrData.bdata[i];
+       }
+
+       spin_unlock(&hardware_p->rtr_lock);
+       wake_up_interruptible(&prtr_search->rtr_wq);
+       return;
+}
diff --git a/lincan-0.3.3/src/can_devrtl.c b/lincan-0.3.3/src/can_devrtl.c
new file mode 100644 (file)
index 0000000..ad6d6c2
--- /dev/null
@@ -0,0 +1,240 @@
+/* can_devrtl.c - CAN message queues functions for the RT-Linux
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/can_queue.h"
+#include "../include/main.h"
+#include "../include/setup.h"
+
+#include <rtl_malloc.h>
+
+#ifdef CAN_ENABLE_VME_SUPPORT
+#include "ca91c042.h"
+/* Modified version of ca91c042 driver can be found in
+ * components/comm/contrib directory. */
+#endif
+
+can_spinlock_t can_irq_manipulation_lock;
+
+unsigned int can_rtl_isr( unsigned int irq_num, struct pt_regs *r )
+{
+       struct canchip_t *chip;
+       struct candevice_t *candev;
+       int board_nr;
+       int chip_nr;
+       int irq2linux=0;
+       int ret;
+       pthread_t thread=NULL;
+
+       DEBUGMSG("can_rtl_isr invoked for irq %d\n",irq_num);
+       
+       /* I hate next loop, but RT-Linux does not provide context to ISR */
+       for (board_nr=hardware_p->nr_boards; board_nr--; ) {
+               if((candev=hardware_p->candevice[board_nr])==NULL)
+                       continue;
+               for(chip_nr=candev->nr_all_chips; chip_nr--; ) {
+                       if((chip=candev->chip[chip_nr])==NULL)
+                               continue;
+                       if(chip->chip_irq!=irq_num) continue;
+
+                       if(chip->chipspecops->irq_accept)
+                               ret=chip->chipspecops->irq_accept(chip->chip_irq,chip);
+
+                       set_bit(MSGOBJ_IRQ_REQUEST_b,&chip->pend_flags);
+                       set_bit(MSGOBJ_WORKER_WAKE_b,&chip->pend_flags);
+                       if(chip->flags & CHIP_IRQ_PCI)
+                               irq2linux=1;
+#ifdef CAN_ENABLE_VME_SUPPORT
+                       if (chip->flags & CHIP_IRQ_VME)
+                                tundra_rtl_ack_irq_vector(irq_num);
+#endif
+                       if(!chip->worker_thread) continue;
+                       thread=chip->worker_thread;
+                       pthread_kill(thread,RTL_SIGNAL_WAKEUP);
+               }
+       }
+
+        /* The following lines are commented out because of it is not
+         * possible to share level activated (PCI) IRQs between Linux
+         * and RT-Linux. */
+/*     if(irq2linux) */
+/*             rtl_global_pend_irq(irq_num); */
+
+       /*if(thread) rtl_reschedule_thread(thread);*/
+
+       rtl_schedule();
+
+       return 0;
+}
+
+
+
+/*
+RTL_MARK_READY(pthread_self())
+RTL_MARK_SUSPENDED(pthread_self());
+return rtl_schedule();
+can_enable_irq
+can_disable_irq 
+rtl_critical( state )
+rtl_end_critical( state )
+rtl_request_global_irq( irq, isr ); 
+rtl_free_global_irq( irq )
+*/
+
+void * can_chip_worker_thread(void *arg)
+{
+       struct canchip_t *chip = (struct canchip_t *) arg;
+       struct msgobj_t *obj;
+       int ret, i;
+       int loop_cnt;
+       rtl_irqstate_t flags;
+       
+       if(!chip) return 0;
+       
+       
+       if (!(chip->flags & CHIP_CONFIGURED)){
+               if (chip->chipspecops->chip_config(chip))
+                       CANMSG("Error configuring chip.\n");
+               else
+                       chip->flags |= CHIP_CONFIGURED; 
+
+               if((chip->msgobj[0])!=NULL)
+                       if (chip->chipspecops->pre_read_config(chip,chip->msgobj[0])<0)
+                               CANMSG("Error initializing chip for receiving\n");
+                               
+       } /* End of chip configuration */
+       set_bit(MSGOBJ_IRQ_REQUEST_b,&chip->pend_flags);
+       
+
+       while (1) {
+               DEBUGMSG("Worker thread for chip %d active\n",chip->chip_idx);
+               if(test_and_clear_bit(MSGOBJ_IRQ_REQUEST_b,&chip->pend_flags)){
+                       DEBUGMSG("IRQ_REQUEST processing ...\n");
+                       loop_cnt = 100;
+                       if(chip->chipspecops->irq_handler) do{
+                               ret=chip->chipspecops->irq_handler(chip->chip_irq,chip);
+                       }while(ret && --loop_cnt);
+                       continue;
+               }
+               if(test_and_clear_bit(MSGOBJ_TX_REQUEST_b,&chip->pend_flags)){
+                       DEBUGMSG("TX_REQUEST processing ...\n");
+                       for(i=0;i<chip->max_objects;i++){
+                               if((obj=chip->msgobj[i])==NULL)
+                                       continue;
+                               if(can_msgobj_test_fl(obj,TX_REQUEST)) {
+                                       DEBUGMSG("Calling wakeup_tx\n");
+                                       chip->chipspecops->wakeup_tx(chip, obj);
+                               }
+                               if(can_msgobj_test_fl(obj,FILTCH_REQUEST)) {
+                                       DEBUGMSG("Calling filtch_rq\n");
+                                       if(chip->chipspecops->filtch_rq)
+                                               chip->chipspecops->filtch_rq(chip, obj);
+                               }
+                       }
+                       continue;
+               }
+
+               /*re-enable chip IRQ, I am not sure, if this is required,
+                 but it seems to not work without that */
+               if(chip->chip_irq>=0) {
+                       if ((chip->flags & CHIP_IRQ_VME) == 0) can_enable_irq(chip->chip_irq);
+                   #ifdef CAN_ENABLE_VME_SUPPORT
+                     #if 0
+                       else tundra_rtl_enable_pci_irq();
+                     #endif
+                       /* FIXME: Bad practice. Doesn't work with more
+                        * than one card.
+                        *
+                        * irq_accept added to the LinCAN driver now,
+                        * and above workaround should not be required.
+                        * Enable rtl_hard_enable_irq() at line 
+                        * ca91c042.c:1045
+                        */
+                   #endif /*CAN_ENABLE_VME_SUPPORT*/
+
+               }
+
+                rtl_no_interrupts (flags);
+               RTL_MARK_SUSPENDED(pthread_self());
+               if(test_and_clear_bit(MSGOBJ_WORKER_WAKE_b,&chip->pend_flags)){
+                       RTL_MARK_READY(pthread_self());
+                        rtl_restore_interrupts (flags);
+                       continue;
+               }
+                rtl_restore_interrupts (flags);
+               rtl_schedule();
+
+       }
+       return 0;
+}
+
+
+int can_chip_setup_irq(struct canchip_t *chip)
+{
+       int ret;
+        struct sched_param sched_param;
+        pthread_attr_t attrib;
+       pthread_attr_t *attrib_p=NULL;
+       
+       if(chip==NULL)
+               return -1;
+       
+       if(can_rtl_priority>=0){
+               pthread_attr_init(&attrib);
+               sched_param.sched_priority = can_rtl_priority;
+               pthread_attr_setschedparam(&attrib, &sched_param);
+               /* pthread_attr_setschedpolicy(&attrib, SCHED_FIFO); */
+               attrib_p=&attrib;
+       }
+       
+       if(chip->chipspecops->irq_handler && !(chip->flags & CHIP_IRQ_CUSTOM)){
+               int (*my_request_irq)(unsigned int vector, unsigned int (*rtl_handler)(unsigned int irq, struct pt_regs *regs));
+#ifdef CAN_ENABLE_VME_SUPPORT
+               if ((chip->flags & CHIP_IRQ_VME) != 0)
+                       my_request_irq = rtl_request_vmeirq;
+               else
+#endif
+                       my_request_irq = rtl_request_irq;
+
+               if (my_request_irq(chip->chip_irq,can_rtl_isr))
+                       return -1;
+               else {
+                       DEBUGMSG("Registered interrupt %d\n",chip->chip_irq);
+                       chip->flags |= CHIP_IRQ_SETUP;
+               }
+       }
+        ret=pthread_create(&chip->worker_thread, attrib_p, can_chip_worker_thread, chip);
+       if(ret<0) chip->worker_thread=NULL;
+       
+       return ret;
+}
+
+
+void can_chip_free_irq(struct canchip_t *chip)
+{
+       if(chip->worker_thread)
+               pthread_delete_np(chip->worker_thread);
+       if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)
+           && !(chip->flags & CHIP_IRQ_CUSTOM)) {
+               int (*my_free_irq)(unsigned int vector);
+#ifdef CAN_ENABLE_VME_SUPPORT
+               if ((chip->flags & CHIP_IRQ_VME) != 0)
+                       my_free_irq = rtl_free_vmeirq;
+               else
+#endif
+                       my_free_irq = rtl_free_irq;
+               my_free_irq(chip->chip_irq);
+               chip->flags &= ~CHIP_IRQ_SETUP;
+       }
+}
+
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/src/can_quekern.c b/lincan-0.3.3/src/can_quekern.c
new file mode 100644 (file)
index 0000000..ac1554c
--- /dev/null
@@ -0,0 +1,519 @@
+/* can_quekern.c - CAN message queues functions for the Linux kernel
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/can_queue.h"
+
+//#define CAN_DEBUG
+
+extern atomic_t edge_num_cnt;
+
+#ifdef CAN_DEBUG
+       #define DEBUGQUE(fmt,args...) can_printk(KERN_ERR "can_quekern (debug): " fmt,\
+       ##args)
+
+#else
+       #define DEBUGQUE(fmt,args...)
+#endif
+
+#define ERRMSGQUE(fmt,args...) can_printk(KERN_ERR "can_quekern: " fmt,\
+       ##args)
+
+
+/* 
+ * Modifies Tx message processing 
+ *  0 .. local message processing disabled
+ *  1 .. local messages disabled by default but can be enabled by canque_set_filt
+ *  2 .. local messages enabled by default, can be disabled by canque_set_filt
+ */
+extern int processlocal;
+
+void canque_dead_func(unsigned long data);
+
+/* Support for dead ends structures left after client close */
+can_spinlock_t canque_dead_func_lock;
+LIST_HEAD(canque_dead_ends);
+/* retrieved by list_entry(canque_dead_ends.next,struct canque_ends_t,dead_peers) */
+LIST_HEAD(canque_dead_edges);
+/* retrieved by list_entry(canque_dead_edges.next,struct canque_edge_t,inpeers) */
+DECLARE_TASKLET(canque_dead_tl, canque_dead_func, 0);
+/* activated by tasklet_schedule(&canque_dead_tl) */
+
+
+static inline
+struct canque_edge_t *canque_dead_edges_cut_first(void)
+{
+       can_spin_irqflags_t flags;
+       struct canque_edge_t *edge;
+       can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+       if(list_empty(&canque_dead_edges))
+               edge=NULL;
+       else{
+               edge=list_entry(canque_dead_edges.next,struct canque_edge_t,inpeers);
+               list_del(&edge->inpeers);
+       }
+       can_spin_unlock_irqrestore(&canque_dead_func_lock, flags);
+       return edge;
+}
+
+void canque_dead_func(unsigned long data)
+{
+       can_spin_irqflags_t flags;
+       struct canque_edge_t *qedge;
+       struct canque_ends_t *qends;
+       struct list_head *entry;
+
+       while((qedge=canque_dead_edges_cut_first())){
+               DEBUGQUE("edge %d disposed\n",qedge->edge_num);
+           #ifdef CAN_WITH_RTL
+               if(canque_fifo_test_fl(&qedge->fifo,RTL_MEM)){
+                       canque_dispose_edge_rtl(qedge);
+                       continue;
+               }
+           #endif /*CAN_WITH_RTL*/
+               canque_fifo_done_kern(&qedge->fifo);
+               kfree(qedge);
+       }
+       
+       can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+       entry=canque_dead_ends.next;
+       can_spin_unlock_irqrestore(&canque_dead_func_lock,flags);
+       /* lock can be released there, because only one instance of canque_dead_tl
+          can run at once and all other functions add ends only to head */
+       while(entry!=&canque_dead_ends){
+               qends=list_entry(entry,struct canque_ends_t,dead_peers);
+               entry=entry->next;
+               if(!list_empty(&qends->inlist))
+                       continue;
+               if(!list_empty(&qends->outlist))
+                       continue;
+               can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+               list_del(&qends->dead_peers);
+               can_spin_unlock_irqrestore(&canque_dead_func_lock,flags);
+               DEBUGQUE("ends structure disposed\n");
+           #ifdef CAN_WITH_RTL
+               if(qends->ends_flags&CAN_ENDSF_MEM_RTL){
+                       canque_ends_free_rtl(qends);
+                       continue;
+               }
+           #endif /*CAN_WITH_RTL*/
+               kfree(qends);
+       }
+
+}
+
+static inline void canque_dead_tasklet_schedule(void)
+{
+    #ifdef CAN_WITH_RTL
+       if(!rtl_rt_system_is_idle()){
+               set_bit(CAN_RTL2LIN_PEND_DEAD_b,&canqueue_rtl2lin_pend);
+               rtl_global_pend_irq (canqueue_rtl_irq);
+               return;
+       }
+    #endif /*CAN_WITH_RTL*/
+
+       tasklet_schedule(&canque_dead_tl);
+}
+
+
+void canque_edge_do_dead(struct canque_edge_t *edge)
+{
+       can_spin_irqflags_t flags;
+       
+       canque_notify_bothends(edge,CANQUEUE_NOTIFY_NOUSR);
+    #ifdef CAN_WITH_RTL
+       /* The problem of the above call is, that in RT-Linux to Linux notify
+          case is edge scheduled for delayed notify delivery, this needs
+          to be reflected there */
+       if(atomic_read(&edge->edge_used)>0){
+               can_spin_lock_irqsave(&edge->inends->ends_lock, flags);
+               can_spin_lock(&edge->outends->ends_lock);
+               if(atomic_read(&edge->edge_used)>0){
+                       /* left edge to live for a while, banshee comes again in a while */
+                       canque_fifo_clear_fl(&edge->fifo,DEAD);
+                       can_spin_unlock(&edge->outends->ends_lock);
+                       can_spin_unlock_irqrestore(&edge->inends->ends_lock, flags);
+                       can_printk(KERN_ERR "can_quertl (debug): canque_edge_do_dead postponed\n");
+                       return;
+               }
+               can_spin_unlock(&edge->outends->ends_lock);
+               can_spin_unlock_irqrestore(&edge->inends->ends_lock, flags);
+       }
+    #endif /*CAN_WITH_RTL*/
+       
+       if(canqueue_disconnect_edge(edge)<0){
+               ERRMSGQUE("canque_edge_do_dead: canqueue_disconnect_edge failed !!!\n");
+               return;
+       }
+
+       can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+       list_add(&edge->inpeers,&canque_dead_edges);
+       can_spin_unlock_irqrestore(&canque_dead_func_lock, flags);
+       canque_dead_tasklet_schedule();
+}
+
+
+
+/*if(qends->ends_flags & CAN_ENDSF_DEAD){
+       can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+       list_del(&qends->dead_peers);
+       list_add(&qends->dead_peers,&canque_dead_ends);
+       can_spin_unlock_irqrestore(&canque_dead_func_lock, flags);
+       tasklet_schedule(&canque_dead_tl);
+}*/
+
+
+/**
+ * canqueue_notify_kern - notification callback handler for Linux userspace clients
+ * @qends: pointer to the callback side ends structure
+ * @qedge: edge which invoked notification 
+ * @what: notification type
+ *
+ * The notification event is handled directly by call of this function except case,
+ * when called from RT-Linux context in mixed mode Linux/RT-Linux compilation.
+ * It is not possible to directly call Linux kernel synchronization primitives
+ * in such case. The notification request is postponed and signaled by @pending_inops flags
+ * by call canqueue_rtl2lin_check_and_pend() function. 
+ * The edge reference count is increased until until all pending notifications are processed.
+ */
+void canqueue_notify_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge, int what)
+{
+       DEBUGQUE("canqueue_notify_kern for edge %d, use %d and event %d\n",
+                       qedge->edge_num,(int)atomic_read(&qedge->edge_used),what);
+
+       /* delay event delivery for RT-Linux -> kernel notifications */
+       if(canqueue_rtl2lin_check_and_pend(qends,qedge,what)){
+               DEBUGQUE("canqueue_notify_kern postponed\n");
+               return;
+       }
+       
+       switch(what){
+               case CANQUEUE_NOTIFY_EMPTY:
+                       wake_up(&qends->endinfo.fileinfo.emptyq);
+                       if(canque_fifo_test_and_clear_fl(&qedge->fifo, FREEONEMPTY))
+                               canque_edge_decref(qedge);
+                       break;
+               case CANQUEUE_NOTIFY_SPACE:
+                       wake_up(&qends->endinfo.fileinfo.writeq);
+                   #ifdef CAN_ENABLE_KERN_FASYNC
+                       /* Asynchronous I/O processing */
+                       kill_fasync(&qends->endinfo.fileinfo.fasync, SIGIO, POLL_OUT); 
+                   #endif /*CAN_ENABLE_KERN_FASYNC*/
+                       break;
+               case CANQUEUE_NOTIFY_PROC:
+                       wake_up(&qends->endinfo.fileinfo.readq);
+                   #ifdef CAN_ENABLE_KERN_FASYNC
+                       /* Asynchronous I/O processing */
+                       kill_fasync(&qends->endinfo.fileinfo.fasync, SIGIO, POLL_IN); 
+                   #endif /*CAN_ENABLE_KERN_FASYNC*/
+                       break;
+               case CANQUEUE_NOTIFY_NOUSR:
+                       wake_up(&qends->endinfo.fileinfo.readq);
+                       wake_up(&qends->endinfo.fileinfo.writeq);
+                       wake_up(&qends->endinfo.fileinfo.emptyq);
+                       break;
+               case CANQUEUE_NOTIFY_DEAD_WANTED:
+               case CANQUEUE_NOTIFY_DEAD:
+                       if(canque_fifo_test_and_clear_fl(&qedge->fifo, READY))
+                               canque_edge_decref(qedge);
+                       break;
+               case CANQUEUE_NOTIFY_ATTACH:
+                       break;
+       }
+}
+
+/**
+ * canqueue_ends_init_kern - Linux userspace clients specific ends initialization
+ * @qends: pointer to the callback side ends structure
+ */
+int canqueue_ends_init_kern(struct canque_ends_t *qends)
+{
+       canqueue_ends_init_gen(qends);
+       qends->context=NULL;
+       init_waitqueue_head(&qends->endinfo.fileinfo.readq);
+       init_waitqueue_head(&qends->endinfo.fileinfo.writeq);
+       init_waitqueue_head(&qends->endinfo.fileinfo.emptyq);
+    #ifdef CAN_ENABLE_KERN_FASYNC
+       qends->endinfo.fileinfo.fasync=NULL;
+    #endif /*CAN_ENABLE_KERN_FASYNC*/
+       
+       qends->notify=canqueue_notify_kern;
+       DEBUGQUE("canqueue_ends_init_kern\n");
+       return 0;
+}
+
+
+/**
+ * canque_get_inslot4id_wait_kern - find or wait for best outgoing edge and slot for given ID
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to  allocated slot
+ * @cmd: command type for slot
+ * @id: communication ID of message to send into edge
+ * @prio: optional priority of message
+ *
+ * Same as canque_get_inslot4id(), except, that it waits for free slot
+ * in case, that queue is full. Function is specific for Linux userspace clients.
+ * Return Value: If there is no usable edge negative value is returned.
+ */
+int canque_get_inslot4id_wait_kern(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio)
+{
+       int ret=-1;
+       DEBUGQUE("canque_get_inslot4id_wait_kern for cmd %d, id %ld, prio %d\n",cmd,id,prio);
+       wait_event_interruptible((qends->endinfo.fileinfo.writeq), 
+               (ret=canque_get_inslot4id(qends,qedgep,slotp,cmd,id,prio))!=-1);
+       return ret;
+}
+
+/**
+ * canque_get_outslot_wait_kern - receive or wait for ready slot for given ends
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to received slot
+ *
+ * The same as canque_test_outslot(), except it waits in the case, that there is
+ * no ready slot for given ends. Function is specific for Linux userspace clients.
+ * Return Value: Negative value informs, that there is no ready output
+ *     slot for given ends. Positive value is equal to the command
+ *     slot has been allocated by the input side.
+ */
+int canque_get_outslot_wait_kern(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp)
+{
+       int ret=-1;
+       DEBUGQUE("canque_get_outslot_wait_kern\n");
+       wait_event_interruptible((qends->endinfo.fileinfo.readq), 
+               (ret=canque_test_outslot(qends,qedgep,slotp))!=-1);
+       return ret;
+}
+
+/**
+ * canque_sync_wait_kern - wait for all slots processing
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: pointer to edge
+ *
+ * Functions waits for ends transition into empty state.
+ * Return Value: Positive value indicates, that edge empty state has been reached.
+ *     Negative or zero value informs about interrupted wait or other problem.
+ */
+int canque_sync_wait_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge)
+{
+       int ret=-1;
+       DEBUGQUE("canque_sync_wait_kern\n");
+       wait_event_interruptible((qends->endinfo.fileinfo.emptyq), 
+               (ret=canque_fifo_test_fl(&qedge->fifo,EMPTY)?1:0));
+       return ret;
+}
+
+
+/**
+ * canque_fifo_init_kern - initialize one CAN FIFO
+ * @fifo: pointer to the FIFO structure
+ * @slotsnr: number of requested slots
+ *
+ * Return Value: The negative value indicates, that there is no memory
+ *     to allocate space for the requested number of the slots.
+ */
+int canque_fifo_init_kern(struct canque_fifo_t *fifo, int slotsnr)
+{
+       int size;
+       if(!slotsnr) slotsnr=MAX_BUF_LENGTH;
+       size=sizeof(struct canque_slot_t)*slotsnr;
+       fifo->entry=kmalloc(size,GFP_KERNEL);
+       if(!fifo->entry) return -1;
+       fifo->slotsnr=slotsnr;
+       return canque_fifo_init_slots(fifo);
+}
+
+/**
+ * canque_fifo_done_kern - frees slots allocated for CAN FIFO
+ * @fifo: pointer to the FIFO structure
+ */
+int canque_fifo_done_kern(struct canque_fifo_t *fifo)
+{
+       if(fifo->entry)
+               kfree(fifo->entry);
+       fifo->entry=NULL;
+       return 1;
+}
+
+
+/**
+ * canque_new_edge_kern - allocate new edge structure in the Linux kernel context
+ * @slotsnr: required number of slots in the newly allocated edge structure
+ *
+ * Return Value: Returns pointer to allocated slot structure or %NULL if
+ *     there is not enough memory to process operation.
+ */
+struct canque_edge_t *canque_new_edge_kern(int slotsnr)
+{
+       struct canque_edge_t *qedge;
+       qedge = (struct canque_edge_t *)kmalloc(sizeof(struct canque_edge_t), GFP_KERNEL);
+       if(qedge == NULL) return NULL;
+
+       memset(qedge,0,sizeof(struct canque_edge_t));
+       can_spin_lock_init(&qedge->fifo.fifo_lock);
+       if(canque_fifo_init_kern(&qedge->fifo, slotsnr)<0){
+               kfree(qedge);
+               DEBUGQUE("canque_new_edge_kern failed\n");
+               return NULL;
+       }
+       atomic_set(&qedge->edge_used,1);
+       qedge->filtid = 0;
+       qedge->filtmask = canque_filtid2internal(0l, (processlocal<2)? MSG_LOCAL:0);
+       qedge->edge_prio = 0;
+    #ifdef CAN_DEBUG
+       /* not exactly clean, but enough for debugging */
+       atomic_inc(&edge_num_cnt);
+       qedge->edge_num=atomic_read(&edge_num_cnt);
+    #endif /* CAN_DEBUG */
+       DEBUGQUE("canque_new_edge_kern %d\n",qedge->edge_num);
+       return qedge;
+}
+
+#ifdef USE_SYNC_DISCONNECT_EDGE_KERN
+
+/*not included in doc
+ * canqueue_disconnect_edge_kern - disconnect edge from communicating entities with wait
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: pointer to edge
+ *
+ * Same as canqueue_disconnect_edge(), but tries to wait for state with zero
+ * use counter.
+ * Return Value: Negative value means, that edge is used and cannot
+ *     be disconnected yet. Operation has to be delayed.
+ */
+int canqueue_disconnect_edge_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge)
+{
+       canque_fifo_set_fl(&qedge->fifo,BLOCK);
+       DEBUGQUE("canqueue_disconnect_edge_kern %d called\n",qedge->edge_num);
+       if(!canque_fifo_test_and_set_fl(&qedge->fifo,DEAD)){
+               canque_notify_bothends(qedge, CANQUEUE_NOTIFY_DEAD);
+               
+               if(atomic_read(&qedge->edge_used)>0)
+                       atomic_dec(&qedge->edge_used);
+
+               DEBUGQUE("canqueue_disconnect_edge_kern %d waiting\n",qedge->edge_num);
+               wait_event((qends->endinfo.fileinfo.emptyq), 
+                       (canqueue_disconnect_edge(qedge)>=0));
+
+               /*set_current_state(TASK_UNINTERRUPTIBLE);*/
+               /*schedule_timeout(HZ);*/
+               return 0;
+       } else {
+               DEBUGQUE("canqueue_disconnect_edge_kern cannot set DEAD\n");
+               return -1;
+       }
+}
+
+
+int canqueue_disconnect_list_kern(struct canque_ends_t *qends, struct list_head *list)
+{
+       struct canque_edge_t *edge;
+       can_spin_irqflags_t flags;
+       for(;;){
+               can_spin_lock_irqsave(&qends->ends_lock,flags);
+               if(list_empty(list)){
+                       can_spin_unlock_irqrestore(&qends->ends_lock,flags);
+                       return 0;
+               }
+               if(list == &qends->inlist)
+                       edge=list_entry(list->next,struct canque_edge_t,inpeers);
+               else
+                       edge=list_entry(list->next,struct canque_edge_t,outpeers);
+               atomic_inc(&edge->edge_used);
+               can_spin_unlock_irqrestore(&qends->ends_lock,flags);
+               if(canqueue_disconnect_edge_kern(qends, edge)>=0) {
+                       /* Free edge memory */
+                       canque_fifo_done_kern(&edge->fifo);
+                       kfree(edge);
+               }else{
+                       canque_notify_bothends(edge, CANQUEUE_NOTIFY_DEAD_WANTED);
+                       canque_edge_decref(edge);
+                       DEBUGQUE("canqueue_disconnect_list_kern in troubles\n");
+                       DEBUGQUE("the edge %d has usage count %d and flags %ld\n",edge->edge_num,atomic_read(&edge->edge_used),edge->fifo.fifo_flags);
+                       return -1;
+               }
+       }
+}
+
+#endif /*USE_SYNC_DISCONNECT_EDGE_KERN*/
+
+
+int canqueue_ends_sync_all_kern(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *qedge;
+       
+       canque_for_each_inedge(qends, qedge){
+               DEBUGQUE("canque_sync_wait_kern called for edge %d\n",qedge->edge_num);
+               canque_sync_wait_kern(qends, qedge);
+       }
+       return 0;
+}
+
+
+void canqueue_ends_dispose_postpone(struct canque_ends_t *qends)
+{
+       can_spin_irqflags_t flags;
+
+       can_spin_lock_irqsave(&canque_dead_func_lock, flags);
+       qends->ends_flags |= CAN_ENDSF_DEAD;
+       list_add(&qends->dead_peers,&canque_dead_ends);
+       can_spin_unlock_irqrestore(&canque_dead_func_lock, flags);
+       canque_dead_tasklet_schedule();
+}
+
+
+/**
+ * canqueue_ends_dispose_kern - finalizing of the ends structure for Linux kernel clients
+ * @qends: pointer to ends structure
+ * @sync: flag indicating, that user wants to wait for processing of all remaining
+ *     messages
+ *
+ * Return Value: Function should be designed such way to not fail.
+ */
+int canqueue_ends_dispose_kern(struct canque_ends_t *qends, int sync)
+{
+       int delayed;
+
+       DEBUGQUE("canqueue_ends_dispose_kern\n");
+       canqueue_block_inlist(qends);
+       canqueue_block_outlist(qends);
+
+       /*Wait for sending of all pending messages in the output FIFOs*/
+       if(sync)
+               canqueue_ends_sync_all_kern(qends);
+       
+       /* Finish or kill all outgoing edges listed in inends */
+       delayed=canqueue_ends_kill_inlist(qends, 1);
+       /* Kill all incoming edges listed in outends */
+       delayed|=canqueue_ends_kill_outlist(qends);
+
+       wake_up(&qends->endinfo.fileinfo.readq);
+       wake_up(&qends->endinfo.fileinfo.writeq);
+       wake_up(&qends->endinfo.fileinfo.emptyq);
+
+       if(delayed){
+               canqueue_ends_dispose_postpone(qends);
+
+               DEBUGQUE("canqueue_ends_dispose_kern delayed\n");
+               return 1;
+       }
+
+       kfree(qends);
+       DEBUGQUE("canqueue_ends_dispose_kern finished\n");
+       return 0;
+}
+
+void canqueue_kern_initialize()
+{
+       can_spin_lock_init(&canque_dead_func_lock);
+}
diff --git a/lincan-0.3.3/src/can_quertl.c b/lincan-0.3.3/src/can_quertl.c
new file mode 100644 (file)
index 0000000..0f7e083
--- /dev/null
@@ -0,0 +1,446 @@
+/* can_quertl.c - CAN message queues functions for the RT-Linux
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/can_queue.h"
+
+#include <rtl_malloc.h>
+
+/* 
+ * Modifies Tx message processing 
+ *  0 .. local message processing disabled
+ *  1 .. local messages disabled by default but can be enabled by canque_set_filt
+ *  2 .. local messages enabled by default, can be disabled by canque_set_filt
+ */
+extern int processlocal;
+
+
+#define CANQUE_PENDOPS_LIMIT 15
+#define CANQUE_PENDOPS_MASK  ((1<<CANQUE_PENDOPS_LIMIT)-1)
+
+struct list_head canque_pending_edges_list;
+can_spinlock_t canque_pending_edges_lock;
+unsigned long canqueue_rtl2lin_pend;
+
+int canqueue_rtl_irq = 0;
+
+void
+canqueue_rtl2lin_handler(int irq, void *ignore, struct pt_regs *ignoreregs)
+{
+       can_spin_irqflags_t flags;
+       struct canque_edge_t *qedge;
+       unsigned pending_inops;
+       unsigned pending_outops;
+       int i;
+       
+       can_spin_lock_irqsave (&canque_pending_edges_lock, flags);
+
+       while(!list_empty(&canque_pending_edges_list)){
+               qedge=list_entry(canque_pending_edges_list.next,struct canque_edge_t,pending_peers);
+               list_del(&qedge->pending_peers);
+               canque_fifo_clear_fl(&qedge->fifo, NOTIFYPEND);
+               pending_inops=qedge->pending_inops;
+               qedge->pending_inops=0;
+               pending_outops=qedge->pending_outops;
+               qedge->pending_outops=0;
+               can_spin_unlock_irqrestore (&canque_pending_edges_lock, flags);
+
+               if(pending_outops & ~CANQUE_PENDOPS_MASK){
+                       pending_outops &= CANQUE_PENDOPS_MASK;
+                       canque_notify_outends(qedge,CANQUEUE_NOTIFY_ERROR | qedge->fifo.error_code);
+               }
+               for(i=0;pending_outops;i++,pending_outops>>=1){
+                       if(pending_outops&1)
+                               canque_notify_outends(qedge,i);
+               }
+               if(pending_inops & ~CANQUE_PENDOPS_MASK){
+                       pending_inops &= CANQUE_PENDOPS_MASK;
+                       canque_notify_inends(qedge,CANQUEUE_NOTIFY_ERROR | qedge->fifo.error_code);
+               }
+               for(i=0;pending_inops;i++,pending_inops>>=1){
+                       if(pending_inops&1)
+                               canque_notify_inends(qedge,i);
+               }
+               
+               canque_edge_decref(qedge);
+               can_spin_lock_irqsave (&canque_pending_edges_lock, flags);
+       }
+
+       can_spin_unlock_irqrestore (&canque_pending_edges_lock, flags);
+
+       if(test_and_clear_bit(CAN_RTL2LIN_PEND_DEAD_b,&canqueue_rtl2lin_pend))
+               tasklet_schedule(&canque_dead_tl);
+
+       return;
+}
+
+
+/**
+ * canqueue_rtl2lin_check_and_pend - postpones edge notification if called from RT-Linux 
+ * @qends: notification target ends
+ * @qedge: edge delivering notification
+ * @what:  notification type
+ *
+ * Return Value: if called from Linux context, returns 0 and lefts notification processing
+ *             on caller responsibility. If called from RT-Linux contexts, schedules postponed
+ *             event delivery and returns 1
+ */
+int canqueue_rtl2lin_check_and_pend(struct canque_ends_t *qends,
+                        struct canque_edge_t *qedge, int what)
+{
+       can_spin_irqflags_t flags;
+
+       if(rtl_rt_system_is_idle()) return 0;
+
+       can_spin_lock_irqsave (&canque_pending_edges_lock, flags);
+       
+       if(what>CANQUE_PENDOPS_LIMIT) what=CANQUE_PENDOPS_LIMIT;
+
+       if(qends == qedge->inends) {
+               set_bit(what,&qedge->pending_inops);
+       } else if(qends == qedge->outends) {
+               set_bit(what,&qedge->pending_outops);
+       }
+
+       if(!canque_fifo_test_and_set_fl(&qedge->fifo, NOTIFYPEND)){
+               canque_edge_incref(qedge);
+               list_add_tail(&qedge->pending_peers,&canque_pending_edges_list);
+               rtl_global_pend_irq (canqueue_rtl_irq);
+       }
+
+       can_spin_unlock_irqrestore (&canque_pending_edges_lock, flags);
+       
+       return 1;
+
+}
+
+
+/**
+ * canque_get_inslot4id_wait_rtl - find or wait for best outgoing edge and slot for given ID
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to  allocated slot
+ * @cmd: command type for slot
+ * @id: communication ID of message to send into edge
+ * @prio: optional priority of message
+ *
+ * Same as canque_get_inslot4id(), except, that it waits for free slot
+ * in case, that queue is full. Function is specific for Linux userspace clients.
+ * Return Value: If there is no usable edge negative value is returned.
+ */
+int canque_get_inslot4id_wait_rtl(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio)
+{
+       rtl_irqstate_t flags;
+       int ret;
+       unsigned old_age;
+       rtl_sigset_t sigset;
+       
+       old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_writeq_age);
+       while((ret=canque_get_inslot4id(qends,qedgep,slotp,cmd,id,prio))==-1){
+               rtl_sigemptyset(&sigset);
+               rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(old_age == atomic_read(&qends->endinfo.rtlinfo.rtl_writeq_age))
+                       sigset=rtl_wait_sleep(&qends->endinfo.rtlinfo.rtl_writeq, &qends->endinfo.rtlinfo.rtl_lock);
+               rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(RTL_SIGINTR(&sigset))
+                       return -1;
+               old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_writeq_age);
+       }
+       
+       return ret;
+}
+
+
+/**
+ * canque_get_outslot_wait_rtl - receive or wait for ready slot for given ends
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to received slot
+ *
+ * The same as canque_test_outslot(), except it waits in the case, that there is
+ * no ready slot for given ends. Function is specific for Linux userspace clients.
+ * Return Value: Negative value informs, that there is no ready output
+ *     slot for given ends. Positive value is equal to the command
+ *     slot has been allocated by the input side.
+ */
+int canque_get_outslot_wait_rtl(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp)
+{
+       rtl_irqstate_t flags;
+       int ret;
+       unsigned old_age;
+       rtl_sigset_t sigset;
+       
+       old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_readq_age);
+       while((ret=canque_test_outslot(qends,qedgep,slotp))==-1){
+               rtl_sigemptyset(&sigset);
+               rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(old_age == atomic_read(&qends->endinfo.rtlinfo.rtl_readq_age))
+                       sigset=rtl_wait_sleep(&qends->endinfo.rtlinfo.rtl_readq, &qends->endinfo.rtlinfo.rtl_lock);
+               rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(RTL_SIGINTR(&sigset))
+                       return -1;
+               old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_readq_age);
+       }
+       return ret;
+}
+
+
+/**
+ * canque_sync_wait_rtl - wait for all slots processing
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: pointer to edge
+ *
+ * Functions waits for ends transition into empty state.
+ * Return Value: Positive value indicates, that edge empty state has been reached.
+ *     Negative or zero value informs about interrupted wait or other problem.
+ */
+int canque_sync_wait_rtl(struct canque_ends_t *qends, struct canque_edge_t *qedge)
+{
+       rtl_irqstate_t flags;
+       int ret;
+       unsigned old_age;
+       rtl_sigset_t sigset;
+       
+       old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_emptyq_age);
+       while(!(ret=canque_fifo_test_fl(&qedge->fifo,EMPTY)?1:0)){
+               rtl_sigemptyset(&sigset);
+               rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(old_age == atomic_read(&qends->endinfo.rtlinfo.rtl_emptyq_age))
+                       sigset=rtl_wait_sleep(&qends->endinfo.rtlinfo.rtl_emptyq, &qends->endinfo.rtlinfo.rtl_lock);
+               rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+               if(RTL_SIGINTR(&sigset))
+                       return -1;
+               old_age=atomic_read(&qends->endinfo.rtlinfo.rtl_emptyq_age);
+       }
+       
+       return ret;
+}
+
+
+/**
+ * canque_fifo_init_rtl - initialize one CAN FIFO
+ * @fifo: pointer to the FIFO structure
+ * @slotsnr: number of requested slots
+ *
+ * Return Value: The negative value indicates, that there is no memory
+ *     to allocate space for the requested number of the slots.
+ */
+int canque_fifo_init_rtl(struct canque_fifo_t *fifo, int slotsnr)
+{
+       int size;
+       if(!slotsnr) slotsnr=MAX_BUF_LENGTH;
+       size=sizeof(struct canque_slot_t)*slotsnr;
+       fifo->entry=rt_malloc(size);
+       if(!fifo->entry) return -1;
+       fifo->slotsnr=slotsnr;
+       return canque_fifo_init_slots(fifo);
+}
+
+
+/**
+ * canque_fifo_done_rtl - frees slots allocated for CAN FIFO
+ * @fifo: pointer to the FIFO structure
+ */
+int canque_fifo_done_rtl(struct canque_fifo_t *fifo)
+{
+       if(fifo->entry)
+               rt_free(fifo->entry);
+       fifo->entry=NULL;
+       return 1;
+}
+
+void canque_dispose_edge_rtl(struct canque_edge_t *qedge)
+{
+       canque_fifo_done_rtl(&qedge->fifo);
+       rt_free(qedge);
+}
+
+/**
+ * canque_new_edge_rtl - allocate new edge structure in the RT-Linux context
+ * @slotsnr: required number of slots in the newly allocated edge structure
+ *
+ * Return Value: Returns pointer to allocated slot structure or %NULL if
+ *     there is not enough memory to process operation.
+ */
+struct canque_edge_t *canque_new_edge_rtl(int slotsnr)
+{
+       struct canque_edge_t *qedge;
+       qedge = (struct canque_edge_t *)rt_malloc(sizeof(struct canque_edge_t));
+       if(qedge == NULL) return NULL;
+
+       memset(qedge,0,sizeof(struct canque_edge_t));
+       can_spin_lock_init(&qedge->fifo.fifo_lock);
+       canque_fifo_set_fl(&qedge->fifo,RTL_MEM);
+       if(canque_fifo_init_rtl(&qedge->fifo, slotsnr)<0){
+               rt_free(qedge);
+               return NULL;
+       }
+       atomic_set(&qedge->edge_used,1);
+       qedge->filtid = 0;
+       qedge->filtmask = canque_filtid2internal(0l, (processlocal<2)? MSG_LOCAL:0);
+       qedge->edge_prio = 0;
+    #if defined(CAN_DEBUG) && 0
+       /* not exactly clean, but enough for debugging */
+       atomic_inc(&edge_num_cnt);
+       qedge->edge_num=atomic_read(&edge_num_cnt);
+    #endif /* CAN_DEBUG */
+       return qedge;
+}
+
+void canque_ends_free_rtl(struct canque_ends_t *qends)
+{
+       rt_free(qends);
+}
+
+
+/**
+ * canqueue_notify_rtl - notification callback handler for Linux userspace clients
+ * @qends: pointer to the callback side ends structure
+ * @qedge: edge which invoked notification 
+ * @what: notification type
+ */
+void canqueue_notify_rtl(struct canque_ends_t *qends, struct canque_edge_t *qedge, int what)
+{
+       rtl_irqstate_t flags;
+       
+       switch(what){
+               case CANQUEUE_NOTIFY_EMPTY:
+                       rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_emptyq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_emptyq);
+                       rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       if(canque_fifo_test_and_clear_fl(&qedge->fifo, FREEONEMPTY))
+                               canque_edge_decref(qedge);
+                       break;
+               case CANQUEUE_NOTIFY_SPACE:
+                       rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_writeq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_writeq);
+                       rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       break;
+               case CANQUEUE_NOTIFY_PROC:
+                       rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_readq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_readq);
+                       rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       break;
+               case CANQUEUE_NOTIFY_NOUSR:
+                       rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_readq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_readq);
+
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_writeq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_writeq);
+
+                       atomic_inc(&qends->endinfo.rtlinfo.rtl_emptyq_age);
+                       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_emptyq);
+
+                       rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+                       break;
+               case CANQUEUE_NOTIFY_DEAD_WANTED:
+               case CANQUEUE_NOTIFY_DEAD:
+                       if(canque_fifo_test_and_clear_fl(&qedge->fifo, READY))
+                               canque_edge_decref(qedge);
+                       break;
+               case CANQUEUE_NOTIFY_ATTACH:
+                       break;
+       }
+}
+
+
+/**
+ * canqueue_ends_init_rtl - RT-Linux clients specific ends initialization
+ * @qends: pointer to the callback side ends structure
+ */
+int canqueue_ends_init_rtl(struct canque_ends_t *qends)
+{
+       canqueue_ends_init_gen(qends);
+       qends->context=NULL;
+       rtl_spin_lock_init(&(qends->endinfo.rtlinfo.rtl_lock));
+       rtl_wait_init(&(qends->endinfo.rtlinfo.rtl_readq));
+       rtl_wait_init(&(qends->endinfo.rtlinfo.rtl_writeq));
+       rtl_wait_init(&(qends->endinfo.rtlinfo.rtl_emptyq));
+       
+       qends->notify=canqueue_notify_rtl;
+       qends->endinfo.rtlinfo.pend_flags=0;
+       return 0;
+}
+
+/**
+ * canqueue_ends_dispose_rtl - finalizing of the ends structure for Linux kernel clients
+ * @qends: pointer to ends structure
+ * @sync: flag indicating, that user wants to wait for processing of all remaining
+ *     messages
+ *
+ * Return Value: Function should be designed such way to not fail.
+ */
+int canqueue_ends_dispose_rtl(struct canque_ends_t *qends, int sync)
+{
+       rtl_irqstate_t flags;
+       int delayed;
+
+       canqueue_block_inlist(qends);
+       canqueue_block_outlist(qends);
+
+       /*Wait for sending of all pending messages in the output FIFOs*/
+       /*if(sync)
+               canqueue_ends_sync_all_rtl(qends);*/
+       
+       /* Finish or kill all outgoing edges listed in inends */
+       delayed=canqueue_ends_kill_inlist(qends, 1);
+       /* Kill all incoming edges listed in outends */
+       delayed|=canqueue_ends_kill_outlist(qends);
+
+       rtl_spin_lock_irqsave(&qends->endinfo.rtlinfo.rtl_lock, flags);
+       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_readq);
+       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_writeq);
+       rtl_wait_wakeup(&qends->endinfo.rtlinfo.rtl_emptyq);
+       rtl_spin_unlock_irqrestore(&qends->endinfo.rtlinfo.rtl_lock, flags);
+
+       if(delayed || !(qends->ends_flags&CAN_ENDSF_MEM_RTL)){
+               canqueue_ends_dispose_postpone(qends);
+
+               return 1;
+       }
+
+       canque_ends_free_rtl(qends);
+       return 0;
+}
+
+
+
+/**
+ * canqueue_rtl_initialize - initialization of global RT-Linux specific features
+ */
+void canqueue_rtl_initialize(void)
+{
+       INIT_LIST_HEAD(&canque_pending_edges_list);
+       can_spin_lock_init(&canque_pending_edges_lock);
+
+       canqueue_rtl_irq = rtl_get_soft_irq (canqueue_rtl2lin_handler, "rtl_canqueue_irq");
+}
+
+
+/**
+ * canqueue_rtl_done - finalization of glopal RT-Linux specific features
+ */
+void canqueue_rtl_done(void)
+{
+       rtl_free_soft_irq (canqueue_rtl_irq);
+
+}
+
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/src/can_queue.c b/lincan-0.3.3/src/can_queue.c
new file mode 100644 (file)
index 0000000..d90b9c5
--- /dev/null
@@ -0,0 +1,750 @@
+/* can_queue.c - CAN message queues
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/can_queue.h"
+
+/* 
+ * Modifies Tx message processing 
+ *  0 .. local message processing disabled
+ *  1 .. local messages disabled by default but can be enabled by canque_set_filt
+ *  2 .. local messages enabled by default, can be disabled by canque_set_filt
+ */
+extern int processlocal;
+
+atomic_t edge_num_cnt;
+
+//#define CAN_DEBUG
+#undef CAN_DEBUG
+
+#ifdef CAN_DEBUG
+       #define DEBUGQUE(fmt,args...) can_printk(KERN_ERR "can_queue (debug): " fmt,\
+       ##args)
+
+#else
+       #define DEBUGQUE(fmt,args...)
+#endif
+
+#define CANQUE_ROUNDROB 1
+
+
+/**
+ * canque_fifo_flush_slots - free all ready slots from the FIFO
+ * @fifo: pointer to the FIFO structure
+ *
+ * The caller should be prepared to handle situations, when some
+ * slots are held by input or output side slots processing.
+ * These slots cannot be flushed or their processing interrupted.
+ *
+ * Return Value: The nonzero value indicates, that queue has not been
+ *     empty before the function call.
+ */
+int canque_fifo_flush_slots(struct canque_fifo_t *fifo)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+       struct canque_slot_t *slot;
+       can_spin_lock_irqsave(&fifo->fifo_lock, flags);
+       slot=fifo->head;
+       if(slot){
+               *fifo->tail=fifo->flist;
+               fifo->flist=slot;
+               fifo->head=NULL;
+               fifo->tail=&fifo->head;
+       }
+       canque_fifo_clear_fl(fifo,FULL);
+       ret=canque_fifo_test_and_set_fl(fifo,EMPTY)?0:1;
+       can_spin_unlock_irqrestore(&fifo->fifo_lock, flags);
+       return ret;
+}
+
+
+/**
+ * canque_fifo_init_slots - initializes slot chain of one CAN FIFO
+ * @fifo: pointer to the FIFO structure
+ *
+ * Return Value: The negative value indicates, that there is no memory
+ *     to allocate space for the requested number of the slots.
+ */
+int canque_fifo_init_slots(struct canque_fifo_t *fifo)
+{
+       struct canque_slot_t *slot;
+       int slotsnr=fifo->slotsnr;
+       if(!fifo->entry || !slotsnr) return -1;
+       slot=fifo->entry;
+       fifo->flist=slot;
+       while(--slotsnr){
+               slot->next=slot+1;
+               slot++;
+       }
+       slot->next=NULL;
+       fifo->head=NULL;
+       fifo->tail=&fifo->head;
+       canque_fifo_set_fl(fifo,EMPTY);
+       return 1;
+}
+
+/* atomic_dec_and_test(&qedge->edge_used);
+ void atomic_inc(&qedge->edge_used);
+ list_add_tail(struct list_head *new, struct list_head *head)
+ list_for_each(edge,qends->inlist);
+ list_entry(ptr, type, member)
+*/
+
+void __canque_edge_decref(struct canque_edge_t *edge)
+{
+       __canque_edge_decref_body(edge);
+}
+
+/**
+ * canque_get_inslot - finds one outgoing edge and allocates slot from it
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to  allocated slot
+ * @cmd: command type for slot
+ *
+ * Function looks for the first non-blocked outgoing edge in @qends structure
+ * and tries to allocate slot from it.
+ * Return Value: If there is no usable edge or there is no free slot in edge
+ *     negative value is returned.
+ */
+int canque_get_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp, int cmd)
+{
+       int ret=-2;
+       struct canque_edge_t *edge;
+       
+       edge=canque_first_inedge(qends);
+       if(edge){
+               if(!canque_fifo_test_fl(&edge->fifo,BLOCK)){
+                       ret=canque_fifo_get_inslot(&edge->fifo, slotp, cmd);
+                       if(ret>0){
+                               *qedgep=edge;
+                               DEBUGQUE("canque_get_inslot cmd=%d found edge %d\n",cmd,edge->edge_num);
+                               return ret;
+
+                       }
+               }
+               canque_edge_decref(edge);
+       }
+       *qedgep=NULL;
+       DEBUGQUE("canque_get_inslot cmd=%d failed\n",cmd);
+       return ret;
+}
+
+/**
+ * canque_get_inslot4id - finds best outgoing edge and slot for given ID
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to  allocated slot
+ * @cmd: command type for slot
+ * @id: communication ID of message to send into edge
+ * @prio: optional priority of message
+ *
+ * Function looks for the non-blocked outgoing edge accepting messages
+ * with given ID. If edge is found, slot is allocated from that edge.
+ * The edges with non-zero mask are preferred over edges open to all messages.
+ * If more edges with mask accepts given message ID, the edge with
+ * highest priority below or equal to required priority is selected.
+ * Return Value: If there is no usable edge or there is no free slot in edge
+ *     negative value is returned.
+ */
+int canque_get_inslot4id(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
+       int cmd, unsigned long id, int prio)
+{
+       int ret=-2;
+       struct canque_edge_t *edge, *bestedge=NULL;
+       
+       canque_for_each_inedge(qends, edge){
+               if(canque_fifo_test_fl(&edge->fifo,BLOCK))
+                       continue;
+               if((id^edge->filtid)&edge->filtmask)
+                       continue;
+               if(bestedge){
+                       if(bestedge->filtmask){
+                               if (!edge->filtmask) continue;
+                       } else {
+                               if(edge->filtmask){
+                                       canque_edge_decref(bestedge);
+                                       bestedge=edge;
+                                       canque_edge_incref(bestedge);
+                                       continue;
+                               }
+                       }
+                       if(bestedge->edge_prio<edge->edge_prio){
+                               if(edge->edge_prio>prio) continue;
+                       } else {
+                               if(bestedge->edge_prio<=prio) continue;
+                       }
+                       canque_edge_decref(bestedge);
+               }
+               bestedge=edge;
+               canque_edge_incref(bestedge);
+       }
+       if((edge=bestedge)!=NULL){
+               ret=canque_fifo_get_inslot(&edge->fifo, slotp, cmd);
+               if(ret>0){
+                       *qedgep=edge;
+                       DEBUGQUE("canque_get_inslot4id cmd=%d id=%ld prio=%d found edge %d\n",cmd,id,prio,edge->edge_num);
+                       return ret;
+               }
+               canque_edge_decref(bestedge);
+       }
+       *qedgep=NULL;
+       DEBUGQUE("canque_get_inslot4id cmd=%d id=%ld prio=%d failed\n",cmd,id,prio);
+       return ret;
+}
+
+
+/**
+ * canque_put_inslot - schedules filled slot for processing
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: edge slot belong to
+ * @slot: pointer to the prepared slot
+ *
+ * Puts slot previously acquired by canque_get_inslot() or canque_get_inslot4id()
+ * function call into FIFO queue and activates edge processing if needed.
+ * Return Value: Positive value informs, that activation of output end
+ *     has been necessary
+ */
+int canque_put_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot)
+{
+       int ret;
+       ret=canque_fifo_put_inslot(&qedge->fifo,slot);
+       if(ret) {
+               canque_activate_edge(qends,qedge);
+               canque_notify_outends(qedge,CANQUEUE_NOTIFY_PROC);
+       }
+       canque_edge_decref(qedge);
+       DEBUGQUE("canque_put_inslot for edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+/**
+ * canque_abort_inslot - aborts preparation of the message in the slot
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: edge slot belong to
+ * @slot: pointer to the previously allocated slot
+ *
+ * Frees slot previously acquired by canque_get_inslot() or canque_get_inslot4id()
+ * function call. Used when message copying into slot fails.
+ * Return Value: Positive value informs, that queue full state has been negated.
+ */
+int canque_abort_inslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot)
+{
+       int ret;
+       ret=canque_fifo_abort_inslot(&qedge->fifo,slot);
+       if(ret) {
+               canque_notify_outends(qedge,CANQUEUE_NOTIFY_SPACE);
+       }
+       canque_edge_decref(qedge);
+       DEBUGQUE("canque_abort_inslot for edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+/**
+ * canque_filter_msg2edges - sends message into all edges which accept its ID
+ * @qends: ends structure belonging to calling communication object
+ * @msg: pointer to CAN message
+ *
+ * Sends message to all outgoing edges connected to the given ends, which accepts
+ * message communication ID.
+ * Return Value: Returns number of edges message has been send to
+ */
+int canque_filter_msg2edges(struct canque_ends_t *qends, struct canmsg_t *msg)
+{
+       int destnr=0;
+       int ret;
+       unsigned long msgid;
+       struct canque_edge_t *edge;
+       struct canque_slot_t *slot;
+       
+       DEBUGQUE("canque_filter_msg2edges for msg ID 0x%08lx and flags 0x%02x\n",
+                       msg->id, msg->flags);
+       msgid = canque_filtid2internal(msg->id, msg->flags);
+
+       canque_for_each_inedge(qends, edge) {
+               if(canque_fifo_test_fl(&edge->fifo,BLOCK))
+                       continue;
+               if((msgid^edge->filtid)&edge->filtmask)
+                       continue;
+               ret=canque_fifo_get_inslot(&edge->fifo, &slot, 0);
+               if(ret>0){
+                       slot->msg=*msg;
+                       destnr++;
+                       ret=canque_fifo_put_inslot(&edge->fifo,slot);
+                       if(ret) {
+                               canque_activate_edge(qends,edge);
+                               canque_notify_outends(edge,CANQUEUE_NOTIFY_PROC);
+                       }
+
+               }
+       }
+       DEBUGQUE("canque_filter_msg2edges sent msg ID %ld to %d edges\n",msg->id,destnr);
+       return destnr;
+}
+
+/**
+ * canque_test_outslot - test and retrieve ready slot for given ends
+ * @qends: ends structure belonging to calling communication object
+ * @qedgep: place to store pointer to found edge
+ * @slotp: place to store pointer to received slot
+ *
+ * Function takes highest priority active incoming edge and retrieves
+ * oldest ready slot from it.
+ * Return Value: Negative value informs, that there is no ready output
+ *     slot for given ends. Positive value is equal to the command
+ *     slot has been allocated by the input side.
+ */
+int canque_test_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t **qedgep, struct canque_slot_t **slotp)
+{
+       can_spin_irqflags_t flags;
+       int prio;
+       struct canque_edge_t *edge;
+       int ret;
+       
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       for(prio=CANQUEUE_PRIO_NR;--prio>=0;){
+               while(!list_empty(&qends->active[prio])){
+                       edge=list_entry(qends->active[prio].next,struct canque_edge_t,activepeers);
+                       if(!canque_fifo_test_fl(&edge->fifo,DEAD)) {
+                               /* The first test on unlocked FIFO */
+                               if(canque_fifo_test_fl(&edge->fifo,EMPTY)) {
+                                       can_spin_lock(&edge->fifo.fifo_lock);
+                                       /* Test has to be repeated to ensure that EMPTY
+                                          state has not been nagated when locking FIFO */
+                                       if(canque_fifo_test_fl(&edge->fifo,EMPTY)) {
+                                               canque_fifo_set_fl(&edge->fifo,INACTIVE);
+                                               list_del(&edge->activepeers);
+                                               list_add(&edge->activepeers,&qends->idle);
+                                               can_spin_unlock(&edge->fifo.fifo_lock);
+                                               continue;
+                                       }
+                                       can_spin_unlock(&edge->fifo.fifo_lock);
+                               }
+                               canque_edge_incref(edge);
+                               can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+                               *qedgep=edge;
+                               DEBUGQUE("canque_test_outslot found edge %d\n",edge->edge_num);
+                               ret=canque_fifo_test_outslot(&edge->fifo, slotp);
+                               if(ret>=0)
+                                       return ret;
+
+                               canque_edge_decref(edge);
+                               can_spin_lock_irqsave(&qends->ends_lock, flags);
+                       } else {
+                               can_spin_lock(&edge->fifo.fifo_lock);
+                               canque_fifo_set_fl(&edge->fifo,INACTIVE);
+                               list_del(&edge->activepeers);
+                               list_add(&edge->activepeers,&qends->idle);
+                               can_spin_unlock(&edge->fifo.fifo_lock);
+                       }
+               }
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       *qedgep=NULL;
+       DEBUGQUE("canque_test_outslot no ready slot\n");
+       return -1;
+}
+
+/**
+ * canque_free_outslot - frees processed output slot
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: edge slot belong to
+ * @slot: pointer to the processed slot
+ *
+ * Function releases processed slot previously acquired by canque_test_outslot()
+ * function call.
+ * Return Value: Return value informs if input side has been notified
+ *     to know about change of edge state
+ */
+int canque_free_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+       ret=canque_fifo_free_outslot(&qedge->fifo, slot);
+       if(ret&CAN_FIFOF_EMPTY){
+               canque_notify_inends(qedge,CANQUEUE_NOTIFY_EMPTY);
+       }
+       if(ret&CAN_FIFOF_FULL)
+               canque_notify_inends(qedge,CANQUEUE_NOTIFY_SPACE);
+       can_spin_lock_irqsave(&qends->ends_lock, flags);
+       if((ret&CAN_FIFOF_EMPTY) || CANQUE_ROUNDROB ){
+               can_spin_lock(&qedge->fifo.fifo_lock);
+               if(canque_fifo_test_fl(&qedge->fifo,EMPTY)){
+                       canque_fifo_set_fl(&qedge->fifo,INACTIVE);
+                       list_del(&qedge->activepeers);
+                       list_add(&qedge->activepeers,&qends->idle);
+               } else{
+                       list_del(&qedge->activepeers);
+                       list_add_tail(&qedge->activepeers,&qends->active[qedge->edge_prio]);
+               }
+               can_spin_unlock(&qedge->fifo.fifo_lock);
+       }
+       can_spin_unlock_irqrestore(&qends->ends_lock, flags);
+       canque_edge_decref(qedge);
+       DEBUGQUE("canque_free_outslot for edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+/**
+ * canque_again_outslot - reschedule output slot to process it again later
+ * @qends: ends structure belonging to calling communication object
+ * @qedge: edge slot belong to
+ * @slot: pointer to the slot for re-processing
+ *
+ * Function reschedules slot previously acquired by canque_test_outslot()
+ * function call for second time processing.
+ * Return Value: Function cannot fail.
+ */
+int canque_again_outslot(struct canque_ends_t *qends,
+       struct canque_edge_t *qedge, struct canque_slot_t *slot)
+{
+       int ret;
+       ret=canque_fifo_again_outslot(&qedge->fifo, slot);
+       canque_edge_decref(qedge);
+       DEBUGQUE("canque_again_outslot for edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+/**
+ * canque_set_filt - sets filter for specified edge
+ * @qedge: pointer to the edge
+ * @filtid: ID to set for the edge
+ * @filtmask: mask used for ID match check
+ * @filtflags: required filer flags
+ *
+ * Return Value: Negative value is returned if edge is in the process of delete.
+ */
+int canque_set_filt(struct canque_edge_t *qedge,
+       unsigned long filtid, unsigned long filtmask, int filtflags)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+
+       can_spin_lock_irqsave(&qedge->fifo.fifo_lock,flags);
+       
+       if(!(filtflags&MSG_PROCESSLOCAL) && (processlocal<2))
+               filtflags |= MSG_LOCAL_MASK;
+       
+       qedge->filtid=canque_filtid2internal(filtid, filtflags);
+       qedge->filtmask=canque_filtid2internal(filtmask, filtflags>>MSG_FILT_MASK_SHIFT);
+       
+       if(canque_fifo_test_fl(&qedge->fifo,DEAD)) ret=-1;
+       else ret=canque_fifo_test_and_set_fl(&qedge->fifo,BLOCK)?1:0;
+
+       can_spin_unlock_irqrestore(&qedge->fifo.fifo_lock,flags);
+       if(ret>=0){
+               canque_notify_bothends(qedge,CANQUEUE_NOTIFY_FILTCH);
+       }
+       can_spin_lock_irqsave(&qedge->fifo.fifo_lock,flags);
+       if(!ret) canque_fifo_clear_fl(&qedge->fifo,BLOCK);
+       can_spin_unlock_irqrestore(&qedge->fifo.fifo_lock,flags);
+       
+       DEBUGQUE("canque_set_filt for edge %d, ID %ld, mask %ld, flags %d returned %d\n",
+                 qedge->edge_num,filtid,filtmask,filtflags,ret);
+       return ret;
+}
+
+/**
+ * canque_flush - fluesh all ready slots in the edge
+ * @qedge: pointer to the edge
+ *
+ * Tries to flush all allocated slots from the edge, but there could
+ * exist some slots associated to edge which are processed by input
+ * or output side and cannot be flushed at this moment.
+ * Return Value: The nonzero value indicates, that queue has not been
+ *     empty before the function call.
+ */
+int canque_flush(struct canque_edge_t *qedge)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+
+       ret=canque_fifo_flush_slots(&qedge->fifo);
+       if(ret){
+               canque_notify_inends(qedge,CANQUEUE_NOTIFY_EMPTY);
+               canque_notify_inends(qedge,CANQUEUE_NOTIFY_SPACE);
+               can_spin_lock_irqsave(&qedge->outends->ends_lock, flags);
+               can_spin_lock(&qedge->fifo.fifo_lock);
+               if(canque_fifo_test_fl(&qedge->fifo,EMPTY)){
+                       list_del(&qedge->activepeers);
+                       list_add(&qedge->activepeers,&qedge->outends->idle);
+               }
+               can_spin_unlock(&qedge->fifo.fifo_lock);
+               can_spin_unlock_irqrestore(&qedge->outends->ends_lock, flags);
+       }
+       DEBUGQUE("canque_flush for edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+/**
+ * canqueue_ends_init_gen - subsystem independent routine to initialize ends state
+ * @qends: pointer to the ends structure
+ *
+ * Return Value: Cannot fail.
+ */
+int canqueue_ends_init_gen(struct canque_ends_t *qends)
+{
+       int i;
+       qends->ends_flags=0;
+       for(i=CANQUEUE_PRIO_NR;--i>=0;){
+               INIT_LIST_HEAD(&qends->active[i]);
+       }
+       INIT_LIST_HEAD(&qends->idle);
+       INIT_LIST_HEAD(&qends->inlist);
+       INIT_LIST_HEAD(&qends->outlist);
+       can_spin_lock_init(&qends->ends_lock);
+       return 0;
+}
+
+
+/**
+ * canqueue_connect_edge - connect edge between two communication entities
+ * @qedge: pointer to edge
+ * @inends: pointer to ends the input of the edge should be connected to
+ * @outends: pointer to ends the output of the edge should be connected to
+ *
+ * Return Value: Negative value informs about failed operation.
+ */
+int canqueue_connect_edge(struct canque_edge_t *qedge, struct canque_ends_t *inends, struct canque_ends_t *outends)
+{
+       can_spin_irqflags_t flags;
+       if(qedge == NULL) return -1;
+       DEBUGQUE("canqueue_connect_edge %d\n",qedge->edge_num);
+       canque_edge_incref(qedge);
+       flags=canque_edge_lock_both_ends(inends, outends);
+       can_spin_lock(&qedge->fifo.fifo_lock);
+       qedge->inends=inends;
+       list_add(&qedge->inpeers,&inends->inlist);
+       qedge->outends=outends;
+       list_add(&qedge->outpeers,&outends->outlist);
+       list_add(&qedge->activepeers,&outends->idle);
+       can_spin_unlock(&qedge->fifo.fifo_lock);
+       canque_edge_unlock_both_ends(inends, outends, flags);
+       canque_notify_bothends(qedge, CANQUEUE_NOTIFY_ATTACH);
+
+       if(canque_fifo_test_and_set_fl(&qedge->fifo, READY))
+               canque_edge_decref(qedge);
+       return 0;
+}
+
+/**
+ * canqueue_disconnect_edge - disconnect edge from communicating entities
+ * @qedge: pointer to edge
+ *
+ * Return Value: Negative value means, that edge is used by somebody
+ *     other and cannot be disconnected. Operation has to be delayed.
+ */
+int canqueue_disconnect_edge(struct canque_edge_t *qedge)
+{
+       int ret;
+       can_spin_irqflags_t flags;
+       struct canque_ends_t *inends, *outends;
+
+       inends=qedge->inends;
+       outends=qedge->outends;
+
+       if(inends && outends) {
+               flags=canque_edge_lock_both_ends(inends, outends);
+       } else {
+               DEBUGQUE("canqueue_disconnect_edge called with not fully connected edge");
+               if(inends) can_spin_lock_irqsave(&inends->ends_lock,flags);
+               if(outends) can_spin_lock(&outends->ends_lock);
+               flags=0;
+       }
+       
+       can_spin_lock(&qedge->fifo.fifo_lock);
+       if(atomic_read(&qedge->edge_used)==0) {
+               if(qedge->outends){
+                       list_del(&qedge->activepeers);
+                       mb(); /* memory barrier for list_empty use in canque_dead_func */
+                       list_del(&qedge->outpeers);
+                       qedge->outends=NULL;
+               }
+               if(qedge->inends){
+                       list_del(&qedge->inpeers);
+                       qedge->inends=NULL;
+               }
+               ret=1;
+       } else ret=-1;
+       can_spin_unlock(&qedge->fifo.fifo_lock);
+
+       if(inends && outends) {
+               canque_edge_unlock_both_ends(inends, outends, flags);
+       } else {
+               if(outends) can_spin_unlock(&outends->ends_lock);
+               if(inends) can_spin_unlock_irqrestore(&inends->ends_lock,flags);
+       }
+
+       DEBUGQUE("canqueue_disconnect_edge %d returned %d\n",qedge->edge_num,ret);
+       return ret;
+}
+
+
+/**
+ * canqueue_block_inlist - block slot allocation of all outgoing edges of specified ends  
+ * @qends: pointer to ends structure
+ */
+void canqueue_block_inlist(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *edge;
+
+        canque_for_each_inedge(qends, edge) {
+               canque_fifo_set_fl(&edge->fifo,BLOCK);
+       }
+}
+
+
+/**
+ * canqueue_block_outlist - block slot allocation of all incoming edges of specified ends  
+ * @qends: pointer to ends structure
+ */
+void canqueue_block_outlist(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *edge;
+
+        canque_for_each_outedge(qends, edge) {
+               canque_fifo_set_fl(&edge->fifo,BLOCK);
+       }
+}
+
+
+/**
+ * canqueue_ends_kill_inlist - sends request to die to all outgoing edges
+ * @qends: pointer to ends structure
+ * @send_rest: select, whether already allocated slots should be processed
+ *     by FIFO output side
+ *
+ * Return Value: Non-zero value means, that not all edges could be immediately
+ *     disconnected and that ends structure memory release has to be delayed
+ */
+int canqueue_ends_kill_inlist(struct canque_ends_t *qends, int send_rest)
+{
+       struct canque_edge_t *edge;
+       
+       canque_for_each_inedge(qends, edge){
+               canque_notify_bothends(edge, CANQUEUE_NOTIFY_DEAD_WANTED);
+               if(send_rest){
+                       canque_edge_incref(edge);
+                       if(!canque_fifo_test_and_set_fl(&edge->fifo, FREEONEMPTY)){
+                               if(!canque_fifo_test_fl(&edge->fifo, EMPTY))
+                                       continue;
+                               if(!canque_fifo_test_and_clear_fl(&edge->fifo, FREEONEMPTY))
+                                       continue;
+                       }
+                       canque_edge_decref(edge);
+               }
+       }
+       return list_empty(&qends->inlist)?0:1;
+}
+
+
+/**
+ * canqueue_ends_kill_outlist - sends request to die to all incoming edges
+ * @qends: pointer to ends structure
+ *
+ * Return Value: Non-zero value means, that not all edges could be immediately
+ *     disconnected and that ends structure memory release has to be delayed
+ */
+int canqueue_ends_kill_outlist(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *edge;
+       
+       canque_for_each_outedge(qends, edge){
+               canque_notify_bothends(edge, CANQUEUE_NOTIFY_DEAD_WANTED);
+       }
+       return list_empty(&qends->outlist)?0:1;
+}
+
+
+/**
+ * canqueue_ends_filt_conjuction - computes conjunction of incoming edges filters filters
+ * @qends: pointer to ends structure
+ * @filt: pointer the filter structure filled by computed filters conjunction
+ *
+ * Return Value: Number of incoming edges
+ */
+int canqueue_ends_filt_conjuction(struct canque_ends_t *qends, struct canfilt_t *filt)
+{
+       struct canque_edge_t *edge;
+       int cnt=0;
+       unsigned long filtid=0;
+       unsigned long filtmask=~0;
+       unsigned long local_only=canque_filtid2internal(0,MSG_LOCAL);
+
+       canque_for_each_inedge(qends, edge){
+               /* skip edges processing only local messages */
+               if(edge->filtid & edge->filtmask & local_only)
+                       continue;
+
+               if(!cnt++)
+                       filtid = edge->filtid;
+               else
+                       filtmask &= ~(filtid ^ edge->filtid);
+       
+               filtmask &= edge->filtmask;
+       }
+       
+       filt->id = filtid & MSG_ID_MASK;
+       filt->mask = filtmask & MSG_ID_MASK;
+       filtid >>= 28;
+       filtmask >>= 28;
+       filt->flags = filtid & MSG_EXT;
+       if(filtmask & (MSG_EXT))
+               filt->flags |= MSG_EXT_MASK;
+       if(filtid & (MSG_RTR<<1))
+               filt->flags |= MSG_RTR<<1;
+       if(filtmask & (MSG_RTR<<1))
+               filt->flags |= MSG_RTR_MASK;
+       return cnt;
+}
+
+
+/**
+ * canqueue_ends_flush_inlist - flushes all messages in incoming edges
+ * @qends: pointer to ends structure
+ *
+ * Return Value: Negative value informs about unsuccessful result
+ */
+int canqueue_ends_flush_inlist(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *edge;
+       
+       canque_for_each_inedge(qends, edge){
+               canque_flush(edge);
+       }
+       return 0;
+}
+
+
+/**
+ * canqueue_ends_flush_outlist - flushes all messages in outgoing edges
+ * @qends: pointer to ends structure
+ *
+ * Return Value: Negative value informs about unsuccessful result
+ */
+int canqueue_ends_flush_outlist(struct canque_ends_t *qends)
+{
+       struct canque_edge_t *edge;
+       
+       canque_for_each_outedge(qends, edge){
+               canque_flush(edge);
+       }
+       return 0;
+}
+
+
+
+
diff --git a/lincan-0.3.3/src/cc_can104.c b/lincan-0.3.3/src/cc_can104.c
new file mode 100644 (file)
index 0000000..2dafc3d
--- /dev/null
@@ -0,0 +1,238 @@
+/* cc_can104.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/cc_can104.h"
+#include "../include/sja1000.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x80
+
+/**
+ * template_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function template_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int cc104_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * template_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function template_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int cc104_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * template_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int cc104_reset(struct candevice_t *candev)
+{
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * template_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int cc104_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=1;
+        candev->nr_all_chips=1;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * template_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function template_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int cc104_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       sja1000_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->flags = 0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL |
+                                                               sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * template_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function template_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int cc104_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       
+       return 0;
+}
+
+/**
+ * template_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int cc104_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * template_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function template_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void cc104_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address);
+}
+
+/**
+ * template_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function template_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned cc104_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+/* !!! Don't change this function !!! */
+int cc104_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = cc104_request_io;
+       hwspecops->release_io = cc104_release_io;
+       hwspecops->reset = cc104_reset;
+       hwspecops->init_hw_data = cc104_init_hw_data;
+       hwspecops->init_chip_data = cc104_init_chip_data;
+       hwspecops->init_obj_data = cc104_init_obj_data;
+       hwspecops->write_register = cc104_write_register;
+       hwspecops->read_register = cc104_read_register;
+       hwspecops->program_irq = cc104_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/close.c b/lincan-0.3.3/src/close.c
new file mode 100644 (file)
index 0000000..e39b3b1
--- /dev/null
@@ -0,0 +1,59 @@
+/* close.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/close.h"
+#include "../include/setup.h"
+#include "../include/fasync.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+int can_close(struct inode *inode, struct file *file)
+{
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct canque_ends_t *qends;
+       struct msgobj_t *obj;
+       can_spin_irqflags_t iflags;
+       
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_close: bad canuser magic\n");
+               return -ENODEV;
+       }
+       
+       obj = canuser->msgobj;
+       qends = canuser->qends;
+       
+    #ifdef CAN_ENABLE_KERN_FASYNC
+
+       can_fasync(-1, file, 0);
+
+    #endif /*CAN_ENABLE_KERN_FASYNC*/
+
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       list_del(&canuser->peers);
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+       canuser->qends = NULL;
+       canqueue_ends_dispose_kern(qends, file->f_flags & O_SYNC);
+
+       kfree(canuser);
+
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       if(atomic_dec_and_test(&obj->obj_used)){
+               can_msgobj_clear_fl(obj,OPENED);
+       };
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+       
+    #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50))
+       MOD_DEC_USE_COUNT;
+    #endif
+       return 0;
+}
diff --git a/lincan-0.3.3/src/close_rtl.c b/lincan-0.3.3/src/close_rtl.c
new file mode 100644 (file)
index 0000000..c4adc71
--- /dev/null
@@ -0,0 +1,72 @@
+/* close.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <rtl_malloc.h>
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+static inline
+int can_release_rtl_common(struct canuser_t *canuser, int file_flags)
+{
+       struct canque_ends_t *qends;
+       struct msgobj_t *obj;
+       can_spin_irqflags_t iflags;
+
+       obj = canuser->msgobj;
+       qends = canuser->qends;
+
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       list_del(&canuser->peers);
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+       canuser->qends = NULL;
+       canqueue_ends_dispose_rtl(qends, file_flags & O_SYNC);
+
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       if(atomic_dec_and_test(&obj->obj_used)){
+               can_msgobj_clear_fl(obj,OPENED);
+       };
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+
+    #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50))
+       MOD_DEC_USE_COUNT;
+    #endif
+
+       return 0;
+}
+
+
+int can_release_rtl_posix(struct rtl_file *fptr)
+{
+       struct canuser_t *canuser =
+               (struct canuser_t *)can_get_rtl_file_private_data(fptr);
+       int ret;
+       
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_release_rtl_posix: bad canuser magic\n");
+               return -ENODEV;
+       }
+
+       ret=can_release_rtl_common(canuser, fptr->f_flags);
+
+       rt_free(canuser);
+       
+       return ret;
+}
+
+#endif /*CAN_WITH_RTL*/
+
diff --git a/lincan-0.3.3/src/devcommon.c b/lincan-0.3.3/src/devcommon.c
new file mode 100644 (file)
index 0000000..2af0f86
--- /dev/null
@@ -0,0 +1,131 @@
+/* devcommon.c - common device code
+ * Linux CAN-bus device driver.
+ * New CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/can_queue.h"
+#include "../include/main.h"
+#include "../include/devcommon.h"
+
+#ifdef CAN_WITH_RTL
+static inline
+void canqueue_wake_chip_worker(struct canque_ends_t *qends, struct canchip_t *chip, struct msgobj_t *obj)
+{
+       if(qends->endinfo.chipinfo.worker_thread){
+               can_msgobj_set_fl(obj,WORKER_WAKE);
+               pthread_kill(qends->endinfo.chipinfo.worker_thread,RTL_SIGNAL_WAKEUP);
+               rtl_schedule();
+       } else {
+               set_bit(MSGOBJ_TX_REQUEST_b,&chip->pend_flags);
+               if(chip->worker_thread) {
+                       set_bit(MSGOBJ_WORKER_WAKE_b,&chip->pend_flags);
+                       pthread_kill(chip->worker_thread,RTL_SIGNAL_WAKEUP);
+                       rtl_schedule();
+               }
+       }
+}
+
+#endif /*CAN_WITH_RTL*/
+
+
+/**
+ * canqueue_notify_chip - notification callback handler for CAN chips ends of queues
+ * @qends: pointer to the callback side ends structure
+ * @qedge: edge which invoked notification 
+ * @what: notification type
+ *
+ * This function has to deal with more possible cases. It can be called from
+ * the kernel or interrupt context for Linux only compilation of driver.
+ * The function can be called from kernel context or RT-Linux thread context
+ * for mixed mode Linux/RT-Linux compilation.
+ */
+void canqueue_notify_chip(struct canque_ends_t *qends, struct canque_edge_t *qedge, int what)
+{
+       struct canchip_t *chip=qends->endinfo.chipinfo.chip;
+       struct msgobj_t *obj=qends->endinfo.chipinfo.msgobj;
+
+       DEBUGMSG("canqueue_notify_chip for edge %d and event %d\n",qedge->edge_num,what);
+       switch(what){
+               /*case CANQUEUE_NOTIFY_EMPTY:*/
+               /*case CANQUEUE_NOTIFY_SPACE:*/
+               /*case CANQUEUE_NOTIFY_NOUSR:
+                       wake_up(&qends->endinfo.chipinfo.daemonq);
+                       break;*/
+               case CANQUEUE_NOTIFY_PROC:
+                   #ifndef CAN_WITH_RTL
+                       /*wake_up(&qends->endinfo.chipinfo.daemonq);*/
+                       chip->chipspecops->wakeup_tx(chip, obj);
+                   #else /*CAN_WITH_RTL*/
+                       can_msgobj_set_fl(obj,TX_REQUEST);
+                       canqueue_wake_chip_worker(qends, chip, obj);
+                   #endif /*CAN_WITH_RTL*/
+                       break;
+               case CANQUEUE_NOTIFY_DEAD_WANTED:
+               case CANQUEUE_NOTIFY_DEAD:
+                       if(canque_fifo_test_and_clear_fl(&qedge->fifo, READY))
+                               canque_edge_decref(qedge);
+                       break;
+               case CANQUEUE_NOTIFY_ATTACH:
+                       break;
+               case CANQUEUE_NOTIFY_FILTCH:
+                       if(!chip->chipspecops->filtch_rq)
+                               break;
+                   #ifndef CAN_WITH_RTL
+                       chip->chipspecops->filtch_rq(chip, obj);
+                   #else /*CAN_WITH_RTL*/
+                       can_msgobj_set_fl(obj,FILTCH_REQUEST);
+                       canqueue_wake_chip_worker(qends, chip, obj);
+                   #endif /*CAN_WITH_RTL*/
+                       
+                       break;
+       }
+}
+
+
+/**
+ * canqueue_ends_init_chip - CAN chip specific ends initialization
+ * @qends: pointer to the ends structure
+ * @chip: pointer to the corresponding CAN chip structure
+ * @obj: pointer to the corresponding message object structure
+ */
+int canqueue_ends_init_chip(struct canque_ends_t *qends, struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int ret;
+       ret=canqueue_ends_init_gen(qends);
+       if(ret<0) return ret;
+       
+       qends->context=NULL;
+    #ifndef CAN_WITH_RTL
+       init_waitqueue_head(&qends->endinfo.chipinfo.daemonq);
+    #endif /*CAN_WITH_RTL*/
+       qends->endinfo.chipinfo.chip=chip;
+       qends->endinfo.chipinfo.msgobj=obj;
+       qends->notify=canqueue_notify_chip;
+
+       DEBUGMSG("canqueue_ends_init_chip\n");
+       return 0;
+}
+
+
+/**
+ * canqueue_ends_done_chip - finalizing of the ends structure for CAN chips
+ * @qends: pointer to ends structure
+ *
+ * Return Value: Function should be designed such way to not fail.
+ */
+int canqueue_ends_done_chip(struct canque_ends_t *qends)
+{
+       int delayed;
+       
+       /* Finish or kill all outgoing edges listed in inends */
+       delayed=canqueue_ends_kill_inlist(qends, 1);
+       /* Kill all incoming edges listed in outends */
+       delayed|=canqueue_ends_kill_outlist(qends);
+
+       return delayed;
+}
diff --git a/lincan-0.3.3/src/eb8245.c b/lincan-0.3.3/src/eb8245.c
new file mode 100644 (file)
index 0000000..b871305
--- /dev/null
@@ -0,0 +1,279 @@
+/* eb8245.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/eb8245.h"
+#include "../include/sja1000p.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x100
+
+/**
+ * eb8245_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function eb8245_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/eb8245.c
+ */
+int eb8245_request_io(struct candevice_t *candev)
+{
+        int remap_addr;
+       
+       if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - eb8245")) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,IO_RANGE);
+               return -ENODEV;
+       
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       return 0;
+}
+
+/**
+ * eb8245_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function eb8245_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/eb8245.c
+ */
+int eb8245_release_io(struct candevice_t *candev)
+{
+       /* release I/O memory mapping */
+       iounmap((void*)candev->dev_base_addr);
+       can_release_mem_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * eb8245_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function eb8245_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/eb8245.c
+ */
+int eb8245_reset(struct candevice_t *candev)
+{
+       int i;
+       struct canchip_t *chip=candev->chip[0];
+       unsigned cdr;
+       
+       eb8245_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+       udelay(1000);
+       
+       cdr=eb8245_read_register(chip->chip_base_addr+SJACDR);
+       eb8245_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       eb8245_write_register(0, chip->chip_base_addr+SJAIER);
+
+       i=20;
+       eb8245_write_register(0, chip->chip_base_addr+SJAMOD);
+       while (eb8245_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+               if(!i--) return -ENODEV;
+               udelay(1000);
+               eb8245_write_register(0, chip->chip_base_addr+SJAMOD);
+       }
+
+       cdr=eb8245_read_register(chip->chip_base_addr+SJACDR);
+       eb8245_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       eb8245_write_register(0, chip->chip_base_addr+SJAIER);
+       
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * eb8245_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function eb8245_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/eb8245.c
+ */
+int eb8245_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=1;
+       candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+/**
+ * eb8245_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function eb8245_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/eb8245.c
+ */
+int eb8245_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * eb8245_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function eb8245_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/eb8245.c
+ */
+int eb8245_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+/**
+ * eb8245_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function eb8245_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/eb8245.c
+ */
+int eb8245_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * eb8245_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function eb8245_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/eb8245.c
+ */
+void eb8245_write_register(unsigned data, unsigned long address)
+{
+       /*DEBUGMSG("eb8245_write_register: addr=0x%lx data=0x%x",
+               address,data);*/
+       writeb(data,address);
+}
+
+/**
+ * eb8245_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function eb8245_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/eb8245.c
+ */
+unsigned eb8245_read_register(unsigned long address)
+{
+       return readb(address);
+}
+
+/* !!! Don't change this function !!! */
+int eb8245_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = eb8245_request_io;
+       hwspecops->release_io = eb8245_release_io;
+       hwspecops->reset = eb8245_reset;
+       hwspecops->init_hw_data = eb8245_init_hw_data;
+       hwspecops->init_chip_data = eb8245_init_chip_data;
+       hwspecops->init_obj_data = eb8245_init_obj_data;
+       hwspecops->write_register = eb8245_write_register;
+       hwspecops->read_register = eb8245_read_register;
+       hwspecops->program_irq = eb8245_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/ems_cpcpci.c b/lincan-0.3.3/src/ems_cpcpci.c
new file mode 100644 (file)
index 0000000..d20e281
--- /dev/null
@@ -0,0 +1,373 @@
+/* ems_cpcpci.c - support for EMS-WUENSCHE CPC-PCI card
+ * Linux CAN-bus device driver.
+ * The card support added by Paolo Grisleri <grisleri@ce.unipr.it>
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#ifdef CAN_ENABLE_PCI_SUPPORT
+
+
+/* the only one supported: EMS CPC-PCI */
+// PGX: check identifiers name
+# define EMS_CPCPCI_PCICAN_VENDOR 0x110a
+# define EMS_CPCPCI_PCICAN_ID 0x2104
+
+/*The Infineon PSB4610 PITA-2 is used as PCI to local bus bridge*/
+/*BAR0 - MEM - bridge control registers*/
+
+/*BAR1 - MEM - parallel interface*/
+/* 0 more EMS control registers
+ * 0x400 the first SJA1000
+ * 0x600 the second SJA1000
+ * each register occupies 4 bytes
+ */
+
+/*PSB4610 PITA-2 bridge control registers*/   
+#define PITA2_ICR  0x00  /* Interrupt Control Register */
+#define   PITA2_ICR_INT0    0x00000002 /* [RC] INT0 Active/Clear */
+#define   PITA2_ICR_GP0_INT 0x00000004 /* [RC] GP0 Interrupt */
+                                       /* GP0_Int_En=1, GP0_Out_En=0 and low detected */
+#define   PITA2_ICR_GP1_INT 0x00000008 /* [RC] GP1 Interrupt */
+#define   PITA2_ICR_GP2_INT 0x00000010 /* [RC] GP2 Interrupt */
+#define   PITA2_ICR_GP3_INT 0x00000020 /* [RC] GP2 Interrupt */
+#define   PITA2_ICR_INT0_En 0x00020000 /* [RW] Enable INT0 */
+
+#define PITA2_MISC 0x1C  /* Miscellaneous Register */
+#define   PITA2_MISC_CONFIG 0x04000000
+                        /* Multiplexed Parallel_interface_mode */
+
+#define EMS_CPCPCI_BYTES_PER_CIRCUIT 0x200
+/* Each CPC register occupies 4 bytes */
+#define EMS_CPCPCI_BYTES_PER_REG     0x4
+
+// Standard value: Pushpull  (OCTP1|OCTN1|OCTP0|OCTN0|OCM1)
+#define EMS_CPCPCI_OCR_DEFAULT_STD 0xDA
+// For Galathea piggyback.
+#define EMS_CPCPCI_OCR_DEFAULT_GAL 0xDB
+
+/*
+
+The board configuration is probably following: 
+" RX1 is connected to ground. 
+" TX1 is not connected. 
+" CLKO is not connected. 
+" Setting the OCR register to 0xDA is a good idea. 
+  This means  normal output mode , push-pull and the correct polarity. 
+" In the CDR register, you should set CBP to 1. 
+  You will probably also want to set the clock divider value to 7
+  (meaning direct oscillator output) because the second SJA1000 chip 
+  is driven by the first one CLKOUT output.
+
+*/
+
+
+
+void ems_cpcpci_disconnect_irq(struct candevice_t *candev)
+{
+       /* Disable interrupts from card */
+       writel(0, candev->dev_base_addr + PITA2_ICR);
+}
+
+void ems_cpcpci_connect_irq(struct candevice_t *candev)
+{
+       /* Enable interrupts from card */
+       writel(PITA2_ICR_INT0_En, candev->dev_base_addr + PITA2_ICR);
+}
+
+
+int ems_cpcpci_request_io(struct candevice_t *candev)
+{
+       unsigned long pita2_addr;
+       unsigned long io_addr;
+       int i;
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       if(pci_request_region(candev->sysdevptr.pcidev, 0, "ems_cpcpci_pita2") != 0){
+               CANMSG("Request of ems_cpcpci_pita2 range failed\n");
+               return -ENODEV;
+       }else if(pci_request_region(candev->sysdevptr.pcidev, 1, "ems_cpcpci_io") != 0){
+               CANMSG("Request of ems_cpcpci_io range failed\n");
+               goto error_io;
+       }
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       if(pci_request_regions(candev->sysdevptr.pcidev, "EMS_CPCPCI") != 0){
+               CANMSG("Request of ems_cpcpci_s5920 regions failed\n");
+               return -ENODEV;
+       }
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       pita2_addr=pci_resource_start(candev->sysdevptr.pcidev,0);
+       if (!(candev->dev_base_addr = (long) ioremap(pita2_addr, 
+             pci_resource_len(candev->sysdevptr.pcidev,0)))) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", pita2_addr);
+               goto error_ioremap_pita2;
+       }
+
+       io_addr=pci_resource_start(candev->sysdevptr.pcidev,1);;
+       if (!(candev->io_addr = (long) ioremap(io_addr,
+             pci_resource_len(candev->sysdevptr.pcidev,1)))) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", io_addr);
+               goto error_ioremap_io;
+       }
+
+       candev->res_addr=candev->io_addr;
+       
+       /* 
+        * this is redundant with chip initialization, but remap address 
+        * can change when resources are temporarily released
+        */
+       for(i=0;i<candev->nr_all_chips;i++) {
+               struct canchip_t *chip=candev->chip[i];
+               if(!chip) continue;
+               chip->chip_base_addr = candev->io_addr+
+                       0x400 + i*EMS_CPCPCI_BYTES_PER_CIRCUIT;
+               if(!chip->msgobj[0]) continue;
+               chip->msgobj[0]->obj_base_addr=chip->chip_base_addr;
+       }
+
+       /* Configure PITA-2 parallel interface */
+       writel(PITA2_MISC_CONFIG, candev->dev_base_addr + PITA2_MISC);
+
+       ems_cpcpci_disconnect_irq(candev);
+
+       return 0;
+
+    error_ioremap_io:
+       iounmap((void*)candev->dev_base_addr);
+    error_ioremap_pita2:
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+    error_io:
+       pci_release_region(candev->sysdevptr.pcidev, 0);
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(candev->sysdevptr.pcidev);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       
+       return -ENODEV;
+}
+
+int ems_cpcpci_release_io(struct candevice_t *candev)
+{
+       ems_cpcpci_disconnect_irq(candev);
+
+       iounmap((void*)candev->io_addr);
+       iounmap((void*)candev->dev_base_addr);
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+       pci_release_region(candev->sysdevptr.pcidev, 0);
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(candev->sysdevptr.pcidev);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       return 0;
+}
+
+
+void ems_cpcpci_write_register(unsigned data, unsigned long address)
+{
+       address += ((address&(EMS_CPCPCI_BYTES_PER_CIRCUIT-1))
+                           *(EMS_CPCPCI_BYTES_PER_REG-1));
+       writeb(data,address); 
+}
+
+unsigned ems_cpcpci_read_register(unsigned long address)
+{
+       address += ((address&(EMS_CPCPCI_BYTES_PER_CIRCUIT-1))
+                           *(EMS_CPCPCI_BYTES_PER_REG-1));
+       return readb(address);
+}
+
+int ems_cpcpci_irq_handler(int irq, struct canchip_t *chip)
+{
+       //struct canchip_t *chip=(struct canchip_t *)dev_id;
+       struct candevice_t *candev=chip->hostdevice;
+       int i;
+       unsigned long icr;
+       int test_irq_again;
+
+       icr=readl(candev->dev_base_addr + PITA2_ICR);
+       if(!(icr & PITA2_ICR_INT0)) return CANCHIP_IRQ_NONE;
+       
+       /* correct way to handle interrupts from all chips connected to the one PITA-2 */
+       do {
+               writel(PITA2_ICR_INT0_En | PITA2_ICR_INT0, candev->dev_base_addr + PITA2_ICR);
+               test_irq_again=0;
+               for(i=0;i<candev->nr_all_chips;i++){
+                       chip=candev->chip[i];
+                       if(!chip || !(chip->flags&CHIP_CONFIGURED))
+                               continue;
+                       if(sja1000p_irq_handler(irq, chip))
+                               test_irq_again=1;
+               }
+               icr=readl(candev->dev_base_addr + PITA2_ICR);
+       } while((icr & PITA2_ICR_INT0)||test_irq_again);
+       return CANCHIP_IRQ_HANDLED;
+}
+
+int ems_cpcpci_reset(struct candevice_t *candev)
+{
+       int i=0,chip_nr;
+       struct canchip_t *chip;
+       unsigned cdr;
+
+       DEBUGMSG("Resetting EMS_CPCPCI hardware ...\n");
+
+       /* Assert PTADR# - we're in passive mode so the other bits are not important */
+
+       ems_cpcpci_disconnect_irq(candev);
+
+       for(chip_nr=0;chip_nr<candev->nr_all_chips;chip_nr++){
+               if(!candev->chip[chip_nr]) continue;
+               chip=candev->chip[chip_nr];
+
+               ems_cpcpci_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+               udelay(1000);
+
+               cdr=ems_cpcpci_read_register(chip->chip_base_addr+SJACDR);
+               ems_cpcpci_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               ems_cpcpci_write_register(0, chip->chip_base_addr+SJAIER);
+
+               i=20;
+               ems_cpcpci_write_register(0, chip->chip_base_addr+SJAMOD);
+               while (ems_cpcpci_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+                       if(!i--) return -ENODEV;
+                       udelay(1000);
+                       ems_cpcpci_write_register(0, chip->chip_base_addr+SJAMOD);
+               }
+
+               cdr=ems_cpcpci_read_register(chip->chip_base_addr+SJACDR);
+               ems_cpcpci_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               ems_cpcpci_write_register(0, chip->chip_base_addr+SJAIER);
+               
+               ems_cpcpci_read_register(chip->chip_base_addr+SJAIR);
+       }
+       
+
+       ems_cpcpci_connect_irq(candev);
+
+       return 0;
+}      
+
+int ems_cpcpci_init_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = NULL;
+       int i;
+       unsigned long l;
+
+       pcidev = pci_find_device(EMS_CPCPCI_PCICAN_VENDOR, EMS_CPCPCI_PCICAN_ID, pcidev);
+       if(pcidev == NULL) return -ENODEV;
+       
+       if (pci_enable_device (pcidev)){
+               printk(KERN_CRIT "Setup of EMS_CPCPCI failed\n");
+               return -EIO;
+       }
+       candev->sysdevptr.pcidev=pcidev;
+       
+       for(i=0;i<2;i++){
+               if(!(pci_resource_flags(pcidev,0)&IORESOURCE_MEM)){
+                       printk(KERN_CRIT "EMS_CPCPCI region %d is not memory\n",i);
+                       return -EIO;
+               }
+       }
+
+       /*request IO access temporarily to check card presence*/
+       if(ems_cpcpci_request_io(candev)<0)
+               return -ENODEV;
+
+       /*** candev->dev_base_addr=pci_resource_start(pcidev,0); ***/
+       /* some control registers */
+       /*** candev->io_addr=pci_resource_start(pcidev,1); ***/
+       /* 0 more EMS control registers
+         * 0x400 the first SJA1000
+         * 0x600 the second SJA1000
+         * each register occupies 4 bytes
+         */
+       
+       /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/
+       
+       for(l=0,i=0;i<4;i++){
+               l<<=8;
+               l|=readb(candev->io_addr + i*4);
+       }
+       i=readb(candev->io_addr + i*5);
+       
+       CANMSG("EMS CPC-PCI check value %04lx, ID %d\n", l, i);
+       
+       if(l!=0x55aa01cb) {
+               CANMSG("EMS CPC-PCI unexpected check values\n");
+       }
+
+       /*if (!strcmp(candev->hwname,"ems_cpcpci"))*/
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=2;
+       candev->nr_all_chips=2;
+
+       ems_cpcpci_release_io(candev);
+        
+       return 0;
+}
+
+int ems_cpcpci_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       if(candev->sysdevptr.pcidev==NULL)
+               return -ENODEV;
+
+       /* initialize common routines for the SJA1000 chip */
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       
+       /* special version of the IRQ handler is required for CPC-PCI board */
+       candev->chip[chipnr]->chipspecops->irq_handler=ems_cpcpci_irq_handler;
+
+       candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
+
+       candev->chip[chipnr]->chip_base_addr = candev->io_addr+
+                       0x400 + chipnr*EMS_CPCPCI_BYTES_PER_CIRCUIT;
+       candev->chip[chipnr]->flags = 0;
+       candev->chip[chipnr]->int_cpu_reg = 0;
+       candev->chip[chipnr]->int_clk_reg = 0;
+       candev->chip[chipnr]->int_bus_reg = 0;
+       /* CLKOUT has to be equal to oscillator frequency to drive second chip */
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | 7;
+       candev->chip[chipnr]->sja_ocr_reg = EMS_CPCPCI_OCR_DEFAULT_STD;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->flags |= CHIP_IRQ_PCI;
+
+       return 0;
+}      
+
+int ems_cpcpci_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+int ems_cpcpci_program_irq(struct candevice_t *candev)
+{
+
+       return 0;
+}
+
+int ems_cpcpci_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = ems_cpcpci_request_io;
+       hwspecops->release_io = ems_cpcpci_release_io;
+       hwspecops->reset = ems_cpcpci_reset;
+       hwspecops->init_hw_data = ems_cpcpci_init_hw_data;
+       hwspecops->init_chip_data = ems_cpcpci_init_chip_data;
+       hwspecops->init_obj_data = ems_cpcpci_init_obj_data;
+       hwspecops->write_register = ems_cpcpci_write_register;
+       hwspecops->read_register = ems_cpcpci_read_register;
+       hwspecops->program_irq = ems_cpcpci_program_irq;
+       return 0;
+}
+
+
+#endif /*CAN_ENABLE_PCI_SUPPORT*/
diff --git a/lincan-0.3.3/src/fasync.c b/lincan-0.3.3/src/fasync.c
new file mode 100644 (file)
index 0000000..0bcdc5f
--- /dev/null
@@ -0,0 +1,42 @@
+/* open.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/fasync.h"
+
+#ifdef CAN_ENABLE_KERN_FASYNC
+
+int can_fasync(int fd, struct file *file, int on)
+{
+       int retval;
+       
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct canque_ends_t *qends;
+       
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_close: bad canuser magic\n");
+               return -ENODEV;
+       }
+       
+       qends = canuser->qends;
+
+       retval = fasync_helper(fd, file, on, &qends->endinfo.fileinfo.fasync);
+
+       if (retval < 0)
+               return retval;
+       return 0;
+}
+
+
+
+
+
+#endif /*CAN_ENABLE_KERN_FASYNC*/
diff --git a/lincan-0.3.3/src/finish.c b/lincan-0.3.3/src/finish.c
new file mode 100644 (file)
index 0000000..f10f309
--- /dev/null
@@ -0,0 +1,135 @@
+/* finish.c - finalization of the driver operation
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/devcommon.h"
+#include "../include/finish.h"
+#include "../include/setup.h"
+
+
+/**
+ * msgobj_done - destroys one CAN message object
+ * @obj: pointer to CAN message object structure
+ */
+void msgobj_done(struct msgobj_t *obj)
+{
+       int delayed=0;
+       if(obj->qends) {
+               delayed=canqueue_ends_done_chip(obj->qends);
+               if(delayed < 0)
+                       CANMSG("msgobj_done: problem with chip queue ends\n");
+       }
+
+       if((obj->hostchip) && (obj->object>0)) {
+               if(obj->hostchip->msgobj[obj->object-1] == obj)
+                       obj->hostchip->msgobj[obj->object-1]=NULL;
+               else
+                       CANMSG("msgobj_done: not registered in the canchip_t\n");
+               obj->hostchip=NULL;
+       }
+       
+       if((obj->minor>=0)) {
+               if(objects_p[obj->minor] == obj)
+                       objects_p[obj->minor] = NULL;
+               else
+                       CANMSG("msgobj_done: not registered as minor\n");
+       }
+       
+       del_timer_sync(&obj->tx_timeout);
+
+       if(obj->qends) {
+               /*delayed free could be required there in the future,
+                 actual use patter cannot generate such situation*/
+               if(!delayed) {
+                       can_checked_free(obj->qends);
+               }
+       }
+       obj->qends=NULL;
+}
+
+
+/**
+ * canchip_done - destroys one CAN chip representation
+ * @chip: pointer to CAN chip structure
+ */
+void canchip_done(struct canchip_t *chip)
+{
+
+       int i;
+       struct msgobj_t *obj;
+
+       if(chip->flags & CHIP_ATTACHED)
+               chip->chipspecops->release_chip(chip);
+
+       if((chip->hostdevice) && (chip->chip_idx>=0)) {
+               if(chip->hostdevice->chip[chip->chip_idx] == chip)
+                       chip->hostdevice->chip[chip->chip_idx] = NULL;
+               else
+                       CANMSG("canchip_done: not registered in hostdevice\n");
+       }
+
+       can_chip_free_irq(chip);
+               
+       can_synchronize_irq(chip->chip_irq);
+       
+       for(i=0; i<chip->max_objects; i++){
+               if((obj=chip->msgobj[i])==NULL)
+                       continue;
+               msgobj_done(obj);
+               can_checked_free(obj);
+       }
+       
+       can_checked_free(chip->chipspecops);
+       chip->chipspecops=NULL;
+
+}
+
+/**
+ * candevice_done - destroys representation of one CAN device/board
+ * @candev: pointer to CAN device/board structure
+ */
+void candevice_done(struct candevice_t *candev)
+{
+       int i;
+       struct canchip_t *chip;
+       
+       for(i=0; i<candev->nr_all_chips; i++){
+               if((chip=candev->chip[i])==NULL)
+                       continue;
+               canchip_done(chip);
+               can_checked_free(chip);
+       
+       }
+       if(candev->flags & CANDEV_IO_RESERVED) {
+               candev->hwspecops->release_io(candev);
+               candev->flags &= ~CANDEV_IO_RESERVED;
+       }
+       can_checked_free(candev->hwspecops);
+       candev->hwspecops=NULL;
+}
+
+/**
+ * candevice_done - destroys representation of all CAN devices/boards
+ * @canhw: pointer to the root of all CAN hardware representation
+ */
+void canhardware_done(struct canhardware_t *canhw)
+{
+       int i;
+       struct candevice_t *candev;
+       
+       for(i=0; i<canhw->nr_boards; i++){
+               if((candev=canhw->candevice[i])==NULL)
+                       continue;
+               candevice_done(candev);
+               can_checked_free(candev);
+       }
+
+}
diff --git a/lincan-0.3.3/src/hms30c7202_can.c b/lincan-0.3.3/src/hms30c7202_can.c
new file mode 100644 (file)
index 0000000..1a18904
--- /dev/null
@@ -0,0 +1,432 @@
+/* hms30c7202_can.c - Hynix HMS30c7202 ARM device specific code
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include <linux/delay.h>
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/c_can.h"
+#include "../include/hms30c7202_can.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x17E
+
+/**
+ * hms30c7202_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function hms30c7202_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int hms30c7202_request_io(struct candevice_t *candev)
+{
+       DEBUGMSG("(c%d)calling hms30c7202_request_io(...)\n", candev->chip[0]->chip_idx);
+
+       if(!can_request_mem_region(candev->io_addr, IO_RANGE, DEVICE_NAME )) {
+               CANMSG("hmsc30c7202_can failed to request mem region %lx.\n",
+               (unsigned long)candev->io_addr );
+       }
+       
+       if (!( candev->dev_base_addr = (long)ioremap( candev->io_addr, IO_RANGE ))) {
+               DEBUGMSG( "Failed to map IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
+                       (unsigned long)candev->io_addr,
+                       (unsigned long)candev->io_addr + IO_RANGE - 1,
+                       (unsigned long)candev->dev_base_addr);
+               can_release_mem_region(candev->io_addr, IO_RANGE);
+               return -ENODEV;
+       } else {
+       
+               DEBUGMSG( "Mapped IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
+                       (unsigned long)candev->io_addr,
+                       (unsigned long)candev->io_addr + IO_RANGE - 1,
+                       (unsigned long)candev->dev_base_addr);
+       
+       }
+       
+       candev->chip[0]->chip_base_addr=candev->dev_base_addr;
+       
+       //pchip->write_register(0, pchip->vbase_addr + CCCR);
+       //DEBUGMSG("C-CAN Control Register : 0x%.4lx\n",
+       //      (unsigned long)(c_can_read_reg_w( pchip->vbase_addr + CCCR)));
+       candev->chip[0]->chipspecops->start_chip(candev->chip[0]);
+       //DEBUGMSG("C-CAN Control Register : 0x%.4lx\n",
+       //      (unsigned long)(c_can_read_reg_w( pchip->vbase_addr + CCCR)));
+       
+       //DEBUGMSG("hms30c7202_can request i/o, leaving.\n");
+       return 0;
+}
+
+
+/**
+ * hms30c7202_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function hms30c7202_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int hms30c7202_release_io(struct candevice_t *candev)
+{
+       u16 tempReg;
+       
+       //disable IRQ generation
+       tempReg = c_can_read_reg_w(candev->chip[0], CCCR);
+
+       c_can_config_irqs(candev->chip[0], 0);
+       
+       /*  // clear all message objects
+       for (i=1; i<=15; i++) {
+       ccscan_write_register(
+                       INTPD_RES |
+                       RXIE_RES |
+                       TXIE_RES |
+                       MVAL_RES,
+                       pchip->vbase_addr +
+                       i*0x10 + iMSGCTL0 );
+       ccscan_write_register(
+                       NEWD_RES |
+                       MLST_RES |
+                       CPUU_RES |
+                       TXRQ_RES |
+                       RMPD_RES,
+                       pchip->vbase_addr +
+                       i*0x10 + iMSGCTL1 );
+       }
+       */
+       // power down HMS30c7202 - C_CAN
+       candev->chip[0]->chipspecops->stop_chip(candev->chip[0]);
+       
+       // release I/O memory mapping
+       iounmap((void*)candev->dev_base_addr);
+       
+       // Release the memory region
+       can_release_mem_region(candev->io_addr, IO_RANGE);
+       
+       return 0;
+}
+
+/**
+ * hms30c7202_reset - hardware reset routine
+ * @card: Number of the hardware card.
+ *
+ * The function hms30c7202_reset() is used to give a hardware reset. This is
+ * rather hardware specific so I haven't included example code. Don't forget to
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int hms30c7202_reset(  struct candevice_t *candev)
+{
+       int i=0;
+       int enableTest=0, disableTest=0;
+       struct canchip_t *pchip = candev->chip[0];
+       
+       enableTest = pchip->chipspecops->enable_configuration(pchip);
+       disableTest = pchip->chipspecops->disable_configuration(pchip);
+       if( enableTest || disableTest) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       
+       /* Check busoff status */
+       
+       while ( (c_can_read_reg_w(pchip, CCSR) & SR_BOFF) && (i<=15)) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip0 reset status ok.\n");
+       
+       //pchip->config_irqs(pchip, CR_MIE | CR_SIE | CR_EIE);
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_C_CAN 1
+#define NR_MSGOBJ 32
+
+/**
+ * hms30c7202_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function hms30c7202_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int hms30c7202_init_hw_data(struct candevice_t *candev) 
+/*( struct canchip_t *pchip, u16 chip_nr, u16 startminor, u32 baseaddr, u8 irq )*/
+{
+       //      u32 intCntrVAddr = 0;
+       u32 gpioVAddr = 0;
+       u32 tempReg = 0;
+       u32 baseaddr=candev->io_addr;
+       
+       //      if ( (!( intCntrVAddr = (u32)ioremap( 0x80024000, 0xCD ) ))
+       //              & (! ( gpioVAddr = (u32)ioremap( 0x80023000, 0xAD ) ))) {
+       //              DEBUGMSG("Failed to map Int and GPIO memory\n");
+       //              return -EIO;
+       //      }
+       if ( ! ( gpioVAddr = (u32)ioremap( 0x80023000, 0xAD ) )) {
+               DEBUGMSG("Failed to map GPIO memory\n");
+               return -EIO;
+       } else {
+       
+               //   DEBUGMSG( "Mapped Interrupt Controller IO-memory: 0x%lx - 0x%lx to 0x%lx\n",
+               //            (unsigned long)0X80024000,
+               //            (unsigned long)0X800240CC,
+               //            (unsigned long)intCntrVAddr);
+               DEBUGMSG( "Mapped GPIO IO-memory: 0x%lx - 0x%lx to 0x%lx\n",
+                       (unsigned long)0X80023000,
+                       (unsigned long)0X800240AC,
+                       (unsigned long)gpioVAddr);
+       }
+       
+       if (baseaddr == 0x8002f000) {
+               //              tempReg = readl(intCntrVAddr);
+               //              DEBUGMSG("Read Interrupt Enable Register : 0x%.4lx\n",(long)tempReg);
+               //              DEBUGMSG("Trying to activate CAN0 Interrupt (Bit 18)\n");
+               //              writel((tempReg | (1<<18)), intCntrVAddr);
+               //              tempReg = readl(intCntrVAddr);
+               //              DEBUGMSG("Read changed Interrupt Enable Register : 0x%.4lx\n",(long)tempReg);
+               tempReg = readl(gpioVAddr + 0x5C);
+               DEBUGMSG("Read GPIO-C Enable Register : 0x%.4lx\n",(long)tempReg);
+               DEBUGMSG("Trying to activate CAN0 (Bit 1 = 0 for CANTx0, Bit 2 = 0 for CANRx0,)\n");
+               writel(tempReg & ~0x6, gpioVAddr + 0x5C);
+               tempReg = readl(gpioVAddr + 0x5C);
+               DEBUGMSG("Read changed GPIO-C Enable Register : 0x%.4lx\n",(long)tempReg);
+               tempReg = readl(gpioVAddr + 0x44);
+               DEBUGMSG("Read GPIO-C Direction Register : 0x%.4lx\n",(long)tempReg);
+               DEBUGMSG("Trying to set CAN0 directions (Bit 1 = 0 for CANTx0 as OUT, Bit 2 = 1 for CANRx0 as IN,)\n");
+               writel((tempReg & ~0x2) | 0x4, gpioVAddr + 0x44);
+               tempReg = readl(gpioVAddr + 0x44);
+               DEBUGMSG("Read changed GPIO-C Direction Register : 0x%.4lx\n",(long)tempReg);
+       }
+       else if (baseaddr == 0x80030000) {
+               //              tempReg = readl(intCntrVAddr);
+               //              writel((tempReg | (1<<19)), intCntrVAddr);
+               tempReg = readl(gpioVAddr + 0x9C);
+               DEBUGMSG("Read GPIO-E Enable Register : 0x%.8lx\n",(long)tempReg);
+               DEBUGMSG("Trying to activate CAN1 (Bit 22 = 0 for CANRx1, Bit 23 = 0 for CANTx1,)\n");
+               writel(tempReg & 0xFF3FFFFF, gpioVAddr + 0x9C);
+               tempReg = readl(gpioVAddr + 0x9C);
+               DEBUGMSG("Read changed GPIO-E Enable Register : 0x%.8lx\n",(long)tempReg);
+               tempReg = readl(gpioVAddr + 0x84);
+               DEBUGMSG("Read GPIO-E Direction Register : 0x%.8lx\n",(long)tempReg);
+               DEBUGMSG("Trying to set CAN1 directions (Bit 22 = 1 for CANRx1 as IN, Bit 23 = 0 for CANTx1 as OUT,)\n");
+               writel((tempReg & ~(1<<23)) | 1<<22, gpioVAddr + 0x84);
+               tempReg = readl(gpioVAddr + 0x84);
+               DEBUGMSG("Read changed GPIO-E Direction Register : 0x%.8lx\n",(long)tempReg);
+       }
+
+       //DEBUGMSG("Current Interrupt Status Register (ISR): 0x%4.4lx\n",
+       //                      (long)readl(intCntrVAddr + 4));
+       //DEBUGMSG("Current Interrupt ID: %d\n",
+       //                      (int)(readl(intCntrVAddr + 0x90) & 0xF));
+       //      iounmap( (void*)intCntrVAddr);
+       iounmap( (void*)gpioVAddr );
+       //      DEBUGMSG( "Unmapped Interrupt Controller IO-memory: 0x%lx\n",
+       //            (unsigned long)intCntrVAddr);
+       DEBUGMSG( "Unmapped GPIO IO-memory: 0x%lx\n",
+               (unsigned long)gpioVAddr);
+
+       // Initialize chip data ( only one chip )
+       //  pcandev->pchip[ 0 ]->powner = pcandev;
+       /*pchip->ntype = CAN_CHIPTYPE_C_CAN;*/
+       
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=0;
+       candev->nr_all_chips=NR_C_CAN;
+
+       return 0;
+}
+
+
+#define CHIP_TYPE "c_can"
+/**
+ * hms30c7202_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function hms30c7202_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip.
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * File: src/template.c
+ */
+int hms30c7202_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       // Register chip operations
+       c_can_fill_chipspecops(candev->chip[chipnr]);
+       /* override chip provided default value */
+       candev->chip[chipnr]->max_objects = NR_MSGOBJ;
+
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       
+       candev->chip[chipnr]->clock = 16000000/2;
+       
+       /*candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = 0x0;
+       candev->chip[chipnr]->sja_ocr_reg = 0x0;*/
+       
+
+       return 0;
+}
+
+
+/**
+ * hms30c7202_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function hms30c7202_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. 
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. 
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int hms30c7202_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+       DEBUGMSG("(c%d)calling hms30c7202_init_obj_data( ...)\n", chip->chip_idx);
+
+       /* It seems, that there is no purpose to setup object base address */
+       chip->msgobj[objnr]->obj_base_addr=0;
+       
+       /*can_msgobj_test_fl(pmsgobj,RX_MODE_EXT);*/
+       return 0;
+}
+
+/**
+ * hms30c7202_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function hms30c7202_write_register() is used to write to hardware registers
+ * on the CAN chip. The registers are mapped on 32 bit bus on hms30c7202
+ * and thus registers span is twice as one defined by C_CAN manual and defines.
+ * This function compensates this difference.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+
+void hms30c7202_write_register(unsigned data, unsigned long address)
+{
+       int i;
+       //unsigned long usecs = 1;
+
+       address = ((address & C_CAN_REGOFFS_MASK) << 1) |
+                 (address & ~C_CAN_REGOFFS_MASK);
+       
+       //DEBUGMSG("Trying to write 0x%u16x to address 0x%lx\n",data,address);
+       
+       writew(data,address);
+       //udelay( usecs );
+       for (i=0; i<5; i++);
+}
+
+/**
+ * hms30c7202_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function hms30c7202_read_register() is used to read from hardware registers
+ * on the CAN chip. The registers are mapped on 32 bit bus on hms30c7202
+ * and thus registers span is twice as one defined by C_CAN manual and defines.
+ * This function compensates this difference.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned hms30c7202_read_register(unsigned long address)
+{
+       u16 value, i;
+       
+       address = ((address & C_CAN_REGOFFS_MASK) << 1) |
+                 (address & ~C_CAN_REGOFFS_MASK);
+
+       //DEBUGMSG("Trying to read from address 0x%lx :",address);
+       
+       value = readw(address);
+       //udelay( usecs );
+       for (i=0;i<5;i++);
+       value = readw(address);
+               //udelay( usecs );
+       for (i=0;i<5;i++);
+       
+       //DEBUGMSG("0x%u16x\n",value);
+       return value;
+
+}
+
+/**
+ * hms30c7202_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function hms30c7202_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int hms30c7202_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+int hms30c7202_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = hms30c7202_request_io;
+       hwspecops->release_io = hms30c7202_release_io;
+       hwspecops->reset = hms30c7202_reset;
+       hwspecops->init_hw_data = hms30c7202_init_hw_data;
+       hwspecops->init_chip_data = hms30c7202_init_chip_data;
+       hwspecops->init_obj_data = hms30c7202_init_obj_data;
+       hwspecops->write_register = hms30c7202_write_register;
+       hwspecops->read_register = hms30c7202_read_register;
+       hwspecops->program_irq = hms30c7202_program_irq;
+       return 0;
+}
+
diff --git a/lincan-0.3.3/src/i82527.c b/lincan-0.3.3/src/i82527.c
new file mode 100644 (file)
index 0000000..58aa048
--- /dev/null
@@ -0,0 +1,803 @@
+/* i82527.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/i82527.h"
+
+void i82527_irq_rtr_handler(struct canchip_t *chip, struct msgobj_t *obj, 
+                           struct rtr_id *rtr_search, unsigned long message_id);
+
+
+extern int stdmask;
+extern int extmask;
+extern int mo15mask;
+
+/* helper functions for segmented cards read and write configuration and status registers
+   above 0xf offset */
+
+void i82527_seg_write_reg(const struct canchip_t *chip, unsigned char data, unsigned address)
+{
+       if((address > 0xf) && (chip->flags & CHIP_SEGMENTED))
+               canobj_write_reg(chip, chip->msgobj[(address>>4)-1],data, address & 0xf);
+       else
+               can_write_reg(chip, data, address);
+}
+
+unsigned i82527_seg_read_reg(const struct canchip_t *chip, unsigned address)
+{
+       if((address > 0xf) && (chip->flags & CHIP_SEGMENTED))
+               return canobj_read_reg(chip, chip->msgobj[(address>>4)-1], address & 0xf);
+       else
+               return can_read_reg(chip, address);
+}
+
+int i82527_enable_configuration(struct canchip_t *chip)
+{
+       unsigned short flags=0;
+
+       flags = can_read_reg(chip, iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
+       can_write_reg(chip, flags|iCTL_CCE, iCTL);
+       
+       return 0;
+}
+
+int i82527_disable_configuration(struct canchip_t *chip)
+{
+       unsigned short flags=0;
+
+       flags = can_read_reg(chip, iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
+       can_write_reg(chip, flags, iCTL);
+
+       return 0;
+}
+
+int i82527_chip_config(struct canchip_t *chip)
+{
+       can_write_reg(chip,chip->int_cpu_reg,iCPU); // Configure cpu interface
+       can_write_reg(chip,(iCTL_CCE|iCTL_INI),iCTL); // Enable configuration
+       i82527_seg_write_reg(chip,chip->int_clk_reg,iCLK); // Set clock out slew rates 
+       i82527_seg_write_reg(chip,chip->int_bus_reg,iBUS); /* Bus configuration */
+       can_write_reg(chip,0x00,iSTAT); /* Clear error status register */
+
+       /* Check if we can at least read back some arbitrary data from the 
+        * card. If we can not, the card is not properly configured!
+        */
+       canobj_write_reg(chip,chip->msgobj[1],0x25,iMSGDAT1);
+       canobj_write_reg(chip,chip->msgobj[2],0x52,iMSGDAT3);
+       canobj_write_reg(chip,chip->msgobj[10],0xc3,iMSGDAT6);
+       if ( (canobj_read_reg(chip,chip->msgobj[1],iMSGDAT1) != 0x25) ||
+             (canobj_read_reg(chip,chip->msgobj[2],iMSGDAT3) != 0x52) ||
+             (canobj_read_reg(chip,chip->msgobj[10],iMSGDAT6) != 0xc3) ) {
+               CANMSG("Could not read back from the hardware.\n");
+               CANMSG("This probably means that your hardware is not correctly configured!\n");
+               return -1;
+       }
+       else
+               DEBUGMSG("Could read back, hardware is probably configured correctly\n");
+
+       if (chip->baudrate == 0)
+               chip->baudrate=1000000;
+
+       if (i82527_baud_rate(chip,chip->baudrate,chip->clock,0,75,0)) {
+               CANMSG("Error configuring baud rate\n");
+               return -ENODEV;
+       }
+       if (i82527_standard_mask(chip,0x0000,stdmask)) {
+               CANMSG("Error configuring standard mask\n");
+               return -ENODEV;
+       }
+       if (i82527_extended_mask(chip,0x00000000,extmask)) {
+               CANMSG("Error configuring extended mask\n");
+               return -ENODEV;
+       }
+       if (i82527_message15_mask(chip,0x00000000,mo15mask)) {
+               CANMSG("Error configuring message 15 mask\n");
+               return -ENODEV;
+       }
+       if (i82527_clear_objects(chip)) {
+               CANMSG("Error clearing message objects\n");
+               return -ENODEV;
+       }
+       if (i82527_config_irqs(chip,iCTL_IE|iCTL_EIE)) { /* has been 0x0a */
+               CANMSG("Error configuring interrupts\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+/* Set communication parameters.
+ * param rate baud rate in Hz
+ * param clock frequency of i82527 clock in Hz (ISA osc is 14318000)
+ * param sjw synchronization jump width (0-3) prescaled clock cycles
+ * param sampl_pt sample point in % (0-100) sets (TSEG1+2)/(TSEG1+TSEG2+3) ratio
+ * param flags fields BTR1_SAM, OCMODE, OCPOL, OCTP, OCTN, CLK_OFF, CBP
+ */
+int i82527_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                                                       int sampl_pt, int flags)
+{
+       int best_error = 1000000000, error;
+       int best_tseg=0, best_brp=0, best_rate=0, brp=0;
+       int tseg=0, tseg1=0, tseg2=0;
+       
+       if (i82527_enable_configuration(chip))
+               return -ENODEV;
+
+       if(chip->int_cpu_reg & iCPU_DSC)
+               clock /=2;
+
+       /* tseg even = round down, odd = round up */
+       for (tseg=(0+0+2)*2; tseg<=(MAX_TSEG2+MAX_TSEG1+2)*2+1; tseg++) {
+               brp = clock/((1+tseg/2)*rate)+tseg%2;
+               if (brp == 0 || brp > 64)
+                       continue;
+               error = rate - clock/(brp*(1+tseg/2));
+               if (error < 0)
+                       error = -error;
+               if (error <= best_error) {
+                       best_error = error;
+                       best_tseg = tseg/2;
+                       best_brp = brp-1;
+                       best_rate = clock/(brp*(1+tseg/2));
+               }
+       }
+       if (best_error && (rate/best_error < 10)) {
+               CANMSG("baud rate %d is not possible with %d Hz clock\n",
+                                                               rate, 2*clock);
+               CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
+                               best_rate, best_brp, best_tseg, tseg1, tseg2);
+               return -EINVAL;
+       }
+       tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
+       if (tseg2 < 0)
+               tseg2 = 0;
+       if (tseg2 > MAX_TSEG2)
+               tseg2 = MAX_TSEG2;
+       
+       tseg1 = best_tseg-tseg2-2;
+       if (tseg1>MAX_TSEG1) {
+               tseg1 = MAX_TSEG1;
+               tseg2 = best_tseg-tseg1-2;
+       }
+
+       DEBUGMSG("Setting %d bps.\n", best_rate);
+       DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
+                                       best_brp, best_tseg, tseg1, tseg2,
+                                       (100*(best_tseg-tseg2)/(best_tseg+1)));
+                                       
+                               
+       i82527_seg_write_reg(chip, sjw<<6 | best_brp, iBT0);
+       can_write_reg(chip, ((flags & BTR1_SAM) != 0)<<7 | tseg2<<4 | tseg1,
+                                                               iBT1);
+       DEBUGMSG("Writing 0x%x to iBT0\n",(sjw<<6 | best_brp));
+       DEBUGMSG("Writing 0x%x to iBT1\n",((flags & BTR1_SAM) != 0)<<7 | 
+                                                       tseg2<<4 | tseg1);
+
+       i82527_disable_configuration(chip);
+
+       return 0;
+}
+
+int i82527_standard_mask(struct canchip_t *chip, unsigned short code, unsigned short mask)
+{
+       unsigned char mask0, mask1;
+
+       mask0 = (unsigned char) (mask >> 3);
+       mask1 = (unsigned char) (mask << 5);
+       
+       can_write_reg(chip,mask0,iSGM0);
+       can_write_reg(chip,mask1,iSGM1);
+
+       DEBUGMSG("Setting standard mask to 0x%lx\n",(unsigned long)mask);
+
+       return 0;
+}
+
+int i82527_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask)
+{
+       unsigned char mask0, mask1, mask2, mask3;
+
+       mask0 = (unsigned char) (mask >> 21);
+       mask1 = (unsigned char) (mask >> 13);
+       mask2 = (unsigned char) (mask >> 5);
+       mask3 = (unsigned char) (mask << 3);
+
+       can_write_reg(chip,mask0,iEGM0);
+       can_write_reg(chip,mask1,iEGM1);
+       can_write_reg(chip,mask2,iEGM2);
+       can_write_reg(chip,mask3,iEGM3);
+
+       DEBUGMSG("Setting extended mask to 0x%lx\n",(unsigned long)mask);
+
+       return 0;
+}
+
+int i82527_message15_mask(struct canchip_t *chip, unsigned long code, unsigned long mask)
+{
+       unsigned char mask0, mask1, mask2, mask3;
+
+       mask0 = (unsigned char) (mask >> 21);
+       mask1 = (unsigned char) (mask >> 13);
+       mask2 = (unsigned char) (mask >> 5);
+       mask3 = (unsigned char) (mask << 3);
+
+       can_write_reg(chip,mask0,i15M0);
+       can_write_reg(chip,mask1,i15M1);
+       can_write_reg(chip,mask2,i15M2);
+       can_write_reg(chip,mask3,i15M3);
+
+       DEBUGMSG("Setting message 15 mask to 0x%lx\n",mask);
+
+       return 0;
+
+
+}
+
+int i82527_clear_objects(struct canchip_t *chip)
+{
+       int i=0,id=0,data=0;
+       struct msgobj_t *obj;
+
+       DEBUGMSG("Cleared all message objects on chip\n");
+
+       for (i=0; i<chip->max_objects; i++) {
+               obj=chip->msgobj[i];
+               canobj_write_reg(chip,obj,(INTPD_RES|RXIE_RES|TXIE_RES|MVAL_RES),iMSGCTL0);
+               canobj_write_reg(chip,obj,(NEWD_RES|MLST_RES|TXRQ_RES|RMPD_RES), iMSGCTL1);
+               for (data=0x07; data<0x0f; data++)
+                       canobj_write_reg(chip,obj,0x00,data);
+               for (id=2; id<6; id++) {
+                       canobj_write_reg(chip,obj,0x00,id);
+               }
+               if (extended==0) {
+                       canobj_write_reg(chip,obj,0x00,iMSGCFG);
+               }
+               else {
+                       canobj_write_reg(chip,obj,MCFG_XTD,iMSGCFG);
+               }
+       }
+       if (extended==0)
+               DEBUGMSG("All message ID's set to standard\n");
+       else
+               DEBUGMSG("All message ID's set to extended\n");
+       
+       return 0;
+}
+
+int i82527_config_irqs(struct canchip_t *chip, short irqs)
+{
+       can_write_reg(chip,irqs,iCTL);
+       DEBUGMSG("Configured hardware interrupt delivery\n");
+       return 0;
+}
+
+int i82527_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       unsigned long id=obj->rx_preconfig_id;
+
+       can_msgobj_set_fl(obj,RX_MODE);
+
+       if (extended || can_msgobj_test_fl(obj,RX_MODE_EXT)) {
+               id<<=3;
+               canobj_write_reg(chip,obj,id,iMSGID3);
+               canobj_write_reg(chip,obj,id>>8,iMSGID2);
+               canobj_write_reg(chip,obj,id>>16,iMSGID1);
+               canobj_write_reg(chip,obj,id>>24,iMSGID0);
+               canobj_write_reg(chip,obj,MCFG_XTD,iMSGCFG);
+       } else {
+               id<<=5;
+               canobj_write_reg(chip,obj,id,iMSGID1);
+               canobj_write_reg(chip,obj,id>>8,iMSGID0);
+               canobj_write_reg(chip,obj,0x00,iMSGCFG);
+       }
+
+       canobj_write_reg(chip,obj,(NEWD_RES|MLST_RES|TXRQ_RES|RMPD_RES), iMSGCTL1);
+       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_RES|RXIE_SET|INTPD_RES),iMSGCTL0);
+
+       DEBUGMSG("i82527_pre_read_config: configured obj at 0x%08lx\n",obj->obj_base_addr);
+
+       return 0;
+}
+
+int i82527_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg)
+{
+       int i=0,id0=0,id1=0,id2=0,id3=0;
+       int len;
+       
+       len = msg->length;
+       if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+
+       can_msgobj_clear_fl(obj,RX_MODE);
+
+       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_SET|RXIE_RES|INTPD_RES),iMSGCTL0);
+       canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|CPUU_SET|NEWD_RES),iMSGCTL1);
+
+       if (extended || (msg->flags&MSG_EXT)) {
+               canobj_write_reg(chip,obj,(len<<4)|(MCFG_DIR|MCFG_XTD),iMSGCFG);
+               id0 = (unsigned char) (msg->id<<3);
+               id1 = (unsigned char) (msg->id>>5);
+               id2 = (unsigned char) (msg->id>>13);
+               id3 = (unsigned char) (msg->id>>21);
+               canobj_write_reg(chip,obj,id0,iMSGID3);
+               canobj_write_reg(chip,obj,id1,iMSGID2);
+               canobj_write_reg(chip,obj,id2,iMSGID1);
+               canobj_write_reg(chip,obj,id3,iMSGID0);
+       }
+       else {
+               canobj_write_reg(chip,obj,(len<<4)|MCFG_DIR,iMSGCFG);
+               id1 = (unsigned char) (msg->id<<5);
+               id0 = (unsigned char) (msg->id>>3);
+               canobj_write_reg(chip,obj,id1,iMSGID1);
+               canobj_write_reg(chip,obj,id0,iMSGID0);
+       }
+       canobj_write_reg(chip,obj,RMPD_UNC|TXRQ_UNC|CPUU_SET|NEWD_SET,iMSGCTL1);
+       for (i=0; i<len; i++) {
+               canobj_write_reg(chip,obj,msg->data[i],iMSGDAT0+i);
+       }
+
+       return 0;
+}
+
+int i82527_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
+                                                       struct canmsg_t *msg)
+{
+       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_SET|RXIE_RES|INTPD_RES),iMSGCTL0);
+
+       if (msg->flags & MSG_RTR) {
+               canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|CPUU_RES|NEWD_SET),iMSGCTL1);
+       }
+       else {
+               canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_SET|CPUU_RES|NEWD_SET),iMSGCTL1);
+       }
+
+       return 0;
+}
+
+int i82527_check_tx_stat(struct canchip_t *chip)
+{
+       if (can_read_reg(chip,iSTAT) & iSTAT_TXOK) {
+               can_write_reg(chip,0x0,iSTAT);
+               return 0;
+       }
+       else {
+               can_write_reg(chip,0x0,iSTAT);
+               return 1;
+       }
+}
+
+int i82527_remote_request(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_RES|RXIE_SET|INTPD_RES),iMSGCTL0);
+       canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_SET|MLST_RES|NEWD_RES),iMSGCTL1);
+       
+       return 0;
+}
+
+int i82527_set_btregs(struct canchip_t *chip, unsigned short btr0,
+                                                       unsigned short btr1)
+{
+       if (i82527_enable_configuration(chip))
+               return -ENODEV;
+
+       i82527_seg_write_reg(chip, btr0, iBT0);
+       i82527_seg_write_reg(chip, btr1, iBT1);
+
+       i82527_disable_configuration(chip);
+
+       return 0;
+}
+
+int i82527_start_chip(struct canchip_t *chip)
+{
+       unsigned short flags = 0;
+
+       flags = can_read_reg(chip, iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
+       can_write_reg(chip, flags, iCTL);
+       
+       return 0;
+}
+
+int i82527_stop_chip(struct canchip_t *chip)
+{
+       unsigned short flags = 0;
+
+       flags = can_read_reg(chip, iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
+       can_write_reg(chip, flags|(iCTL_CCE|iCTL_INI), iCTL);
+
+       return 0;
+}
+
+int i82527_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int i82527_release_chip(struct canchip_t *chip)
+{
+       i82527_stop_chip(chip);
+       can_write_reg(chip, (iCTL_CCE|iCTL_INI), iCTL);
+
+       return 0;
+}
+
+static inline 
+void i82527_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int cmd;
+
+       canobj_write_reg(chip,obj,(MVAL_RES|TXIE_RES|RXIE_RES|INTPD_RES),iMSGCTL0);
+
+       if(obj->tx_slot){
+               /* Do local transmitted message distribution if enabled */
+               if (processlocal){
+                       /* fill CAN message timestamp */
+                       can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
+                       obj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+       }
+
+       cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
+       if(cmd<0)
+               return;
+
+       if (chip->chipspecops->pre_write_config(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_PREP);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+       if (chip->chipspecops->send_msg(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_SEND);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+       return;
+}
+
+static inline
+void i82527_irq_read_handler(struct canchip_t *chip, struct msgobj_t *obj, int objnum)
+{
+       int i;
+       unsigned long message_id;
+       int msgcfg, msgctl1;
+       
+       msgctl1=canobj_read_reg(chip,obj,iMSGCTL1);
+       if(msgctl1 & NEWD_RES)
+               return;
+       
+       do {
+               if(objnum != 14) {
+                       canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|MLST_UNC|NEWD_RES),iMSGCTL1);
+                       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_RES|RXIE_SET|INTPD_RES),iMSGCTL0);
+               }
+
+               msgcfg = canobj_read_reg(chip,obj,iMSGCFG);
+
+               if (msgcfg&MCFG_XTD) {
+                       message_id =canobj_read_reg(chip,obj,iMSGID3);
+                       message_id|=canobj_read_reg(chip,obj,iMSGID2)<<8;
+                       message_id|=canobj_read_reg(chip,obj,iMSGID1)<<16;
+                       message_id|=canobj_read_reg(chip,obj,iMSGID0)<<24;
+                       message_id>>=3;
+                       obj->rx_msg.flags = MSG_EXT;
+
+               }
+               else {
+                       message_id =canobj_read_reg(chip,obj,iMSGID1);
+                       message_id|=canobj_read_reg(chip,obj,iMSGID0)<<8;
+                       message_id>>=5;
+                       obj->rx_msg.flags = 0;
+               }
+
+               obj->rx_msg.length = (msgcfg >> 4) & 0xf;
+               if(obj->rx_msg.length > CAN_MSG_LENGTH) obj->rx_msg.length = CAN_MSG_LENGTH;
+
+               obj->rx_msg.id = message_id;
+
+               for (i=0; i < obj->rx_msg.length; i++)
+                       obj->rx_msg.data[i] = canobj_read_reg(chip,obj,iMSGDAT0+i);
+
+               
+               if(objnum != 14) {
+                       /* if NEWD is set after data read, then read data are likely inconsistent */
+                       msgctl1=canobj_read_reg(chip,obj,iMSGCTL1);
+                       if(msgctl1 & NEWD_SET) {
+                               CANMSG("i82527_irq_read_handler: object %d data overwritten\n",objnum);
+                               continue;
+                       }
+               }
+               else {
+                       /* this object is special and data are queued in the shadow register */
+                       canobj_write_reg(chip,obj,(MVAL_SET|TXIE_RES|RXIE_SET|INTPD_RES),iMSGCTL0);
+                       canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|MLST_UNC|NEWD_RES),iMSGCTL1);
+                       msgctl1=canobj_read_reg(chip,obj,iMSGCTL1);
+               }
+               
+
+               /* fill CAN message timestamp */
+               can_filltimestamp(&obj->rx_msg.timestamp);
+
+               canque_filter_msg2edges(obj->qends, &obj->rx_msg);
+               
+               if (msgctl1 & NEWD_SET)
+                       continue;
+               
+               if (msgctl1 & MLST_SET) {
+                       canobj_write_reg(chip,obj,(RMPD_UNC|TXRQ_UNC|MLST_RES|NEWD_UNC),iMSGCTL1);
+                       CANMSG("i82527_irq_read_handler: object %d message lost\n",objnum);
+               }
+               
+               return;
+
+       } while(1);
+}
+
+/*
+                       if (msgcfg&MCFG_XTD) {
+                               message_id =canobj_read_reg(chip,obj,iMSGID3);
+                               message_id|=canobj_read_reg(chip,obj,iMSGID2)<<8;
+                               message_id|=canobj_read_reg(chip,obj,iMSGID1)<<16;
+                               message_id|=canobj_read_reg(chip,obj,iMSGID0)<<24;
+                               message_id>>=3;
+                       }
+                       else {
+                               message_id =canobj_read_reg(chip,obj,iMSGID1);
+                               message_id|=canobj_read_reg(chip,obj,iMSGID0)<<8;
+                               message_id>>=5;
+                       }
+
+                       can_spin_lock(&hardware_p->rtr_lock);
+                       rtr_search=hardware_p->rtr_queue;
+                       while (rtr_search != NULL) {
+                               if (rtr_search->id == message_id)
+                                       break;
+                               rtr_search=rtr_search->next;
+                       }
+                       can_spin_unlock(&hardware_p->rtr_lock);
+                       if ((rtr_search!=NULL) && (rtr_search->id==message_id))
+                               i82527_irq_rtr_handler(chip, obj, rtr_search, message_id);
+                       else
+                               i82527_irq_read_handler(chip, obj, message_id); 
+*/
+
+
+static inline 
+void i82527_irq_update_filter(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       struct canfilt_t filt;
+
+       if(canqueue_ends_filt_conjuction(obj->qends, &filt)) {
+               obj->rx_preconfig_id=filt.id;
+               canobj_write_reg(chip,obj,(MVAL_RES|TXIE_RES|RXIE_RES|INTPD_RES),iMSGCTL0);
+               if(obj->object == 15) {
+                       i82527_message15_mask(chip,filt.id,filt.mask);
+               }
+               if (filt.flags&MSG_EXT)
+                       can_msgobj_set_fl(obj,RX_MODE_EXT);
+               else
+                       can_msgobj_clear_fl(obj,RX_MODE_EXT);
+
+               i82527_pre_read_config(chip, obj);
+
+               CANMSG("i82527_irq_update_filter: obj at 0x%08lx\n",obj->obj_base_addr);
+       }
+}
+
+
+int i82527_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int job_done=0;
+
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)) {
+
+               if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) {
+                       if(canobj_read_reg(chip,obj,iMSGCTL1)&TXRQ_RES)
+                               i82527_irq_write_handler(chip, obj);
+               }
+
+               if(!obj->tx_slot) {
+                       if(can_msgobj_test_and_clear_fl(obj,FILTCH_REQUEST)) {
+                               i82527_irq_update_filter(chip, obj);
+                       }
+               }
+
+               job_done=1;
+
+               mb();
+
+               can_msgobj_clear_fl(obj,TX_LOCK);
+               if(can_msgobj_test_fl(obj,TX_REQUEST))
+                       continue;
+               if(can_msgobj_test_fl(obj,FILTCH_REQUEST) && !obj->tx_slot)
+                       continue;
+               break;
+       }
+
+       return job_done;
+}
+
+int i82527_irq_handler(int irq, struct canchip_t *chip)
+{
+       unsigned char msgcfg;
+
+       unsigned irq_register;
+       unsigned status_register;
+       unsigned object;
+       struct msgobj_t *obj;
+       int loop_cnt=CHIP_MAX_IRQLOOP;
+
+       /*put_reg=device->hwspecops->write_register;*/
+       /*get_reg=device->hwspecops->read_register;*/
+
+       irq_register = i82527_seg_read_reg(chip, iIRQ);
+
+       if(!irq_register) {
+               DEBUGMSG("i82527: spurious IRQ\n");
+               return CANCHIP_IRQ_NONE;
+       }
+
+
+       do {
+
+               if(!loop_cnt--) {
+                       CANMSG("i82527_irq_handler IRQ %d stuck\n",irq);
+                       CANMSG("i82527_irq_register 0x%x\n",irq_register);
+                       return CANCHIP_IRQ_STUCK;
+               }
+               
+               DEBUGMSG("i82527: iIRQ 0x%02x\n",irq_register);
+               
+               if (irq_register == 0x01) {
+                       status_register=can_read_reg(chip, iSTAT);
+                       CANMSG("Status register: 0x%x\n",status_register);
+                       continue;
+                       /*return CANCHIP_IRQ_NONE;*/
+               }
+               
+               if (irq_register == 0x02)
+                       object = 14;
+               else if(irq_register <= 13+3)
+                       object = irq_register-3;
+               else
+                       return CANCHIP_IRQ_NONE;
+
+               obj=chip->msgobj[object];
+               
+               msgcfg = canobj_read_reg(chip,obj,iMSGCFG);
+               if (msgcfg & MCFG_DIR) {
+                       can_msgobj_set_fl(obj,TX_REQUEST);
+                       
+                       /* calls i82527_irq_write_handler synchronized with other invocations */
+                       if(i82527_irq_sync_activities(chip, obj)<=0){
+                               /* The interrupt has to be cleared anyway */
+                               canobj_write_reg(chip,obj,(MVAL_UNC|TXIE_UNC|RXIE_UNC|INTPD_RES),iMSGCTL0);
+
+                               /* 
+                                * Rerun for case, that parallel activity on SMP or fully-preemptive
+                                * kernel result in preparation and finished sending of message
+                                * between above if and canobj_write_reg.
+                                */
+                               i82527_irq_sync_activities(chip, obj);
+                       }
+               }
+               else { 
+
+                       i82527_irq_read_handler(chip, obj, object); 
+               }
+               
+       } while((irq_register=i82527_seg_read_reg(chip, iIRQ)) != 0);
+
+       return CANCHIP_IRQ_HANDLED;
+}
+
+void i82527_irq_rtr_handler(struct canchip_t *chip, struct msgobj_t *obj,
+                           struct rtr_id *rtr_search, unsigned long message_id)
+{
+       short int i=0;
+
+       canobj_write_reg(chip,obj,(MVAL_RES|TXIE_RES|RXIE_RES|INTPD_RES),iMSGCTL0);
+       canobj_write_reg(chip,obj,(RMPD_RES|TXRQ_RES|MLST_RES|NEWD_RES),iMSGCTL1);
+       
+       can_spin_lock(&hardware_p->rtr_lock);
+
+       rtr_search->rtr_message->id=message_id;
+       rtr_search->rtr_message->length=(canobj_read_reg(chip,obj,iMSGCFG) & 0xf0)>>4;
+       for (i=0; i<rtr_search->rtr_message->length; i++)
+               rtr_search->rtr_message->data[i]=canobj_read_reg(chip,obj,iMSGDAT0+i);
+       
+       can_spin_unlock(&hardware_p->rtr_lock);
+
+       if (waitqueue_active(&rtr_search->rtr_wq))
+               wake_up(&rtr_search->rtr_wq);
+}
+
+/**
+ * i82527_wakeup_tx: - wakeups TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Function is responsible for initiating message transmition.
+ * It is responsible for clearing of object TX_REQUEST flag
+ *
+ * Return Value: negative value reports error.
+ * File: src/i82527.c
+ */
+int i82527_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+       
+       can_msgobj_set_fl(obj,TX_REQUEST);
+
+       /* calls i82527_irq_write_handler synchronized with other invocations
+         from kernel and IRQ context */
+       i82527_irq_sync_activities(chip, obj);
+
+       can_preempt_enable();
+       return 0;
+}
+
+int i82527_filtch_rq(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+       
+       can_msgobj_set_fl(obj,FILTCH_REQUEST);
+
+       /* setups filter synchronized with other invocations from kernel and IRQ context */
+       i82527_irq_sync_activities(chip, obj);
+
+       can_preempt_enable();
+       return 0;
+}
+
+int i82527_register(struct chipspecops_t *chipspecops)
+{
+       chipspecops->chip_config = i82527_chip_config;
+       chipspecops->baud_rate = i82527_baud_rate;
+       chipspecops->standard_mask = i82527_standard_mask;
+       chipspecops->extended_mask = i82527_extended_mask;
+       chipspecops->message15_mask = i82527_message15_mask;
+       chipspecops->clear_objects = i82527_clear_objects;
+       chipspecops->config_irqs = i82527_config_irqs;
+       chipspecops->pre_read_config = i82527_pre_read_config;
+       chipspecops->pre_write_config = i82527_pre_write_config;
+       chipspecops->send_msg = i82527_send_msg;
+       chipspecops->check_tx_stat = i82527_check_tx_stat;
+       chipspecops->wakeup_tx = i82527_wakeup_tx;
+       chipspecops->filtch_rq = i82527_filtch_rq;
+       chipspecops->remote_request = i82527_remote_request;
+       chipspecops->enable_configuration = i82527_enable_configuration;
+       chipspecops->disable_configuration = i82527_disable_configuration;
+       chipspecops->set_btregs = i82527_set_btregs;
+       chipspecops->attach_to_chip = i82527_attach_to_chip;
+       chipspecops->release_chip = i82527_release_chip;
+       chipspecops->start_chip = i82527_start_chip;
+       chipspecops->stop_chip = i82527_stop_chip;
+       chipspecops->irq_handler = i82527_irq_handler;
+       chipspecops->irq_accept = NULL;
+       return 0;
+}
+
+int i82527_fill_chipspecops(struct canchip_t *chip)
+{
+       chip->chip_type="i82527";
+       chip->max_objects=15;
+       i82527_register(chip->chipspecops);
+       return 0;
+}
diff --git a/lincan-0.3.3/src/ioctl.c b/lincan-0.3.3/src/ioctl.c
new file mode 100644 (file)
index 0000000..43535d0
--- /dev/null
@@ -0,0 +1,144 @@
+/* ioctl.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/ioctl.h"
+
+int can_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+       int i=0;
+       unsigned short channel=0;
+       unsigned btr0=0, btr1=0;
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct msgobj_t *obj;
+       struct canchip_t *chip;
+       struct canque_ends_t *qends;
+       
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_ioctl: bad canuser magic\n");
+               return -ENODEV;
+       }
+       
+       obj = canuser->msgobj;
+       if (obj == NULL) {
+               CANMSG("Could not assign buffer structure\n");
+               return -1;
+       }
+
+       qends = canuser->qends;
+       chip = obj->hostchip;
+       if (chip == NULL) {
+               CANMSG("Device is not correctly configured.\n");
+               CANMSG("Please reload the driver.\n");
+               return -1;
+       }
+
+       switch (cmd) {
+               case CAN_DRV_QUERY: {
+                       return can_ioctl_query(canuser, arg);
+               }
+               case STAT: {
+                       for (i=0x0; i<0x100; i++)
+                               CANMSG("0x%x is 0x%x\n",i,can_read_reg(chip,i));
+                       break;
+               }
+               case CMD_START: {
+                       if (chip->chipspecops->start_chip(chip))
+                               return -1;
+                       break;
+               }
+               case CMD_STOP: {
+                       if (chip->chipspecops->stop_chip(chip))
+                               return -1;
+                       break;
+               }
+               case CANQUE_FLUSH: {
+                       canque_flush(canuser->rx_edge0);
+                       break;
+               }
+               case CONF_FILTER: {
+
+                       /* In- and output buffer re-initialization */
+                       
+                       if(canuser->rx_edge0){
+                               canque_set_filt(canuser->rx_edge0, arg, ~0, 0);
+                       }
+
+                       break;
+               }
+               
+               case CANQUE_FILTER: {
+                       struct canfilt_t canfilt;
+                       int ret;
+                       ret = copy_from_user(&canfilt, (void*)arg, sizeof(struct canfilt_t));
+                       if(ret) return -EFAULT;
+                       if(canuser->rx_edge0){
+                               canque_set_filt(canuser->rx_edge0, canfilt.id, canfilt.mask, canfilt.flags);
+                       }
+                       break;
+               }
+               
+               case CANRTR_READ: {
+                       int ret;
+                       struct canmsg_t rtr_msg;
+                       
+                       ret = copy_from_user(&rtr_msg, (void*)arg, sizeof(struct canmsg_t));
+                       if(ret) return -EFAULT;
+                       ret = can_ioctl_remote_read(canuser, &rtr_msg, rtr_msg.id, 0);
+                       if(ret<0) return ret;
+                       ret = copy_to_user((void*)arg, &rtr_msg, sizeof(struct canmsg_t));
+                       if(ret) return -EFAULT;
+                       break;
+               }
+
+               case CONF_BAUD: {
+                       channel = arg & 0xff;
+                       btr0 = (arg >> 8) & 0xff;
+                       btr1 = (arg >> 16) & 0xff;
+
+                       if (chip->chipspecops->set_btregs(chip, btr0, btr1)) {
+                               CANMSG("Error setting bit timing registers\n");
+                               return -1;
+                       }
+                       break;
+               }
+               
+               case CONF_BAUDPARAMS: {
+                       struct can_baudparams_t params;
+                       int ret;
+                       
+                       ret = copy_from_user(&params, (void*)arg, sizeof(struct can_baudparams_t));
+                       if(ret) return -EFAULT;
+
+                       if(params.flags == -1) params.flags = 0;
+                       if(params.baudrate == -1) params.baudrate = chip->baudrate;
+                       if(params.sjw == -1) params.sjw = 0;
+                       if(params.sample_pt == -1) params.sample_pt = 75;
+                       i=chip->chipspecops->baud_rate(chip, params.baudrate, chip->clock, params.sjw,
+                                                        params.sample_pt, params.flags);
+                       if(i>=0) chip->baudrate = params.baudrate;
+                       else {
+                               CANMSG("Error setting baud parameters\n");
+                               return -1;
+                       }
+                       break;
+               }
+
+
+               default: {
+                       CANMSG("Not a valid ioctl command\n");
+                       return -EINVAL;
+               }
+               
+       }
+
+       return 0;
+}
diff --git a/lincan-0.3.3/src/ioctl_query.c b/lincan-0.3.3/src/ioctl_query.c
new file mode 100644 (file)
index 0000000..222b5d6
--- /dev/null
@@ -0,0 +1,46 @@
+/* ioctl_query.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/ioctl.h"
+
+
+/**
+ * can_ioctl_query - query for driver version and features
+ * @canuser: pointer to the user/client state structure
+ * @what:    select which feature or version is queried
+ *
+ * Return Value: returns value for queried characteristic or -EINVAL
+ *     if there is no reply to the query.
+ */
+
+int can_ioctl_query(struct canuser_t *canuser, unsigned long what)
+{
+       switch(what){
+               case CAN_DRV_QRY_BRANCH:
+                       /* returns driver branch value - "LINC" for LinCAN driver */
+                       return CAN_DRV_BRANCH;
+
+               case CAN_DRV_QRY_VERSION:
+                       /* returns driver version as (major<<16) | (minor<<8) | patch */
+                       return CAN_DRV_VER;
+
+               case CAN_DRV_QRY_MSGFORMAT:
+                       /* format of canmsg_t structure */
+                       #ifdef CAN_MSG_VERSION_2
+                         return 2;
+                       #else /*CAN_MSG_VERSION_2*/
+                         return 1;
+                       #endif /*CAN_MSG_VERSION_2*/
+       }
+
+       return -EINVAL;
+}
diff --git a/lincan-0.3.3/src/ioctl_remote.c b/lincan-0.3.3/src/ioctl_remote.c
new file mode 100644 (file)
index 0000000..68f3670
--- /dev/null
@@ -0,0 +1,93 @@
+/* ioctl_remote.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Nov 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/read.h"
+#include "../include/ioctl.h"
+
+/* This is the 'RTR' read handler for remote transmission request messages */
+int can_ioctl_remote_read(struct canuser_t *canuser, struct canmsg_t *rtr_msg,
+                          unsigned long rtr_id, int options)
+{
+       can_spin_irqflags_t flags;
+       struct rtr_id *rtr_current, *new_rtr_entry;
+       struct msgobj_t *obj;
+       struct canchip_t *chip;
+       /*struct canque_ends_t *qends;*/
+       
+       DEBUGMSG("Remote transmission request\n");
+
+       /*qends = canuser->qends;*/
+
+       /* Initialize hardware pointers */
+       obj = canuser->msgobj;
+       if (obj == NULL) {
+               CANMSG("Could not assign buffer structure\n");
+               return -ENODEV;
+       }
+
+       if ( (chip = obj->hostchip) == NULL) {
+               CANMSG("Device is not correctly configured,\n");
+               CANMSG("please reload the driver.\n");
+               return -ENODEV;
+       }
+
+       can_spin_lock_irqsave(&hardware_p->rtr_lock, flags);
+       if (hardware_p->rtr_queue == NULL) { //No remote messages pending
+               new_rtr_entry=(struct rtr_id *)kmalloc(sizeof(struct rtr_id),GFP_ATOMIC);
+               if (new_rtr_entry == NULL) {
+                       can_spin_unlock_irqrestore(&hardware_p->rtr_lock, 
+                                                               flags);
+                       return -ENOMEM;
+               }
+               hardware_p->rtr_queue=new_rtr_entry;
+       }
+       else {
+               rtr_current=hardware_p->rtr_queue;
+               while (rtr_current->next != NULL)
+                       rtr_current=rtr_current->next;
+               new_rtr_entry=(struct rtr_id *)kmalloc(sizeof(struct rtr_id),GFP_ATOMIC);
+               rtr_current->next=new_rtr_entry;
+       }
+       init_waitqueue_head(&new_rtr_entry->rtr_wq);
+       new_rtr_entry->id = rtr_id;
+       new_rtr_entry->rtr_message = rtr_msg;
+       new_rtr_entry->next=NULL;
+
+       can_spin_unlock_irqrestore(&hardware_p->rtr_lock, flags);
+
+       /* Send remote transmission request */
+       chip->chipspecops->remote_request(chip,obj);
+       obj->ret = 0;
+       interruptible_sleep_on(&new_rtr_entry->rtr_wq);
+
+       can_spin_lock_irqsave(&hardware_p->rtr_lock, flags);
+       if (hardware_p->rtr_queue == new_rtr_entry) {
+               if (new_rtr_entry->next != NULL) 
+                       hardware_p->rtr_queue=new_rtr_entry->next;
+               else
+                       hardware_p->rtr_queue=NULL;
+       }
+       else {
+               rtr_current=hardware_p->rtr_queue;
+               while (rtr_current->next != new_rtr_entry)
+                       rtr_current=rtr_current->next;
+               if (new_rtr_entry->next != NULL)
+                       rtr_current->next=new_rtr_entry->next;
+               else
+                       rtr_current->next=NULL;
+       }
+       can_spin_unlock_irqrestore(&hardware_p->rtr_lock, flags);
+       kfree(new_rtr_entry);
+
+       return obj->ret;
+}
+
diff --git a/lincan-0.3.3/src/ioctl_rtl.c b/lincan-0.3.3/src/ioctl_rtl.c
new file mode 100644 (file)
index 0000000..88c2641
--- /dev/null
@@ -0,0 +1,111 @@
+/* ioctl.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <rtl_posixio.h>
+#include "../include/ioctl.h"
+#include "../include/can_iortl.h"
+
+
+int can_ioctl_rtl_posix(struct rtl_file *fptr, unsigned int cmd, unsigned long arg)
+{
+       struct canuser_t *canuser =
+               (struct canuser_t *)can_get_rtl_file_private_data(fptr);
+       int i=0;
+       unsigned short channel=0;
+       unsigned btr0=0, btr1=0;
+       struct msgobj_t *obj;
+       struct canchip_t *chip;
+       struct canque_ends_t *qends;
+       
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_ioctl_: bad canuser magic\n");
+               return -ENODEV;
+       }
+       
+       obj = canuser->msgobj;
+       if (obj == NULL) {
+               CANMSG("Could not assign buffer structure\n");
+               return -1;
+       }
+
+       qends = canuser->qends;
+       chip = obj->hostchip;
+       if (chip == NULL) {
+               CANMSG("Device is not correctly configured.\n");
+               CANMSG("Please reload the driver.\n");
+               return -1;
+       }
+
+       switch (cmd) {
+               case CAN_DRV_QUERY: {
+                       return can_ioctl_query(canuser, arg);
+               }
+               case STAT: {
+                       for (i=0x0; i<0x100; i++)
+                               CANMSG("0x%x is 0x%x\n",i,can_read_reg(chip,i));
+                       break;
+               }
+               case CMD_START: {
+                       if (chip->chipspecops->start_chip(chip))
+                               return -1;
+                       break;
+               }
+               case CMD_STOP: {
+                       if (chip->chipspecops->stop_chip(chip))
+                               return -1;
+                       break;
+               }
+               case CANQUE_FLUSH: {
+                       canque_flush(canuser->rx_edge0);
+                       break;
+               }
+               case CONF_FILTER: {
+                       if(canuser->rx_edge0){
+                               canque_set_filt(canuser->rx_edge0, arg, ~0, 0);
+                       }
+
+                       break;
+               }
+               
+               case CANQUE_FILTER: {
+                       struct canfilt_t canfilt=*(struct canfilt_t *)arg;
+                       if(canuser->rx_edge0){
+                               canque_set_filt(canuser->rx_edge0, canfilt.id, canfilt.mask, canfilt.flags);
+                       }
+                       break;
+               }
+
+               case CONF_BAUD: {
+                       channel = arg & 0xff;
+                       btr0 = (arg >> 8) & 0xff;
+                       btr1 = (arg >> 16) & 0xff;
+
+                       if (chip->chipspecops->set_btregs(chip, btr0, btr1)) {
+                               CANMSG("Error setting bit timing registers\n");
+                               return -1;
+                       }
+                       break;
+               }
+               default: {
+                       CANMSG("Not a valid ioctl command\n");
+                       return -EINVAL;
+               }
+               
+       }
+
+       return 0;
+}
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/src/ipci165.c b/lincan-0.3.3/src/ipci165.c
new file mode 100644 (file)
index 0000000..5ca7bc4
--- /dev/null
@@ -0,0 +1,1551 @@
+/* ipci165.c
+ * Linux CAN-bus device driver for IXXAT iPC-I 165 (PCI) compatible HW.
+ * Written for new CAN driver version by Radim Kalas
+ * email:kalas@unicontrols.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/setup.h"
+#include "../include/finish.h"
+#include "../include/ipci165.h"
+#include "../include/ipci165_fw.h"
+#include "../include/kthread.h"
+
+#include <ctype.h>
+
+can_irqreturn_t ipci165_irq_handler(int irq, void *dev_id, struct pt_regs *regs);
+int ipci165_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                      int sampl_pt, int flags);
+int ipci165_set_btregs(struct canchip_t *chip, unsigned short btr0,
+                       unsigned short btr1);
+int ipci165_start_chip(struct canchip_t *chip);
+
+#ifdef CAN_DEBUG
+  void dump_mem(char *ptr, int size);
+#else
+#define dump_mem(a,b)
+#endif
+
+#define ipci165_load_btr(btr,btr0,btr1) {*btr = btr0; *(btr+1) = btr1;}
+
+/**
+ * ipci165_delay - Delay the execution
+ * @msdelay: milliseconds to wait
+ *
+ * Return value: no return value
+ * File: src/ipci165.c
+ */
+static void ipci165_delay(long msdelay)
+{
+#ifdef CAN_WITH_RTL
+  if(!rtl_rt_system_is_idle())
+  {
+    rtl_delay(1000000l*msdelay);
+  } else
+#endif /*CAN_WITH_RTL*/
+  {
+    set_current_state(TASK_UNINTERRUPTIBLE);
+    schedule_timeout((msdelay*HZ)/1000+1);
+  }
+}
+
+/**
+ * ipci165_generate_irq - Generate irq for HW
+ * @candev: Pointer to hardware/board specific functions
+ *
+ * Return value: The function returns zero on success or non zero on failure
+ * File: src/ipci165.c
+ */
+void ipci165_generate_irq(struct candevice_t *candev)
+{
+  unsigned long crm_addr = candev->io_addr;
+  writeb(readb(crm_addr + CRM_UCR) & 0xFB, crm_addr + CRM_UCR);
+  writeb(readb(crm_addr + CRM_UCR) | 0x04, crm_addr + CRM_UCR);
+}
+
+/**
+ * bci_command - Send command to controller
+ * @candev: Pointer to hardware/board specific functions
+ * @cmd: Command to be performed
+ * @size: Command data size
+ * @data: Command data
+ *
+ * Return value: The function returns zero on success or non zero on failure
+ * File: src/ipci165.c
+ */
+int bci_command(struct candevice_t *candev, char cmd, int size, char *data)
+{
+  unsigned long dpram_addr = candev->dev_base_addr;
+
+  DEBUGMSG ("ipci165_bci_command\n");
+
+  if (size > BCI_CMD_MAX_LEN)
+  {
+    DEBUGMSG ("ipci165_bci_command: parameter error\n");
+    return -EINVAL;
+  }
+
+  /* grant access to the command buffer */
+  can_spin_lock(&candev->device_lock);
+
+  // check command buffer status
+  if (readb(dpram_addr + OF_BCI_SYNC) != 0)
+  {
+    /* something went wrong ... */
+    can_spin_unlock(&candev->device_lock);
+    DEBUGMSG ("ipci165_bci_command: command buffer is busy\n");
+    return (-EBUSY);
+  }
+
+  // prepare command
+  writeb(cmd, dpram_addr + OF_BCI_CMD);
+  writeb(size + 1, dpram_addr + OF_BCI_NUM);
+  memcpy_toio(dpram_addr + OF_BCI_DATA, data, size);
+
+  // set flag for firmware
+  writeb(1, dpram_addr + OF_BCI_SYNC);
+
+  // generate interrupt to microcontroller
+  ipci165_generate_irq (candev);
+
+  return 0;
+}
+
+/**
+ * bci_response - Get response from controller
+ * @candev: Pointer to hardware/board specific functions
+ * @cmd: Command to get response for
+ * @size: Command data size
+ * @data: Command data
+ *
+ * Return value: The function returns zero on success or non zero on failure
+ * File: src/ipci165.c
+ */
+int bci_response(struct candevice_t *candev, char cmd, int *size, char *data)
+{
+  unsigned long dpram_addr = candev->dev_base_addr;
+  char tmp;
+  int delay;
+
+  DEBUGMSG ("ipci165_bci_response\n");
+
+  delay = 1000;
+  while (readb(dpram_addr + OF_BCI_SYNC) != 2)
+  {
+    /* wait 1 ms */
+    /*    ipci165_delay(1); */
+    udelay(100);
+    if (--delay == 0)
+    {
+      /* timeout occured */
+      /* release the lock */
+      can_spin_unlock(&candev->device_lock);
+      CANMSG ("BCI timeout!\n");
+      return -EBUSY;
+    }
+  }
+
+  /* we will not copy the command filed, so decrement the size by 1 */
+  tmp = readb(dpram_addr + OF_BCI_NUM) - 1;
+  if (*size > tmp) *size = tmp;
+
+  if (readb(dpram_addr + OF_BCI_CMD) != cmd)
+  {
+    /* release the buffer */
+    writeb(0, dpram_addr + OF_BCI_SYNC);
+    /* unlock the access */
+    can_spin_unlock(&candev->device_lock);
+
+    DEBUGMSG ("ipci165_bci_command: invalid answer\n");
+    return -EIO;
+  }
+  memcpy_fromio(data, dpram_addr + OF_BCI_DATA, *size);
+
+  /* release the buffer */
+  writeb(0, dpram_addr + OF_BCI_SYNC);
+  /* unlock the access */
+  can_spin_unlock(&candev->device_lock);
+  return 0;
+}
+
+/**
+ * ipci165_restart_can - Flush queues and sestart can controller
+ * @candev: Pointer to hardware/board specific functions
+ * @chip_idx: chip number
+ *
+ * Return value: The function returns zero on success or non zero on failure
+ * File: src/ipci165.c
+ */
+int ipci165_restart_can(struct canchip_t *chip)
+{
+  char data[3];
+  int size;
+  int i;
+
+  struct ipci165_chip_t *chip_data;
+  unsigned long msg_ofs;
+
+  /* reset CAN */
+  data[0] = chip->chip_idx;
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_RESET_CAN, 1, data) ||
+      bci_response(chip->hostdevice, CMD_RESET_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("CAN reset failed!\n");
+    return -ENODEV;
+  }
+
+  /* flush TX/RX queues in DP-RAM */
+  chip_data = (struct ipci165_chip_t *)chip->chip_data;
+  msg_ofs = BCI_MSG_STATUS;
+
+  for (i = 0; i< BCI_QUEUE_SIZE; i++)
+  {
+    writeb(BCI_MSG_STATUS_FREE, chip_data->rx_queue.addr + msg_ofs);
+    writeb(BCI_MSG_STATUS_FREE, chip_data->tx_queue.addr + msg_ofs);
+    msg_ofs += BCI_MSG_SIZE;
+  }
+
+  /* In- and output buffer re-initialization */
+  canqueue_ends_flush_inlist(chip->msgobj[0]->qends);
+  canqueue_ends_flush_outlist(chip->msgobj[0]->qends);
+
+  /* start CAN */
+  data[0] = chip->chip_idx;
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_START_CAN, 1, data) ||
+      bci_response(chip->hostdevice, CMD_START_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("start chip failed!\n");
+    return -ENODEV;
+  }
+  return 0;
+}
+
+/* this is the thread function that we are executing */
+/**
+ * ipci165_kthread - Thread restarting can controller after bus-off.
+ * @kthread: pointer to kernel thread descriptor
+ * @chip_idx: chip number
+ *
+ * Return value: no return value
+ * File: src/ipci165.c
+ */
+void ipci165_kthread(kthread_t *kthread)
+{
+  struct canchip_t *chip = (struct canchip_t *)kthread->arg;
+  struct ipci165_chip_t *chip_data = (struct ipci165_chip_t *)chip->chip_data;
+
+  /* setup the thread environment */
+  init_kthread(kthread, "ipci165");
+
+  /* this is normal work to do */
+  CANMSG ("kernel thread started!\n");
+
+  /* an endless loop in which we are doing our work */
+  for(;;)
+  {
+    /* fall asleep */
+    wait_event_interruptible(kthread->queue,test_bit(CHIP_FLAG_BUS_OFF,&chip_data->flags));
+
+    /* We need to do a memory barrier here to be sure that
+    the flags are visible on all CPUs. */
+    mb();
+
+    /* here we are back from sleep because we caught a signal. */
+    if (kthread->terminate)
+    {
+      /* we received a request to terminate ourself */
+      break;
+    }
+
+    {
+      clear_bit(CHIP_FLAG_BUS_OFF,&chip_data->flags);
+      set_bit(CHIP_FLAG_RESET,&chip_data->flags);
+      /* this is normal work to do */
+      ipci165_restart_can(chip);
+
+      clear_bit(CHIP_FLAG_RESET,&chip_data->flags);
+
+      /* wait at least 100ms for next reset */
+      ipci165_delay(100);
+    }
+  }
+  /* here we go only in case of termination of the thread */
+
+  /* cleanup the thread, leave */
+  CANMSG ("kernel thread terminated!\n");
+  exit_kthread(kthread);
+
+  /* returning from the thread here calls the exit functions */
+}
+
+/**
+ * ipci165_qfull_latency - Compute delay to send out full tx queue
+ * @candev: Pointer to candevice/board structure
+ * @obj: pointer to message object state structure
+ *
+ * Return Value: The function returns computed delay in jiffies
+ * File: src/ipci165.c
+ */
+long ipci165_qfull_latency(struct msgobj_t *obj)
+{
+  long latency;
+  latency = obj->hostchip->baudrate;
+  if(latency){
+    latency=(long)HZ*(CAN_FRAME_MIN_BIT_LEN * BCI_QUEUE_SIZE)/latency + 1;
+  }
+
+  return latency;
+}
+
+/**
+ * ipci165_connect_irq: Installs interrupt routine and enable irq on HW
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+int ipci165_connect_irq(struct candevice_t *candev)
+{
+  unsigned long crm_addr = candev->io_addr;
+  unsigned char icr;
+  DEBUGMSG ("ipci165_connect_irq\n");
+
+  /* install interrupt routine */
+  if (request_irq(candev->sysdevptr.pcidev->irq,
+                  ipci165_irq_handler,
+                  SA_SHIRQ,
+                  DEVICE_NAME,
+                  candev))
+    return -ENODEV;
+
+  // Enable interrupt to PC
+  writeb(readb(crm_addr + CRM_ICR) | 0x40, crm_addr + CRM_ICR);
+  udelay (100);
+  icr = readb(crm_addr + CRM_ICR);
+  return 0;
+}
+
+/**
+ * ipci165_disconnect_irq - Disable irq on HW
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+void ipci165_disconnect_irq(struct candevice_t *candev)
+{
+  unsigned long crm_addr = candev->io_addr;
+  unsigned char icr;
+  DEBUGMSG ("ipci165_disconnect_irq\n");
+
+  // Enable interrupt to PC
+  writeb(readb(crm_addr + CRM_ICR) & ~0x40, crm_addr + CRM_ICR);
+  udelay (100);
+  icr = readb(crm_addr + CRM_ICR);
+  /* deinstall interrupt routine */
+  free_irq(candev->sysdevptr.pcidev->irq, candev);
+}
+
+/* * * CAN Functionality * * */
+
+/**
+ * ipci165_chip_config - Can chip configuration
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_chip_config(struct canchip_t *chip)
+{
+  struct ipci165_chip_t *chip_data = chip->chip_data;
+  char data[3];
+  int ret, size;
+
+  DEBUGMSG ("ipci165_chip_config[%i]\n",chip->chip_idx);
+
+  /* comupte the base address of tx and rx queue for the channel */
+  chip_data->tx_queue.addr = chip->chip_base_addr + OF_CH1_TX_QUEUE +
+      chip->chip_idx * (OF_CH2_TX_QUEUE-OF_CH1_TX_QUEUE);
+  chip_data->rx_queue.addr = chip->chip_base_addr + OF_CH1_RX_QUEUE +
+      chip->chip_idx * (OF_CH2_RX_QUEUE-OF_CH1_RX_QUEUE);
+
+  /* reset CAN */
+  data[0] = chip->chip_idx;
+
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_RESET_CAN, 1, data) ||
+      bci_response(chip->hostdevice, CMD_RESET_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("CAN reset failed!\n");
+    return -ENODEV;
+  }
+
+  /* configure rx queue */
+  data[0] = chip->chip_idx;
+  data[1] = BCI_LATENCY_MODE;
+  data[2] = 0; /* dummy */
+
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_CONFIG_RX_QUEUE, 3, data) ||
+      bci_response(chip->hostdevice, CMD_CONFIG_RX_QUEUE, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("config RX queue failed!\n");
+    return -ENODEV;
+  }
+  /* setup baud rate */
+  if (!chip->baudrate) chip->baudrate = 1000000;
+  if ((ret = ipci165_baud_rate(chip, chip->baudrate, chip->clock, 0, 0, 0))) return ret;
+
+  /* start can communication */
+  if ((ret = ipci165_start_chip(chip))) return ret;
+
+  return 0;
+}
+
+/**
+ * ipci165_baud_rate - Set communication parameters
+ * @chip: pointer to chip state structure
+ * @rate: baud rate in Hz
+ * @clock: not used
+ * @sjw: not used
+ * @sampl_pt: not used
+ * @flags: not used
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                      int sampl_pt, int flags)
+{
+  DEBUGMSG ("ipci165_baud_rate[%i]\n",chip->chip_idx);
+
+  switch (rate) {
+    case 10000:  return ipci165_set_btregs(chip, BCI_10KB);
+    case 20000:  return ipci165_set_btregs(chip, BCI_20KB);
+    case 50000:  return ipci165_set_btregs(chip, BCI_50KB);
+    case 100000: return ipci165_set_btregs(chip, BCI_100KB);
+    case 125000: return ipci165_set_btregs(chip, BCI_125KB);
+    case 250000: return ipci165_set_btregs(chip, BCI_250KB);
+    case 500000: return ipci165_set_btregs(chip, BCI_500KB);
+    case 1000000:return ipci165_set_btregs(chip, BCI_1000KB);
+    default: return -EINVAL;
+  }
+
+  return 0;
+}
+
+/**
+ * ipci165_set_btregs - Configure bitrate registers
+ * @chip: pointer to chip state structure
+ * @btr0: bitrate register 0
+ * @btr1: bitrate register 1
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_set_btregs(struct canchip_t *chip, unsigned short btr0,
+                       unsigned short btr1)
+{
+  unsigned char data[3];
+  int size;
+
+  DEBUGMSG ("ipci165_set_btregs[%i]: btr0=%02x, btr1=%02x\n",chip->chip_idx,
+            (unsigned)btr0,(unsigned)btr1);
+  
+  /* configure the chip */
+  data[0] = chip->chip_idx;
+  data[1] = btr0;
+  data[2] = btr1;
+  
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_INIT_CAN, 3, data) ||
+      bci_response(chip->hostdevice, CMD_INIT_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("baud rate setup failed!\n");
+    return -ENODEV;
+  }
+  return 0;
+}
+
+/**
+ * ipci165_stop_chip - Start chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_start_chip(struct canchip_t *chip)
+{
+  char data[1];
+  int size;
+
+  DEBUGMSG ("ipci165_start_chip[%i]\n",chip->chip_idx);
+  
+  /* start CAN */
+  data[0] = chip->chip_idx;
+  
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_START_CAN, 1, data) ||
+      bci_response(chip->hostdevice, CMD_START_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("start chip failed!\n");
+    return -ENODEV;
+  }
+  return 0;
+}
+
+/**
+ * ipci165_stop_chip -  Stop chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_stop_chip(struct canchip_t *chip)
+{
+  char data[1];
+  int size;
+
+  DEBUGMSG ("ipci165_stop_chip[%i]\n",chip->chip_idx);
+  
+  /* configure the chip */
+  data[0] = chip->chip_idx;
+  
+  size = 1;
+  if (bci_command(chip->hostdevice, CMD_STOP_CAN, 1, data) ||
+      bci_response(chip->hostdevice, CMD_STOP_CAN, &size, data) ||
+      (data[0] == 0))
+  {
+    CANMSG ("stop chip failed!\n");
+    return -ENODEV;
+  }
+  return 0;
+}
+
+/**
+ * ipci165_pre_read_config - Prepare message object for message reception
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive value indicates immediate reception of message.
+ * File: src/ipci165.c
+ */
+int ipci165_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+  return 0;
+}
+
+/**
+ * ipci165_pre_write_config - Prepare message object for message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
+                             struct canmsg_t *msg)
+{
+  return 0;
+}
+
+/**
+ * ipci165_send_msg - Initiate message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * This function is called after ipci165_pre_write_config() function,
+ * which prepares data in chip buffer.
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
+                     struct canmsg_t *msg)
+{
+  return 0;
+}
+
+/**
+ * ipci165_check_tx_stat - Checks state of transmission engine
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive return value indicates transmission under way status.
+ *     Zero value indicates finishing of all issued transmission requests.
+ * File: src/ipci165.c
+ */
+int ipci165_check_tx_stat(struct canchip_t *chip)
+{
+  return 0;
+}
+
+/**
+ * ipci165_irq_read_handler - ISR code responsible for receiving
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * The main purpose of this function is to read message from CAN controller and
+ * transfer them to attached queues
+ * File: src/ipci165.c
+ */
+void ipci165_irq_read_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+  struct ipci165_chip_t *chip_data = (struct ipci165_chip_t *)chip->chip_data;
+  struct bci_queue_t *queue = &(chip_data)->rx_queue;
+  unsigned long       queue_addr = queue->addr;
+  unsigned long       msg_addr   = queue_addr + queue->idx * BCI_MSG_SIZE;
+
+  int len;
+  unsigned char frame_info;
+  unsigned status;
+  unsigned short tmp16;
+  unsigned long  tmp32;
+
+  DEBUGMSG ("ipci165_irq_read_handler[%i]\n",chip->chip_idx);
+
+  do {
+    dump_mem(msg_addr, BCI_MSG_SIZE);
+    if (readb(msg_addr + BCI_MSG_TYPE) == BCI_MSG_TYPE_CAN)
+    {
+#if 0
+      printk("ST(0)=%x, ST(1)=%x\n",readw(chip->chip_base_addr+OF_CAN1_STATUS),
+             readw(chip->chip_base_addr+OF_CAN2_STATUS));
+      for (tmp16 = 0 ; tmp16 < BCI_QUEUE_SIZE ; tmp16 ++)
+        printk ("MSG_ST(%i)=%x\n",tmp16,readb(chip->chip_base_addr + OF_CH2_TX_QUEUE + tmp16*BCI_MSG_SIZE + BCI_MSG_STATUS));
+      /* this is a can message */
+      DEBUGMSG ("ipci165_irq_read_handler[%i]: message in buffer\n",chip->chip_idx);
+#endif
+
+      frame_info = readb(msg_addr + BCI_MSG_FRAME);
+      len =  frame_info & 0x0f;
+      if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+      obj->rx_msg.length = len;
+      obj->rx_msg.flags  = (frame_info & BCI_MSG_FRAME_RTR ? MSG_RTR : 0);
+      obj->rx_msg.cob    = 0;
+      obj->rx_msg.timestamp.tv_sec = 0;
+      obj->rx_msg.timestamp.tv_usec = 
+          BCI_TIMESTAMP_RES * readl(msg_addr + BCI_MSG_TIMESTAMP);
+      /*  BCI_TIMESTAMP_RES * le32_to_cpu(readl(msg_addr + BCI_MSG_TIMESTAMP)); */
+
+      /* fill CAN message timestamp */
+      /* can_filltimestamp(&obj->rx_msg.timestamp); */
+
+      if (frame_info & BCI_MSG_FRAME_EXT)
+      {
+        /* extended frame - 29 bit identifier */
+        obj->rx_msg.flags |= MSG_EXT;
+        /* the ID is stored in motorola format (big endian), left justified  */
+        /* obj->rx_msg.id = be32_to_cpu(readl(msg_addr + BCI_MSG_ID) >> 3); */
+        memcpy_fromio(&tmp32, msg_addr + BCI_MSG_ID, 4);
+        obj->rx_msg.id = be32_to_cpu(tmp32 >> 3);
+        if (len > 0)
+          memcpy_fromio(obj->rx_msg.data, msg_addr + BCI_MSG_EXT_DATA, len);
+      } else
+      {
+        /* standard frame - 11 bit identifier */
+        /* the ID is stored in motorola format (big endian), left justified */
+        /* obj->rx_msg.id = be16_to_cpu(readw(msg_addr + BCI_MSG_ID) >> 5); */
+        memcpy_fromio(&tmp16, msg_addr + BCI_MSG_ID, 2);
+        obj->rx_msg.id = be16_to_cpu(tmp16 >> 5);
+        if (len > 0)
+          memcpy_fromio(obj->rx_msg.data, msg_addr + BCI_MSG_STD_DATA, len);
+      }
+      canque_filter_msg2edges(obj->qends, &obj->rx_msg);
+    }
+    else
+    {
+      /* this is a status message */
+      status = readw(msg_addr + BCI_MSG_CAN_STATUS);
+      DEBUGMSG ("ipci165_irq_read_handler[%i]: CAN status=%04x\n",chip->chip_idx, status);
+
+      /* wake up the reset thread if the CAN is in bus off */
+      if (status & BCI_CAN_STATUS_BUS_OFF) 
+      {
+        CANMSG ("BUS-OFF detected! Restarting\n");
+        set_bit(CHIP_FLAG_BUS_OFF,&chip_data->flags);
+        wake_up(&chip_data->kthread.queue);
+      }
+
+      if(obj->tx_slot)
+      {
+        canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_BUS);
+      }
+
+    }
+    DEBUGMSG ("ipci165_irq_read_handler[%i]: device status\n", chip->chip_idx);
+    dump_mem(chip->chip_base_addr + OF_STATUS_BUFFER, 12);
+
+    /* update pointer */
+    queue->idx = (queue->idx + 1) % BCI_QUEUE_SIZE;
+    /* release the buffer */
+    writeb(BCI_MSG_STATUS_FREE, msg_addr + BCI_MSG_STATUS);
+    msg_addr = queue_addr + queue->idx * BCI_MSG_SIZE;
+
+  } while (readb(msg_addr + BCI_MSG_STATUS) == BCI_MSG_STATUS_FULL);
+
+}
+
+/**
+ * ipci165_irq_write_handler - ISR code responsible for transmitting
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * The main purpose of this function is to read message from attached queues
+ * and transfer message contents into CAN controller chip.
+ * File: src/ipci165.c
+ */
+void ipci165_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+  struct ipci165_chip_t *chip_data = ((struct ipci165_chip_t *)chip->chip_data);
+  struct bci_queue_t *queue      = &chip_data->tx_queue;
+  unsigned long       queue_addr = queue->addr;
+  unsigned long       msg_addr   = queue_addr + queue->idx * BCI_MSG_SIZE;
+  struct canque_slot_t *tx_slot;
+
+  int len;
+  unsigned char frame_info, ext;
+  unsigned short tmp16;
+  unsigned long  tmp32;
+
+  DEBUGMSG ("ipci165_irq_write_handler[%i]\n",chip->chip_idx);
+
+  while ((canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot) >=0))
+  {
+    if (test_bit(CHIP_FLAG_RESET,&chip_data->flags) ||
+        (readb(msg_addr + BCI_MSG_STATUS) == BCI_MSG_STATUS_FULL))
+    {
+      canque_again_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+
+      /* lost interrupt work around */
+      ipci165_generate_irq(obj->hostchip->hostdevice);
+
+      mod_timer(&obj->tx_timeout, jiffies + ipci165_qfull_latency(obj));
+      DEBUGMSG("ipci165_irq_write_handler[%i]: scheduled retry\n", chip->chip_idx);
+
+      return;
+    }
+
+    tx_slot = obj->tx_slot;
+    DEBUGMSG ("msg[%i] : id=%lx dlc=%x flg=%02x\n",
+              chip->chip_idx,
+              (unsigned long)tx_slot->msg.id,
+              (unsigned int)tx_slot->msg.length,
+              (unsigned int)tx_slot->msg.flags);
+    dump_mem(tx_slot->msg.data, tx_slot->msg.length);
+
+    len = tx_slot->msg.length;
+    if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+
+    ext = tx_slot->msg.flags;
+    frame_info =
+        len |
+        ((tx_slot->msg.flags & MSG_RTR) ? BCI_MSG_FRAME_RTR : 0) |
+        ((tx_slot->msg.flags & MSG_EXT) ? BCI_MSG_FRAME_EXT : 0);
+
+    writeb(BCI_MSG_SIZE - 2, msg_addr + BCI_MSG_NUM);
+    writeb(BCI_MSG_TYPE_CAN, msg_addr + BCI_MSG_TYPE);
+    writeb(frame_info, msg_addr + BCI_MSG_FRAME);
+    if (frame_info & BCI_MSG_FRAME_EXT)
+    {
+      /* extended frame - 29 bit identifier */
+      /* the ID is stored in motorola format (big endian), left justified  */
+      tmp32 = be32_to_cpu(tx_slot->msg.id) << 3;
+      memcpy_toio(msg_addr + BCI_MSG_ID, &tmp32, 4);
+      if (len > 0)
+        memcpy_toio(msg_addr + BCI_MSG_EXT_DATA, tx_slot->msg.data, len);
+    } else
+    {
+      /* standard frame - 11 bit identifier */
+      /* the ID is stored in motorola format (big endian), left justified */
+      tmp16 = be16_to_cpu(tx_slot->msg.id) << 5;
+      memcpy_toio(msg_addr + BCI_MSG_ID, &tmp16, 2);
+      if (len > 0)
+        memcpy_toio(msg_addr + BCI_MSG_STD_DATA, tx_slot->msg.data, len);
+    }
+
+    dump_mem(msg_addr, BCI_MSG_SIZE);
+
+    /* update pointer */
+    queue->idx = (queue->idx + 1) % BCI_QUEUE_SIZE;
+    /* mark the buffer as full */
+    writeb(BCI_MSG_STATUS_FULL, msg_addr + BCI_MSG_STATUS);
+    /* wake up the controller */
+    ipci165_generate_irq(chip->hostdevice);
+
+    /* next message address */
+    msg_addr = queue_addr + queue->idx * BCI_MSG_SIZE;
+
+    /* Do local transmitted message distribution if enabled. */
+    /* This code should not be called directly there, because it breaks strict
+    behavior of queues if O_SYNC is set. */
+    if (processlocal){
+      obj->tx_slot->msg.flags |= MSG_LOCAL;
+      canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+    }
+    /* Free transmitted slot */
+    canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+    obj->tx_slot = NULL;
+  }
+  return;
+}
+
+/**
+ * ipci165_irq_sync_activities - Synchronized access to write handler
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * Return Value: The function always returns zero
+ * File: src/ipci165.c
+ */
+void ipci165_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj)
+{
+  while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)) 
+  {
+    if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) 
+    {
+      ipci165_irq_write_handler(chip, obj);
+    }
+
+    can_msgobj_clear_fl(obj,TX_LOCK);
+    if(can_msgobj_test_fl(obj,TX_REQUEST))
+      continue;
+/*    if(can_msgobj_test_fl(obj,FILTCH_REQUEST) && !obj->tx_slot)
+    continue; */
+    break;
+  }
+}
+
+/**
+ * ipci165_irq_chip_handler - ISR for dedicated chip
+ * @chip: pointer to chip state structure
+ *
+ * The main purpose of this function is to perform all necessary channel
+ * operations as a reaction on signalled interrupt. 
+ * File: src/ipci165.c
+ */
+void ipci165_irq_chip_handler(struct canchip_t *chip)
+{
+  struct msgobj_t       *obj = chip->msgobj[0];
+  struct ipci165_chip_t *chip_data = chip->chip_data;
+  struct bci_queue_t    *queue; 
+
+  DEBUGMSG ("ipci165_irq_chip_handler[%i]\n",chip->chip_idx);
+
+  /* check receive queue for messages */
+  queue = &chip_data->rx_queue;
+  if (readb(queue->addr + queue->idx * BCI_MSG_SIZE + BCI_MSG_STATUS)
+      == BCI_MSG_STATUS_FULL)
+    ipci165_irq_read_handler(chip, obj);
+
+  queue = &chip_data->tx_queue;
+/*  if (readb(queue->addr + queue->idx * BCI_MSG_SIZE + BCI_MSG_STATUS)
+  == BCI_MSG_STATUS_FREE) */
+  {
+    can_msgobj_set_fl(obj,TX_REQUEST);
+
+    /* calls unican_irq_write_handler synchronized with other invocations */
+    ipci165_irq_sync_activities(chip, obj);
+  }
+
+}
+
+#define MAX_RETR 10
+
+/**
+ * ipci165_irq_handler - Interrupt service routine
+ * @irq: interrupt vector number, this value is system specific
+ * @dev_id: driver private pointer registered at time of request_irq() call.
+ *     The CAN driver uses this pointer to store relationship of interrupt
+ *     to chip state structure - @struct canchip_t
+ * @regs: system dependent value pointing to registers stored in exception frame
+ * 
+ * The interrupt handler is activated when the ipci165 controller generates
+ * an interrupt as a reaction an internal state change. The interrupt is
+ * acknowledged and ipci165_irq_chip_handler is called for every channel.
+ * File: src/ipci165.c
+ */
+can_irqreturn_t ipci165_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+{
+  int retval;
+  struct candevice_t *candev = (struct candevice_t *)dev_id;
+
+  unsigned long crm_addr   = candev->io_addr;
+  unsigned long ucr1_addr  = crm_addr + CRM_UCR + 1;
+  struct canchip_t *chip;
+  unsigned char icr;
+  int i;
+
+  /* DEBUGMSG ("ipci165_irq_handler\n"); */
+
+  /* read interrupt control register (byte 0) */
+  icr = readb(crm_addr + CRM_ICR);
+
+  if ((icr & 0x44) == 0x44)
+  {
+    DEBUGMSG ("ipci165_irq_handler: pending interrupt\n");
+
+    /* confirm pending interrupt */
+    writeb(readb(ucr1_addr) | 0x01,  ucr1_addr);
+    writeb(readb(ucr1_addr) & ~0x01, ucr1_addr);
+
+    /* call interrupt handler for every channel */
+    for (i=0 ; i < candev->nr_all_chips ; i++)
+    {
+      chip = candev->chip[i];
+      if (chip->flags & CHIP_CONFIGURED)
+        ipci165_irq_chip_handler(candev->chip[i]);
+    }
+    DEBUGMSG ("ipci165_irq_handler: interrupt handled\n");
+
+    retval = CANCHIP_IRQ_HANDLED;
+  } else {
+    DEBUGMSG ("ipci165_irq_handler: not our interrupt\n");
+    retval = CANCHIP_IRQ_NONE;
+  }
+
+  return CAN_IRQ_RETVAL(retval);
+}
+
+/**
+ * ipci165_wakeup_tx - Wakeup TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Function is responsible for initiating message transmition.
+ * It is responsible for clearing of object TX_REQUEST flag
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+  DEBUGMSG ("ipci165_wakeup_tx\n");
+  can_preempt_disable();
+
+  can_msgobj_set_fl(obj,TX_REQUEST);
+
+  /* calls ipci165_irq_write_handler synchronized with other invocations
+  from kernel and IRQ context */
+  ipci165_irq_sync_activities(chip, obj);
+
+  can_preempt_enable();
+  DEBUGMSG ("ipci165_wakeup_tx: finished\n");
+
+  return 0;
+}
+
+void ipci165_do_tx_timeout(unsigned long data)
+{
+  struct msgobj_t *obj=(struct msgobj_t *)data;
+
+  DEBUGMSG ("ipci165_do_tx_timeout\n");
+
+  can_preempt_disable();
+
+  can_msgobj_set_fl(obj,TX_REQUEST);
+
+  /* calls ipci165_irq_write_handler synchronized with other invocations
+  from kernel and IRQ context */
+  ipci165_irq_sync_activities(obj->hostchip, obj);
+
+  can_preempt_enable();
+  DEBUGMSG ("ipci165_do_tx_timeout: finished\n");
+}
+
+/**
+ * ipci165_attach_to_chip: - attaches to the chip, setups registers and state
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_attach_to_chip(struct canchip_t *chip)
+{
+  return 0;
+}
+
+/**
+ * ipci165_release_chip: - called before chip structure removal if %CHIP_ATTACHED is set
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/ipci165.c
+ */
+int ipci165_release_chip(struct canchip_t *chip)
+{
+  ipci165_stop_chip(chip);
+  /* disable interrupts in the hardware, etc. */
+  return 0;
+}
+
+/* * * iPC-I 165/PCI Board Functionality * * */
+
+/**
+ * ipci165_request_io - Reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+int ipci165_request_io(struct candevice_t *candev)
+{
+  unsigned long dpram_addr;
+  unsigned long crm_addr;
+  unsigned long fix_addr;
+  int i,j;
+
+  DEBUGMSG ("ipci165_request_io\n");
+
+  crm_addr   = pci_resource_start(candev->sysdevptr.pcidev,0);
+  dpram_addr = pci_resource_start(candev->sysdevptr.pcidev,2);
+
+  DEBUGMSG ("ipci165_request_io: crm = 0x%lx, dpram = 0x%lx\n",crm_addr, dpram_addr);
+
+  /* verify, if our HW is buggy, and try to fix it */
+#if 0
+  if (test_bit (7, &crm_addr))
+  {
+    CANMSG ("Wrong PCI base address [0x%lx](PLX PCI9050 bug)!\n", dpram_addr);
+
+    fix_addr = pci_resource_start(candev->sysdevptr.pcidev,3);
+
+    if (fix_addr == 0)
+    {
+      CANMSG ("This card was not fixed!\n");
+
+      if (candev->io_addr == 0)
+      {
+        CANMSG ("You have to specify IO address parameter!\n");
+        return -EINVAL;
+      }
+      CANMSG ("Using specified IO address value for the memory [0x%lx]\n",
+              candev->io_addr);
+    }
+    else
+    {
+      CANMSG ("Fixed card. Using of 3 region [0x%lx]\n", fix_addr);
+      candev->io_addr = fix_addr;
+    }
+
+    pci_write_config_dword (candev->sysdevptr.pcidev,
+                            PCI_BASE_ADDRESS_0, fix_addr);
+  }
+#endif
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+  if(pci_request_region(candev->sysdevptr.pcidev, 2, "kv_ipci165_dpram") == 0)
+  {
+    if(pci_request_region(candev->sysdevptr.pcidev, 0, "kv_ipci165_reg") == 0)
+    {
+#else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+  if(pci_request_regions(candev->sysdevptr.pcidev, "kv_ipci165") == 0)
+  {
+#endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+      if ((candev->dev_base_addr = (long) ioremap(dpram_addr, 
+           pci_resource_len(candev->sysdevptr.pcidev,2))))
+      {
+        DEBUGMSG ("ipci165_request_io: dpram remapped to 0x%lx\n", candev->dev_base_addr);
+
+        if ((candev->io_addr = (long) ioremap(crm_addr, 
+             pci_resource_len(candev->sysdevptr.pcidev,0))))
+        {
+          DEBUGMSG ("ipci165_request_io: crm remapped to 0x%lx\n", candev->io_addr);
+          /* all resources has been allocated */
+          candev->res_addr=candev->io_addr;
+
+          /* Because of my mapping, I cannot use the
+             can_base_addr_fixup(candev, remap_addr) to remap the addresses */
+          for(i=0;i<candev->nr_all_chips;i++)
+          {
+            candev->chip[i]->chip_base_addr = candev->dev_base_addr;
+            for(j=0;j<candev->chip[i]->max_objects;j++)
+              candev->chip[i]->msgobj[j]->obj_base_addr = candev->dev_base_addr;
+          }
+
+          return 0;
+
+        } else CANMSG("Unable to remap memory at: 0x%lx\n", crm_addr);
+        iounmap((void*)candev->io_addr);
+
+      } else CANMSG("Unable to remap memory at: 0x%lx\n", dpram_addr);
+      iounmap((void*)candev->dev_base_addr);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+      pci_release_region(candev->sysdevptr.pcidev, 0);
+    } else CANMSG("Request of kv_ipci165_reg range failed\n");
+
+    pci_release_region(candev->sysdevptr.pcidev, 2);
+  } else CANMSG("Request of kv_ipci165_dpram range failed\n");
+
+#else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+    pci_release_regions(candev->sysdevptr.pcidev);
+  } else CANMSG("Request of kv_ipci165 regions failed\n");
+#endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+  return -ENODEV;
+}
+
+/**
+ * ipci165_release_io - Free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * Return Value: The function always returns zero
+ * File: src/ipci165.c
+ */
+int ipci165_release_io(struct candevice_t *candev)
+{
+  struct ipci165_chip_t *chip_data;
+  int i;
+  
+  /* disable irq on HW */
+  ipci165_disconnect_irq(candev);
+
+#if 0
+  /* terminate the kernel threads */
+  for (i = 0 ; i < candev->nr_all_chips ; i++)
+  {
+    chip_data = (struct ipci165_chip_t *)candev->chip[i]->chip_data;
+    stop_kthread(&chip_data->restart_thread);
+  }
+#endif
+
+  iounmap((void*)candev->io_addr);
+  iounmap((void*)candev->dev_base_addr);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+  pci_release_region(candev->sysdevptr.pcidev, 2);
+  pci_release_region(candev->sysdevptr.pcidev, 0);
+#else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+  pci_release_regions(candev->sysdevptr.pcidev);
+#endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+  return 0;
+}
+
+/**
+ * ipci165_download_fw - Download FW into CAN hardware
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: returns zero on success
+ * File: src/ipci165.c
+ */
+int ipci165_download_fw(struct candevice_t *candev)
+{
+  unsigned long dpram_addr = candev->dev_base_addr;
+  char board_name[BOARD_NAME_LEN+1];
+  char hw_version[HW_VERSION_LEN+1];
+  char mode[MODE_LEN+1];
+
+  struct ipci165_fw_t *fwArray = ipci165_fw;
+  int attempt;
+
+  DEBUGMSG ("ipci165_download_fw\n");
+
+  /* read name and version */  
+  memcpy_fromio (board_name, dpram_addr + BOARD_NAME_OFS, BOARD_NAME_LEN);
+  board_name[BOARD_NAME_LEN] = 0;
+
+  memcpy_fromio (hw_version, dpram_addr + HW_VERSION_OFS, HW_VERSION_LEN);
+  hw_version[HW_VERSION_LEN] = 0;
+
+  CANMSG ("Board Name: %s\n", board_name);
+  CANMSG ("HW Version: %s\n", hw_version);
+
+/*
+  if ((hw_version[0] != 'V') && (hw_version[0] != 'v'))
+{
+  CANMSG ("This board is too old and not supported by the BCI !\n");
+  return -ENODEV;
+}
+*/
+
+  /* detect & test mode */
+  memcpy_fromio (mode, dpram_addr + MODE_OFS, MODE_LEN);
+  mode[MODE_LEN] = 0;
+
+  if (strncmp (mode, "PC-Loader V", 11))
+  {
+    CANMSG ("Unknown mode [%s], can't download firmware!\n",mode);
+    return -ENODEV;
+  }
+
+  while (fwArray->len)
+  {
+    /* fill buffer */
+    writeb(LD_CMD_DOWNLOAD, dpram_addr + OF_LD_CMD);
+    writeb(fwArray->len, dpram_addr + OF_LD_NUM);
+    writeb(0, dpram_addr + OF_LD_NUM + 1);
+
+    writel(fwArray->addr, dpram_addr + OF_LD_ADDRESS);
+    /*    writel already performes the cpu_to_le32 conversion by itself   */
+    /*    writel(cpu_to_le32(fwArray->addr), dpram_addr + OF_LD_ADDRESS); */
+
+    memcpy_toio(dpram_addr + OF_LD_DATA, fwArray->a_data, fwArray->len);
+
+#if 0
+    dump_mem((void *)(dpram_addr + OF_LD_SYNC), fwArray->len + 8);
+#endif
+    /* buffer is prepared, set flag for loader */
+    writeb(1, dpram_addr + OF_LD_SYNC);
+
+    /* update pointer */
+    fwArray++;
+
+    /* wait for the loader */
+    attempt = 1000;
+    while (readb(dpram_addr + OF_LD_SYNC) != 0)
+    {
+      udelay(100);
+      if (--attempt == 0)
+      {
+        /* timeout occured */
+        CANMSG ("Firmware download failed!\n");
+        return -ENODEV;
+      }
+    }
+  }
+  CANMSG ("Firmware downladed successfully\n");
+
+  /* start the FW */
+  writeb(LD_CMD_START_FW, dpram_addr + OF_LD_CMD);
+  writeb(1, dpram_addr + OF_LD_SYNC);
+  ipci165_delay (500);
+
+  return 0;
+}
+
+/**
+ * ipci165_reset - Hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+int ipci165_reset(struct candevice_t *candev)
+{
+  unsigned long crm_addr = candev->io_addr;
+  unsigned long test_data;
+  char buffer[BCI_CMD_MAX_LEN];
+  int i, size, chips;
+  unsigned char ucr;
+  struct canchip_t *chip;
+  struct ipci165_chip_t *chip_data;
+
+  DEBUGMSG ("ipci165_reset: hardware reset\n");
+
+  /* reset the HW */
+  ucr = readb(crm_addr + CRM_UCR + 3);
+  writeb(ucr | 0x40, crm_addr + CRM_UCR + 3);
+  udelay(100);
+  writeb(ucr & ~0x40, crm_addr + CRM_UCR + 3);
+
+  /* wait a little bit */
+  ipci165_delay(200);
+
+  /* download FW */
+  if (ipci165_download_fw(candev)) return -ENODEV;
+
+  /* enable irq on HW */
+  if (ipci165_connect_irq(candev))
+    {
+    CANMSG ("Interrupt routine installation for IRQ %i failed!\n",
+            candev->sysdevptr.pcidev->irq);
+    return -ENODEV;
+    }
+
+  /* test BCI interface */
+  test_data = 0x12345678;
+  size = sizeof(test_data);
+  if (bci_command(candev, CMD_TEST, size, (char *)&test_data) ||
+      bci_response(candev, CMD_TEST, &size, (char *)&test_data) ||
+      (test_data != ~0x12345678))
+  {
+    CANMSG ("BCI test failed! Test pattern is %lx\n", test_data);
+    return -ENODEV;
+  }
+
+  /* get Firmware identification */
+  /* send command, fw requests 1 dummy byte */
+  size = BCI_CMD_MAX_LEN;
+  if (bci_command(candev, CMD_ID, 1, (char *)&test_data) ||
+      bci_response(candev, CMD_ID, &size, buffer))
+  {
+    CANMSG ("Firmware Identification reading failed!\n");
+    return -ENODEV;
+  }
+  CANMSG ("Firmware: %s\n",buffer);
+
+  /* get Firmware version */
+  /* send command, fw requests 1 dummy byte */
+  size = BCI_CMD_MAX_LEN;
+  if (bci_command(candev, CMD_VERSION, 1, (char *)&test_data) ||
+      bci_response(candev, CMD_VERSION, &size, buffer))
+  {
+    CANMSG ("Firmware Version reading failed!\n");
+    return -ENODEV;
+  }
+  CANMSG ("Version: %s\n",buffer);
+
+  /* get Board Info */
+  /* send command, fw requests 1 dummy byte */
+  size = BOARD_INFO_SIZE;
+  if (bci_command(candev, CMD_GET_BOARD_INFO, 1, (char *)&test_data) ||
+      bci_response(candev, CMD_GET_BOARD_INFO, &size, (char *) buffer))
+  {
+    CANMSG ("Get Board Info failed!\n");
+    return -ENODEV;
+  }
+
+  chips = le16_to_cpu(*(unsigned short*)(buffer+OF_BOARD_INFO_CHIPS));
+  /* shouldn't be, but who knows ... */
+  if (chips > 2) chips = 2;
+
+  CANMSG ("Chips: %i\n",chips);
+  CANMSG ("Chip 1 Type: %s\n",buffer+OF_BOARD_INFO_CHIP1_TYPE);
+
+  /* update board info */
+  if (chips == 1)
+  {
+    /* we have to correct the number in candev and release allocated
+       structures */
+    candev->nr_all_chips = chips;
+    canchip_done(candev->chip[1]);
+
+  } else CANMSG ("Chip 2 Type: %s\n",buffer+OF_BOARD_INFO_CHIP2_TYPE); 
+
+  /* start kernel threads */
+  for (i = 0 ; i < chips ; i++)
+  {
+    chip = candev->chip[i];
+    chip_data = (struct ipci165_chip_t *)chip->chip_data;
+    chip_data->kthread.arg = chip;
+    start_kthread(ipci165_kthread, &chip_data->kthread);
+  }
+
+  CANMSG ("HW is up and working.\n");
+  return 0;
+}
+
+/**
+ * ipci165_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function always returns zero
+ * File: src/ipci165.c
+ */
+int ipci165_init_hw_data(struct candevice_t *candev)
+{
+  struct pci_dev *pcidev = NULL;
+  unsigned short SubsystemID;
+
+  DEBUGMSG ("ipci165_init_hw_data\n");
+
+  /* find iPC-I 165 on PCI bus */
+  do
+  {
+    pcidev = pci_find_device(IPCI165_VENDOR_ID, IPCI165_DEVICE_ID, pcidev);
+    if(pcidev == NULL) return -ENODEV;
+
+    /* check subvendor ID */
+    pci_read_config_word (pcidev, PCI_SUBSYSTEM_ID, &SubsystemID);
+    if ((SubsystemID != IPCI165_SUBSYSTEM_ID) &&
+        (SubsystemID != CP350_SUBSYSTEM_ID))
+      break;
+  }
+  while(can_check_dev_taken(pcidev));
+
+  /* enable it */
+  if (pci_enable_device (pcidev))
+  {
+    CANMSG ("Cannot enable PCI device\n");
+    return -EIO;
+  }
+
+  candev->sysdevptr.pcidev = pcidev;
+  candev->res_addr=0;
+  candev->nr_82527_chips=0;
+  candev->nr_sja1000_chips=0;
+  /* we do not know yet, whether our HW has one or two chan chips. Let's
+     prepare configuration for maximal configuration = 2. This will be
+     corrected later on */
+  candev->nr_all_chips=2; 
+  candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+  /* initialize device spinlock */
+  can_spin_lock_init(&candev->device_lock);
+
+  return 0;
+}
+
+#define CHIP_TYPE "ipci165"
+
+/**
+ * ipci165_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure)
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * Return Value: The function always returns zero
+ * File: src/ipci165.c
+ */
+int ipci165_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+  struct canchip_t      *chip = candev->chip[chipnr];
+  struct ipci165_chip_t *chip_data;
+
+  DEBUGMSG ("ipci165_init_chip_data\n");
+
+  chip->chip_type = CHIP_TYPE;
+  chip->chip_base_addr = 0; /* mapping not known yet */
+  chip->clock = 10000000;
+  chip->int_clk_reg = 0x0;
+  chip->int_bus_reg = 0x0;
+  chip->max_objects = 1;
+
+#if 0
+  /* initialize interrupt handling only for channel 0. The interrupt
+     is shared between the channels so we have to work it out in one
+     interrupt routine. */
+  if (chipnr == 0)
+  {
+    chip->chipspecops->irq_handler=ipci165_irq_handler;
+    chip->chip_irq=candev->sysdevptr.pcidev->irq;
+    chip->flags |= CHIP_IRQ_PCI;
+  } else
+  {
+    chip->chipspecops->irq_handler=NULL;
+  }
+#else
+  chip->chipspecops->irq_handler = NULL;
+  chip->chip_irq = 0;
+  chip->flags |= CHIP_IRQ_CUSTOM;
+#endif
+
+  chip_data = can_checked_malloc(sizeof(struct ipci165_chip_t));
+  if(!chip_data) return -ENOMEM;
+  chip_data->rx_queue.idx = 0;
+  chip_data->rx_queue.addr = 0;
+  chip_data->tx_queue.idx = 0;
+  chip_data->tx_queue.addr = 0;
+  chip->chip_data = chip_data;
+
+  CANMSG("initializing ipci165 chip operations\n");
+  chip->chipspecops->attach_to_chip=ipci165_attach_to_chip;
+  chip->chipspecops->release_chip=ipci165_release_chip;
+  chip->chipspecops->chip_config=ipci165_chip_config;
+  chip->chipspecops->baud_rate=ipci165_baud_rate;
+  chip->chipspecops->set_btregs=ipci165_set_btregs;
+  chip->chipspecops->start_chip=ipci165_start_chip;
+  chip->chipspecops->stop_chip=ipci165_stop_chip;
+  chip->chipspecops->pre_read_config=ipci165_pre_read_config;
+  chip->chipspecops->wakeup_tx=ipci165_wakeup_tx;
+  chip->chipspecops->filtch_rq=NULL;
+  chip->chipspecops->irq_accept=NULL;
+
+  chip->chipspecops->standard_mask=NULL;
+  chip->chipspecops->extended_mask=NULL;
+  chip->chipspecops->message15_mask=NULL;
+  chip->chipspecops->clear_objects=NULL;
+  chip->chipspecops->config_irqs=NULL;
+  chip->chipspecops->pre_write_config=NULL;
+  chip->chipspecops->send_msg=NULL;
+  chip->chipspecops->check_tx_stat=NULL;
+  chip->chipspecops->remote_request=NULL;
+  chip->chipspecops->enable_configuration=NULL;
+  chip->chipspecops->disable_configuration=NULL;
+
+  return 0;
+}
+
+/**
+ * ipci165_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * Return Value: The function always returns zero
+ * File: src/ipci165.c
+ */
+int ipci165_init_obj_data(struct canchip_t *chip, int objnr)
+{
+  struct msgobj_t *obj=chip->msgobj[objnr];
+  
+  DEBUGMSG ("ipci165_init_obj_data\n");
+  
+  obj->obj_base_addr = 0; /* not known yet */
+  obj->tx_timeout.function = ipci165_do_tx_timeout;
+  obj->tx_timeout.data = (unsigned long)obj;
+  return 0;
+}
+
+/**
+ * ipci165_program_irq - Program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+int ipci165_program_irq(struct candevice_t *candev)
+{
+  return 0;
+}
+
+/**
+ * ipci165_register - Register Board Support Functions
+ * @candev: Pointer to hardware/board specific functions
+ *
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/ipci165.c
+ */
+int ipci165_register(struct hwspecops_t *hwspecops)
+{
+  hwspecops->request_io = ipci165_request_io;
+  hwspecops->release_io = ipci165_release_io;
+  hwspecops->reset = ipci165_reset;
+  hwspecops->init_hw_data = ipci165_init_hw_data;
+  hwspecops->init_chip_data = ipci165_init_chip_data;
+  hwspecops->init_obj_data = ipci165_init_obj_data;
+  hwspecops->write_register = NULL;
+  hwspecops->read_register = NULL;
+  hwspecops->program_irq = ipci165_program_irq;
+  return 0;
+}
+
+#ifdef CAN_DEBUG
+void dump_mem(char *ptr, int size)
+{
+  int to, j;
+  unsigned char str[80], buf[16];
+  char *strp;
+
+  for (; size > 0; size -= 16)
+  {
+    to = size > 16 ? 16 : size;
+    memcpy (buf,ptr, to);
+    strp = str;
+    for (j = 0; j < to ; j++)
+      strp += sprintf(strp, "%02x ",buf[j]);
+    for (; j < 16 ; j++) 
+      strp += sprintf(strp, "   ");
+    for (j = 0; j < to ; j++)
+      *strp++= isprint(buf[j]) ? buf[j] : '.';
+
+    DEBUGMSG ("[%lx] %s\n", (long unsigned)ptr, str);
+    ptr += to;
+  }
+}
+#endif
diff --git a/lincan-0.3.3/src/ipci165_fw.c b/lincan-0.3.3/src/ipci165_fw.c
new file mode 100644 (file)
index 0000000..33377c2
--- /dev/null
@@ -0,0 +1,5611 @@
+
+/************************************************************************
+** BCI Firmware for IPCI165 ISA and PCI generated from the Intel HEX file
+************************************************************************/  
+  
+
+#include "../include/ipci165_fw.h"
+  
+struct ipci165_fw_t ipci165_fw[] =
+{
+  {
+    0x10, 0x0000C02AUL,
+    {
+    0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x00, 0x53, 0x4A, 0x41, 0x31,
+        0x30, 0x30, 0x30, 0x00}
+  }
+  , 
+  {
+    0x08, 0x000000AEUL,
+    {
+    0x03, 0x04, 0x56, 0x34, 0x2E, 0x30, 0x33, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002B00UL,
+    {
+    0x2A, 0x40, 0x00, 0x10, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x43, 0x41,
+        0x4E, 0x20, 0x69, 0x6E}
+  }
+  , 
+  {
+    0x10, 0x00002B10UL,
+    {
+    0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x66, 0x69, 0x72, 0x6D,
+        0x77, 0x61, 0x72, 0x65}
+  }
+  , 
+  {
+    0x0E, 0x00002B20UL,
+    {
+    0x20, 0x66, 0x6F, 0x72, 0x20, 0x69, 0x50, 0x43, 0x2D, 0x49, 0x31, 0x36,
+        0x35, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B2EUL,
+    {
+    0x02, 0x40, 0x2A, 0x10, 0x00, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000016D4UL,
+    {
+    0xF0, 0x48, 0x07, 0xF8, 0xF8, 0x00, 0x2D, 0x06, 0x09, 0x82, 0x3D, 0x07,
+        0xE0, 0x08, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000016E4UL,
+    {
+    0x38, 0x23, 0x0D, 0x03, 0xE0, 0x78, 0xCA, 0x00, 0x38, 0x23, 0x9A, 0x04,
+        0x0B, 0x00, 0x04, 0x8F}
+  }
+  , 
+  {
+    0x10, 0x000016F4UL,
+    {
+    0x12, 0xFD, 0xF2, 0xF4, 0x12, 0xFD, 0x3D, 0x06, 0xCA, 0x00, 0xDC, 0x21,
+        0xF2, 0xF4, 0x14, 0xFD}
+  }
+  , 
+  {
+    0x06, 0x00001704UL,
+    {
+    0xF6, 0xF4, 0x12, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000170AUL,
+    {
+    0xEC, 0xFE, 0xEC, 0xFF, 0xE6, 0xF8, 0x82, 0x10, 0xCA, 0x00, 0xAC, 0x1E,
+        0xF0, 0x64, 0xF0, 0x75}
+  }
+  , 
+  {
+    0x10, 0x0000171AUL,
+    {
+    0xF6, 0xF4, 0x7C, 0x10, 0xF6, 0xF5, 0x7E, 0x10, 0x70, 0x65, 0xEA, 0x20,
+        0xFA, 0x1B, 0xF2, 0xFF}
+  }
+  , 
+  {
+    0x10, 0x0000172AUL,
+    {
+    0x7E, 0x10, 0xF2, 0xFE, 0x7C, 0x10, 0xDC, 0x0F, 0xA9, 0x8E, 0x29, 0x82,
+        0x2D, 0x35, 0x29, 0x82}
+  }
+  , 
+  {
+    0x10, 0x0000173AUL,
+    {
+    0x8D, 0x4B, 0x2D, 0x70, 0x29, 0x82, 0xEA, 0x20, 0x8A, 0x18, 0x29, 0x82,
+        0xEA, 0x80, 0xF6, 0x18}
+  }
+  , 
+  {
+    0x10, 0x0000174AUL,
+    {
+    0xEA, 0x20, 0x60, 0x19, 0x29, 0x83, 0xEA, 0x20, 0xCA, 0x19, 0x29, 0x82,
+        0xEA, 0x80, 0x28, 0x1A}
+  }
+  , 
+  {
+    0x10, 0x0000175AUL,
+    {
+    0xEA, 0x20, 0xCE, 0x1A, 0x29, 0x82, 0xEA, 0x80, 0x1E, 0x1B, 0xEA, 0x20,
+        0x4C, 0x1B, 0x07, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000176AUL,
+    {
+    0x0E, 0x00, 0xEA, 0x30, 0xD6, 0x1B, 0xE1, 0x18, 0xF7, 0xF8, 0x2C, 0x10,
+        0xE6, 0xFC, 0x2A, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000177AUL,
+    {
+    0xE6, 0xFA, 0x00, 0x10, 0xE6, 0xFB, 0x01, 0x00, 0xE6, 0xF8, 0x2D, 0x10,
+        0xE6, 0xF9, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000178AUL,
+    {
+    0xCA, 0x00, 0x1A, 0x29, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00,
+        0xE6, 0xF8, 0x4C, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000179AUL,
+    {
+    0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B, 0xE1, 0x28, 0xF7, 0xF8,
+        0x2C, 0x10, 0xE0, 0x6C}
+  }
+  , 
+  {
+    0x10, 0x000017AAUL,
+    {
+    0xE6, 0xFA, 0xB0, 0x00, 0xE6, 0xFB, 0x00, 0x00, 0xE6, 0xF8, 0x2D, 0x10,
+        0xE6, 0xF9, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000017BAUL,
+    {
+    0xCA, 0x00, 0x1A, 0x29, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00,
+        0xE6, 0xF8, 0x4C, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000017CAUL,
+    {
+    0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B, 0xDC, 0x0F, 0xA9, 0x8E,
+        0xF7, 0xF8, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x000017DAUL,
+    {
+    0xE1, 0x18, 0xF7, 0xF8, 0x81, 0x10, 0x0D, 0x0F, 0xC2, 0xF7, 0x81, 0x10,
+        0xF2, 0xF5, 0x7E, 0x10}
+  }
+  , 
+  {
+    0x10, 0x000017EAUL,
+    {
+    0xF2, 0xF4, 0x7C, 0x10, 0x00, 0x47, 0xDC, 0x05, 0xA9, 0xA4, 0x57, 0xFA,
+        0xFF, 0x00, 0xE4, 0xA7}
+  }
+  , 
+  {
+    0x10, 0x000017FAUL,
+    {
+    0x2C, 0x10, 0x25, 0x8F, 0x81, 0x10, 0xF3, 0xF8, 0x82, 0x10, 0x43, 0xF8,
+        0x81, 0x10, 0xED, 0xEC}
+  }
+  , 
+  {
+    0x10, 0x0000180AUL,
+    {
+    0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00, 0xC2, 0xF8, 0x82, 0x10,
+        0xCA, 0x00, 0xD8, 0x1E}
+  }
+  , 
+  {
+    0x10, 0x0000181AUL,
+    {
+    0xEA, 0x00, 0xFA, 0x1B, 0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10,
+        0xDC, 0x05, 0xF4, 0x84}
+  }
+  , 
+  {
+    0x10, 0x0000182AUL,
+    {
+    0x03, 0x00, 0xC0, 0x8B, 0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84,
+        0x02, 0x00, 0xC0, 0x8A}
+  }
+  , 
+  {
+    0x10, 0x0000183AUL,
+    {
+    0xE0, 0x19, 0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84, 0x01, 0x00,
+        0xC0, 0x88, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000184AUL,
+    {
+    0x18, 0x02, 0x49, 0x81, 0x3D, 0x0F, 0xE1, 0x48, 0xF7, 0xF8, 0x2C, 0x10,
+        0xE1, 0x18, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000185AUL,
+    {
+    0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28,
+        0xCA, 0x00, 0xD8, 0x1E}
+  }
+  , 
+  {
+    0x10, 0x0000186AUL,
+    {
+    0xEA, 0x00, 0xFA, 0x1B, 0xE1, 0x48, 0xF7, 0xF8, 0x2C, 0x10, 0xF7, 0x8E,
+        0x2D, 0x10, 0xE6, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x0000187AUL,
+    {
+    0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E,
+        0xEA, 0x00, 0xFA, 0x1B}
+  }
+  , 
+  {
+    0x10, 0x0000188AUL,
+    {
+    0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84,
+        0x01, 0x00, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000189AUL,
+    {
+    0x80, 0x10, 0xC2, 0xF8, 0x80, 0x10, 0xCA, 0x00, 0x64, 0x04, 0x49, 0x81,
+        0x3D, 0x0E, 0xE1, 0x68}
+  }
+  , 
+  {
+    0x10, 0x000018AAUL,
+    {
+    0xF7, 0xF8, 0x2C, 0x10, 0xE1, 0x18, 0xF7, 0xF8, 0x2D, 0x10, 0xE6, 0xF9,
+        0x2C, 0x10, 0xE6, 0xFA}
+  }
+  , 
+  {
+    0x10, 0x000018BAUL,
+    {
+    0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0x0D, 0x0C, 0xE1, 0x68,
+        0xF7, 0xF8, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x000018CAUL,
+    {
+    0xF7, 0x8E, 0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00,
+        0xE0, 0x28, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000018DAUL,
+    {
+    0xD8, 0x1E, 0xF3, 0xF8, 0x80, 0x10, 0x3D, 0x05, 0xE0, 0x28, 0xCA, 0x00,
+        0x28, 0x24, 0xEA, 0x00}
+  }
+  , 
+  {
+    0x0C, 0x000018EAUL,
+    {
+    0xFA, 0x1B, 0xE0, 0x38, 0xCA, 0x00, 0x28, 0x24, 0xEA, 0x00, 0xFA, 0x1B}
+  }
+  , 
+  {
+    0x10, 0x000018F6UL,
+    {
+    0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84,
+        0x01, 0x00, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00001906UL,
+    {
+    0x80, 0x10, 0x49, 0x80, 0x3D, 0x04, 0xE0, 0x28, 0xCA, 0x00, 0x6A, 0x24,
+        0x0D, 0x03, 0xE0, 0x38}
+  }
+  , 
+  {
+    0x10, 0x00001916UL,
+    {
+    0xCA, 0x00, 0x6A, 0x24, 0xC2, 0xF8, 0x80, 0x10, 0xCA, 0x00, 0xA0, 0x05,
+        0x49, 0x81, 0x3D, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x00001926UL,
+    {
+    0xE1, 0x78, 0xF7, 0xF8, 0x2C, 0x10, 0xE1, 0x18, 0xF7, 0xF8, 0x2D, 0x10,
+        0xE6, 0xF9, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001936UL,
+    {
+    0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00,
+        0xFA, 0x1B, 0xE1, 0x78}
+  }
+  , 
+  {
+    0x10, 0x00001946UL,
+    {
+    0xF7, 0xF8, 0x2C, 0x10, 0xF7, 0x8E, 0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10,
+        0xE6, 0xFA, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001956UL,
+    {
+    0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B, 0xF2, 0xF5,
+        0x7E, 0x10, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001966UL,
+    {
+    0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84, 0x01, 0x00, 0xF7, 0xF8, 0x80, 0x10,
+        0x49, 0x80, 0x3D, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00001976UL,
+    {
+    0xE0, 0x28, 0xCA, 0x00, 0x6A, 0x24, 0x0D, 0x03, 0xE0, 0x38, 0xCA, 0x00,
+        0x6A, 0x24, 0xC2, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00001986UL,
+    {
+    0x80, 0x10, 0xCA, 0x00, 0x44, 0x06, 0x49, 0x81, 0x3D, 0x0F, 0xE1, 0x88,
+        0xF7, 0xF8, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001996UL,
+    {
+    0xE1, 0x18, 0xF7, 0xF8, 0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA,
+        0x01, 0x00, 0xE0, 0x28}
+  }
+  , 
+  {
+    0x10, 0x000019A6UL,
+    {
+    0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B, 0xE1, 0x88, 0xF7, 0xF8,
+        0x2C, 0x10, 0xF7, 0x8E}
+  }
+  , 
+  {
+    0x10, 0x000019B6UL,
+    {
+    0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28,
+        0xCA, 0x00, 0xD8, 0x1E}
+  }
+  , 
+  {
+    0x10, 0x000019C6UL,
+    {
+    0xEA, 0x00, 0xFA, 0x1B, 0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10,
+        0xDC, 0x05, 0xF4, 0x84}
+  }
+  , 
+  {
+    0x10, 0x000019D6UL,
+    {
+    0x02, 0x00, 0xC0, 0x89, 0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84,
+        0x01, 0x00, 0xC0, 0x88}
+  }
+  , 
+  {
+    0x10, 0x000019E6UL,
+    {
+    0xCA, 0x00, 0x76, 0x1E, 0x49, 0x81, 0x3D, 0x0F, 0xE1, 0xB8, 0xF7, 0xF8,
+        0x2C, 0x10, 0xE1, 0x18}
+  }
+  , 
+  {
+    0x10, 0x000019F6UL,
+    {
+    0xF7, 0xF8, 0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00,
+        0xE0, 0x28, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A06UL,
+    {
+    0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B, 0xE1, 0xB8, 0xF7, 0xF8, 0x2C, 0x10,
+        0xF7, 0x8E, 0x2D, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001A16UL,
+    {
+    0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00,
+        0xD8, 0x1E, 0xEA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A26UL,
+    {
+    0xFA, 0x1B, 0xE1, 0xC8, 0xF7, 0xF8, 0x2C, 0x10, 0xD7, 0x00, 0x00, 0x00,
+        0xF2, 0xF4, 0xAE, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A36UL,
+    {
+    0xF6, 0xF4, 0x2E, 0x10, 0xF6, 0x8E, 0x30, 0x10, 0xF3, 0xF8, 0x2D, 0x11,
+        0x49, 0x81, 0x3D, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x00001A46UL,
+    {
+    0xE0, 0x14, 0xF6, 0xF4, 0x30, 0x10, 0xE0, 0x8C, 0xE6, 0xFA, 0x32, 0xC0,
+        0xE6, 0xFB, 0x00, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A56UL,
+    {
+    0xE6, 0xF8, 0x32, 0x10, 0xE6, 0xF9, 0x01, 0x00, 0xCA, 0x00, 0x1A, 0x29,
+        0x0D, 0x0B, 0xE0, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x00001A66UL,
+    {
+    0xE6, 0xFA, 0x2A, 0xC0, 0xE6, 0xFB, 0x00, 0x00, 0xE6, 0xF8, 0x32, 0x10,
+        0xE6, 0xF9, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A76UL,
+    {
+    0xCA, 0x00, 0x1A, 0x29, 0xF3, 0xF8, 0x2C, 0x11, 0x49, 0x81, 0x3D, 0x11,
+        0xF2, 0xF4, 0x30, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001A86UL,
+    {
+    0x08, 0x41, 0xF6, 0xF4, 0x30, 0x10, 0xE0, 0x8C, 0xE6, 0xFA, 0x32, 0xC0,
+        0xE6, 0xFB, 0x00, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001A96UL,
+    {
+    0xE6, 0xF8, 0x3C, 0x10, 0xE6, 0xF9, 0x01, 0x00, 0xCA, 0x00, 0x1A, 0x29,
+        0x0D, 0x0B, 0xE0, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x00001AA6UL,
+    {
+    0xE6, 0xFA, 0x2A, 0xC0, 0xE6, 0xFB, 0x00, 0x00, 0xE6, 0xF8, 0x3C, 0x10,
+        0xE6, 0xF9, 0x01, 0x00}
+  }
+  , 
+  {
+    0x0C, 0x00001AB6UL,
+    {
+    0xCA, 0x00, 0x1A, 0x29, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001AC2UL,
+    {
+    0xE6, 0xF8, 0x1A, 0x00, 0xCA, 0x00, 0xD8, 0x1E, 0xEA, 0x00, 0xFA, 0x1B,
+        0x8A, 0x04, 0x19, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001AD2UL,
+    {
+    0xBE, 0x88, 0xCC, 0x00, 0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10,
+        0xDC, 0x05, 0xD4, 0x44}
+  }
+  , 
+  {
+    0x10, 0x00001AE2UL,
+    {
+    0x02, 0x00, 0xF6, 0xF4, 0x14, 0xFD, 0x7C, 0x14, 0xF6, 0xF4, 0x14, 0xFD,
+        0xF6, 0xF4, 0x12, 0xFD}
+  }
+  , 
+  {
+    0x10, 0x00001AF2UL,
+    {
+    0x0F, 0x04, 0xBF, 0x88, 0xE1, 0xD8, 0xF7, 0xF8, 0x2C, 0x10, 0xE1, 0x18,
+        0xF7, 0xF8, 0x2D, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001B02UL,
+    {
+    0x0D, 0x05, 0xE1, 0xD8, 0xF7, 0xF8, 0x2C, 0x10, 0xF7, 0x8E, 0x2D, 0x10,
+        0xE6, 0xF9, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001B12UL,
+    {
+    0xE6, 0xFA, 0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0x0D, 0x6E,
+        0x9A, 0x04, 0x08, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001B22UL,
+    {
+    0x0E, 0x04, 0xE1, 0xE8, 0xF7, 0xF8, 0x2C, 0x10, 0xE1, 0x18, 0xF7, 0xF8,
+        0x2D, 0x10, 0x0D, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00001B32UL,
+    {
+    0xE1, 0xE8, 0xF7, 0xF8, 0x2C, 0x10, 0xF7, 0x8E, 0x2D, 0x10, 0xE6, 0xF9,
+        0x2C, 0x10, 0xE6, 0xFA}
+  }
+  , 
+  {
+    0x10, 0x00001B42UL,
+    {
+    0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0x0D, 0x57, 0xF2, 0xF7,
+        0x7E, 0x10, 0xF2, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00001B52UL,
+    {
+    0x7C, 0x10, 0x06, 0xF6, 0x08, 0x00, 0xDC, 0x17, 0x98, 0x46, 0xA8, 0x56,
+        0x88, 0x50, 0x88, 0x40}
+  }
+  , 
+  {
+    0x10, 0x00001B62UL,
+    {
+    0xF2, 0xF5, 0x7E, 0x10, 0xF2, 0xF4, 0x7C, 0x10, 0x08, 0x44, 0xDC, 0x15,
+        0x98, 0xB4, 0xA8, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x00001B72UL,
+    {
+    0xF2, 0xF4, 0x7C, 0x10, 0xDC, 0x05, 0xF4, 0x84, 0x03, 0x00, 0xC0, 0x8A,
+        0xF2, 0xF4, 0x7C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001B82UL,
+    {
+    0xDC, 0x05, 0xF4, 0x84, 0x02, 0x00, 0xC0, 0x89, 0xF2, 0xF4, 0x7C, 0x10,
+        0xDC, 0x05, 0xF4, 0x84}
+  }
+  , 
+  {
+    0x10, 0x00001B92UL,
+    {
+    0x01, 0x00, 0xC0, 0x88, 0xCA, 0x00, 0x1A, 0x03, 0x08, 0x04, 0x49, 0x81,
+        0x3D, 0x0E, 0xE1, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00001BA2UL,
+    {
+    0xF7, 0xF8, 0x2C, 0x10, 0xE1, 0x18, 0xF7, 0xF8, 0x2D, 0x10, 0xE6, 0xF9,
+        0x2C, 0x10, 0xE6, 0xFA}
+  }
+  , 
+  {
+    0x10, 0x00001BB2UL,
+    {
+    0x01, 0x00, 0xE0, 0x28, 0xCA, 0x00, 0xD8, 0x1E, 0x0D, 0x1F, 0xE1, 0xF8,
+        0xF7, 0xF8, 0x2C, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001BC2UL,
+    {
+    0xF7, 0x8E, 0x2D, 0x10, 0xE6, 0xF9, 0x2C, 0x10, 0xE6, 0xFA, 0x01, 0x00,
+        0xE0, 0x28, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001BD2UL,
+    {
+    0xD8, 0x1E, 0x0D, 0x12, 0xF2, 0xF7, 0x7E, 0x10, 0xF2, 0xF6, 0x7C, 0x10,
+        0xDC, 0x07, 0xA9, 0x86}
+  }
+  , 
+  {
+    0x10, 0x00001BE2UL,
+    {
+    0x57, 0xF8, 0xFF, 0x00, 0xDC, 0x07, 0xB9, 0x86, 0xF2, 0xFA, 0x7E, 0x10,
+        0xF2, 0xF9, 0x7C, 0x10}
+  }
+  , 
+  {
+    0x0E, 0x00001BF2UL,
+    {
+    0xC2, 0xF8, 0x82, 0x10, 0xCA, 0x00, 0xD8, 0x1E, 0xFC, 0xFF, 0xFC, 0xFE,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001C00UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xD8, 0x28, 0x02, 0x0D, 0x0F,
+        0xE0, 0x09, 0xF0, 0x4D}
+  }
+  , 
+  {
+    0x10, 0x00001C10UL,
+    {
+    0xC0, 0x88, 0xCA, 0x00, 0x70, 0x2A, 0x49, 0x80, 0x2D, 0x10, 0xF0, 0xAF,
+        0xF0, 0x9E, 0xE0, 0x08}
+  }
+  , 
+  {
+    0x10, 0x00001C20UL,
+    {
+    0xCA, 0x00, 0x8A, 0x08, 0xE0, 0x08, 0xCA, 0x00, 0xFA, 0x20, 0xF0, 0x90,
+        0xE0, 0x08, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001C30UL,
+    {
+    0xA2, 0x20, 0xF0, 0xE4, 0xF0, 0xF5, 0x70, 0x45, 0x3D, 0xE9, 0x08, 0x02,
+        0xFC, 0xFF, 0xFC, 0xFE}
+  }
+  , 
+  {
+    0x04, 0x00001C40UL,
+    {
+    0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001C44UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xD8, 0x28, 0x02, 0x0D, 0x0F,
+        0xE0, 0x19, 0xF0, 0x4D}
+  }
+  , 
+  {
+    0x10, 0x00001C54UL,
+    {
+    0xC0, 0x88, 0xCA, 0x00, 0x70, 0x2A, 0x49, 0x80, 0x2D, 0x10, 0xF0, 0xAF,
+        0xF0, 0x9E, 0xE0, 0x18}
+  }
+  , 
+  {
+    0x10, 0x00001C64UL,
+    {
+    0xCA, 0x00, 0x8A, 0x08, 0xE0, 0x18, 0xCA, 0x00, 0xFA, 0x20, 0xF0, 0x90,
+        0xE0, 0x18, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001C74UL,
+    {
+    0xA2, 0x20, 0xF0, 0xE4, 0xF0, 0xF5, 0x70, 0x45, 0x3D, 0xE9, 0x08, 0x02,
+        0xFC, 0xFF, 0xFC, 0xFE}
+  }
+  , 
+  {
+    0x04, 0x00001C84UL,
+    {
+    0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001C88UL,
+    {
+    0xEC, 0xFE, 0xEC, 0xFF, 0x0D, 0x0E, 0xE0, 0x08, 0xCA, 0x00, 0x18, 0x1F,
+        0x49, 0x80, 0x2D, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x00001C98UL,
+    {
+    0xF0, 0xBF, 0xF0, 0xAE, 0xE6, 0xF9, 0x12, 0x00, 0xE0, 0x08, 0xCA, 0x00,
+        0x56, 0x1F, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001CA8UL,
+    {
+    0x18, 0x0C, 0xCA, 0x00, 0xB8, 0x0B, 0xF0, 0xE4, 0xF0, 0xF5, 0x70, 0x45,
+        0x3D, 0xEC, 0xFC, 0xFF}
+  }
+  , 
+  {
+    0x04, 0x00001CB8UL,
+    {
+    0xFC, 0xFE, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001CBCUL,
+    {
+    0xEC, 0xFE, 0xEC, 0xFF, 0x0D, 0x0E, 0xE0, 0x18, 0xCA, 0x00, 0x18, 0x1F,
+        0x49, 0x80, 0x2D, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x00001CCCUL,
+    {
+    0xF0, 0xBF, 0xF0, 0xAE, 0xE6, 0xF9, 0x12, 0x00, 0xE0, 0x18, 0xCA, 0x00,
+        0x56, 0x1F, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001CDCUL,
+    {
+    0x34, 0x0C, 0xCA, 0x00, 0xE8, 0x0B, 0xF0, 0xE4, 0xF0, 0xF5, 0x70, 0x45,
+        0x3D, 0xEC, 0xFC, 0xFF}
+  }
+  , 
+  {
+    0x04, 0x00001CECUL,
+    {
+    0xFC, 0xFE, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001CF0UL,
+    {
+    0x06, 0xF0, 0xF4, 0xFF, 0xE0, 0x08, 0xCA, 0x00, 0xA0, 0x0A, 0xB8, 0x40,
+        0xC2, 0xF4, 0xF4, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001D00UL,
+    {
+    0xC4, 0x40, 0x02, 0x00, 0xE0, 0x18, 0xCA, 0x00, 0xA0, 0x0A, 0xC4, 0x40,
+        0x04, 0x00, 0xC2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001D10UL,
+    {
+    0xF3, 0xFC, 0xC4, 0x40, 0x06, 0x00, 0xC2, 0xF4, 0xF0, 0x10, 0xC4, 0x40,
+        0x08, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00001D20UL,
+    {
+    0x2A, 0x10, 0x24, 0x8F, 0x2A, 0x10, 0xC4, 0x50, 0x0A, 0x00, 0xF0, 0xA0,
+        0xE0, 0x0B, 0x06, 0xFA}
+  }
+  , 
+  {
+    0x10, 0x00001D30UL,
+    {
+    0x00, 0x00, 0x16, 0xFB, 0x01, 0x00, 0xE0, 0xC9, 0xE0, 0x08, 0xCA, 0x00,
+        0x80, 0x21, 0x06, 0xF0}
+  }
+  , 
+  {
+    0x04, 0x00001D40UL,
+    {
+    0x0C, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001D44UL,
+    {
+    0xE6, 0x8A, 0xAF, 0x04, 0xE6, 0x0D, 0x02, 0x20, 0xE6, 0x8B, 0xAF, 0x04,
+        0xE6, 0x0E, 0x40, 0x20}
+  }
+  , 
+  {
+    0x10, 0x00001D54UL,
+    {
+    0xE6, 0x8C, 0x5F, 0x04, 0xE6, 0x0F, 0x08, 0x10, 0xE6, 0x8D, 0xAF, 0x04,
+        0x0E, 0x04, 0xE0, 0x28}
+  }
+  , 
+  {
+    0x10, 0x00001D64UL,
+    {
+    0xCA, 0x00, 0x18, 0x26, 0xE0, 0x88, 0xCA, 0x00, 0xFA, 0x27, 0xE0, 0x49,
+        0xE0, 0x08, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001D74UL,
+    {
+    0xFE, 0x01, 0xE0, 0x59, 0xE0, 0x18, 0xCA, 0x00, 0xFE, 0x01, 0xE0, 0x68,
+        0xCA, 0x00, 0x1C, 0x01}
+  }
+  , 
+  {
+    0x10, 0x00001D84UL,
+    {
+    0xE0, 0x18, 0xCA, 0x00, 0xE0, 0x1D, 0xE0, 0x29, 0xE0, 0x08, 0xCA, 0x00,
+        0xEE, 0x1D, 0xE0, 0x39}
+  }
+  , 
+  {
+    0x10, 0x00001D94UL,
+    {
+    0xE0, 0x18, 0xCA, 0x00, 0xEE, 0x1D, 0xE0, 0x49, 0xE0, 0x08, 0xCA, 0x00,
+        0x0E, 0x1E, 0xE0, 0x59}
+  }
+  , 
+  {
+    0x10, 0x00001DA4UL,
+    {
+    0xE0, 0x18, 0xCA, 0x00, 0x0E, 0x1E, 0xCA, 0x00, 0x2E, 0x1E, 0xE6, 0xFC,
+        0x2A, 0x00, 0xE6, 0xFA}
+  }
+  , 
+  {
+    0x10, 0x00001DB4UL,
+    {
+    0x00, 0x10, 0xE6, 0xFB, 0x01, 0x00, 0xE0, 0x48, 0xE6, 0xF9, 0x20, 0x00,
+        0xCA, 0x00, 0x1A, 0x29}
+  }
+  , 
+  {
+    0x10, 0x00001DC4UL,
+    {
+    0xE0, 0x6C, 0xE6, 0xFA, 0xB0, 0x00, 0xE6, 0xFB, 0x00, 0x00, 0xE6, 0xF8,
+        0x2E, 0x00, 0xE6, 0xF9}
+  }
+  , 
+  {
+    0x0C, 0x00001DD4UL,
+    {
+    0x20, 0x00, 0xCA, 0x00, 0x1A, 0x29, 0xCA, 0x00, 0xAC, 0x24, 0x0D, 0xFD}
+  }
+  , 
+  {
+    0x10, 0x00002A70UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xF0, 0xD9, 0xF0, 0xE8, 0xF0, 0x49, 0x49, 0x80,
+        0x3D, 0x06, 0xF0, 0x4E}
+  }
+  , 
+  {
+    0x10, 0x00002A80UL,
+    {
+    0xC0, 0x89, 0xE0, 0x08, 0xCA, 0x00, 0x48, 0x25, 0x0D, 0x0A, 0xF0, 0x4D,
+        0x49, 0x81, 0x3D, 0x06}
+  }
+  , 
+  {
+    0x10, 0x00002A90UL,
+    {
+    0xF0, 0x4E, 0xC0, 0x89, 0xE0, 0x18, 0xCA, 0x00, 0x48, 0x25, 0x0D, 0x01,
+        0xE1, 0x08, 0xFC, 0xFE}
+  }
+  , 
+  {
+    0x04, 0x00002AA0UL,
+    {
+    0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002AA4UL,
+    {
+    0xEC, 0xFD, 0xF0, 0xD8, 0xF0, 0x48, 0x49, 0x80, 0x3D, 0x04, 0xE0, 0x08,
+        0xCA, 0x00, 0xA4, 0x25}
+  }
+  , 
+  {
+    0x10, 0x00002AB4UL,
+    {
+    0x0D, 0x06, 0xF0, 0x4D, 0x49, 0x81, 0x3D, 0x03, 0xE0, 0x18, 0xCA, 0x00,
+        0xA4, 0x25, 0xFC, 0xFD}
+  }
+  , 
+  {
+    0x02, 0x00002AC4UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002AC6UL,
+    {
+    0xEC, 0xFD, 0xF0, 0xD8, 0xF0, 0x48, 0x49, 0x80, 0x3D, 0x09, 0xE0, 0x08,
+        0xCA, 0x00, 0xFE, 0x25}
+  }
+  , 
+  {
+    0x10, 0x00002AD6UL,
+    {
+    0x48, 0x40, 0x3D, 0x02, 0xE1, 0x08, 0x0D, 0x0F, 0xE1, 0x18, 0x0D, 0x0D,
+        0xF0, 0x4D, 0x49, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00002AE6UL,
+    {
+    0x3D, 0x09, 0xE0, 0x18, 0xCA, 0x00, 0xFE, 0x25, 0x48, 0x40, 0x3D, 0x02,
+        0xE1, 0x08, 0x0D, 0x03}
+  }
+  , 
+  {
+    0x0A, 0x00002AF6UL,
+    {
+    0xE1, 0x18, 0x0D, 0x01, 0xE1, 0x08, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B34UL,
+    {
+    0x02, 0x40, 0x5A, 0x11, 0x01, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B3AUL,
+    {
+    0x02, 0x40, 0x5C, 0x11, 0x01, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B40UL,
+    {
+    0x01, 0x40, 0x5E, 0x11, 0x08, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B46UL,
+    {
+    0x02, 0x40, 0x00, 0xFD, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B4CUL,
+    {
+    0x02, 0x40, 0x02, 0xFD, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B52UL,
+    {
+    0x02, 0x40, 0x04, 0xFD, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B58UL,
+    {
+    0x02, 0x40, 0x06, 0xFD, 0x00, 0x00}
+  }
+  , 
+  {
+    0x02, 0x00002B5EUL,
+    {
+    0x04, 0x81}
+  }
+  , 
+  {
+    0x02, 0x00002B60UL,
+    {
+    0x84, 0x82}
+  }
+  , 
+  {
+    0x02, 0x00002B62UL,
+    {
+    0x04, 0x83}
+  }
+  , 
+  {
+    0x02, 0x00002B64UL,
+    {
+    0x84, 0x84}
+  }
+  , 
+  {
+    0x02, 0x00002B66UL,
+    {
+    0x84, 0x85}
+  }
+  , 
+  {
+    0x02, 0x00002B68UL,
+    {
+    0x84, 0x86}
+  }
+  , 
+  {
+    0x02, 0x00002B6AUL,
+    {
+    0x04, 0x87}
+  }
+  , 
+  {
+    0x02, 0x00002B6CUL,
+    {
+    0x04, 0x88}
+  }
+  , 
+  {
+    0x02, 0x00002B6EUL,
+    {
+    0x84, 0x89}
+  }
+  , 
+  {
+    0x02, 0x00002B70UL,
+    {
+    0x84, 0x8A}
+  }
+  , 
+  {
+    0x10, 0x000022E6UL,
+    {
+    0xF0, 0x48, 0x07, 0xF8, 0xF0, 0x00, 0x2D, 0x14, 0x07, 0xF8, 0xF0, 0x00,
+        0x2D, 0x13, 0x29, 0x81}
+  }
+  , 
+  {
+    0x10, 0x000022F6UL,
+    {
+    0x2D, 0x13, 0x07, 0xF8, 0xF1, 0x00, 0x2D, 0x12, 0x29, 0x81, 0x2D, 0x12,
+        0x07, 0xF8, 0xF3, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002306UL,
+    {
+    0x2D, 0x11, 0x29, 0x81, 0x2D, 0x11, 0x07, 0xF8, 0x3A, 0x00, 0x3D, 0x10,
+        0xE1, 0x08, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002316UL,
+    {
+    0xE1, 0x18, 0xCB, 0x00, 0xE1, 0x28, 0xCB, 0x00, 0xE1, 0x38, 0xCB, 0x00,
+        0xE1, 0x48, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002326UL,
+    {
+    0xE1, 0x58, 0xCB, 0x00, 0xE1, 0x68, 0xCB, 0x00, 0xE1, 0x78, 0xCB, 0x00,
+        0xE7, 0xF8, 0xFF, 0x00}
+  }
+  , 
+  {
+    0x02, 0x00002336UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002338UL,
+    {
+    0xF0, 0x48, 0x47, 0xF8, 0x08, 0x00, 0x9D, 0x42, 0xC0, 0x84, 0x5C, 0x24,
+        0x06, 0xF4, 0x4A, 0x23}
+  }
+  , 
+  {
+    0x10, 0x00002348UL,
+    {
+    0x9C, 0x04, 0xEA, 0x00, 0x6A, 0x23, 0xEA, 0x00, 0x70, 0x23, 0xEA, 0x00,
+        0x7C, 0x23, 0xEA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002358UL,
+    {
+    0x88, 0x23, 0xEA, 0x00, 0x94, 0x23, 0xEA, 0x00, 0xA0, 0x23, 0xEA, 0x00,
+        0xAC, 0x23, 0xEA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002368UL,
+    {
+    0xB8, 0x23, 0x4A, 0x04, 0x03, 0xA5, 0xCB, 0x00, 0x9A, 0x04, 0x2D, 0x90,
+        0x0F, 0x02, 0xD1, 0x80}
+  }
+  , 
+  {
+    0x10, 0x00002378UL,
+    {
+    0x7F, 0xCA, 0xCB, 0x00, 0x9A, 0x04, 0x27, 0x80, 0x0F, 0x01, 0xD1, 0x80,
+        0x7F, 0xC6, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002388UL,
+    {
+    0x9A, 0x04, 0x21, 0x70, 0x1F, 0x01, 0xD1, 0x80, 0x7F, 0xC6, 0xCB, 0x00,
+        0x9A, 0x04, 0x1B, 0x60}
+  }
+  , 
+  {
+    0x10, 0x00002398UL,
+    {
+    0x0F, 0x00, 0xD1, 0x80, 0x7F, 0xC2, 0xCB, 0x00, 0x9A, 0x04, 0x15, 0x50,
+        0x1F, 0x00, 0xD1, 0x80}
+  }
+  , 
+  {
+    0x10, 0x000023A8UL,
+    {
+    0x7F, 0xC2, 0xCB, 0x00, 0x9A, 0x04, 0x0F, 0x40, 0xEF, 0x00, 0xD1, 0x80,
+        0x7F, 0xC2, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000023B8UL,
+    {
+    0x9A, 0x04, 0x09, 0x20, 0xFF, 0x00, 0xD1, 0x80, 0x7F, 0xC2, 0xCB, 0x00,
+        0xF0, 0x48, 0xC0, 0x89}
+  }
+  , 
+  {
+    0x08, 0x000023C8UL,
+    {
+    0xE0, 0x38, 0xCA, 0x00, 0x84, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000023D0UL,
+    {
+    0xE1, 0x0A, 0xF0, 0x48, 0xC0, 0x84, 0xE4, 0xA4, 0xCF, 0x10, 0xF0, 0x48,
+        0x47, 0xF8, 0x08, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000023E0UL,
+    {
+    0x9D, 0x1D, 0xC0, 0x84, 0x5C, 0x14, 0x06, 0xF4, 0xEC, 0x23, 0x9C, 0x04,
+        0x0D, 0x07, 0x0D, 0x08}
+  }
+  , 
+  {
+    0x10, 0x000023F0UL,
+    {
+    0x0D, 0x09, 0x0D, 0x0A, 0x0D, 0x0B, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0E,
+        0x5E, 0x03, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002400UL,
+    {
+    0x0E, 0x02, 0xCB, 0x00, 0x0E, 0x01, 0xCB, 0x00, 0x1E, 0x01, 0xCB, 0x00,
+        0x0E, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002410UL,
+    {
+    0x1E, 0x00, 0xCB, 0x00, 0xEE, 0x00, 0xCB, 0x00, 0xFE, 0x00, 0xCB, 0x00,
+        0xF0, 0x48, 0xC0, 0x89}
+  }
+  , 
+  {
+    0x08, 0x00002420UL,
+    {
+    0xE0, 0x58, 0xCA, 0x00, 0x84, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002428UL,
+    {
+    0xF0, 0x48, 0x47, 0xF8, 0x08, 0x00, 0x9D, 0x1C, 0xC0, 0x84, 0x5C, 0x14,
+        0x06, 0xF4, 0x3A, 0x24}
+  }
+  , 
+  {
+    0x10, 0x00002438UL,
+    {
+    0x9C, 0x04, 0x0D, 0x07, 0x0D, 0x08, 0x0D, 0x09, 0x0D, 0x0A, 0x0D, 0x0B,
+        0x0D, 0x0C, 0x0D, 0x0D}
+  }
+  , 
+  {
+    0x10, 0x00002448UL,
+    {
+    0x0D, 0x0E, 0xAF, 0x04, 0xCB, 0x00, 0x9F, 0x04, 0xCB, 0x00, 0x8F, 0x04,
+        0xCB, 0x00, 0x7F, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00002458UL,
+    {
+    0xCB, 0x00, 0x6F, 0x04, 0xCB, 0x00, 0x5F, 0x04, 0xCB, 0x00, 0x4F, 0x04,
+        0xCB, 0x00, 0x2F, 0x04}
+  }
+  , 
+  {
+    0x02, 0x00002468UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000246AUL,
+    {
+    0xF0, 0x48, 0x47, 0xF8, 0x08, 0x00, 0x9D, 0x1C, 0xC0, 0x84, 0x5C, 0x14,
+        0x06, 0xF4, 0x7C, 0x24}
+  }
+  , 
+  {
+    0x10, 0x0000247AUL,
+    {
+    0x9C, 0x04, 0x0D, 0x07, 0x0D, 0x08, 0x0D, 0x09, 0x0D, 0x0A, 0x0D, 0x0B,
+        0x0D, 0x0C, 0x0D, 0x0D}
+  }
+  , 
+  {
+    0x10, 0x0000248AUL,
+    {
+    0x0D, 0x0E, 0xAE, 0x04, 0xCB, 0x00, 0x9E, 0x04, 0xCB, 0x00, 0x8E, 0x04,
+        0xCB, 0x00, 0x7E, 0x04}
+  }
+  , 
+  {
+    0x10, 0x0000249AUL,
+    {
+    0xCB, 0x00, 0x6E, 0x04, 0xCB, 0x00, 0x5E, 0x04, 0xCB, 0x00, 0x4E, 0x04,
+        0xCB, 0x00, 0x2E, 0x04}
+  }
+  , 
+  {
+    0x02, 0x000024AAUL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000024ACUL,
+    {
+    0xF2, 0xF4, 0x06, 0xFD, 0x3D, 0x0A, 0xCA, 0x00, 0xA4, 0x26, 0x0D, 0xFA,
+        0x0D, 0x06, 0xAA, 0x03}
+  }
+  , 
+  {
+    0x10, 0x000024BCUL,
+    {
+    0x01, 0x50, 0x0D, 0x03, 0xE0, 0x08, 0xCA, 0x00, 0xF0, 0x1C, 0xF2, 0xF4,
+        0x06, 0xFD, 0x3D, 0xF7}
+  }
+  , 
+  {
+    0x02, 0x000024CCUL,
+    {
+    0x0D, 0xEF}
+  }
+  , 
+  {
+    0x10, 0x000024CEUL,
+    {
+    0x0D, 0x06, 0xAA, 0x02, 0x01, 0x00, 0x0D, 0x03, 0xE0, 0x18, 0xCA, 0x00,
+        0x0A, 0x17, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x06, 0x000024DEUL,
+    {
+    0x04, 0xFD, 0x3D, 0xF7, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000024E4UL,
+    {
+    0x0D, 0x0D, 0xAA, 0x01, 0x01, 0x10, 0x0D, 0x04, 0xE0, 0x38, 0xCA, 0x00,
+        0x44, 0x1C, 0x0D, 0x06}
+  }
+  , 
+  {
+    0x10, 0x000024F4UL,
+    {
+    0xAA, 0x01, 0x01, 0x00, 0x0D, 0x03, 0xE0, 0x28, 0xCA, 0x00, 0x00, 0x1C,
+        0xF2, 0xF4, 0x02, 0xFD}
+  }
+  , 
+  {
+    0x04, 0x00002504UL,
+    {
+    0x3D, 0xF0, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002508UL,
+    {
+    0x0D, 0x1B, 0xAA, 0x00, 0x01, 0xF0, 0x0D, 0x04, 0xE0, 0x78, 0xCA, 0x00,
+        0xB2, 0x26, 0x0D, 0x14}
+  }
+  , 
+  {
+    0x10, 0x00002518UL,
+    {
+    0xAA, 0x00, 0x01, 0xE0, 0x0D, 0x04, 0xE0, 0x68, 0xCA, 0x00, 0x50, 0x0C,
+        0x0D, 0x0D, 0xAA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002528UL,
+    {
+    0x01, 0x10, 0x0D, 0x04, 0xE0, 0x58, 0xCA, 0x00, 0xBC, 0x1C, 0x0D, 0x06,
+        0xAA, 0x00, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002538UL,
+    {
+    0x0D, 0x03, 0xE0, 0x48, 0xCA, 0x00, 0x88, 0x1C, 0xF2, 0xF4, 0x00, 0xFD,
+        0x3D, 0xE2, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002548UL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x13, 0x09, 0x81, 0x3D, 0x22, 0xBE, 0x88,
+        0xCC, 0x00, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00002558UL,
+    {
+    0x5C, 0x11, 0x3D, 0x07, 0xF0, 0x49, 0x29, 0x82, 0x3D, 0x01, 0x3F, 0x04,
+        0xBF, 0x88, 0xE1, 0x08}
+  }
+  , 
+  {
+    0x10, 0x00002568UL,
+    {
+    0xCB, 0x00, 0x04, 0x8F, 0x5C, 0x11, 0xBF, 0x88, 0xE1, 0x18, 0xCB, 0x00,
+        0xBE, 0x88, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002578UL,
+    {
+    0xF2, 0xF4, 0x5A, 0x11, 0x3D, 0x07, 0xF0, 0x49, 0x29, 0x83, 0x3D, 0x01,
+        0x1F, 0x04, 0xBF, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002588UL,
+    {
+    0xE1, 0x08, 0xCB, 0x00, 0x04, 0x8F, 0x5A, 0x11, 0xBF, 0x88, 0xE1, 0x18,
+        0xCB, 0x00, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x0C, 0x00002598UL,
+    {
+    0xC0, 0x89, 0xE0, 0x48, 0xCA, 0x00, 0x84, 0x00, 0xE1, 0x08, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000025A4UL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x13, 0x09, 0x81, 0x3D, 0x22, 0xBE, 0x88,
+        0xCC, 0x00, 0x24, 0x8F}
+  }
+  , 
+  {
+    0x10, 0x000025B4UL,
+    {
+    0x5C, 0x11, 0xBF, 0x88, 0xAA, 0x04, 0x01, 0x30, 0x0D, 0x07, 0xBE, 0x88,
+        0xCC, 0x00, 0x9A, 0x04}
+  }
+  , 
+  {
+    0x10, 0x000025C4UL,
+    {
+    0x03, 0x80, 0x0F, 0x01, 0xD1, 0x80, 0x7F, 0xC6, 0xBF, 0x88, 0xCB, 0x00,
+        0xBE, 0x88, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000025D4UL,
+    {
+    0x24, 0x8F, 0x5A, 0x11, 0xBF, 0x88, 0xAA, 0x04, 0x01, 0x10, 0x0D, 0x07,
+        0xBE, 0x88, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000025E4UL,
+    {
+    0x9A, 0x04, 0x03, 0x70, 0x1F, 0x01, 0xD1, 0x80, 0x7F, 0xC6, 0xBF, 0x88,
+        0xCB, 0x00, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x0A, 0x000025F4UL,
+    {
+    0xC0, 0x89, 0xE0, 0x48, 0xCA, 0x00, 0x84, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000025FEUL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x05, 0x09, 0x81, 0x3D, 0x06, 0xF2, 0xF4,
+        0x5C, 0x11, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x0A, 0x0000260EUL,
+    {
+    0xF2, 0xF4, 0x5A, 0x11, 0xCB, 0x00, 0xE0, 0x04, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000291AUL,
+    {
+    0x48, 0xC0, 0x2D, 0x08, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0x08, 0x81, 0x28, 0xC1}
+  }
+  , 
+  {
+    0x06, 0x0000292AUL,
+    {
+    0x48, 0xC0, 0x3D, 0xF8, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002930UL,
+    {
+    0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B,
+        0x99, 0x8A, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x10, 0x00002940UL,
+    {
+    0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0x08, 0x81, 0xDC, 0x0B}
+  }
+  , 
+  {
+    0x10, 0x00002950UL,
+    {
+    0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A,
+        0xDC, 0x09, 0xB9, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002960UL,
+    {
+    0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81,
+        0xDC, 0x0B, 0x99, 0x8A}
+  }
+  , 
+  {
+    0x10, 0x00002970UL,
+    {
+    0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0xA9, 0x8A, 0xDC, 0x09,
+        0xB9, 0x88, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002980UL,
+    {
+    0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B,
+        0x99, 0x8A, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x10, 0x00002990UL,
+    {
+    0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0x08, 0x81, 0xDC, 0x0B}
+  }
+  , 
+  {
+    0x10, 0x000029A0UL,
+    {
+    0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A,
+        0xDC, 0x09, 0xB9, 0x88}
+  }
+  , 
+  {
+    0x10, 0x000029B0UL,
+    {
+    0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81,
+        0xDC, 0x0B, 0x99, 0x8A}
+  }
+  , 
+  {
+    0x10, 0x000029C0UL,
+    {
+    0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09,
+        0xB9, 0x88, 0x08, 0x81}
+  }
+  , 
+  {
+    0x10, 0x000029D0UL,
+    {
+    0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B,
+        0x99, 0x8A, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x10, 0x000029E0UL,
+    {
+    0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0x08, 0x81, 0xDC, 0x0B}
+  }
+  , 
+  {
+    0x10, 0x000029F0UL,
+    {
+    0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0xA9, 0x8A,
+        0xDC, 0x09, 0xB9, 0x88}
+  }
+  , 
+  {
+    0x02, 0x00002A00UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002A02UL,
+    {
+    0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B,
+        0x99, 0x8A, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x10, 0x00002A12UL,
+    {
+    0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0x08, 0x81, 0xDC, 0x0B}
+  }
+  , 
+  {
+    0x10, 0x00002A22UL,
+    {
+    0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A,
+        0xDC, 0x09, 0xB9, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002A32UL,
+    {
+    0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81,
+        0xDC, 0x0B, 0x99, 0x8A}
+  }
+  , 
+  {
+    0x10, 0x00002A42UL,
+    {
+    0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09,
+        0xB9, 0x88, 0x08, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00002A52UL,
+    {
+    0xDC, 0x0B, 0x99, 0x8A, 0xDC, 0x09, 0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B,
+        0x99, 0x8A, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x0E, 0x00002A62UL,
+    {
+    0xB9, 0x88, 0x08, 0x81, 0xDC, 0x0B, 0xA9, 0x8A, 0xDC, 0x09, 0xB9, 0x88,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000C000UL,
+    {
+    0x0A, 0x20, 0x43, 0x43, 0x49, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6C,
+        0x6C, 0x3A, 0x20, 0x5A}
+  }
+  , 
+  {
+    0x10, 0x0000C010UL,
+    {
+    0x75, 0x65, 0x72, 0x73, 0x74, 0x20, 0x54, 0x61, 0x73, 0x6B, 0x73, 0x20,
+        0x72, 0x65, 0x67, 0x69}
+  }
+  , 
+  {
+    0x0A, 0x0000C020UL,
+    {
+    0x73, 0x74, 0x69, 0x65, 0x72, 0x65, 0x6E, 0x20, 0x21, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B72UL,
+    {
+    0x01, 0x40, 0x4A, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B78UL,
+    {
+    0x01, 0x40, 0x4B, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B7EUL,
+    {
+    0x01, 0x40, 0x4C, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B84UL,
+    {
+    0x01, 0x40, 0x4D, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B8AUL,
+    {
+    0x01, 0x40, 0x4E, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B90UL,
+    {
+    0x01, 0x40, 0x4F, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B96UL,
+    {
+    0x01, 0x40, 0x50, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002B9CUL,
+    {
+    0x01, 0x40, 0x51, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x0E, 0x00001DE0UL,
+    {
+    0xF0, 0x48, 0xF7, 0xF8, 0x4C, 0x11, 0xE1, 0x18, 0x75, 0xF8, 0x4D, 0x11,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001DEEUL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x06, 0x09, 0x81, 0x3D, 0x07, 0xF0, 0x49,
+        0xF7, 0xF8, 0x51, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001DFEUL,
+    {
+    0x0D, 0x03, 0xF0, 0x49, 0xF7, 0xF8, 0x50, 0x11, 0xE1, 0x28, 0x75, 0xF8,
+        0x4D, 0x11, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001E0EUL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x06, 0x09, 0x81, 0x3D, 0x07, 0xF0, 0x49,
+        0xF7, 0xF8, 0x4F, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001E1EUL,
+    {
+    0x0D, 0x03, 0xF0, 0x49, 0xF7, 0xF8, 0x4E, 0x11, 0xE1, 0x48, 0x75, 0xF8,
+        0x4D, 0x11, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001E2EUL,
+    {
+    0xF3, 0xF8, 0x4D, 0x11, 0x49, 0x87, 0x2D, 0x06, 0xE6, 0xF8, 0x00, 0xC0,
+        0xCA, 0x00, 0x36, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001E3EUL,
+    {
+    0xE1, 0x08, 0xCB, 0x00, 0xE0, 0x04, 0xE6, 0xF5, 0x20, 0x00, 0xF6, 0xF4,
+        0x46, 0x11, 0xF6, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00001E4EUL,
+    {
+    0x48, 0x11, 0xE6, 0xF4, 0x00, 0x20, 0xF6, 0xF4, 0x42, 0x11, 0xF6, 0xF5,
+        0x44, 0x11, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001E5EUL,
+    {
+    0x80, 0x22, 0x7E, 0xE6, 0x7F, 0xE7, 0xE6, 0xCA, 0x59, 0x00, 0xD1, 0x90,
+        0x66, 0xE0, 0xFF, 0xCF}
+  }
+  , 
+  {
+    0x08, 0x00001E6EUL,
+    {
+    0x76, 0xE0, 0x00, 0x20, 0xE1, 0x18, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001E76UL,
+    {
+    0xF0, 0x49, 0x49, 0x80, 0x2D, 0x06, 0x49, 0x81, 0x2D, 0x04, 0x49, 0x82,
+        0x2D, 0x02, 0xE1, 0x08}
+  }
+  , 
+  {
+    0x10, 0x00001E86UL,
+    {
+    0xCB, 0x00, 0xF0, 0x48, 0x49, 0x80, 0x3D, 0x04, 0xF0, 0x49, 0xF7, 0xF8,
+        0x4B, 0x11, 0x0D, 0x09}
+  }
+  , 
+  {
+    0x10, 0x00001E96UL,
+    {
+    0xF0, 0x48, 0x49, 0x81, 0x3D, 0x04, 0xF0, 0x49, 0xF7, 0xF8, 0x4A, 0x11,
+        0x0D, 0x02, 0xE1, 0x08}
+  }
+  , 
+  {
+    0x06, 0x00001EA6UL,
+    {
+    0xCB, 0x00, 0xE1, 0x18, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001EACUL,
+    {
+    0xF2, 0xF7, 0x48, 0x11, 0xF2, 0xF6, 0x46, 0x11, 0xDC, 0x07, 0xA9, 0x86,
+        0x49, 0x81, 0x3D, 0x0B}
+  }
+  , 
+  {
+    0x10, 0x00001EBCUL,
+    {
+    0xDC, 0x17, 0xF4, 0x86, 0x01, 0x00, 0xCC, 0x00, 0xB9, 0x88, 0xF2, 0xF5,
+        0x48, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x0C, 0x00001ECCUL,
+    {
+    0x46, 0x11, 0x08, 0x44, 0xCB, 0x00, 0xE0, 0x04, 0xE0, 0x05, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001ED8UL,
+    {
+    0xEC, 0xFD, 0xF0, 0x69, 0xF0, 0x7A, 0xF0, 0xD8, 0xF0, 0x48, 0xC0, 0x8C,
+        0xF0, 0xBA, 0xF0, 0xA9}
+  }
+  , 
+  {
+    0x10, 0x00001EE8UL,
+    {
+    0xF2, 0xF9, 0x48, 0x11, 0xF2, 0xF8, 0x46, 0x11, 0x08, 0x84, 0xCA, 0x00,
+        0x1A, 0x29, 0xF0, 0x6D}
+  }
+  , 
+  {
+    0x10, 0x00001EF8UL,
+    {
+    0xF2, 0xF5, 0x48, 0x11, 0xF2, 0xF4, 0x46, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x01, 0x00, 0xE1, 0x2C}
+  }
+  , 
+  {
+    0x10, 0x00001F08UL,
+    {
+    0xF2, 0xF5, 0x48, 0x11, 0xF2, 0xF4, 0x46, 0x11, 0xDC, 0x05, 0xB9, 0xC4,
+        0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001F18UL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x0E, 0x09, 0x81, 0x3D, 0x18, 0xF2, 0xF5,
+        0x40, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001F28UL,
+    {
+    0x3E, 0x11, 0xDC, 0x05, 0xA9, 0x84, 0x3D, 0x02, 0x0F, 0xF4, 0x0D, 0x01,
+        0x0E, 0xF4, 0x69, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00001F38UL,
+    {
+    0xCB, 0x00, 0xF2, 0xF5, 0x38, 0x11, 0xF2, 0xF4, 0x36, 0x11, 0xDC, 0x05,
+        0xA9, 0x84, 0x3D, 0x02}
+  }
+  , 
+  {
+    0x0E, 0x00001F48UL,
+    {
+    0x0F, 0xF4, 0x0D, 0x01, 0x0E, 0xF4, 0x69, 0x81, 0xCB, 0x00, 0xE1, 0x08,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001F56UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xEA, 0xF0, 0xFB, 0xF0, 0xD9,
+        0xF0, 0x48, 0x29, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00001F66UL,
+    {
+    0x2D, 0x4E, 0x09, 0x81, 0xEA, 0x30, 0x98, 0x20, 0xF2, 0xF9, 0x40, 0x11,
+        0xF2, 0xF8, 0x3E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001F76UL,
+    {
+    0xDC, 0x09, 0xA9, 0x88, 0xEA, 0x30, 0x98, 0x20, 0xF0, 0x6D, 0xDC, 0x09,
+        0xE4, 0xC8, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001F86UL,
+    {
+    0xF0, 0x4D, 0xC0, 0x8C, 0xF0, 0xBF, 0xF0, 0xAE, 0xF2, 0xF9, 0x40, 0x11,
+        0xF2, 0xF8, 0x3E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001F96UL,
+    {
+    0x08, 0x82, 0xCA, 0x00, 0x1A, 0x29, 0xE1, 0x1C, 0xF2, 0xF5, 0x40, 0x11,
+        0xF2, 0xF4, 0x3E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001FA6UL,
+    {
+    0xDC, 0x05, 0xB9, 0xC4, 0xE6, 0xF4, 0x14, 0x00, 0x04, 0xF4, 0x3E, 0x11,
+        0xF2, 0xF9, 0x48, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001FB6UL,
+    {
+    0xF2, 0xF8, 0x46, 0x11, 0xF0, 0x68, 0x06, 0xF6, 0x08, 0x0C, 0xF0, 0x79,
+        0x22, 0xF6, 0x3E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001FC6UL,
+    {
+    0x32, 0xF7, 0x40, 0x11, 0xED, 0x06, 0x06, 0xF8, 0x20, 0x08, 0xF6, 0xF8,
+        0x3E, 0x11, 0xF6, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x00001FD6UL,
+    {
+    0x40, 0x11, 0xF3, 0xF8, 0x4B, 0x11, 0x49, 0x81, 0x3D, 0x03, 0xCA, 0x00,
+        0xDC, 0x21, 0x0D, 0x0D}
+  }
+  , 
+  {
+    0x10, 0x00001FE6UL,
+    {
+    0xF3, 0xF8, 0x4B, 0x11, 0x49, 0x82, 0x3D, 0x09, 0xF2, 0xF5, 0x40, 0x11,
+        0xF2, 0xF4, 0x3E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001FF6UL,
+    {
+    0xDC, 0x05, 0xA9, 0x84, 0x2D, 0x02, 0xCA, 0x00, 0xDC, 0x21, 0xE1, 0x18,
+        0x0D, 0x4B, 0xF2, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x00002006UL,
+    {
+    0x38, 0x11, 0xF2, 0xF8, 0x36, 0x11, 0xDC, 0x09, 0xA9, 0x88, 0x3D, 0x43,
+        0xF0, 0x6D, 0xDC, 0x09}
+  }
+  , 
+  {
+    0x10, 0x00002016UL,
+    {
+    0xE4, 0xC8, 0x01, 0x00, 0xF0, 0x4D, 0xC0, 0x8C, 0xF0, 0xBF, 0xF0, 0xAE,
+        0xF2, 0xF9, 0x38, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002026UL,
+    {
+    0xF2, 0xF8, 0x36, 0x11, 0x08, 0x82, 0xCA, 0x00, 0x1A, 0x29, 0xE1, 0x1C,
+        0xF2, 0xF5, 0x38, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002036UL,
+    {
+    0xF2, 0xF4, 0x36, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xE6, 0xF4, 0x14, 0x00,
+        0x04, 0xF4, 0x36, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002046UL,
+    {
+    0xF2, 0xF9, 0x48, 0x11, 0xF2, 0xF8, 0x46, 0x11, 0xF0, 0x68, 0x06, 0xF6,
+        0xF0, 0x0F, 0xF0, 0x79}
+  }
+  , 
+  {
+    0x10, 0x00002056UL,
+    {
+    0x22, 0xF6, 0x36, 0x11, 0x32, 0xF7, 0x38, 0x11, 0xED, 0x06, 0x06, 0xF8,
+        0x08, 0x0C, 0xF6, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00002066UL,
+    {
+    0x36, 0x11, 0xF6, 0xF9, 0x38, 0x11, 0xF3, 0xF8, 0x4A, 0x11, 0x49, 0x81,
+        0x3D, 0x03, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002076UL,
+    {
+    0xDC, 0x21, 0x0D, 0x0D, 0xF3, 0xF8, 0x4A, 0x11, 0x49, 0x82, 0x3D, 0x09,
+        0xF2, 0xF5, 0x38, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002086UL,
+    {
+    0xF2, 0xF4, 0x36, 0x11, 0xDC, 0x05, 0xA9, 0x84, 0x2D, 0x02, 0xCA, 0x00,
+        0xDC, 0x21, 0xE1, 0x18}
+  }
+  , 
+  {
+    0x0C, 0x00002096UL,
+    {
+    0x0D, 0x01, 0xE1, 0x08, 0xFC, 0xFF, 0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000020A2UL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x14, 0x09, 0x81, 0x3D, 0x24, 0xF2, 0xF7,
+        0x3C, 0x11, 0xF2, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x000020B2UL,
+    {
+    0x3A, 0x11, 0xDC, 0x07, 0xA9, 0x86, 0x2D, 0x1D, 0xDC, 0x17, 0xF4, 0x86,
+        0x01, 0x00, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000020C2UL,
+    {
+    0xB9, 0x89, 0xF2, 0xF5, 0x3C, 0x11, 0xF2, 0xF4, 0x3A, 0x11, 0x08, 0x42,
+        0xCB, 0x00, 0xF2, 0xF7}
+  }
+  , 
+  {
+    0x10, 0x000020D2UL,
+    {
+    0x34, 0x11, 0xF2, 0xF6, 0x32, 0x11, 0xDC, 0x07, 0xA9, 0x86, 0x2D, 0x0B,
+        0xDC, 0x17, 0xF4, 0x86}
+  }
+  , 
+  {
+    0x10, 0x000020E2UL,
+    {
+    0x01, 0x00, 0xCC, 0x00, 0xB9, 0x89, 0xF2, 0xF5, 0x34, 0x11, 0xF2, 0xF4,
+        0x32, 0x11, 0x08, 0x42}
+  }
+  , 
+  {
+    0x08, 0x000020F2UL,
+    {
+    0xCB, 0x00, 0xE0, 0x04, 0xE0, 0x05, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000020FAUL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x21, 0x09, 0x81, 0x3D, 0x3D, 0xE1, 0x0C,
+        0xF2, 0xF5, 0x3C, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000210AUL,
+    {
+    0xF2, 0xF4, 0x3A, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xE6, 0xF4, 0x14, 0x00,
+        0x04, 0xF4, 0x3A, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000211AUL,
+    {
+    0xF2, 0xF9, 0x48, 0x11, 0xF2, 0xF8, 0x46, 0x11, 0xF0, 0x68, 0x06, 0xF6,
+        0x38, 0x04, 0xF0, 0x79}
+  }
+  , 
+  {
+    0x10, 0x0000212AUL,
+    {
+    0x22, 0xF6, 0x3A, 0x11, 0x32, 0xF7, 0x3C, 0x11, 0xED, 0x25, 0x06, 0xF8,
+        0x50, 0x00, 0xF6, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000213AUL,
+    {
+    0x3A, 0x11, 0xF6, 0xF9, 0x3C, 0x11, 0xCB, 0x00, 0xE1, 0x0C, 0xF2, 0xF5,
+        0x34, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x0000214AUL,
+    {
+    0x32, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xE6, 0xF4, 0x14, 0x00, 0x04, 0xF4,
+        0x32, 0x11, 0xF2, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x0000215AUL,
+    {
+    0x48, 0x11, 0xF2, 0xF8, 0x46, 0x11, 0xF0, 0x68, 0x06, 0xF6, 0x20, 0x08,
+        0xF0, 0x79, 0x22, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x0000216AUL,
+    {
+    0x32, 0x11, 0x32, 0xF7, 0x34, 0x11, 0xED, 0x06, 0x06, 0xF8, 0x38, 0x04,
+        0xF6, 0xF8, 0x32, 0x11}
+  }
+  , 
+  {
+    0x06, 0x0000217AUL,
+    {
+    0xF6, 0xF9, 0x34, 0x11, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002180UL,
+    {
+    0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0x2A, 0xF0, 0x3B, 0xF0, 0x78, 0xE1, 0x0C,
+        0xF2, 0xF5, 0x44, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002190UL,
+    {
+    0xF2, 0xF4, 0x42, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xF2, 0xFF, 0x44, 0x11,
+        0xF2, 0xFE, 0x42, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000021A0UL,
+    {
+    0xDC, 0x0F, 0xA9, 0x8E, 0x3D, 0x14, 0xF0, 0x49, 0xC0, 0x8C, 0xF2, 0xF9,
+        0x48, 0x11, 0xF2, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x000021B0UL,
+    {
+    0x46, 0x11, 0x00, 0x87, 0x06, 0xF8, 0xF0, 0x0F, 0xCA, 0x00, 0x1A, 0x29,
+        0xE1, 0x1C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000021C0UL,
+    {
+    0x44, 0x11, 0xF2, 0xF4, 0x42, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xE1, 0x18,
+        0x0D, 0x04, 0xE1, 0x1C}
+  }
+  , 
+  {
+    0x0C, 0x000021D0UL,
+    {
+    0xDC, 0x0F, 0xB9, 0xCE, 0xE1, 0x08, 0xFC, 0xFF, 0xFC, 0xFE, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x0C, 0x000021DCUL,
+    {
+    0xBE, 0x88, 0xCC, 0x00, 0x7F, 0xE6, 0x7E, 0xE6, 0xBF, 0x88, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000021E8UL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x00, 0xFC, 0xC6, 0x08,
+        0x00, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000021F8UL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xF2, 0xF5,
+        0x40, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00002208UL,
+    {
+    0x3E, 0x11, 0xDC, 0x05, 0xA9, 0x84, 0x3D, 0x04, 0xC2, 0xF8, 0x4F, 0x11,
+        0xCA, 0x00, 0x38, 0x23}
+  }
+  , 
+  {
+    0x10, 0x00002218UL,
+    {
+    0xF2, 0xF5, 0x38, 0x11, 0xF2, 0xF4, 0x36, 0x11, 0xDC, 0x05, 0xA9, 0x84,
+        0x3D, 0x04, 0xC2, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00002228UL,
+    {
+    0x4E, 0x11, 0xCA, 0x00, 0x38, 0x23, 0xF2, 0xF5, 0x3C, 0x11, 0xF2, 0xF4,
+        0x3A, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00002238UL,
+    {
+    0xA9, 0x84, 0x2D, 0x04, 0xC2, 0xF8, 0x51, 0x11, 0xCA, 0x00, 0x38, 0x23,
+        0xF2, 0xF5, 0x34, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002248UL,
+    {
+    0xF2, 0xF4, 0x32, 0x11, 0xDC, 0x05, 0xA9, 0x84, 0x2D, 0x04, 0xC2, 0xF8,
+        0x50, 0x11, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002258UL,
+    {
+    0x38, 0x23, 0xF2, 0xF5, 0x48, 0x11, 0xF2, 0xF4, 0x46, 0x11, 0xDC, 0x05,
+        0xA9, 0x84, 0x49, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00002268UL,
+    {
+    0x3D, 0x04, 0xC2, 0xF8, 0x4C, 0x11, 0xCA, 0x00, 0x38, 0x23, 0xFC, 0x07,
+        0xFC, 0x06, 0xFC, 0x87}
+  }
+  , 
+  {
+    0x08, 0x00002278UL,
+    {
+    0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002280UL,
+    {
+    0xE6, 0xFB, 0x00, 0x20, 0xE0, 0x0A, 0xE0, 0x08, 0xE6, 0xF9, 0x80, 0x00,
+        0xCA, 0x00, 0x94, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002290UL,
+    {
+    0xF2, 0xFB, 0x48, 0x11, 0xF2, 0xFA, 0x46, 0x11, 0xF0, 0x4A, 0x06, 0xF4,
+        0x50, 0x00, 0xF6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000022A0UL,
+    {
+    0x3A, 0x11, 0xF6, 0xFB, 0x3C, 0x11, 0xF0, 0x6A, 0x06, 0xF6, 0x38, 0x04,
+        0xF6, 0xF6, 0x32, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000022B0UL,
+    {
+    0xF6, 0xFB, 0x34, 0x11, 0xF0, 0x8A, 0x06, 0xF8, 0x20, 0x08, 0xF6, 0xF8,
+        0x3E, 0x11, 0xF6, 0xFB}
+  }
+  , 
+  {
+    0x10, 0x000022C0UL,
+    {
+    0x40, 0x11, 0x06, 0xFA, 0x08, 0x0C, 0xF6, 0xFA, 0x36, 0x11, 0xF6, 0xFB,
+        0x38, 0x11, 0xE0, 0x08}
+  }
+  , 
+  {
+    0x10, 0x000022D0UL,
+    {
+    0xE1, 0x1E, 0xF2, 0xF5, 0x44, 0x11, 0xF2, 0xF4, 0x42, 0x11, 0x00, 0x48,
+        0xDC, 0x05, 0xB9, 0xE4}
+  }
+  , 
+  {
+    0x06, 0x000022E0UL,
+    {
+    0x80, 0xF8, 0x8D, 0xF7, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BA2UL,
+    {
+    0x01, 0x40, 0x2C, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BA8UL,
+    {
+    0x01, 0x40, 0x2D, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BAEUL,
+    {
+    0x01, 0x40, 0x30, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BB4UL,
+    {
+    0x01, 0x40, 0x31, 0x11, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BBAUL,
+    {
+    0x01, 0x40, 0xF0, 0xFC, 0x02, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BC0UL,
+    {
+    0x01, 0x40, 0xF1, 0xFC, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000011CUL,
+    {
+    0xEC, 0xFD, 0xF0, 0xD8, 0xFE, 0x04, 0xEE, 0x04, 0x1E, 0x05, 0x0E, 0x05,
+        0xF6, 0x8E, 0x10, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000012CUL,
+    {
+    0xF6, 0x8E, 0x18, 0x11, 0xF6, 0x8E, 0x0C, 0x11, 0xF6, 0x8E, 0x14, 0x11,
+        0xF6, 0x8E, 0x26, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000013CUL,
+    {
+    0xF6, 0x8E, 0x28, 0x11, 0xF6, 0x8E, 0xFE, 0x10, 0xF6, 0x8E, 0x00, 0x11,
+        0xF6, 0x8E, 0x1E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000014CUL,
+    {
+    0xF6, 0x8E, 0x20, 0x11, 0xF6, 0x8E, 0xF6, 0x10, 0xF6, 0x8E, 0xF8, 0x10,
+        0xF6, 0x8E, 0x0E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000015CUL,
+    {
+    0xF6, 0x8E, 0x16, 0x11, 0xF6, 0x8E, 0x0A, 0x11, 0xF6, 0x8E, 0x12, 0x11,
+        0xF6, 0x8E, 0x22, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000016CUL,
+    {
+    0xF6, 0x8E, 0x24, 0x11, 0xF6, 0x8E, 0xFA, 0x10, 0xF6, 0x8E, 0xFC, 0x10,
+        0xF6, 0x8E, 0x1A, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000017CUL,
+    {
+    0xF6, 0x8E, 0x1C, 0x11, 0xF6, 0x8E, 0xF2, 0x10, 0xF6, 0x8E, 0xF4, 0x10,
+        0xE6, 0xF4, 0x00, 0x40}
+  }
+  , 
+  {
+    0x10, 0x0000018CUL,
+    {
+    0xE6, 0xF5, 0x20, 0x00, 0xF6, 0xF4, 0x06, 0x11, 0xF6, 0xF5, 0x08, 0x11,
+        0xE6, 0xF4, 0x00, 0x48}
+  }
+  , 
+  {
+    0x10, 0x0000019CUL,
+    {
+    0xF6, 0xF4, 0x02, 0x11, 0xF6, 0xF5, 0x04, 0x11, 0x5F, 0xE7, 0x6F, 0xE7,
+        0x5F, 0xE6, 0x6F, 0xE6}
+  }
+  , 
+  {
+    0x10, 0x000001ACUL,
+    {
+    0x5E, 0xE6, 0xCA, 0x00, 0x8A, 0x0D, 0x5F, 0xE6, 0xCA, 0x00, 0x8A, 0x0D,
+        0x6E, 0xE6, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000001BCUL,
+    {
+    0x8A, 0x0D, 0x6F, 0xE6, 0xCA, 0x00, 0x8A, 0x0D, 0xD1, 0x90, 0x66, 0xE0,
+        0xFF, 0xF0, 0x76, 0xE0}
+  }
+  , 
+  {
+    0x10, 0x000001CCUL,
+    {
+    0x00, 0x0A, 0xE6, 0xC8, 0x68, 0x00, 0xE6, 0xC9, 0x69, 0x00, 0xE0, 0x08,
+        0xCA, 0x00, 0x3C, 0x0D}
+  }
+  , 
+  {
+    0x10, 0x000001DCUL,
+    {
+    0xF7, 0xF8, 0x2D, 0x11, 0xE0, 0x18, 0xCA, 0x00, 0x3C, 0x0D, 0xF7, 0xF8,
+        0x2C, 0x11, 0xF0, 0x4D}
+  }
+  , 
+  {
+    0x10, 0x000001ECUL,
+    {
+    0xF7, 0xF8, 0xF2, 0xFC, 0xE0, 0x89, 0xC2, 0xF8, 0xF2, 0xFC, 0xCA, 0x00,
+        0x00, 0x27, 0xFC, 0xFD}
+  }
+  , 
+  {
+    0x02, 0x000001FCUL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000001FEUL,
+    {
+    0xF0, 0x48, 0x29, 0x81, 0x2D, 0x06, 0x09, 0x81, 0x3D, 0x07, 0xF0, 0x49,
+        0xF7, 0xF8, 0x31, 0x11}
+  }
+  , 
+  {
+    0x0A, 0x0000020EUL,
+    {
+    0xCB, 0x00, 0xF0, 0x49, 0xF7, 0xF8, 0x30, 0x11, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000218UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xDB, 0xF0, 0xEA, 0xF0, 0xF9,
+        0x88, 0x80, 0xA9, 0x80}
+  }
+  , 
+  {
+    0x10, 0x00000228UL,
+    {
+    0xC0, 0x88, 0xCA, 0x00, 0x44, 0x06, 0x47, 0xF8, 0xFF, 0x00, 0x3D, 0x03,
+        0xE7, 0xF8, 0xFF, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000238UL,
+    {
+    0x0D, 0x6B, 0xF6, 0x8C, 0x2A, 0x11, 0xA9, 0x80, 0x29, 0x81, 0x2D, 0x31,
+        0x09, 0x81, 0x3D, 0x5E}
+  }
+  , 
+  {
+    0x10, 0x00000248UL,
+    {
+    0xF0, 0x4F, 0xF7, 0xF8, 0x2F, 0x11, 0xE6, 0x8C, 0x6E, 0x04, 0xF0, 0x6E,
+        0xF2, 0xF5, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000258UL,
+    {
+    0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x06, 0x00, 0xF0, 0x6D,
+        0xF2, 0xF5, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000268UL,
+    {
+    0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x07, 0x00, 0xE7, 0xFC,
+        0x5E, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00000278UL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x08, 0x00,
+        0xE7, 0xFC, 0x2F, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000288UL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x04, 0x00, 0xE1, 0x9C}
+  }
+  , 
+  {
+    0x10, 0x00000298UL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xB9, 0xC4,
+        0x0D, 0x32, 0xF0, 0x4F}
+  }
+  , 
+  {
+    0x10, 0x000002A8UL,
+    {
+    0xF7, 0xF8, 0x2E, 0x11, 0xE6, 0x8C, 0x6E, 0x04, 0xF0, 0x6E, 0xF2, 0xF5,
+        0x04, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000002B8UL,
+    {
+    0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x06, 0x00, 0xF0, 0x6D, 0xF2, 0xF5,
+        0x04, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000002C8UL,
+    {
+    0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x07, 0x00, 0xE7, 0xFC, 0x5E, 0x00,
+        0xF2, 0xF5, 0x04, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000002D8UL,
+    {
+    0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x08, 0x00, 0xE7, 0xFC,
+        0x2F, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000002E8UL,
+    {
+    0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x04, 0x00,
+        0xE1, 0x9C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000002F8UL,
+    {
+    0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0x0D, 0x03,
+        0xE7, 0xF8, 0xFF, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000308UL,
+    {
+    0x0D, 0x03, 0xF2, 0x8C, 0x2A, 0x11, 0xE1, 0x18, 0x08, 0x02, 0xFC, 0xFF,
+        0xFC, 0xFE, 0xFC, 0xFD}
+  }
+  , 
+  {
+    0x02, 0x00000318UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000031AUL,
+    {
+    0x88, 0xC0, 0x88, 0xB0, 0xF0, 0x48, 0x29, 0x81, 0x2D, 0x4F, 0x09, 0x81,
+        0xEA, 0x30, 0x58, 0x04}
+  }
+  , 
+  {
+    0x10, 0x0000032AUL,
+    {
+    0xF0, 0x49, 0x49, 0x80, 0x3D, 0x22, 0xF0, 0x4A, 0x49, 0x80, 0x3D, 0x09,
+        0xA8, 0x40, 0xF6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x0000033AUL,
+    {
+    0x10, 0x11, 0xD4, 0x40, 0x04, 0x00, 0xF6, 0xF4, 0x18, 0x11, 0xEA, 0x00,
+        0x5E, 0x04, 0xF0, 0x4A}
+  }
+  , 
+  {
+    0x10, 0x0000034AUL,
+    {
+    0x49, 0x81, 0x3D, 0x10, 0xA8, 0x40, 0xD4, 0x50, 0x02, 0x00, 0xF6, 0xF4,
+        0x26, 0x11, 0xF6, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x0000035AUL,
+    {
+    0x28, 0x11, 0xD4, 0x40, 0x04, 0x00, 0xD4, 0x50, 0x06, 0x00, 0xF6, 0xF4,
+        0xFE, 0x10, 0xF6, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x0000036AUL,
+    {
+    0x00, 0x11, 0x0D, 0x78, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x76, 0xF0, 0x49,
+        0x49, 0x81, 0x3D, 0x21}
+  }
+  , 
+  {
+    0x10, 0x0000037AUL,
+    {
+    0xF0, 0x4A, 0x49, 0x80, 0x3D, 0x08, 0xA8, 0x40, 0xF6, 0xF4, 0x0C, 0x11,
+        0xD4, 0x40, 0x04, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000038AUL,
+    {
+    0xF6, 0xF4, 0x14, 0x11, 0x0D, 0x67, 0xF0, 0x4A, 0x49, 0x81, 0x3D, 0x10,
+        0xA8, 0x40, 0xD4, 0x50}
+  }
+  , 
+  {
+    0x10, 0x0000039AUL,
+    {
+    0x02, 0x00, 0xF6, 0xF4, 0x1E, 0x11, 0xF6, 0xF5, 0x20, 0x11, 0xD4, 0x40,
+        0x04, 0x00, 0xD4, 0x50}
+  }
+  , 
+  {
+    0x10, 0x000003AAUL,
+    {
+    0x06, 0x00, 0xF6, 0xF4, 0xF6, 0x10, 0xF6, 0xF5, 0xF8, 0x10, 0x0D, 0x54,
+        0xE7, 0xF8, 0xFF, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000003BAUL,
+    {
+    0x0D, 0x52, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x4F, 0xF0, 0x49, 0x49, 0x80,
+        0x3D, 0x21, 0xF0, 0x4A}
+  }
+  , 
+  {
+    0x10, 0x000003CAUL,
+    {
+    0x49, 0x80, 0x3D, 0x08, 0xA8, 0x40, 0xF6, 0xF4, 0x0E, 0x11, 0xD4, 0x40,
+        0x04, 0x00, 0xF6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000003DAUL,
+    {
+    0x16, 0x11, 0x0D, 0x40, 0xF0, 0x4A, 0x49, 0x81, 0x3D, 0x10, 0xA8, 0x40,
+        0xD4, 0x50, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000003EAUL,
+    {
+    0xF6, 0xF4, 0x22, 0x11, 0xF6, 0xF5, 0x24, 0x11, 0xD4, 0x40, 0x04, 0x00,
+        0xD4, 0x50, 0x06, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000003FAUL,
+    {
+    0xF6, 0xF4, 0xFA, 0x10, 0xF6, 0xF5, 0xFC, 0x10, 0x0D, 0x2D, 0xE7, 0xF8,
+        0xFF, 0x00, 0x0D, 0x2B}
+  }
+  , 
+  {
+    0x10, 0x0000040AUL,
+    {
+    0xF0, 0x49, 0x49, 0x81, 0x3D, 0x21, 0xF0, 0x4A, 0x49, 0x80, 0x3D, 0x08,
+        0xA8, 0x40, 0xF6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x0000041AUL,
+    {
+    0x0A, 0x11, 0xD4, 0x40, 0x04, 0x00, 0xF6, 0xF4, 0x12, 0x11, 0x0D, 0x1C,
+        0xF0, 0x4A, 0x49, 0x81}
+  }
+  , 
+  {
+    0x10, 0x0000042AUL,
+    {
+    0x3D, 0x10, 0xA8, 0x40, 0xD4, 0x50, 0x02, 0x00, 0xF6, 0xF4, 0x1A, 0x11,
+        0xF6, 0xF5, 0x1C, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000043AUL,
+    {
+    0xD4, 0x40, 0x04, 0x00, 0xD4, 0x50, 0x06, 0x00, 0xF6, 0xF4, 0xF2, 0x10,
+        0xF6, 0xF5, 0xF4, 0x10}
+  }
+  , 
+  {
+    0x10, 0x0000044AUL,
+    {
+    0x0D, 0x09, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x07, 0xE7, 0xF8, 0xFF, 0x00,
+        0x0D, 0x04, 0xE7, 0xF8}
+  }
+  , 
+  {
+    0x0A, 0x0000045AUL,
+    {
+    0xFF, 0x00, 0x0D, 0x01, 0xE1, 0x18, 0x08, 0x04, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000464UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0x28, 0x02, 0xF6, 0x8C, 0x2A, 0x11,
+        0xF0, 0x48, 0x29, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00000474UL,
+    {
+    0x2D, 0x47, 0x09, 0x81, 0xEA, 0x30, 0x8A, 0x05, 0xF3, 0xF8, 0x2D, 0x11,
+        0x49, 0x81, 0x2D, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000484UL,
+    {
+    0xE7, 0xF8, 0xFF, 0x00, 0xEA, 0x00, 0x96, 0x05, 0xFE, 0x04, 0x1E, 0x05,
+        0xF6, 0x8E, 0xEE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000494UL,
+    {
+    0xF6, 0x8E, 0xEA, 0xFC, 0xF6, 0x8E, 0xE6, 0xFC, 0xCE, 0x04, 0x0D, 0x03,
+        0xE0, 0x08, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000004A4UL,
+    {
+    0xFA, 0x20, 0xF0, 0x90, 0xE0, 0x08, 0xCA, 0x00, 0xA2, 0x20, 0xF0, 0xE4,
+        0xF0, 0xF5, 0x70, 0x45}
+  }
+  , 
+  {
+    0x10, 0x000004B4UL,
+    {
+    0x3D, 0xF5, 0xCA, 0x00, 0x90, 0x26, 0xE0, 0x08, 0xCA, 0x00, 0xC6, 0x2A,
+        0x49, 0x80, 0x3D, 0x03}
+  }
+  , 
+  {
+    0x10, 0x000004C4UL,
+    {
+    0xE0, 0x08, 0xCA, 0x00, 0xA4, 0x2A, 0xE6, 0x8C, 0x6E, 0x04, 0xE1, 0x9C,
+        0xF2, 0xF5, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000004D4UL,
+    {
+    0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xE0, 0x8D, 0x0D, 0x07,
+        0xF0, 0x6D, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000004E4UL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xB9, 0xC4, 0xF2, 0xF5,
+        0x08, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000004F4UL,
+    {
+    0x06, 0x11, 0xDC, 0x05, 0xA9, 0x84, 0x8A, 0xF4, 0xF1, 0x00, 0xCA, 0x00,
+        0x9A, 0x26, 0x0D, 0x46}
+  }
+  , 
+  {
+    0x10, 0x00000504UL,
+    {
+    0xF3, 0xF8, 0x2C, 0x11, 0x49, 0x81, 0x2D, 0x03, 0xE7, 0xF8, 0xFF, 0x00,
+        0x0D, 0x42, 0xEE, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000514UL,
+    {
+    0x0E, 0x05, 0xF6, 0x8E, 0xEC, 0xFC, 0xF6, 0x8E, 0xE8, 0xFC, 0xF6, 0x8E,
+        0xE4, 0xFC, 0xBE, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000524UL,
+    {
+    0x0D, 0x03, 0xE0, 0x18, 0xCA, 0x00, 0xFA, 0x20, 0xF0, 0x90, 0xE0, 0x18,
+        0xCA, 0x00, 0xA2, 0x20}
+  }
+  , 
+  {
+    0x10, 0x00000534UL,
+    {
+    0xF0, 0xE4, 0xF0, 0xF5, 0x70, 0x45, 0x3D, 0xF5, 0xCA, 0x00, 0x90, 0x26,
+        0xE0, 0x18, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000544UL,
+    {
+    0xC6, 0x2A, 0x49, 0x80, 0x3D, 0x03, 0xE0, 0x18, 0xCA, 0x00, 0xA4, 0x2A,
+        0xE6, 0x8C, 0x6E, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000554UL,
+    {
+    0xE1, 0x9C, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05,
+        0xB9, 0xC4, 0xE0, 0x8D}
+  }
+  , 
+  {
+    0x10, 0x00000564UL,
+    {
+    0x0D, 0x07, 0xF0, 0x6D, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11,
+        0xDC, 0x05, 0xB9, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x00000574UL,
+    {
+    0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xA9, 0x84,
+        0x8A, 0xF4, 0xF1, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000584UL,
+    {
+    0xCA, 0x00, 0x9A, 0x26, 0x0D, 0x03, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x03,
+        0xF2, 0x8C, 0x2A, 0x11}
+  }
+  , 
+  {
+    0x0C, 0x00000594UL,
+    {
+    0xE1, 0x18, 0x08, 0x02, 0xFC, 0xFF, 0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000005A0UL,
+    {
+    0xF6, 0x8C, 0x2A, 0x11, 0xF0, 0x48, 0x29, 0x81, 0x2D, 0x24, 0x09, 0x81,
+        0x3D, 0x44, 0xF3, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x000005B0UL,
+    {
+    0x2D, 0x11, 0x49, 0x81, 0x2D, 0x03, 0xE7, 0xF8, 0xFF, 0x00, 0xCB, 0x00,
+        0xE6, 0x8C, 0x6E, 0x04}
+  }
+  , 
+  {
+    0x10, 0x000005C0UL,
+    {
+    0xCA, 0x00, 0x90, 0x26, 0xE1, 0x2C, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4,
+        0x06, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x000005D0UL,
+    {
+    0xE4, 0xC4, 0x01, 0x00, 0xF2, 0xF9, 0x08, 0x11, 0xF2, 0xF8, 0x06, 0x11,
+        0xDC, 0x09, 0xF4, 0x88}
+  }
+  , 
+  {
+    0x10, 0x000005E0UL,
+    {
+    0x02, 0x00, 0x9A, 0xF4, 0xF7, 0x20, 0xE1, 0x1C, 0xDC, 0x09, 0xB9, 0xC8,
+        0xCA, 0x00, 0x9A, 0x26}
+  }
+  , 
+  {
+    0x10, 0x000005F0UL,
+    {
+    0x0D, 0x25, 0xF3, 0xF8, 0x2C, 0x11, 0x49, 0x81, 0x2D, 0x03, 0xE7, 0xF8,
+        0xFF, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000600UL,
+    {
+    0xE6, 0x8C, 0x6E, 0x04, 0xCA, 0x00, 0x90, 0x26, 0xE1, 0x2C, 0xF2, 0xF5,
+        0x04, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00000610UL,
+    {
+    0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00, 0xF2, 0xF9, 0x04, 0x11,
+        0xF2, 0xF8, 0x02, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000620UL,
+    {
+    0xDC, 0x09, 0xF4, 0x88, 0x02, 0x00, 0x9A, 0xF4, 0xF7, 0x20, 0xE1, 0x1C,
+        0xDC, 0x09, 0xB9, 0xC8}
+  }
+  , 
+  {
+    0x10, 0x00000630UL,
+    {
+    0xCA, 0x00, 0x9A, 0x26, 0x0D, 0x03, 0xE7, 0xF8, 0xFF, 0x00, 0xCB, 0x00,
+        0xF2, 0x8C, 0x2A, 0x11}
+  }
+  , 
+  {
+    0x04, 0x00000640UL,
+    {
+    0xE1, 0x18, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000644UL,
+    {
+    0xEC, 0xFE, 0xEC, 0xFF, 0x28, 0x02, 0xF6, 0x8C, 0x2A, 0x11, 0xF0, 0x48,
+        0x29, 0x81, 0xEA, 0x20}
+  }
+  , 
+  {
+    0x10, 0x00000654UL,
+    {
+    0x6C, 0x07, 0x09, 0x81, 0xEA, 0x30, 0x76, 0x08, 0xF3, 0xF8, 0x2D, 0x11,
+        0x49, 0x81, 0x2D, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000664UL,
+    {
+    0xE7, 0xF8, 0xFF, 0x00, 0xEA, 0x00, 0x82, 0x08, 0xCA, 0x00, 0x90, 0x26,
+        0x5E, 0xE6, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000674UL,
+    {
+    0x8A, 0x0D, 0x5F, 0xE6, 0xCA, 0x00, 0x8A, 0x0D, 0xE6, 0x8C, 0x6E, 0x04,
+        0xE7, 0xFC, 0x80, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000684UL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x1F, 0x00, 0xE7, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000694UL,
+    {
+    0xFF, 0x00, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05,
+        0xE4, 0xC4, 0x10, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000006A4UL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x11, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000006B4UL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x12, 0x00,
+        0xF2, 0xF5, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000006C4UL,
+    {
+    0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x13, 0x00, 0xF2, 0xF5,
+        0x08, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000006D4UL,
+    {
+    0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x14, 0x00, 0xF2, 0xF5, 0x08, 0x11,
+        0xF2, 0xF4, 0x06, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000006E4UL,
+    {
+    0xDC, 0x05, 0xE4, 0xC4, 0x15, 0x00, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4,
+        0x06, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x000006F4UL,
+    {
+    0xE4, 0xC4, 0x16, 0x00, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11,
+        0xDC, 0x05, 0xE4, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x00000704UL,
+    {
+    0x17, 0x00, 0xCA, 0x00, 0x9A, 0x26, 0xFE, 0x04, 0x1E, 0x05, 0xF6, 0x8E,
+        0xEE, 0xFC, 0xF6, 0x8E}
+  }
+  , 
+  {
+    0x10, 0x00000714UL,
+    {
+    0xEA, 0xFC, 0xF6, 0x8E, 0xE6, 0xFC, 0xCE, 0x04, 0xF6, 0x8E, 0x10, 0x11,
+        0xF6, 0x8E, 0x18, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000724UL,
+    {
+    0xF6, 0x8E, 0x0C, 0x11, 0xF6, 0x8E, 0x14, 0x11, 0xF6, 0x8E, 0x26, 0x11,
+        0xF6, 0x8E, 0x28, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000734UL,
+    {
+    0xF6, 0x8E, 0xFE, 0x10, 0xF6, 0x8E, 0x00, 0x11, 0xF6, 0x8E, 0x1E, 0x11,
+        0xF6, 0x8E, 0x20, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000744UL,
+    {
+    0xF6, 0x8E, 0xF6, 0x10, 0xF6, 0x8E, 0xF8, 0x10, 0x0D, 0x03, 0xE0, 0x08,
+        0xCA, 0x00, 0xFA, 0x20}
+  }
+  , 
+  {
+    0x10, 0x00000754UL,
+    {
+    0xF0, 0x90, 0xE0, 0x08, 0xCA, 0x00, 0xA2, 0x20, 0xF0, 0x64, 0xF0, 0x75,
+        0xF0, 0xE4, 0xF0, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00000764UL,
+    {
+    0x70, 0x65, 0x3D, 0xF3, 0xEA, 0x00, 0x7C, 0x08, 0xF3, 0xF8, 0x2C, 0x11,
+        0x49, 0x81, 0x2D, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000774UL,
+    {
+    0xE7, 0xF8, 0xFF, 0x00, 0xEA, 0x00, 0x82, 0x08, 0x6E, 0xE6, 0xCA, 0x00,
+        0x8A, 0x0D, 0x6F, 0xE6}
+  }
+  , 
+  {
+    0x10, 0x00000784UL,
+    {
+    0xCA, 0x00, 0x8A, 0x0D, 0xE6, 0x8C, 0x6E, 0x04, 0xCA, 0x00, 0x90, 0x26,
+        0xE7, 0xFC, 0x80, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000794UL,
+    {
+    0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x1F, 0x00, 0xE7, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000007A4UL,
+    {
+    0xFF, 0x00, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05,
+        0xE4, 0xC4, 0x10, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000007B4UL,
+    {
+    0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x11, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000007C4UL,
+    {
+    0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x12, 0x00,
+        0xF2, 0xF5, 0x04, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000007D4UL,
+    {
+    0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x13, 0x00, 0xF2, 0xF5,
+        0x04, 0x11, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000007E4UL,
+    {
+    0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x14, 0x00, 0xF2, 0xF5, 0x04, 0x11,
+        0xF2, 0xF4, 0x02, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000007F4UL,
+    {
+    0xDC, 0x05, 0xE4, 0xC4, 0x15, 0x00, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4,
+        0x02, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000804UL,
+    {
+    0xE4, 0xC4, 0x16, 0x00, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11,
+        0xDC, 0x05, 0xE4, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x00000814UL,
+    {
+    0x17, 0x00, 0xCA, 0x00, 0x9A, 0x26, 0xEE, 0x04, 0x0E, 0x05, 0xF6, 0x8E,
+        0xEC, 0xFC, 0xF6, 0x8E}
+  }
+  , 
+  {
+    0x10, 0x00000824UL,
+    {
+    0xE8, 0xFC, 0xF6, 0x8E, 0xE4, 0xFC, 0xBE, 0x04, 0xF6, 0x8E, 0x0E, 0x11,
+        0xF6, 0x8E, 0x16, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000834UL,
+    {
+    0xF6, 0x8E, 0x0A, 0x11, 0xF6, 0x8E, 0x12, 0x11, 0xF6, 0x8E, 0x22, 0x11,
+        0xF6, 0x8E, 0x24, 0x11}
+  }
+  , 
+  {
+    0x0C, 0x00000844UL,
+    {
+    0xF6, 0x8E, 0xFA, 0x10, 0xF6, 0x8E, 0xFC, 0x10, 0xF6, 0x8E, 0x1A, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000850UL,
+    {
+    0xF6, 0x8E, 0x1C, 0x11, 0xF6, 0x8E, 0xF2, 0x10, 0xF6, 0x8E, 0xF4, 0x10,
+        0x0D, 0x03, 0xE0, 0x18}
+  }
+  , 
+  {
+    0x10, 0x00000860UL,
+    {
+    0xCA, 0x00, 0xFA, 0x20, 0xF0, 0x90, 0xE0, 0x18, 0xCA, 0x00, 0xA2, 0x20,
+        0xF0, 0x64, 0xF0, 0x75}
+  }
+  , 
+  {
+    0x10, 0x00000870UL,
+    {
+    0x70, 0x65, 0x3D, 0xF5, 0x0D, 0x03, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x03,
+        0xF2, 0x8C, 0x2A, 0x11}
+  }
+  , 
+  {
+    0x0A, 0x00000880UL,
+    {
+    0xE1, 0x18, 0x08, 0x02, 0xFC, 0xFF, 0xFC, 0xFE, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000088AUL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xE9, 0xF0, 0xFA, 0xF6, 0x8C,
+        0x2A, 0x11, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x10, 0x0000089AUL,
+    {
+    0x29, 0x81, 0x2D, 0x7D, 0x09, 0x81, 0xEA, 0x30, 0x8C, 0x0A, 0xE6, 0x8C,
+        0x6E, 0x04, 0xDC, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x000008AAUL,
+    {
+    0xF4, 0xAE, 0x05, 0x00, 0xF0, 0xD5, 0xC0, 0xA5, 0x7C, 0x75, 0x9A, 0xF5,
+        0x3D, 0x00, 0xF0, 0x6D}
+  }
+  , 
+  {
+    0x10, 0x000008BAUL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4,
+        0x10, 0x00, 0xDC, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x000008CAUL,
+    {
+    0xF4, 0x8E, 0x06, 0x00, 0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6, 0x06, 0x11,
+        0xDC, 0x07, 0xE4, 0x86}
+  }
+  , 
+  {
+    0x10, 0x000008DAUL,
+    {
+    0x11, 0x00, 0xDC, 0x0F, 0xF4, 0x8E, 0x07, 0x00, 0xF2, 0xF7, 0x08, 0x11,
+        0xF2, 0xF6, 0x06, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000008EAUL,
+    {
+    0xDC, 0x07, 0xE4, 0x86, 0x12, 0x00, 0xDC, 0x0F, 0xF4, 0x8E, 0x08, 0x00,
+        0xF2, 0xF7, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000008FAUL,
+    {
+    0xF2, 0xF6, 0x06, 0x11, 0xDC, 0x07, 0xE4, 0x86, 0x13, 0x00, 0xDC, 0x0F,
+        0xF4, 0x8E, 0x09, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000090AUL,
+    {
+    0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6, 0x06, 0x11, 0xDC, 0x07, 0xE4, 0x86,
+        0x14, 0x00, 0xF0, 0xAE}
+  }
+  , 
+  {
+    0x10, 0x0000091AUL,
+    {
+    0x06, 0xFA, 0x0A, 0x00, 0xF0, 0xBF, 0xF2, 0xF9, 0x08, 0x11, 0xF2, 0xF8,
+        0x06, 0x11, 0x06, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000092AUL,
+    {
+    0x15, 0x00, 0xCA, 0x00, 0x30, 0x29, 0x0D, 0x2A, 0xF0, 0x6D, 0x67, 0xFC,
+        0x7F, 0x00, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x0000093AUL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x10, 0x00,
+        0xDC, 0x0F, 0xF4, 0x8E}
+  }
+  , 
+  {
+    0x10, 0x0000094AUL,
+    {
+    0x06, 0x00, 0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6, 0x06, 0x11, 0xDC, 0x07,
+        0xE4, 0x86, 0x11, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000095AUL,
+    {
+    0xDC, 0x0F, 0xF4, 0x8E, 0x07, 0x00, 0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6,
+        0x06, 0x11, 0xDC, 0x07}
+  }
+  , 
+  {
+    0x10, 0x0000096AUL,
+    {
+    0xE4, 0x86, 0x12, 0x00, 0xF0, 0xAE, 0x06, 0xFA, 0x08, 0x00, 0xF0, 0xBF,
+        0xF2, 0xF9, 0x08, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000097AUL,
+    {
+    0xF2, 0xF8, 0x06, 0x11, 0x06, 0xF8, 0x13, 0x00, 0xCA, 0x00, 0x30, 0x29,
+        0xE1, 0x1C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x0000098AUL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00,
+        0x0D, 0x7D, 0xE6, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x0000099AUL,
+    {
+    0x6E, 0x04, 0xDC, 0x0F, 0xF4, 0xAE, 0x05, 0x00, 0xF0, 0xD5, 0xC0, 0xA5,
+        0x7C, 0x75, 0x9A, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000009AAUL,
+    {
+    0x3D, 0x00, 0xF0, 0x6D, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11,
+        0xDC, 0x05, 0xE4, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x000009BAUL,
+    {
+    0x10, 0x00, 0xDC, 0x0F, 0xF4, 0x8E, 0x06, 0x00, 0xF2, 0xF7, 0x04, 0x11,
+        0xF2, 0xF6, 0x02, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000009CAUL,
+    {
+    0xDC, 0x07, 0xE4, 0x86, 0x11, 0x00, 0xDC, 0x0F, 0xF4, 0x8E, 0x07, 0x00,
+        0xF2, 0xF7, 0x04, 0x11}
+  }
+  , 
+  {
+    0x10, 0x000009DAUL,
+    {
+    0xF2, 0xF6, 0x02, 0x11, 0xDC, 0x07, 0xE4, 0x86, 0x12, 0x00, 0xDC, 0x0F,
+        0xF4, 0x8E, 0x08, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000009EAUL,
+    {
+    0xF2, 0xF7, 0x04, 0x11, 0xF2, 0xF6, 0x02, 0x11, 0xDC, 0x07, 0xE4, 0x86,
+        0x13, 0x00, 0xDC, 0x0F}
+  }
+  , 
+  {
+    0x10, 0x000009FAUL,
+    {
+    0xF4, 0x8E, 0x09, 0x00, 0xF2, 0xF7, 0x04, 0x11, 0xF2, 0xF6, 0x02, 0x11,
+        0xDC, 0x07, 0xE4, 0x86}
+  }
+  , 
+  {
+    0x10, 0x00000A0AUL,
+    {
+    0x14, 0x00, 0xF0, 0xAE, 0x06, 0xFA, 0x0A, 0x00, 0xF0, 0xBF, 0xF2, 0xF9,
+        0x04, 0x11, 0xF2, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00000A1AUL,
+    {
+    0x02, 0x11, 0x06, 0xF8, 0x15, 0x00, 0xCA, 0x00, 0x30, 0x29, 0x0D, 0x2A,
+        0xF0, 0x6D, 0x67, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000A2AUL,
+    {
+    0x7F, 0x00, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05,
+        0xE4, 0xC4, 0x10, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000A3AUL,
+    {
+    0xDC, 0x0F, 0xF4, 0x8E, 0x06, 0x00, 0xF2, 0xF7, 0x04, 0x11, 0xF2, 0xF6,
+        0x02, 0x11, 0xDC, 0x07}
+  }
+  , 
+  {
+    0x10, 0x00000A4AUL,
+    {
+    0xE4, 0x86, 0x11, 0x00, 0xDC, 0x0F, 0xF4, 0x8E, 0x07, 0x00, 0xF2, 0xF7,
+        0x04, 0x11, 0xF2, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00000A5AUL,
+    {
+    0x02, 0x11, 0xDC, 0x07, 0xE4, 0x86, 0x12, 0x00, 0xF0, 0xAE, 0x06, 0xFA,
+        0x08, 0x00, 0xF0, 0xBF}
+  }
+  , 
+  {
+    0x10, 0x00000A6AUL,
+    {
+    0xF2, 0xF9, 0x04, 0x11, 0xF2, 0xF8, 0x02, 0x11, 0x06, 0xF8, 0x13, 0x00,
+        0xCA, 0x00, 0x30, 0x29}
+  }
+  , 
+  {
+    0x10, 0x00000A7AUL,
+    {
+    0xE1, 0x1C, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05,
+        0xE4, 0xC4, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000A8AUL,
+    {
+    0x0D, 0x03, 0xE7, 0xF8, 0xFF, 0x00, 0x0D, 0x03, 0xF2, 0x8C, 0x2A, 0x11,
+        0xE1, 0x18, 0xFC, 0xFF}
+  }
+  , 
+  {
+    0x06, 0x00000A9AUL,
+    {
+    0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000AA0UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xE0, 0x0D, 0xF6, 0x8C, 0x2A, 0x11,
+        0xF0, 0x48, 0x29, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00000AB0UL,
+    {
+    0x2D, 0x3E, 0x09, 0x81, 0x3D, 0x78, 0xF3, 0xF8, 0x2D, 0x11, 0x49, 0x81,
+        0x3D, 0x35, 0xE6, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x00000AC0UL,
+    {
+    0x6E, 0x04, 0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6, 0x06, 0x11, 0xDC, 0x07,
+        0xF4, 0x86, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000AD0UL,
+    {
+    0xF0, 0xE4, 0x66, 0xFE, 0xD6, 0x00, 0xDC, 0x07, 0xA9, 0x86, 0xF0, 0xF4,
+        0x68, 0xF1, 0xF0, 0x4F}
+  }
+  , 
+  {
+    0x10, 0x00000AE0UL,
+    {
+    0x49, 0x80, 0x2D, 0x01, 0xE0, 0x1D, 0x9A, 0xFE, 0x01, 0x60, 0x78, 0xD2,
+        0x9A, 0xFE, 0x01, 0x70}
+  }
+  , 
+  {
+    0x10, 0x00000AF0UL,
+    {
+    0x78, 0xD4, 0x9A, 0xFE, 0x01, 0x10, 0x3F, 0xFD, 0x9A, 0xFE, 0x04, 0x40,
+        0xF0, 0x4F, 0x49, 0x80}
+  }
+  , 
+  {
+    0x10, 0x00000B00UL,
+    {
+    0x3D, 0x01, 0x4F, 0xFD, 0xF0, 0x4E, 0x69, 0x84, 0xC0, 0x84, 0x3D, 0x04,
+        0xF0, 0x4F, 0x49, 0x80}
+  }
+  , 
+  {
+    0x10, 0x00000B10UL,
+    {
+    0x3D, 0x01, 0x5F, 0xFD, 0x9A, 0x04, 0x01, 0xC0, 0x8F, 0xFD, 0xBB, 0x4E,
+        0xF0, 0x64, 0xF0, 0x75}
+  }
+  , 
+  {
+    0x10, 0x00000B20UL,
+    {
+    0x70, 0x65, 0x3D, 0x43, 0x9F, 0xFD, 0x0D, 0x41, 0xE6, 0xFD, 0xFF, 0xFF,
+        0x0D, 0x3E, 0xF3, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00000B30UL,
+    {
+    0x2C, 0x11, 0x49, 0x81, 0x3D, 0x35, 0xE6, 0x8C, 0x6E, 0x04, 0xF2, 0xF7,
+        0x04, 0x11, 0xF2, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00000B40UL,
+    {
+    0x02, 0x11, 0xDC, 0x07, 0xF4, 0x86, 0x02, 0x00, 0xF0, 0xE4, 0x66, 0xFE,
+        0xD6, 0x00, 0xDC, 0x07}
+  }
+  , 
+  {
+    0x10, 0x00000B50UL,
+    {
+    0xA9, 0x86, 0xF0, 0xF4, 0x68, 0xF1, 0xF0, 0x4F, 0x49, 0x80, 0x2D, 0x01,
+        0xE0, 0x1D, 0x9A, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x00000B60UL,
+    {
+    0x01, 0x60, 0x78, 0xD2, 0x9A, 0xFE, 0x01, 0x70, 0x78, 0xD4, 0x9A, 0xFE,
+        0x01, 0x10, 0x3F, 0xFD}
+  }
+  , 
+  {
+    0x10, 0x00000B70UL,
+    {
+    0x9A, 0xFE, 0x04, 0x40, 0xF0, 0x4F, 0x49, 0x80, 0x3D, 0x01, 0x4F, 0xFD,
+        0xF0, 0x4E, 0x69, 0x84}
+  }
+  , 
+  {
+    0x10, 0x00000B80UL,
+    {
+    0xC0, 0x84, 0x3D, 0x04, 0xF0, 0x4F, 0x49, 0x80, 0x3D, 0x01, 0x5F, 0xFD,
+        0x9A, 0x04, 0x01, 0xB0}
+  }
+  , 
+  {
+    0x10, 0x00000B90UL,
+    {
+    0x8F, 0xFD, 0xBB, 0x2A, 0xF0, 0x64, 0xF0, 0x75, 0x70, 0x65, 0x3D, 0x07,
+        0x9F, 0xFD, 0x0D, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000BA0UL,
+    {
+    0xE6, 0xFD, 0xFF, 0xFF, 0x0D, 0x02, 0xE6, 0xFD, 0xFF, 0xFF, 0xF2, 0x8C,
+        0x2A, 0x11, 0xF0, 0x4D}
+  }
+  , 
+  {
+    0x08, 0x00000BB0UL,
+    {
+    0xFC, 0xFF, 0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000BB8UL,
+    {
+    0xF2, 0xF4, 0xE6, 0xFC, 0x3D, 0x03, 0xE0, 0x04, 0xE0, 0x05, 0xCB, 0x00,
+        0xF2, 0xF5, 0xEE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000BC8UL,
+    {
+    0xE6, 0xF4, 0x12, 0x00, 0x1B, 0x54, 0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8,
+        0x0E, 0xFE, 0xE6, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00000BD8UL,
+    {
+    0x20, 0xFD, 0xE6, 0xF7, 0x02, 0x00, 0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57,
+        0x10, 0x59, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000BE8UL,
+    {
+    0xF2, 0xF4, 0xE4, 0xFC, 0x3D, 0x03, 0xE0, 0x04, 0xE0, 0x05, 0xCB, 0x00,
+        0xF2, 0xF5, 0xEC, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000BF8UL,
+    {
+    0xE6, 0xF4, 0x12, 0x00, 0x1B, 0x54, 0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8,
+        0x0E, 0xFE, 0xE6, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00000C08UL,
+    {
+    0x00, 0x00, 0xE6, 0xF7, 0x02, 0x00, 0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57,
+        0x10, 0x59, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000C18UL,
+    {
+    0x24, 0x8F, 0xEE, 0xFC, 0xF2, 0xF4, 0xEE, 0xFC, 0x46, 0xF4, 0x10, 0x0E,
+        0x3D, 0x02, 0xF6, 0x8E}
+  }
+  , 
+  {
+    0x0C, 0x00000C28UL,
+    {
+    0xEE, 0xFC, 0x6E, 0xC8, 0x04, 0x8F, 0xE6, 0xFC, 0x6F, 0xC8, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000C34UL,
+    {
+    0x24, 0x8F, 0xEC, 0xFC, 0xF2, 0xF4, 0xEC, 0xFC, 0x46, 0xF4, 0x10, 0x0E,
+        0x3D, 0x02, 0xF6, 0x8E}
+  }
+  , 
+  {
+    0x0C, 0x00000C44UL,
+    {
+    0xEC, 0xFC, 0x6E, 0xC9, 0x04, 0x8F, 0xE4, 0xFC, 0x6F, 0xC9, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000C50UL,
+    {
+    0xF6, 0x8C, 0x2A, 0x11, 0xF3, 0xF8, 0x2D, 0x11, 0x49, 0x81, 0x3D, 0x30,
+        0xE6, 0x8C, 0x6E, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000C60UL,
+    {
+    0xF2, 0xF7, 0x08, 0x11, 0xF2, 0xF6, 0x06, 0x11, 0xDC, 0x07, 0xF4, 0x86,
+        0x02, 0x00, 0xC0, 0x84}
+  }
+  , 
+  {
+    0x10, 0x00000C70UL,
+    {
+    0x66, 0xF4, 0x30, 0x00, 0x48, 0x40, 0xBD, 0x02, 0x24, 0x8F, 0xE2, 0xFC,
+        0xDC, 0x07, 0xA9, 0x86}
+  }
+  , 
+  {
+    0x10, 0x00000C80UL,
+    {
+    0x9A, 0xF4, 0x08, 0x00, 0xE7, 0xF8, 0x64, 0x00, 0xF7, 0xF8, 0xF1, 0xFC,
+        0xF6, 0x8E, 0xE2, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000C90UL,
+    {
+    0xF7, 0x8E, 0xF4, 0xFC, 0x05, 0x8F, 0xF1, 0xFC, 0xF3, 0xF8, 0xF1, 0xFC,
+        0x49, 0x80, 0x3D, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00000CA0UL,
+    {
+    0xC2, 0xF4, 0xF4, 0xFC, 0x02, 0xF4, 0xE2, 0xFC, 0x7C, 0x14, 0xF7, 0xF8,
+        0xF4, 0xFC, 0xE7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00000CB0UL,
+    {
+    0x64, 0x00, 0xF7, 0xF8, 0xF1, 0xFC, 0xF6, 0x8E, 0xE2, 0xFC, 0x0D, 0x02,
+        0xF7, 0x8E, 0xF4, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000CC0UL,
+    {
+    0xF3, 0xF8, 0x2C, 0x11, 0x49, 0x81, 0x3D, 0x30, 0xE6, 0x8C, 0x6E, 0x04,
+        0xF2, 0xF7, 0x04, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000CD0UL,
+    {
+    0xF2, 0xF6, 0x02, 0x11, 0xDC, 0x07, 0xF4, 0x86, 0x02, 0x00, 0xC0, 0x84,
+        0x66, 0xF4, 0x30, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000CE0UL,
+    {
+    0x48, 0x40, 0xBD, 0x02, 0x24, 0x8F, 0xE0, 0xFC, 0xDC, 0x07, 0xA9, 0x86,
+        0x9A, 0xF4, 0x08, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000CF0UL,
+    {
+    0xE7, 0xF8, 0x64, 0x00, 0xF7, 0xF8, 0xF0, 0xFC, 0xF6, 0x8E, 0xE0, 0xFC,
+        0xF7, 0x8E, 0xF3, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000D00UL,
+    {
+    0x05, 0x8F, 0xF0, 0xFC, 0xF3, 0xF8, 0xF0, 0xFC, 0x49, 0x80, 0x3D, 0x10,
+        0xC2, 0xF4, 0xF3, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000D10UL,
+    {
+    0x02, 0xF4, 0xE0, 0xFC, 0x7C, 0x14, 0xF7, 0xF8, 0xF3, 0xFC, 0xE7, 0xF8,
+        0x64, 0x00, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00000D20UL,
+    {
+    0xF0, 0xFC, 0xF6, 0x8E, 0xE0, 0xFC, 0x0D, 0x02, 0xF7, 0x8E, 0xF3, 0xFC,
+        0xF2, 0x8C, 0x2A, 0x11}
+  }
+  , 
+  {
+    0x0C, 0x00000D30UL,
+    {
+    0xE0, 0x89, 0xC2, 0xF8, 0xF2, 0xFC, 0xCA, 0x00, 0x00, 0x27, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000D3CUL,
+    {
+    0xE1, 0x0C, 0xF6, 0x8C, 0x2A, 0x11, 0xF0, 0x48, 0x29, 0x81, 0x2D, 0x10,
+        0x09, 0x81, 0x3D, 0x1B}
+  }
+  , 
+  {
+    0x10, 0x00000D4CUL,
+    {
+    0xE6, 0x8C, 0x6E, 0x04, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11,
+        0xDC, 0x05, 0xF4, 0x84}
+  }
+  , 
+  {
+    0x10, 0x00000D5CUL,
+    {
+    0x03, 0x00, 0x47, 0xF8, 0xE0, 0x00, 0x3D, 0x0F, 0xE1, 0x1C, 0x0D, 0x0D,
+        0xE6, 0x8C, 0x6E, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000D6CUL,
+    {
+    0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xF4, 0x84,
+        0x03, 0x00, 0x47, 0xF8}
+  }
+  , 
+  {
+    0x0E, 0x00000D7CUL,
+    {
+    0xE0, 0x00, 0x3D, 0x01, 0xE1, 0x1C, 0xF2, 0x8C, 0x2A, 0x11, 0xF1, 0x8C,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x0A, 0x00000D8AUL,
+    {
+    0xE0, 0x05, 0x86, 0xF5, 0xE7, 0x03, 0x8D, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x02, 0x00002BC6UL,
+    {
+    0x04, 0x8D}
+  }
+  , 
+  {
+    0x02, 0x00002BC8UL,
+    {
+    0x04, 0x8E}
+  }
+  , 
+  {
+    0x02, 0x00002BCAUL,
+    {
+    0x04, 0x8F}
+  }
+  , 
+  {
+    0x02, 0x00002BCCUL,
+    {
+    0x05, 0x80}
+  }
+  , 
+  {
+    0x02, 0x00002BCEUL,
+    {
+    0x05, 0x81}
+  }
+  , 
+  {
+    0x10, 0x00000D94UL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x20, 0xFC, 0xC6, 0x08,
+        0x20, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000DA4UL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xF6, 0x8C,
+        0xFA, 0xFC, 0xE6, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x00000DB4UL,
+    {
+    0x6E, 0x04, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05,
+        0xF4, 0x84, 0x03, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000DC4UL,
+    {
+    0xF7, 0xF8, 0x58, 0x11, 0xF3, 0xF8, 0x58, 0x11, 0x9A, 0xF4, 0x18, 0x00,
+        0xF2, 0xF4, 0xE6, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000DD4UL,
+    {
+    0x46, 0xF4, 0x10, 0x0E, 0x2D, 0x0A, 0xF2, 0xFA, 0x08, 0x11, 0xF2, 0xF9,
+        0x06, 0x11, 0x06, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x00000DE4UL,
+    {
+    0x10, 0x00, 0xE0, 0x08, 0xCA, 0x00, 0x48, 0x11, 0x0D, 0x01, 0xCF, 0x04,
+        0xE1, 0x4C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00000DF4UL,
+    {
+    0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00,
+        0xF3, 0xF8, 0x58, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000E04UL,
+    {
+    0x9A, 0xF4, 0x03, 0x10, 0xE0, 0x08, 0xCA, 0x00, 0xA4, 0x2A, 0xC2, 0xF4,
+        0x58, 0x11, 0x66, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00000E14UL,
+    {
+    0x2C, 0x00, 0xEA, 0x20, 0x44, 0x0F, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4,
+        0x06, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000E24UL,
+    {
+    0xF4, 0x84, 0x02, 0x00, 0xF7, 0xF8, 0x59, 0x11, 0xF3, 0xF8, 0x59, 0x11,
+        0x9A, 0xF4, 0x04, 0x70}
+  }
+  , 
+  {
+    0x10, 0x00000E34UL,
+    {
+    0x8A, 0x04, 0x02, 0xF0, 0xFF, 0x04, 0xDF, 0x04, 0xF3, 0xF8, 0x59, 0x11,
+        0x9A, 0xF4, 0x02, 0x60}
+  }
+  , 
+  {
+    0x10, 0x00000E44UL,
+    {
+    0x9A, 0x05, 0x08, 0x10, 0xF3, 0xF8, 0x59, 0x11, 0x67, 0xF8, 0x40, 0x00,
+        0xC0, 0x84, 0x3D, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000E54UL,
+    {
+    0x9A, 0x05, 0x03, 0x10, 0x3A, 0x05, 0x05, 0x11, 0xDF, 0x04, 0xF3, 0xF8,
+        0x58, 0x11, 0x9A, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00000E64UL,
+    {
+    0x13, 0x30, 0xDF, 0x04, 0xE1, 0x4C, 0x0D, 0x07, 0xF2, 0xF5, 0x08, 0x11,
+        0xF2, 0xF4, 0x06, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000E74UL,
+    {
+    0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00, 0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4,
+        0x06, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000E84UL,
+    {
+    0xF4, 0x84, 0x02, 0x00, 0x8A, 0xF4, 0xF0, 0x00, 0x9A, 0x04, 0x5A, 0xD0,
+        0xF2, 0xF4, 0xE6, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000E94UL,
+    {
+    0x46, 0xF4, 0x10, 0x0E, 0x2D, 0x53, 0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4,
+        0x12, 0x00, 0x1B, 0x54}
+  }
+  , 
+  {
+    0x10, 0x00000EA4UL,
+    {
+    0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8, 0x0E, 0xFE, 0xE6, 0xF6, 0x20, 0xFD,
+        0xE6, 0xF7, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000EB4UL,
+    {
+    0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57, 0x10, 0x59, 0xF6, 0xF4, 0xF6, 0xFC,
+        0xF6, 0xF5, 0xF8, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000EC4UL,
+    {
+    0xCA, 0x00, 0x2A, 0x28, 0xF6, 0xF4, 0x54, 0x11, 0xF6, 0xF5, 0x56, 0x11,
+        0xE0, 0x08, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000ED4UL,
+    {
+    0xA0, 0x0A, 0xF6, 0xF4, 0x52, 0x11, 0xF2, 0xF4, 0x54, 0x11, 0xF2, 0xF5,
+        0x56, 0x11, 0xF2, 0xF3}
+  }
+  , 
+  {
+    0x10, 0x00000EE4UL,
+    {
+    0xF8, 0xFC, 0xF2, 0xF2, 0xF6, 0xFC, 0xCA, 0x00, 0x62, 0x00, 0xF2, 0xF6,
+        0x52, 0x11, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00000EF4UL,
+    {
+    0xF8, 0xFC, 0xF2, 0xF4, 0xF6, 0xFC, 0x08, 0x46, 0x18, 0x50, 0xDC, 0x05,
+        0xB8, 0x64, 0xE1, 0x1C}
+  }
+  , 
+  {
+    0x10, 0x00000F04UL,
+    {
+    0xF2, 0xF5, 0xF8, 0xFC, 0xF2, 0xF4, 0xF6, 0xFC, 0x08, 0x44, 0x18, 0x50,
+        0xDC, 0x05, 0xB9, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x00000F14UL,
+    {
+    0x24, 0x8F, 0xEA, 0xFC, 0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4, 0x10, 0x0E,
+        0xF2, 0x07, 0xEA, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000F24UL,
+    {
+    0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE, 0xF6, 0xF4,
+        0xEA, 0xFC, 0x24, 0x8F}
+  }
+  , 
+  {
+    0x10, 0x00000F34UL,
+    {
+    0xE6, 0xFC, 0xC2, 0xF8, 0x31, 0x11, 0xCA, 0x00, 0x38, 0x23, 0x0D, 0x01,
+        0xCF, 0x04, 0xDE, 0x04}
+  }
+  , 
+  {
+    0x10, 0x00000F44UL,
+    {
+    0xF2, 0xF5, 0x08, 0x11, 0xF2, 0xF4, 0x06, 0x11, 0xDC, 0x05, 0xF4, 0x84,
+        0x03, 0x00, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00000F54UL,
+    {
+    0x58, 0x11, 0x49, 0x80, 0xEA, 0x30, 0xC8, 0x0D, 0xF2, 0x8C, 0xFA, 0xFC,
+        0xFC, 0x07, 0xFC, 0x06}
+  }
+  , 
+  {
+    0x0A, 0x00000F64UL,
+    {
+    0xFC, 0x87, 0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00000F6EUL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x20, 0xFC, 0xC6, 0x08,
+        0x20, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000F7EUL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xF6, 0x8C,
+        0xFA, 0xFC, 0xE6, 0x8C}
+  }
+  , 
+  {
+    0x10, 0x00000F8EUL,
+    {
+    0x6E, 0x04, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05,
+        0xF4, 0x84, 0x03, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000F9EUL,
+    {
+    0xF7, 0xF8, 0x58, 0x11, 0xF3, 0xF8, 0x58, 0x11, 0x9A, 0xF4, 0x18, 0x00,
+        0xF2, 0xF4, 0xE4, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00000FAEUL,
+    {
+    0x46, 0xF4, 0x10, 0x0E, 0x2D, 0x0A, 0xF2, 0xFA, 0x04, 0x11, 0xF2, 0xF9,
+        0x02, 0x11, 0x06, 0xF9}
+  }
+  , 
+  {
+    0x10, 0x00000FBEUL,
+    {
+    0x10, 0x00, 0xE0, 0x18, 0xCA, 0x00, 0x48, 0x11, 0x0D, 0x01, 0xBF, 0x04,
+        0xE1, 0x4C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00000FCEUL,
+    {
+    0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00,
+        0xF3, 0xF8, 0x58, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00000FDEUL,
+    {
+    0x9A, 0xF4, 0x03, 0x10, 0xE0, 0x18, 0xCA, 0x00, 0xA4, 0x2A, 0xC2, 0xF4,
+        0x58, 0x11, 0x66, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00000FEEUL,
+    {
+    0x2C, 0x00, 0xEA, 0x20, 0x1E, 0x11, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4,
+        0x02, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00000FFEUL,
+    {
+    0xF4, 0x84, 0x02, 0x00, 0xF7, 0xF8, 0x59, 0x11, 0xF3, 0xF8, 0x59, 0x11,
+        0x9A, 0xF4, 0x04, 0x70}
+  }
+  , 
+  {
+    0x10, 0x0000100EUL,
+    {
+    0x8A, 0x04, 0x02, 0xE0, 0xEF, 0x04, 0xDF, 0x04, 0xF3, 0xF8, 0x59, 0x11,
+        0x9A, 0xF4, 0x02, 0x60}
+  }
+  , 
+  {
+    0x10, 0x0000101EUL,
+    {
+    0x9A, 0x05, 0x08, 0x00, 0xF3, 0xF8, 0x59, 0x11, 0x67, 0xF8, 0x40, 0x00,
+        0xC0, 0x84, 0x3D, 0x05}
+  }
+  , 
+  {
+    0x10, 0x0000102EUL,
+    {
+    0x9A, 0x05, 0x03, 0x00, 0x3A, 0x05, 0x05, 0x00, 0xDF, 0x04, 0xF3, 0xF8,
+        0x58, 0x11, 0x9A, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x0000103EUL,
+    {
+    0x13, 0x30, 0xDF, 0x04, 0xE1, 0x4C, 0x0D, 0x07, 0xF2, 0xF5, 0x04, 0x11,
+        0xF2, 0xF4, 0x02, 0x11}
+  }
+  , 
+  {
+    0x10, 0x0000104EUL,
+    {
+    0xDC, 0x05, 0xE4, 0xC4, 0x01, 0x00, 0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4,
+        0x02, 0x11, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x0000105EUL,
+    {
+    0xF4, 0x84, 0x02, 0x00, 0x8A, 0xF4, 0xF0, 0x00, 0x9A, 0x04, 0x5A, 0xD0,
+        0xF2, 0xF4, 0xE4, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x0000106EUL,
+    {
+    0x46, 0xF4, 0x10, 0x0E, 0x2D, 0x53, 0xF2, 0xF5, 0xE8, 0xFC, 0xE6, 0xF4,
+        0x12, 0x00, 0x1B, 0x54}
+  }
+  , 
+  {
+    0x10, 0x0000107EUL,
+    {
+    0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8, 0x0E, 0xFE, 0xE6, 0xF6, 0x00, 0x00,
+        0xE6, 0xF7, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000108EUL,
+    {
+    0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57, 0x10, 0x59, 0xF6, 0xF4, 0xF6, 0xFC,
+        0xF6, 0xF5, 0xF8, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x0000109EUL,
+    {
+    0xCA, 0x00, 0x2A, 0x28, 0xF6, 0xF4, 0x54, 0x11, 0xF6, 0xF5, 0x56, 0x11,
+        0xE0, 0x18, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000010AEUL,
+    {
+    0xA0, 0x0A, 0xF6, 0xF4, 0x52, 0x11, 0xF2, 0xF4, 0x54, 0x11, 0xF2, 0xF5,
+        0x56, 0x11, 0xF2, 0xF3}
+  }
+  , 
+  {
+    0x10, 0x000010BEUL,
+    {
+    0xF8, 0xFC, 0xF2, 0xF2, 0xF6, 0xFC, 0xCA, 0x00, 0x62, 0x00, 0xF2, 0xF6,
+        0x52, 0x11, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000010CEUL,
+    {
+    0xF8, 0xFC, 0xF2, 0xF4, 0xF6, 0xFC, 0x08, 0x46, 0x18, 0x50, 0xDC, 0x05,
+        0xB8, 0x64, 0xE1, 0x1C}
+  }
+  , 
+  {
+    0x10, 0x000010DEUL,
+    {
+    0xF2, 0xF5, 0xF8, 0xFC, 0xF2, 0xF4, 0xF6, 0xFC, 0x08, 0x44, 0x18, 0x50,
+        0xDC, 0x05, 0xB9, 0xC4}
+  }
+  , 
+  {
+    0x10, 0x000010EEUL,
+    {
+    0x24, 0x8F, 0xE8, 0xFC, 0xF2, 0xF5, 0xE8, 0xFC, 0xE6, 0xF4, 0x10, 0x0E,
+        0xF2, 0x07, 0xE8, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000010FEUL,
+    {
+    0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE, 0xF6, 0xF4,
+        0xE8, 0xFC, 0x24, 0x8F}
+  }
+  , 
+  {
+    0x10, 0x0000110EUL,
+    {
+    0xE4, 0xFC, 0xC2, 0xF8, 0x30, 0x11, 0xCA, 0x00, 0x38, 0x23, 0x0D, 0x01,
+        0xBF, 0x04, 0xDE, 0x04}
+  }
+  , 
+  {
+    0x10, 0x0000111EUL,
+    {
+    0xF2, 0xF5, 0x04, 0x11, 0xF2, 0xF4, 0x02, 0x11, 0xDC, 0x05, 0xF4, 0x84,
+        0x03, 0x00, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000112EUL,
+    {
+    0x58, 0x11, 0x49, 0x80, 0xEA, 0x30, 0xA2, 0x0F, 0xF2, 0x8C, 0xFA, 0xFC,
+        0xFC, 0x07, 0xFC, 0x06}
+  }
+  , 
+  {
+    0x0A, 0x0000113EUL,
+    {
+    0xFC, 0x87, 0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00001148UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE, 0xEC, 0xFF, 0xF0, 0xE9, 0xF0, 0xFA, 0x06, 0xF0,
+        0xF6, 0xFF, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x10, 0x00001158UL,
+    {
+    0x49, 0x80, 0xEA, 0x30, 0x20, 0x14, 0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4,
+        0x12, 0x00, 0x1B, 0x54}
+  }
+  , 
+  {
+    0x10, 0x00001168UL,
+    {
+    0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8, 0x0E, 0xFE, 0xE6, 0xF6, 0x20, 0xFD,
+        0xE6, 0xF7, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001178UL,
+    {
+    0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57, 0x10, 0x59, 0xF6, 0xF4, 0xFC, 0xFC,
+        0xF6, 0xF5, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001188UL,
+    {
+    0xDC, 0x0F, 0xA9, 0x8E, 0x8A, 0xF4, 0x02, 0x70, 0xEA, 0x00, 0xF6, 0x12,
+        0xF0, 0xBF, 0xF0, 0xAE}
+  }
+  , 
+  {
+    0x10, 0x00001198UL,
+    {
+    0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44, 0x18, 0x50,
+        0x08, 0x41, 0x18, 0x50}
+  }
+  , 
+  {
+    0x10, 0x000011A8UL,
+    {
+    0xF0, 0x84, 0xF0, 0x95, 0xCA, 0x00, 0x80, 0x29, 0xF2, 0xF3, 0xFE, 0xFC,
+        0xF2, 0xF2, 0xFC, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000011B8UL,
+    {
+    0x08, 0x26, 0x18, 0x30, 0xCA, 0x00, 0x54, 0x00, 0xC4, 0x40, 0x02, 0x00,
+        0xC4, 0x50, 0x04, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000011C8UL,
+    {
+    0xD4, 0x40, 0x04, 0x00, 0x66, 0xF4, 0xFF, 0xF8, 0xC4, 0x40, 0x04, 0x00,
+        0xF2, 0xF5, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000011D8UL,
+    {
+    0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x45, 0x18, 0x50, 0xDC, 0x05, 0xA9, 0x84,
+        0xC0, 0x84, 0x7C, 0x64}
+  }
+  , 
+  {
+    0x10, 0x000011E8UL,
+    {
+    0x9A, 0xF4, 0x05, 0x00, 0xF4, 0x80, 0x05, 0x00, 0x79, 0x84, 0xE4, 0x80,
+        0x05, 0x00, 0xD4, 0x40}
+  }
+  , 
+  {
+    0x10, 0x000011F8UL,
+    {
+    0x02, 0x00, 0xD4, 0x50, 0x04, 0x00, 0x62, 0xF4, 0x26, 0x11, 0x62, 0xF5,
+        0x28, 0x11, 0x22, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001208UL,
+    {
+    0xFE, 0x10, 0x32, 0xF5, 0x00, 0x11, 0x3D, 0x2E, 0xCA, 0x00, 0x2A, 0x28,
+        0xF0, 0x64, 0xF0, 0x75}
+  }
+  , 
+  {
+    0x10, 0x00001218UL,
+    {
+    0xC4, 0x40, 0x06, 0x00, 0xC4, 0x50, 0x08, 0x00, 0xF2, 0xF3, 0xFE, 0xFC,
+        0xF2, 0xF2, 0xFC, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001228UL,
+    {
+    0xCA, 0x00, 0x62, 0x00, 0xE1, 0x0C, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4,
+        0xFC, 0xFC, 0x08, 0x44}
+  }
+  , 
+  {
+    0x10, 0x00001238UL,
+    {
+    0x18, 0x50, 0xDC, 0x05, 0xB9, 0xC4, 0x24, 0x8F, 0xEA, 0xFC, 0xF2, 0xF5,
+        0xEA, 0xFC, 0xE6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001248UL,
+    {
+    0x10, 0x0E, 0xF2, 0x07, 0xEA, 0xFC, 0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE,
+        0xF2, 0xF6, 0x0E, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x00001258UL,
+    {
+    0xF6, 0xF4, 0xEA, 0xFC, 0x24, 0x8F, 0xE6, 0xFC, 0xC2, 0xF8, 0x31, 0x11,
+        0xCA, 0x00, 0x38, 0x23}
+  }
+  , 
+  {
+    0x10, 0x00001268UL,
+    {
+    0xEA, 0x00, 0xC8, 0x16, 0xD4, 0x40, 0x02, 0x00, 0xD4, 0x50, 0x04, 0x00,
+        0x62, 0xF4, 0x1E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001278UL,
+    {
+    0x62, 0xF5, 0x20, 0x11, 0x22, 0xF4, 0xF6, 0x10, 0x32, 0xF5, 0xF8, 0x10,
+        0xEA, 0x30, 0xC8, 0x16}
+  }
+  , 
+  {
+    0x10, 0x00001288UL,
+    {
+    0xCA, 0x00, 0x2A, 0x28, 0xF0, 0x64, 0xF0, 0x75, 0xC4, 0x40, 0x06, 0x00,
+        0xC4, 0x50, 0x08, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001298UL,
+    {
+    0xF2, 0xF3, 0xFE, 0xFC, 0xF2, 0xF2, 0xFC, 0xFC, 0xCA, 0x00, 0x62, 0x00,
+        0xE1, 0x2C, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000012A8UL,
+    {
+    0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44, 0x18, 0x50, 0xDC, 0x05,
+        0xB9, 0xC4, 0xF2, 0xF7}
+  }
+  , 
+  {
+    0x10, 0x000012B8UL,
+    {
+    0xFE, 0xFC, 0xF2, 0xF6, 0xFC, 0xFC, 0x08, 0x64, 0x18, 0x70, 0xDC, 0x17,
+        0xA9, 0x86, 0xB9, 0x86}
+  }
+  , 
+  {
+    0x10, 0x000012C8UL,
+    {
+    0x24, 0x8F, 0xEA, 0xFC, 0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4, 0x10, 0x0E,
+        0xF2, 0x07, 0xEA, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000012D8UL,
+    {
+    0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE, 0xF6, 0xF4,
+        0xEA, 0xFC, 0x24, 0x8F}
+  }
+  , 
+  {
+    0x10, 0x000012E8UL,
+    {
+    0xE6, 0xFC, 0xC2, 0xF8, 0x31, 0x11, 0xCA, 0x00, 0x38, 0x23, 0xEA, 0x00,
+        0xC8, 0x16, 0xF0, 0xBF}
+  }
+  , 
+  {
+    0x10, 0x000012F8UL,
+    {
+    0xF0, 0xAE, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44,
+        0x18, 0x50, 0x08, 0x41}
+  }
+  , 
+  {
+    0x10, 0x00001308UL,
+    {
+    0x18, 0x50, 0xF0, 0x84, 0xF0, 0x95, 0xCA, 0x00, 0x02, 0x2A, 0xF2, 0xF5,
+        0xFE, 0xFC, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001318UL,
+    {
+    0xFC, 0xFC, 0x08, 0x46, 0x18, 0x50, 0xDC, 0x05, 0xA8, 0x44, 0xB8, 0x40,
+        0x66, 0xF4, 0xFF, 0xE0}
+  }
+  , 
+  {
+    0x10, 0x00001328UL,
+    {
+    0xB8, 0x40, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x45,
+        0x18, 0x50, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00001338UL,
+    {
+    0xA9, 0x84, 0xC0, 0x84, 0x7C, 0x64, 0x9A, 0xF4, 0x06, 0x00, 0xF4, 0x80,
+        0x01, 0x00, 0x77, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00001348UL,
+    {
+    0x10, 0x00, 0xE4, 0x80, 0x01, 0x00, 0xA8, 0xD0, 0xF0, 0x4D, 0x62, 0xF4,
+        0x10, 0x11, 0x42, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001358UL,
+    {
+    0x18, 0x11, 0x3D, 0x2E, 0xCA, 0x00, 0x2A, 0x28, 0xF0, 0x64, 0xF0, 0x75,
+        0xC4, 0x40, 0x06, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001368UL,
+    {
+    0xC4, 0x50, 0x08, 0x00, 0xF2, 0xF3, 0xFE, 0xFC, 0xF2, 0xF2, 0xFC, 0xFC,
+        0xCA, 0x00, 0x62, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001378UL,
+    {
+    0xE1, 0x0C, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44,
+        0x18, 0x50, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00001388UL,
+    {
+    0xB9, 0xC4, 0x24, 0x8F, 0xEA, 0xFC, 0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4,
+        0x10, 0x0E, 0xF2, 0x07}
+  }
+  , 
+  {
+    0x10, 0x00001398UL,
+    {
+    0xEA, 0xFC, 0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE,
+        0xF6, 0xF4, 0xEA, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000013A8UL,
+    {
+    0x24, 0x8F, 0xE6, 0xFC, 0xC2, 0xF8, 0x31, 0x11, 0xCA, 0x00, 0x38, 0x23,
+        0xEA, 0x00, 0xC8, 0x16}
+  }
+  , 
+  {
+    0x10, 0x000013B8UL,
+    {
+    0x62, 0xFD, 0x0C, 0x11, 0x42, 0xFD, 0x14, 0x11, 0xEA, 0x30, 0xC8, 0x16,
+        0xCA, 0x00, 0x2A, 0x28}
+  }
+  , 
+  {
+    0x10, 0x000013C8UL,
+    {
+    0xF0, 0x64, 0xF0, 0x75, 0xC4, 0x40, 0x06, 0x00, 0xC4, 0x50, 0x08, 0x00,
+        0xF2, 0xF3, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000013D8UL,
+    {
+    0xF2, 0xF2, 0xFC, 0xFC, 0xCA, 0x00, 0x62, 0x00, 0xE1, 0x2C, 0xF2, 0xF5,
+        0xFE, 0xFC, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x0E, 0x000013E8UL,
+    {
+    0xFC, 0xFC, 0x08, 0x44, 0x18, 0x50, 0xDC, 0x05, 0xB9, 0xC4, 0x24, 0x8F,
+        0xEA, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000013F6UL,
+    {
+    0xF2, 0xF5, 0xEA, 0xFC, 0xE6, 0xF4, 0x10, 0x0E, 0xF2, 0x07, 0xEA, 0xFC,
+        0x5B, 0x44, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001406UL,
+    {
+    0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE, 0xF6, 0xF4, 0xEA, 0xFC, 0x24, 0x8F,
+        0xE6, 0xFC, 0xC2, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x00001416UL,
+    {
+    0x31, 0x11, 0xCA, 0x00, 0x38, 0x23, 0xEA, 0x00, 0xC8, 0x16, 0xF2, 0xF5,
+        0xE8, 0xFC, 0xE6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001426UL,
+    {
+    0x12, 0x00, 0x1B, 0x54, 0xF2, 0xF9, 0x0C, 0xFE, 0xF2, 0xF8, 0x0E, 0xFE,
+        0xE6, 0xF6, 0x00, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001436UL,
+    {
+    0xE6, 0xF7, 0x02, 0x00, 0xF0, 0x46, 0x00, 0x48, 0xF0, 0x57, 0x10, 0x59,
+        0xF6, 0xF4, 0xFC, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001446UL,
+    {
+    0xF6, 0xF5, 0xFE, 0xFC, 0xDC, 0x0F, 0xA9, 0x8E, 0x8A, 0xF4, 0x02, 0x70,
+        0xEA, 0x00, 0xA6, 0x15}
+  }
+  , 
+  {
+    0x10, 0x00001456UL,
+    {
+    0xF0, 0xBF, 0xF0, 0xAE, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC,
+        0x08, 0x44, 0x18, 0x50}
+  }
+  , 
+  {
+    0x10, 0x00001466UL,
+    {
+    0x08, 0x41, 0x18, 0x50, 0xF0, 0x84, 0xF0, 0x95, 0xCA, 0x00, 0x80, 0x29,
+        0xF2, 0xF3, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001476UL,
+    {
+    0xF2, 0xF2, 0xFC, 0xFC, 0x08, 0x26, 0x18, 0x30, 0xCA, 0x00, 0x54, 0x00,
+        0xC4, 0x40, 0x02, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001486UL,
+    {
+    0xC4, 0x50, 0x04, 0x00, 0xD4, 0x40, 0x04, 0x00, 0x66, 0xF4, 0xFF, 0xF8,
+        0xC4, 0x40, 0x04, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001496UL,
+    {
+    0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x45, 0x18, 0x50,
+        0xDC, 0x05, 0xA9, 0x84}
+  }
+  , 
+  {
+    0x10, 0x000014A6UL,
+    {
+    0xC0, 0x84, 0x7C, 0x64, 0x9A, 0xF4, 0x05, 0x00, 0xF4, 0x80, 0x05, 0x00,
+        0x79, 0x84, 0xE4, 0x80}
+  }
+  , 
+  {
+    0x10, 0x000014B6UL,
+    {
+    0x05, 0x00, 0xD4, 0x40, 0x02, 0x00, 0xD4, 0x50, 0x04, 0x00, 0x62, 0xF4,
+        0x22, 0x11, 0x62, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x000014C6UL,
+    {
+    0x24, 0x11, 0x22, 0xF4, 0xFA, 0x10, 0x32, 0xF5, 0xFC, 0x10, 0x3D, 0x2E,
+        0xCA, 0x00, 0x2A, 0x28}
+  }
+  , 
+  {
+    0x10, 0x000014D6UL,
+    {
+    0xF0, 0x64, 0xF0, 0x75, 0xC4, 0x40, 0x06, 0x00, 0xC4, 0x50, 0x08, 0x00,
+        0xF2, 0xF3, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000014E6UL,
+    {
+    0xF2, 0xF2, 0xFC, 0xFC, 0xCA, 0x00, 0x62, 0x00, 0xE1, 0x0C, 0xF2, 0xF5,
+        0xFE, 0xFC, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000014F6UL,
+    {
+    0xFC, 0xFC, 0x08, 0x44, 0x18, 0x50, 0xDC, 0x05, 0xB9, 0xC4, 0x24, 0x8F,
+        0xE8, 0xFC, 0xF2, 0xF5}
+  }
+  , 
+  {
+    0x10, 0x00001506UL,
+    {
+    0xE8, 0xFC, 0xE6, 0xF4, 0x10, 0x0E, 0xF2, 0x07, 0xE8, 0xFC, 0x5B, 0x44,
+        0xF2, 0xF4, 0x0C, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x00001516UL,
+    {
+    0xF2, 0xF6, 0x0E, 0xFE, 0xF6, 0xF4, 0xE8, 0xFC, 0x24, 0x8F, 0xE4, 0xFC,
+        0xC2, 0xF8, 0x30, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001526UL,
+    {
+    0xCA, 0x00, 0x38, 0x23, 0xEA, 0x00, 0xC8, 0x16, 0xD4, 0x40, 0x02, 0x00,
+        0xD4, 0x50, 0x04, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001536UL,
+    {
+    0x62, 0xF4, 0x1A, 0x11, 0x62, 0xF5, 0x1C, 0x11, 0x22, 0xF4, 0xF2, 0x10,
+        0x32, 0xF5, 0xF4, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00001546UL,
+    {
+    0xEA, 0x30, 0xC8, 0x16, 0xCA, 0x00, 0x2A, 0x28, 0xF0, 0x64, 0xF0, 0x75,
+        0xC4, 0x40, 0x06, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001556UL,
+    {
+    0xC4, 0x50, 0x08, 0x00, 0xF2, 0xF3, 0xFE, 0xFC, 0xF2, 0xF2, 0xFC, 0xFC,
+        0xCA, 0x00, 0x62, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001566UL,
+    {
+    0xE1, 0x2C, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44,
+        0x18, 0x50, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00001576UL,
+    {
+    0xB9, 0xC4, 0x24, 0x8F, 0xE8, 0xFC, 0xF2, 0xF5, 0xE8, 0xFC, 0xE6, 0xF4,
+        0x10, 0x0E, 0xF2, 0x07}
+  }
+  , 
+  {
+    0x10, 0x00001586UL,
+    {
+    0xE8, 0xFC, 0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE,
+        0xF6, 0xF4, 0xE8, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x00001596UL,
+    {
+    0x24, 0x8F, 0xE4, 0xFC, 0xC2, 0xF8, 0x30, 0x11, 0xCA, 0x00, 0x38, 0x23,
+        0xEA, 0x00, 0xC8, 0x16}
+  }
+  , 
+  {
+    0x10, 0x000015A6UL,
+    {
+    0xF0, 0xBF, 0xF0, 0xAE, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC,
+        0x08, 0x44, 0x18, 0x50}
+  }
+  , 
+  {
+    0x10, 0x000015B6UL,
+    {
+    0x08, 0x41, 0x18, 0x50, 0xF0, 0x84, 0xF0, 0x95, 0xCA, 0x00, 0x02, 0x2A,
+        0xF2, 0xF5, 0xFE, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000015C6UL,
+    {
+    0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x46, 0x18, 0x50, 0xDC, 0x05, 0xA8, 0x44,
+        0xB8, 0x40, 0x66, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000015D6UL,
+    {
+    0xFF, 0xE0, 0xB8, 0x40, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC,
+        0x08, 0x45, 0x18, 0x50}
+  }
+  , 
+  {
+    0x10, 0x000015E6UL,
+    {
+    0xDC, 0x05, 0xA9, 0x84, 0xC0, 0x84, 0x7C, 0x64, 0x9A, 0xF4, 0x06, 0x00,
+        0xF4, 0x80, 0x01, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000015F6UL,
+    {
+    0x77, 0xF8, 0x10, 0x00, 0xE4, 0x80, 0x01, 0x00, 0xA8, 0xD0, 0xF0, 0x4D,
+        0x62, 0xF4, 0x0E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00001606UL,
+    {
+    0x42, 0xF4, 0x16, 0x11, 0x3D, 0x2D, 0xCA, 0x00, 0x2A, 0x28, 0xF0, 0x64,
+        0xF0, 0x75, 0xC4, 0x40}
+  }
+  , 
+  {
+    0x10, 0x00001616UL,
+    {
+    0x06, 0x00, 0xC4, 0x50, 0x08, 0x00, 0xF2, 0xF3, 0xFE, 0xFC, 0xF2, 0xF2,
+        0xFC, 0xFC, 0xCA, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00001626UL,
+    {
+    0x62, 0x00, 0xE1, 0x0C, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC,
+        0x08, 0x44, 0x18, 0x50}
+  }
+  , 
+  {
+    0x10, 0x00001636UL,
+    {
+    0xDC, 0x05, 0xB9, 0xC4, 0x24, 0x8F, 0xE8, 0xFC, 0xF2, 0xF5, 0xE8, 0xFC,
+        0xE6, 0xF4, 0x10, 0x0E}
+  }
+  , 
+  {
+    0x10, 0x00001646UL,
+    {
+    0xF2, 0x07, 0xE8, 0xFC, 0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6,
+        0x0E, 0xFE, 0xF6, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00001656UL,
+    {
+    0xE8, 0xFC, 0x24, 0x8F, 0xE4, 0xFC, 0xC2, 0xF8, 0x30, 0x11, 0xCA, 0x00,
+        0x38, 0x23, 0x0D, 0x31}
+  }
+  , 
+  {
+    0x10, 0x00001666UL,
+    {
+    0x62, 0xFD, 0x0A, 0x11, 0x42, 0xFD, 0x12, 0x11, 0x3D, 0x2C, 0xCA, 0x00,
+        0x2A, 0x28, 0xF0, 0x64}
+  }
+  , 
+  {
+    0x10, 0x00001676UL,
+    {
+    0xF0, 0x75, 0xC4, 0x40, 0x06, 0x00, 0xC4, 0x50, 0x08, 0x00, 0xF2, 0xF3,
+        0xFE, 0xFC, 0xF2, 0xF2}
+  }
+  , 
+  {
+    0x06, 0x00001686UL,
+    {
+    0xFC, 0xFC, 0xCA, 0x00, 0x62, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000168CUL,
+    {
+    0xE1, 0x2C, 0xF2, 0xF5, 0xFE, 0xFC, 0xF2, 0xF4, 0xFC, 0xFC, 0x08, 0x44,
+        0x18, 0x50, 0xDC, 0x05}
+  }
+  , 
+  {
+    0x10, 0x0000169CUL,
+    {
+    0xB9, 0xC4, 0x24, 0x8F, 0xE8, 0xFC, 0xF2, 0xF5, 0xE8, 0xFC, 0xE6, 0xF4,
+        0x10, 0x0E, 0xF2, 0x07}
+  }
+  , 
+  {
+    0x10, 0x000016ACUL,
+    {
+    0xE8, 0xFC, 0x5B, 0x44, 0xF2, 0xF4, 0x0C, 0xFE, 0xF2, 0xF6, 0x0E, 0xFE,
+        0xF6, 0xF4, 0xE8, 0xFC}
+  }
+  , 
+  {
+    0x10, 0x000016BCUL,
+    {
+    0x24, 0x8F, 0xE4, 0xFC, 0xC2, 0xF8, 0x30, 0x11, 0xCA, 0x00, 0x38, 0x23,
+        0x06, 0xF0, 0x0A, 0x00}
+  }
+  , 
+  {
+    0x08, 0x000016CCUL,
+    {
+    0xFC, 0xFF, 0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BD0UL,
+    {
+    0x02, 0x40, 0x84, 0x10, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BD6UL,
+    {
+    0x02, 0x40, 0x86, 0x10, 0x01, 0x00}
+  }
+  , 
+  {
+    0x08, 0x00002BDCUL,
+    {
+    0x04, 0x40, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BE4UL,
+    {
+    0x02, 0x40, 0xCC, 0x10, 0x00, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002BEAUL,
+    {
+    0x01, 0x40, 0xF0, 0x10, 0x00, 0x00}
+  }
+  , 
+  {
+    0x04, 0x00002618UL,
+    {
+    0xEC, 0xFD, 0xF0, 0xD8}
+  }
+  , 
+  {
+    0x10, 0x0000261CUL,
+    {
+    0xCA, 0x00, 0xA8, 0x27, 0xE6, 0xF4, 0xCE, 0x02, 0xF6, 0xF4, 0x86, 0x10,
+        0xF0, 0x4D, 0xF7, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000262CUL,
+    {
+    0xCE, 0x10, 0xE0, 0x06, 0xE1, 0x0A, 0xE4, 0xA6, 0xCF, 0x10, 0x86, 0xF6,
+        0x1F, 0x00, 0x8D, 0xFB}
+  }
+  , 
+  {
+    0x10, 0x0000263CUL,
+    {
+    0xE1, 0x1A, 0xC2, 0xF4, 0x5E, 0x11, 0xE4, 0xA4, 0xCF, 0x10, 0xF0, 0x4D,
+        0x49, 0x81, 0x2D, 0x19}
+  }
+  , 
+  {
+    0x10, 0x0000264CUL,
+    {
+    0xF0, 0x4D, 0x49, 0x82, 0x2D, 0x16, 0xF0, 0x4D, 0x49, 0x84, 0x2D, 0x13,
+        0xF0, 0x4D, 0x47, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000265CUL,
+    {
+    0x08, 0x00, 0x2D, 0x0F, 0xF0, 0x4D, 0x47, 0xF8, 0x10, 0x00, 0x2D, 0x0B,
+        0xF0, 0x4D, 0x47, 0xF8}
+  }
+  , 
+  {
+    0x10, 0x0000266CUL,
+    {
+    0x20, 0x00, 0x2D, 0x07, 0xF0, 0x4D, 0xC0, 0x89, 0xE0, 0x28, 0xCA, 0x00,
+        0x84, 0x00, 0xE0, 0x4D}
+  }
+  , 
+  {
+    0x10, 0x0000267CUL,
+    {
+    0xF0, 0x4D, 0xF0, 0x4D, 0xC0, 0x88, 0xCA, 0x00, 0xD6, 0x27, 0xCA, 0x00,
+        0xC6, 0x27, 0xBF, 0x88}
+  }
+  , 
+  {
+    0x04, 0x0000268CUL,
+    {
+    0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x0A, 0x00002690UL,
+    {
+    0xD1, 0xA0, 0x6E, 0xCA, 0x6E, 0xC6, 0x6E, 0xC2, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x0A, 0x0000269AUL,
+    {
+    0xD1, 0xA0, 0x6F, 0xCA, 0x6F, 0xC6, 0x6F, 0xC2, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x0E, 0x000026A4UL,
+    {
+    0xBB, 0xF5, 0x24, 0x8F, 0x88, 0x10, 0x34, 0x8F, 0x8A, 0x10, 0xBB, 0xF5,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000026B2UL,
+    {
+    0xF2, 0xF6, 0x86, 0x10, 0xF2, 0xF8, 0x88, 0x10, 0xF2, 0xF9, 0x8A, 0x10,
+        0xF6, 0xF8, 0x0E, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x000026C2UL,
+    {
+    0xF6, 0xF9, 0x0C, 0xFE, 0x7B, 0x66, 0xF2, 0xF7, 0x0E, 0xFE, 0x46, 0xF7,
+        0x63, 0x00, 0xFD, 0x0C}
+  }
+  , 
+  {
+    0x10, 0x000026D2UL,
+    {
+    0xE6, 0xF6, 0x64, 0x00, 0xF6, 0xF8, 0x0E, 0xFE, 0xF6, 0xF9, 0x0C, 0xFE,
+        0x7B, 0x66, 0xF6, 0x07}
+  }
+  , 
+  {
+    0x10, 0x000026E2UL,
+    {
+    0x86, 0x10, 0xF7, 0x8E, 0xF0, 0x10, 0x0D, 0x06, 0xF1, 0xAE, 0xE7, 0xF8,
+        0x64, 0x00, 0x21, 0x8A}
+  }
+  , 
+  {
+    0x0C, 0x000026F2UL,
+    {
+    0xF7, 0xF8, 0xF0, 0x10, 0xF6, 0x8E, 0x88, 0x10, 0xF6, 0x8E, 0x8A, 0x10}
+  }
+  , 
+  {
+    0x02, 0x000026FEUL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002700UL,
+    {
+    0xBE, 0x88, 0xCC, 0x00, 0xC2, 0xF5, 0xCE, 0x10, 0xF6, 0xF9, 0x0E, 0xFE,
+        0x5B, 0x55, 0xF2, 0xF6}
+  }
+  , 
+  {
+    0x10, 0x00002710UL,
+    {
+    0x0E, 0xFE, 0x48, 0x60, 0x3D, 0x01, 0x08, 0x61, 0xF0, 0x56, 0x02, 0xF5,
+        0xCC, 0x10, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x10, 0x00002720UL,
+    {
+    0xC0, 0x86, 0xF0, 0x46, 0x5C, 0x14, 0xC4, 0x54, 0x8C, 0x10, 0xE1, 0x1A,
+        0xE4, 0xA6, 0xCF, 0x10}
+  }
+  , 
+  {
+    0x02, 0x00002730UL,
+    {
+    0xBF, 0x88}
+  }
+  , 
+  {
+    0x02, 0x00002732UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x04, 0x00002734UL,
+    {
+    0xEC, 0xFD, 0xEC, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x00002738UL,
+    {
+    0xF2, 0xF5, 0x84, 0x10, 0xC2, 0xF4, 0xCE, 0x10, 0x04, 0xF4, 0x84, 0x10,
+        0xF0, 0x45, 0x52, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x00002748UL,
+    {
+    0x84, 0x10, 0xF0, 0x54, 0x62, 0xF5, 0x84, 0x10, 0xF0, 0x85, 0xCA, 0x00,
+        0x7C, 0x00, 0xC0, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002758UL,
+    {
+    0xCA, 0x00, 0xD4, 0x16, 0x24, 0x8F, 0xCC, 0x10, 0xE0, 0x0D, 0xE6, 0xFE,
+        0xCF, 0x10, 0x0D, 0x02}
+  }
+  , 
+  {
+    0x10, 0x00002768UL,
+    {
+    0x08, 0xD1, 0xF0, 0x4D, 0x99, 0x8E, 0x49, 0x81, 0x3D, 0xFB, 0xF0, 0x4D,
+        0x43, 0xF8, 0x5E, 0x11}
+  }
+  , 
+  {
+    0x10, 0x00002778UL,
+    {
+    0x9D, 0x14, 0xF0, 0x4D, 0xC0, 0x84, 0x5C, 0x14, 0xD4, 0x44, 0x8C, 0x10,
+        0x42, 0xF4, 0xCC, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00002788UL,
+    {
+    0x3D, 0x09, 0xE1, 0x0A, 0xF0, 0x4D, 0xC0, 0x84, 0xE4, 0xA4, 0xCF, 0x10,
+        0xF0, 0x4D, 0xC0, 0x88}
+  }
+  , 
+  {
+    0x0A, 0x00002798UL,
+    {
+    0xCA, 0x00, 0x38, 0x23, 0x08, 0xD1, 0xF0, 0x4D, 0x0D, 0xE2}
+  }
+  , 
+  {
+    0x06, 0x000027A2UL,
+    {
+    0xFC, 0xFE, 0xFC, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x02, 0x00000084UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000027A8UL,
+    {
+    0xE6, 0x8A, 0xAF, 0x04, 0xE6, 0x0D, 0x02, 0x20, 0xE6, 0x8B, 0xAF, 0x04,
+        0xE6, 0x0E, 0x40, 0x20}
+  }
+  , 
+  {
+    0x0E, 0x000027B8UL,
+    {
+    0xE6, 0x8C, 0x5F, 0x04, 0xE6, 0x0F, 0x08, 0x10, 0xE6, 0x8D, 0xAF, 0x04,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000027C6UL,
+    {
+    0xD1, 0xA0, 0xE6, 0xCA, 0x44, 0x00, 0xE6, 0xC6, 0x48, 0x00, 0xE6, 0xC2,
+        0x4C, 0x00, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000027D6UL,
+    {
+    0xE6, 0xA2, 0x80, 0x00, 0xF0, 0x48, 0xC0, 0x85, 0xE6, 0xF4, 0xC4, 0x09,
+        0x0B, 0x54, 0xF2, 0xF4}
+  }
+  , 
+  {
+    0x10, 0x000027E6UL,
+    {
+    0x0E, 0xFE, 0x28, 0x41, 0xF6, 0xF4, 0x10, 0xFD, 0xF2, 0x22, 0x10, 0xFD,
+        0xE6, 0xB2, 0x58, 0x00}
+  }
+  , 
+  {
+    0x04, 0x000027F6UL,
+    {
+    0x6F, 0xA2, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000027FAUL,
+    {
+    0xE6, 0xA1, 0x80, 0x00, 0xE6, 0xA0, 0x27, 0x00, 0xF0, 0x48, 0xC0, 0x85,
+        0xE6, 0xF4, 0xC4, 0x09}
+  }
+  , 
+  {
+    0x10, 0x0000280AUL,
+    {
+    0xF6, 0xF4, 0x0E, 0xFE, 0x4B, 0x55, 0xF2, 0xF4, 0x0E, 0xFE, 0x28, 0x41,
+        0xF6, 0xF4, 0x40, 0xFE}
+  }
+  , 
+  {
+    0x10, 0x0000281AUL,
+    {
+    0xE6, 0xB1, 0x70, 0x00, 0xF6, 0x8E, 0x0C, 0xFD, 0xF6, 0x8E, 0x0E, 0xFD,
+        0x6F, 0xA1, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x0000282AUL,
+    {
+    0xBE, 0x88, 0xCC, 0x00, 0xF2, 0xF6, 0x0C, 0xFD, 0xF2, 0xF7, 0x0E, 0xFD,
+        0xBF, 0x88, 0xF0, 0x46}
+  }
+  , 
+  {
+    0x02, 0x0000283AUL,
+    {
+    0xF0, 0x57}
+  }
+  , 
+  {
+    0x02, 0x0000283CUL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x06, 0x0000283EUL,
+    {
+    0xF2, 0xF4, 0x0C, 0xFD, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002844UL,
+    {
+    0xBE, 0x88, 0xCC, 0x00, 0xF6, 0xF8, 0x0C, 0xFD, 0xF6, 0xF9, 0x0E, 0xFD,
+        0xBF, 0x88, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002854UL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x40, 0xFC, 0xC6, 0x08,
+        0x40, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002864UL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xCA, 0x00,
+        0x08, 0x25, 0xFC, 0x07}
+  }
+  , 
+  {
+    0x0C, 0x00002874UL,
+    {
+    0xFC, 0x06, 0xFC, 0x87, 0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x00002880UL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x60, 0xFC, 0xC6, 0x08,
+        0x60, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002890UL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xCA, 0x00,
+        0xE4, 0x24, 0xFC, 0x07}
+  }
+  , 
+  {
+    0x0C, 0x000028A0UL,
+    {
+    0xFC, 0x06, 0xFC, 0x87, 0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x000028ACUL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0x80, 0xFC, 0xC6, 0x08,
+        0x80, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000028BCUL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xCA, 0x00,
+        0xCE, 0x24, 0xFC, 0x07}
+  }
+  , 
+  {
+    0x0C, 0x000028CCUL,
+    {
+    0xFC, 0x06, 0xFC, 0x87, 0xFC, 0x00, 0xFC, 0x08, 0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x000028D8UL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0xCC, 0x00, 0xF6, 0xF0, 0xA0, 0xFC, 0xC6, 0x08,
+        0xA0, 0xFC, 0xCC, 0x00}
+  }
+  , 
+  {
+    0x10, 0x000028E8UL,
+    {
+    0xEC, 0x00, 0xC6, 0x87, 0x10, 0x00, 0xEC, 0x06, 0xEC, 0x07, 0xD1, 0x00,
+        0x02, 0x22, 0x10, 0xFD}
+  }
+  , 
+  {
+    0x10, 0x000028F8UL,
+    {
+    0xCA, 0x00, 0x34, 0x27, 0xFC, 0x07, 0xFC, 0x06, 0xFC, 0x87, 0xFC, 0x00,
+        0xFC, 0x08, 0xFC, 0x03}
+  }
+  , 
+  {
+    0x02, 0x00002908UL,
+    {
+    0xFB, 0x88}
+  }
+  , 
+  {
+    0x10, 0x0000290AUL,
+    {
+    0xC6, 0x03, 0x03, 0x00, 0x24, 0x8F, 0x0C, 0xFD, 0x34, 0x8F, 0x0E, 0xFD,
+        0xFC, 0x03, 0xFB, 0x88}
+  }
+  , 
+  {
+    0x08, 0x0000007CUL,
+    {
+    0x2B, 0x88, 0xE0, 0xF4, 0x20, 0x48, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002BF2UL,
+    {
+    0xA5, 0x5A, 0xA5, 0xA5, 0x0A, 0x86, 0x3F, 0x2E, 0x1A, 0x86, 0x00, 0xD2,
+        0x1A, 0x89, 0x00, 0xFB}
+  }
+  , 
+  {
+    0x10, 0x00002C02UL,
+    {
+    0x0A, 0x89, 0x6F, 0x00, 0xE6, 0x0A, 0x0C, 0xFA, 0xE6, 0x00, 0x04, 0x00,
+        0xE6, 0x01, 0x05, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002C12UL,
+    {
+    0xE6, 0x02, 0x06, 0x00, 0xE6, 0x08, 0xC0, 0xFC, 0xB5, 0x4A, 0xB5, 0xB5,
+        0xE6, 0xF0, 0x00, 0x10}
+  }
+  , 
+  {
+    0x10, 0x00002C22UL,
+    {
+    0xE6, 0xF9, 0x00, 0x00, 0xE6, 0xF8, 0x10, 0x2D, 0xF0, 0x18, 0x70, 0x19,
+        0x2D, 0x29, 0xE0, 0x05}
+  }
+  , 
+  {
+    0x10, 0x00002C32UL,
+    {
+    0xDC, 0x09, 0x98, 0x28, 0x2D, 0x25, 0xF0, 0x32, 0xDC, 0x09, 0x98, 0x48,
+        0xAA, 0xF2, 0x1B, 0xE0}
+  }
+  , 
+  {
+    0x10, 0x00002C42UL,
+    {
+    0xAA, 0xF2, 0x0E, 0xF0, 0xF0, 0x34, 0x7C, 0x33, 0x0E, 0xF3, 0x06, 0xF3,
+        0x00, 0xFD, 0xE0, 0x15}
+  }
+  , 
+  {
+    0x10, 0x00002C52UL,
+    {
+    0x4C, 0x54, 0x91, 0x50, 0x68, 0x5B, 0xB8, 0x53, 0x08, 0x41, 0x28, 0x21,
+        0x3D, 0xF3, 0x0D, 0xE7}
+  }
+  , 
+  {
+    0x10, 0x00002C62UL,
+    {
+    0xDC, 0x09, 0x98, 0x38, 0xDC, 0x44, 0xB9, 0xA3, 0x08, 0x31, 0x18, 0x40,
+        0x76, 0xF3, 0x00, 0xC0}
+  }
+  , 
+  {
+    0x10, 0x00002C72UL,
+    {
+    0x28, 0x21, 0x7D, 0xF8, 0x0D, 0xDC, 0xB9, 0xA4, 0x08, 0x41, 0x28, 0x21,
+        0x7D, 0xFC, 0x0D, 0xD7}
+  }
+  , 
+  {
+    0x10, 0x00002C82UL,
+    {
+    0xE6, 0xF9, 0x00, 0x00, 0xE6, 0xF8, 0x00, 0x2B, 0xE6, 0x03, 0x03, 0x00,
+        0xDC, 0x09, 0xA8, 0x28}
+  }
+  , 
+  {
+    0x10, 0x00002C92UL,
+    {
+    0x2D, 0x3C, 0x08, 0x82, 0x18, 0x90, 0xAA, 0xF2, 0x29, 0xF0, 0xF0, 0x42,
+        0x66, 0xF2, 0xFF, 0x3F}
+  }
+  , 
+  {
+    0x10, 0x00002CA2UL,
+    {
+    0x3D, 0x05, 0xE0, 0x04, 0xDC, 0x09, 0xA8, 0x28, 0x08, 0x82, 0x18, 0x90,
+        0xDC, 0x09, 0xA8, 0x38}
+  }
+  , 
+  {
+    0x10, 0x00002CB2UL,
+    {
+    0x08, 0x82, 0x18, 0x90, 0x8A, 0xF4, 0x06, 0xE0, 0xF6, 0xF3, 0x06, 0xFE,
+        0xDC, 0x09, 0xA8, 0x38}
+  }
+  , 
+  {
+    0x10, 0x00002CC2UL,
+    {
+    0x08, 0x82, 0x18, 0x90, 0xDC, 0x09, 0xA9, 0xA8, 0x08, 0x81, 0x18, 0x90,
+        0xB9, 0xA3, 0x08, 0x31}
+  }
+  , 
+  {
+    0x10, 0x00002CD2UL,
+    {
+    0x8A, 0xF4, 0x06, 0xE0, 0x8A, 0xF3, 0x04, 0xE0, 0x06, 0x03, 0x01, 0x00,
+        0x76, 0xF3, 0x00, 0xC0}
+  }
+  , 
+  {
+    0x10, 0x00002CE2UL,
+    {
+    0x28, 0x21, 0x3D, 0xF0, 0x9A, 0xF8, 0xD0, 0x00, 0x08, 0x81, 0x0D, 0xCE,
+        0xC0, 0x43, 0x5C, 0x13}
+  }
+  , 
+  {
+    0x10, 0x00002CF2UL,
+    {
+    0x76, 0xF3, 0x00, 0xFD, 0xE0, 0x14, 0xF1, 0xA5, 0x4C, 0x45, 0x8A, 0xF2,
+        0x03, 0x70, 0x91, 0x40}
+  }
+  , 
+  {
+    0x0E, 0x00002D02UL,
+    {
+    0x68, 0x4B, 0x0D, 0x01, 0x78, 0x4B, 0xB8, 0x43, 0x0D, 0xBF, 0xFA, 0x00,
+        0x44, 0x1D}
+  }
+  , 
+  {
+    0x0E, 0x00000054UL,
+    {
+    0xDC, 0x03, 0xA8, 0x42, 0x08, 0x22, 0x18, 0x30, 0xDC, 0x03, 0xA8, 0x52,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x0E, 0x00000062UL,
+    {
+    0xDC, 0x03, 0xB8, 0x42, 0x08, 0x22, 0x18, 0x30, 0xDC, 0x03, 0xB8, 0x52,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000094UL,
+    {
+    0xF0, 0x28, 0xF0, 0x39, 0x0D, 0x05, 0x28, 0xB1, 0xF0, 0x6A, 0xDC, 0x49,
+        0xB9, 0xC8, 0x08, 0x81}
+  }
+  , 
+  {
+    0x0A, 0x000000A4UL,
+    {
+    0x48, 0xB0, 0x3D, 0xF9, 0xF0, 0x42, 0xF0, 0x53, 0xCB, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000036UL,
+    {
+    0xEC, 0xFD, 0xF0, 0xD8, 0x0D, 0x04, 0x99, 0x8D, 0xD0, 0x88, 0xCA, 0x00,
+        0x04, 0x00, 0xA9, 0x8D}
+  }
+  , 
+  {
+    0x0E, 0x00000046UL,
+    {
+    0x3D, 0xFA, 0xE0, 0xA8, 0xCA, 0x00, 0x04, 0x00, 0xE0, 0x04, 0xFC, 0xFD,
+        0xCB, 0x00}
+  }
+  , 
+  {
+    0x02, 0x00002BF0UL,
+    {
+    0x00, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000004UL,
+    {
+    0x46, 0xF8, 0x0A, 0x00, 0x3D, 0x03, 0xE0, 0xD8, 0xBB, 0x01, 0xE0, 0xA8,
+        0x9A, 0xB7, 0x0A, 0x70}
+  }
+  , 
+  {
+    0x10, 0x00000014UL,
+    {
+    0x46, 0x59, 0x13, 0x00, 0x3D, 0x07, 0x7E, 0xB7, 0x9A, 0xB7, 0xFE, 0x70,
+        0x46, 0x59, 0x11, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00000024UL,
+    {
+    0x3D, 0xFA, 0x7E, 0xB7, 0x9A, 0xB6, 0xFE, 0x70, 0x7E, 0xB6, 0xF6, 0xF8,
+        0xB0, 0xFE, 0xF0, 0x48}
+  }
+  , 
+  {
+    0x02, 0x00000034UL,
+    {
+    0xCB, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002D10UL,
+    {
+    0x82, 0x80, 0x04, 0x00, 0x00, 0xD0}
+  }
+  , 
+  {
+    0x04, 0x00002D16UL,
+    {
+    0x03, 0x40, 0x12, 0xFD}
+  }
+  , 
+  {
+    0x04, 0x00002D1AUL,
+    {
+    0x01, 0x00, 0x40, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002D1EUL,
+    {
+    0x04, 0x80, 0x04, 0x00, 0x5A, 0xD1}
+  }
+  , 
+  {
+    0x04, 0x00002D24UL,
+    {
+    0x07, 0x40, 0x00, 0xFD}
+  }
+  , 
+  {
+    0x04, 0x00002D28UL,
+    {
+    0x0A, 0x00, 0x41, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002D2CUL,
+    {
+    0x1F, 0x80, 0x04, 0x00, 0x32, 0xD1}
+  }
+  , 
+  {
+    0x06, 0x00002D32UL,
+    {
+    0x3F, 0x80, 0x04, 0x00, 0xF2, 0xD0}
+  }
+  , 
+  {
+    0x10, 0x00002D38UL,
+    {
+    0xFF, 0xBF, 0x08, 0x00, 0x00, 0xC0, 0xFF, 0xBF, 0x09, 0x00, 0x00, 0xC0,
+        0xFF, 0xBF, 0x0A, 0x00}
+  }
+  , 
+  {
+    0x10, 0x00002D48UL,
+    {
+    0x00, 0xC0, 0xFF, 0xBF, 0x0B, 0x00, 0x00, 0xC0, 0xFF, 0xBF, 0x0C, 0x00,
+        0x00, 0xC0, 0xFF, 0xBF}
+  }
+  , 
+  {
+    0x10, 0x00002D58UL,
+    {
+    0x0D, 0x00, 0x00, 0xC0, 0xFF, 0xBF, 0x0E, 0x00, 0x00, 0xC0, 0x3F, 0xBA,
+        0x0F, 0x00, 0x00, 0xC0}
+  }
+  , 
+  {
+    0x04, 0x00002D68UL,
+    {
+    0x14, 0x40, 0xE0, 0xFC}
+  }
+  , 
+  {
+    0x04, 0x00002D6CUL,
+    {
+    0x02, 0x00, 0x4B, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002D70UL,
+    {
+    0x07, 0x80, 0x04, 0x00, 0x52, 0xD1}
+  }
+  , 
+  {
+    0x04, 0x00002D76UL,
+    {
+    0x09, 0x40, 0xF6, 0xFC}
+  }
+  , 
+  {
+    0x04, 0x00002D7AUL,
+    {
+    0x05, 0x00, 0x4D, 0x00}
+  }
+  , 
+  {
+    0x06, 0x00002D7EUL,
+    {
+    0x6C, 0x80, 0x04, 0x00, 0x84, 0xD0}
+  }
+  , 
+  {
+    0x04, 0x00002D84UL,
+    {
+    0x05, 0x40, 0x0C, 0xFD}
+  }
+  , 
+  {
+    0x02, 0x00002D88UL,
+    {
+    0x00, 0x00}
+  }
+  , 
+  {
+    0x04, 0x00000000UL,
+    {
+    0xFA, 0x00, 0xF2, 0x2B}
+  }
+  , 
+  {
+    0x04, 0x00000070UL,
+    {
+    0xFA, 0x00, 0x94, 0x0D}
+  }
+  , 
+  {
+    0x04, 0x00000074UL,
+    {
+    0xFA, 0x00, 0x6E, 0x0F}
+  }
+  , 
+  {
+    0x04, 0x00000078UL,
+    {
+    0xFA, 0x00, 0xE8, 0x21}
+  }
+  , 
+  {
+    0x04, 0x0000008CUL,
+    {
+    0xFA, 0x00, 0x0A, 0x29}
+  }
+  , 
+  {
+    0x04, 0x00000090UL,
+    {
+    0xFA, 0x00, 0xD8, 0x28}
+  }
+  , 
+  {
+    0x04, 0x00000110UL,
+    {
+    0xFA, 0x00, 0x54, 0x28}
+  }
+  , 
+  {
+    0x04, 0x00000114UL,
+    {
+    0xFA, 0x00, 0x80, 0x28}
+  }
+  , 
+  {
+    0x04, 0x00000118UL,
+    {
+    0xFA, 0x00, 0xAC, 0x28}
+  }
+  , 
+  {
+  0, 0,}
+
+};
+
+
+
diff --git a/lincan-0.3.3/src/irq.c b/lincan-0.3.3/src/irq.c
new file mode 100644 (file)
index 0000000..a31e67d
--- /dev/null
@@ -0,0 +1,19 @@
+/* irq.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/irq.h"
+
+
+int dummy_irq_handler(int irq, struct canchip_t *chip) {
+       CANMSG("dummy_irq_handler called irq %d \n", irq);
+       return CANCHIP_IRQ_NONE;
+}
diff --git a/lincan-0.3.3/src/kthread.c b/lincan-0.3.3/src/kthread.c
new file mode 100644 (file)
index 0000000..d2531b9
--- /dev/null
@@ -0,0 +1,190 @@
+#include <linux/config.h>
+#include <linux/version.h>
+
+#if defined(MODVERSIONS)
+#include <linux/modversions.h>
+#endif
+#include <linux/kernel.h>
+#include <linux/sched.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,40))
+  #include <linux/tqueue.h>
+#else
+  #include <linux/devfs_fs_kernel.h>
+#endif
+
+#include <linux/wait.h>
+#include <linux/signal.h>
+#include <linux/interrupt.h>
+
+
+#include <asm/semaphore.h>
+#include <linux/smp_lock.h>
+
+#include "../include/kthread.h"
+
+/* private functions */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,40))
+static void kthread_launcher(void *data)
+#else
+static void kthread_launcher(unsigned long data)
+#endif
+{
+  kthread_t *kthread = (kthread_t *)data;
+
+  kernel_thread((int (*)(void *))kthread->function, (void *)kthread, 0);
+}
+
+/* public functions */
+
+/* create a new kernel thread. Called by the creator. */
+void start_kthread(void (*func)(kthread_t *), kthread_t *kthread)
+{
+    /* initialize the semaphore:
+       we start with the semaphore locked. The new kernel
+       thread will setup its stuff and unlock it. This
+       control flow (the one that creates the thread) blocks
+       in the down operation below until the thread has reached
+       the up() operation.
+    */
+    init_MUTEX_LOCKED(&kthread->startstop_sem);
+
+    /* store the function to be executed in the data passed to
+       the launcher */
+    kthread->function=func;
+
+    /* create the new thread my running a task through keventd */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,40))
+
+    /* initialize the task queue structure */
+    kthread->tq.sync = 0;
+    INIT_LIST_HEAD(&kthread->tq.list);
+    kthread->tq.routine = kthread_launcher;
+    kthread->tq.data = kthread;
+
+    /* and schedule it for execution */
+    schedule_task(&kthread->tq);
+#else
+    /* initialize tasklet */
+    tasklet_init(&kthread->tq, kthread_launcher, (unsigned long)kthread);
+    /* and schedule it for execution */
+    tasklet_schedule(&kthread->tq);
+#endif
+
+    /* wait till it has reached the setup_thread routine */
+    down(&kthread->startstop_sem);
+}
+
+/* stop a kernel thread. Called by the removing instance */
+void stop_kthread(kthread_t *kthread)
+{
+    if (kthread->thread == NULL)
+    {
+        printk("stop_kthread: killing non existing thread!\n");
+        return;
+    }
+
+    /* this function needs to be protected with the big
+    kernel lock (lock_kernel()). The lock must be
+       grabbed before changing the terminate
+    flag and released after the down() call. */
+    lock_kernel();
+
+    /* initialize the semaphore. We lock it here, the
+       leave_thread call of the thread to be terminated
+       will unlock it. As soon as we see the semaphore
+       unlocked, we know that the thread has exited.
+    */
+    init_MUTEX_LOCKED(&kthread->startstop_sem);
+
+    /* We need to do a memory barrier here to be sure that
+       the flags are visible on all CPUs. 
+    */
+    mb();
+
+    /* set flag to request thread termination */
+    kthread->terminate = 1;
+
+    /* We need to do a memory barrier here to be sure that
+       the flags are visible on all CPUs. 
+    */
+    mb();
+    kill_proc(kthread->thread->pid, SIGKILL, 1);
+
+    /* block till thread terminated */
+    down(&kthread->startstop_sem);
+
+    /* release the big kernel lock */
+    unlock_kernel();
+
+    /* now we are sure the thread is in zombie state. We
+       notify keventd to clean the process up.
+    */
+    kill_proc(2, SIGCHLD, 1);
+
+}
+
+/* initialize new created thread. Called by the new thread. */
+void init_kthread(kthread_t *kthread, char *name)
+{
+    /* fill in thread structure */
+    kthread->thread = current;
+
+    /* initialise termination flag */
+    kthread->terminate = 0;
+
+    /* initialise wait queue */
+    init_waitqueue_head(&kthread->queue);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,40))
+    /* lock the kernel. A new kernel thread starts without
+      the big kernel lock, regardless of the lock state
+      of the creator (the lock level is *not* inheritated)
+    */
+    lock_kernel();
+/*    daemonize(); */
+
+    /* set signal mask to what we want to respond */
+    siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM));
+
+    /* set name of this process (max 15 chars + 0 !) */
+    sprintf(current->comm, name);
+
+    /* let others run */
+    unlock_kernel();
+#else
+
+    daemonize(name);
+#endif
+
+    /* tell the creator that we are ready and let him continue */
+    up(&kthread->startstop_sem);
+}
+
+/* cleanup of thread. Called by the exiting thread. */
+void exit_kthread(kthread_t *kthread)
+{
+    /* we are terminating */
+
+    /* lock the kernel, the exit will unlock it */
+    lock_kernel();
+    kthread->thread = NULL;
+    mb();
+
+    /* notify the stop_kthread() routine that we are terminating. */
+    up(&kthread->startstop_sem);
+    /* the kernel_thread that called clone() does a do_exit here. */
+
+    /* there is no race here between execution of the "killer" and real termination
+       of the thread (race window between up and do_exit), since both the
+       thread and the "killer" function are running with the kernel lock held.
+       The kernel lock will be freed after the thread exited, so the code
+       is really not executed anymore as soon as the unload functions gets
+       the kernel lock back.
+       The init process may not have made the cleanup of the process here,
+       but the cleanup can be done safely with the module unloaded.
+    */
+
+}
+
diff --git a/lincan-0.3.3/src/kv_pcican.c b/lincan-0.3.3/src/kv_pcican.c
new file mode 100644 (file)
index 0000000..a3d2000
--- /dev/null
@@ -0,0 +1,278 @@
+/* kv_pcican.c - support for KVASER PCIcan-S/D/Q cards
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#ifdef CAN_ENABLE_PCI_SUPPORT
+
+#define KV_PCICAN_PCICAN_VENDOR  0x10e8
+#define KV_PCICAN_PCICAN_ID 0x8406
+
+/*AMCC 5920*/
+
+#define S5920_OMB    0x0C
+#define S5920_IMB    0x1C
+#define S5920_MBEF   0x34
+#define S5920_INTCSR 0x38
+#define S5920_RCR    0x3C
+#define S5920_PTCR   0x60
+
+#define INTCSR_ADDON_INTENABLE_M        0x2000
+#define INTCSR_INTERRUPT_ASSERTED_M     0x800000
+
+#define KV_PCICAN_BYTES_PER_CIRCUIT 0x20
+
+// Standard value: Pushpull  (OCTP1|OCTN1|OCTP0|OCTN0|OCM1)
+#define KV_PCICAN_OCR_DEFAULT_STD 0xDA
+// For Galathea piggyback.
+#define KV_PCICAN_OCR_DEFAULT_GAL 0xDB
+
+/*
+
+You need to know the following: 
+" RX1 is connected to ground. 
+" TX1 is not connected. 
+" CLKO is not connected. 
+" Setting the OCR register to 0xDA is a good idea. 
+  This means  normal output mode , push-pull and the correct polarity. 
+" In the CDR register, you should set CBP to 1. 
+  You will probably also want to set the clock divider value to 0 (meaning divide-by-2),
+  the Pelican bit, and the clock-off bit (you have no need for CLKOUT anyway.)
+
+*/
+
+
+
+void kv_pcican_disconnect_irq(struct candevice_t *candev)
+{
+       unsigned long tmp;
+       /* Disable interrupts from card */
+       tmp = inl(candev->dev_base_addr + S5920_INTCSR);
+       tmp &= ~INTCSR_ADDON_INTENABLE_M;
+       outl(tmp, candev->dev_base_addr + S5920_INTCSR);
+}
+
+void kv_pcican_connect_irq(struct candevice_t *candev)
+{
+       unsigned long tmp;
+       /* Enable interrupts from card */
+       tmp = inl(candev->dev_base_addr + S5920_INTCSR);
+       tmp |= INTCSR_ADDON_INTENABLE_M;
+       outl(tmp, candev->dev_base_addr + S5920_INTCSR);
+}
+
+
+int kv_pcican_request_io(struct candevice_t *candev)
+{
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       if(pci_request_region(candev->sysdevptr.pcidev, 0, "kv_pcican_s5920") != 0){
+               CANMSG("Request of kv_pcican_s5920 range failed\n");
+               return -ENODEV;
+       }else if(pci_request_region(candev->sysdevptr.pcidev, 1, "kv_pcican_io") != 0){
+               CANMSG("Request of kv_pcican_io range failed\n");
+               goto error_io;
+       }else if(pci_request_region(candev->sysdevptr.pcidev, 2, "kv_pcican_xilinx") != 0){
+               CANMSG("Request of kv_pcican_xilinx range failed\n");
+               goto error_xilinx;
+       }
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       if(pci_request_regions(candev->sysdevptr.pcidev, "kv_pcican") != 0){
+               CANMSG("Request of kv_pcican_s5920 regions failed\n");
+               return -ENODEV;
+       }
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       kv_pcican_disconnect_irq(candev);
+
+       return 0;
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+    error_xilinx:
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+    error_io:
+       pci_release_region(candev->sysdevptr.pcidev, 0);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       
+       return -ENODEV;
+}
+
+int kv_pcican_release_io(struct candevice_t *candev)
+{
+       kv_pcican_disconnect_irq(candev);
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(candev->sysdevptr.pcidev, 2);
+       pci_release_region(candev->sysdevptr.pcidev, 1);
+       pci_release_region(candev->sysdevptr.pcidev, 0);
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(candev->sysdevptr.pcidev);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       return 0;
+}
+
+
+void kv_pcican_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address); 
+}
+
+unsigned kv_pcican_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+int kv_pcican_reset(struct candevice_t *candev)
+{
+       int i=0,chip_nr;
+       struct canchip_t *chip;
+       unsigned cdr;
+
+       DEBUGMSG("Resetting kv_pcican hardware ...\n");
+
+       /* Assert PTADR# - we're in passive mode so the other bits are not important */
+       outl(0x80808080L, candev->dev_base_addr + S5920_PTCR);
+
+       kv_pcican_disconnect_irq(candev);
+
+       for(chip_nr=0;chip_nr<candev->nr_all_chips;chip_nr++){
+               if(!candev->chip[chip_nr]) continue;
+               chip=candev->chip[chip_nr];
+
+               kv_pcican_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+               udelay(1000);
+
+               cdr=kv_pcican_read_register(chip->chip_base_addr+SJACDR);
+               kv_pcican_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               kv_pcican_write_register(0, chip->chip_base_addr+SJAIER);
+
+               i=20;
+               kv_pcican_write_register(0, chip->chip_base_addr+SJAMOD);
+               while (kv_pcican_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+                       if(!i--) return -ENODEV;
+                       udelay(1000);
+                       kv_pcican_write_register(0, chip->chip_base_addr+SJAMOD);
+               }
+
+               cdr=kv_pcican_read_register(chip->chip_base_addr+SJACDR);
+               kv_pcican_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+               kv_pcican_write_register(0, chip->chip_base_addr+SJAIER);
+               
+               kv_pcican_read_register(chip->chip_base_addr+SJAIR);
+       }
+       
+
+       kv_pcican_connect_irq(candev);
+
+       return 0;
+}      
+
+int kv_pcican_init_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = NULL;
+       int i;
+
+       do {
+               pcidev = pci_find_device(KV_PCICAN_PCICAN_VENDOR, KV_PCICAN_PCICAN_ID, pcidev);
+               if(pcidev == NULL) return -ENODEV;
+       } while(can_check_dev_taken(pcidev));
+       
+       if (pci_enable_device (pcidev)){
+               printk(KERN_CRIT "Setup of PCICAN failed\n");
+               return -EIO;
+       }
+       candev->sysdevptr.pcidev=pcidev;
+       
+       for(i=0;i<3;i++){
+               if(!(pci_resource_flags(pcidev,i)&IORESOURCE_IO)){
+                       printk(KERN_CRIT "PCICAN region %d is not IO\n",i);
+                       return -EIO;
+               }
+       }
+       candev->dev_base_addr=pci_resource_start(pcidev,0); /*S5920*/
+       candev->io_addr=pci_resource_start(pcidev,1); /*IO window for SJA1000 chips*/
+       candev->res_addr=pci_resource_start(pcidev,2); /*XILINX board wide address*/
+       
+       /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/
+
+       if (!strcmp(candev->hwname,"pcican-s")) {
+               candev->nr_82527_chips=0;
+               candev->nr_sja1000_chips=1;
+               candev->nr_all_chips=1;
+       }
+       if (!strcmp(candev->hwname,"pcican-d")) {
+               candev->nr_82527_chips=0;
+               candev->nr_sja1000_chips=2;
+               candev->nr_all_chips=2;
+       }
+       if (!strcmp(candev->hwname,"pcican-q")) {
+               candev->nr_82527_chips=0;
+               candev->nr_sja1000_chips=4;
+               candev->nr_all_chips=4;
+       }
+
+       return 0;
+}
+
+int kv_pcican_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+
+       if(candev->sysdevptr.pcidev==NULL)
+               return -ENODEV;
+       
+       candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
+
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=
+                       candev->io_addr+chipnr*KV_PCICAN_BYTES_PER_CIRCUIT;
+       candev->chip[chipnr]->flags = 0;
+       candev->chip[chipnr]->int_cpu_reg = 0;
+       candev->chip[chipnr]->int_clk_reg = 0;
+       candev->chip[chipnr]->int_bus_reg = 0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = KV_PCICAN_OCR_DEFAULT_STD;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->flags |= CHIP_IRQ_PCI;
+
+       return 0;
+}      
+
+int kv_pcican_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+int kv_pcican_program_irq(struct candevice_t *candev)
+{
+
+       return 0;
+}
+
+int kv_pcican_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = kv_pcican_request_io;
+       hwspecops->release_io = kv_pcican_release_io;
+       hwspecops->reset = kv_pcican_reset;
+       hwspecops->init_hw_data = kv_pcican_init_hw_data;
+       hwspecops->init_chip_data = kv_pcican_init_chip_data;
+       hwspecops->init_obj_data = kv_pcican_init_obj_data;
+       hwspecops->write_register = kv_pcican_write_register;
+       hwspecops->read_register = kv_pcican_read_register;
+       hwspecops->program_irq = kv_pcican_program_irq;
+       return 0;
+}
+
+
+#endif /*CAN_ENABLE_PCI_SUPPORT*/
diff --git a/lincan-0.3.3/src/m437.c b/lincan-0.3.3/src/m437.c
new file mode 100644 (file)
index 0000000..c67b3dd
--- /dev/null
@@ -0,0 +1,297 @@
+/* m437.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+/* 
+ * Support for the SECO M437 
+ * 
+ * SECO M437 is a pc104 format, i82527 controller based card
+ * produced by SECO http://www.seco.it 
+ * This driver uses the Memory Mapped I/O mode, and should be
+ * working with all cards supporting this mode.
+ *
+ * Written by Fabio Parodi  (fabio.parodi@iname.com)
+ * Additional changes by Giampiero Giancipoli (gianci@freemail.it)
+ *
+ * Version 0.1  08 Jun 2001
+ *
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/m437.h"
+#include "../include/i82527.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x100
+
+
+static long base = 0L; 
+
+/**
+ * m437_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function m437_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/m437.c
+ */
+int m437_request_io(struct candevice_t *candev)
+{
+
+       if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+
+       if ( !( base = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,IO_RANGE);
+               return -ENODEV;
+       
+       }
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       return 0;
+}
+
+/**
+ * m437_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function m437_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/m437.c
+ */
+int m437_release_io(struct candevice_t *candev)
+{
+       unsigned i;
+       
+        /* disable IRQ generation */
+        m437_write_register(iCTL_CCE, iCTL);
+
+       /* clear all message objects */
+       for (i=1; i<=15; i++) {
+               m437_write_register(
+                               INTPD_RES | 
+                               RXIE_RES | 
+                               TXIE_RES | 
+                               MVAL_RES, 
+                               i*0x10+iMSGCTL0);
+               m437_write_register(
+                               NEWD_RES | 
+                               MLST_RES | 
+                               CPUU_RES | 
+                               TXRQ_RES | 
+                               RMPD_RES, 
+                               i*0x10+iMSGCTL1);
+       }
+       
+       /* power down i82527 */
+       m437_write_register(iCPU_PWD, iCPU);
+       
+       /* release I/O memory mapping */
+       iounmap((void*)base);
+
+       can_release_mem_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * m437_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function m437_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/m437.c
+ */
+int m437_reset(struct candevice_t *candev)
+{
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 1
+#define NR_SJA1000 0
+
+/**
+ * m437_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function m437_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/m437.c
+ */
+int m437_init_hw_data(struct candevice_t *candev) 
+{
+       DEBUGMSG("m437_init_hw_data()\n");
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=1;
+       candev->nr_sja1000_chips=0;
+        candev->nr_all_chips=1;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+       /* The M437 has no programmable IRQ */
+
+       return 0;
+}
+
+/**
+ * m437_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function m437_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/m437.c
+ */
+int m437_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC | iCPU_CEN;
+       candev->chip[chipnr]->int_clk_reg = 
+               iCLK_CD0 | iCLK_CD1 | iCLK_CD2 | iCLK_SL0 | iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+
+       return 0;
+}
+
+/**
+ * m437_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function m437_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/m437.c
+ */
+int m437_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/**
+ * m437_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function m437_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/m437.c
+ */
+int m437_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * m437_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function m437_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/m437.c
+ */
+void m437_write_register(unsigned data, unsigned long address)
+{
+       writeb(data,base+address);
+}
+
+/**
+ * m437_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function m437_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/m437.c
+ */
+unsigned m437_read_register(unsigned long address)
+{
+       return readb(base+address);
+}
+
+/* !!! Don't change this function !!! */
+int m437_register(struct hwspecops_t *hwspecops)
+{
+       DEBUGMSG("m437_register()\n");
+       hwspecops->request_io = m437_request_io;
+       hwspecops->release_io = m437_release_io;
+       hwspecops->reset = m437_reset;
+       hwspecops->init_hw_data = m437_init_hw_data;
+       hwspecops->init_chip_data = m437_init_chip_data;
+       hwspecops->init_obj_data = m437_init_obj_data;
+       hwspecops->write_register = m437_write_register;
+       hwspecops->read_register = m437_read_register;
+       hwspecops->program_irq = m437_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/main.c b/lincan-0.3.3/src/main.c
new file mode 100644 (file)
index 0000000..0bbf365
--- /dev/null
@@ -0,0 +1,440 @@
+/* main.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifndef EXPORT_SYMTAB
+#define EXPORT_SYMTAB
+#endif
+
+#include <linux/autoconf.h>
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/poll.h>
+#include <linux/version.h>
+#include <linux/autoconf.h>
+#include <linux/interrupt.h>
+
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+ #include <linux/wrapper.h>
+#else
+ #include <linux/device.h>
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
+  static struct class *can_class;
+ #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+  static struct class_simple *can_class;
+  #define class_create class_simple_create
+  #define class_device_create class_simple_device_add
+  #define class_device_destroy(a,b) class_simple_device_remove(b)
+  #define class_destroy class_simple_destroy
+ #endif
+#endif
+
+#if !defined (__GENKSYMS__) 
+#if (defined (MODVERSIONS) && !defined(NOVER))
+#include <linux/modversions.h>
+/*#include "../include/main.ver"*/
+#endif
+#endif
+
+/*#undef CONFIG_DEVFS_FS*/
+
+#ifdef CONFIG_DEVFS_FS
+#include <linux/devfs_fs_kernel.h>
+#include <linux/miscdevice.h>
+#endif
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/modparms.h"
+#include "../include/devcommon.h"
+#include "../include/setup.h"
+#include "../include/proc.h"
+#include "../include/open.h"
+#include "../include/close.h"
+#include "../include/read.h"
+#include "../include/select.h"
+#include "../include/irq.h"
+#include "../include/ioctl.h"
+#include "../include/write.h"
+#include "../include/finish.h"
+#include "../include/fasync.h"
+
+#ifdef CAN_WITH_RTL
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+#endif /*CAN_WITH_RTL*/
+
+can_spinlock_t canuser_manipulation_lock;
+
+int major=CAN_MAJOR;
+int minor[MAX_TOT_CHIPS]={-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};
+int extended=0;
+int pelican=0;
+int baudrate[MAX_TOT_CHIPS];
+char *hw[MAX_HW_CARDS]={NULL,};
+int irq[MAX_IRQ]={-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};
+unsigned long io[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1};
+int stdmask=0;
+int extmask=0;
+int mo15mask=0;
+int processlocal=0;
+
+unsigned int minor_specified;
+unsigned int baudrate_specified;
+unsigned int hw_specified;
+unsigned int irq_specified;
+unsigned int io_specified;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
+/* Module parameters, some must be supplied at module loading time */
+MODULE_PARM(major,"1i");
+/*MODULE_PARM(minor, "1-" __MODULE_STRING(MAX_TOT_CHIPS)"i");*/
+MODULE_PARM(minor, "1-" __MODULE_STRING(MAX_TOT_CHIPS_STR)"i");
+MODULE_PARM(extended,"1i");
+MODULE_PARM(pelican,"1i");
+MODULE_PARM(baudrate, "1-" __MODULE_STRING(MAX_TOT_CHIPS_STR)"i");
+MODULE_PARM(hw, "1-" __MODULE_STRING(MAX_HW_CARDS)"s");
+MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_IRQ)"i");
+MODULE_PARM(io, "1-" __MODULE_STRING(MAX_HW_CARDS)"i");
+MODULE_PARM(stdmask, "1i");
+MODULE_PARM(extmask, "1i");
+MODULE_PARM(mo15mask, "1i");
+MODULE_PARM(processlocal, "1i");
+
+#else /* LINUX_VERSION_CODE >= 2,6,0 */
+module_param(major, int, 0);
+module_param_array(minor, int, &minor_specified, 0);
+module_param(extended, int, 0);
+module_param(pelican, int, 0);
+module_param_array(baudrate, int, &baudrate_specified, 0);
+module_param_array(hw, charp, &hw_specified, 0);
+module_param_array(irq, int, &irq_specified, 0);
+module_param_array(io, int, &io_specified, 0);
+module_param(stdmask, int, 0);
+module_param(extmask, int, 0);
+module_param(mo15mask, int, 0);
+module_param(processlocal, int, 0);
+#endif /* LINUX_VERSION_CODE >= 2,6,0 */
+
+MODULE_PARM_DESC(major,"can be used to change default major [" __MODULE_STRING(CAN_MAJOR) "]");
+MODULE_PARM_DESC(minor,"can be used to change default starting minor for each channel");
+MODULE_PARM_DESC(extended,"enables automatic switching to extended format if ID>2047,"
+                       " selects extended frames reception for i82527");
+MODULE_PARM_DESC(pelican,"unused parameter, PeliCAN used by default for sja1000p chips");
+MODULE_PARM_DESC(baudrate,"baudrate for each channel in step of 1kHz");
+MODULE_PARM_DESC(hw,"list of boards types to initialize - virtual,pip5,...");
+MODULE_PARM_DESC(irq,"list of iterrupt signal numbers, most ISA has one per chip, no value for PCI or virtual");
+MODULE_PARM_DESC(io,"IO address for each board, use 0 for PCI or virtual");
+MODULE_PARM_DESC(stdmask,"default standard mask for i82527 chips");
+MODULE_PARM_DESC(extmask,"default extended mask for i82527 chips");
+MODULE_PARM_DESC(mo15mask,"mask for communication object 15 of i82527 chips");
+MODULE_PARM_DESC(processlocal,"select postprocessing/loopback of transmitted messages - "
+               "0 .. disabled, 1 .. can be enabled by FIFO filter, 2 .. enabled by default");
+
+#ifdef CAN_WITH_RTL
+int can_rtl_priority=-1;
+MODULE_PARM(can_rtl_priority, "1i");
+MODULE_PARM_DESC(can_rtl_priority,"select priority of chip worker thread");
+#endif /*CAN_WITH_RTL*/
+
+/* Other module attributes */
+#ifdef MODULE_SUPPORTED_DEVICE
+MODULE_SUPPORTED_DEVICE("can");
+#endif
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+#ifdef MODULE_DESCRIPTION
+MODULE_DESCRIPTION("Universal Linux CAN-bus device driver");
+#endif
+#ifdef MODULE_AUTHOR
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>, Arnaud Westenberg");
+#endif
+
+/* Global structures, used to describe the installed hardware. */
+struct canhardware_t canhardware;
+struct canhardware_t *hardware_p=&canhardware;
+struct canchip_t *chips_p[MAX_TOT_CHIPS];
+struct msgobj_t *objects_p[MAX_TOT_MSGOBJS];
+#ifdef CONFIG_DEVFS_FS
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+devfs_handle_t  devfs_handles[MAX_TOT_MSGOBJS];
+#endif
+#endif
+
+/* Pointers to dynamically allocated memory are maintained in a linked list
+ * to ease memory deallocation.
+ */
+struct mem_addr *mem_head=NULL;
+
+struct file_operations can_fops=
+{
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0))
+       owner:          THIS_MODULE,    
+ #endif
+       read:           can_read,
+       write:          can_write,
+       poll:           can_poll,
+       ioctl:          can_ioctl,
+       open:           can_open,
+       release:        can_close,
+  #ifdef CAN_ENABLE_KERN_FASYNC
+       fasync:         can_fasync
+  #endif /*CAN_ENABLE_KERN_FASYNC*/
+};
+
+EXPORT_SYMBOL(can_fops);
+
+
+#ifdef CAN_WITH_RTL
+struct rtl_file_operations can_fops_rtl = {
+       llseek:         NULL,
+       read:           can_read_rtl_posix,
+       write:          can_write_rtl_posix,
+       ioctl:          can_ioctl_rtl_posix,
+       mmap:           NULL,
+       open:           can_open_rtl_posix,
+       release:        can_release_rtl_posix
+};
+#endif /*CAN_WITH_RTL*/
+
+
+/*
+ 2.6 kernel attributes for sysfs
+static ssize_t show_xxx(struct class_device *cdev, char *buf)
+{
+        return sprintf(buf, "xxxx\n");
+}
+
+static ssize_t store_xxx(struct class_device *cdev, const char * buf, size_t count)
+{
+}
+
+static CLASS_DEVICE_ATTR(xxx, S_IRUGO, show_xxx, store_xxx/NULL);
+
+ret = class_device_create_file(class_dev, class_device_attr_xxx);
+if (ret)
+       goto err_unregister;
+
+*/
+
+int init_module(void)
+{
+       int res=0,i=0, j;
+       struct candevice_t *candev;
+       struct canchip_t *chip;
+
+       if (parse_mod_parms())
+               return -EINVAL;
+
+       can_spin_lock_init(&canuser_manipulation_lock);
+       canqueue_kern_initialize();
+
+       if (init_hw_struct())
+               return -ENODEV;
+
+       #ifdef CAN_DEBUG
+               list_hw();
+       #endif
+
+       res=register_chrdev(major,DEVICE_NAME, &can_fops);
+       if (res<0) {
+               CANMSG("Error registering driver.\n");
+               goto register_error;
+       }
+
+       #ifdef CAN_WITH_RTL
+       can_spin_lock_init(&can_irq_manipulation_lock);
+       canqueue_rtl_initialize();
+       res=rtl_register_rtldev(major,DEVICE_NAME,&can_fops_rtl);
+       if (res<0) {
+               CANMSG("Error registering RT-Linux major number.\n");
+               goto rtldev_error;
+       }
+       #endif /*CAN_WITH_RTL*/
+
+       for (i=0; i<hardware_p->nr_boards; i++) {
+               candev=hardware_p->candevice[i];
+               if (candev->hwspecops->request_io(candev)) 
+                       goto request_io_error;
+               candev->flags|=CANDEV_IO_RESERVED;
+       }
+
+       for (i=0; i<hardware_p->nr_boards; i++) {
+               candev=hardware_p->candevice[i];
+               if (candev->hwspecops->reset(candev)) 
+                       goto reset_error;
+       }
+
+       can_spin_lock_init(&hardware_p->rtr_lock);
+       hardware_p->rtr_queue=NULL;
+
+       for (i=0; i<hardware_p->nr_boards; i++) {
+               candev=hardware_p->candevice[i];
+               for(j=0; j<candev->nr_all_chips; j++) {
+                       if((chip=candev->chip[j])==NULL)
+                               continue;
+
+                       if(chip->chipspecops->attach_to_chip(chip)<0) {
+                               CANMSG("Initial attach to the chip HW failed\n");
+                               goto interrupt_error;
+                       }
+
+                       chip->flags |= CHIP_ATTACHED;
+       
+                       if(can_chip_setup_irq(chip)<0) {
+                               CANMSG("Error to setup chip IRQ\n");
+                               goto interrupt_error;
+                       }
+               }
+
+               if (candev->flags & CANDEV_PROGRAMMABLE_IRQ)
+                       if (candev->hwspecops->program_irq(candev)){
+                               CANMSG("Error to program board interrupt\n");
+                               goto interrupt_error;
+                       }
+       }
+
+#ifdef CONFIG_PROC_FS
+       if (can_init_procdir())
+               goto proc_error;
+#endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+       can_class=class_create(THIS_MODULE, "can");
+#endif
+
+#if defined(CONFIG_DEVFS_FS) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+        {
+           #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+               char dev_name[32];
+           #else
+               struct class_device *this_dev;
+           #endif
+               int dev_minor;
+               for(i=0;i<MAX_TOT_MSGOBJS;i++) {
+                       if(!objects_p[i]) continue;
+                       dev_minor=objects_p[i]->minor;
+                   #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+                       sprintf (dev_name, "can%d", dev_minor);
+                       devfs_handles[i]=devfs_register(NULL, dev_name,
+                               DEVFS_FL_DEFAULT, major, dev_minor,
+                               S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
+                               &can_fops, (void*)objects_p[i]);
+                   #else
+                     #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,14))
+                       this_dev=class_device_create(can_class, MKDEV(major, dev_minor), NULL,  "can%d", dev_minor);
+                     #else /* >= 2.6.15 */
+                       this_dev=class_device_create(can_class, NULL, MKDEV(major, dev_minor), NULL,  "can%d", dev_minor);
+                     #endif /* >= 2.6.15 */
+                       if(IS_ERR(this_dev)){
+                               CANMSG("problem to create device \"can%d\" in the class \"can\"\n", dev_minor);
+                       }else{
+                               /*this_dev->class_data=objects_p[i];*/
+                               class_set_devdata(this_dev,objects_p[i]);
+                       }
+                     #ifdef CONFIG_DEVFS_FS
+                       devfs_mk_cdev(MKDEV(major, dev_minor), S_IFCHR | S_IRUGO | S_IWUGO, "can%d", dev_minor);
+                     #endif
+                   #endif
+               }
+        }
+#endif
+       return 0;
+
+#ifdef CONFIG_PROC_FS
+       proc_error: ;
+               CANMSG("Error registering /proc entry.\n");
+               goto memory_error; 
+#endif
+
+       interrupt_error: ;
+               goto memory_error;
+
+       reset_error: ;
+               CANMSG("Error resetting device.\n");
+               goto memory_error;
+
+       request_io_error: ;
+               CANMSG("Error to request IO resources for device.\n");
+               goto memory_error;
+
+       memory_error: ;
+               canhardware_done(hardware_p);
+
+               #ifdef CAN_WITH_RTL
+               rtl_unregister_rtldev(major,DEVICE_NAME);
+       rtldev_error:
+               canqueue_rtl_done();
+               #endif /*CAN_WITH_RTL*/
+
+               res=unregister_chrdev(major,DEVICE_NAME);
+               if (res<0)
+                       CANMSG("Error unloading CAN driver, error: %d\n",res);
+               else
+                       CANMSG("No CAN devices or driver setup error.\n");
+
+       register_error:
+               if ( can_del_mem_list() ) 
+                       CANMSG("Error deallocating memory\n");
+
+               return -ENODEV;
+}
+
+void cleanup_module(void)
+{
+       int res=0,i=0;
+
+#ifdef CONFIG_PROC_FS
+       if (can_delete_procdir())
+               CANMSG("Error unregistering /proc/can entry.\n"); 
+#endif
+
+#if defined(CONFIG_DEVFS_FS) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+               for(i=0;i<MAX_TOT_MSGOBJS;i++) {
+           #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
+                       if(devfs_handles[i])
+                               devfs_unregister(devfs_handles[i]);
+           #else
+               int dev_minor;
+                       if(!objects_p[i]) continue;
+                       dev_minor=objects_p[i]->minor;
+               if(minor>=0){
+                   #ifdef CONFIG_DEVFS_FS
+                       devfs_remove("can%d", dev_minor);
+                   #endif
+                       class_device_destroy(can_class, MKDEV(major, dev_minor));
+               }
+           #endif
+               }
+#endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+       class_destroy(can_class);
+#endif
+
+       canhardware_done(hardware_p);
+
+       #ifdef CAN_WITH_RTL
+       rtl_unregister_rtldev(major,DEVICE_NAME);
+       canqueue_rtl_done();
+       #endif /*CAN_WITH_RTL*/
+
+       if ( can_del_mem_list() ) 
+               CANMSG("Error deallocating memory\n");
+
+       res=unregister_chrdev(major,DEVICE_NAME);
+       if (res<0)
+               CANMSG("Error unregistering CAN driver, error: %d\n",res);
+}
diff --git a/lincan-0.3.3/src/modparms.c b/lincan-0.3.3/src/modparms.c
new file mode 100644 (file)
index 0000000..1782c54
--- /dev/null
@@ -0,0 +1,104 @@
+/* mod_parms.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/modparms.h"
+
+int parse_mod_parms(void)
+{
+       int i=0,j=0,irq_needed=0,irq_supplied=0,io_needed=0,io_supplied=0,minor_needed=0,minor_supplied=0;
+       const struct boardtype_t *brp;
+
+       if ( (hw[0] == NULL) | (io[0] == -1) ) {
+               CANMSG("You must supply your type of hardware, interrupt numbers and io address.\n");
+               CANMSG("Example: # insmod can.o hw=pip5 irq=4 io=0x8000\n");
+               return -ENODEV;
+       }
+
+       while ( (hw[i] != NULL) && (i < MAX_HW_CARDS) ) {
+               brp = boardtype_find(hw[i]);
+               if(!brp) {
+                       CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hw[i]);
+                       return -EINVAL;
+               }
+               irq_needed += brp->irqnum;
+               i++;
+       }
+
+       /* Check wether the supplied number of io addresses is correct. */
+       io_needed=i;
+       while ( (io[io_supplied] != -1) & (io_supplied<MAX_HW_CARDS) ) 
+               io_supplied++;
+       if (io_needed != io_supplied) {
+               CANMSG("Invalid number of io addresses.\n");
+               CANMSG("Supplied hardware needs %d io address(es).\n",io_needed);
+               return -EINVAL;
+       }
+
+       /* Check wether the supplied number of irq's is correct. */
+       while ( (irq[irq_supplied] != -1) & (irq_supplied<MAX_IRQ) )
+               irq_supplied++;
+       while ( (hw[j] != NULL) && (j<MAX_HW_CARDS) ) {
+               if (!strcmp(hw[j],"template"))
+                       irq_needed = irq_supplied;
+               j++;
+       }
+       if (irq_needed != irq_supplied) {
+               CANMSG("Invalid number of interrupts.\n");
+               CANMSG("Supplied harware needs %d irq number(s).\n",irq_needed);
+               return -EINVAL;
+       }
+
+       /* In case minor numbers were assigned check wether the correct number
+        * of minor numbers was supplied.
+        */
+       if (minor[0] != -1) {
+               minor_needed=irq_needed;
+               while ((minor[minor_supplied] != -1) & (minor_supplied<MAX_IRQ))
+                       minor_supplied++; 
+               if (minor_supplied != minor_needed) {
+                       CANMSG("Invalid number of minor numbers.\n");
+                       CANMSG("Supplied hardware needs %d minor number(s).\n",minor_needed);
+                       return -EINVAL;
+               }
+       }
+
+       return 0;
+}
+/* list_hw is used when debugging is on to show the hardware layout */
+int list_hw(void)
+{
+       int i=0,j=0,k=0;
+
+       DEBUGMSG("Number of boards : %d\n",hardware_p->nr_boards);
+
+       while ( (hw[i] != NULL) & (i<=MAX_HW_CARDS-1) ) {
+               printk(KERN_ERR "\n");
+               DEBUGMSG("Hardware         : %s\n",hardware_p->candevice[i]->hwname);
+               DEBUGMSG("IO address       : 0x%lx\n",hardware_p->candevice[i]->io_addr);
+               DEBUGMSG("Nr. all chips    : %d\n",hardware_p->candevice[i]->nr_all_chips);
+               DEBUGMSG("Nr. of i82527    : %d\n",hardware_p->candevice[i]->nr_82527_chips);
+               DEBUGMSG("Nr. of sja1000   : %d\n",hardware_p->candevice[i]->nr_sja1000_chips);
+               for (j=0; j<hardware_p->candevice[i]->nr_all_chips; j++) {
+                       DEBUGMSG("Chip%d type       : %s\n", j+1, hardware_p->candevice[i]->chip[j]->chip_type);
+                       DEBUGMSG("Chip base        : 0x%lx\n",hardware_p->candevice[i]->chip[j]->chip_base_addr);
+                       DEBUGMSG("Interrupt        : %d\n",hardware_p->candevice[i]->chip[j]->chip_irq);
+
+
+                       for (k=0; k<hardware_p->candevice[i]->chip[j]->max_objects; k++)
+                               DEBUGMSG("Obj%d: minor: %d base: 0x%lx\n",k,hardware_p->candevice[i]->chip[j]->msgobj[k]->minor,hardware_p->candevice[i]->chip[j]->msgobj[k]->obj_base_addr);
+
+               }
+               i++;
+       }
+       return 0;
+}
diff --git a/lincan-0.3.3/src/msmcan.c b/lincan-0.3.3/src/msmcan.c
new file mode 100644 (file)
index 0000000..9851b5f
--- /dev/null
@@ -0,0 +1,224 @@
+/* msmcan.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/msmcan.h"
+#include "../include/i82527.h"
+
+static CAN_DEFINE_SPINLOCK(msmcan_port_lock);
+
+/* IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips.
+ */
+#define IO_RANGE 0x04
+
+/* The function template_request_io is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well.
+ * The reserved memory starts at candev->io_addr, wich is the module parameter io.
+ */
+int msmcan_request_io(struct candevice_t *candev)
+{
+
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, 
+                        candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/* The function template_release_io is used to free the previously reserved 
+ * io-memory. In case you reserved more memory, don't forget to free it here.
+ */
+int msmcan_release_io(struct candevice_t *candev)
+{
+
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/* The function template_reset is used to give a hardware reset. This is rather
+ * hardware specific so I haven't included example code. Don't forget to check
+ * the reset status of the chip before returning.
+ */
+int msmcan_reset(struct candevice_t *candev)
+{
+       struct canchip_t *chip=candev->chip[0];
+
+       DEBUGMSG("Resetting msmcan hardware ...\n");
+       /* we don't use template_write_register because we don't use the two first
+          registers of the card but the third in order to make a hard reset */
+       /* outb (1, msmcan_base + candev->res_addr); */
+
+
+       /* terrible MSMCAN reset design - best to comment out */
+       if(0) {
+               int tic=jiffies;
+               int tac;
+               
+               msmcan_write_register(iCTL_INI, chip->chip_base_addr+iCTL);
+               /*CLKOUT stopped (iCPU_CEN=0) */
+               msmcan_write_register(iCPU_DSC, chip->chip_base_addr+iCPU);
+               while(!(msmcan_read_register(chip->chip_base_addr+iCPU)&iCPU_CEN)){
+                       tac=jiffies;
+                       if((tac-tic)>HZ*2){
+                               CANMSG("Unable to reset board\n");
+                               return -EIO;
+                       }
+                       schedule();
+               }
+               
+       
+       }
+
+       can_disable_irq(chip->chip_irq);
+       msmcan_write_register(iCTL_INI, chip->chip_base_addr+iCTL);
+       can_enable_irq(chip->chip_irq);
+
+       return 0;
+}
+
+/* The function template_init_hw_data is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * RESET_ADDR represents the io-address of the hardware reset register.
+ * NR_82527 represents the number of intel 82527 chips on the board.
+ * NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ */
+#define NR_82527 1
+#define NR_SJA1000 0
+
+int msmcan_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=0;
+       candev->nr_82527_chips=1;
+       candev->nr_sja1000_chips=0;
+        candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+/* The function template_init_chip_data is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * CHIP_TYPE represents the type of CAN chip. CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the candev->io_addr
+ * argument supplied at module loading time.
+ * The clock argument holds the chip clock value in Hz.
+ */
+
+int msmcan_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       /* device uses indexed access */
+       candev->chip[chipnr]->chip_base_addr=
+           candev->io_addr << 16;
+       candev->chip[chipnr]->clock = 16000000;
+       /* The CLKOUT has to be enabled to reset MSMCAN MAX1232 watchdog */
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC | iCPU_CEN;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+
+       return 0;
+}
+
+ /* The function template_init_obj_data is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ */
+int msmcan_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+       chip->msgobj[objnr]->obj_base_addr=
+           chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/* The function template_program_irq is used for hardware that uses programmable
+ * interrupts. If your hardware doesn't use programmable interrupts you should
+ * not set the candevices_t->flags entry to CANDEV_PROGRAMMABLE_IRQ and leave this
+ * function unedited. Again this function is hardware specific so there's no
+ * example code.
+ */
+int msmcan_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/* The function template_write_register is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ */
+void msmcan_write_register(unsigned data, unsigned long address)
+{
+       /* address is combination of base address shifted left by 16 and index */
+       can_spin_irqflags_t flags;
+
+       /* the msmcan card has two registers, the data register at 0x0
+          and the address register at 0x01 */
+
+       can_spin_lock_irqsave(&msmcan_port_lock,flags);
+       outb(address & 0xff, (address>>16)+1);
+       outb(data, address>>16); 
+       can_spin_unlock_irqrestore(&msmcan_port_lock,flags);
+}
+
+/* The function template_read_register is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ */
+unsigned msmcan_read_register(unsigned long address)
+{
+       /* this is the same thing that the function write_register.
+          We use the two register, we write the address where we 
+          want to read in a first time. In a second time we read the
+          data */
+       unsigned char ret;
+       can_spin_irqflags_t flags;
+    
+
+       can_spin_lock_irqsave(&msmcan_port_lock,flags);
+       outb(address & 0xff, (address>>16)+1);
+       ret=inb(address>>16); 
+       can_spin_unlock_irqrestore(&msmcan_port_lock,flags);
+       return ret;
+}
+
+
+ /* !!! Don't change this function !!! */
+int msmcan_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = msmcan_request_io;
+       hwspecops->release_io = msmcan_release_io;
+       hwspecops->reset = msmcan_reset;
+       hwspecops->init_hw_data = msmcan_init_hw_data;
+       hwspecops->init_chip_data = msmcan_init_chip_data;
+       hwspecops->init_obj_data = msmcan_init_obj_data;
+       hwspecops->write_register = msmcan_write_register;
+       hwspecops->read_register = msmcan_read_register;
+       hwspecops->program_irq = msmcan_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/ns_dev_can.c b/lincan-0.3.3/src/ns_dev_can.c
new file mode 100644 (file)
index 0000000..0fc15c0
--- /dev/null
@@ -0,0 +1,302 @@
+/* ns_dev_can.c - FPGA version of C_CAN ARM device specific code
+ * Linux CAN-bus device driver.
+ * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * and Ake Hedman, eurosource, akhe@eurosource.se
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * Ported to FS Forth-Systeme GmbH A9M9750DEVx development boards
+ * email:nbryan@embebidos.com
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ * This port 19 May 2005
+ *
+ */
+
+#include <linux/delay.h>
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/c_can.h"
+#include "../include/ns_dev_can.h"
+
+/*
+ * IO range for the C_CAN 1.2 memory map is 0x100 (256bytes)
+ */
+#define IO_RANGE 0x100
+
+/**
+ * ns_dev_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ */
+int ns_dev_request_io(struct candevice_t *candev)
+{
+       /* Note hard-coded index for the chip number as this 
+        * only supports a single instance of the C_CAN controller.
+        */
+       DEBUGMSG("(c%d)ns_dev_request_io (...)\n", candev->chip[0]->chip_idx);
+
+       if (!can_request_mem_region(candev->io_addr, IO_RANGE, DEVICE_NAME)) {
+               CANMSG("ns_dev failed to  mem region %lx.\n",
+                      (unsigned long)candev->io_addr);
+       }
+
+       if (!(candev->dev_base_addr = (long)ioremap(candev->io_addr, IO_RANGE))) {
+               DEBUGMSG
+                   ("Failed to map IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
+                    (unsigned long)candev->io_addr,
+                    (unsigned long)candev->io_addr + IO_RANGE - 1,
+                    (unsigned long)candev->dev_base_addr);
+               can_release_mem_region(candev->io_addr, IO_RANGE);
+               return -ENODEV;
+       } else {
+
+               DEBUGMSG("Mapped IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
+                        (unsigned long)candev->io_addr,
+                        (unsigned long)candev->io_addr + IO_RANGE - 1,
+                        (unsigned long)candev->dev_base_addr);
+
+       }
+
+       candev->chip[0]->chip_base_addr = candev->dev_base_addr;
+       candev->chip[0]->chipspecops->start_chip(candev->chip[0]);
+
+       return 0;
+}
+
+/**
+ * ns_dev_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function ns_dev_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ *
+ */
+int ns_dev_release_io(struct candevice_t *candev)
+{
+       u16 tempReg;
+       int i;
+
+       DEBUGMSG("(c%d)ns_dev_release_io (...)\n", candev->chip[0]->chip_idx);
+
+       /* Release I/O memory mapping */
+       iounmap((void *)candev->dev_base_addr);
+
+       /* Release the memory region */
+       can_release_mem_region(candev->io_addr, IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * ns_dev_reset - hardware reset routine
+ * @card: Number of the hardware card.
+ *
+ * The function ns_dev_reset() is used to give a hardware reset. This is
+ * rather hardware specific so I haven't included example code. Don't forget to
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ *
+ */
+int ns_dev_reset(struct candevice_t *candev)
+{
+       int i = 0;
+       int enableTest = 0;
+       int disableTest = 0;
+
+       struct canchip_t *pchip = candev->chip[0];
+
+       enableTest = pchip->chipspecops->enable_configuration(pchip);
+       disableTest = pchip->chipspecops->disable_configuration(pchip);
+
+       if (enableTest || disableTest) {
+               CANMSG("Enable or Disable status failed!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+
+       /* Check busoff status */
+       while ((c_can_read_reg_w(pchip, CCSR) & SR_BOFF) && (i <= 15)) {
+               udelay(2000);
+               i++;
+       }
+
+       if (i >= 15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       //pchip->config_irqs(pchip, CR_MIE | CR_SIE | CR_EIE);
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_C_CAN 1
+#define NR_MSGOBJ 32
+
+/**
+ * ns_dev_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function ns_dev_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ */
+int ns_dev_init_hw_data(struct candevice_t *candev)
+{
+       u32 sys_contVA = 0;
+
+       /* LUCAN : Magic numbers */
+       if (!(sys_contVA = (u32) ioremap(NS9750_PERIPHERAL_BASE_ADDRESS,
+                                        NS9750_PERIPHERAL_MAP_SIZE))) {
+               DEBUGMSG("Failed to map FPGA memory\n");
+               return -EIO;
+       } else {
+               DEBUGMSG("Writing to NS9750 sys cont\n");
+               writel((BUS_WIDTH_16BIT | ACTIVE_LOW_CHIP_SELECT),
+                      sys_contVA + NS9750_SYSTEM_CONTROLLER_OFFSET);
+       }
+
+       /* We have finished with this mapping */
+       iounmap((void *)sys_contVA);
+
+       candev->nr_82527_chips = 0;
+       candev->nr_sja1000_chips = 0;
+       candev->nr_all_chips = NR_C_CAN;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * ns_dev_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function ns_dev_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip.
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * File: src/template.c
+ */
+int ns_dev_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       /* Register chip operations */
+       c_can_fill_chipspecops(candev->chip[chipnr]);
+
+       /* override chip provided default value */
+       candev->chip[chipnr]->max_objects = MAX_MSGOBJS;
+       candev->chip[chipnr]->chip_base_addr = candev->io_addr;
+       candev->chip[chipnr]->clock = C_CAN_CLOCK_INPUT_FREQUENCY;
+
+       return 0;
+}
+
+/**
+ * ns_dev_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function ns_dev_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. 
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. 
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int ns_dev_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+       DEBUGMSG("(c%d)calling ns_dev_init_obj_data( ...)\n", chip->chip_idx);
+
+       /* It seems, that there is no purpose to setup object base address */
+       chip->msgobj[objnr]->obj_base_addr = 0;
+
+       /*can_msgobj_test_fl(pmsgobj,RX_MODE_EXT); */
+       return 0;
+}
+
+/**
+ * ns_dev_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function ns_dev_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void ns_dev_write_register(unsigned data, unsigned long address)
+{
+       int i;
+       //unsigned long usecs = 1;
+
+       writew(data, address);
+       //udelay( usecs );
+       for (i = 0; i < 5; i++) ;
+}
+
+/**
+ * ns_dev_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function ns_dev_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned ns_dev_read_register(unsigned long address)
+{
+       u16 value, i;
+
+       value = readw(address);
+       //udelay( usecs );
+       for (i = 0; i < 5; i++) ;
+       value = readw(address);
+       //udelay( usecs );
+       for (i = 0; i < 5; i++) ;
+
+       return value;
+}
+
+/**
+ * ns_dev_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function ns_dev_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int ns_dev_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+int ns_dev_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = ns_dev_request_io;
+       hwspecops->release_io = ns_dev_release_io;
+       hwspecops->reset = ns_dev_reset;
+       hwspecops->init_hw_data = ns_dev_init_hw_data;
+       hwspecops->init_chip_data = ns_dev_init_chip_data;
+       hwspecops->init_obj_data = ns_dev_init_obj_data;
+       hwspecops->write_register = ns_dev_write_register;
+       hwspecops->read_register = ns_dev_read_register;
+       hwspecops->program_irq = ns_dev_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/nsi.c b/lincan-0.3.3/src/nsi.c
new file mode 100644 (file)
index 0000000..ce9c591
--- /dev/null
@@ -0,0 +1,218 @@
+/* nsi.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/nsi.h"
+#include "../include/i82527.h"
+
+int nsican_irq=-1;
+unsigned long nsican_base=0x0;
+
+static CAN_DEFINE_SPINLOCK(nsican_port_lock);
+
+/* IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips.
+ */
+#define IO_RANGE 0x04
+
+/* The function template_request_io is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well.
+ * The reserved memory starts at candev->io_addr, wich is the module parameter io.
+ */
+int nsi_request_io(struct candevice_t *candev)
+{
+
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, 
+                        candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/* The function template_release_io is used to free the previously reserved 
+ * io-memory. In case you reserved more memory, don't forget to free it here.
+ */
+int nsi_release_io(struct candevice_t *candev)
+{
+
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/* The function template_reset is used to give a hardware reset. This is rather
+ * hardware specific so I haven't included example code. Don't forget to check
+ * the reset status of the chip before returning.
+ */
+int nsi_reset(struct candevice_t *candev)
+{
+    int i; 
+
+    DEBUGMSG("Resetting nsi hardware ...\n");
+    /* we don't use template_write_register because we don't use the two first
+       register of the card but the third in order to make a hard reset */
+    outb (1, nsican_base + candev->res_addr);
+    outb (0, nsican_base + candev->res_addr);
+    for (i = 1; i < 1000; i++)
+       udelay (1000);
+    
+    
+    /* Check hardware reset status */ 
+    i=0;
+    while ( (nsi_read_register(nsican_base+iCPU) & iCPU_RST) && (i<=15)) {
+       udelay(20000);
+       i++;
+    }
+    if (i>=15) {
+       CANMSG("Reset status timeout!\n");
+       CANMSG("Please check your hardware.\n");
+       return -ENODEV;
+    }
+    else
+       DEBUGMSG("Chip0 reset status ok.\n");
+
+    return 0;
+}
+
+/* The function template_init_hw_data is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * RESET_ADDR represents the io-address of the hardware reset register.
+ * NR_82527 represents the number of intel 82527 chips on the board.
+ * NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ */
+#define RESET_ADDR 0x02
+#define NR_82527 1
+#define NR_SJA1000 0
+
+int nsi_init_hw_data(struct candevice_t *candev) 
+     {
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=1;
+       candev->nr_sja1000_chips=0;
+        candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/* The function template_init_chip_data is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * CHIP_TYPE represents the type of CAN chip. CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the candev->io_addr
+ * argument supplied at module loading time.
+ * The clock argument holds the chip clock value in Hz.
+ */
+
+int nsi_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=
+           candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       nsican_irq=candev->chip[chipnr]->chip_irq;      
+        nsican_base=candev->chip[chipnr]->chip_base_addr;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+
+       return 0;
+}
+
+ /* The function template_init_obj_data is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ */
+int nsi_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+       chip->msgobj[objnr]->obj_base_addr=
+           chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/* The function template_program_irq is used for hardware that uses programmable
+ * interrupts. If your hardware doesn't use programmable interrupts you should
+ * not set the candevices_t->flags entry to CANDEV_PROGRAMMABLE_IRQ and leave this
+ * function unedited. Again this function is hardware specific so there's no
+ * example code.
+ */
+int nsi_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/* The function template_write_register is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ */
+void nsi_write_register(unsigned data, unsigned long address)
+{
+    /* address is an absolute address */
+
+    /* the nsi card has two registers, the address register at 0x0
+       and the data register at 0x01 */
+
+    /* write the relative address on the eight LSB bits 
+       and the data on the eight MSB bits in one time */
+    outw(address-nsican_base + (256 * data), nsican_base); 
+}
+
+/* The function template_read_register is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ */
+unsigned nsi_read_register(unsigned long address)
+{
+    /* this is the same thing that the function write_register.
+       We use the two register, we write the address where we 
+       want to read in a first time. In a second time we read the
+       data */
+       unsigned char ret;
+       can_spin_irqflags_t flags;
+    
+       can_spin_lock_irqsave(&nsican_port_lock,flags);
+       outb(address-nsican_base, nsican_base);
+       ret=inb(nsican_base+1);
+       can_spin_unlock_irqrestore(&nsican_port_lock,flags);
+       return ret;
+}
+
+
+ /* !!! Don't change this function !!! */
+int nsi_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = nsi_request_io;
+       hwspecops->release_io = nsi_release_io;
+       hwspecops->reset = nsi_reset;
+       hwspecops->init_hw_data = nsi_init_hw_data;
+       hwspecops->init_chip_data = nsi_init_chip_data;
+       hwspecops->init_obj_data = nsi_init_obj_data;
+       hwspecops->write_register = nsi_write_register;
+       hwspecops->read_register = nsi_read_register;
+       hwspecops->program_irq = nsi_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/nsi_canpci.c b/lincan-0.3.3/src/nsi_canpci.c
new file mode 100644 (file)
index 0000000..d77b951
--- /dev/null
@@ -0,0 +1,569 @@
+/* nsi.c
+ * Linux CAN-bus device driver.
+ * nsi_canpci.c - support for NSI CAN PCI card
+ * The card support added by Eric Pennamen <pennamen@gmail.com>
+ * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Ake Hedman, eurosource, akhe@eurosource.se ,
+ * and Pavel Pisa - OCERA team member email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/nsi_canpci.h"
+#include "../include/i82527.h"
+
+extern int stdmask;
+extern int extmask;
+extern int mo15mask;
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+       #define ioread32        readl
+       #define iowrite32       writel
+       #define ioread8         readb
+       #define iowrite8        writeb
+       #define wmb()
+       #define rmb()
+#else
+#endif
+
+
+
+#define INT_CONF 0x00000040 /* valeur de config du registre INTCSR du PLX */
+#define NSI_VENDOR_ID          0x1637
+#define NSI_CANPCI_DEVICE_ID   0x0001
+
+enum PORT2 { P2_0=1, P2_1=1<<1, P2_2=1<<2, P2_3=1<<3, P2_4=1<<4, P2_5=1<<5, P2_6=1<<6, P2_7=1<<7 };
+
+/* Definition de tous les registres du PLX */
+#define PLX_CNTRL      0x50    /* Regitre de control */
+#define PLX_INTCSR     0x4C    /* Registe pour les interruptions */
+
+/* Horloge en Hz du chip i82527 respecter le tableau suivant: */
+/*   =========================================
+ *   | XTAL | SCLK (DSC bit) | MCLK (DMC bit) |
+ *   |======|================|================|
+ *   | 4MHz |    4MHz (0)    |    4MHz (0)    |    NE PAS OUBLIER DE POSITIONNER LES BITS DSC et DMC EN FONTION
+ *   | 8MHz |    8MHz (0)    |    8MHz (0)    |
+ *   |10MHz |   10MHz (0)    |    5MHz (1)    |
+ *   |12MHz |    6MHZ (1)    |    6MHZ (0)    |
+ *   |16MHz |    8MHz (1)    |    8MHz (0)    |
+ *   ==========================================  */
+#define iCLOCK         16000000
+
+static CAN_DEFINE_SPINLOCK(nsicanpci_port_lock);
+
+/* Il faut reserver 4 zones:
+ *             BAR0: 128 octets memoire (32bits) pour les registres du PLX9052
+ *             BAR1: 128 octets I/O pour les registres du PLX9052
+ *             BAR2: 256 octets memoire(8bits) pour les registres du PLX9052
+ *             BAR3: 256 octets memoire(8bits) pour les registres du PLX9052
+ */
+/* Variables globales contenant les @ des IO-Memory apres remap */
+#define NB_VALID_BAR   4
+void* addr_BAR_remap[NB_VALID_BAR]={0,0,0,0};
+
+void nsi_canpci_connect_irq(struct candevice_t *candev)
+{
+       /* Preparation du registre pour configurer les INT locales 1 et 2 du PLX, INT actif à l'etat Haut */
+//     iowrite32(INT_CONF,(void*)(candev->dev_base_addr+PLX_INTCSR));
+//     wmb();
+//     DEBUGMSG("Interruptions du PLX configurees !!\n");
+
+}
+void nsi_canpci_disconnect_irq(struct candevice_t *candev)
+{
+// Il faut aussi desactiver les interruption du PLX, sous peine de freeze au prochain init_module
+// tout en laissant le bit isa mis a 1
+       iowrite32(0x0,(void*)(candev->dev_base_addr+PLX_INTCSR));
+       wmb();
+       DEBUGMSG("disable interruption du PLX\n");
+}
+
+int nsi_canpci_config_irqs(struct canchip_t *chip, short irqs)
+{
+       
+       unsigned long it_mask,it_reg;
+       struct candevice_t *candev;
+       it_mask=0;
+       DEBUGMSG("NSI Interrupt configuration\n");
+       can_write_reg(chip,irqs,iCTL);
+       if( (irqs&0x0E)!=0)
+       {//At least one interrupt source requested
+               if(chip->chip_idx==0)
+               {
+                       DEBUGMSG("starting interrupt on chip 0\n");
+                       it_mask=1;
+               }
+               else
+               {
+                       DEBUGMSG("starting interrupt on chip 1\n");
+                       it_mask=8;
+               }
+               candev=(struct candevice_t *)chip->chip_data;
+               it_reg = ioread32( (void*)(candev->dev_base_addr+PLX_INTCSR));
+               rmb();
+               it_reg|=it_mask|0x40;
+               iowrite32(it_reg,(void*)(candev->dev_base_addr+PLX_INTCSR));
+               wmb();          
+       }
+       else
+       {//No more interrupt source
+               if(chip->chip_idx==0)
+               {
+                       DEBUGMSG("stoping interrupt on chip 0\n");
+                       it_mask=1;
+               }
+               else
+               {
+                       DEBUGMSG("stoping interrupt on chip 1\n");
+                       it_mask=8;
+               }
+               candev=(struct candevice_t *)chip->chip_data;
+               it_reg = ioread32( (void*)(candev->dev_base_addr+PLX_INTCSR));
+               rmb();
+               it_reg&=~it_mask;
+               iowrite32(it_reg,(void*)(candev->dev_base_addr+PLX_INTCSR));
+               wmb();                  
+       }
+       return 0;
+}
+
+int nsi_canpci_i82527_chip_config(struct canchip_t *chip)
+{
+       //Normale fonction
+       can_write_reg(chip,chip->int_cpu_reg,iCPU); // Configure cpu interface
+       can_write_reg(chip,(iCTL_CCE|iCTL_INI),iCTL); // Enable configuration
+       i82527_seg_write_reg(chip,chip->int_clk_reg,iCLK); // Set clock out slew rates 
+       i82527_seg_write_reg(chip,chip->int_bus_reg,iBUS); /* Bus configuration */
+       
+       can_write_reg(chip,P2_2|P2_1,iP2C); // Configure P2_2,P2_1 en sortie
+       can_write_reg(chip,P2_2|P2_1,iP2O); // Positionne P2_2 a 1
+       
+       can_write_reg(chip,0x00,iSTAT); /* Clear error status register */
+
+       /* Check if we can at least read back some arbitrary data from the 
+        * card. If we can not, the card is not properly configured!
+        */
+       canobj_write_reg(chip,chip->msgobj[1],0x25,iMSGDAT1);
+       canobj_write_reg(chip,chip->msgobj[2],0x52,iMSGDAT3);
+       canobj_write_reg(chip,chip->msgobj[10],0xc3,iMSGDAT6);
+       if ( (canobj_read_reg(chip,chip->msgobj[1],iMSGDAT1) != 0x25) ||
+             (canobj_read_reg(chip,chip->msgobj[2],iMSGDAT3) != 0x52) ||
+             (canobj_read_reg(chip,chip->msgobj[10],iMSGDAT6) != 0xc3) ) {
+               CANMSG("Could not read back from the hardware.\n");
+               CANMSG("This probably means that your hardware is not correctly configured!\n");
+               return -1;
+       }
+       else
+               DEBUGMSG("Could read back, hardware is probably configured correctly\n");
+
+       if (chip->baudrate == 0)
+               chip->baudrate=1600000;
+
+       if (i82527_baud_rate(chip,chip->baudrate,chip->clock,0,75,0)) {
+               CANMSG("Error configuring baud rate\n");
+               return -ENODEV;
+       }
+       if (i82527_standard_mask(chip,0x0000,stdmask)) {
+               CANMSG("Error configuring standard mask\n");
+               return -ENODEV;
+       }
+       if (i82527_extended_mask(chip,0x00000000,extmask)) {
+               CANMSG("Error configuring extended mask\n");
+               return -ENODEV;
+       }
+       if (i82527_message15_mask(chip,0x00000000,mo15mask)) {
+               CANMSG("Error configuring message 15 mask\n");
+               return -ENODEV;
+       }
+       if (i82527_clear_objects(chip)) {
+               CANMSG("Error clearing message objects\n");
+               return -ENODEV;
+       }
+       
+       if (nsi_canpci_config_irqs(chip,iCTL_IE|iCTL_EIE)) { /* has been 0x0a */
+               CANMSG("Error configuring interrupts\n");
+               return -ENODEV;
+       }       
+       return 0;
+}
+
+
+int nsi_canpci_start_chip(struct canchip_t *chip)
+{
+       unsigned long it_mask,it_reg;
+       struct candevice_t *candev;
+       it_mask=0;
+       if(chip->chip_idx==0)
+       {
+               DEBUGMSG("starting chip 0\n");
+               it_mask=1;
+       }
+       else
+       {
+               DEBUGMSG("starting chip 1\n");
+               it_mask=8;
+       }
+       candev=(struct candevice_t *)chip->chip_data;
+       it_reg = ioread32( (void*)(candev->dev_base_addr+PLX_INTCSR));
+       rmb();
+       it_reg|=it_mask|0x40;
+       iowrite32(it_reg,(void*)(candev->dev_base_addr+PLX_INTCSR));
+       wmb();  
+       i82527_start_chip(chip);
+       return 0;
+}
+
+int nsi_canpci_stop_chip(struct canchip_t *chip)
+{
+       unsigned long it_mask,it_reg;
+       struct candevice_t *candev;
+       it_mask=0;
+       if(chip->chip_idx==0)
+       {
+               DEBUGMSG("stoping chip 0\n");
+               it_mask=1;
+       }
+       else
+       {
+               DEBUGMSG("stoping chip 1\n");
+               it_mask=8;
+       }
+       candev=(struct candevice_t *)chip->chip_data;
+       it_reg = ioread32( (void*)(candev->dev_base_addr+PLX_INTCSR));
+       rmb();
+       it_reg&=~it_mask;
+       iowrite32(it_reg,(void*)(candev->dev_base_addr+PLX_INTCSR));
+       wmb();  
+       i82527_stop_chip(chip);
+       return 0;
+}
+
+int nsi_canpci_irq_handler(int irq, struct canchip_t *chip)
+{
+       int retcode;
+       unsigned long it_reg;
+       struct candevice_t *candev;
+       candev=(struct candevice_t *)chip->chip_data;
+       retcode = CANCHIP_IRQ_NONE;
+       it_reg = ioread32( (void*)(candev->dev_base_addr+PLX_INTCSR));
+       rmb();
+       if(chip->chip_idx==0)
+       {
+               if((it_reg &0x4)!=0) //interrupt active
+               {
+                       if(i82527_irq_handler(irq,chip)==CANCHIP_IRQ_NONE)
+                       {//soucis avec les IT
+                               it_reg&=~(0x01);
+                               CANMSG("IT du canal0 annulee pour cause de dysonctionnement\n");
+
+                       }else
+                       {
+                               retcode=CANCHIP_IRQ_HANDLED;
+                       }
+               
+               }
+       }
+       else
+       {
+               if((it_reg &0x20)!=0) //interrupt active
+               {
+                       if(i82527_irq_handler(irq,chip)==CANCHIP_IRQ_NONE)
+                       {//soucis avec les IT
+                               it_reg&=~(0x08);
+                               CANMSG("IT du canal1 annulee pour cause de dysonctionnement\n");
+                       }else
+                       {
+                               retcode=CANCHIP_IRQ_HANDLED;
+                       }       
+               }
+       }
+       return retcode;
+}
+
+/* The function template_request_io is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well.
+ * The reserved memory starts at candev->io_addr, wich is the module parameter io.
+ */
+int nsi_canpci_request_io(struct candevice_t *candev)
+{
+  (void)candev;
+  if(addr_BAR_remap[0]==NULL)
+       return -EIO;  
+  return 0;
+}
+
+/* The function template_release_io is used to free the previously reserved 
+ * io-memory. In case you reserved more memory, don't forget to free it here.
+ */
+int nsi_canpci_release_io(struct candevice_t *candev)
+{
+       unsigned long reg_reset;
+       struct pci_dev *pcidev = candev->sysdevptr.pcidev;
+       DEBUGMSG("Liberation des io de la carte \n");
+       
+       nsi_canpci_disconnect_irq(candev);
+       // Recherche du registre de controle du PLX parmi les IO-port du PLX */
+       reg_reset = ioread32( (void*)(candev->dev_base_addr+PLX_CNTRL));
+       reg_reset&=(~(0x40000000));
+       rmb();
+       iowrite32( (reg_reset | 0x40000000 ),(void*)(candev->dev_base_addr+PLX_CNTRL)); /* Mise à '1' du bit reset */
+       wmb();
+       udelay(2500); /* Reset supérieur a 1ms car necessaire aux i82527 */
+       iowrite32( (reg_reset ),(void*)(candev->dev_base_addr+PLX_CNTRL)); /* Mise à '0' du bit reset */
+       wmb();
+       udelay(2500); /* Reset supérieur a 1ms car necessaire aux i82527 */
+       iounmap(addr_BAR_remap[0]);
+       iounmap(addr_BAR_remap[1]);
+       iounmap(addr_BAR_remap[2]);
+       iounmap(addr_BAR_remap[3]);
+  
+       pci_release_region(pcidev,0);
+       pci_release_region(pcidev,1);
+       pci_release_region(pcidev,2);                   
+       pci_release_region(pcidev,3);                   
+       return 0;
+}
+
+/* The function template_reset is used to give a hardware reset. This is rather
+ * hardware specific so I haven't included example code. Don't forget to check
+ * the reset status of the chip before returning.
+ */
+int nsi_canpci_reset(struct candevice_t *candev)
+{
+       unsigned long reg_reset;
+       
+       DEBUGMSG("Reset de la carte !!!\n");
+       /* Il faut aussi desactiver les interruption du PLX, sous peine de freeze au prochain init_module */    
+       nsi_canpci_disconnect_irq(candev);
+       // Recherche du registre de controle du PLX parmi les IO-port du PLX */
+       reg_reset = ioread32( (void*)(candev->dev_base_addr+PLX_CNTRL));
+       reg_reset&=(~(0x40000000));
+       iowrite32( (reg_reset | 0x40000000 ),(void*)(candev->dev_base_addr+PLX_CNTRL)); /* Mise à '1' du bit reset */
+       wmb();
+       udelay(2500); /* Reset supérieur a 1ms car necessaire aux i82527 */
+       iowrite32(reg_reset,(void*)(candev->dev_base_addr+PLX_CNTRL)); /* Mise à '0' du bit reset */
+       wmb();
+       udelay(2500); /* Attente, pour laisser les composants s'initialiser */  
+       DEBUGMSG("Reset termine !!!\n");
+       
+       nsi_canpci_connect_irq(candev);
+       return 0;       
+}
+
+/* The function template_init_hw_data is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * RESET_ADDR represents the io-address of the hardware reset register.
+ * NR_82527 represents the number of intel 82527 chips on the board.
+ * NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ */
+
+int nsi_canpci_init_hw_data(struct candevice_t *candev) 
+     {
+  struct pci_dev *pcidev = NULL;
+
+  /* recherche de la carte NSI CANPCI sur le bus */
+  do
+  {
+    pcidev = pci_find_device(NSI_VENDOR_ID, NSI_CANPCI_DEVICE_ID, pcidev);
+  }
+  while(can_check_dev_taken(pcidev));
+  
+  if(pcidev == NULL) 
+  {
+       do
+       {
+       pcidev = pci_find_device(NSI_VENDOR_ID, NSI_CANPCI_DEVICE_ID+1, pcidev);
+       }
+       while(can_check_dev_taken(pcidev));
+       if(pcidev == NULL) 
+       {
+               CANMSG ("Error : NSI CAN PCI device not found\n");
+               return -ENODEV;
+       }
+       else
+       {
+               CANMSG ("NSI CANPCI OPTO device found\n");
+       }
+  }
+  else
+  {
+       CANMSG ("NSI CANPCI device found\n");  
+  }
+    
+  /* enable it */
+  if (pci_enable_device (pcidev))
+  {
+    CANMSG ("Cannot enable PCI device\n");
+    return -EIO;
+  }
+  CANMSG ("NSI CANPCI device started\n");
+  candev->sysdevptr.pcidev = pcidev;
+  candev->res_addr=0;
+  candev->nr_82527_chips=2;
+  candev->nr_sja1000_chips=0;
+  candev->nr_all_chips=2; 
+  /* initialize device spinlock */
+  can_spin_lock_init(&candev->device_lock);
+
+  if(pci_request_region(pcidev,0,"nsi_canpci bar0")==0)
+  {
+       if(pci_request_region(pcidev,1,"nsi_canpci bar1")==0)
+       {
+               if(pci_request_region(pcidev,2,"nsi_canpci bar2")==0)
+               {
+                       if(pci_request_region(pcidev,3,"nsi_canpci bar3")==0)
+                       {
+                       }
+                       else
+                       {
+                       pci_release_region(pcidev,0);
+                       pci_release_region(pcidev,1);
+                       pci_release_region(pcidev,2);                   
+                       return -EIO;
+                       }
+               }
+               else
+               {
+               pci_release_region(pcidev,0);
+               pci_release_region(pcidev,1);
+               return -EIO;
+               }
+       }
+       else
+       {
+       pci_release_region(pcidev,0);
+       return -EIO;
+       }
+  }  
+  else
+  {
+       return -EIO;
+  }
+  
+  addr_BAR_remap[0]=ioremap(pci_resource_start(pcidev,0),pci_resource_len(pcidev,0) );
+  addr_BAR_remap[1]=ioremap(pci_resource_start(pcidev,1),pci_resource_len(pcidev,1) );
+  addr_BAR_remap[2]=ioremap(pci_resource_start(pcidev,2),pci_resource_len(pcidev,2) );
+  addr_BAR_remap[3]=ioremap(pci_resource_start(pcidev,3),pci_resource_len(pcidev,3) );
+  
+  candev->dev_base_addr=(unsigned long)(addr_BAR_remap[0]);  
+  return 0;  
+}
+
+/* The function template_init_chip_data is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * CHIP_TYPE represents the type of CAN chip. CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the candev->io_addr
+ * argument supplied at module loading time.
+ * The clock argument holds the chip clock value in Hz.
+ */
+
+int nsi_canpci_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       //u8 irq_line;
+       CANMSG ("NSI chip data init %d\n",chipnr);
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       
+       candev->chip[chipnr]->chipspecops->chip_config =nsi_canpci_i82527_chip_config;
+       candev->chip[chipnr]->chipspecops->start_chip=nsi_canpci_start_chip;
+       candev->chip[chipnr]->chipspecops->stop_chip=nsi_canpci_stop_chip;
+       candev->chip[chipnr]->chipspecops->config_irqs=nsi_canpci_config_irqs;
+       candev->chip[chipnr]->chipspecops->irq_handler=nsi_canpci_irq_handler;
+       candev->chip[chipnr]->chip_data =candev;
+       
+       candev->chip[chipnr]->chip_base_addr= (unsigned long)addr_BAR_remap[chipnr+2];
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
+       candev->chip[chipnr]->flags=CHIP_IRQ_PCI;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC+iCPU_CEN;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1+iCLK_CD0;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+       return 0;
+}
+
+ /* The function template_init_obj_data is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ */
+int nsi_canpci_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+       
+       chip->msgobj[objnr]->obj_base_addr=
+           chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/* The function template_program_irq is used for hardware that uses programmable
+ * interrupts. If your hardware doesn't use programmable interrupts you should
+ * not set the candevices_t->flags entry to CANDEV_PROGRAMMABLE_IRQ and leave this
+ * function unedited. Again this function is hardware specific so there's no
+ * example code.
+ */
+int nsi_canpci_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/* The function template_write_register is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ */
+void nsi_canpci_write_register(unsigned data, unsigned long address)
+{
+       iowrite8((u8)data,(void*)address);
+       wmb(); /* Assure que la donnee a ete ecrite */
+}
+
+/* The function template_read_register is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ */
+unsigned nsi_canpci_read_register(unsigned long address)
+{
+    /* this is the same thing that the function write_register.
+       We use the two register, we write the address where we 
+       want to read in a first time. In a second time we read the
+       data */
+       unsigned char ret;
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&nsicanpci_port_lock,flags);
+       rmb();
+       ret=ioread8((void*)address);
+       can_spin_unlock_irqrestore(&nsicanpci_port_lock,flags);
+       return ret;     
+}
+
+
+ /* !!! Don't change this function !!! */
+int nsi_canpci_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = nsi_canpci_request_io;
+       hwspecops->release_io = nsi_canpci_release_io;
+       hwspecops->reset = nsi_canpci_reset;
+       hwspecops->init_hw_data = nsi_canpci_init_hw_data;
+       hwspecops->init_chip_data = nsi_canpci_init_chip_data;
+       hwspecops->init_obj_data = nsi_canpci_init_obj_data;
+       hwspecops->write_register = nsi_canpci_write_register;
+       hwspecops->read_register = nsi_canpci_read_register;
+       hwspecops->program_irq = nsi_canpci_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/open.c b/lincan-0.3.3/src/open.c
new file mode 100644 (file)
index 0000000..45406fc
--- /dev/null
@@ -0,0 +1,98 @@
+/* open.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/open.h"
+#include "../include/setup.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+int can_open(struct inode *inode, struct file *file)
+{
+       struct msgobj_t *obj;
+       struct canchip_t *chip;
+       struct canuser_t *canuser;
+       struct canque_ends_t *qends;
+       struct canque_edge_t *edge;
+       can_spin_irqflags_t iflags;
+
+       if ( ((obj=objects_p[MINOR_NR]) == NULL) || 
+                       ((chip=objects_p[MINOR_NR]->hostchip) == NULL) ) {
+               CANMSG("There is no hardware support for the device file with minor nr.: %d\n",MINOR_NR);
+               return -ENODEV;
+       }
+
+       atomic_inc(&obj->obj_used);
+       DEBUGMSG("Device %d opened %d times.\n", MINOR_NR, atomic_read(&obj->obj_used));
+       can_msgobj_set_fl(obj,OPENED);
+
+       if (chip->flags & CHIP_CONFIGURED) 
+               DEBUGMSG("Device is already configured.\n");
+       else {
+               if (chip->chipspecops->chip_config(chip))
+                       CANMSG("Error configuring chip.\n");
+               else
+                       chip->flags |= CHIP_CONFIGURED; 
+
+               if (chip->chipspecops->pre_read_config(chip,obj)<0)
+                       CANMSG("Error initializing chip for receiving\n");
+
+       } /* End of chip configuration */
+
+       canuser = (struct canuser_t *)kmalloc(sizeof(struct canuser_t), GFP_KERNEL);
+       if(canuser == NULL) goto no_canuser;
+       canuser->flags=0;
+       canuser->userinfo.fileinfo.file = file;
+       canuser->msgobj = obj;
+       canuser->magic = CAN_USER_MAGIC;
+       file->private_data = canuser;
+
+       qends = (struct canque_ends_t *)kmalloc(sizeof(struct canque_ends_t), GFP_KERNEL);
+       if(qends == NULL) goto no_qends;
+       canqueue_ends_init_kern(qends);
+       canuser->qends = qends;
+       
+       /*required to synchronize with RT-Linux context*/
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       list_add(&canuser->peers, &obj->obj_users);
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+
+       if(canqueue_connect_edge(edge=canque_new_edge_kern(MAX_BUF_LENGTH),
+               canuser->qends, obj->qends)<0) goto no_tx_qedge;
+
+       if(canqueue_connect_edge(canuser->rx_edge0=canque_new_edge_kern(MAX_BUF_LENGTH),
+               obj->qends, canuser->qends)<0) goto no_rx_qedge;
+       /*FIXME: more generic model should be used there*/
+       canque_edge_decref(canuser->rx_edge0);
+       canque_edge_decref(edge);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50))
+       MOD_INC_USE_COUNT;
+#endif 
+
+       return 0;
+       
+    no_rx_qedge:
+       canque_notify_bothends(edge, CANQUEUE_NOTIFY_DEAD_WANTED);
+       canque_edge_decref(edge);
+    no_tx_qedge:
+       list_del(&canuser->peers);
+       canuser->qends = NULL;
+       canqueue_ends_dispose_kern(qends, 1);
+
+    no_qends:
+       kfree(canuser);
+
+    no_canuser:
+       atomic_dec(&obj->obj_used);
+       return -ENOMEM;
+}
diff --git a/lincan-0.3.3/src/open_rtl.c b/lincan-0.3.3/src/open_rtl.c
new file mode 100644 (file)
index 0000000..66a5bac
--- /dev/null
@@ -0,0 +1,138 @@
+/* open.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <rtl_malloc.h>
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+
+static inline
+int can_open_rtl_common(struct canuser_t *canuser, int open_flags)
+{
+       struct msgobj_t *obj=canuser->msgobj;
+       struct canchip_t *chip;
+       struct canque_ends_t *qends;
+       struct canque_edge_t *edge;
+       can_spin_irqflags_t iflags;
+
+       if(!obj) return -ENODEV;
+       
+       can_msgobj_set_fl(obj,OPENED);
+       
+       chip=obj->hostchip;
+       if (chip) {
+               if (!(chip->flags & CHIP_CONFIGURED)) {
+                       if (chip->chipspecops->chip_config(chip))
+                               CANMSG("Error configuring chip.\n");
+                       else
+                               chip->flags |= CHIP_CONFIGURED; 
+
+                       if (chip->chipspecops->pre_read_config(chip,obj)<0)
+                               CANMSG("Error initializing chip for receiving\n");
+
+               }
+       } /* End of chip configuration */
+
+
+       qends = (struct canque_ends_t *)rt_malloc(sizeof(struct canque_ends_t));
+       if(qends == NULL) goto no_qends;
+       canqueue_ends_init_rtl(qends);
+       /* mark memory as allocated from RTL memory pool */
+       qends->ends_flags|=CAN_ENDSF_MEM_RTL;
+       canuser->qends = qends;
+       
+       can_spin_lock_irqsave(&canuser_manipulation_lock, iflags);
+       list_add(&canuser->peers, &obj->obj_users);
+       can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
+
+       if(canqueue_connect_edge(edge=canque_new_edge_rtl(MAX_BUF_LENGTH),
+               canuser->qends, obj->qends)<0) goto no_tx_qedge;
+
+       if(canqueue_connect_edge(canuser->rx_edge0=canque_new_edge_rtl(MAX_BUF_LENGTH),
+               obj->qends, canuser->qends)<0) goto no_rx_qedge;
+       /*FIXME: more generic model should be used there*/
+       canque_edge_decref(canuser->rx_edge0);
+       canque_edge_decref(edge);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50))
+       MOD_INC_USE_COUNT;      /*is this enough for RT-Linux context ?*/
+#endif 
+
+       return 0;
+       
+    no_rx_qedge:
+       canque_notify_bothends(edge, CANQUEUE_NOTIFY_DEAD_WANTED);
+       canque_edge_decref(edge);
+    no_tx_qedge:
+       list_del(&canuser->peers);
+       canuser->qends = NULL;
+       canqueue_ends_dispose_kern(qends, 1);
+
+    no_qends:
+
+       return -ENOMEM;
+}
+
+
+int can_open_rtl_posix(struct rtl_file *fptr)
+{
+       int ret;
+       struct msgobj_t *obj;
+       struct canchip_t *chip;
+       struct canuser_t *canuser;
+       int minor_nr = RTL_MINOR_FROM_FILEPTR(fptr);
+       
+       if(minor_nr>=MAX_TOT_MSGOBJS)
+               return -ENODEV;
+
+       if ( ((obj=objects_p[minor_nr]) == NULL) || 
+                       ((chip=objects_p[minor_nr]->hostchip) == NULL) ) {
+               CANMSG("There is no hardware support for the device file with minor nr.: %d\n",minor_nr);
+               return -ENODEV;
+       }
+
+       atomic_inc(&obj->obj_used);
+       DEBUGMSG("Device %d opened %d times.\n", minor_nr, atomic_read(&obj->obj_used));
+
+       canuser = (struct canuser_t *)rt_malloc(sizeof(struct canuser_t));
+       if(canuser == NULL){
+               ret=-ENOMEM;
+               goto no_canuser;
+       }
+       canuser->flags=CANUSER_RTL_CLIENT | CANUSER_RTL_MEM;
+       canuser->userinfo.rtlinfo.file = fptr;
+       canuser->msgobj = obj;
+       canuser->magic = CAN_USER_MAGIC;
+
+       /*next line would solve many problems, but RT-Linux lacks this fundamental field */
+       /*fptr->private_data = canuser;*/
+       /*to test code I am adding this terible hack*/
+       can_set_rtl_file_private_data(fptr,canuser);
+
+       ret=can_open_rtl_common(canuser, fptr->f_flags);
+       if(ret>=0) return ret;
+
+       rt_free(canuser);
+
+    no_canuser:
+       atomic_dec(&obj->obj_used);
+       
+       return ret;
+}
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/src/oscar.c b/lincan-0.3.3/src/oscar.c
new file mode 100644 (file)
index 0000000..798e6ea
--- /dev/null
@@ -0,0 +1,136 @@
+/* oscar.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+
+ NOTE: Please see the template.c file for the comments relating to this code.
+       Herein is the modified copy of the functions
+
+ */ 
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/oscar.h"
+#include "../include/sja1000p.h"
+
+#define IO_RANGE 0x80 // allow both basic CAN and PeliCAN modes for sja1000
+
+int oscar_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+int oscar_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+int oscar_reset(struct candevice_t *candev)
+{
+       int i;
+       struct canchip_t *chip=candev->chip[0];
+       unsigned cdr;
+
+       oscar_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+       udelay(1000);
+
+       cdr=oscar_read_register(chip->chip_base_addr+SJACDR);
+       oscar_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       oscar_write_register(0, chip->chip_base_addr+SJAIER);
+
+       i=20;
+       oscar_write_register(0, chip->chip_base_addr+SJAMOD);
+       while (oscar_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+               if(!i--) return -ENODEV;
+               udelay(1000);
+               oscar_write_register(0, chip->chip_base_addr+SJAMOD);
+       }
+
+       cdr=oscar_read_register(chip->chip_base_addr+SJACDR);
+       oscar_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       oscar_write_register(0, chip->chip_base_addr+SJAIER);
+
+       return 0;
+}
+
+int oscar_init_hw_data(struct candevice_t *candev) 
+{
+    candev->res_addr = 0x0; // RESET address?
+    candev->nr_82527_chips = 0;
+    candev->nr_sja1000_chips = 1; // We've got a SJA1000 variant
+    candev->nr_all_chips= 1;
+    candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+    return 0;
+}
+
+int oscar_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+    // i82527_fill_chipspecops(candev->chip[chipnr]);
+    // sja1000_fill_chipspecops(candev->chip[chipnr]);
+    sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       
+    candev->chip[chipnr]->chip_base_addr = candev->io_addr;
+    candev->chip[chipnr]->clock = 12000000;
+    candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP;  // we use an external tranceiver
+    candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+    // these three int_ registers are unused (we don't have this chip)
+    candev->chip[chipnr]->int_cpu_reg = 0;
+    candev->chip[chipnr]->int_clk_reg = 0;
+    candev->chip[chipnr]->int_bus_reg = 0;
+    
+    return 0;
+}
+
+int oscar_init_obj_data(struct canchip_t *chip, int objnr)
+{
+    chip->msgobj[objnr]->obj_base_addr = chip->chip_base_addr;
+    
+    return 0;
+}
+
+int oscar_program_irq(struct candevice_t *candev)
+{
+    // CAN_IRQ_L (active low) interrupt: PF2 / INT2 on our LH7A400 SoC
+    // This IRQ is set up already by the kernel.    
+
+    return 0;
+}
+
+void oscar_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address);
+}
+
+unsigned oscar_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+/* !!! Don't change this function !!! */
+int oscar_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = oscar_request_io;
+       hwspecops->release_io = oscar_release_io;
+       hwspecops->reset = oscar_reset;
+       hwspecops->init_hw_data = oscar_init_hw_data;
+       hwspecops->init_chip_data = oscar_init_chip_data;
+       hwspecops->init_obj_data = oscar_init_obj_data;
+       hwspecops->write_register = oscar_write_register;
+       hwspecops->read_register = oscar_read_register;
+       hwspecops->program_irq = oscar_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pc_i03.c b/lincan-0.3.3/src/pc_i03.c
new file mode 100644 (file)
index 0000000..c724068
--- /dev/null
@@ -0,0 +1,285 @@
+/* pc-i03.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wnadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pc-i03.h"
+#include "../include/sja1000.h"
+
+/* Basic hardware io address. This is also stored in the hardware structure but
+ * we need it global, else we have to change many internal functions.
+ * pc-i03_base_addr is initialized in pc-i03_init_chip_data().
+ */
+unsigned int pci03_base_addr; 
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x200 // The pc-i03 uses an additional 0x100 bytes reset space
+
+/**
+ * pci03_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function pci03_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pc-i03.c
+ */
+int pci03_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * pci03_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function pci03_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/pc-i03.c
+ */
+int pci03_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * pci03_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pci03_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pc-i03.c
+ */
+int pci03_reset(struct candevice_t *candev)
+{
+       int i=0;
+
+       DEBUGMSG("Resetting pc-i03 hardware ...\n");
+       pci03_write_register(0x01,pci03_base_addr +
+                               0x100); // Write arbitrary data to reset mem
+       udelay(20000);
+
+       pci03_write_register(0x00, pci03_base_addr + SJACR);
+                                                                       
+       /* Check hardware reset status */
+       i=0;
+       while ( (pci03_read_register(pci03_base_addr + SJACR) & sjaCR_RR)
+                                                                && (i<=15) ) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip[0] reset status ok.\n");
+
+       return 0;
+}
+
+#define RESET_ADDR 0x100
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * pci03_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pci03_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/pc-i03.c
+ */
+int pci03_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=NR_82527;
+        candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       return 0;
+}
+
+/**
+ * pci03_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function pci03_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/pc-i03.c
+ */
+int pci03_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       sja1000_fill_chipspecops(candev->chip[chipnr]);
+       pci03_base_addr = candev->io_addr;
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | 
+                                                       sjaOCR_TX0_HL | sjaOCR_TX1_LZ;
+
+       return 0;
+}
+
+/**
+ * pci03_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function pci03_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/pc-i03.c
+ */
+int pci03_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       
+       return 0;
+}
+
+/**
+ * pci03_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pci03_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pc-i03.c
+ */
+int pci03_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * pci03_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function pci03_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/pc-i03.c
+ */
+void pci03_write_register(unsigned data, unsigned long address)
+{
+       unsigned int *pci03_base_ptr;
+       unsigned short address_to_write;
+
+       /* The read/write functions are called by an extra abstract function.
+        * This extra function adds the basic io address of the card to the
+        * memory address we want to write to, so we substract the basic io
+        * address again to obtain the offset into the hardware's memory map.
+        */
+       address_to_write = address - pci03_base_addr; // Offset
+       pci03_base_ptr = (unsigned int *)(pci03_base_addr * 0x100001);
+       (*(pci03_base_ptr+address_to_write)) = data;
+}
+
+/**
+ * pci03_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function pci03_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/pc-i03.c
+ */
+unsigned pci03_read_register(unsigned long address)
+{
+       unsigned int *pci03_base_ptr;
+       unsigned short address_to_read;
+
+       /* The read/write functions are called by an extra abstract function.
+        * This extra function adds the basic io address of the card to the
+        * memory address we want to write to, so we substract the basic io
+        * address again to obtain the offset into the hardware's memory map.
+        */
+       address_to_read = address - pci03_base_addr;
+       pci03_base_ptr = (unsigned int *)(pci03_base_addr * 0x100001);
+       return (*(pci03_base_ptr+address_to_read));
+}
+
+int pci03_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pci03_request_io;
+       hwspecops->release_io = pci03_release_io;
+       hwspecops->reset = pci03_reset;
+       hwspecops->init_hw_data = pci03_init_hw_data;
+       hwspecops->init_chip_data = pci03_init_chip_data;
+       hwspecops->init_obj_data = pci03_init_obj_data;
+       hwspecops->write_register = pci03_write_register;
+       hwspecops->read_register = pci03_read_register;
+       hwspecops->program_irq = pci03_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pcan_dongle.c b/lincan-0.3.3/src/pcan_dongle.c
new file mode 100644 (file)
index 0000000..ce94186
--- /dev/null
@@ -0,0 +1,732 @@
+/****************************************************************************/
+// Ingenieria Almudi (www.almudi.com)
+// Ported to LinCAN by Jose Pascual Ramírez (josepascual@almudi.com)
+// 
+//
+// Copyright (C) 2001,2002,2003,2004  PEAK System-Technik GmbH
+//
+// linux@peak-system.com
+// www.peak-system.com
+//
+// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// Maintainer(s): Klaus Hitschler (klaus.hitschler@gmx.de)
+//
+// Contributions: Marcel Offermans (marcel.offermans@luminis.nl)
+//                Philipp Baer (philipp.baer@informatik.uni-ulm.de)
+/****************************************************************************/
+
+/****************************************************************************/
+//
+// all parts to handle the interface specific parts of pcan-dongle
+//
+// Revision 1.38  2004/07/28 22:03:29  jose pascual
+// ported to LinCAN
+//
+// Revision 1.37  2004/04/11 22:03:29  klaus
+// cosmetic changes
+//
+// Revision 1.36  2004/04/10 12:25:39  klaus
+// merge polished between HEAD and kernel-2.6 branch
+//
+// Revision 1.35  2004/04/10 08:57:26  klaus
+// merge finished between HEAD and kernel-2.6 branch
+//
+// Revision 1.32.2.1  2004/03/21 12:09:09  klaus
+// first commit for branch to kernel 2.6 code
+//
+// Revision 1.34  2004/03/27 16:57:06  klaus
+// modified for use with kernels <= 2.2.14
+//
+// Revision 1.33  2004/03/27 15:10:54  klaus
+// prepared for use with gcc 3.x, modified for use with kernels < 2.2.4
+//
+// Revision 1.32  2004/03/04 18:50:08  klaus
+// renamed PA,PB,PC to _PA_, ... to support (partially) cross-compiling for MIPS
+//
+// Revision 1.31  2003/06/22 15:34:50  klaus
+// added parts to support devfs provided by Philipp Baer (partially untested)
+//
+// Revision 1.30  2003/06/04 19:26:15  klaus
+// adapted to kernel 2.5.69 using GCC 3.2.3 (marcel), released release_20030604_x
+//
+// Revision 1.28  2003/03/02 10:58:07  klaus
+// merged USB thread into main path
+//
+// Revision 1.27  2003/03/02 10:58:07  klaus
+// merged USB thread into main path
+//
+// Revision 1.26.2.5  2003/01/29 20:34:20  klaus
+// release_20030129_a and release_20030129_u released
+//
+// Revision 1.26.2.4  2003/01/29 20:34:19  klaus
+// release_20030129_a and release_20030129_u released
+//
+// Revision 1.26.2.3  2003/01/28 23:28:26  klaus
+// reorderd pcan_usb.c and pcan_usb_kernel.c, tidied up
+//
+// Revision 1.26.2.2  2003/01/14 20:31:53  klaus
+// read/write/minor assigment is working
+//
+/****************************************************************************/
+
+/****************************************************************************/
+// INCLUDES
+
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#include <linux/parport.h>
+
+#include "../include/pcan_dongle.h"
+
+
+
+/****************************************************************************/
+// DEFINES
+#define PCAN_DNG_SP_MINOR_BASE  16  // starting point of minors for SP devices
+#define PCAN_DNG_EPP_MINOR_BASE 24  // starting point of minors for EPP devices
+#define DNG_PORT_SIZE            4  // the address range of the dongle-port
+#define ECR_PORT_SIZE            1  // size of the associated ECR register
+#define DNG_DEFAULT_COUNT        4  // count of defaults for init
+
+typedef void (*PARPORT_IRQ_HANLDER)(int, void *, struct pt_regs *);
+
+/****************************************************************************/
+// GLOBALS
+CAN_DEFINE_SPINLOCK(pcan_lock);
+
+/****************************************************************************/
+// LOCALS
+static u16 dng_ports[] = {0x378, 0x278, 0x3bc, 0x2bc};
+static u8  dng_irqs[]  = {7, 5, 7, 5};
+static u16 dng_devices = 0;        // the number of accepted dng_devices
+static u16 epp_devices = 0;        // ... epp_devices
+static u16 sp_devices  = 0;        // ... sp_devices
+
+static unsigned char nibble_decode[32] =
+{
+  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
+  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf,
+  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+  0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7
+};
+
+struct DONGLE_PORT dongle_port;
+
+char dongle_type[] = "epp_dongle";
+//char dongle_type[] = "sp_dongle";
+
+/****************************************************************************/
+// CODE
+
+//----------------------------------------------------------------------------
+// enable and disable irqs
+static void _parport_disable_irq(struct DONGLE_PORT *dng)
+{
+  u16 _PC_ = (u16)dng->dwPort + 2;
+  outb(inb(_PC_) & ~0x10, _PC_);
+}
+
+static void _parport_enable_irq(struct DONGLE_PORT *dng)
+{
+  u16 _PC_ = (u16)dng->dwPort + 2;
+  outb(inb(_PC_) | 0x10, _PC_);
+}
+
+
+// functions for SP port
+static u8 pcan_dongle_sp_readreg(struct DONGLE_PORT *dng, u8 port) // read a register
+{
+  u16 _PA_ = (u16)dng->dwPort;
+  u16 _PB_ = _PA_ + 1;
+  u16 _PC_ = _PB_ + 1;
+  u8  b0, b1 ;
+  u8  irqEnable = inb(_PC_) & 0x10; // don't influence irqEnable
+  can_spin_irqflags_t flags;
+
+  can_spin_lock_irqsave(&pcan_lock, flags);
+
+  outb((0x0B ^ 0x0D) | irqEnable, _PC_);
+  outb((port & 0x1F) | 0x80,      _PA_);
+  outb((0x0B ^ 0x0C) | irqEnable, _PC_);
+  b1=nibble_decode[inb(_PB_)>>3];
+  outb(0x40, _PA_);
+  b0=nibble_decode[inb(_PB_)>>3];
+  outb((0x0B ^ 0x0D) | irqEnable, _PC_);
+
+  can_spin_unlock_irqrestore(&pcan_lock, flags);
+
+  return  (b1 << 4) | b0 ;
+}
+
+static void pcan_dongle_writereg(struct DONGLE_PORT *dng, u8 port, u8 data) // write a register
+{
+  u16 _PA_ = (u16)dng->dwPort;
+  u16 _PC_ = _PA_ + 2;
+  u8  irqEnable = inb(_PC_) & 0x10; // don't influence irqEnable
+  can_spin_irqflags_t flags;
+
+  can_spin_lock_irqsave(&pcan_lock, flags);
+
+  outb((0x0B ^ 0x0D) | irqEnable, _PC_);
+  outb(port & 0x1F,               _PA_);
+  outb((0x0B ^ 0x0C) | irqEnable, _PC_);
+  outb(data,                      _PA_);
+  outb((0x0B ^ 0x0D) | irqEnable, _PC_);
+
+  can_spin_unlock_irqrestore(&pcan_lock, flags);
+}
+
+// functions for EPP port
+static u8 pcan_dongle_epp_readreg(struct DONGLE_PORT *dng, u8 port) // read a register
+{
+  u16 _PA_ = (u16)dng->dwPort;
+  u16 _PC_ = _PA_ + 2;
+  u8  wert;
+  u8  irqEnable = inb(_PC_) & 0x10; // don't influence irqEnable
+  can_spin_irqflags_t flags;
+
+  can_spin_lock_irqsave(&pcan_lock, flags);
+
+  outb((0x0B ^ 0x0F) | irqEnable, _PC_);
+  outb((port & 0x1F) | 0x80,      _PA_);
+  outb((0x0B ^ 0x2E) | irqEnable, _PC_);
+  wert = inb(_PA_);
+  outb((0x0B ^ 0x0F) | irqEnable, _PC_);
+
+  can_spin_unlock_irqrestore(&pcan_lock, flags);
+
+  return wert;
+}
+
+static int pcan_dongle_req_irq(struct DONGLE_PORT *dng)
+{
+  if (dng->wInitStep == 3)
+  {
+    dng->wInitStep++;
+  }
+
+  return 0;
+}
+
+static void pcan_dongle_free_irq(struct DONGLE_PORT *dng)
+{
+  if (dng->wInitStep == 4)
+  {
+    dng->wInitStep--;
+  }
+}
+
+// release and probe functions
+static int pcan_dongle_cleanup(struct DONGLE_PORT *dng)
+{
+  DEBUGMSG("%s: pcan_dongle_cleanup()\n", DEVICE_NAME);
+
+  switch(dng->wInitStep)
+  {
+    case 4: pcan_dongle_free_irq(dng);
+    case 3: if (dng->wType == HW_DONGLE_SJA)
+              sp_devices--;
+           else
+             epp_devices--;
+           dng_devices = sp_devices + epp_devices;
+    case 2:
+    case 1:
+            parport_unregister_device(dng->pardev);
+    case 0: dng->wInitStep = 0;
+  }
+
+  return 0;
+}
+
+// to switch epp on or restore register
+static void setECR(struct DONGLE_PORT *dng)
+{
+       u16 wEcr = dng->wEcr;
+
+       dng->ucOldECRContent = inb(wEcr);
+       outb((dng->ucOldECRContent & 0x1F) | 0x20, wEcr);
+
+       if (dng->ucOldECRContent == 0xff)
+               DEBUGMSG("%s: realy ECP mode configured?\n", DEVICE_NAME);
+}
+
+static void restoreECR(struct DONGLE_PORT *dng)
+{
+  u16 wEcr = dng->wEcr;
+
+  outb(dng->ucOldECRContent, wEcr);
+
+  DEBUGMSG("%s: restore ECR\n", DEVICE_NAME);
+}
+
+static int pcan_dongle_probe(struct DONGLE_PORT *dng) // probe for type
+{
+  struct parport *p;
+
+  DEBUGMSG("%s: pcan_dongle_probe() - PARPORT_SUBSYSTEM\n", DEVICE_NAME);
+  
+  // probe does not probe for the sja1000 device here - this is done at sja1000_open()
+  p = parport_find_base(dng->dwPort);
+  if (!p)
+  {
+    DEBUGMSG("found no parport\n");
+    return -ENXIO;
+  }
+  else
+  {
+       dng->pardev = parport_register_device(p, "can", NULL, NULL, 
+                          (PARPORT_IRQ_HANLDER)dng->chip->chipspecops->irq_handler,
+                         0, (void *)dng->chip);
+       
+//    DEBUGMSG("datos IRQ: irq_handler=0x%x p=0x%x dng->chip=0x%x dng->pardev->port->irq=0x%x irq_handler2=0x%x\n",
+//             dng->chip->chipspecops->irq_handler,
+//             p,dng->chip,dng->pardev->port->irq, &sja1000p_irq_handler);
+                                     
+    if (!dng->pardev)
+    {
+      DEBUGMSG("found no parport device\n");
+      return -ENODEV;
+    }
+
+  }
+  
+  return 0;
+}
+
+// interface depended open and close
+static int pcan_dongle_open(struct DONGLE_PORT *dng)
+{
+  int result = 0;
+  u16 wPort;
+  
+  DEBUGMSG("%s: pcan_dongle_open()\n", DEVICE_NAME);
+  
+  result = parport_claim(dng->pardev);
+  
+  if (!result)
+  {
+    if (dng->pardev->port->irq == PARPORT_IRQ_NONE)
+    {
+      DEBUGMSG(KERN_ERR "%s: no irq associated to parport.\n", DEVICE_NAME);
+      result = -ENXIO;
+    }
+  }
+  else
+   DEBUGMSG(KERN_ERR "%s: can't claim parport.\n", DEVICE_NAME);       
+  
+  // save port state
+  if (!result)
+   {
+      wPort    = (u16)dng->dwPort;
+         
+     // save old port contents
+     dng->ucOldDataContent     = inb(wPort);
+     dng->ucOldControlContent  = inb(wPort + 2);
+         
+     // switch to epp mode if possible
+     if (dng->wType == HW_DONGLE_SJA_EPP)
+        setECR(dng); 
+  
+    // enable irqs
+    _parport_enable_irq(dng); // parport_enable_irq(dng->pardev->port); not working since 2.4.18
+  }    
+       
+  return result;
+}
+
+static int pcan_dongle_release(struct DONGLE_PORT *dng)
+{
+  u16 wPort = (u16)dng->dwPort;
+
+  DEBUGMSG("%s: pcan_dongle_release()\n", DEVICE_NAME);
+  
+  // disable irqs
+  _parport_disable_irq(dng); // parport_disable_irq(dng->pardev->port); not working since 2.4.18
+
+  if (dng->wType == HW_DONGLE_SJA_EPP)
+    restoreECR(dng);
+    
+  // restore port state
+  outb(dng->ucOldDataContent, wPort);
+  outb(dng->ucOldControlContent, wPort + 2);
+      
+  parport_release(dng->pardev);
+  
+  return 0;
+}
+
+int  pcan_dongle_init(struct DONGLE_PORT *dng, u32 dwPort, u16 wIrq, char *type)
+{
+  int err;
+  
+  DEBUGMSG("%s: pcan_dongle_init(), dng_devices = %d\n", DEVICE_NAME, dng_devices);
+  
+  dng->type = type;
+
+  dng->wType = (!strncmp(dongle_type, "sp", 4)) ? HW_DONGLE_SJA : HW_DONGLE_SJA_EPP;
+  
+  // set this before any instructions, fill struct pcandev, part 1 
+  dng->wInitStep   = 0;  
+        
+  // fill struct pcandev, 1st check if a default is set
+  if (!dwPort)
+  {
+    // there's no default available
+    if (dng_devices >= DNG_DEFAULT_COUNT)
+      return -ENODEV;
+    
+    dng->dwPort = dng_ports[dng_devices];
+  }
+  else
+    dng->dwPort = dwPort;
+  
+  if (!wIrq)
+  {
+    if (dng_devices >= DNG_DEFAULT_COUNT)
+      return -ENODEV;
+    
+    dng->wIrq   = dng_irqs[dng_devices];    
+  }
+  else
+    dng->wIrq   = wIrq;    
+  
+  if (dng->wType == HW_DONGLE_SJA)
+    {
+          dng->nMinor        = PCAN_DNG_SP_MINOR_BASE + sp_devices; 
+          dng->wEcr = 0; // set to anything
+    }
+  else
+    {
+           dng->nMinor        = PCAN_DNG_EPP_MINOR_BASE + epp_devices;  
+           dng->wEcr = (u16)dng->dwPort + 0x402;
+    }
+         
+       // is the device really available?              
+  if ((err = pcan_dongle_probe(dng)) < 0)
+    return err;
+  
+  if (dng->wType == HW_DONGLE_SJA)
+    sp_devices++;
+  else
+    epp_devices++;
+         
+  dng_devices = sp_devices + epp_devices;
+  
+  dng->wInitStep = 3;
+
+  DEBUGMSG(KERN_INFO "%s: %s device minor %d prepared (io=0x%04x,irq=%d)\n", DEVICE_NAME, 
+                               dng->type, dng->nMinor, dng->dwPort, dng->wIrq);
+       
+  return 0;
+}
+
+
+
+
+/**
+ * template_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function template_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcan_dongle_request_io(struct candevice_t *candev)
+{
+        int res_init;
+
+       dongle_port.chip = candev->chip[0];
+
+       res_init = pcan_dongle_init(&dongle_port, 0, 0, dongle_type);
+
+       return res_init;
+}
+
+/**
+ * template_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function template_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcan_dongle_release_io(struct candevice_t *candev)
+{
+       /* release I/O port */
+       pcan_dongle_release(&dongle_port);
+       
+       pcan_dongle_cleanup(&dongle_port);
+
+       return 0;
+}
+
+/**
+ * template_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcan_dongle_reset(struct candevice_t *candev)
+{
+       int i=0;
+       struct canchip_t *chip;
+       int chipnr;
+       unsigned cdr;
+       
+       DEBUGMSG("Resetting pcan_dongle hardware ...\n");
+       for(chipnr=0;chipnr<candev->nr_sja1000_chips;chipnr++) {
+               chip=candev->chip[chipnr];
+
+         pcan_dongle_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+         udelay(1000);
+       
+         cdr=pcan_dongle_read_register(chip->chip_base_addr+SJACDR);
+         pcan_dongle_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+         pcan_dongle_write_register(0, chip->chip_base_addr+SJAIER);
+
+         i=20;
+         pcan_dongle_write_register(0, chip->chip_base_addr+SJAMOD);
+         while (pcan_dongle_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM) {
+               if(!i--) {
+                       CANMSG("Reset status timeout!\n");
+                       CANMSG("Please check your hardware.\n");
+                       return -ENODEV;
+               }
+               udelay(1000);
+               pcan_dongle_write_register(0, chip->chip_base_addr+SJAMOD);
+         }
+
+         cdr = pcan_dongle_read_register(chip->chip_base_addr+SJACDR);
+         pcan_dongle_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+         pcan_dongle_write_register(0, chip->chip_base_addr+SJAIER);
+       }
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * template_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcan_dongle_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+//     candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+#define CHIP_TYPE "sja1000p"
+/**
+ * template_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function template_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %CDR_CLKOUT_MASK, %CDR_CLK_OFF, %CDR_RXINPEN, %CDR_CBP, %CDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %OCR_MODE_BIPHASE, %OCR_MODE_TEST, %OCR_MODE_NORMAL, %OCR_MODE_CLOCK,
+ * %OCR_TX0_LH, %OCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcan_dongle_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+//    if (chipnr == 0)
+     {
+       /* initialize common routines for the SJA1000 chip */
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+
+       candev->chip[chipnr]->chip_type=CHIP_TYPE;
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+
+       candev->chip[chipnr]->flags |= CHIP_IRQ_CUSTOM;  // I don't want setup call request_irq 
+                                     // I'm going to do it through parport_register_device 
+
+     }
+
+    return 0;
+}
+
+/**
+ * template_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function template_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcan_dongle_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       chip->msgobj[objnr]->obj_flags=0;
+       
+       return 0;
+}
+
+/**
+ * template_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcan_dongle_program_irq(struct candevice_t *candev)
+{
+       int ret_open;
+
+       pcan_dongle_req_irq(&dongle_port);
+       ret_open = pcan_dongle_open(&dongle_port);
+
+       return ret_open;
+}
+
+
+/**
+ * template_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function template_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void pcan_dongle_write_register(unsigned data, unsigned long address)
+{
+   address -= dongle_port.chip->chip_base_addr;  // it's in mutiplexed mode
+
+   pcan_dongle_writereg(&dongle_port, (u8) address, (u8) data); // write a register
+
+//   DEBUGMSG("Write Reg at: 0x%lx data 0x%x \n", address, (unsigned) data);
+}
+
+/**
+ * template_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function template_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned pcan_dongle_read_register(unsigned long address)
+{
+   u8 val;
+
+  address -= dongle_port.chip->chip_base_addr;  // it's in mutiplexed mode
+       
+  if (dongle_port.wType == HW_DONGLE_SJA)
+     val = pcan_dongle_sp_readreg(&dongle_port, (u8) address); // functions for SP port
+  else 
+     val = pcan_dongle_epp_readreg(&dongle_port, (u8) address); // functions for EPP port
+
+//  DEBUGMSG("Read Reg at: 0x%lx data 0x%x \n", address, val);
+
+  return ((unsigned)val);
+}
+
+/* !!! Don't change this function !!! */
+int pcan_dongle_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pcan_dongle_request_io;
+       hwspecops->release_io = pcan_dongle_release_io;
+       hwspecops->reset = pcan_dongle_reset;
+       hwspecops->init_hw_data = pcan_dongle_init_hw_data;
+       hwspecops->init_chip_data = pcan_dongle_init_chip_data;
+       hwspecops->init_obj_data = pcan_dongle_init_obj_data;
+       hwspecops->write_register = pcan_dongle_write_register;
+       hwspecops->read_register = pcan_dongle_read_register;
+       hwspecops->program_irq = pcan_dongle_program_irq;
+       return 0;
+}
+
+
diff --git a/lincan-0.3.3/src/pccan.c b/lincan-0.3.3/src/pccan.c
new file mode 100644 (file)
index 0000000..4d877c6
--- /dev/null
@@ -0,0 +1,393 @@
+/* pccan.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pccan.h"
+#include "../include/i82527.h"
+#include "../include/sja1000.h"
+
+int pccanf_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr+0x4000,0x20,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr+0x4000);
+               return -ENODEV;
+       }
+       else if (!can_request_io_region(candev->io_addr+0x6000,0x04,DEVICE_NAME)) {
+               can_release_io_region(candev->io_addr+0x4000,0x20);
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr+0x6000);
+               return -ENODEV;
+       }
+       else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr+0x4000, candev->io_addr+0x4000+0x20-1);
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr+0x6000, candev->io_addr+0x6000+0x04-1);
+       }
+       return 0;
+}
+
+int pccand_request_io(struct candevice_t *candev)
+{
+       if (pccanf_request_io(candev))
+               return -ENODEV;
+
+       if (!can_request_io_region(candev->io_addr+0x5000,0x20,DEVICE_NAME)) {
+               pccanf_release_io(candev);
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr+0x5000);
+               return -ENODEV;
+       }
+       else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr+0x5000, candev->io_addr+0x5000+0x20-1);
+       }
+       return 0;
+}
+
+int pccanq_request_io(struct candevice_t *candev)
+{
+       unsigned long io_addr;
+       int i;
+       
+       if (pccand_request_io(candev))
+               return -ENODEV;
+
+       for(i=0, io_addr=candev->io_addr+0x2000; i<8; i++, io_addr+=0x400) {
+               if (!can_request_io_region(io_addr,0x40,DEVICE_NAME)) {
+                       CANMSG("Unable to open port: 0x%lx\n",io_addr);
+                       while(i--){
+                               io_addr-=0x400;
+                               can_release_io_region(io_addr,0x40);
+                       }
+                       pccand_release_io(candev);
+                       return -ENODEV;
+               }
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", io_addr, io_addr+0x40-1);
+       }
+       return 0;
+}
+
+int pccanf_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr+0x4000,0x20);
+       can_release_io_region(candev->io_addr+0x6000,0x04);
+
+       return 0;
+}
+
+int pccand_release_io(struct candevice_t *candev)
+{
+       pccanf_release_io(candev);
+       can_release_io_region(candev->io_addr+0x5000,0x20);
+
+       return 0;
+}
+
+int pccanq_release_io(struct candevice_t *candev)
+{
+       unsigned long io_addr;
+       int i;
+
+       pccand_release_io(candev);
+
+       for(i=0, io_addr=candev->io_addr+0x2000; i<8; i++, io_addr+=0x400) {
+               can_release_io_region(io_addr,0x40);
+       }
+
+       return 0;
+}
+
+int pccanf_reset(struct candevice_t *candev)
+{
+       int i=0;
+
+       DEBUGMSG("Resetting pccanf/s hardware ...\n");
+       while (i < 1000000) {
+               i++;
+               outb(0x00,candev->res_addr);
+       }
+       outb(0x01,candev->res_addr);
+       outb(0x00,candev->chip[0]->chip_base_addr+SJACR);
+
+       /* Check hardware reset status */
+       i=0;
+       while ( (inb(candev->chip[0]->chip_base_addr+SJACR) & sjaCR_RR)
+                                                                && (i<=15) ) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip[0] reset status ok.\n");
+
+       return 0;
+}
+
+int pccand_reset(struct candevice_t *candev)
+{
+       int i=0,chip_nr=0;
+
+       DEBUGMSG("Resetting pccan-d hardware ...\n");
+       while (i < 1000000) {
+               i++;
+               outb(0x00,candev->res_addr);
+       }
+       outb(0x01,candev->res_addr);
+       outb(0x00,candev->chip[0]->chip_base_addr+SJACR);
+       outb(0x00,candev->chip[1]->chip_base_addr+SJACR);
+
+       /* Check hardware reset status */
+       i=0;
+       for (chip_nr=0; chip_nr<2; chip_nr++) {
+               i=0;
+               while ( (inb(candev->chip[chip_nr]->chip_base_addr +
+                                               SJACR) & sjaCR_RR) && (i<=15) ) {
+                       udelay(20000);
+                       i++;
+               }
+               if (i>=15) {
+                       CANMSG("Reset status timeout!\n");
+                       CANMSG("Please check your hardware.\n");
+                       return -ENODEV;
+               }
+               else
+                       DEBUGMSG("Chip%d reset status ok.\n",chip_nr);
+       }
+       return 0;
+}
+
+int pccanq_reset(struct candevice_t *candev)
+{
+       int i=0,chip_nr=0;
+
+       for (i=0; i<4; i++)
+               can_disable_irq(candev->chip[i]->chip_irq);
+
+       DEBUGMSG("Resetting pccan-q hardware ...\n");
+       while (i < 100000) {
+               i++;
+               outb(0x00,candev->res_addr);
+       }
+       outb_p(0x01,candev->res_addr);
+               
+       outb(0x00,candev->chip[2]->chip_base_addr+SJACR);
+       outb(0x00,candev->chip[3]->chip_base_addr+SJACR);
+
+       /* Check hardware reset status */
+       for (chip_nr=0; chip_nr<2; chip_nr++) {
+               i=0;
+               while( (inb(candev->chip[chip_nr]->chip_base_addr +
+                                               iCPU) & iCPU_RST) && (i<=15) ) {
+                       udelay(20000);
+                       i++;
+               }
+               if (i>=15) {
+                       CANMSG("Reset status timeout!\n");
+                       CANMSG("Please check your hardware.\n");
+                       return -ENODEV;
+               }
+               else 
+                       DEBUGMSG("Chip%d reset status ok.\n",chip_nr);
+       }
+       for (chip_nr=2; chip_nr<4; chip_nr++) {
+               i=0;
+               while( (inb(candev->chip[chip_nr]->chip_base_addr +
+                                               SJACR) & sjaCR_RR) && (i<=15) ) {
+                       udelay(20000);
+                       i++;
+               }
+               if (i>=15) {
+                       CANMSG("Reset status timeout!\n");
+                       CANMSG("Please check your hardware.\n");
+                       return -ENODEV;
+               }
+               else
+                       DEBUGMSG("Chip%d reset status ok.\n",chip_nr);
+       }
+
+       for (i=0; i<4; i++)
+               can_enable_irq(candev->chip[i]->chip_irq);
+
+       return 0;
+}      
+
+int pccan_init_hw_data(struct candevice_t *candev)
+{
+       candev->res_addr=candev->io_addr+0x6001;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       if (!strcmp(candev->hwname,"pccan-q")) {
+               candev->nr_82527_chips=2;
+               candev->nr_sja1000_chips=2;
+               candev->nr_all_chips=4;
+       }
+       if (!strcmp(candev->hwname,"pccan-f") |
+           !strcmp(candev->hwname,"pccan-s")) {
+               candev->nr_82527_chips=0;
+               candev->nr_sja1000_chips=1;
+               candev->nr_all_chips=1;
+       }
+       if (!strcmp(candev->hwname,"pccan-d")) {
+               candev->nr_82527_chips=0;
+               candev->nr_sja1000_chips=2;
+               candev->nr_all_chips=2;
+       }
+
+       return 0;
+}
+
+int pccan_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       if (!strcmp(candev->hwname,"pccan-q")) {
+               if (chipnr<2) {
+                       i82527_fill_chipspecops(candev->chip[chipnr]);
+                       candev->chip[chipnr]->flags = CHIP_SEGMENTED;
+                       candev->chip[chipnr]->int_cpu_reg=iCPU_DSC;
+                       candev->chip[chipnr]->int_clk_reg=iCLK_SL1;
+                       candev->chip[chipnr]->int_bus_reg=iBUS_CBY;
+                       candev->chip[chipnr]->sja_cdr_reg = 0;
+                       candev->chip[chipnr]->sja_ocr_reg = 0;  
+               }
+               else{
+                       sja1000_fill_chipspecops(candev->chip[chipnr]);
+                       candev->chip[chipnr]->flags = 0;
+                       candev->chip[chipnr]->int_cpu_reg = 0;
+                       candev->chip[chipnr]->int_clk_reg = 0;
+                       candev->chip[chipnr]->int_bus_reg = 0;
+                       candev->chip[chipnr]->sja_cdr_reg =
+                                                               sjaCDR_CLK_OFF;
+                       candev->chip[chipnr]->sja_ocr_reg = 
+                                               sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;     
+               }
+               candev->chip[chipnr]->chip_base_addr=0x1000*chipnr+0x2000+candev->io_addr;
+       }
+       else {
+               sja1000_fill_chipspecops(candev->chip[chipnr]);
+               candev->chip[chipnr]->chip_base_addr=0x1000*chipnr+0x4000+candev->io_addr;
+               candev->chip[chipnr]->flags = 0;
+               candev->chip[chipnr]->int_cpu_reg = 0;
+               candev->chip[chipnr]->int_clk_reg = 0;
+               candev->chip[chipnr]->int_bus_reg = 0;
+               candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CLK_OFF;
+               candev->chip[chipnr]->sja_ocr_reg = 
+                                               sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;     
+       }
+
+       candev->chip[chipnr]->clock = 16000000;
+
+       return 0;
+}      
+
+int pccan_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       if (!strcmp(chip->chip_type,"sja1000")) {
+               chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+               }
+       else {  /* The spacing for this card is 0x3c0 */
+               chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr+(objnr+1)*0x10+(int)((objnr+1)/4)*0x3c0;
+               }
+
+       return 0;
+}
+
+int pccan_program_irq(struct candevice_t *candev)
+{
+       #define IRQ9 0x01
+       #define IRQ3 0x02
+       #define IRQ5 0x03
+
+       unsigned char irq_reg_value=0;
+       int i;
+
+       for (i=0; i<4; i++) {
+               switch (candev->chip[i]->chip_irq) {
+                       case 0: {
+                               break;
+                       }
+                       case 3: {
+                               irq_reg_value |= (IRQ3<<(i*2));
+                               break;
+                       }
+                       case 5: {
+                               irq_reg_value |= (IRQ5<<(i*2));
+                               break;
+                       }
+                       case 9: {
+                               irq_reg_value |= (IRQ9<<(i*2));
+                               break;
+                       }
+                       default: {
+                               CANMSG("Supplied interrupt is not supported by the hardware\n");
+                               return -ENODEV;
+                       }
+               }
+       }
+       outb(irq_reg_value,0x6000+candev->io_addr);
+       DEBUGMSG("Configured pccan hardware interrupts\n");
+       outb(0x80,0x6000+candev->io_addr+0x02);
+       DEBUGMSG("Selected pccan on-board 16 MHz oscillator\n");
+
+       return 0;
+}
+
+inline void pccan_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address); 
+}
+
+unsigned pccan_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+int pccanf_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pccanf_request_io;
+       hwspecops->release_io = pccanf_release_io;
+       hwspecops->reset = pccanf_reset;
+       hwspecops->init_hw_data = pccan_init_hw_data;
+       hwspecops->init_chip_data = pccan_init_chip_data;
+       hwspecops->init_obj_data = pccan_init_obj_data;
+       hwspecops->write_register = pccan_write_register;
+       hwspecops->read_register = pccan_read_register;
+       hwspecops->program_irq = pccan_program_irq;
+       return 0;
+}
+
+
+int pccand_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pccand_request_io;
+       hwspecops->release_io = pccand_release_io;
+       hwspecops->reset = pccand_reset;
+       hwspecops->init_hw_data = pccan_init_hw_data;
+       hwspecops->init_chip_data = pccan_init_chip_data;
+       hwspecops->init_obj_data = pccan_init_obj_data;
+       hwspecops->write_register = pccan_write_register;
+       hwspecops->read_register = pccan_read_register;
+       hwspecops->program_irq = pccan_program_irq;
+       return 0;
+}
+
+
+int pccanq_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pccanq_request_io;
+       hwspecops->release_io = pccanq_release_io;
+       hwspecops->reset = pccanq_reset;
+       hwspecops->init_hw_data = pccan_init_hw_data;
+       hwspecops->init_chip_data = pccan_init_chip_data;
+       hwspecops->init_obj_data = pccan_init_obj_data;
+       hwspecops->write_register = pccan_write_register;
+       hwspecops->read_register = pccan_read_register;
+       hwspecops->program_irq = pccan_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pcccan.c b/lincan-0.3.3/src/pcccan.c
new file mode 100644 (file)
index 0000000..b568912
--- /dev/null
@@ -0,0 +1,299 @@
+/* pcccan.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+/* This file contains the low level functions for the pcccan-1 card from Gespac.
+ * You can probably find more information at http://www.gespac.com
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pcccan.h"
+#include "../include/i82527.h"
+
+int pcccan_irq=-1;
+unsigned long pcccan_base=0x0;
+
+static CAN_DEFINE_SPINLOCK(pcccan_port_lock);
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+
+/* The pcccan card uses indexed addressing hence the need to only reserve
+ * eight bytes of memory.
+ * base + 0 = Reset
+ * base + 1 = Address loading
+ * base + 2 = Read register
+ * base + 3 = Read register + increment loaded address (saves a write operation
+ * when accessing consecutive registers)
+ * base + 4 = Unused
+ * base + 5 = Address read
+ * base + 6 = Write register
+ * base + 7 = Write register + increment loaded address
+ */
+#define IO_RANGE 0x8
+
+/**
+ * pcccan_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function pcccan_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pcccan.c
+ */
+int pcccan_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * pcccan_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function pcccan_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/pcccan.c
+ */
+int pcccan_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * pcccan_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pcccan_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pcccan.c
+ */
+int pcccan_reset(struct candevice_t *candev)
+{
+       int i=0;
+
+       DEBUGMSG("Resetting pcccan-1 hardware ...\n");
+       while (i < 1000000) {
+               i++;
+               outb(0x0,candev->res_addr);
+       }
+
+       /* Check hardware reset status */
+       i=0;
+       outb(iCPU,candev->io_addr+0x1);
+       while ( (inb(candev->io_addr+0x2)&0x80) && (i<=15) ) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip reset status ok.\n");
+
+       return 0;
+} 
+
+#define NR_82527 1
+#define NR_SJA1000 0
+
+/**
+ * pcccan_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pcccan_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/pcccan.c
+ */
+int pcccan_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=candev->io_addr;
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+        candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * pcccan_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function pcccan_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/pcccan.c
+ */
+int pcccan_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC | iCPU_DMC;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1 | iCLK_CD0;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY | iBUS_DR1;
+       candev->chip[chipnr]->sja_cdr_reg = 0;
+       candev->chip[chipnr]->sja_ocr_reg = 0;
+       pcccan_irq=candev->chip[chipnr]->chip_irq;
+       pcccan_base=candev->chip[chipnr]->chip_base_addr;
+
+       return 0;
+}
+
+/**
+ * pcccan_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function pcccan_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/pcccan.c
+ */
+int pcccan_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/**
+ * pcccan_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pcccan_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pcccan.c
+ */
+int pcccan_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * pcccan_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function pcccan_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/pcccan.c
+ */
+void pcccan_write_register(unsigned data, unsigned long address)
+{
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&pcccan_port_lock,flags);
+       outb(address - pcccan_base, pcccan_base+1);
+       outb(data, pcccan_base+6);
+       can_spin_unlock_irqrestore(&pcccan_port_lock,flags);
+}
+
+/**
+ * pcccan_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function pcccan_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/pcccan.c
+ */
+unsigned pcccan_read_register(unsigned long address)
+{
+       unsigned ret;
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&pcccan_port_lock,flags);
+       outb(address - pcccan_base, pcccan_base+1);
+       ret=inb(pcccan_base+2);
+       can_spin_unlock_irqrestore(&pcccan_port_lock,flags);
+       return ret;
+
+}
+
+/* !!! Don't change this function !!! */
+int pcccan_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pcccan_request_io;
+       hwspecops->release_io = pcccan_release_io;
+       hwspecops->reset = pcccan_reset;
+       hwspecops->init_hw_data = pcccan_init_hw_data;
+       hwspecops->init_chip_data = pcccan_init_chip_data;
+       hwspecops->init_obj_data = pcccan_init_obj_data;
+       hwspecops->write_register = pcccan_write_register;
+       hwspecops->read_register = pcccan_read_register;
+       hwspecops->program_irq = pcccan_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pcm3680.c b/lincan-0.3.3/src/pcm3680.c
new file mode 100644 (file)
index 0000000..adc4293
--- /dev/null
@@ -0,0 +1,271 @@
+/* pcm3680.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pcm3680.h"
+#include "../include/sja1000p.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x400
+
+/**
+ * template_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function template_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcm3680_request_io(struct candevice_t *candev)
+{
+        unsigned long remap_addr;
+       if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - pcm3680")) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,IO_RANGE);
+               return -ENODEV;
+       
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       return 0;
+}
+
+/**
+ * template_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function template_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcm3680_release_io(struct candevice_t *candev)
+{
+       iounmap((void*)candev->dev_base_addr);
+       can_release_mem_region(candev->io_addr,IO_RANGE);
+       return 0;
+}
+
+/**
+ * template_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcm3680_reset(struct candevice_t *candev)
+{
+       int i=0;
+       struct canchip_t *chip;
+       int chipnr;
+       
+       DEBUGMSG("Resetting pcm3680 hardware ...\n");
+       for(chipnr=0;chipnr<candev->nr_sja1000_chips;chipnr++) {
+               chip=candev->chip[chipnr];
+               pcm3680_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+               udelay(1000);
+               pcm3680_write_register(0x00, chip->chip_base_addr + SJAIER);
+               /* Write arbitrary data to reset chip */
+               pcm3680_write_register(0x01, chip->chip_base_addr + 0x100);
+               udelay(1000);
+               i=20;
+               while (pcm3680_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+                       if(!i--) return -ENODEV;
+                       udelay(1000);
+                       pcm3680_write_register(0, chip->chip_base_addr+SJAMOD);
+               }
+               udelay(1000);
+               pcm3680_write_register(sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+               pcm3680_write_register(0x00, chip->chip_base_addr + SJAIER);
+       }
+
+       return 0;
+}
+
+#define RESET_ADDR 0x100
+#define NR_82527 0
+#define NR_SJA1000 2
+
+/**
+ * template_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcm3680_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * template_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function template_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcm3680_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=
+                       candev->io_addr + 0x200*chipnr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL |
+                                                               sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * template_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function template_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int pcm3680_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       
+       return 0;
+}
+
+/**
+ * template_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int pcm3680_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * template_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function template_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void pcm3680_write_register(unsigned data, unsigned long address)
+{
+       writeb(data,address);
+}
+
+/**
+ * template_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function template_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned pcm3680_read_register(unsigned long address)
+{
+       return readb(address);
+}
+
+/* !!! Don't change this function !!! */
+int pcm3680_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pcm3680_request_io;
+       hwspecops->release_io = pcm3680_release_io;
+       hwspecops->reset = pcm3680_reset;
+       hwspecops->init_hw_data = pcm3680_init_hw_data;
+       hwspecops->init_chip_data = pcm3680_init_chip_data;
+       hwspecops->init_obj_data = pcm3680_init_obj_data;
+       hwspecops->write_register = pcm3680_write_register;
+       hwspecops->read_register = pcm3680_read_register;
+       hwspecops->program_irq = pcm3680_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pikronisa.c b/lincan-0.3.3/src/pikronisa.c
new file mode 100644 (file)
index 0000000..fd0f340
--- /dev/null
@@ -0,0 +1,279 @@
+/* pikronisa.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pikronisa.h"
+#include "../include/sja1000p.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x100
+
+/**
+ * pikronisa_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function pikronisa_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pikronisa_request_io(struct candevice_t *candev)
+{
+        int remap_addr;
+       
+       if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - pikronisa")) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,IO_RANGE);
+               return -ENODEV;
+       
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       return 0;
+}
+
+/**
+ * pikronisa_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function pikronisa_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pikronisa_release_io(struct candevice_t *candev)
+{
+       /* release I/O memory mapping */
+       iounmap((void*)candev->dev_base_addr);
+       can_release_mem_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * pikronisa_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pikronisa_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pikronisa_reset(struct candevice_t *candev)
+{
+       int i;
+       struct canchip_t *chip=candev->chip[0];
+       unsigned cdr;
+       
+       pikronisa_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+       udelay(1000);
+       
+       cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR);
+       pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       pikronisa_write_register(0, chip->chip_base_addr+SJAIER);
+
+       i=20;
+       pikronisa_write_register(0, chip->chip_base_addr+SJAMOD);
+       while (pikronisa_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+               if(!i--) return -ENODEV;
+               udelay(1000);
+               pikronisa_write_register(0, chip->chip_base_addr+SJAMOD);
+       }
+
+       cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR);
+       pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       pikronisa_write_register(0, chip->chip_base_addr+SJAIER);
+       
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+/**
+ * pikronisa_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pikronisa_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pikronisa_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=1;
+       candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+/**
+ * pikronisa_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function pikronisa_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 24000000;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * pikronisa_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function pikronisa_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pikronisa_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+/**
+ * pikronisa_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pikronisa_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pikronisa_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * pikronisa_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function pikronisa_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/pikronisa.c
+ */
+void pikronisa_write_register(unsigned data, unsigned long address)
+{
+       /*DEBUGMSG("pikronisa_write_register: addr=0x%lx data=0x%x",
+               address,data);*/
+       writeb(data,address);
+}
+
+/**
+ * pikronisa_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function pikronisa_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/pikronisa.c
+ */
+unsigned pikronisa_read_register(unsigned long address)
+{
+       return readb(address);
+}
+
+/* !!! Don't change this function !!! */
+int pikronisa_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pikronisa_request_io;
+       hwspecops->release_io = pikronisa_release_io;
+       hwspecops->reset = pikronisa_reset;
+       hwspecops->init_hw_data = pikronisa_init_hw_data;
+       hwspecops->init_chip_data = pikronisa_init_chip_data;
+       hwspecops->init_obj_data = pikronisa_init_obj_data;
+       hwspecops->write_register = pikronisa_write_register;
+       hwspecops->read_register = pikronisa_read_register;
+       hwspecops->program_irq = pikronisa_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pimx1.c b/lincan-0.3.3/src/pimx1.c
new file mode 100644 (file)
index 0000000..1c1a303
--- /dev/null
@@ -0,0 +1,326 @@
+/* pikronisa.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)) && defined(CONFIG_GENERIC_HARDIRQS)
+#include <linux/irq.h>
+#endif /* <2.6.14 */
+#include <asm/arch/hardware.h>
+#include <asm/arch/imx-regs.h>
+
+#define EIM_CS1U __REG(IMX_EIM_BASE + 0x08)
+#define EIM_CS1L __REG(IMX_EIM_BASE + 0x0C)
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define PIMX1_CAN_IO_ADDRESS 0x12000000
+#define PIMX1_CAN_IO_RANGE   0x100
+#define PIMX1_CAN_IRQ        IRQ_GPIOB(17)
+#define PIMX1_CAN_RESET_ADDR 0x0
+#define NR_82527 0
+#define NR_SJA1000 1
+
+static CAN_DEFINE_SPINLOCK(pimx1_setup_hardware_lock);
+
+int pimx1_setup_hardware(struct candevice_t *candev)
+{
+       can_spin_irqflags_t flags;
+
+       can_spin_lock_irqsave(&pimx1_setup_hardware_lock,flags);
+       /* CNC=0; WSC=10-1; WWS=0; EDC=2; OEA=6; OEN=2; WEA=8; WEN=2 */
+       EIM_CS1U = 0x00000902;
+       EIM_CS1L = 0x82820903;
+       imx_gpio_mode(PA21_PF_A0);
+
+    #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14))
+       /* Setup IRQ port as input */
+       imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_IN  | GPIO_PUEN | 17);
+       /* Setup SJA1000 reset as output */
+       imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_OUT | GPIO_DR | 15);
+    #else /* <2.6.14 */
+       imx_gpio_mode(GPIO_PORTB | GPIO_IN | GPIO_PUEN | GPIO_GPIO | 17);
+       imx_gpio_mode(GPIO_PORTB | GPIO_OUT | GPIO_GPIO | 15);
+    #endif /* <2.6.14 */
+
+       DR(1) |= 1<<15;
+       can_spin_unlock_irqrestore(&pimx1_setup_hardware_lock,flags);
+
+        set_irq_type(PIMX1_CAN_IRQ, IRQT_LOW);
+
+       return 0;
+}
+
+
+/**
+ * pimx1_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function pimx1_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pimx1_request_io(struct candevice_t *candev)
+{
+        int remap_addr;
+
+       if(pimx1_setup_hardware(candev)<0){
+               CANMSG("PiMX1 board hardware setup failure\n");
+               return -ENODEV;
+       }
+       
+       if (!can_request_mem_region(candev->io_addr,PIMX1_CAN_IO_RANGE,DEVICE_NAME " - pimx1")) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, PIMX1_CAN_IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,PIMX1_CAN_IO_RANGE);
+               return -ENODEV;
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       CANMSG("Registered IO-memory: 0x%lx - 0x%lx (VMA 0x%lx)\n", 
+               candev->io_addr, candev->io_addr + PIMX1_CAN_IO_RANGE - 1, (long)remap_addr);
+       return 0;
+}
+
+/**
+ * pimx1_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function pimx1_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pimx1_release_io(struct candevice_t *candev)
+{
+       /* release I/O memory mapping */
+       iounmap((void*)candev->dev_base_addr);
+       can_release_mem_region(candev->io_addr,PIMX1_CAN_IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * pimx1_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function pimx1_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/pikronisa.c
+ */
+void pimx1_write_register(unsigned data, unsigned long address)
+{
+       /*DEBUGMSG("pimx1_write_register: addr=0x%lx data=0x%x\n",
+               address,data);*/
+       writeb(data,address);
+}
+
+/**
+ * pimx1_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function pimx1_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/pikronisa.c
+ */
+unsigned pimx1_read_register(unsigned long address)
+{
+       return readb(address);
+}
+
+/**
+ * pimx1_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pimx1_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pimx1_reset(struct candevice_t *candev)
+{
+       int i;
+       struct canchip_t *chip=candev->chip[0];
+       unsigned cdr;
+       
+       pimx1_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+       udelay(1000);
+       
+       cdr=pimx1_read_register(chip->chip_base_addr+SJACDR);
+       pimx1_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       pimx1_write_register(0, chip->chip_base_addr+SJAIER);
+
+       i=20;
+       pimx1_write_register(0, chip->chip_base_addr+SJAMOD);
+       while (pimx1_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+               if(!i--) return -ENODEV;
+               udelay(1000);
+               pimx1_write_register(0, chip->chip_base_addr+SJAMOD);
+       }
+
+       cdr=pimx1_read_register(chip->chip_base_addr+SJACDR);
+       pimx1_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+       pimx1_write_register(0, chip->chip_base_addr+SJAIER);
+       
+       return 0;
+}
+
+/**
+ * pimx1_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pimx1_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pimx1_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=PIMX1_CAN_RESET_ADDR;
+       candev->io_addr=PIMX1_CAN_IO_ADDRESS;
+       candev->dev_base_addr=PIMX1_CAN_IO_ADDRESS;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=1;
+       candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+/**
+ * pimx1_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function pimx1_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pimx1_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->chip_irq=PIMX1_CAN_IRQ;
+       candev->chip[chipnr]->clock = 24000000;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * pimx1_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function pimx1_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/pikronisa.c
+ */
+int pimx1_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr;
+       return 0;
+}
+
+/**
+ * pimx1_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function pimx1_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/pikronisa.c
+ */
+int pimx1_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/* !!! Don't change this function !!! */
+int pimx1_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pimx1_request_io;
+       hwspecops->release_io = pimx1_release_io;
+       hwspecops->reset = pimx1_reset;
+       hwspecops->init_hw_data = pimx1_init_hw_data;
+       hwspecops->init_chip_data = pimx1_init_chip_data;
+       hwspecops->init_obj_data = pimx1_init_obj_data;
+       hwspecops->write_register = pimx1_write_register;
+       hwspecops->read_register = pimx1_read_register;
+       hwspecops->program_irq = pimx1_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/pip.c b/lincan-0.3.3/src/pip.c
new file mode 100644 (file)
index 0000000..add0fee
--- /dev/null
@@ -0,0 +1,213 @@
+/* pip.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * Adapted for actual PIP5 Version and PIP7 and PIP8 by
+ * Stefan Peter, MPL AG, Switzerland
+ * email:support@mpl.ch
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+/* This is the CAN driver for the PIP5,PIP6,PIP7 and PIP8 
+ * Packaged Industrial PCs of MPL AG, Switzerland. 
+ */
+
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pip.h"
+#include "../include/i82527.h"
+/* PIP Specific Extension registers */
+#define PIP_CANRES_REG 0x804   /* CAN Resources */
+#define PIP_CANCTRL_REG (PIP_CANRES_REG+1)     /* CAN Control */
+/* Interrupt maps for the various PIP variants, see user manual */
+#define PIP5_IRQ_MAP 0x4F6D
+#define PIP6_IRQ_MAP 0xDEF8
+#define PIP7_IRQ_MAP 0x3768
+#define PIP8_IRQ_MAP 0x3768
+
+int pip_request_io(struct candevice_t *candev)
+{
+       if ((candev->io_addr != 0x1000) && (candev->io_addr != 0x8000)
+           && (candev->io_addr != 0xe000)) {
+               CANMSG("Invalid base io address\n");
+               CANMSG
+                   ("Valid values for the PIP are: 0x1000, 0x8000 or 0xe000\n");
+               CANMSG("Please consult your user manual.\n");
+               return -ENODEV;
+       }
+       if (!can_request_io_region(candev->io_addr, 0x100, DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n", candev->io_addr);
+               return -ENODEV;
+       } else
+           if (!can_request_io_region(PIP_CANRES_REG, 0x02, DEVICE_NAME))
+       {
+               can_release_io_region(candev->io_addr, 0x100);
+               CANMSG("Unable to open port: 0x%x\n", PIP_CANRES_REG);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n",
+                        candev->io_addr, candev->io_addr + 0x100 - 1);
+               DEBUGMSG("Registered IO-memory : 0x%x - 0x%x\n",
+                        PIP_CANRES_REG, PIP_CANCTRL_REG);
+       }
+       return 0;
+}
+
+int pip_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr, 0x100);
+       can_release_io_region(PIP_CANRES_REG, 0x02);
+
+       return 0;
+}
+
+int pip_reset(struct candevice_t *candev)
+{
+       int i = 0;
+
+       DEBUGMSG("Resetting %s hardware ...\n", candev->hwname);
+       while (i < 1000000) {
+               i++;
+               outb(0x01, candev->res_addr);
+       }
+       outb(0x0, candev->res_addr);
+
+       /* Check hardware reset status */
+       i = 0;
+       while ((inb(candev->io_addr + iCPU) & iCPU_RST) && (i <= 15)) {
+               udelay(20000);
+               i++;
+       }
+       if (i >= 15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       } else
+               DEBUGMSG("Chip0 reset status ok.\n");
+
+
+       return 0;
+}
+
+int pip_init_hw_data(struct candevice_t *candev)
+{
+       candev->res_addr = PIP_CANCTRL_REG;
+       candev->nr_82527_chips = 1;
+       candev->nr_sja1000_chips = 0;
+       candev->nr_all_chips = 1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+int pip_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr = candev->io_addr;
+       candev->chip[chipnr]->clock = 8000000;
+       candev->chip[chipnr]->int_cpu_reg = 0;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+       candev->chip[chipnr]->sja_cdr_reg = 0;
+       candev->chip[chipnr]->sja_ocr_reg = 0;
+
+       return 0;
+}
+
+int pip_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr =
+           chip->chip_base_addr + (objnr + 1) * 0x10;
+
+       return 0;
+}
+
+int pip_program_irq(struct candevice_t *candev)
+{
+       unsigned int irq_mask;
+       unsigned char can_addr = 0, can_reg = 0;
+       DEBUGMSG("pip_program_irq\n");
+       /* Reset can controller */
+       outb(0x01, candev->res_addr);
+       if (strcmp(candev->hwname, "pip5") == 0) {
+               irq_mask = PIP5_IRQ_MAP;
+       } else if (strcmp(candev->hwname, "pip6") == 0) {
+               irq_mask = PIP6_IRQ_MAP;
+       } else if (strcmp(candev->hwname, "pip7") == 0) {
+               irq_mask = PIP7_IRQ_MAP;
+       } else if (strcmp(candev->hwname, "pip8") == 0) {
+               irq_mask = PIP8_IRQ_MAP;
+       } else {
+               CANMSG("Unsupported PIP specified.\n");
+               return -ENODEV;
+       }
+       if ((candev->chip[0]->chip_irq < 1)
+           || (candev->chip[0]->chip_irq > 15)) {
+               CANMSG("Interrupt specified does not exist.\n");
+               return -ENODEV;
+       }
+       if (((0x01 << (candev->chip[0]->chip_irq - 1)) & irq_mask) == 0) {
+               CANMSG("Invalid Interrupt specified %d\n",
+                      candev->chip[0]->chip_irq);
+               return -ENODEV;
+       }
+
+       /* set the IRQ routing of the board accordingly */
+       switch (candev->io_addr) {
+       case 0x1000:{
+                       can_addr = 0x01;
+                       break;
+               }
+       case 0x8000:{
+                       can_addr = 0x02;
+                       break;
+               }
+       case 0xe000:{
+                       can_addr = 0x03;
+                       break;
+               }
+       default:{
+                       CANMSG
+                           ("Supplied io address is not valid, please check your manual\n");
+                       return -ENODEV;
+               }
+       }
+       can_reg = inb(PIP_CANRES_REG);
+       DEBUGMSG("PIP_CANRES was 0x%x\n", can_reg);
+       can_reg = (candev->chip[0]->chip_irq << 4) | can_addr;
+       DEBUGMSG("Setting PIP_CANRES_REG to 0x%x\n", can_reg);
+       outb((candev->chip[0]->chip_irq << 4) | can_addr, PIP_CANRES_REG);
+       /* re-enable the chip */
+       outb(0x00, candev->res_addr);
+
+       return 0;
+}
+
+
+void pip_write_register(unsigned data, unsigned long address)
+{
+       outb(data, address);
+}
+
+unsigned pip_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+/* !!! Don't change these functions !!! */
+int pip_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = pip_request_io;
+       hwspecops->release_io = pip_release_io;
+       hwspecops->reset = pip_reset;
+       hwspecops->init_hw_data = pip_init_hw_data;
+       hwspecops->init_chip_data = pip_init_chip_data;
+       hwspecops->init_obj_data = pip_init_obj_data;
+       hwspecops->write_register = pip_write_register;
+       hwspecops->read_register = pip_read_register;
+       hwspecops->program_irq = pip_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/proc.c b/lincan-0.3.3/src/proc.c
new file mode 100644 (file)
index 0000000..3957e5f
--- /dev/null
@@ -0,0 +1,329 @@
+/* proc.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/proc.h"
+#include "../include/setup.h"
+
+#define __NO_VERSION__
+#include <linux/module.h>
+
+int add_channel_to_procdir(struct candevice_t *candev);
+int remove_channel_from_procdir(void);
+int add_object_to_procdir(int chip_nr);
+int remove_object_from_procdir(int chip_nr);
+
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0))
+static int can_proc_readlink(struct proc_dir_entry *ent, char *page);
+#endif
+
+static int cc=0; /* static counter for each CAN chip */
+
+static struct canproc_t can_proc_base;
+static struct canproc_t *base=&can_proc_base;
+
+/* The following functions are needed only for kernel version 2.2. Kernel
+ * version 2.4 already defines them for us.
+ */
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0))
+static void can_fill_inode(struct inode *inode, int fill)
+{
+       if (fill)
+               MOD_INC_USE_COUNT;
+       else
+               MOD_DEC_USE_COUNT;
+}
+
+static struct proc_dir_entry * can_create_proc_entry(const char *name, mode_t mode,
+                                       struct proc_dir_entry *parent)
+{
+       struct proc_dir_entry *new_entry = NULL;
+       char *namestore;
+       int namelen;
+       
+       if(!name || !parent)
+               return NULL;
+       namelen=strlen(name);
+       if(!namelen)
+               return NULL;
+
+       new_entry = (struct proc_dir_entry *) 
+                       can_checked_malloc(sizeof(struct proc_dir_entry)+namelen+1);
+
+       if (new_entry == NULL)
+               return NULL;
+
+       memset(new_entry, 0, sizeof(struct proc_dir_entry));
+
+       /* Store copy of the proc entry name */
+       namestore = ((char *) new_entry) + sizeof(struct proc_dir_entry);
+       memcpy(namestore, name, namelen + 1);
+
+       new_entry->low_ino = 0;
+       new_entry->namelen = namelen;
+       new_entry->name = namestore;
+       new_entry->mode = mode;
+       new_entry->nlink = 0;
+       new_entry->fill_inode = can_fill_inode;
+       new_entry->parent = parent;
+
+       proc_register(parent, new_entry);
+
+       return new_entry;
+}
+
+static int can_remove_proc_entry(struct proc_dir_entry *del, struct proc_dir_entry *parent)
+{
+       if (del != NULL) {
+               proc_unregister(parent, del->low_ino);
+               can_checked_free(del);
+               return 0;
+       }
+       else return -ENODEV;
+}
+
+
+static int can_proc_readlink(struct proc_dir_entry *ent, char *page)
+{
+       char *link_dest = (char*)ent->data;
+       
+       strcpy(page, link_dest);
+       return strlen(link_dest);
+}
+
+
+
+/* This compatibility version of proc_symlink does not store local copy of destination */
+static inline struct proc_dir_entry *can_proc_symlink(const char *name,
+                struct proc_dir_entry *parent, const char *dest)
+{
+       struct proc_dir_entry *entry;
+       
+       
+       entry = can_create_proc_entry(name, S_IFLNK | S_IRUGO | S_IWUGO | S_IXUGO, parent);
+       if (entry == NULL)
+               return NULL;
+       entry->readlink_proc = can_proc_readlink;
+       entry->data = dest;
+       return entry;
+}
+
+#else /* Functions forwarded for kernel 2.4 and above */
+
+static inline struct proc_dir_entry * can_create_proc_entry(const char *name, mode_t mode,
+                                       struct proc_dir_entry *parent)
+{
+       return create_proc_entry(name, mode, parent);
+}
+
+
+/* This does not fully follow linux 2.4 and 2.6 prototype to simplify 2.2.x compatibility */
+/* The newer kernels use entry name instead of pointer to the entry */
+static int can_remove_proc_entry(struct proc_dir_entry *del, struct proc_dir_entry *parent)
+{
+       if(!del) return -ENODEV;
+       remove_proc_entry(del->name,parent);
+       return 0;
+}
+
+static inline struct proc_dir_entry *can_proc_symlink(const char *name,
+                struct proc_dir_entry *parent, const char *dest)
+{
+       return proc_symlink(name, parent, dest);
+}
+
+#endif /* Functions required for kernel 2.2 */
+
+/* can_init_procdir registers the entire CAN directory tree recursively at
+ * the proc system.
+ */
+int can_init_procdir(void)
+{
+       int board;
+       struct candevice_t *candev;
+       base->can_proc_entry = can_create_proc_entry("can", S_IFDIR | S_IRUGO | 
+                                       S_IXUGO, &proc_root);
+       if (base->can_proc_entry == NULL)
+               return -ENODEV;
+
+       for (board=0; board<hardware_p->nr_boards; board++) {
+               candev=hardware_p->candevice[board];
+               if(candev) add_channel_to_procdir(candev);
+       } 
+
+       return 0;
+}
+
+/* can_delete_procdir removes the entire CAN tree from the proc system */
+int can_delete_procdir(void)
+{
+       if (remove_channel_from_procdir()) 
+               return -ENODEV;
+       /* name: "can" */
+       if (can_remove_proc_entry(base->can_proc_entry, &proc_root)) 
+               return -ENODEV;
+
+       return 0;
+}
+
+static int can_chip_procinfo(char *buf, char **start, off_t offset, 
+                int count, int *eof, void *data)
+{
+       struct canchip_t *chip=data;
+       int len=0;
+
+       /* Generic chip info */
+       len += sprintf(buf+len,"type    : %s\n",chip->chip_type);
+       len += sprintf(buf+len,"index   : %d\n",chip->chip_idx);
+       len += sprintf(buf+len,"irq     : %d\n",chip->chip_irq);
+       len += sprintf(buf+len,"addr    : %lu\n",chip->chip_base_addr);
+       len += sprintf(buf+len,"config  : %s\n",
+                      (chip->flags & CHIP_CONFIGURED) ? "yes":"no");
+       len += sprintf(buf+len,"clock   : %ld Hz\n",chip->clock);
+       len += sprintf(buf+len,"baud    : %ld\n",chip->baudrate);
+       len += sprintf(buf+len,"num obj : %d\n",chip->max_objects);
+
+
+#if 0
+       /* Chip specific info if available */
+       if(chip->chipspecops->get_info)
+               len += (chip->chipspecops->get_info)(chip,buf+len);
+#endif
+
+       *eof = 1;
+       return len;
+}
+
+
+int add_channel_to_procdir(struct candevice_t *candev)
+{
+       int i=0;
+
+       for (i=0; i < candev->nr_all_chips; i++) {
+
+               base->channel[cc] = (struct channelproc_t *)
+                       can_checked_malloc(sizeof(struct channelproc_t));
+               if (base->channel[cc] == NULL)
+                       return -ENOMEM;
+
+               sprintf(base->channel[cc]->ch_name, "channel%d",cc);
+                                               
+               base->channel[cc]->ch_entry = can_create_proc_entry(
+                                               base->channel[cc]->ch_name,
+                                               S_IFDIR | S_IRUGO |S_IXUGO,
+                                               base->can_proc_entry);
+
+               if (base->channel[cc]->ch_entry == NULL)
+                       return -ENODEV;
+
+               add_object_to_procdir(cc);
+
+               create_proc_read_entry("chip_info",        /* proc entry name */
+                                      0,                  /* protection mask, 0->default */
+                                      base->channel[cc]->ch_entry,  /* parent dir, NULL->/proc */
+                                      can_chip_procinfo,
+                                      candev->chip[i]);
+
+               cc++;
+       } 
+
+       return 0;
+}
+
+int remove_channel_from_procdir(void)
+{
+       
+       while (cc != 0) {
+               cc--;
+               
+               if(!base->channel[cc]) continue;
+
+               remove_proc_entry("chip_info", base->channel[cc]->ch_entry);
+               
+               if (remove_object_from_procdir(cc))
+                       return -ENODEV; 
+                       
+               /* name: base->channel[cc]->ch_name */
+               if (can_remove_proc_entry(base->channel[cc]->ch_entry,
+                                                       base->can_proc_entry))
+                       return -ENODEV;
+                       
+               can_checked_free(base->channel[cc]);
+               base->channel[cc] = NULL;
+       }
+
+       return 0;
+}
+
+
+int add_object_to_procdir(int chip_nr)
+{
+       int i, max_objects;
+
+       max_objects=chips_p[chip_nr]->max_objects;
+
+       for (i=0; i<max_objects; i++) {
+               base->channel[chip_nr]->object[i] = (struct objectproc_t *)
+                       can_checked_malloc(sizeof(struct objectproc_t));
+
+               if (base->channel[chip_nr]->object[i] == NULL)
+                       return -ENOMEM;
+
+               sprintf(base->channel[chip_nr]->object[i]->obj_name,"object%d",i);
+               sprintf(base->channel[chip_nr]->object[i]->lnk_name,"dev");
+                                                               
+               base->channel[chip_nr]->object[i]->obj_entry = can_create_proc_entry(
+                               base->channel[chip_nr]->object[i]->obj_name,
+                               S_IFDIR | S_IRUGO | S_IXUGO,
+                               base->channel[chip_nr]->ch_entry);
+               if (base->channel[chip_nr]->object[i]->obj_entry == NULL)
+                       return -ENODEV;
+
+               sprintf(base->channel[chip_nr]->object[i]->lnk_dev,"/dev/can%d",
+                       chips_p[chip_nr]->msgobj[i]->minor);
+
+               base->channel[chip_nr]->object[i]->lnk = can_proc_symlink(
+                               base->channel[chip_nr]->object[i]->lnk_name,
+                               base->channel[chip_nr]->object[i]->obj_entry,
+                               base->channel[chip_nr]->object[i]->lnk_dev);
+               if (base->channel[chip_nr]->object[i]->lnk == NULL)
+                       return -ENODEV;
+
+       }
+       return 0;
+} 
+
+int remove_object_from_procdir(int chip_nr)
+{
+       int i=0, obj=0;
+
+       obj=chips_p[chip_nr]->max_objects;
+
+       for (i=0; i<obj; i++) {
+               if(!base->channel[chip_nr]->object[i]) continue;
+               
+               /* name: base->channel[chip_nr]->object[i]->lnk_name */
+               if (can_remove_proc_entry( base->channel[chip_nr]->object[i]->lnk,
+                               base->channel[chip_nr]->object[i]->obj_entry))  
+                       return -ENODEV;
+               /* name: base->channel[chip_nr]->object[i]->obj_name */
+               if (can_remove_proc_entry(
+                               base->channel[chip_nr]->object[i]->obj_entry,
+                               base->channel[chip_nr]->ch_entry))
+                       return -ENODEV;
+
+               can_checked_free(base->channel[chip_nr]->object[i]);
+
+               base->channel[chip_nr]->object[i]=NULL;
+       }
+       return 0;
+}
+
diff --git a/lincan-0.3.3/src/read.c b/lincan-0.3.3/src/read.c
new file mode 100644 (file)
index 0000000..a6f5305
--- /dev/null
@@ -0,0 +1,76 @@
+/* read.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/read.h"
+
+/* This is the 'Normal' read handler for normal transmission messages */
+ssize_t can_read(struct file *file, char *buffer, size_t length, loff_t *offset)
+{
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct canque_ends_t *qends;
+       int bytes_to_copy;
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       int ret;
+
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_read: bad canuser magic\n");
+               return -ENODEV;
+       }
+
+       if (length < sizeof(struct canmsg_t)) {
+               DEBUGMSG("Trying to read less bytes than a CAN message, \n");
+               DEBUGMSG("this will always return zero.\n");
+               return 0;
+       }
+
+       qends = canuser->qends;
+
+       ret=canque_test_outslot(qends, &qedge, &slot);
+       if(ret<0){
+               if (file->f_flags & O_NONBLOCK) {
+                       return -EAGAIN;
+               }
+               ret=canque_get_outslot_wait_kern(qends, &qedge, &slot);
+               if(ret<0){
+                       if (signal_pending(current)) {
+                               DEBUGMSG("Rx interrupted\n");
+                               return -EINTR;
+                       }
+                       /*if (!can_timeout) {
+                               DEBUGMSG("no data received\n");
+                               return 0;
+                       }*/
+                       return -EIO;
+               }
+       }
+       
+       ret = copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
+       canque_free_outslot(qends, qedge, slot);
+       buffer += sizeof(struct canmsg_t);
+       bytes_to_copy = length-sizeof(struct canmsg_t);
+       if(ret) return -EFAULT;
+       
+       while (bytes_to_copy > 0) {
+               ret=canque_test_outslot(qends, &qedge, &slot);
+               if(ret<0)
+                       break;
+               ret = copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
+               canque_free_outslot(qends, qedge, slot);
+               buffer += sizeof(struct canmsg_t);
+               bytes_to_copy -= sizeof(struct canmsg_t);
+               if(ret) return -EFAULT;
+       }
+
+       return length-bytes_to_copy;
+}
+
diff --git a/lincan-0.3.3/src/read_rtl.c b/lincan-0.3.3/src/read_rtl.c
new file mode 100644 (file)
index 0000000..ab36aa9
--- /dev/null
@@ -0,0 +1,93 @@
+/* read.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+
+/* This is the 'Normal' read handler for normal transmission messages */
+static inline 
+ssize_t can_std_read_rtl(struct canque_ends_t *qends, int nonblock_fl, 
+                       char *buffer, size_t length)
+{
+       int ret;
+       struct canmsg_t *msg_buff = (struct canmsg_t *)buffer;
+       int bytes_to_copy;
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       
+       ret=canque_test_outslot(qends, &qedge, &slot);
+       if(ret<0){
+               if (nonblock_fl) {
+                       return -EAGAIN;
+               }
+               ret=canque_get_outslot_wait_rtl(qends, &qedge, &slot);
+               if(ret<0){
+                       if (ret==-1) {
+                               DEBUGMSG("Rx interrupted\n");
+                               return -EINTR;
+                       }
+
+                       return -EIO;
+               }
+       }
+       *(msg_buff++)=slot->msg;
+       canque_free_outslot(qends, qedge, slot);
+       bytes_to_copy = length-sizeof(struct canmsg_t);
+       
+       while (bytes_to_copy > 0) {
+               ret=canque_test_outslot(qends, &qedge, &slot);
+               if(ret<0)
+                       break;
+               *(msg_buff++)=slot->msg;
+               canque_free_outslot(qends, qedge, slot);
+               bytes_to_copy -= sizeof(struct canmsg_t);
+       }
+
+       return length-bytes_to_copy;
+}
+
+
+ssize_t can_read_rtl_posix(struct rtl_file *fptr, char *buffer,
+                               size_t length, loff_t *ppos)
+{
+       struct canuser_t *canuser = 
+               (struct canuser_t *)can_get_rtl_file_private_data(fptr);
+       struct canque_ends_t *qends;
+       int      ret;
+
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_read_rtl_posix: bad canuser magic\n");
+               return -ENODEV;
+       }
+
+       if (length < sizeof(struct canmsg_t)) {
+               DEBUGMSG("Trying to read less bytes than a CAN message, \n");
+               DEBUGMSG("this will always return zero.\n");
+               return 0;
+       }
+
+       qends = canuser->qends;
+
+       /*if (((struct canmsg_t *)buffer)->flags & MSG_RTR)
+               ret = can_rtr_read(chip, obj, buffer);
+       else*/
+               ret = can_std_read_rtl(qends, fptr->f_flags & O_NONBLOCK,
+                       buffer, length);
+
+       return ret;
+}
+
+#endif /*CAN_WITH_RTL*/
+
diff --git a/lincan-0.3.3/src/select.c b/lincan-0.3.3/src/select.c
new file mode 100644 (file)
index 0000000..f9636f9
--- /dev/null
@@ -0,0 +1,67 @@
+/* select.c
+ * Header file for the Linux CAN-bus driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Added by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <linux/poll.h>
+#include "../include/select.h"
+
+unsigned int can_poll(struct file *file, poll_table *wait)
+{
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct canque_ends_t *qends;
+       struct msgobj_t *obj;
+        unsigned int mask = 0;
+       struct canque_edge_t *edge;
+       int full=0;
+       int i;
+
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_close: bad canuser magic\n");
+               return -ENODEV;
+       }
+       
+       obj = canuser->msgobj;
+       qends = canuser->qends;
+
+        if (file->f_mode & FMODE_READ) {
+                poll_wait(file, &qends->endinfo.fileinfo.readq, wait);
+               for(i=CANQUEUE_PRIO_NR;--i>=0;) {
+                       if(!list_empty(&qends->active[i]))
+                               mask |= POLLIN | POLLRDNORM;
+               }
+        }
+
+        if ((file->f_mode & FMODE_WRITE) && !(file->f_flags & O_SYNC)) {
+                poll_wait(file, &qends->endinfo.fileinfo.writeq, wait);
+
+               canque_for_each_inedge(qends, edge) {
+                       if(canque_fifo_test_fl(&edge->fifo,FULL))
+                               full=1;
+               }
+
+               if(!full)
+                       mask |= POLLOUT | POLLWRNORM;
+       }
+
+        if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_SYNC)) {
+                poll_wait(file, &qends->endinfo.fileinfo.emptyq, wait);
+
+               canque_for_each_inedge(qends, edge) {
+                       if(!canque_fifo_test_fl(&edge->fifo,EMPTY))
+                               full=1;
+               }
+
+               if(!full)
+                       mask |= POLLOUT | POLLWRNORM;
+       }
+       return mask;
+}
diff --git a/lincan-0.3.3/src/setup.c b/lincan-0.3.3/src/setup.c
new file mode 100644 (file)
index 0000000..ac83789
--- /dev/null
@@ -0,0 +1,395 @@
+/* setup.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/devcommon.h"
+#include "../include/setup.h"
+#include "../include/finish.h"
+
+int init_hwspecops(struct candevice_t *candev, int *irqnum_p);
+int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p);
+int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate);
+int init_obj_struct(struct candevice_t *candev, struct canchip_t *hostchip, int objnr);
+
+/**
+ * can_base_addr_fixup - relocates board physical memory addresses to the CPU accessible ones
+ * @candev: pointer to the previously filled device/board, chips and message objects structures
+ * @new_base: @candev new base address
+ *
+ * This function adapts base addresses of all structures of one board
+ * to the new board base address.
+ * It is required for translation between physical and virtual address mappings.
+ * This function is prepared to simplify board specific xxx_request_io() function
+ * for memory mapped devices.
+ */
+int can_base_addr_fixup(struct candevice_t *candev, unsigned long new_base)
+{
+       unsigned long offs;
+       int i, j;
+       
+       offs=new_base-candev->dev_base_addr;
+       candev->dev_base_addr=new_base;
+       for(i=0;i<candev->nr_all_chips;i++){
+               candev->chip[i]->chip_base_addr += offs;
+               for(j=0;j<candev->chip[i]->max_objects;j++)
+                       candev->chip[i]->msgobj[j]->obj_base_addr += offs;
+       }
+       return 0;
+}
+
+/**
+ * can_check_dev_taken - checks if bus device description is already taken by driver
+ * @anydev:    pointer to bus specific Linux device description 
+ *
+ * Returns: Returns 1 if device is already used by LinCAN driver, 0 otherwise.
+ */
+int can_check_dev_taken(void *anydev)
+{
+       int board_nr;
+       struct candevice_t *candev;
+       void *boarddev;
+
+       for (board_nr=hardware_p->nr_boards; board_nr--; ) {
+               if((candev=hardware_p->candevice[board_nr])==NULL)
+                       continue;
+               boarddev=candev->sysdevptr.anydev;
+               if(boarddev == anydev)
+                       return 1;
+       }
+       
+       return 0;
+}
+
+
+/**
+ * register_obj_struct - registers message object into global array
+ * @obj: the initialized message object being registered
+ * @minorbase: wanted minor number, if (-1) automatically selected
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int register_obj_struct(struct msgobj_t *obj, int minorbase)
+{
+       static int next_minor=0;
+       int i;
+       
+       if(minorbase>=0)
+               next_minor=minorbase;
+       if(next_minor>=MAX_TOT_MSGOBJS)
+               next_minor=0;
+       i=next_minor;
+       do{
+               if(objects_p[i]==NULL){
+                       objects_p[i]=obj;
+                       obj->minor=i;
+                       next_minor=i+1;
+                       return 0;
+               }
+               if(++i >= MAX_TOT_MSGOBJS) i=0;
+       }while(i!=next_minor);
+       obj->minor=-1;
+       return -1;
+}
+
+
+/**
+ * register_chip_struct - registers chip into global array
+ * @chip: the initialized chip structure being registered
+ * @minorbase: wanted minor number base, if (-1) automatically selected
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int register_chip_struct(struct canchip_t *chip, int minorbase)
+{
+       static int next_chip_slot=0;
+       int i;
+       
+       if(next_chip_slot>=MAX_TOT_CHIPS)
+               next_chip_slot=0;
+       i=next_chip_slot;
+       do{
+               if(chips_p[i]==NULL){
+                       chips_p[i]=chip;
+
+                       next_chip_slot=i+1;
+                       return 0;
+               }
+               if(++i >= MAX_TOT_CHIPS) i=0;
+       }while(i!=next_chip_slot);
+       return -1;
+}
+
+
+
+/**
+ * init_hw_struct - initializes driver hardware description structures
+ *
+ * The function init_hw_struct() is used to initialize the hardware structure.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int init_hw_struct(void)
+{
+       int i=0;
+       int irq_param_idx=0;
+       int chan_param_idx=0;
+
+       hardware_p->nr_boards=0;
+       while ( (hw[i] != NULL) & (i < MAX_HW_CARDS) ) {
+               hardware_p->nr_boards++;
+
+               if (init_device_struct(i, &chan_param_idx, &irq_param_idx)) {
+                       CANMSG("Error initializing candevice_t structures.\n");
+                       return -ENODEV;
+               }
+               i++;
+       }
+
+       return 0;
+}
+
+/**
+ * init_device_struct - initializes single CAN device/board
+ * @card: index into @hardware_p HW description
+ * @chan_param_idx_p: pointer to the index into arrays of the CAN channel parameters
+ * @irq_param_idx_p: pointer to the index into arrays of the per CAN channel IRQ parameters
+ *
+ * The function builds representation of the one board from parameters provided
+ * in the module parameters arrays: 
+ *     @hw[card] .. hardware type,
+ *     @io[card] .. base IO address,
+ *     @baudrate[chan_param_idx] .. per channel baudrate,
+ *     @minor[chan_param_idx] .. optional specification of requested channel minor base,
+ *     @irq[irq_param_idx] .. one or more board/chips IRQ parameters.
+ * The indexes are advanced after consumed parameters if the registration is successful.
+ *
+ * The hardware specific operations of the device/board are initialized by call to
+ * init_hwspecops() function. Then board data are initialized by board specific 
+ * init_hw_data() function. Then chips and objects representation is build by
+ * init_chip_struct() function. If all above steps are successful, chips and
+ * message objects are registered into global arrays. 
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p)
+{
+       struct candevice_t *candev;
+       int ret;
+       int irqnum;
+       int chipnr;
+       long bd;
+       int irqsig=-1;
+       
+       candev=(struct candevice_t *)can_checked_malloc(sizeof(struct candevice_t));
+       if (candev==NULL)
+               return -ENOMEM;
+
+        memset(candev, 0, sizeof(struct candevice_t));
+
+       hardware_p->candevice[card]=candev;
+       candev->candev_idx=card;
+
+       candev=candev;
+
+       candev->hwname=hw[card];
+       candev->io_addr=io[card];
+       candev->dev_base_addr=io[card];
+
+       candev->hwspecops=(struct hwspecops_t *)can_checked_malloc(sizeof(struct hwspecops_t));
+       if (candev->hwspecops==NULL)
+               goto error_nomem;
+
+       memset(candev->hwspecops, 0, sizeof(struct hwspecops_t));
+
+       if (init_hwspecops(candev, &irqnum))
+               goto error_nodev;
+
+       if (candev->hwspecops->init_hw_data(candev))
+               goto error_nodev;
+
+       /* Alocate and initialize the chip structures */
+       for (chipnr=0; chipnr < candev->nr_all_chips; chipnr++) {
+
+               if(chipnr<irqnum)
+                       irqsig=irq[*irq_param_idx_p+chipnr];
+               
+               bd=baudrate[*chan_param_idx_p+chipnr];
+               if(!bd) bd=baudrate[0];
+       
+               if ((ret=init_chip_struct(candev, chipnr, irqsig, bd*1000)))
+                       goto error_chip;
+       }
+       
+
+
+       for (chipnr=0; chipnr < candev->nr_all_chips; chipnr++) {
+               int m=minor[*chan_param_idx_p+chipnr];
+               struct canchip_t *chip=candev->chip[chipnr];
+               int objnr;
+
+               register_chip_struct(chip, m);
+               
+               for (objnr=0; objnr<chip->max_objects; objnr++) {
+                       register_obj_struct(chip->msgobj[objnr], m);
+                       if(m>=0) m++;
+               }
+       }
+
+       *irq_param_idx_p += irqnum;
+       *chan_param_idx_p += candev->nr_all_chips;
+
+       return 0;
+
+    error_nodev:
+       ret=-ENODEV;
+    error_chip:
+       candevice_done(candev);
+       goto error_both;
+
+    error_nomem:
+       ret=-ENOMEM;
+
+    error_both:
+       hardware_p->candevice[card]=NULL;
+       can_checked_free(candev);
+       return ret;
+       
+}
+
+/**
+ * init_chip_struct - initializes one CAN chip structure
+ * @candev: pointer to the corresponding CAN device/board
+ * @chipnr: index of the chip in the corresponding device/board structure
+ * @irq: chip IRQ number or (-1) if not appropriate
+ * @baudrate: baudrate in the units of 1Bd
+ *
+ * Chip structure is allocated and chip specific operations are filled by 
+ * call to board specific init_chip_data() which calls chip specific
+ * fill_chipspecops(). The message objects are generated by 
+ * calls to init_obj_struct() function.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate)
+{
+       struct canchip_t *chip;
+       int objnr;
+       int ret;
+
+       candev->chip[chipnr]=(struct canchip_t *)can_checked_malloc(sizeof(struct canchip_t));
+       if ((chip=candev->chip[chipnr])==NULL)
+               return -ENOMEM;
+
+        memset(chip, 0, sizeof(struct canchip_t));
+
+       chip->write_register=candev->hwspecops->write_register;
+       chip->read_register=candev->hwspecops->read_register;
+
+       chip->chipspecops=can_checked_malloc(sizeof(struct chipspecops_t));
+       if (chip->chipspecops==NULL)
+               return -ENOMEM;
+       memset(chip->chipspecops,0,sizeof(struct chipspecops_t));
+
+       chip->chip_idx=chipnr;
+       chip->hostdevice=candev;
+       chip->chip_irq=irq;
+       chip->baudrate=baudrate;
+       chip->flags=0x0;
+
+       if(candev->hwspecops->init_chip_data(candev,chipnr)<0)
+               return -ENODEV;
+
+       for (objnr=0; objnr<chip->max_objects; objnr++) {
+               ret=init_obj_struct(candev, chip, objnr);
+               if(ret<0) return ret;
+       }
+
+       return 0;
+}
+
+
+/**
+ * init_obj_struct - initializes one CAN message object structure
+ * @candev: pointer to the corresponding CAN device/board
+ * @hostchip: pointer to the chip containing this object
+ * @objnr: index of the builded object in the chip structure
+ *
+ * The function initializes message object structure and allocates and initializes
+ * CAN queue chip ends structure.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int init_obj_struct(struct candevice_t *candev, struct canchip_t *hostchip, int objnr)
+{
+       struct canque_ends_t *qends;
+       struct msgobj_t *obj;
+       int ret;
+
+       obj=(struct msgobj_t *)can_checked_malloc(sizeof(struct msgobj_t));
+       hostchip->msgobj[objnr]=obj;
+       if (obj == NULL) 
+               return -ENOMEM;
+
+        memset(obj, 0, sizeof(struct msgobj_t));
+       obj->minor=-1;
+
+       atomic_set(&obj->obj_used,0);
+       INIT_LIST_HEAD(&obj->obj_users);
+       init_timer(&obj->tx_timeout);
+
+       qends = (struct canque_ends_t *)can_checked_malloc(sizeof(struct canque_ends_t));
+       if(qends == NULL) return -ENOMEM;
+       memset(qends, 0, sizeof(struct canque_ends_t));
+       obj->hostchip=hostchip;
+       obj->object=objnr+1;
+       obj->qends=qends;
+       obj->tx_qedge=NULL;
+       obj->tx_slot=NULL;
+       obj->obj_flags = 0x0;
+
+       ret=canqueue_ends_init_chip(qends, hostchip, obj);
+       if(ret<0) return ret;
+
+       ret=candev->hwspecops->init_obj_data(hostchip,objnr);
+       if(ret<0) return ret;
+       
+       return 0;
+}
+
+
+/**
+ * init_hwspecops - finds and initializes board/device specific operations
+ * @candev: pointer to the corresponding CAN device/board
+ * @irqnum_p: optional pointer to the number of interrupts required by board
+ *
+ * The function searches board @hwname in the list of supported boards types.
+ * The board type specific board_register() function is used to initialize
+ * @hwspecops operations.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int init_hwspecops(struct candevice_t *candev, int *irqnum_p)
+{
+       const struct boardtype_t *brp;
+       
+       brp = boardtype_find(candev->hwname);
+       
+       if(!brp) {
+               CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",candev->hwname);
+               return -EINVAL;
+       }
+       
+       if(irqnum_p)
+               *irqnum_p=brp->irqnum;
+       brp->board_register(candev->hwspecops);
+
+       return 0;
+}
diff --git a/lincan-0.3.3/src/sja1000.c b/lincan-0.3.3/src/sja1000.c
new file mode 100644 (file)
index 0000000..71c7095
--- /dev/null
@@ -0,0 +1,529 @@
+/* sja1000.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000.h"
+
+void sja1000_irq_read_handler(struct canchip_t *chip, struct msgobj_t *obj);
+void sja1000_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj);
+
+int sja1000_enable_configuration(struct canchip_t *chip)
+{
+       int i=0;
+       unsigned flags;
+
+       can_disable_irq(chip->chip_irq);
+
+       flags=can_read_reg(chip,SJACR);
+
+       while ((!(flags & sjaCR_RR)) && (i<=10)) {
+               can_write_reg(chip,flags|sjaCR_RR,SJACR);
+               udelay(100);
+               i++;
+               flags=can_read_reg(chip,SJACR);
+       }
+       if (i>=10) {
+               CANMSG("Reset error\n");
+               can_enable_irq(chip->chip_irq);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+int sja1000_disable_configuration(struct canchip_t *chip)
+{
+       int i=0;
+       unsigned flags;
+
+       flags=can_read_reg(chip,SJACR);
+
+       while ( (flags & sjaCR_RR) && (i<=10) ) {
+               can_write_reg(chip,flags & (sjaCR_RIE|sjaCR_TIE|sjaCR_EIE|sjaCR_OIE),SJACR);
+               udelay(100);
+               i++;
+               flags=can_read_reg(chip,SJACR);
+       }
+       if (i>=10) {
+               CANMSG("Error leaving reset status\n");
+               return -ENODEV;
+       }
+
+       can_enable_irq(chip->chip_irq);
+
+       return 0;
+}
+
+int sja1000_chip_config(struct canchip_t *chip)
+{
+       if (sja1000_enable_configuration(chip))
+               return -ENODEV;
+
+       /* Set mode, clock out, comparator */
+       can_write_reg(chip,chip->sja_cdr_reg,SJACDR); 
+       /* Set driver output configuration */
+       can_write_reg(chip,chip->sja_ocr_reg,SJAOCR); 
+
+       if (sja1000_standard_mask(chip,0x0000, 0xffff))
+               return -ENODEV;
+       
+       if (!chip->baudrate)
+               chip->baudrate=1000000;
+       if (sja1000_baud_rate(chip,chip->baudrate,chip->clock,0,75,0))
+               return -ENODEV;
+
+       /* Enable hardware interrupts */
+       can_write_reg(chip,(sjaCR_RIE|sjaCR_TIE|sjaCR_EIE|sjaCR_OIE),SJACR); 
+
+       sja1000_disable_configuration(chip);
+       
+       return 0;
+}
+
+int sja1000_standard_mask(struct canchip_t *chip, unsigned short code, unsigned short mask)
+{
+       unsigned char write_code, write_mask;
+
+       if (sja1000_enable_configuration(chip))
+               return -ENODEV;
+
+       /* The acceptance code bits (SJAACR bits 0-7) and the eight most 
+        * significant bits of the message identifier (id.10 to id.3) must be
+        * equal to those bit positions which are marked relevant by the 
+        * acceptance mask bits (SJAAMR bits 0-7).
+        * (id.10 to id.3) = (SJAACR.7 to SJAACR.0) v (SJAAMR.7 to SJAAMR.0)
+        * (Taken from Philips sja1000 Data Sheet)
+        */
+       write_code = (unsigned char) code >> 3;
+       write_mask = (unsigned char) mask >> 3;
+       
+       can_write_reg(chip,write_code,SJAACR);
+       can_write_reg(chip,write_mask,SJAAMR);
+
+       DEBUGMSG("Setting acceptance code to 0x%lx\n",(unsigned long)code);
+       DEBUGMSG("Setting acceptance mask to 0x%lx\n",(unsigned long)mask);
+
+       sja1000_disable_configuration(chip);
+
+       return 0;
+}
+
+/* Set communication parameters.
+ * param rate baud rate in Hz
+ * param clock frequency of sja1000 clock in Hz (ISA osc is 14318000)
+ * param sjw synchronization jump width (0-3) prescaled clock cycles
+ * param sampl_pt sample point in % (0-100) sets (TSEG1+2)/(TSEG1+TSEG2+3) ratio
+ * param flags fields BTR1_SAM, OCMODE, OCPOL, OCTP, OCTN, CLK_OFF, CBP
+ */
+int sja1000_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                                                       int sampl_pt, int flags)
+{
+       int best_error = 1000000000, error;
+       int best_tseg=0, best_brp=0, best_rate=0, brp=0;
+       int tseg=0, tseg1=0, tseg2=0;
+       
+       if (sja1000_enable_configuration(chip))
+               return -ENODEV;
+
+       clock /=2;
+
+       /* tseg even = round down, odd = round up */
+       for (tseg=(0+0+2)*2; tseg<=(MAX_TSEG2+MAX_TSEG1+2)*2+1; tseg++) {
+               brp = clock/((1+tseg/2)*rate)+tseg%2;
+               if (brp == 0 || brp > 64)
+                       continue;
+               error = rate - clock/(brp*(1+tseg/2));
+               if (error < 0)
+                       error = -error;
+               if (error <= best_error) {
+                       best_error = error;
+                       best_tseg = tseg/2;
+                       best_brp = brp-1;
+                       best_rate = clock/(brp*(1+tseg/2));
+               }
+       }
+       if (best_error && (rate/best_error < 10)) {
+               CANMSG("baud rate %d is not possible with %d Hz clock\n",
+                                                               rate, 2*clock);
+               CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
+                               best_rate, best_brp, best_tseg, tseg1, tseg2);
+               return -EINVAL;
+       }
+       tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
+       if (tseg2 < 0)
+               tseg2 = 0;
+       if (tseg2 > MAX_TSEG2)
+               tseg2 = MAX_TSEG2;
+       tseg1 = best_tseg-tseg2-2;
+       if (tseg1 > MAX_TSEG1) {
+               tseg1 = MAX_TSEG1;
+               tseg2 = best_tseg-tseg1-2;
+       }
+
+       DEBUGMSG("Setting %d bps.\n", best_rate);
+       DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
+                                       best_brp, best_tseg, tseg1, tseg2,
+                                       (100*(best_tseg-tseg2)/(best_tseg+1)));
+
+
+       can_write_reg(chip, sjw<<6 | best_brp, SJABTR0);
+       can_write_reg(chip, ((flags & BTR1_SAM) != 0)<<7 | tseg2<<4 | tseg1,
+                                                               SJABTR1);
+//     can_write_reg(chip, sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH | sjaOCR_TX1_ZZ, SJAOCR);
+       /* BASIC mode, bypass input comparator */
+//     can_write_reg(chip, sjaCDR_CBP| /* sjaCDR_CLK_OFF | */ 7, SJACDR);
+
+       sja1000_disable_configuration(chip);
+
+       return 0;
+}
+
+int sja1000_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int i;
+       
+       i=can_read_reg(chip,SJASR);
+       
+       if (!(i&sjaSR_RBS)) {
+//Temp
+               for (i=0; i<0x20; i++)
+                       CANMSG("0x%x is 0x%x\n",i,can_read_reg(chip,i));
+                       return 0;
+       }
+       sja1000_start_chip(chip);
+
+    // disable interrupts for a moment
+       can_write_reg(chip, 0, SJACR); 
+
+       sja1000_irq_read_handler(chip, obj);
+
+    // enable interrupts
+       can_write_reg(chip, sjaCR_OIE | sjaCR_EIE | sjaCR_TIE | sjaCR_RIE, SJACR);
+
+
+       return 1;
+}
+
+#define MAX_TRANSMIT_WAIT_LOOPS 10
+
+int sja1000_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       int i=0, id=0;
+       int len;
+
+       sja1000_start_chip(chip); //sja1000 goes automatically into reset mode on errors
+
+       /* Wait until Transmit Buffer Status is released */
+       while ( !(can_read_reg(chip, SJASR) & sjaSR_TBS) && 
+                                               i++<MAX_TRANSMIT_WAIT_LOOPS) {
+               udelay(i);
+       }
+       
+       if (!(can_read_reg(chip, SJASR) & sjaSR_TBS)) {
+               CANMSG("Transmit timed out, cancelling\n");
+               can_write_reg(chip, sjaCMR_AT, SJACMR);
+               i=0;
+               while ( !(can_read_reg(chip, SJASR) & sjaSR_TBS) &&
+                               i++<MAX_TRANSMIT_WAIT_LOOPS) {
+                       udelay(i);
+               }
+               if (!(can_read_reg(chip, SJASR) & sjaSR_TBS)) {
+                       CANMSG("Could not cancel, please reset\n");
+                       return -EIO;
+               }
+       }
+
+       len = msg->length;
+       if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+       id = (msg->id<<5) | ((msg->flags&MSG_RTR)?sjaID0_RTR:0) | len;
+
+       can_write_reg(chip, id>>8, SJATXID1);
+       can_write_reg(chip, id & 0xff , SJATXID0);
+
+       for (i=0; i<len; i++)
+               can_write_reg(chip, msg->data[i], SJATXDAT0+i);
+
+       return 0;
+}
+
+int sja1000_send_msg(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       can_write_reg(chip, sjaCMR_TR, SJACMR);
+
+       return 0;
+}
+
+int sja1000_check_tx_stat(struct canchip_t *chip)
+{
+       if (can_read_reg(chip,SJASR) & sjaSR_TCS)
+               return 0;
+       else
+               return 1;
+}
+
+int sja1000_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1)
+{
+       if (sja1000_enable_configuration(chip))
+               return -ENODEV;
+
+       can_write_reg(chip, btr0, SJABTR0);
+       can_write_reg(chip, btr1, SJABTR1);
+
+       sja1000_disable_configuration(chip);
+
+       return 0;
+}
+
+int sja1000_start_chip(struct canchip_t *chip)
+{
+       unsigned short flags = 0;
+
+       flags = can_read_reg(chip, SJACR) & (sjaCR_RIE|sjaCR_TIE|sjaCR_EIE|sjaCR_OIE);
+       can_write_reg(chip, flags, SJACR);
+
+       return 0;
+}
+
+int sja1000_stop_chip(struct canchip_t *chip)
+{
+       unsigned short flags = 0;
+
+       flags = can_read_reg(chip, SJACR) & (sjaCR_RIE|sjaCR_TIE|sjaCR_EIE|sjaCR_OIE);
+       can_write_reg(chip, flags|sjaCR_RR, SJACR);
+
+       return 0;
+}
+
+int sja1000_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int sja1000_release_chip(struct canchip_t *chip)
+{
+       sja1000_stop_chip(chip);
+       can_write_reg(chip,sjaCR_RR,SJACR);
+
+       return 0;
+}
+
+int sja1000_remote_request(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       CANMSG("sja1000_remote_request not implemented\n");
+       return -ENOSYS;
+}
+
+int sja1000_extended_mask(struct canchip_t *chip, unsigned long code,
+               unsigned long mask)
+{
+       CANMSG("sja1000_extended_mask not implemented\n");
+       return -ENOSYS;
+}
+
+int sja1000_clear_objects(struct canchip_t *chip)
+{
+       CANMSG("sja1000_clear_objects not implemented\n");
+       return -ENOSYS;
+}
+
+int sja1000_config_irqs(struct canchip_t *chip, short irqs)
+{
+       CANMSG("sja1000_config_irqs not implemented\n");
+       return -ENOSYS;
+}
+
+
+int sja1000_irq_handler(int irq, struct canchip_t *chip)
+{
+       unsigned irq_register;
+       struct msgobj_t *obj=chip->msgobj[0];
+       int loop_cnt=CHIP_MAX_IRQLOOP;
+
+       irq_register=can_read_reg(chip, SJAIR);
+//     DEBUGMSG("sja1000_irq_handler: SJAIR:%02x\n",irq_register);
+//     DEBUGMSG("sja1000_irq_handler: SJASR:%02x\n",
+//                                     can_read_reg(chip, SJASR));
+
+       if ((irq_register & (sjaIR_WUI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0)
+               return CANCHIP_IRQ_NONE;
+
+       do {
+
+               if(!loop_cnt--) {
+                       CANMSG("sja1000_irq_handler IRQ %d stuck\n",irq);
+                       return CANCHIP_IRQ_STUCK;
+               }
+
+               if ((irq_register & sjaIR_RI) != 0) 
+                       sja1000_irq_read_handler(chip, obj);
+
+               if ((irq_register & sjaIR_TI) != 0) { 
+                       can_msgobj_set_fl(obj,TX_REQUEST);
+                       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+                               can_msgobj_clear_fl(obj,TX_REQUEST);
+
+                               if (can_read_reg(chip, SJASR) & sjaSR_TBS)
+                                       sja1000_irq_write_handler(chip, obj);
+
+                               can_msgobj_clear_fl(obj,TX_LOCK);
+                               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+                       }
+               }
+
+               if ((irq_register & (sjaIR_EI|sjaIR_DOI)) != 0) { 
+                       // Some error happened
+// FIXME: chip should be brought to usable state. Transmission cancelled if in progress.
+// Reset flag set to 0 if chip is already off the bus. Full state report
+                       CANMSG("Error: status register: 0x%x irq_register: 0x%02x\n",
+                               can_read_reg(chip, SJASR), irq_register);
+                       obj->ret=-1;
+
+                       if(obj->tx_slot){
+                               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_BUS);
+                               /*canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+                               obj->tx_slot=NULL;*/
+                       }
+               }
+
+               irq_register=can_read_reg(chip, SJAIR);
+
+       } while(irq_register & (sjaIR_WUI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI));
+       
+       return CANCHIP_IRQ_HANDLED;
+}
+
+void sja1000_irq_read_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int i=0, id=0, len;
+
+       do {
+               id = can_read_reg(chip, SJARXID0) | (can_read_reg(chip, SJARXID1)<<8);
+               obj->rx_msg.length = len = id & 0x0f;
+               obj->rx_msg.flags = id&sjaID0_RTR ? MSG_RTR : 0;
+               obj->rx_msg.cob = 0;
+               obj->rx_msg.id = id>>5;
+
+               if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+               for (i=0; i<len; i++)
+                       obj->rx_msg.data[i]=can_read_reg(chip, SJARXDAT0 + i);
+
+               can_write_reg(chip, sjaCMR_RRB, SJACMR);
+
+               /* fill CAN message timestamp */
+               can_filltimestamp(&obj->rx_msg.timestamp);
+
+               canque_filter_msg2edges(obj->qends, &obj->rx_msg);
+       } while(can_read_reg(chip, SJASR) & sjaSR_RBS);
+}
+
+void sja1000_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int cmd;
+       
+       if(obj->tx_slot){
+               /* Do local transmitted message distribution if enabled */
+               if (processlocal){
+                       /* fill CAN message timestamp */
+                       can_filltimestamp(&obj->tx_slot->msg.timestamp);
+                       
+                       obj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+       }
+
+       cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
+       if(cmd<0)
+               return;
+
+       if (chip->chipspecops->pre_write_config(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_PREP);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+       if (chip->chipspecops->send_msg(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_SEND);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+}
+
+/**
+ * sja1000_wakeup_tx: - wakeups TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000.c
+ */
+int sja1000_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+       
+       can_msgobj_set_fl(obj,TX_REQUEST);
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+               can_msgobj_clear_fl(obj,TX_REQUEST);
+
+               if (can_read_reg(chip, SJASR) & sjaSR_TBS)
+                       sja1000_irq_write_handler(chip, obj);
+       
+               can_msgobj_clear_fl(obj,TX_LOCK);
+               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+       }
+
+       can_preempt_enable();
+       return 0;
+}
+
+int sja1000_register(struct chipspecops_t *chipspecops)
+{
+       chipspecops->chip_config = sja1000_chip_config;
+       chipspecops->baud_rate = sja1000_baud_rate;
+       chipspecops->standard_mask = sja1000_standard_mask;
+       chipspecops->extended_mask = sja1000_extended_mask;
+       chipspecops->message15_mask = sja1000_extended_mask;
+       chipspecops->clear_objects = sja1000_clear_objects;
+       chipspecops->config_irqs = sja1000_config_irqs;
+       chipspecops->pre_read_config = sja1000_pre_read_config;
+       chipspecops->pre_write_config = sja1000_pre_write_config;
+       chipspecops->send_msg = sja1000_send_msg;
+       chipspecops->check_tx_stat = sja1000_check_tx_stat;
+       chipspecops->wakeup_tx=sja1000_wakeup_tx;
+       chipspecops->remote_request = sja1000_remote_request;
+       chipspecops->enable_configuration = sja1000_enable_configuration;
+       chipspecops->disable_configuration = sja1000_disable_configuration;
+       chipspecops->set_btregs = sja1000_set_btregs;
+       chipspecops->attach_to_chip=sja1000_attach_to_chip;
+       chipspecops->release_chip=sja1000_release_chip;
+       chipspecops->start_chip = sja1000_start_chip;
+       chipspecops->stop_chip = sja1000_stop_chip;
+       chipspecops->irq_handler = sja1000_irq_handler;
+       chipspecops->irq_handler = NULL;
+       return 0;
+}
+
+int sja1000_fill_chipspecops(struct canchip_t *chip)
+{
+       chip->chip_type="sja1000";
+       chip->max_objects=1;
+       sja1000_register(chip->chipspecops);
+       return 0;
+}
+
diff --git a/lincan-0.3.3/src/sja1000p.c b/lincan-0.3.3/src/sja1000p.c
new file mode 100644 (file)
index 0000000..ffadb6c
--- /dev/null
@@ -0,0 +1,911 @@
+/* sja1000.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Changed for PeliCan mode SJA1000 by Tomasz Motylewski (BFAD GmbH)
+ * T.Motylewski@bfad.de
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/sja1000p.h"
+
+#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
+
+static const char *sja1000_ecc_errc_str[]={
+       "bit error",
+       "form error",
+       "stuff error",
+       "other type of error"
+};
+
+static const char *sja1000_ecc_seg_str[]={
+       "?0?",
+       "?1?",
+       "ID.28 to ID.21",
+       "start of frame",
+       "bit SRTR",
+       "bit IDE",
+       "ID.20 to ID.18",
+       "ID.17 to ID.13",
+       "CRC sequence",
+       "reserved bit 0",
+       "data field",
+       "data length code",
+       "bit RTR",
+       "reserved bit 1",
+       "ID.4 to ID.0",
+       "ID.12 to ID.5",
+       "?16?"
+       "active error flag",
+       "intermission",
+       "tolerate dominant bits",
+       "?20?",
+       "?21?",
+       "passive error flag",
+       "error delimiter",
+       "CRC delimiter",
+       "acknowledge slot",
+       "end of frame",
+       "acknowledge delimiter",
+       "overload flag",
+       "?29?",
+       "?30?",
+       "?31?"
+};
+
+#endif /*CONFIG_OC_LINCAN_DETAILED_ERRORS*/
+
+static int sja1000_report_error_limit_counter;
+
+static void sja1000_report_error(struct canchip_t *chip,
+                               unsigned sr, unsigned ir, unsigned ecc)
+{
+       if(sja1000_report_error_limit_counter>=100)
+               return;
+
+       CANMSG("Error: status register: 0x%x irq_register: 0x%02x error: 0x%02x\n",
+               sr, ir, ecc);
+
+       sja1000_report_error_limit_counter+=10;
+
+       if(sja1000_report_error_limit_counter>=100){
+               sja1000_report_error_limit_counter+=10;
+               CANMSG("Error: too many errors, reporting disabled\n");
+               return;
+       }
+
+#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
+       CANMSG("SR: BS=%c  ES=%c  TS=%c  RS=%c  TCS=%c TBS=%c DOS=%c RBS=%c\n",
+               sr&sjaSR_BS?'1':'0',sr&sjaSR_ES?'1':'0',
+               sr&sjaSR_TS?'1':'0',sr&sjaSR_RS?'1':'0',
+               sr&sjaSR_TCS?'1':'0',sr&sjaSR_TBS?'1':'0',
+               sr&sjaSR_DOS?'1':'0',sr&sjaSR_RBS?'1':'0');
+       CANMSG("IR: BEI=%c ALI=%c EPI=%c WUI=%c DOI=%c EI=%c  TI=%c  RI=%c\n",
+               sr&sjaIR_BEI?'1':'0',sr&sjaIR_ALI?'1':'0',
+               sr&sjaIR_EPI?'1':'0',sr&sjaIR_WUI?'1':'0',
+               sr&sjaIR_DOI?'1':'0',sr&sjaIR_EI?'1':'0',
+               sr&sjaIR_TI?'1':'0',sr&sjaIR_RI?'1':'0');
+       if((sr&sjaIR_EI) || 1){
+               CANMSG("EI: %s %s %s\n",
+                      sja1000_ecc_errc_str[(ecc&(sjaECC_ERCC1|sjaECC_ERCC0))/sjaECC_ERCC0],
+                      ecc&sjaECC_DIR?"RX":"TX",
+                      sja1000_ecc_seg_str[ecc&sjaECC_SEG_M]
+                     );
+       }
+#endif /*CONFIG_OC_LINCAN_DETAILED_ERRORS*/
+}
+
+
+/**
+ * sja1000p_enable_configuration - enable chip configuration mode
+ * @chip: pointer to chip state structure
+ */
+int sja1000p_enable_configuration(struct canchip_t *chip)
+{
+       int i=0;
+       enum sja1000_PeliCAN_MOD flags;
+
+       can_disable_irq(chip->chip_irq);
+
+       flags=can_read_reg(chip,SJAMOD);
+
+       while ((!(flags & sjaMOD_RM)) && (i<=10)) {
+               can_write_reg(chip, sjaMOD_RM, SJAMOD);
+// TODO: configurable sjaMOD_AFM (32/16 bit acceptance filter)
+// config sjaMOD_LOM (listen only)
+               udelay(100);
+               i++;
+               flags=can_read_reg(chip, SJAMOD);
+       }
+       if (i>=10) {
+               CANMSG("Reset error\n");
+               can_enable_irq(chip->chip_irq);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+/**
+ * sja1000p_disable_configuration - disable chip configuration mode
+ * @chip: pointer to chip state structure
+ */
+int sja1000p_disable_configuration(struct canchip_t *chip)
+{
+       int i=0;
+       enum sja1000_PeliCAN_MOD flags;
+
+       flags=can_read_reg(chip,SJAMOD);
+
+       while ( (flags & sjaMOD_RM) && (i<=50) ) {
+// could be as long as 11*128 bit times after buss-off
+               can_write_reg(chip, 0, SJAMOD);
+// TODO: configurable sjaMOD_AFM (32/16 bit acceptance filter)
+// config sjaMOD_LOM (listen only)
+               udelay(100);
+               i++;
+               flags=can_read_reg(chip, SJAMOD);
+       }
+       if (i>=10) {
+               CANMSG("Error leaving reset status\n");
+               return -ENODEV;
+       }
+
+       can_enable_irq(chip->chip_irq);
+
+       return 0;
+}
+
+/**
+ * sja1000p_chip_config: - can chip configuration
+ * @chip: pointer to chip state structure
+ *
+ * This function configures chip and prepares it for message
+ * transmission and reception. The function resets chip,
+ * resets mask for acceptance of all messages by call to
+ * sja1000p_extended_mask() function and then 
+ * computes and sets baudrate with use of function sja1000p_baud_rate().
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_chip_config(struct canchip_t *chip)
+{
+       int i;
+       unsigned char n, r;
+       
+       if (sja1000p_enable_configuration(chip))
+               return -ENODEV;
+
+       /* Set mode, clock out, comparator */
+       can_write_reg(chip,sjaCDR_PELICAN|chip->sja_cdr_reg,SJACDR); 
+
+       /* Ensure, that interrupts are disabled even on the chip level now */
+       can_write_reg(chip, sjaDISABLE_INTERRUPTS, SJAIER);
+
+       /* Set driver output configuration */
+       can_write_reg(chip,chip->sja_ocr_reg,SJAOCR); 
+       
+       /* Simple check for chip presence */
+       for (i=0, n=0x5a; i<8; i++, n+=0xf) {
+               can_write_reg(chip,n,SJAACR0+i);
+       }
+       for (i=0, n=0x5a; i<8; i++, n+=0xf) {
+               r = n^can_read_reg(chip,SJAACR0+i);
+               if (r) {
+                       CANMSG("sja1000p_chip_config: chip connection broken,"
+                               " readback differ 0x%02x\n", r);
+                       return -ENODEV;
+               }
+       }
+       
+
+       if (sja1000p_extended_mask(chip,0x00000000, 0xffffffff))
+               return -ENODEV;
+       
+       if (!chip->baudrate)
+               chip->baudrate=1000000;
+       if (sja1000p_baud_rate(chip,chip->baudrate,chip->clock,0,75,0))
+               return -ENODEV;
+
+       /* Enable hardware interrupts */
+       can_write_reg(chip, sjaENABLE_INTERRUPTS, SJAIER); 
+
+       sja1000p_disable_configuration(chip);
+       
+       return 0;
+}
+
+/**
+ * sja1000p_extended_mask: - setup of extended mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_extended_mask(struct canchip_t *chip, unsigned long code, unsigned  long mask)
+{
+       int i;
+
+       if (sja1000p_enable_configuration(chip))
+               return -ENODEV;
+
+// LSB to +3, MSB to +0        
+       for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
+               can_write_reg(chip,code&0xff,SJAACR0+i);
+               can_write_reg(chip,mask&0xff,SJAAMR0+i);
+               code >>= 8;
+               mask >>= 8;
+       }
+
+       DEBUGMSG("Setting acceptance code to 0x%lx\n",(unsigned long)code);
+       DEBUGMSG("Setting acceptance mask to 0x%lx\n",(unsigned long)mask);
+
+       sja1000p_disable_configuration(chip);
+
+       return 0;
+}
+
+/**
+ * sja1000p_baud_rate: - set communication parameters.
+ * @chip: pointer to chip state structure
+ * @rate: baud rate in Hz
+ * @clock: frequency of sja1000 clock in Hz (ISA osc is 14318000)
+ * @sjw: synchronization jump width (0-3) prescaled clock cycles
+ * @sampl_pt: sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
+ * @flags: fields %BTR1_SAM, %OCMODE, %OCPOL, %OCTP, %OCTN, %CLK_OFF, %CBP
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                                                       int sampl_pt, int flags)
+{
+       int best_error = 1000000000, error;
+       int best_tseg=0, best_brp=0, best_rate=0, brp=0;
+       int tseg=0, tseg1=0, tseg2=0;
+       
+       if (sja1000p_enable_configuration(chip))
+               return -ENODEV;
+
+       clock /=2;
+
+       /* tseg even = round down, odd = round up */
+       for (tseg=(0+0+2)*2; tseg<=(sjaMAX_TSEG2+sjaMAX_TSEG1+2)*2+1; tseg++) {
+               brp = clock/((1+tseg/2)*rate)+tseg%2;
+               if (brp == 0 || brp > 64)
+                       continue;
+               error = rate - clock/(brp*(1+tseg/2));
+               if (error < 0)
+                       error = -error;
+               if (error <= best_error) {
+                       best_error = error;
+                       best_tseg = tseg/2;
+                       best_brp = brp-1;
+                       best_rate = clock/(brp*(1+tseg/2));
+               }
+       }
+       if (best_error && (rate/best_error < 10)) {
+               CANMSG("baud rate %d is not possible with %d Hz clock\n",
+                                                               rate, 2*clock);
+               CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
+                               best_rate, best_brp, best_tseg, tseg1, tseg2);
+               return -EINVAL;
+       }
+       tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
+       if (tseg2 < 0)
+               tseg2 = 0;
+       if (tseg2 > sjaMAX_TSEG2)
+               tseg2 = sjaMAX_TSEG2;
+       tseg1 = best_tseg-tseg2-2;
+       if (tseg1>sjaMAX_TSEG1) {
+               tseg1 = sjaMAX_TSEG1;
+               tseg2 = best_tseg-tseg1-2;
+       }
+
+       DEBUGMSG("Setting %d bps.\n", best_rate);
+       DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
+                                       best_brp, best_tseg, tseg1, tseg2,
+                                       (100*(best_tseg-tseg2)/(best_tseg+1)));
+
+
+       can_write_reg(chip, sjw<<6 | best_brp, SJABTR0);
+       can_write_reg(chip, ((flags & BTR1_SAM) != 0)<<7 | (tseg2<<4) 
+                                       | tseg1, SJABTR1);
+
+       sja1000p_disable_configuration(chip);
+
+       return 0;
+}
+
+/**
+ * sja1000p_read: - reads and distributes one or more received messages
+ * @chip: pointer to chip state structure
+ * @obj: pinter to CAN message queue information
+ *
+ * File: src/sja1000p.c
+ */
+void sja1000p_read(struct canchip_t *chip, struct msgobj_t *obj) {
+       int i, flags, len, datastart;
+       do {
+               flags = can_read_reg(chip,SJAFRM);
+               if(flags&sjaFRM_FF) {
+                       obj->rx_msg.id =
+                               (can_read_reg(chip,SJAID0)<<21) +
+                               (can_read_reg(chip,SJAID1)<<13) +
+                               (can_read_reg(chip,SJAID2)<<5) +
+                               (can_read_reg(chip,SJAID3)>>3);
+                       datastart = SJADATE;
+               } else {
+                       obj->rx_msg.id =
+                               (can_read_reg(chip,SJAID0)<<3) +
+                               (can_read_reg(chip,SJAID1)>>5);
+                       datastart = SJADATS;
+               }
+               obj->rx_msg.flags =
+                       ((flags & sjaFRM_RTR) ? MSG_RTR : 0) |
+                       ((flags & sjaFRM_FF) ? MSG_EXT : 0);
+               len = flags & sjaFRM_DLC_M;
+               obj->rx_msg.length = len;
+               if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+               for(i=0; i< len; i++) {
+                       obj->rx_msg.data[i]=can_read_reg(chip,datastart+i);
+               }
+
+               /* fill CAN message timestamp */
+               can_filltimestamp(&obj->rx_msg.timestamp);
+
+               canque_filter_msg2edges(obj->qends, &obj->rx_msg);
+
+               can_write_reg(chip, sjaCMR_RRB, SJACMR);
+
+       } while (can_read_reg(chip, SJASR) & sjaSR_RBS);
+}
+
+/**
+ * sja1000p_pre_read_config: - prepares message object for message reception
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive value indicates immediate reception of message.
+ * File: src/sja1000p.c
+ */
+int sja1000p_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int status;
+       status=can_read_reg(chip,SJASR);
+       
+       if(status  & sjaSR_BS) {
+               /* Try to recover from error condition */
+               DEBUGMSG("sja1000p_pre_read_config bus-off recover 0x%x\n",status);
+               sja1000p_enable_configuration(chip);
+               can_write_reg(chip, 0, SJARXERR);
+               can_write_reg(chip, 0, SJATXERR1);
+               can_read_reg(chip, SJAECC);
+               sja1000p_disable_configuration(chip);
+       }
+
+       if (!(status&sjaSR_RBS)) {
+               return 0;
+       }
+
+       can_write_reg(chip, sjaDISABLE_INTERRUPTS, SJAIER); //disable interrupts for a moment
+       sja1000p_read(chip, obj);
+       can_write_reg(chip, sjaENABLE_INTERRUPTS, SJAIER); //enable interrupts
+       return 1;
+}
+
+#define MAX_TRANSMIT_WAIT_LOOPS 10
+/**
+ * sja1000p_pre_write_config: - prepares message object for message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * This function prepares selected message object for future initiation
+ * of message transmission by sja1000p_send_msg() function.
+ * The CAN message data and message ID are transfered from @msg slot
+ * into chip buffer in this function.
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       int i=0; 
+       unsigned int id;
+       int status;
+       int len;
+
+       /* Wait until Transmit Buffer Status is released */
+       while ( !((status=can_read_reg(chip, SJASR)) & sjaSR_TBS) && 
+                                               i++<MAX_TRANSMIT_WAIT_LOOPS) {
+               udelay(i);
+       }
+       
+       if(status & sjaSR_BS) {
+               /* Try to recover from error condition */
+               DEBUGMSG("sja1000p_pre_write_config bus-off recover 0x%x\n",status);
+               sja1000p_enable_configuration(chip);
+               can_write_reg(chip, 0, SJARXERR);
+               can_write_reg(chip, 0, SJATXERR1);
+               can_read_reg(chip, SJAECC);
+               sja1000p_disable_configuration(chip);
+       }
+       if (!(can_read_reg(chip, SJASR) & sjaSR_TBS)) {
+               CANMSG("Transmit timed out, cancelling\n");
+// here we should check if there is no write/select waiting for this
+// transmit. If so, set error ret and wake up.
+// CHECKME: if we do not disable sjaIER_TIE (TX IRQ) here we get interrupt
+// immediately
+               can_write_reg(chip, sjaCMR_AT, SJACMR);
+               i=0;
+               while ( !(can_read_reg(chip, SJASR) & sjaSR_TBS) &&
+                                               i++<MAX_TRANSMIT_WAIT_LOOPS) {
+                       udelay(i);
+               }
+               if (!(can_read_reg(chip, SJASR) & sjaSR_TBS)) {
+                       CANMSG("Could not cancel, please reset\n");
+                       return -EIO;
+               }
+       }
+       len = msg->length;
+       if(len > CAN_MSG_LENGTH) len = CAN_MSG_LENGTH;
+       /* len &= sjaFRM_DLC_M; ensured by above condition already */
+       can_write_reg(chip, ((msg->flags&MSG_EXT)?sjaFRM_FF:0) |
+               ((msg->flags & MSG_RTR) ? sjaFRM_RTR : 0) | len, SJAFRM);
+       if(msg->flags&MSG_EXT) {
+               id=msg->id<<3;
+               can_write_reg(chip, id & 0xff, SJAID3);
+               id >>= 8;
+               can_write_reg(chip, id & 0xff, SJAID2);
+               id >>= 8;
+               can_write_reg(chip, id & 0xff, SJAID1);
+               id >>= 8;
+               can_write_reg(chip, id, SJAID0);
+               for(i=0; i < len; i++) {
+                       can_write_reg(chip, msg->data[i], SJADATE+i);
+               }
+       } else {
+               id=msg->id<<5;
+               can_write_reg(chip, (id >> 8) & 0xff, SJAID0);
+               can_write_reg(chip, id & 0xff, SJAID1);
+               for(i=0; i < len; i++) {
+                       can_write_reg(chip, msg->data[i], SJADATS+i);
+               }
+       }
+       return 0;
+}
+
+/**
+ * sja1000p_send_msg: - initiate message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * This function is called after sja1000p_pre_write_config() function,
+ * which prepares data in chip buffer.
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_send_msg(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       can_write_reg(chip, sjaCMR_TR, SJACMR);
+
+       return 0;
+}
+
+/**
+ * sja1000p_check_tx_stat: - checks state of transmission engine
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive return value indicates transmission under way status.
+ *     Zero value indicates finishing of all issued transmission requests.
+ * File: src/sja1000p.c
+ */
+int sja1000p_check_tx_stat(struct canchip_t *chip)
+{
+       if (can_read_reg(chip,SJASR) & sjaSR_TCS)
+               return 0;
+       else
+               return 1;
+}
+
+/**
+ * sja1000p_set_btregs: -  configures bitrate registers
+ * @chip: pointer to chip state structure
+ * @btr0: bitrate register 0
+ * @btr1: bitrate register 1
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1)
+{
+       if (sja1000p_enable_configuration(chip))
+               return -ENODEV;
+
+       can_write_reg(chip, btr0, SJABTR0);
+       can_write_reg(chip, btr1, SJABTR1);
+
+       sja1000p_disable_configuration(chip);
+
+       return 0;
+}
+
+/**
+ * sja1000p_start_chip: -  starts chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_start_chip(struct canchip_t *chip)
+{
+       enum sja1000_PeliCAN_MOD flags;
+
+       flags = can_read_reg(chip, SJAMOD) & (sjaMOD_LOM|sjaMOD_STM|sjaMOD_AFM|sjaMOD_SM);
+       can_write_reg(chip, flags, SJAMOD);
+
+       sja1000_report_error_limit_counter=0;
+
+       return 0;
+}
+
+/**
+ * sja1000p_stop_chip: -  stops chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_stop_chip(struct canchip_t *chip)
+{
+       enum sja1000_PeliCAN_MOD flags;
+
+       flags = can_read_reg(chip, SJAMOD) & (sjaMOD_LOM|sjaMOD_STM|sjaMOD_AFM|sjaMOD_SM);
+       can_write_reg(chip, flags|sjaMOD_RM, SJAMOD);
+
+       return 0;
+}
+
+/**
+ * sja1000p_attach_to_chip: - attaches to the chip, setups registers and state
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * sja1000p_release_chip: - called before chip structure removal if %CHIP_ATTACHED is set
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_release_chip(struct canchip_t *chip)
+{
+       sja1000p_stop_chip(chip);
+       can_write_reg(chip, sjaDISABLE_INTERRUPTS, SJAIER);
+
+       return 0;
+}
+
+/**
+ * sja1000p_remote_request: - configures message object and asks for RTR message
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_remote_request(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       CANMSG("sja1000p_remote_request not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * sja1000p_standard_mask: - setup of mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_standard_mask(struct canchip_t *chip, unsigned short code,
+               unsigned short mask)
+{
+       CANMSG("sja1000p_standard_mask not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * sja1000p_clear_objects: - clears state of all message object residing in chip
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_clear_objects(struct canchip_t *chip)
+{
+       CANMSG("sja1000p_clear_objects not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * sja1000p_config_irqs: - tunes chip hardware interrupt delivery
+ * @chip: pointer to chip state structure
+ * @irqs: requested chip IRQ configuration
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_config_irqs(struct canchip_t *chip, short irqs)
+{
+       CANMSG("sja1000p_config_irqs not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * sja1000p_irq_write_handler: - part of ISR code responsible for transmit events
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * The main purpose of this function is to read message from attached queues
+ * and transfer message contents into CAN controller chip.
+ * This subroutine is called by
+ * sja1000p_irq_write_handler() for transmit events.
+ * File: src/sja1000p.c
+ */
+void sja1000p_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int cmd;
+       
+       if(obj->tx_slot){
+               /* Do local transmitted message distribution if enabled */
+               if (processlocal){
+                       /* fill CAN message timestamp */
+                       can_filltimestamp(&obj->tx_slot->msg.timestamp);
+                       
+                       obj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+       }
+       
+       can_msgobj_clear_fl(obj,TX_PENDING);
+       cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
+       if(cmd<0)
+               return;
+       can_msgobj_set_fl(obj,TX_PENDING);
+
+       if (chip->chipspecops->pre_write_config(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_PREP);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+       if (chip->chipspecops->send_msg(chip, obj, &obj->tx_slot->msg)) {
+               obj->ret = -1;
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_SEND);
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               return;
+       }
+
+}
+
+#define MAX_RETR 10
+
+/**
+ * sja1000p_irq_handler: - interrupt service routine
+ * @irq: interrupt vector number, this value is system specific
+ * @chip: pointer to chip state structure
+ * 
+ * Interrupt handler is activated when state of CAN controller chip changes,
+ * there is message to be read or there is more space for new messages or
+ * error occurs. The receive events results in reading of the message from
+ * CAN controller chip and distribution of message through attached
+ * message queues.
+ * File: src/sja1000p.c
+ */
+int sja1000p_irq_handler(int irq, struct canchip_t *chip)
+{
+       int irq_register, status, error_code;
+       struct msgobj_t *obj=chip->msgobj[0];
+       int loop_cnt=CHIP_MAX_IRQLOOP;
+
+       irq_register=can_read_reg(chip,SJAIR);
+//     DEBUGMSG("sja1000_irq_handler: SJAIR:%02x\n",irq_register);
+//     DEBUGMSG("sja1000_irq_handler: SJASR:%02x\n",
+//                                     can_read_reg(chip,SJASR));
+
+       if ((irq_register & (sjaIR_BEI|sjaIR_EPI|sjaIR_DOI|sjaIR_EI|sjaIR_TI|sjaIR_RI)) == 0)
+               return CANCHIP_IRQ_NONE;
+
+       if(!(chip->flags&CHIP_CONFIGURED)) {
+               CANMSG("sja1000p_irq_handler: called for non-configured device, irq_register 0x%02x\n", irq_register);
+               return CANCHIP_IRQ_NONE;
+       }
+
+       status=can_read_reg(chip,SJASR);
+
+       do {
+
+               if(!loop_cnt--) {
+                       CANMSG("sja1000p_irq_handler IRQ %d stuck\n",irq);
+                       return CANCHIP_IRQ_STUCK;
+               }
+
+               /* (irq_register & sjaIR_RI) */
+               /*      old variant using SJAIR, collides with intended use with irq_accept */
+               if (status & sjaSR_RBS) {
+                       DEBUGMSG("sja1000_irq_handler: RI or RBS\n");
+                       sja1000p_read(chip,obj);
+                       obj->ret = 0;
+               }
+
+               /* (irq_register & sjaIR_TI) */
+               /*      old variant using SJAIR, collides with intended use with irq_accept */
+               if (((status & sjaSR_TBS) && can_msgobj_test_fl(obj,TX_PENDING))||
+                   (can_msgobj_test_fl(obj,TX_REQUEST))) {
+                       DEBUGMSG("sja1000_irq_handler: TI or TX_PENDING and TBS\n");
+                       obj->ret = 0;
+                       can_msgobj_set_fl(obj,TX_REQUEST);
+                       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+                               can_msgobj_clear_fl(obj,TX_REQUEST);
+
+                               if (can_read_reg(chip, SJASR) & sjaSR_TBS)
+                                       sja1000p_irq_write_handler(chip, obj);
+
+                               can_msgobj_clear_fl(obj,TX_LOCK);
+                               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+                               DEBUGMSG("TX looping in sja1000_irq_handler\n");
+                       }
+               }
+               if ((irq_register & (sjaIR_EI|sjaIR_BEI|sjaIR_EPI|sjaIR_DOI)) != 0) { 
+                       // Some error happened
+                       error_code=can_read_reg(chip,SJAECC);
+                       sja1000_report_error(chip, status, irq_register, error_code);
+// FIXME: chip should be brought to usable state. Transmission cancelled if in progress.
+// Reset flag set to 0 if chip is already off the bus. Full state report
+                       obj->ret=-1;
+               
+                       if(error_code == 0xd9) {
+                               obj->ret= -ENXIO;
+                               /* no such device or address - no ACK received */
+                       }
+                       if(obj->tx_retry_cnt++>MAX_RETR) {
+                               can_write_reg(chip, sjaCMR_AT, SJACMR); // cancel any transmition
+                               obj->tx_retry_cnt = 0;
+                       }
+                       if(status&sjaSR_BS) {
+                               CANMSG("bus-off, resetting sja1000p\n");
+                               can_write_reg(chip, 0, SJAMOD);
+                       }
+
+                       if(obj->tx_slot){
+                               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_BUS);
+                               /*canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+                               obj->tx_slot=NULL;*/
+                       }
+
+               } else {
+                       if(sja1000_report_error_limit_counter)
+                               sja1000_report_error_limit_counter--;
+                       obj->tx_retry_cnt=0;
+               }
+
+               irq_register=can_read_reg(chip,SJAIR);
+
+               status=can_read_reg(chip,SJASR);
+
+               if(((status & sjaSR_TBS) && can_msgobj_test_fl(obj,TX_PENDING)) ||
+                  (irq_register & sjaIR_TI))
+                        can_msgobj_set_fl(obj,TX_REQUEST);
+
+       } while((irq_register & (sjaIR_BEI|sjaIR_EPI|sjaIR_DOI|sjaIR_EI|sjaIR_RI)) ||
+               (can_msgobj_test_fl(obj,TX_REQUEST) && !can_msgobj_test_fl(obj,TX_LOCK)) ||
+               (status & sjaSR_RBS));
+
+       return CANCHIP_IRQ_HANDLED;
+}
+
+/**
+ * sja1000p_wakeup_tx: - wakeups TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Function is responsible for initiating message transmition.
+ * It is responsible for clearing of object TX_REQUEST flag
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int sja1000p_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       
+       can_preempt_disable();
+       
+       can_msgobj_set_fl(obj,TX_PENDING);
+       can_msgobj_set_fl(obj,TX_REQUEST);
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+               can_msgobj_clear_fl(obj,TX_REQUEST);
+
+               if (can_read_reg(chip, SJASR) & sjaSR_TBS){
+                       obj->tx_retry_cnt=0;
+                       sja1000p_irq_write_handler(chip, obj);
+               }
+       
+               can_msgobj_clear_fl(obj,TX_LOCK);
+               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+               DEBUGMSG("TX looping in sja1000p_wakeup_tx\n");
+       }
+
+       can_preempt_enable();
+       return 0;
+}
+
+int sja1000p_register(struct chipspecops_t *chipspecops)
+{
+       CANMSG("initializing sja1000p chip operations\n");
+       chipspecops->chip_config=sja1000p_chip_config;
+       chipspecops->baud_rate=sja1000p_baud_rate;
+       chipspecops->standard_mask=sja1000p_standard_mask;
+       chipspecops->extended_mask=sja1000p_extended_mask;
+       chipspecops->message15_mask=sja1000p_extended_mask;
+       chipspecops->clear_objects=sja1000p_clear_objects;
+       chipspecops->config_irqs=sja1000p_config_irqs;
+       chipspecops->pre_read_config=sja1000p_pre_read_config;
+       chipspecops->pre_write_config=sja1000p_pre_write_config;
+       chipspecops->send_msg=sja1000p_send_msg;
+       chipspecops->check_tx_stat=sja1000p_check_tx_stat;
+       chipspecops->wakeup_tx=sja1000p_wakeup_tx;
+       chipspecops->remote_request=sja1000p_remote_request;
+       chipspecops->enable_configuration=sja1000p_enable_configuration;
+       chipspecops->disable_configuration=sja1000p_disable_configuration;
+       chipspecops->attach_to_chip=sja1000p_attach_to_chip;
+       chipspecops->release_chip=sja1000p_release_chip;
+       chipspecops->set_btregs=sja1000p_set_btregs;
+       chipspecops->start_chip=sja1000p_start_chip;
+       chipspecops->stop_chip=sja1000p_stop_chip;
+       chipspecops->irq_handler=sja1000p_irq_handler;
+       chipspecops->irq_accept=NULL;
+       return 0;
+}
+
+/**
+ * sja1000p_fill_chipspecops - fills chip specific operations
+ * @chip: pointer to chip representation structure
+ *
+ * The function fills chip specific operations for sja1000 (PeliCAN) chip.
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int sja1000p_fill_chipspecops(struct canchip_t *chip)
+{
+       chip->chip_type="sja1000p";
+       chip->max_objects=1;
+       sja1000p_register(chip->chipspecops);
+       return 0;
+}
diff --git a/lincan-0.3.3/src/smartcan.c b/lincan-0.3.3/src/smartcan.c
new file mode 100644 (file)
index 0000000..a7a990d
--- /dev/null
@@ -0,0 +1,142 @@
+/* smartcan.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/smartcan.h"
+#include "../include/i82527.h"
+
+int smartcan_irq=-1;
+unsigned long smartcan_base=0x0;
+
+static CAN_DEFINE_SPINLOCK(smartcan_port_lock);
+
+int smartcan_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,0x04,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + 0x04 - 1);
+       }
+       return 0;
+}
+
+int smartcan_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,0x04);
+
+       return 0;
+}
+
+int smartcan_reset(struct candevice_t *candev)
+{
+       int i=0;
+
+       DEBUGMSG("Resetting smartcan hardware ...\n");
+       outb(0x00,candev->res_addr);
+       while (i < 1000000) {
+               i++;
+               outb(0x01,candev->res_addr);
+       }
+       outb(0x00,candev->res_addr); 
+
+       /* Check hardware reset status */
+       i=0;
+       outb(candev->io_addr+iCPU,candev->io_addr);
+       while ( (inb(candev->io_addr+1)&0x80) && (i<=15) ) {
+               udelay(20000);
+               i++;
+       }
+       if (i>=15) {
+               CANMSG("Reset status timeout!\n");
+               CANMSG("Please check your hardware.\n");
+               return -ENODEV;
+       }
+       else
+               DEBUGMSG("Chip0 reset status ok.\n");
+
+       return 0;
+} 
+
+int smartcan_init_hw_data(struct candevice_t *candev)
+{
+       candev->res_addr=candev->io_addr+0x02;
+       candev->nr_82527_chips=1;
+       candev->nr_sja1000_chips=0;
+       candev->nr_all_chips=1;
+       
+       return 0;
+}
+
+int smartcan_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+       candev->chip[chipnr]->sja_cdr_reg = 0;
+       candev->chip[chipnr]->sja_ocr_reg = 0;
+       smartcan_irq=candev->chip[chipnr]->chip_irq;
+       smartcan_base=candev->chip[chipnr]->chip_base_addr;
+
+       return 0;
+}
+
+int smartcan_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=(objnr+1)*0x10;
+
+       return 0;
+}
+
+
+void smartcan_write_register(unsigned data, unsigned long address)
+{
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&smartcan_port_lock,flags);
+       outb(address-smartcan_base,smartcan_base);
+       outb(data,smartcan_base+1);
+       can_spin_unlock_irqrestore(&smartcan_port_lock,flags);
+}
+
+unsigned smartcan_read_register(unsigned long address)
+{
+       unsigned ret;
+       can_spin_irqflags_t flags;
+       can_spin_lock_irqsave(&smartcan_port_lock,flags);
+       outb(address-smartcan_base,smartcan_base);
+       ret=inb(smartcan_base+1);
+       can_spin_unlock_irqrestore(&smartcan_port_lock,flags);
+       return ret;
+}
+
+int smartcan_program_irq(struct candevice_t *candev)
+{
+       CANMSG("The 'smartcan' card doesn't have programmable interrupts\n");
+       return 0;
+}
+
+/* !!! Don't change this function !!! */
+int smartcan_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = smartcan_request_io;
+       hwspecops->release_io = smartcan_release_io;
+       hwspecops->reset = smartcan_reset;
+       hwspecops->init_hw_data = smartcan_init_hw_data;
+       hwspecops->init_chip_data = smartcan_init_chip_data;
+       hwspecops->init_obj_data = smartcan_init_obj_data;
+       hwspecops->write_register = smartcan_write_register;
+       hwspecops->read_register = smartcan_read_register;
+       hwspecops->program_irq = smartcan_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/ssv.c b/lincan-0.3.3/src/ssv.c
new file mode 100644 (file)
index 0000000..45aef4b
--- /dev/null
@@ -0,0 +1,247 @@
+/* ssv.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@casema.net
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/ssv.h"
+#include "../include/i82527.h"
+
+int ssvcan_irq[2]={-1,-1};
+unsigned long ssvcan_base=0x0;
+
+static CAN_DEFINE_SPINLOCK(ssv_port_lock);
+
+/* IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips.
+ */
+#define IO_RANGE 0x04
+
+/* The function template_request_io is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well.
+ * The reserved memory starts at io_addr, wich is the module parameter io.
+ */
+int ssv_request_io(struct candevice_t *candev)
+{
+
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, 
+                        candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/* The function template_release_io is used to free the previously reserved 
+ * io-memory. In case you reserved more memory, don't forget to free it here.
+ */
+int ssv_release_io(struct candevice_t *candev)
+{
+
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/* The function template_reset is used to give a hardware reset. This is rather
+ * hardware specific so I haven't included example code. Don't forget to check
+ * the reset status of the chip before returning.
+ */
+int ssv_reset(struct candevice_t *candev)
+{
+    int i; 
+
+    DEBUGMSG("Resetting ssv hardware ...\n");
+    ssv_write_register(1,ssvcan_base+iCPU);
+    ssv_write_register(0,ssvcan_base+iCPU);
+    ssv_write_register(1,ssvcan_base+0x100+iCPU);
+    ssv_write_register(0,ssvcan_base+0x100+iCPU);
+
+    for (i = 1; i < 1000; i++)
+       udelay (1000);
+
+    /* Check hardware reset status */ 
+    i=0;
+    while ( (ssv_read_register(ssvcan_base+iCPU) & iCPU_RST) && (i<=15)) {
+       udelay(20000);
+       i++;
+    }
+    if (i>=15) {
+       CANMSG("Reset status timeout!\n");
+       CANMSG("Please check your hardware.\n");
+       return -ENODEV;
+    }
+    else
+       DEBUGMSG("Chip0 reset status ok.\n");
+
+    /* Check hardware reset status */ 
+    i=0;
+    while ( (ssv_read_register(ssvcan_base+0x100+iCPU) & iCPU_RST) && (i<=15)) {
+       udelay(20000);
+       i++;
+    }
+    if (i>=15) {
+       CANMSG("Reset status timeout!\n");
+       CANMSG("Please check your hardware.\n");
+       return -ENODEV;
+    }
+    else
+       DEBUGMSG("Chip1 reset status ok.\n");
+
+
+
+    return 0;
+}
+
+/* The function template_init_hw_data is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * RESET_ADDR represents the io-address of the hardware reset register.
+ * NR_82527 represents the number of intel 82527 chips on the board.
+ * NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ */
+#define RESET_ADDR 0x02
+#define NR_82527 2
+#define NR_SJA1000 0
+
+int ssv_init_hw_data(struct candevice_t *candev) 
+{
+    candev->res_addr=RESET_ADDR;
+    candev->nr_82527_chips=NR_82527;
+    candev->nr_sja1000_chips=0;
+    candev->nr_all_chips=NR_82527;
+    candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+    return 0;
+}
+
+/* The function template_init_chip_data is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * CHIP_TYPE represents the type of CAN chip. CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the io_addr
+ * argument supplied at module loading time.
+ * The clock argument holds the chip clock value in Hz.
+ */
+int ssv_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+    i82527_fill_chipspecops(candev->chip[chipnr]);
+    candev->chip[chipnr]->chip_base_addr=
+       candev->io_addr+0x100*chipnr;
+    candev->chip[chipnr]->clock = 16000000;
+    ssvcan_irq[chipnr]=candev->chip[chipnr]->chip_irq;
+
+    ssvcan_base=candev->io_addr;
+
+    candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
+    candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+    candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+    return 0;
+}
+
+ /* The function template_init_obj_data is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ */
+int ssv_init_obj_data(struct canchip_t *chip, int objnr)
+{
+
+    chip->msgobj[objnr]->obj_base_addr=
+        chip->chip_base_addr+(objnr+1)*0x10;
+       
+    return 0;
+}
+
+/* The function template_program_irq is used for hardware that uses programmable
+ * interrupts. If your hardware doesn't use programmable interrupts you should
+ * not set the candevices_t->flags entry to CANDEV_PROGRAMMABLE_IRQ and leave this
+ * function unedited. Again this function is hardware specific so there's no
+ * example code.
+ */
+int ssv_program_irq(struct candevice_t *candev)
+{
+    return 0;
+}
+
+/* The function template_write_register is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ */
+void ssv_write_register(unsigned data, unsigned long address)
+{
+    /* address is an absolute address */
+
+    /* the ssv card has two registers, the address register at 0x0
+       and the data register at 0x01 */
+
+    /* write the relative address on the eight LSB bits 
+     and the data on the eight MSB bits in one time */
+    if((address-ssvcan_base)<0x100)
+       outw(address-ssvcan_base + (256 * data), ssvcan_base);
+    else
+       outw(address-ssvcan_base-0x100 + (256 * data), ssvcan_base+0x02);
+}
+
+/* The function template_read_register is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ */
+unsigned ssv_read_register(unsigned long address)
+{
+    /* this is the same thing that the function write_register.
+       We use the two register, we write the address where we 
+       want to read in a first time. In a second time we read the
+       data */
+    unsigned char ret;
+    can_spin_irqflags_t flags;
+    
+
+    if((address-ssvcan_base)<0x100)
+    {
+       can_spin_lock_irqsave(&ssv_port_lock,flags);
+       outb(address-ssvcan_base, ssvcan_base);
+       ret=inb(ssvcan_base+1);
+       can_spin_unlock_irqrestore(&ssv_port_lock,flags);
+    }
+    else
+    {
+       can_spin_lock_irqsave(&ssv_port_lock,flags);
+       outb(address-ssvcan_base-0x100, ssvcan_base+0x02);
+       ret=inb(ssvcan_base+1+0x02);
+       can_spin_unlock_irqrestore(&ssv_port_lock,flags);
+    }
+
+    return ret;
+}
+
+
+ /* !!! Don't change this function !!! */
+int ssv_register(struct hwspecops_t *hwspecops)
+{
+    hwspecops->request_io = ssv_request_io;
+    hwspecops->release_io = ssv_release_io;
+    hwspecops->reset = ssv_reset;
+    hwspecops->init_hw_data = ssv_init_hw_data;
+    hwspecops->init_chip_data = ssv_init_chip_data;
+    hwspecops->init_obj_data = ssv_init_obj_data;
+    hwspecops->write_register = ssv_write_register;
+    hwspecops->read_register = ssv_read_register;
+    hwspecops->program_irq = ssv_program_irq;
+    return 0;
+}
diff --git a/lincan-0.3.3/src/sysdep_lnx.c b/lincan-0.3.3/src/sysdep_lnx.c
new file mode 100644 (file)
index 0000000..07ef7d0
--- /dev/null
@@ -0,0 +1,269 @@
+/* sysdep_lnx.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/devcommon.h"
+#include "../include/setup.h"
+#include "../include/finish.h"
+
+#ifdef CAN_ENABLE_VME_SUPPORT
+#include "ca91c042.h"
+/* Modified version of ca91c042 driver can be found in
+ * components/comm/contrib directory. */
+#endif
+
+
+/**
+ * can_checked_malloc - memory allocation with registering of requested blocks
+ * @size: size of the requested block
+ *
+ * The function is used in the driver initialization phase to catch possible memory
+ * leaks for future driver finalization or case, that driver initialization fail.
+ * 
+ * Return Value: pointer to the allocated memory or NULL in the case of fail
+ */
+void *can_checked_malloc(size_t size)
+{
+       struct mem_addr *mem_new;
+       void *address_p;
+       
+       address_p=kmalloc(size,GFP_KERNEL);
+       if(address_p == NULL) {
+               CANMSG("can_checked_malloc: out of the memory\n");
+               return NULL;
+       }
+
+#ifdef DEBUG_MEM
+       DEBUGMSG("can_checked_malloc: allocated %d bytes at %p, mem_head=%p\n",
+                       (int)size, address_p, mem_head);
+#endif
+
+       mem_new=(struct mem_addr *)kmalloc(sizeof(struct mem_addr),GFP_KERNEL);
+       if (mem_new == NULL) {
+               CANMSG("can_checked_malloc: memory list allocation error.\n");
+               kfree(address_p);
+               return NULL;
+       }
+       mem_new->next=mem_head;
+       mem_new->address=address_p;
+       mem_new->size=size;
+       mem_head=mem_new;
+
+       return address_p;
+}
+
+/**
+ * can_checked_free - free memory allocated by  can_checked_malloc()
+ * @address_p: pointer to the memory block
+ */
+int can_checked_free(void *address_p)
+{
+       struct mem_addr **mem_pptr;
+       struct mem_addr *mem_del=NULL;
+
+#ifdef DEBUG_MEM
+       DEBUGMSG("can_checked_free %p, mem_head=%p\n", address_p, mem_head);
+#endif
+
+       for(mem_pptr = &mem_head; (mem_del = *mem_pptr); mem_pptr = &mem_del->next) {
+               if (mem_del->address != address_p)
+                       continue;
+               *mem_pptr=mem_del->next;
+               kfree(mem_del);
+               kfree(address_p);
+               return 0;
+       }
+       
+       CANMSG("can_checked_free: address %p not found on the mem list\n", address_p);
+       
+       kfree(address_p);
+       return -1;
+}
+
+
+/**
+ * can_del_mem_list - check for stale memory allocations at driver finalization
+ *
+ * Checks, if there are still some memory blocks allocated and releases memory
+ * occupied by such blocks back to the system
+ */
+int can_del_mem_list(void)
+{
+       struct mem_addr *mem;
+
+#ifdef DEBUG_MEM
+       DEBUGMSG("can_del_mem_list, mem_head=%p\n", mem_head);
+#endif
+       if(mem_head == NULL) {
+               CANMSG("can_del_mem_list: no entries on the list - OK\n");
+               return 0;
+       }
+
+       while((mem=mem_head) != NULL) {
+               mem_head=mem->next;
+               CANMSG("can_del_mem_list: deleting %p with size %d\n",
+                       mem->address, (int)mem->size);
+               kfree(mem->address);
+               kfree(mem);
+       }
+       
+       return 0;
+}
+
+/**
+ * can_request_io_region - request IO space region
+ * @start: the first IO port address
+ * @n: number of the consecutive IO port addresses
+ * @name: name/label for the requested region
+ *
+ * The function hides system specific implementation of the feature.
+ *
+ * Return Value: returns positive value (1) in the case, that region could
+ *     be reserved for the driver. Returns zero (0) if there is collision with
+ *     other driver or region cannot be taken for some other reason.
+ */
+int can_request_io_region(unsigned long start, unsigned long n, const char *name)
+{
+    #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+       if(check_region(start,n)) return 0;
+       request_region(start,n,name);
+       return 1;
+    #else
+       return (request_region(start,n,name))?1:0;
+    #endif
+}
+
+/**
+ * can_release_io_region - release IO space region
+ * @start: the first IO port address
+ * @n: number of the consecutive IO port addresses
+ */
+void can_release_io_region(unsigned long start, unsigned long n)
+{
+       release_region(start,n);
+}
+
+/**
+ * can_request_mem_region - request memory space region
+ * @start: the first memory port physical address
+ * @n: number of the consecutive memory port addresses
+ * @name: name/label for the requested region
+ *
+ * The function hides system specific implementation of the feature.
+ *
+ * Return Value: returns positive value (1) in the case, that region could
+ *     be reserved for the driver. Returns zero (0) if there is collision with
+ *     other driver or region cannot be taken for some other reason.
+ */
+int can_request_mem_region(unsigned long start, unsigned long n, const char *name)
+{
+    #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+       return 1;
+    #else
+       return (request_mem_region(start,n,name))?1:0;
+    #endif
+}
+
+/**
+ * can_release_mem_region - release memory space region
+ * @start: the first memory port physical address
+ * @n: number of the consecutive memory port addresses
+ */
+void can_release_mem_region(unsigned long start, unsigned long n)
+{
+    #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
+       return;
+    #else
+       release_mem_region(start,n);
+    #endif
+}
+
+#ifndef CAN_WITH_RTL
+
+/**
+ * can_default_irq_dispatch - the first level interrupt dispatch handler
+ * @irq: interrupt vector number, this value is system specific
+ * @dev_id: driver private pointer registered at time of request_irq() call.
+ *     The CAN driver uses this pointer to store relationship of interrupt
+ *     to chip state structure - @struct canchip_t
+ * @regs: system dependent value pointing to registers stored in exception frame
+ * 
+ * File: src/setup.c
+ */
+can_irqreturn_t can_default_irq_dispatch(int irq, void *dev_id, struct pt_regs *regs)
+{
+       int retval;
+       struct canchip_t *chip=(struct canchip_t *)dev_id;
+
+       retval=chip->chipspecops->irq_handler(irq, chip);
+       return CAN_IRQ_RETVAL(retval);
+}
+
+/**
+ * can_chip_setup_irq - attaches chip to the system interrupt processing
+ * @chip: pointer to CAN chip structure
+ *
+ * Return Value: returns negative number in the case of fail
+ */
+int can_chip_setup_irq(struct canchip_t *chip)
+{
+       if(chip==NULL)
+               return -1;
+       if(!chip->chipspecops->irq_handler)
+               return 0;
+       if(chip->flags & CHIP_IRQ_CUSTOM)
+               return 1;
+                       
+       if ((chip->flags & CHIP_IRQ_VME) == 0) {
+               if (request_irq(chip->chip_irq,can_default_irq_dispatch,SA_SHIRQ,DEVICE_NAME,chip))
+                       return -1;
+               else {
+                       DEBUGMSG("Registered interrupt %d\n",chip->chip_irq);
+                       chip->flags |= CHIP_IRQ_SETUP;
+               }
+       } else {
+#ifdef CAN_ENABLE_VME_SUPPORT
+               if (chip->chip_irq < 1 || chip->chip_irq > 255) {
+                       CANMSG("Bad irq parameter. (1 <= irq <= 255).\n");
+                       return -EINVAL;
+               }
+               
+               request_vmeirq(chip->chip_irq, can_default_irq_dispatch, chip);
+               DEBUGMSG("Registered VME interrupt vector %d\n",chip->chip_irq);
+               chip->flags |= CHIP_IRQ_SETUP;
+#endif
+       }
+       return 1;
+}
+
+
+/**
+ * can_chip_free_irq - unregisters chip interrupt handler from the system
+ * @chip: pointer to CAN chip structure
+ */
+void can_chip_free_irq(struct canchip_t *chip)
+{
+       if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)) {
+               if(chip->flags & CHIP_IRQ_CUSTOM)
+                       return;
+
+               if ((chip->flags & CHIP_IRQ_VME) == 0)
+                       free_irq(chip->chip_irq, chip);
+               else { 
+#ifdef CAN_ENABLE_VME_SUPPORT
+                       free_vmeirq(chip->chip_irq);
+#endif
+               }
+                       chip->flags &= ~CHIP_IRQ_SETUP;
+       }
+}
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/src/template.c b/lincan-0.3.3/src/template.c
new file mode 100644 (file)
index 0000000..d990332
--- /dev/null
@@ -0,0 +1,252 @@
+/* template.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+/* This file is intended as a template file for currently unsupported hardware.
+ * Once you've changed/added the functions specific to your hardware it is
+ * possible to load the driver with the hardware option hw=template.
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/template.h"
+#include "../include/i82527.h"
+#include "../include/sja1000.h"
+
+/*
+ * IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ */
+#define IO_RANGE 0x100
+
+/**
+ * template_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function template_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well. 
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int template_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) {
+               CANMSG("Unable to open port: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }else {
+               DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       }
+       return 0;
+}
+
+/**
+ * template_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function template_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int template_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr,IO_RANGE);
+
+       return 0;
+}
+
+/**
+ * template_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_reset() is used to give a hardware reset. This is 
+ * rather hardware specific so I haven't included example code. Don't forget to 
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int template_reset(struct candevice_t *candev)
+{
+       return 0;
+}
+
+#define RESET_ADDR 0x0
+#define NR_82527 1
+#define NR_SJA1000 0
+
+/**
+ * template_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of Intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of Philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int template_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=RESET_ADDR;
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+/**
+ * template_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function template_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus 
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * The entry @int_cpu_reg holds hardware specific options for the cpu interface
+ * register. Options defined in the %i82527.h file:
+ * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int template_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       i82527_fill_chipspecops(candev->chip[chipnr]);
+       /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/
+       /*sja1000p_fill_chipspecops(candev->chip[chipnr]);*/
+       
+       candev->chip[chipnr]->chip_base_addr=candev->io_addr;
+       candev->chip[chipnr]->clock = 16000000;
+       candev->chip[chipnr]->int_cpu_reg = iCPU_DSC;
+       candev->chip[chipnr]->int_clk_reg = iCLK_SL1;
+       candev->chip[chipnr]->int_bus_reg = iBUS_CBY;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL |
+                                                               sjaOCR_TX0_LH;
+
+       return 0;
+}
+
+/**
+ * template_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function template_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message 
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/template.c
+ */
+int template_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr+(objnr+1)*0x10;
+       
+       return 0;
+}
+
+/**
+ * template_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function template_program_irq() is used for hardware that uses 
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and 
+ * leave this function unedited. Again this function is hardware specific so 
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/template.c
+ */
+int template_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * template_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function template_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/template.c
+ */
+void template_write_register(unsigned data, unsigned long address)
+{
+       outb(data,address);
+}
+
+/**
+ * template_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function template_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/template.c
+ */
+unsigned template_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+/* !!! Don't change this function !!! */
+int template_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = template_request_io;
+       hwspecops->release_io = template_release_io;
+       hwspecops->reset = template_reset;
+       hwspecops->init_hw_data = template_init_hw_data;
+       hwspecops->init_chip_data = template_init_chip_data;
+       hwspecops->init_obj_data = template_init_obj_data;
+       hwspecops->write_register = template_write_register;
+       hwspecops->read_register = template_read_register;
+       hwspecops->program_irq = template_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/tscan1.c b/lincan-0.3.3/src/tscan1.c
new file mode 100644 (file)
index 0000000..313f041
--- /dev/null
@@ -0,0 +1,689 @@
+/* tscan1.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ *
+ * The support for TS-CAN1 and TS-7KV provided by Ronald Gomes
+ * from Technologic Systems <http://www.embeddedarm.com/>
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/pcm3680.h"
+#include "../include/sja1000p.h"
+
+#include <linux/module.h>
+#include "../include/modparms.h"
+#include "../include/devcommon.h"
+
+#include "../include/tscan1.h"
+
+static CAN_DEFINE_SPINLOCK(ts7kv_win_lock);
+
+long clock[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1};
+MODULE_PARM(clock, "1-" __MODULE_STRING(MAX_HW_CARDS)"i");
+MODULE_PARM_DESC(clock,"clock frequency for each board in step of 1kHz");
+
+long tscanio[MAX_HW_CARDS]={-1,-1,-1,-1,-1,-1,-1,-1};
+MODULE_PARM(tscanio, "1-" __MODULE_STRING(MAX_HW_CARDS)"i");
+MODULE_PARM_DESC(tscanio,"TSCAN CAN controller IO address for each board");
+
+#if defined(TS7XXX_IO8_BASE)&&defined(TSXXX_BASE_IO)
+int tsxxx_base=TS7XXX_IO8_BASE+TSXXX_BASE_IO;
+#elif defined(TS7XXX_IO8_BASE)
+int tsxxx_base=TS7XXX_IO8_BASE;
+#else /*TS7XXX_IO8_BASE*/
+unsigned long tsxxx_base=0;
+#endif /*TS7XXX_IO8_BASE*/
+MODULE_PARM(tsxxx_base, "1i");
+MODULE_PARM_DESC(tsxxx_base,"The base of the ISA/8-bit IO space for TSxxx CAN peripherals in the system");
+
+unsigned short ts7kv_isused = 0x0;
+
+/**
+ * tscan1_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * The function tscan1_request_io() is used to reserve the io-memory. If your
+ * hardware uses a dedicated memory range as hardware control registers you
+ * will have to add the code to reserve this memory as well.
+ * %IO_RANGE is the io-memory range that gets reserved, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/tscan1.c
+ */
+int tscan1_request_io(struct candevice_t *candev)
+{
+       unsigned long can_io_addr;
+       unsigned long remap_can_io_addr = 0;
+       unsigned char mode;
+       int i, j;
+
+
+       if (!can_request_io_region(candev->io_addr, TSXXX_IO_RANGE, "tscan1-base")) {
+               CANMSG("Unable to request base IO port: 0x%lx\n", candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered base IO port: 0x%lx - 0x%lx\n",
+                       candev->io_addr, candev->io_addr+TSXXX_IO_RANGE-1);
+       }
+
+       can_io_addr = tscanio[candev->candev_idx];
+
+       if(can_io_addr && (can_io_addr != (unsigned long)-1)) {
+               remap_can_io_addr = tsxxx_base + can_io_addr;
+
+               if (!can_request_io_region(remap_can_io_addr, TSXXX_CAN_RANGE, "tscan1-can")) {
+                       CANMSG("Unable to request CAN IO port: 0x%lx\n", remap_can_io_addr);
+                       can_release_io_region(candev->io_addr, TSXXX_IO_RANGE);
+                       return -ENODEV;
+               } else {
+                       DEBUGMSG("Registered CAN IO port: 0x%lx - 0x%lx\n",
+                       remap_can_io_addr, remap_can_io_addr+TSXXX_CAN_RANGE-1);
+               }
+       } else {
+               for(i = 0; 1; i++) {
+
+                       if(i>=8) {
+                               CANMSG("Unable find range for CAN IO port\n");
+                               can_release_io_region(candev->io_addr, TSXXX_IO_RANGE);
+                               return -ENODEV;
+                       }
+
+                       can_io_addr = 0x100 + i * TSXXX_CAN_RANGE;
+                       for (j = 0; j < MAX_HW_CARDS; j++) {
+                               if(tscanio[j] == can_io_addr) {
+                                       j = -1;
+                                       break;
+                               }
+                       }
+                       if(j<0)
+                               continue;
+
+                       remap_can_io_addr = tsxxx_base + can_io_addr;
+
+                       if (can_request_io_region(remap_can_io_addr, TSXXX_CAN_RANGE, "tscan1-can"))
+                               break;
+               }
+
+               tscanio[candev->candev_idx] = can_io_addr;
+
+               DEBUGMSG("Found free range and registered CAN IO port: 0x%lx - 0x%lx\n",
+                       remap_can_io_addr, remap_can_io_addr+TSXXX_CAN_RANGE-1);
+       }
+
+       candev->chip[0]->chip_base_addr = remap_can_io_addr;
+       candev->chip[0]->msgobj[0]->obj_base_addr = remap_can_io_addr;
+
+       switch(can_io_addr) {
+               case 0x100:     mode=0x60; break;
+               case 0x120:     mode=0x61; break;
+               case 0x180:     mode=0x62; break;
+               case 0x1A0:     mode=0x63; break;
+               case 0x200:     mode=0x64; break;
+               case 0x240:     mode=0x65; break;
+               case 0x280:     mode=0x66; break;
+               case 0x320:     mode=0x67; break;
+               default:        mode=0x60; break;
+       }
+
+       outb(0x00, candev->io_addr+TSCAN1_WIN_REG);
+       outb(mode, candev->io_addr+TSCAN1_MOD_REG);
+
+       return 0;
+}
+
+int ts7kv_request_io(struct candevice_t *candev)
+{
+       if (!can_request_io_region(candev->io_addr, TSXXX_CAN_RANGE, "ts7kv-can")) {
+               CANMSG("Unable to request CAN IO port: 0x%lx\n", candev->io_addr);
+               return -ENODEV;
+       } else {
+               DEBUGMSG("Registered CAN IO port: 0x%lx - 0x%lx\n",
+                       candev->io_addr, candev->io_addr+TSXXX_CAN_RANGE-1);
+       }
+
+       return 0;
+}
+
+/**
+ * tscan1_release_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * The function tscan1_release_io() is used to free reserved io-memory.
+ * In case you have reserved more io memory, don't forget to free it here.
+ * IO_RANGE is the io-memory range that gets released, please adjust according
+ * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
+ * #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
+ * Return Value: The function always returns zero
+ * File: src/tscan1.c
+ */
+int tscan1_release_io(struct candevice_t *candev)
+{
+       unsigned long remap_can_io_addr;
+
+       if(candev->chip[0]){
+               remap_can_io_addr = candev->chip[0]->chip_base_addr;
+               if(remap_can_io_addr != (unsigned long)-1)
+                       can_release_io_region(remap_can_io_addr, TSXXX_CAN_RANGE);
+       }
+
+       outb(0x20, candev->io_addr+TSCAN1_MOD_REG);
+
+       can_release_io_region(candev->io_addr, TSXXX_IO_RANGE);
+       return 0;
+}
+
+int ts7kv_release_io(struct candevice_t *candev)
+{
+       can_release_io_region(candev->io_addr, TSXXX_CAN_RANGE);
+       return 0;
+}
+
+/**
+ * tscan1_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function tscan1_reset() is used to give a hardware reset. This is
+ * rather hardware specific so I haven't included example code. Don't forget to
+ * check the reset status of the chip before returning.
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/tscan1.c
+ */
+int tscan1_reset(struct candevice_t *candev)
+{
+       unsigned short i=0, chipnr;
+       struct canchip_t *chip;
+
+       DEBUGMSG("Resetting %s hardware ...\n", candev->hwname);
+
+       for(chipnr=0;chipnr<candev->nr_sja1000_chips;chipnr++) {
+               chip=candev->chip[chipnr];
+               can_write_reg(chip, sjaMOD_RM, SJAMOD);
+               udelay(1000);
+               can_write_reg(chip, 0x00, SJAIER);
+               udelay(1000);
+               i=20;
+               while (can_read_reg(chip, SJAMOD)&sjaMOD_RM){
+                       if(!i--) return -ENODEV;
+                       udelay(1000);
+                       can_write_reg(chip, 0, SJAMOD);
+               }
+               udelay(1000);
+               can_write_reg(chip, sjaCDR_PELICAN, SJACDR);
+               can_write_reg(chip, 0x00, SJAIER);
+       }
+
+       return 0;
+}
+
+#define RESET_ADDR 0x100
+#define NR_82527 0
+#define NR_SJA1000 1
+
+int tscan1_check_presence(unsigned long remap_io_addr, int *pjmp)
+{
+       int result = -ENODEV;
+
+       if (!can_request_io_region(remap_io_addr, TSXXX_IO_RANGE, "tscan1-probe"))
+               return -ENODEV;
+
+       do {
+               if (inb(remap_io_addr+TSXXX_ID0_REG)!=TSCAN1_ID0 ||
+                       inb(remap_io_addr+TSXXX_ID1_REG)!=TSCAN1_ID1)
+                       break;
+
+               outb(0x00, remap_io_addr+TSCAN1_WIN_REG);
+               outb(0x20, remap_io_addr+TSCAN1_MOD_REG);
+
+               if(pjmp)
+                       *pjmp = inb(remap_io_addr+TSCAN1_JMP_REG);
+
+               result = 0;
+       } while (0);
+
+       can_release_io_region(remap_io_addr, TSXXX_IO_RANGE);
+
+       return result;
+}
+
+
+/**
+ * tscan1_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function tscan1_init_hw_data() is used to initialize the hardware
+ * structure containing information about the installed CAN-board.
+ * %RESET_ADDR represents the io-address of the hardware reset register.
+ * %NR_82527 represents the number of intel 82527 chips on the board.
+ * %NR_SJA1000 represents the number of philips sja1000 chips on the board.
+ * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that
+ * the hardware uses programmable interrupts.
+ * Return Value: The function always returns zero
+ * File: src/tscan1.c
+ */
+
+int tscan1_init_hw_data(struct candevice_t *candev)
+{
+       int i, j, jmp;
+       unsigned long io_addr;
+       unsigned long remap_io_addr;
+
+       io_addr = candev->io_addr;
+
+       if(io_addr && (io_addr != (unsigned long)-1)) {
+               remap_io_addr = io_addr = tsxxx_base;
+
+               if(tscan1_check_presence(remap_io_addr, &jmp)){
+                       CANMSG("No TSCAN1 card found at address 0xlx\n");
+                       return -ENODEV;
+               }
+       } else {
+               DEBUGMSG("Scanning bus for TS-CAN1 boards...\n");
+
+               for (i=0; 1;i++)
+               {
+                       if(i >= 4) {
+                               CANMSG("No TS-CAN1 boards found for slot %d\n", candev->candev_idx);
+                               return -ENODEV;
+                       }
+
+                       io_addr = TSCAN1_BASE_IO + i*TSXXX_IO_RANGE;
+                       remap_io_addr = io_addr = tsxxx_base;
+
+                       for (j = 0; j < MAX_HW_CARDS; j++) {
+                               if(io[j] == io_addr){
+                                       j = -1;
+                                       break;
+                               }
+                       }
+                       if(j<0)
+                               continue;
+
+                       if(!tscan1_check_presence(remap_io_addr, &jmp))
+                               break;
+
+               }
+               DEBUGMSG("TS-CAN1 board was found at 0x%lx for driver slot %d\n",
+                                       io_addr, candev->candev_idx);
+
+               io[candev->candev_idx] = io_addr;
+       }
+
+       candev->io_addr = remap_io_addr;
+       /* unused reset address is used to store jumper setting */
+       candev->res_addr = jmp;
+
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       DEBUGMSG("Memory region at 0x%lx assigned to sja1000 of driver %d/%s\n",
+               candev->io_addr, candev->candev_idx, candev->hwname);
+
+       return 0;
+}
+
+
+int ts7kv_check_presence(unsigned long remap_io_addr, int *pjmp)
+{
+       int result = -ENODEV;
+
+       if (!can_request_io_region(remap_io_addr, TSXXX_IO_RANGE, "ts7kv-probe"))
+               return -ENODEV;
+
+       do {
+               if (inb(remap_io_addr+TSXXX_ID0_REG)!=TS7KV_ID0 ||
+                       inb(remap_io_addr+TSXXX_ID1_REG)!=TS7KV_ID1)
+                       break;
+
+               if(pjmp)
+                       *pjmp = inb(remap_io_addr+TS7KV_JMP_REG);
+
+               result = 0;
+       } while (0);
+
+       can_release_io_region(remap_io_addr, TSXXX_IO_RANGE);
+
+       return result;
+}
+
+int ts7kv_init_hw_data(struct candevice_t *candev)
+{
+       int i, j, jmp;
+       unsigned long io_addr;
+       unsigned long remap_io_addr;
+       unsigned long can_io_addr;
+
+       io_addr = candev->io_addr;
+
+       if(io_addr && (io_addr != (unsigned long)-1)) {
+               remap_io_addr = io_addr = tsxxx_base;
+
+               if(ts7kv_check_presence(remap_io_addr, &jmp)){
+                       CANMSG("No TS7KV card found at address 0xlx\n");
+                       return -ENODEV;
+               }
+       } else {
+               DEBUGMSG("Scanning bus for TS7KV boards...\n");
+
+               for (i=0; 1;i++)
+               {
+                       if(i >= 4) {
+                               CANMSG("No TS7KV boards found for slot %d\n", candev->candev_idx);
+                               return -ENODEV;
+                       }
+
+                       io_addr = TS7KV_BASE_IO + i*TSXXX_IO_RANGE;
+                       remap_io_addr = io_addr = tsxxx_base;
+
+                       for (j = 0; j < MAX_HW_CARDS; j++) {
+                               if(io[j] == io_addr){
+                                       j = -1;
+                                       break;
+                               }
+                       }
+                       if(j<0)
+                               continue;
+
+                       if(!ts7kv_check_presence(remap_io_addr, &jmp))
+                               break;
+
+               }
+               DEBUGMSG("TS7KV board was found at 0x%lx for driver slot %d\n",
+                                       io_addr, candev->candev_idx);
+
+               io[candev->candev_idx] = io_addr;
+       }
+
+       can_io_addr = ((io_addr>>3)&0x03)*0x20;
+       tscanio[candev->candev_idx] = can_io_addr;
+
+       /* dev_base_addr address is used to store remapped PLD base address */
+       candev->dev_base_addr = remap_io_addr;
+
+       /* dev_base_addr address is used to store remapped slave window address */
+       candev->io_addr = can_io_addr+tsxxx_base;
+
+       /* unused reset address is used to store jumper setting */
+       candev->res_addr = jmp;
+
+       candev->nr_82527_chips=NR_82527;
+       candev->nr_sja1000_chips=NR_SJA1000;
+       candev->nr_all_chips=NR_82527+NR_SJA1000;
+       candev->flags &= ~CANDEV_PROGRAMMABLE_IRQ;
+
+       DEBUGMSG("Memory region at 0x%lx assigned to sja1000 of driver %d/%s\n",
+               candev->io_addr, candev->candev_idx, candev->hwname);
+
+       return 0;
+}
+
+/**
+ * tscan1_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * The function tscan1_init_chip_data() is used to initialize the hardware
+ * structure containing information about the CAN chips.
+ * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or
+ * "sja1000".
+ * The @chip_base_addr entry represents the start of the 'official' memory map
+ * of the installed chip. It's likely that this is the same as the @io_addr
+ * argument supplied at module loading time.
+ * The @clock entry holds the chip clock value in Hz.
+ * The entry @sja_cdr_reg holds hardware specific options for the Clock Divider
+ * register. Options defined in the %sja1000.h file:
+ * %sjaCDR_CLKOUT_MASK, %sjaCDR_CLK_OFF, %sjaCDR_RXINPEN, %sjaCDR_CBP, %sjaCDR_PELICAN
+ * The entry @sja_ocr_reg holds hardware specific options for the Output Control
+ * register. Options defined in the %sja1000.h file:
+ * %sjaOCR_MODE_BIPHASE, %sjaOCR_MODE_TEST, %sjaOCR_MODE_NORMAL, %sjaOCR_MODE_CLOCK,
+ * %sjaOCR_TX0_LH, %sjaOCR_TX1_ZZ.
+ * The entry @int_clk_reg holds hardware specific options for the Clock Out
+ * register. Options defined in the %i82527.h file:
+ * %iCLK_CD0, %iCLK_CD1, %iCLK_CD2, %iCLK_CD3, %iCLK_SL0, %iCLK_SL1.
+ * The entry @int_bus_reg holds hardware specific options for the Bus
+ * Configuration register. Options defined in the %i82527.h file:
+ * %iBUS_DR0, %iBUS_DR1, %iBUS_DT1, %iBUS_POL, %iBUS_CBY.
+ * Return Value: The function always returns zero
+ * File: src/tscan1.c
+ */
+int tscan1_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       unsigned long clk;
+       int jmp;
+       int irq = -1;
+
+       clk = clock[candev->candev_idx];
+       if(!clk || (clk == -1))
+               clk = 16000 * 1000;
+       else
+               clk *= 1000;
+
+       /* unused reset address is used to store jumper setting */
+       jmp = candev->res_addr;
+
+       if (jmp&0x10 && jmp&0x20) irq=TSXXX_IRQ5;
+       else if (jmp&0x10) irq=TSXXX_IRQ6;
+       else if (jmp&0x20) irq=TSXXX_IRQ7;
+
+       if(irq<0) {
+               CANMSG("Jumpers select no IRQ for TSCAN1 at 0x%lx of driver %d/%s\n",
+                       candev->io_addr, candev->candev_idx, candev->hwname);
+               return -ENODEV;
+       }
+       candev->chip[chipnr]->chip_irq = irq;
+
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+       candev->chip[chipnr]->clock = clk;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+       /* 
+        * The address is assigned during tscan1_request_io()
+        * according to found free ranges or tscanio option
+        */
+       candev->chip[chipnr]->chip_base_addr = (unsigned long)-1;
+
+       return 0;
+}
+
+int ts7kv_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       unsigned long clk;
+       int jmp;
+       int irq = -1;
+
+       clk = clock[candev->candev_idx];
+       if(!clk || (clk == -1))
+               clk = 24000 * 1000;
+       else
+               clk *= 1000;
+
+       /* unused reset address is used to store jumper setting */
+       jmp = candev->res_addr;
+
+       if (jmp&0x10 && jmp&0x20) irq=TSXXX_IRQ5;
+       else if (jmp&0x10) irq=TSXXX_IRQ6;
+       else if (jmp&0x20) irq=TSXXX_IRQ7;
+
+       if(irq<0) {
+               CANMSG("Jumpers select no IRQ for TS7KV CAN at 0x%lx of driver %d/%s\n",
+                       candev->io_addr, candev->candev_idx, candev->hwname);
+               return -ENODEV;
+       }
+
+       candev->chip[chipnr]->chip_irq = irq;
+
+       sja1000p_fill_chipspecops(candev->chip[chipnr]);
+
+       candev->chip[chipnr]->clock = clk;
+       candev->chip[chipnr]->int_clk_reg = 0x0;
+       candev->chip[chipnr]->int_bus_reg = 0x0;
+       candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF;
+       candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
+       candev->chip[chipnr]->chip_base_addr = candev->io_addr;
+
+       return 0;
+}
+
+/**
+ * tscan1_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * The function tscan1_init_obj_data() is used to initialize the hardware
+ * structure containing information about the different message objects on the
+ * CAN chip. In case of the sja1000 there's only one message object but on the
+ * i82527 chip there are 15.
+ * The code below is for a i82527 chip and initializes the object base addresses
+ * The entry @obj_base_addr represents the first memory address of the message
+ * object. In case of the sja1000 @obj_base_addr is taken the same as the chips
+ * base address.
+ * Unless the hardware uses a segmented memory map, flags can be set zero.
+ * Return Value: The function always returns zero
+ * File: src/tscan1.c
+ */
+int tscan1_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       chip->msgobj[objnr]->obj_base_addr = chip->chip_base_addr;
+       return 0;
+}
+
+/**
+ * tscan1_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * The function tscan1_program_irq() is used for hardware that uses
+ * programmable interrupts. If your hardware doesn't use programmable interrupts
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and
+ * leave this function unedited. Again this function is hardware specific so
+ * there's no example code.
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/tscan1.c
+ */
+int tscan1_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * tscan1_write_register - Low level write register routine
+ * @data: data to be written
+ * @address: memory address to write to
+ *
+ * The function tscan1_write_register() is used to write to hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific write process.
+ * Return Value: The function does not return a value
+ * File: src/tscan1.c
+ */
+void tscan1_write_register(unsigned data, unsigned long address)
+{
+       outb(data, address);
+}
+
+void ts7kv_write_register(unsigned data, unsigned long address)
+{
+       unsigned long base = address & ~0x1f;
+       unsigned char nwin = 0x10;
+       unsigned char savewin;
+       
+       can_spin_irqflags_t flags;
+
+       if((address&0x1f) > 0x1d) {
+               nwin++;
+               address -= 0x10;
+       }
+
+       can_spin_lock_irqsave(&ts7kv_win_lock,flags);
+       savewin = inb(base+TS7KV_WIN_REG);
+       if(nwin == savewin) {
+               outb(data, address);
+       }else{
+               outb(nwin, base+TS7KV_WIN_REG);
+               outb(data, address);
+               outb(savewin, base+TS7KV_WIN_REG);
+       }
+       can_spin_unlock_irqrestore(&ts7kv_win_lock,flags);
+}
+
+/**
+ * tscan1_read_register - Low level read register routine
+ * @address: memory address to read from
+ *
+ * The function tscan1_read_register() is used to read from hardware registers
+ * on the CAN chip. You should only have to edit this function if your hardware
+ * uses some specific read process.
+ * Return Value: The function returns the value stored in @address
+ * File: src/tscan1.c
+ */
+unsigned tscan1_read_register(unsigned long address)
+{
+       return inb(address);
+}
+
+unsigned ts7kv_read_register(unsigned long address)
+{
+       unsigned long base = address & ~0x1f;
+       unsigned char nwin = 0x10;
+       unsigned char savewin;
+       unsigned val;
+       
+       can_spin_irqflags_t flags;
+
+       if((address&0x1f) > 0x1d) {
+               nwin++;
+               address -= 0x10;
+       }
+
+       can_spin_lock_irqsave(&ts7kv_win_lock,flags);
+       savewin = inb(base+TS7KV_WIN_REG);
+       if(nwin == savewin) {
+               val = inb(address);
+       }else{
+               outb(nwin, base+TS7KV_WIN_REG);
+               val = inb(address);
+               outb(savewin, base+TS7KV_WIN_REG);
+       }
+       can_spin_unlock_irqrestore(&ts7kv_win_lock,flags);
+
+       return val;
+}
+
+int tscan1_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = tscan1_request_io;
+       hwspecops->release_io = tscan1_release_io;
+       hwspecops->reset = tscan1_reset;
+       hwspecops->init_hw_data = tscan1_init_hw_data;
+       hwspecops->init_chip_data = tscan1_init_chip_data;
+       hwspecops->init_obj_data = tscan1_init_obj_data;
+       hwspecops->write_register = tscan1_write_register;
+       hwspecops->read_register = tscan1_read_register;
+       hwspecops->program_irq = tscan1_program_irq;
+       return 0;
+}
+
+extern int ts7kv_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = ts7kv_request_io;
+       hwspecops->release_io = ts7kv_release_io;
+       hwspecops->reset = tscan1_reset;
+       hwspecops->init_hw_data = ts7kv_init_hw_data;
+       hwspecops->init_chip_data = ts7kv_init_chip_data;
+       hwspecops->init_obj_data = tscan1_init_obj_data;
+       hwspecops->write_register = ts7kv_write_register;
+       hwspecops->read_register = ts7kv_read_register;
+       hwspecops->program_irq = tscan1_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/unican.c b/lincan-0.3.3/src/unican.c
new file mode 100644 (file)
index 0000000..55cfbd5
--- /dev/null
@@ -0,0 +1,1005 @@
+/* unican.c
+ * Linux CAN-bus device driver.
+ * Written for new CAN driver version by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/unican_cl2.h"
+#include "../include/setup.h"
+
+#define UNICAN_PCI_VENDOR  0xFA3C
+#define UNICAN_PCI_ID      0x0101
+
+static void unican_delay(long msdelay)
+{
+    #ifdef CAN_WITH_RTL
+       if(!rtl_rt_system_is_idle()) {
+               rtl_delay(1000000l*msdelay);
+       }else
+    #endif /*CAN_WITH_RTL*/
+       {
+               set_current_state(TASK_UNINTERRUPTIBLE);
+               schedule_timeout((msdelay*HZ)/1000+1);
+       }
+
+}
+
+/* * * unican Chip Functionality * * */
+
+int unican_enable_configuration(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int unican_disable_configuration(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_chip_config: - can chip configuration
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_chip_config(struct canchip_t *chip)
+{
+       int ret;
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+
+       unican_delay(10);
+       
+       /* disable all card interrupts */
+       ret = cl2_int_mode(chipext, INT_MODE_ALL*0);
+       if(ret != CL2_OK) {
+               CANMSG("disable interrupts by cl2_iit_mode returned %d\n",ret);
+               return -ENODEV;
+       }
+       unican_delay(1);
+
+        if (chip->baudrate == 0)
+                chip->baudrate=1000000;
+               
+       ret = chip->chipspecops->baud_rate(chip,chip->baudrate,chip->clock,0,75,0);
+       if(ret < 0){
+               CANMSG("can not set baudrate\n");
+               return ret;
+       }
+       
+       unican_delay(2);
+       /* set interrupt inhibit time to 1 ms */
+       ret = cl2_set_iit(chipext, 10);
+       if(ret != CL2_OK) {
+               CANMSG("cl2_set_iit returned %d\n",ret);
+               return -ENODEV;
+       }
+       unican_delay(1);
+
+       /* enable start interrupt inhibit time command */
+       ret = cl2_iit_mode(chipext, 1);
+       if(ret != CL2_OK) {
+               CANMSG("cl2_iit_mode returned %d\n",ret);
+               return -ENODEV;
+       }
+       unican_delay(1);
+       
+       /* enable all card interrupts */
+       ret = cl2_int_mode(chipext, INT_MODE_ALL);
+       if(ret != CL2_OK) {
+               CANMSG("cl2_iit_mode returned %d\n",ret);
+               return -ENODEV;
+       }
+       unican_delay(1);
+
+       /* generate interrupt command */
+       cl2_gen_interrupt(chipext);
+
+
+       return 0;
+}
+
+/**
+ * unican_extended_mask: - setup of extended mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_extended_mask(struct canchip_t *chip, unsigned long code, unsigned  long mask)
+{
+       return 0;
+}
+
+/**
+ * unican_baud_rate: - set communication parameters.
+ * @chip: pointer to chip state structure
+ * @rate: baud rate in Hz
+ * @clock: frequency of sja1000 clock in Hz (ISA osc is 14318000)
+ * @sjw: synchronization jump width (0-3) prescaled clock cycles
+ * @sampl_pt: sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
+ * @flags: fields %BTR1_SAM, %OCMODE, %OCPOL, %OCTP, %OCTN, %CLK_OFF, %CBP
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                                                       int sampl_pt, int flags)
+{
+       int ret;
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+       int bt_val;
+
+       switch (rate) {
+               case 5000:   bt_val = CL2_BITRATE_5K; break;
+               case 10000:  bt_val = CL2_BITRATE_10K; break;
+               case 20000:  bt_val = CL2_BITRATE_20K; break;
+               case 50000:  bt_val = CL2_BITRATE_50K; break;
+               case 100000: bt_val = CL2_BITRATE_100K; break;
+               case 125000: bt_val = CL2_BITRATE_125K; break;
+               case 200000: bt_val = CL2_BITRATE_200K; break;
+               case 250000: bt_val = CL2_BITRATE_250K; break;
+               case 500000: bt_val = CL2_BITRATE_500K; break;
+               case 800000: bt_val = CL2_BITRATE_800K; break;
+               case 1000000:bt_val = CL2_BITRATE_1M; break;
+               default: return -EINVAL;
+       }
+       
+       ret=cl2_set_bitrate(chipext,bt_val);
+       if(ret == CL2_COMMAND_BUSY) return -EBUSY;
+       if(ret != CL2_OK) return -EINVAL;
+       unican_delay(2);
+       
+       return 0;
+}
+
+/**
+ * unican_read: - reads and distributes one or more received messages
+ * @chip: pointer to chip state structure
+ * @obj: pinter to CAN message queue information
+ *
+ * This is rewritten cl2_receive_data function. The direct use of CL2
+ * function would require one more message data copy to reformat message
+ * data into different structure layout. Other way is to rewrite CL2 sources.
+ * No of these solutions is perfect.
+ *
+ * File: src/unican.c
+ */
+void unican_read(struct canchip_t *chip, struct msgobj_t *obj) {
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+       __u16 *ptr16;
+       __u16 u;
+       unsigned long timestamp;
+       int i;
+
+       do {
+               ptr16 = (__u16*)chipext->rxBufPtr;
+               u = unican_readw(ptr16++);
+               if ( !(u & CL2_MESSAGE_VALID) ) break; /* No more messages in the queue */
+
+               obj->rx_msg.id = ((__u32)(u & 0xFF00 )) << 16;
+               u = unican_readw(ptr16++);
+               obj->rx_msg.id |= ((__u32)( u & 0x00FF )) << 16;
+               obj->rx_msg.id |= (__u32)( u & 0xFF00 );
+               u = unican_readw(ptr16++);
+               obj->rx_msg.id |= (__u32)( u & 0x00FF );
+
+
+               u >>= 8;
+
+               if ( u & CL2_EXT_FRAME ) {      /* 2.0B frame */
+                       obj->rx_msg.id >>= 3;
+                       obj->rx_msg.flags = MSG_EXT;
+               } else {                        /* 2.0A frame */
+                       obj->rx_msg.id >>= 21;
+                       obj->rx_msg.flags = 0;
+               }
+
+               /*if ( !(u & (CL2_REMOTE_FRAME<<8)) ) 
+                       obj->rx_msg.flags |= MSG_RTR;*/
+
+               obj->rx_msg.length = ( (u >> 4) & 0x000F );
+               if(obj->rx_msg.length > CAN_MSG_LENGTH) obj->rx_msg.length = CAN_MSG_LENGTH;
+
+               for ( i = 0; i < obj->rx_msg.length; ) {
+                       u = unican_readw(ptr16++);
+                       obj->rx_msg.data[i++] = (__u8)( u );
+                       obj->rx_msg.data[i++] = (__u8)( u >> 8 );
+               }
+               if ( obj->rx_msg.length & 0x01 ) {      /* odd */
+                       timestamp = ( (unican_readw(ptr16++) & 0x00FF) | (u & 0xFF00) );
+               } else {                                /* even */
+                       u = unican_readw(ptr16++);
+                       timestamp = (u << 8) | (u >> 8);
+               }
+               unican_writew(0x000,(__u16*)chipext->rxBufPtr);
+
+              #ifdef CAN_MSG_VERSION_2
+               obj->rx_msg.timestamp.tv_sec = 0;
+               obj->rx_msg.timestamp.tv_usec = timestamp;
+               #else /* CAN_MSG_VERSION_2 */
+               obj->rx_msg.timestamp = timestamp;
+               #endif /* CAN_MSG_VERSION_2 */
+              
+               /* increment rx-buffer pointer */
+               if ( (chipext->rxBufBase + chipext->rxBufSize*16 ) <= (chipext->rxBufPtr += 16) ) {
+                       chipext->rxBufPtr = chipext->rxBufBase;
+               }
+
+               canque_filter_msg2edges(obj->qends, &obj->rx_msg);
+
+       } while (1);
+}
+
+/**
+ * unican_pre_read_config: - prepares message object for message reception
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive value indicates immediate reception of message.
+ * File: src/unican.c
+ */
+int unican_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       return 0;
+}
+
+#define MAX_TRANSMIT_WAIT_LOOPS 10
+/**
+ * unican_pre_write_config: - prepares message object for message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       return 0;
+}
+
+/**
+ * unican_send_msg: - initiate message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * This function is called after unican_pre_write_config() function,
+ * which prepares data in chip buffer.
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_send_msg(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       return 0;
+}
+
+/**
+ * unican_check_tx_stat: - checks state of transmission engine
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive return value indicates transmission under way status.
+ *     Zero value indicates finishing of all issued transmission requests.
+ * File: src/unican.c
+ */
+int unican_check_tx_stat(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_set_btregs: -  configures bitrate registers
+ * @chip: pointer to chip state structure
+ * @btr0: bitrate register 0
+ * @btr1: bitrate register 1
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1)
+{
+       int ret;
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+       int bt_val;
+
+       bt_val=btr0 | (btr1<<8);
+       ret=cl2_set_bitrate(chipext,bt_val);
+       if(ret == CL2_COMMAND_BUSY) return -EBUSY;
+       if(ret != CL2_OK) return -EINVAL;
+
+       return 0;
+}
+
+/**
+ * unican_stop_chip: -  starts chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_start_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_stop_chip: -  stops chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_stop_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_attach_to_chip: - attaches to the chip, setups registers and state
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int unican_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_release_chip: - called before chip structure removal if %CHIP_ATTACHED is set
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int unican_release_chip(struct canchip_t *chip)
+{
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+
+       unican_stop_chip(chip);
+       cl2_clear_interrupt(chipext);
+
+       return 0;
+}
+
+/**
+ * unican_remote_request: - configures message object and asks for RTR message
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_remote_request(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       CANMSG("unican_remote_request not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * unican_standard_mask: - setup of mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_standard_mask(struct canchip_t *chip, unsigned short code,
+               unsigned short mask)
+{
+       CANMSG("unican_standard_mask not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * unican_clear_objects: - clears state of all message object residing in chip
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_clear_objects(struct canchip_t *chip)
+{
+       CANMSG("unican_clear_objects not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * unican_config_irqs: - tunes chip hardware interrupt delivery
+ * @chip: pointer to chip state structure
+ * @irqs: requested chip IRQ configuration
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_config_irqs(struct canchip_t *chip, short irqs)
+{
+
+       CANMSG("unican_config_irqs not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * unican_irq_write_handler: - part of ISR code responsible for transmit events
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * The main purpose of this function is to read message from attached queues
+ * and transfer message contents into CAN controller chip.
+ * This subroutine is called by
+ * unican_irq_write_handler() for transmit events.
+ * File: src/unican.c
+ */
+void unican_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       int cmd;
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+       __u16 *ptr16 = (__u16*)chipext->rxBufPtr;
+       __u16 u;
+       unsigned long timestamp=0;
+       unsigned long cobid;
+       int i;
+       int len;
+
+       #if 0
+       if(obj->tx_slot){
+               /* Do local transmitted message distribution if enabled */
+               if (processlocal){
+                       obj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+       }
+       #endif
+
+       if ( chipext->asyncTxBufSize==0 ) {
+               canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_PREP);
+               return; /* No asynchronous queue configured */
+       }
+
+       do {
+               ptr16 = (__u16*)chipext->asyncTxBufPtr;
+               if(unican_readw(ptr16) & CL2_MESSAGE_VALID)
+                       return;         /* No free space in asynchronous Tx queue */
+
+               cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
+               if(cmd<0)
+                       return;         /* No more messages to send */
+               
+
+               cobid = obj->tx_slot->msg.id;
+               
+               if ( (obj->tx_slot->msg.flags & MSG_EXT) ) {    /* 2.0B frame */
+                       cobid <<= 3;
+               } else {                                        /* 2.0A frame */
+                       cobid <<= 5+16;
+               }
+               ptr16++;
+               u = ((cobid>>16) & 0x00FF ) + (cobid & 0xFF00);
+               unican_writew(u,ptr16++);
+
+               len = obj->tx_slot->msg.length;
+               if(len > CAN_MSG_LENGTH)
+                       len = CAN_MSG_LENGTH;
+               u = (len << 12) | (cobid & 0x00FF);
+               
+               if ( !(obj->tx_slot->msg.flags & MSG_RTR) ) 
+                       u |= CL2_REMOTE_FRAME<<8;
+               if ( obj->tx_slot->msg.flags & MSG_EXT ) 
+                       u |= CL2_EXT_FRAME<<8;
+
+               unican_writew(u,ptr16++);
+
+               for ( i = 0; i < len-1; )       {
+                       u = obj->tx_slot->msg.data[i++];
+                       u |= ((__u16)obj->tx_slot->msg.data[i]<<8); i++;
+                       unican_writew(u,ptr16++);
+               }
+               if(i == len) {
+                       unican_writew(timestamp,ptr16);
+               } else {
+                       u = obj->tx_slot->msg.data[i++];
+                       u |= ((timestamp & 0x00FF)<<8);
+                       unican_writew(u,ptr16++);
+                       unican_writew(timestamp & 0x00FF, ptr16);
+               }
+
+               u = ((cobid>>16) & 0xFF00) | CL2_MESSAGE_VALID;
+               unican_writew(u,(__u16*)chipext->asyncTxBufPtr);
+
+               if ( (chipext->asyncTxBufBase + chipext->asyncTxBufSize*16) <= 
+                                               (chipext->asyncTxBufPtr += 16) ) {
+                       chipext->asyncTxBufPtr = chipext->asyncTxBufBase;
+               }
+
+
+               /* Do local transmitted message distribution if enabled. */
+               /* This code should not be called directly there, because it breaks strict
+                  behavior of queues if O_SYNC is set. */
+               if (processlocal){
+                       obj->tx_slot->msg.flags |= MSG_LOCAL;
+                       canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               }
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+       
+       }while(1);
+       
+       return;
+
+}
+
+void unican_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)) {
+
+               if(can_msgobj_test_and_clear_fl(obj,TX_REQUEST)) {
+                       unican_irq_write_handler(chip, obj);
+               }
+
+               /*if(can_msgobj_test_and_clear_fl(obj,FILTCH_REQUEST)) {
+                       unican_irq_update_filter(chip, obj);
+               }*/
+
+               can_msgobj_clear_fl(obj,TX_LOCK);
+               if(can_msgobj_test_fl(obj,TX_REQUEST))
+                       continue;
+               if(can_msgobj_test_fl(obj,FILTCH_REQUEST) && !obj->tx_slot)
+                       continue;
+               break;
+       }
+}
+
+
+#define MAX_RETR 10
+
+/**
+ * unican_irq_handler: - interrupt service routine
+ * @irq: interrupt vector number, this value is system specific
+ * @chip: pointer to chip state structure
+ * 
+ * Interrupt handler is activated when state of CAN controller chip changes,
+ * there is message to be read or there is more space for new messages or
+ * error occurs. The receive events results in reading of the message from
+ * CAN controller chip and distribution of message through attached
+ * message queues.
+ * File: src/unican.c
+ */
+int unican_irq_handler(int irq, struct canchip_t *chip)
+{
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+       struct msgobj_t *obj=chip->msgobj[0];
+       __u16 status;
+       __u16 error;
+
+       if(!(chip->flags&CHIP_CONFIGURED)) {
+               CANMSG("unican_irq_handler: called for non-configured device\n");
+               return CANCHIP_IRQ_NONE;
+       }
+
+       if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST) {
+               /* Reenable interrupts generation, this has to be even there, 
+                * because irq_accept disables interrupts
+                */
+               cl2_gen_interrupt(chipext);
+               return CANCHIP_IRQ_NONE;
+       }
+
+       cl2_clear_interrupt(chipext);
+
+
+       if(status & CL2_CARD_ERROR) {
+               cl2_get_error(chipext, &error);
+               CANMSG("unican_irq_handler: card status=0x%04x error=0x%04x \n",status,error);
+       }
+       if(status & CL2_ASYNC_QUEUE_EMPTY) {
+
+       }
+       if(status & CL2_SYNC_QUEUE_EMPTY) {
+               can_msgobj_set_fl(obj,TX_REQUEST);
+
+               /* calls unican_irq_write_handler synchronized with other invocations */
+               unican_irq_sync_activities(chip, obj);
+
+       }
+       if(status & CL2_DATA_IN_RBUF) {
+               unican_read(chip, obj);
+       }
+
+       /* Reenable interrupts generation */
+       cl2_gen_interrupt(chipext);
+
+       return CANCHIP_IRQ_HANDLED;
+}
+
+
+/**
+ * unican_irq_accept: - fast irq accept routine, blocks further interrupts
+ * @irq: interrupt vector number, this value is system specific
+ * @chip: pointer to chip state structure
+ * 
+ * This routine only accepts interrupt reception and stops further
+ * incoming interrupts, but does not handle situation causing interrupt.
+ * File: src/unican.c
+ */
+int unican_irq_accept(int irq, struct canchip_t *chip)
+{
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+
+       cl2_clear_interrupt(chipext);
+
+       return CANCHIP_IRQ_ACCEPTED;
+}
+
+/*void unican_do_tx_timeout(unsigned long data)
+{
+       struct msgobj_t *obj=(struct msgobj_t *)data;
+       
+}*/
+
+/**
+ * unican_wakeup_tx: - wakeups TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/unican.c
+ */
+int unican_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       can_preempt_disable();
+
+       can_msgobj_set_fl(obj,TX_REQUEST);
+
+       /* calls unican_irq_write_handler synchronized with other invocations
+         from kernel and IRQ context */
+       unican_irq_sync_activities(chip, obj);
+
+       can_preempt_enable();
+
+       return 0;
+}
+
+
+/* * * unican Board Functionality * * */
+
+#define IO_RANGE 0x1000
+
+/**
+ * unican_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/unican.c
+ */
+int unican_request_io(struct candevice_t *candev)
+{
+        unsigned long remap_addr;
+       if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - unican")) {
+               CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
+               return -ENODEV;
+       }
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+               can_release_mem_region(candev->io_addr,IO_RANGE);
+               return -ENODEV;
+       
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       return 0;
+}
+
+/**
+ * unican_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_release_io(struct candevice_t *candev)
+{
+       iounmap((void*)candev->dev_base_addr);
+       can_release_mem_region(candev->io_addr,IO_RANGE);
+       return 0;
+}
+
+/**
+ * unican_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/unican.c
+ */
+int unican_reset(struct candevice_t *candev)
+{
+       int ret;
+       int i;
+       struct canchip_t *chip = candev->chip[0];
+       sCAN_CARD *chipext;
+       
+
+       if(chip->chip_data == NULL) {
+               chip->chip_data = can_checked_malloc(sizeof(sCAN_CARD));
+               if(!chip->chip_data) return -ENOMEM;
+               memset(chip->chip_data,0,sizeof(sCAN_CARD));
+               ret = cl2_init_card(chip->chip_data,(void*)chip->chip_base_addr,chip->chip_irq);
+               if(ret != CL2_OK){
+                       CANMSG("cl2_init_card returned %d\n",ret);
+                       return -ENODEV;
+               }
+       }
+       
+       chipext = (sCAN_CARD *)chip->chip_data;
+               
+       i = 0;
+       /* reset and test whether the card is present */
+       do {
+               cl2_reset_card(chipext);
+               unican_delay(10);
+               i++;
+               ret = cl2_test_card(chipext);
+       } while((ret != CL2_OK)&&(i<10));
+
+       if(ret != CL2_OK) {
+               CANMSG("card check failed %d\n",ret);
+               return -ENODEV;
+       }
+       
+       /* start card firmware */
+       ret = cl2_start_firmware(chipext);
+       if(ret != CL2_OK){
+               CANMSG("cl2_start_firmware returned %d\n",ret);
+               return -ENODEV;
+       }
+       
+        unican_delay(100);
+
+       return 0;
+}
+
+/**
+ * unican_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=0;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=0;
+       candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+/**
+ * unican_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       struct canchip_t *chip = candev->chip[chipnr];
+       chip->chip_type = "unican";
+       chip->chip_base_addr = 0;
+       chip->clock = 10000000;
+       chip->int_clk_reg = 0x0;
+       chip->int_bus_reg = 0x0;
+       chip->max_objects = 1;
+       chip->chip_base_addr=candev->io_addr;
+                       
+       CANMSG("initializing unican chip operations\n");
+       chip->chipspecops->chip_config=unican_chip_config;
+       chip->chipspecops->baud_rate=unican_baud_rate;
+       chip->chipspecops->standard_mask=unican_standard_mask;
+       chip->chipspecops->extended_mask=unican_extended_mask;
+       chip->chipspecops->message15_mask=unican_extended_mask;
+       chip->chipspecops->clear_objects=unican_clear_objects;
+       chip->chipspecops->config_irqs=unican_config_irqs;
+       chip->chipspecops->pre_read_config=unican_pre_read_config;
+       chip->chipspecops->pre_write_config=unican_pre_write_config;
+       chip->chipspecops->send_msg=unican_send_msg;
+       chip->chipspecops->check_tx_stat=unican_check_tx_stat;
+       chip->chipspecops->wakeup_tx=unican_wakeup_tx;
+       chip->chipspecops->remote_request=unican_remote_request;
+       chip->chipspecops->enable_configuration=unican_enable_configuration;
+       chip->chipspecops->disable_configuration=unican_disable_configuration;
+       chip->chipspecops->set_btregs=unican_set_btregs;
+       chip->chipspecops->attach_to_chip=unican_attach_to_chip;
+       chip->chipspecops->release_chip=unican_release_chip;
+       chip->chipspecops->start_chip=unican_start_chip;
+       chip->chipspecops->stop_chip=unican_stop_chip;
+       chip->chipspecops->irq_handler=unican_irq_handler;
+       chip->chipspecops->irq_accept=unican_irq_accept;
+
+       return 0;
+}
+
+/**
+ * unican_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       struct msgobj_t *obj=chip->msgobj[objnr];
+       obj->obj_base_addr=chip->chip_base_addr;
+       /*obj->tx_timeout.function=unican_do_tx_timeout;
+       obj->tx_timeout.data=(unsigned long)obj;*/
+       return 0;
+}
+
+/**
+ * unican_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/unican.c
+ */
+int unican_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+int unican_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = unican_request_io;
+       hwspecops->release_io = unican_release_io;
+       hwspecops->reset = unican_reset;
+       hwspecops->init_hw_data = unican_init_hw_data;
+       hwspecops->init_chip_data = unican_init_chip_data;
+       hwspecops->init_obj_data = unican_init_obj_data;
+       hwspecops->write_register = NULL;
+       hwspecops->read_register = NULL;
+       hwspecops->program_irq = unican_program_irq;
+       return 0;
+}
+
+
+/* Unicontrols PCI board specific functions */
+
+#ifdef CAN_ENABLE_PCI_SUPPORT
+
+int unican_pci_request_io(struct candevice_t *candev)
+{
+        unsigned long remap_addr;
+
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       if(pci_request_region(candev->sysdevptr.pcidev, 0, "unican_pci") != 0){
+               CANMSG("Request of Unican PCI range failed\n");
+               return -ENODEV;
+       }
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       if(pci_request_regions(candev->sysdevptr.pcidev, "kv_pcican") != 0){
+               CANMSG("Request of Unican PCI range failed\n");
+               return -ENODEV;
+       }
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+       candev->dev_base_addr=pci_resource_start(candev->sysdevptr.pcidev,0);
+       candev->io_addr=candev->dev_base_addr;
+       candev->res_addr=candev->dev_base_addr;
+
+       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
+           #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+               pci_release_region(candev->sysdevptr.pcidev, 0);
+           #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+               pci_release_regions(candev->sysdevptr.pcidev);
+           #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+               return -ENODEV;
+       
+       }
+       can_base_addr_fixup(candev, remap_addr);
+       DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
+       DEBUGMSG("VMA: dev_base_addr: 0x%lx chip_base_addr: 0x%lx\n", 
+               candev->dev_base_addr, candev->chip[0]->chip_base_addr);
+
+       return 0;
+}
+
+
+int unican_pci_release_io(struct candevice_t *candev)
+{
+       iounmap((void*)candev->dev_base_addr);
+    #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(candev->sysdevptr.pcidev, 0);
+    #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(candev->sysdevptr.pcidev);
+    #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       return 0;
+}
+
+
+int unican_pci_init_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = NULL;
+
+       do {
+               pcidev = pci_find_device(UNICAN_PCI_VENDOR, UNICAN_PCI_ID, pcidev);
+               if(pcidev == NULL) return -ENODEV;
+       } while(can_check_dev_taken(pcidev));
+       
+       if (pci_enable_device (pcidev)){
+               printk(KERN_CRIT "Setup of Unican PCI failed\n");
+               return -EIO;
+       }
+       candev->sysdevptr.pcidev=pcidev;
+       
+       if(!(pci_resource_flags(pcidev,0)&IORESOURCE_MEM)){
+               printk(KERN_CRIT "Unican PCI region 0 is not MEM\n");
+               return -EIO;
+       }
+       candev->dev_base_addr=pci_resource_start(pcidev,0);
+       candev->io_addr=candev->dev_base_addr;
+       candev->res_addr=candev->dev_base_addr;
+       
+       /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/
+
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=0;
+       candev->nr_all_chips=1;
+
+       return 0;
+}
+
+
+int unican_pci_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       int ret;
+       candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq;
+       ret = unican_init_chip_data(candev, chipnr);
+       candev->chip[chipnr]->flags |= CHIP_IRQ_PCI;
+       return ret;
+}
+
+int unican_pci_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = unican_pci_request_io;
+       hwspecops->release_io = unican_pci_release_io;
+       hwspecops->reset = unican_reset;
+       hwspecops->init_hw_data = unican_pci_init_hw_data;
+       hwspecops->init_chip_data = unican_pci_init_chip_data;
+       hwspecops->init_obj_data = unican_init_obj_data;
+       hwspecops->write_register = NULL;
+       hwspecops->read_register = NULL;
+       hwspecops->program_irq = unican_program_irq;
+       return 0;
+}
+
+#endif /*CAN_ENABLE_PCI_SUPPORT*/
+
+#ifdef CAN_ENABLE_VME_SUPPORT
+
+#include "unican_vme.c"
+
+#endif /*CAN_ENABLE_VME_SUPPORT*/
diff --git a/lincan-0.3.3/src/unican_cl2.c b/lincan-0.3.3/src/unican_cl2.c
new file mode 100644 (file)
index 0000000..99f8919
--- /dev/null
@@ -0,0 +1,1266 @@
+/******************************************************************************
+
+Cl2.C - PCAN and VCAN cards hardware access library
+"""""
+                   (C) Copyright 1997   Unicontrols a.s.
+
+PROJEKT            :    CANopen
+AUTOR              :    F.Spurny
+FIRMA              :    CVUT FEL, Dept. of Measurement
+
+DULEZITE UPOZORNENI:
+
+ARCHIVACNI INFORMACE:
+Log: unican_cl2.c,v
+
+12.12.2000, J.B., cl2_receive_data - time stamp for even number of bytes corr.
+26.8.1998 - cl2_buf_size - corrected, new function return code CL2_BAD_PARAM
+            cl2_clr_async_buffer - corrected
+
+===============================================================================
+
+UCEL A FUNKCE:
+
+******************************************************************************/
+
+/* Constnt used by CL2 functions */
+#define CL2_TMP_RF                0x0800
+#define CL2_TMP_EX                0x0400
+#define CL2_TMP_EX2               0x0004
+#define CL2_TMP_EXHIGH            0x80000000L
+
+
+/* includes */
+#include "../include/canmsg.h"
+#include "../include/can_sysdep.h"
+#include "../include/unican_types.h"
+#include "../include/unican_cl2.h"
+#include "linux/delay.h"
+
+
+/*******************************************************************************
+* cl2_init_card - initialize card to default parameters
+* """""""""""""
+*
+* Command installs card. The data in sCAN_CARD structure pointed
+* by *card are initialized to their predefined default values.
+* Command must be called before any operation with sCAN_CARD
+* structure.
+*
+* RETURNS:
+*   CL2_OK - command completed succesfuly
+*
+*/
+eCL2_RESULT cl2_init_card
+   (
+   sCAN_CARD *card,     /* Pointer to card structure */
+   void *baseAddress,   /* Card base address pointer */
+   U16 intNumber        /* Card interrupt number */
+   )
+   {
+   int i;
+
+   card->intNumber = intNumber;
+   card->baseAddressPtr = (U8*)baseAddress;
+   card->rxBufBase = card->baseAddressPtr + CL2_RX_BUFFER_DEFAULT;
+   card->asyncTxBufBase = card->baseAddressPtr + CL2_ASYNC_BUFFER_DEFAULT;
+   card->syncTxBufBase = card->baseAddressPtr + CL2_SYNC_BUFFER_DEFAULT;
+   card->rxBufPtr = card->rxBufBase;
+   card->asyncTxBufPtr = card->asyncTxBufBase;
+   card->syncTxBufPtr = card->syncTxBufBase;
+   card->commandRegister = card->baseAddressPtr+CL2_COMMAND_REGISTER;
+   card->dataPtr = card->baseAddressPtr + CL2_DATA_BUFFER;
+   card->rxBufSize = CL2_RX_BUFFER_SIZE;
+   card->syncTxBufSize = CL2_TX_SYNC_BUFFER_SIZE;
+   card->asyncTxBufSize = CL2_TX_ASYNC_BUFFER_SIZE;
+   card->status = 0;
+   for ( i = 0; i < 10; i++ ) card->rtrSub[i] = 0xFFFFFFFFL;
+   return CL2_OK;
+   } /* cl2_init_card */
+
+
+/*******************************************************************************
+* cl2_test_card - test card
+* """""""""""""
+*
+* Test whether the card is installed in system and working properly
+* or not. If this function fails (return value is CL2_HW_FAILURE)
+* check if the card is present and card base address.
+*
+* RETURNS:
+*   CL2_OK - card is present and working properly
+*   CL2_HW_FAILURE - card not found or card error
+*
+*/
+eCL2_RESULT cl2_test_card
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   BOOLEAN1 isAA = FALSE, is55 = FALSE;
+   int i;
+   U16 volatile tmpWord;
+
+   /* timeout for card testing - 1000 read cycles */
+   for ( i = 0; i < 10000; i++ )
+   {
+     if ( isAA && is55 ) return CL2_OK;
+     tmpWord = unican_readw(card->baseAddressPtr);
+     /*printk("cl2_test_card: %08lx %04x\n", (long)card->baseAddressPtr, tmpWord);*/
+     udelay(100);
+     if ( (tmpWord & 0x00FF) == 0x00AA ) isAA = TRUE;
+     if ( (tmpWord & 0x00FF) == 0x0055 ) is55 = TRUE;
+   }
+
+  return CL2_HW_FAILURE;
+   } /* cl2_test_card */
+
+
+/*******************************************************************************
+* cl2_reset_card - reset card
+* """"""""""""""
+*
+* Card pointed by *card gets hardware reset. This command resets
+* card processor, card settings are restored to their default
+* values.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_reset_card
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   unican_writew(0x0000, card->baseAddressPtr + CL2_RESET_REGISTER);
+   return CL2_OK;
+   } /* cl2_reset_card */
+
+
+/*******************************************************************************
+* cl2_get_version - read card version
+* """""""""""""""
+*
+* Fucntion reads a value from card version register.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_get_version
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 *version                /* returns card version */
+   )
+   {
+   *version = unican_readw(card->baseAddressPtr + CL2_VERSION_REGISTER);
+   return CL2_OK;
+   } /* cl2_get_version */
+
+
+/*******************************************************************************
+* cl2_gen_interrupt - request for interrupt
+* """""""""""""""""
+*
+* CAN card is requested to generate interrupt if there is any reason
+* to do it. The condition for interrupt generation is defined by
+* cl2_int_mode command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_gen_interrupt
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   unican_writew(0x0000, card->baseAddressPtr + CL2_GEN_INT_REGISTER);
+   return CL2_OK;
+   } /* cl2_gen_interrupt */
+
+
+/*******************************************************************************
+* cl2_start_it - start inhibit time
+* """"""""""""
+*
+* Command starts interrupt inhibit time. If there is any reason for
+* interrupt geneation, the card generates interrupt after end of
+* specified time interval. Time interval is set by cl2_set_iit command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_start_it
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   unican_writew(0x0000, card->baseAddressPtr + CL2_START_IT_REGISTER);
+   return CL2_OK;
+   } /* cl2_start_it */
+
+
+/*******************************************************************************
+* cl2_clear_interrupt - clear interrupt
+* """""""""""""""""""
+*
+* Comand clears interrupt (IRQ) generated by a card.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_clear_interrupt
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   unican_writew(0x0000, card->baseAddressPtr + CL2_CLEAR_INT_REGISTER);
+   return CL2_OK;
+   } /* cl2_clear_interrupt */
+
+
+/*******************************************************************************
+* cl2_int_mode - set interrupt mode
+* """"""""""""
+*
+* Command controls, which event will generate interrupt. Constants
+* CL2_INT_XXXX are used for setting of interrupt mode.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_BAD_PARAM - bad command parameter
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_int_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 mode                    /* Interrupt mode */
+   )
+   {
+   if ( mode > INT_MODE_ALL ) return CL2_BAD_PARAM;
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew(mode, card->dataPtr);
+   unican_writew(((U16)cmCL2_INT_MODE + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_int_mode */
+
+
+/*******************************************************************************
+* cl2_iit_mode - inhibit interrupt time mode
+* """"""""""""
+*
+* Command enables/disables inhibit interupt time mode.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_iit_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* IIT mode - TRUE=on, FALSE=off */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID ) return
+      CL2_COMMAND_BUSY;
+   unican_writew((U16)onoff, card->dataPtr);
+   unican_writew(((U16)cmCL2_IIT_MODE + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_iit_mode */
+
+
+/*******************************************************************************
+* cl2_sync_mode - sync mode
+* """""""""""""
+*
+* Command enables/disables transmission of SYNC frames.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_sync_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* Sync mode - TRUE=on, FALSE=off */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)onoff, card->dataPtr);
+   unican_writew(((U16)cmCL2_SYNC_MODE + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_sync_mode */
+
+
+/*******************************************************************************
+* cl2_rtr_mode - rtr mode
+* """"""""""""
+*
+* Command enables/disables automatic transmission of RTR frames
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_rtr_mode
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   BOOLEAN1 onoff              /* RTR mode - TRUE=on, FALSE=off */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)onoff, card->dataPtr);
+   unican_writew(((U16)cmCL2_RTR_MODE + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_rtr_mode */
+
+
+/*******************************************************************************
+* cl2_buf_size - size of synchronous queue
+* """"""""""""
+*
+* Command sets the size of synchronous send buffer. The size is
+* in numbers of messages. Default buffer size is 32 messages.
+* The sum of synchronous_buffer_size and asynchronous_buffer_size
+* is constant and equal to 64. So, if the size od synchronous
+* buffer increases, the size of asynchronous buffer decreases and
+* vice versa.
+* NOTE: 1 message = 16 bytes
+*
+* RETURNS:
+*   CL2_OK - command completed successfully
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter (bufSize>64)
+*
+*/
+eCL2_RESULT cl2_buf_size
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 bufSize                 /* Size of synchronous buffer */
+   )
+   {
+   if ( bufSize > 64 ) return CL2_BAD_PARAM;
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew(bufSize, card->dataPtr);
+   unican_writew(((U16)cmCL2_BUF_SIZE + CL2_COMMAND_VALID), card->commandRegister);
+   card->syncTxBufSize = bufSize;
+   card->asyncTxBufSize = 64 - bufSize;
+   card->syncTxBufPtr = card->syncTxBufBase;
+   card->asyncTxBufPtr = card->asyncTxBufBase = card->syncTxBufBase+bufSize*16;
+   return CL2_OK;
+   } /* cl2_buf_size */
+
+
+/*******************************************************************************
+* cl2_set_iit - set value of inhibit interrupt time
+* """""""""""
+*
+* Command sets value of inhibit interrupt time. If inhibit
+* interrupt time mode is enabled and started, generation of
+* interrupt (IRQ) is disabled during this time period.
+* Inhibit interrupt time can be set from 100 us to 6.5535 s
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_iit
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 iit                     /* time period in x100 us */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew(iit, card->dataPtr);
+   unican_writew(((U16)cmCL2_SET_IIT + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_iit */
+
+
+/*******************************************************************************
+* cl2_start_firmware - start firmware
+* """"""""""""""""""
+*
+* Command starts card firmware
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_start_firmware
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)cmCL2_START_FIRMWARE + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_start_firmware */
+
+
+/*******************************************************************************
+* cl2_set_rec_mode - set receive mode
+* """"""""""""""""
+*
+* Command sets card receive mode. This enable reception of standard
+* or extended frames according to CAN 2.0A and 2.0B specifications.
+* If value of mode is TRUE, card receives extended frames, if mode
+* is FALSE, card receives standard massage format (default).
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_rec_mode
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   BOOLEAN1 mode              /* Mode - TRUE=ext, FALSE=std */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)mode, card->dataPtr);
+   unican_writew((U16)cmCL2_SET_REC_MODE + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_rec_mode */
+
+
+/*******************************************************************************
+* cl2_clr_rx_buffer - clear RX buffer
+* """""""""""""""""
+*
+* Command clears receive (rx) buffer. All messages stored in
+* rx buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_rx_buffer
+   (
+   sCAN_CARD *card           /* Pointer to card structure */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   card->rxBufPtr = card->rxBufBase;
+   unican_writew((U16)cmCL2_CLR_RX_BUFFER + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_clr_rx_buffer */
+
+
+/*******************************************************************************
+* cl2_clr_sync_buffer - clear synchronous buffer
+* """""""""""""""""""
+*
+* Command clears synchronous send buffer. All messages stored
+* in synchronous buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_sync_buffer
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   card->syncTxBufPtr = card->syncTxBufBase;
+   unican_writew((U16)cmCL2_CLR_SYNC_BUFFER + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_clr_sync_buffer */
+
+
+/*******************************************************************************
+* cl2_clr_async_buffer - clear asynchronous buffer
+* """"""""""""""""""""
+*
+* Command clears asynchronnous send buffer. All messages stored
+* in async buffer will be lost.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_clr_async_buffer
+   (
+   sCAN_CARD *card            /* Pointer to card structure */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   card->asyncTxBufPtr = card->syncTxBufBase + card->syncTxBufSize*16;
+   unican_writew((U16)cmCL2_CLR_ASYNC_BUFFER + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_clr_async_buffer */
+
+
+/*******************************************************************************
+* cl2_send_time_sync - send time synchronization
+* """"""""""""""""""
+*
+* Command forces the card to start the High Resolution Synchronization
+* Protocol according to the CANopen Communication profile. The SYNC
+* mode has to be enabled (cl2_sync_mode) otherwise this command has
+* no effect.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_send_time_sync
+   (
+   sCAN_CARD *card             /* Pointer to card structure */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)cmCL2_SEND_TIME_SYNC + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_send_time_sync */
+
+
+/*******************************************************************************
+* cl2_set_time_cobid - set time COB-ID
+* """"""""""""""""""
+*
+* Command sets the COB-ID for high resolution synchronization
+* frame. The synchronization can be then made by means of
+* cl2_send_time_sync command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_time_cobid
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   U32 COBID                  /* HRS frame COB-ID */
+   )
+   {
+   U16 cobidL, cobidH;
+   U16 *ptr = (U16 *)card->dataPtr;
+
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+
+   if ( COBID & CL2_TMP_EXHIGH ) /* standard or extended format? */
+   { /* 2.0B frame */
+     COBID <<= 3;
+     cobidL = (U16)(COBID & 0x0000FFFFL);
+     cobidH = (U16)((COBID & 0xFFFF0000L)>>16);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptr++ = cobidH;
+     cobidL = ((cobidL >> 8) & 0x00FF) | (((cobidL << 8) & 0xFF00));
+     *ptr++ = cobidL;
+     *ptr = CL2_TMP_EX2;
+   }
+   else
+   { /* 2.0A frame */
+     COBID <<= 5;
+     cobidH = (U16)(COBID & 0x0000FFFFL);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptr++ = cobidH;
+     *ptr++ = 0;
+     *ptr = 0;
+   }
+
+   unican_writew((U16)cmCL2_SET_TIME_COBID + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_time_cobid */
+
+
+/*******************************************************************************
+* cl2_set_receive_limit - set limit for receive signaling
+* """""""""""""""""""""
+*
+* Command is used to set the receive limit signalized by bit
+* RL (in CL2.H CL2_X_DATA_IN_RBUF) of the Status Register.
+* This bit is set when more then the limit number of frames
+* was received since the last interrupt was generated (in interrupt
+* mode) or since the Status Register was last time read.
+*
+* RETURNS:
+*   CL2_OK
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*/
+eCL2_RESULT cl2_set_receive_limit
+   (
+   sCAN_CARD *card,  /* pointer to card structure */
+   U16 limit         /* limit of messages in receive buffer */
+   )
+   {
+   if ( limit > 127 ) return CL2_BAD_PARAM;
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew(limit, card->dataPtr);
+   unican_writew((U16)cmCL2_SET_RECEIVE_LIMIT + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_receive_limit */
+
+
+/*******************************************************************************
+* cl2_download_rtr_list - download rtr list
+* """""""""""""""""""""
+*
+* Command downloads a list of up to 64 RTR frames. These frames are
+* periodically transmitted by the card. The parameters, how often
+* frames are send and in which SYNC period is defined by period and
+* subperiod in sRTR_FRAME structure.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_download_rtr_list
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   sRTR_LIST *rtrList         /* RTR list */
+   )
+   {
+   U16 *ptrTmp = (U16*)card->dataPtr;
+   sRTR_FRAME *ptrRTR = rtrList->data;
+   U16 tmpU16;
+   U32 COBID;
+   U16 cobidH, cobidL, i;
+
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID ) return
+      CL2_COMMAND_BUSY;
+   if ( rtrList->nb > 64 ) return CL2_BAD_PARAM;
+
+   *ptrTmp++ = (U16)rtrList->nb;
+   for ( i = 0; i < rtrList->nb; i++ )
+   {
+   if ( ptrRTR->period < ptrRTR->subperiod ) return CL2_BAD_PARAM;
+   if ( ptrRTR->subperiod == 0 ) ptrRTR->subperiod = 1;
+   tmpU16 = (ptrRTR->period & 0x00FF) + ((ptrRTR->subperiod & 0x00FF)<<8);
+   *ptrTmp++ = tmpU16;
+   COBID = ptrRTR->cob_id;
+
+   if ( COBID & CL2_TMP_EXHIGH ) /* standard or extended format? */
+   { /* 2.0B frame */
+     COBID <<= 3;
+     cobidL = (U16)(COBID & 0x0000FFFFL);
+     cobidH = (U16)((COBID & 0xFFFF0000L)>>16);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptrTmp++ = cobidH;
+     cobidL = ((cobidL >> 8) & 0x00FF) | (((cobidL << 8) & 0xFF00));
+     *ptrTmp++ = cobidL;
+   }
+   else
+   { /* 2.0A frame */
+     COBID <<= 5;
+     cobidH = (U16)(COBID & 0x0000FFFFL);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptrTmp++ = cobidH;
+     *ptrTmp++ = 0;
+   }
+
+   *ptrTmp++ = 0x0000;  /* rezerva */
+   ptrRTR++;
+   }
+
+   unican_writew((U16)cmCL2_DOWNLOAD_RTR_LIST + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_download_rtrlist */
+
+
+/*******************************************************************************
+* cl2_subscribe_rtr - subscribe RTR frame
+* """""""""""""""""
+*
+* Command subscribes RTR frame. Incoming RTR frames which were
+* subscribed are accepted, while other are ignored. Up to 10
+* RTR frames can be subscribed.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_subscribe_rtr
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage,   /* RTR frame */
+   U16 RTRnumber               /* number of RTR */
+   )
+   {
+   U16 *ptrU16 = (U16*)card->dataPtr;
+   U32 COBID;
+   U16 cobidH, cobidL;
+
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   if ( RTRnumber > 9 ) return CL2_BAD_PARAM;
+
+   card->rtrSub[RTRnumber] = canMessage->COB_ID;
+   *ptrU16 = RTRnumber;
+   ptrU16++;
+   COBID = canMessage->COB_ID;
+
+   if ( COBID & CL2_TMP_EXHIGH ) /* standard or extended format? */
+   { /* 2.0B frame */
+     COBID <<= 3;
+     cobidL = (U16)(COBID & 0x0000FFFFL);
+     cobidH = (U16)((COBID & 0xFFFF0000L)>>16);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptrU16++ = cobidH;
+     cobidL = ((cobidL >> 8) & 0x00FF) | (((cobidL << 8) & 0xFF00));
+     *ptrU16++ = cobidL;
+     *ptrU16 = (U16)CL2_EXT_FRAME;
+   }
+   else
+   { /* 2.0A frame */
+     COBID <<= 5;
+     cobidH = (U16)(COBID & 0x0000FFFFL);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptrU16++ = cobidH;
+     *ptrU16++ = 0;
+     *ptrU16 = 0;
+   }
+
+   unican_writew((U16)cmCL2_SUBSCRIBE_RTR + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_subscribe_rtr */
+
+
+/*******************************************************************************
+* cl2_desubscribe_rtr - desubscribe rtr frame
+* """""""""""""""""""
+*
+* Command desubscribes RTR frame. Card will not accept RTR frames
+* with this identifier.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_desubscribe_rtr
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage   /* RTR frame */
+   )
+   {
+   U16 i;
+
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+
+   for ( i = 0; i < 10; i++ )
+   {
+     if ( card->rtrSub[i] == canMessage->COB_ID )
+     {
+       card->rtrSub[i] = 0xFFFFFFFFL;
+       break;
+     }
+   }
+
+   if ( i >= 10 ) return CL2_BAD_PARAM;
+
+   unican_writew(i, card->dataPtr);
+   unican_writew((U16)cmCL2_DESUBSCRIBE_RTR + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_desubscribe_rtr */
+
+
+
+/*******************************************************************************
+* cl2_set_sync_cobid - set COB-ID
+* """"""""""""""""""
+*
+* Command sets COB-ID of SYNC frame. In active SYNC mode, the SYNC
+* frame with this COB-ID is periodically sent with period defined
+* by cl2_set_sync_period command.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_cobid
+   (
+   sCAN_CARD *card,           /* Pointer to card structure */
+   U32 COBID                  /* COB-ID */
+   )
+   {
+   U16 cobidL, cobidH;
+   U16 *ptr = (U16 *)card->dataPtr;
+
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+
+   if ( COBID & CL2_TMP_EXHIGH ) /* standard or extended format? */
+   { /* 2.0B frame */
+     COBID <<= 3;
+     cobidL = (U16)(COBID & 0x0000FFFFL);
+     cobidH = (U16)((COBID & 0xFFFF0000L)>>16);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptr++ = cobidH;
+     cobidL = ((cobidL >> 8) & 0x00FF) | (((cobidL << 8) & 0xFF00));
+     *ptr++ = cobidL;
+     *ptr = CL2_TMP_EX2;
+   }
+   else
+   { /* 2.0A frame */
+     COBID <<= 5;
+     cobidH = (U16)(COBID & 0x0000FFFFL);
+     cobidH = ((cobidH >> 8) & 0x00FF) | (((cobidH << 8) & 0xFF00));
+     *ptr++ = cobidH;
+     *ptr++ = 0;
+     *ptr = 0;
+   }
+
+   unican_writew(((U16)cmCL2_SET_COBID + CL2_COMMAND_VALID), card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_sync_cobid */
+
+
+/*******************************************************************************
+* cl2_set_sync_period - set SYNC period
+* """""""""""""""""""
+*
+* Coomand sets the SYNC frame send period in active SYNC mode in
+* x100 us. The period range is from 0 to 0xFFFF (SYNC period can
+* be set from 100us to 6.5535s).
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_period
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 period                  /* period in x100 us */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)period, card->dataPtr);
+   unican_writew((U16)cmCL2_SET_SYNC_PERIOD + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_sync_period */
+
+
+/*******************************************************************************
+* cl2_set_sync_window - set SYNC window
+* """""""""""""""""""
+*
+* Command sets the SYNC window length. Only during this time period
+* after SYNC frame was send or receive the frames from the synchronous
+* send buffer can be sent.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_sync_window
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 window                  /* period in x100 us */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)window, card->dataPtr);
+   unican_writew((U16)cmCL2_SET_SYNC_WINDOW + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_sync_window */
+
+
+/*******************************************************************************
+* cl2_set_bitrate - set CAN bit-rate
+* """""""""""""""
+*
+* Command switches the bus bit-rate. There are some predefined
+* constants CL2_BITRATE_XXXX.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previous command not completed
+*
+*/
+eCL2_RESULT cl2_set_bitrate
+   (
+   sCAN_CARD *card,            /* Pointer to card structure */
+   U16 bitrate                 /* CAN bitrate */
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew(bitrate, card->dataPtr);
+   unican_writew((U16)cmCL2_SET_BITRATE + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_set_bitrate */
+
+
+/*******************************************************************************
+* cl2_bus_reset - resets CAN controller
+* """""""""""""
+*
+* Command resets CAN controller
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_COMMAND_BUSY - previously command not completed
+*
+*/
+eCL2_RESULT cl2_bus_reset
+   (
+   sCAN_CARD *card
+   )
+   {
+   if ( unican_readw(card->commandRegister) & CL2_COMMAND_VALID )
+      return CL2_COMMAND_BUSY;
+   unican_writew((U16)cmCL2_BUS_RESET + CL2_COMMAND_VALID, card->commandRegister);
+   return CL2_OK;
+   } /* cl2_bus_reset */
+
+
+/*******************************************************************************
+* cl2_send_sync - sends synchronous frame
+* """""""""""""
+*
+* Command stores massage in synchronous send buffer.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_HW_QUEUE_FULL - synchronous send buffer is full
+*   CL2_BAD_PARAM - bad command parameter
+*   CL2_HW_FAILURE - error in HW configuration
+*
+*/
+eCL2_RESULT cl2_send_sync
+   (
+   sCAN_CARD *card,           /* pointer to card */
+   sCAN_MESSAGE *message      /* massage to be sent */
+   )
+   {
+   U32 cobid;
+   U16 cobidL,cobidH;
+   U16 *ptrU16 = (U16*)card->syncTxBufPtr;
+   U16 tmpU16;
+   int i;
+   int timeStamp = 0;
+
+   if ( card->syncTxBufSize==0 ) return CL2_HW_FAILURE;
+   if ( message->dataLength > 8 ) return CL2_BAD_PARAM;
+   if ( *ptrU16 & CL2_FRAME_VALID ) return CL2_HW_QUEUE_FULL;
+
+   cobid = message->COB_ID;
+   if ( (message->dataType & CL2_EXT_FRAME) || (cobid & CL2_TMP_EXHIGH) )
+   {  /* 2.0B frame */
+     cobid <<= 3;
+     cobidL = (U16)(cobid & 0x0000FFFFL);
+     cobidH = (U16)((cobid & 0xFFFF0000L)>>16);
+   }
+   else
+   {  /* 2.0A frame */
+     cobid <<= 5;
+     cobidL = 0;
+     cobidH = (U16)(cobid & 0x0000FFFFL);
+   }
+   ptrU16++;
+   tmpU16 = (cobidH & 0x00FF) + (cobidL & 0xFF00);
+   *ptrU16++ = tmpU16;
+
+   tmpU16 = (((U16)message->dataLength) << 12) + (cobidL & 0x00FF);
+   if ( !(message->dataType & CL2_REMOTE_FRAME) ) tmpU16 |= CL2_TMP_RF;
+   if ( (message->dataType & CL2_EXT_FRAME) ||
+        (message->COB_ID & CL2_TMP_EXHIGH) )
+     tmpU16 |= CL2_TMP_EX;
+   *ptrU16++ = tmpU16;
+
+   for ( i = 0; i < message->dataLength; )
+      {
+      tmpU16 = (U16)message->data[i]; i++;
+      if ( i == message->dataLength )
+         {
+         timeStamp = 1;
+         tmpU16 |= ((message->timeStamp & 0x00FF)<<8);
+         *ptrU16++ = tmpU16;
+         }
+      else
+         {
+         tmpU16 |= ((U16)message->data[i]<<8); i++;
+         *ptrU16++ = tmpU16;
+         }
+      }
+   if ( timeStamp )
+      {
+      tmpU16 = (message->timeStamp>>8) & 0x00FF;
+      *ptrU16 = tmpU16;
+      }
+   else
+      {
+      *ptrU16 = message->timeStamp;
+      }
+
+   tmpU16 = (((U16)cobidH) & 0xFF00) | CL2_MESSAGE_VALID;
+   unican_writew(tmpU16, card->syncTxBufPtr);
+
+   if ( (card->syncTxBufBase + card->syncTxBufSize*16) <=
+        (card->syncTxBufPtr += 16) )
+     {
+     card->syncTxBufPtr = card->syncTxBufBase;
+     }
+   return CL2_OK;
+   } /* cl2_send_sync */
+
+
+/*******************************************************************************
+* cl2_send_async - sends asynchronous frame
+* """"""""""""""
+*
+* Command stores message in asynchronous send buffer.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_HW_QUEUE_FULL - asynchronous buffer full
+*   CL2_HW_FAILURE - error in HW configuration
+*   CL2_BAD_PARAM - bad command parameter
+*
+*/
+eCL2_RESULT cl2_send_async
+   (
+   sCAN_CARD *card,           /* pointer to card */
+   sCAN_MESSAGE *message      /* message to be sent */
+   )
+   {
+   U32 cobid;
+   U16 cobidL,cobidH;
+   U16 *ptrU16 = (U16*)card->asyncTxBufPtr;
+   U16 tmpU16;
+   int i;
+   int timeStamp = 0;
+
+   if ( card->asyncTxBufSize==0 ) return CL2_HW_FAILURE;
+   if ( message->dataLength > 8 ) return CL2_BAD_PARAM;
+   if ( *ptrU16 & CL2_FRAME_VALID ) return CL2_HW_QUEUE_FULL;
+
+   cobid = message->COB_ID;
+   if ( (message->dataType & CL2_EXT_FRAME) || (cobid & CL2_TMP_EXHIGH) )
+   {  /* 2.0B frame */
+     cobid <<= 3;
+     cobidL = (U16)(cobid & 0x0000FFFFL);
+     cobidH = (U16)((cobid & 0xFFFF0000L)>>16);
+   }
+   else
+   {  /* 2.0A frame */
+     cobid <<= 5;
+     cobidL = 0;
+     cobidH = (U16)(cobid & 0x0000FFFFL);
+   }
+   ptrU16++;
+   tmpU16 = (cobidH & 0x00FF ) + (cobidL & 0xFF00);
+   *ptrU16++ = tmpU16;
+
+   tmpU16 = (((U16)message->dataLength) << 12) + (cobidL & 0x00FF);
+   if ( !(message->dataType & CL2_REMOTE_FRAME) ) tmpU16 |= CL2_TMP_RF;
+   if ( (message->dataType & CL2_EXT_FRAME) ||
+        (message->COB_ID & CL2_TMP_EXHIGH ) )
+      tmpU16 |= CL2_TMP_EX;
+   *ptrU16++ = tmpU16;
+
+   for ( i = 0; i < message->dataLength; )
+      {
+      tmpU16 = (U16)message->data[i]; i++;
+      if ( i == message->dataLength )
+         {
+         timeStamp = 1;
+         tmpU16 |= ((message->timeStamp & 0x00FF)<<8);
+         *ptrU16++ = tmpU16;
+         }
+      else
+         {
+         tmpU16 |= ((U16)message->data[i]<<8); i++;
+         *ptrU16++ = tmpU16;
+         }
+      }
+   if ( timeStamp )
+      {
+      tmpU16 = (message->timeStamp>>8) & 0x00FF;
+      *ptrU16 = tmpU16;
+      }
+   else
+      {
+      *ptrU16 = message->timeStamp;
+      }
+
+   tmpU16 = (((U16)cobidH) & 0xFF00) | CL2_MESSAGE_VALID;
+   unican_writew(tmpU16, card->asyncTxBufPtr);
+
+   if ( (card->asyncTxBufBase + card->asyncTxBufSize*16) <=
+        (card->asyncTxBufPtr += 16) )
+      {
+      card->asyncTxBufPtr = card->asyncTxBufBase;
+      }
+   return CL2_OK;
+   } /* cl2_send_async */
+
+
+/*******************************************************************************
+* cl2_get_status - reads card status
+* """"""""""""""
+*
+* Command reads card status register. If data in status register
+* are valid (status valid flag is set), the value of status is read
+* and stored in status and sCAN_CARD structure.
+*
+* RETURNS:
+*   CL2_OK - command completed successfuly
+*   CL2_NO_REQUEST - status is not valid
+*
+*/
+eCL2_RESULT cl2_get_status
+   (
+   sCAN_CARD *card,          /* pointer to card */
+   U16 *status               /* card status word */
+   )
+   {
+   U16 *ptr;
+
+   ptr = (U16*)(card->baseAddressPtr + CL2_STATUS_REGISTER);
+   *status = *ptr;
+   if ( (*status & CL2_STATUS_VALID_FLAG) )
+      {
+      *ptr = *status & ~CL2_STATUS_VALID_FLAG;
+      card->status = *status;
+      return CL2_OK;
+      }
+   return CL2_NO_REQUEST;
+   } /* cl2_get_status */
+
+
+/*******************************************************************************
+* cl2_get_error - reads card error
+* """""""""""""
+*
+* Command reads card error register. If data in error register
+* are valid (error register valid flag is set), the value of error
+* register is read and stored in error and sCAN_CARD structure.
+*
+* RETURNS:
+*   Cl2_OK - command completed successfuly
+*
+*/
+eCL2_RESULT cl2_get_error
+   (
+   sCAN_CARD *card,          /* pointer to card */
+   U16 *error                /* card error word */
+   )
+   {
+   U16 *ptr;
+
+   ptr = (U16*)(card->baseAddressPtr + CL2_ERROR_REGISTER);
+   *error = *ptr;
+   card->error |= *error;
+   *ptr = 0x0000;
+   return CL2_OK;
+   } /* cl2_get_error */
+
+
+/*******************************************************************************
+* cl2_receive_data - reads received frame
+* """"""""""""""""
+*
+* Command reads new messages received by a card.
+*
+* RETURNS:
+*   CL2_OK - command commpleted successfuly
+*   CL2_NO_REQUEST - there is no new message
+*
+*/
+eCL2_RESULT cl2_receive_data
+   (
+   sCAN_CARD *card,             /* Pointer to card structure */
+   sCAN_MESSAGE *canMessage     /* Message */
+   )
+   {
+   U16 *ptrU16 = (U16*)card->rxBufPtr;
+   U16 tmpU16;
+   U16 i;
+
+   tmpU16 = *ptrU16++;
+   if ( !(tmpU16 & CL2_MESSAGE_VALID) ) return CL2_NO_REQUEST;
+   canMessage->COB_ID = ((U32)(tmpU16 & 0xFF00 )) << 16;
+   tmpU16 = *ptrU16++;
+   canMessage->COB_ID |= ((U32)( tmpU16 & 0x00FF )) << 16;
+   canMessage->COB_ID |= (U32)( tmpU16 & 0xFF00 );
+   tmpU16 = *ptrU16++;
+   canMessage->COB_ID |= (U32)( tmpU16 & 0x00FF );
+   canMessage->dataType = (U8)(( tmpU16 & 0xFF00 ) >> 8);
+
+   if ( canMessage->dataType & CL2_EXT_FRAME )
+   {  /* 2.0B frame */
+     canMessage->COB_ID >>= 3;
+     /* canMessage->COB_ID |= CL2_TMP_EXHIGH; */
+   }
+   else
+   {  /* 2.0A frame */
+     canMessage->COB_ID >>= 21;
+   }
+   canMessage->dataLength = (U8)( (tmpU16 >> 12) & 0x000F );
+   /* if ( !(tmpU16 & CL2_TMP_RF) ) canMessage->dataType |= CL2_REMOTE_FRAME; */
+   for ( i = 0; i < canMessage->dataLength; )
+      {
+      tmpU16 = *ptrU16++;
+      canMessage->data[i++] = (U8)( tmpU16 );
+      canMessage->data[i++] = (U8)( tmpU16 >> 8 );
+      }
+   if ( canMessage->dataLength & 0x01 )
+      {  /* odd */
+      canMessage->timeStamp = ( (*ptrU16 & 0x00FF) | (tmpU16 & 0xFF00) );
+      }
+   else  /* even */
+      {
+      canMessage->timeStamp = *ptrU16 << 8 | *ptrU16 >> 8;
+      }
+   unican_writew(0x0000, card->rxBufPtr);
+
+   /* increment rx-buffer pointer */
+   if ( (card->rxBufBase + card->rxBufSize*16 ) <= (card->rxBufPtr += 16) )
+      {
+      card->rxBufPtr = card->rxBufBase;
+      }
+
+   return CL2_OK;
+   } /* cl2_receive_data */
+
+
+/* **************************************************************** *
+ * END OF CL2.C                                                     *
+ * **************************************************************** */
+
+
diff --git a/lincan-0.3.3/src/unican_vme.c b/lincan-0.3.3/src/unican_vme.c
new file mode 100644 (file)
index 0000000..e69694c
--- /dev/null
@@ -0,0 +1,72 @@
+/* unican_vme.c
+ * Linux CAN-bus device driver.
+ * Written for new CAN driver version by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+/* This file is included in unican.c if CAN_ENABLE_VME_SUPPORT is
+ * set. */
+
+
+/**
+ * unican_vme_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_vme_reset(struct candevice_t *candev)
+{
+       int ret;
+       struct canchip_t *chip = candev->chip[0];
+
+       ret = unican_reset(candev);
+
+       /* Setup VME interrupt vector */
+       if (ret == 0) 
+               unican_writew(chip->chip_irq, chip->chip_base_addr+CL2_VME_INT_VECTOR);
+
+       return ret;
+}
+
+/**
+ * unican_vme_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * Return Value: The function always returns zero
+ * File: src/unican.c
+ */
+int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       struct canchip_t *chip = candev->chip[chipnr];
+
+       unican_init_chip_data(candev, chipnr);
+
+       chip->flags |= CHIP_IRQ_VME;
+       /*chip->chipspecops->irq_handler=unican_irq_handler;*/
+       return 0;
+}
+
+
+int unican_vme_init_hw_data(struct candevice_t *candev) 
+{
+       unican_init_hw_data(candev);
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
+int unican_vme_register(struct hwspecops_t *hwspecops)
+{
+       unican_register(hwspecops);
+
+       hwspecops->init_hw_data = unican_vme_init_hw_data;
+       hwspecops->init_chip_data = unican_vme_init_chip_data;
+       hwspecops->request_io = unican_request_io;
+       hwspecops->reset = unican_vme_reset;
+       hwspecops->release_io = unican_release_io;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/virtual.c b/lincan-0.3.3/src/virtual.c
new file mode 100644 (file)
index 0000000..f1ae39e
--- /dev/null
@@ -0,0 +1,552 @@
+/* virtual.c
+ * Linux CAN-bus device driver.
+ * Written for new CAN driver version by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */ 
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+
+long virtual_bus_latency(struct msgobj_t *obj)
+{
+       long latency;
+       latency=obj->hostchip->baudrate;
+       if(latency){
+               latency=(long)HZ*1000/latency;
+       }
+       return latency;
+}
+
+
+/* * * Virtual Chip Functionality * * */
+
+int virtual_enable_configuration(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int virtual_disable_configuration(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_chip_config: - can chip configuration
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_chip_config(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_extended_mask: - setup of extended mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_extended_mask(struct canchip_t *chip, unsigned long code, unsigned  long mask)
+{
+       return 0;
+}
+
+/**
+ * virtual_baud_rate: - set communication parameters.
+ * @chip: pointer to chip state structure
+ * @rate: baud rate in Hz
+ * @clock: frequency of sja1000 clock in Hz (ISA osc is 14318000)
+ * @sjw: synchronization jump width (0-3) prescaled clock cycles
+ * @sampl_pt: sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
+ * @flags: fields %BTR1_SAM, %OCMODE, %OCPOL, %OCTP, %OCTN, %CLK_OFF, %CBP
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
+                                                       int sampl_pt, int flags)
+{
+       return 0;
+}
+
+/**
+ * virtual_read: - reads and distributes one or more received messages
+ * @chip: pointer to chip state structure
+ * @obj: pinter to CAN message queue information
+ *
+ * File: src/virtual.c
+ */
+void virtual_read(struct canchip_t *chip, struct msgobj_t *obj) {
+
+}
+
+/**
+ * virtual_pre_read_config: - prepares message object for message reception
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive value indicates immediate reception of message.
+ * File: src/virtual.c
+ */
+int virtual_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       return 0;
+}
+
+#define MAX_TRANSMIT_WAIT_LOOPS 10
+/**
+ * virtual_pre_write_config: - prepares message object for message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       return 0;
+}
+
+/**
+ * virtual_send_msg: - initiate message transmission
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object state structure
+ * @msg: pointer to CAN message
+ *
+ * This function is called after virtual_pre_write_config() function,
+ * which prepares data in chip buffer.
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_send_msg(struct canchip_t *chip, struct msgobj_t *obj, 
+                                                       struct canmsg_t *msg)
+{
+       return 0;
+}
+
+/**
+ * virtual_check_tx_stat: - checks state of transmission engine
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ *     Positive return value indicates transmission under way status.
+ *     Zero value indicates finishing of all issued transmission requests.
+ * File: src/virtual.c
+ */
+int virtual_check_tx_stat(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_set_btregs: -  configures bitrate registers
+ * @chip: pointer to chip state structure
+ * @btr0: bitrate register 0
+ * @btr1: bitrate register 1
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_set_btregs(struct canchip_t *chip, unsigned short btr0, 
+                                                       unsigned short btr1)
+{
+       return 0;
+}
+
+/**
+ * virtual_stop_chip: -  starts chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_start_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_stop_chip: -  stops chip message processing
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_stop_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_attach_to_chip: - attaches to the chip, setups registers and state
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * virtual_release_chip: - called before chip structure removal if %CHIP_ATTACHED is set
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_release_chip(struct canchip_t *chip)
+{
+       virtual_stop_chip(chip);
+       return 0;
+}
+
+/**
+ * virtual_remote_request: - configures message object and asks for RTR message
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_remote_request(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       CANMSG("virtual_remote_request not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * virtual_standard_mask: - setup of mask for message filtering
+ * @chip: pointer to chip state structure
+ * @code: can message acceptance code
+ * @mask: can message acceptance mask
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_standard_mask(struct canchip_t *chip, unsigned short code,
+               unsigned short mask)
+{
+       CANMSG("virtual_standard_mask not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * virtual_clear_objects: - clears state of all message object residing in chip
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_clear_objects(struct canchip_t *chip)
+{
+       CANMSG("virtual_clear_objects not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * virtual_config_irqs: - tunes chip hardware interrupt delivery
+ * @chip: pointer to chip state structure
+ * @irqs: requested chip IRQ configuration
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_config_irqs(struct canchip_t *chip, short irqs)
+{
+       CANMSG("virtual_config_irqs not implemented\n");
+       return -ENOSYS;
+}
+
+/**
+ * virtual_irq_write_handler: - part of ISR code responsible for transmit events
+ * @chip: pointer to chip state structure
+ * @obj: pointer to attached queue description
+ *
+ * The main purpose of this function is to read message from attached queues
+ * and transfer message contents into CAN controller chip.
+ * This subroutine is called by
+ * virtual_irq_write_handler() for transmit events.
+ * File: src/virtual.c
+ */
+void virtual_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
+{
+
+}
+
+#define MAX_RETR 10
+
+/**
+ * virtual_irq_handler: - interrupt service routine
+ * @irq: interrupt vector number, this value is system specific
+ * @dev_id: driver private pointer registered at time of request_irq() call.
+ *     The CAN driver uses this pointer to store relationship of interrupt
+ *     to chip state structure - @struct canchip_t
+ * @regs: system dependent value pointing to registers stored in exception frame
+ * 
+ * Interrupt handler is activated when state of CAN controller chip changes,
+ * there is message to be read or there is more space for new messages or
+ * error occurs. The receive events results in reading of the message from
+ * CAN controller chip and distribution of message through attached
+ * message queues.
+ * File: src/virtual.c
+ */
+int virtual_irq_handler(int irq, struct canchip_t *chip)
+{
+       return CANCHIP_IRQ_HANDLED;
+}
+
+
+void virtual_schedule_next(struct msgobj_t *obj)
+{
+       int cmd;
+
+       can_preempt_disable();
+
+       can_msgobj_set_fl(obj,TX_REQUEST);
+       
+       while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
+
+               can_msgobj_clear_fl(obj,TX_REQUEST);
+               
+               cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
+               if(cmd>=0) {
+                       mod_timer(&obj->tx_timeout,
+                               jiffies+virtual_bus_latency(obj));
+                       DEBUGMSG("virtual: scheduled delivery\n");
+
+               } else          
+                       can_msgobj_clear_fl(obj,TX_LOCK);
+               
+               if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
+               DEBUGMSG("TX looping in virtual_schedule_next\n");
+       }
+
+       can_preempt_enable();
+}
+
+
+void virtual_do_tx_timeout(unsigned long data)
+{
+       struct msgobj_t *obj=(struct msgobj_t *)data;
+       
+       if(obj->tx_slot) {
+               /* fill CAN message timestamp */
+               can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
+               /* Deliver message to edges */
+               canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
+               /* Free transmitted slot */
+               canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
+               obj->tx_slot=NULL;
+               DEBUGMSG("virtual: delayed delivery\n");
+       }
+       can_msgobj_clear_fl(obj,TX_LOCK);
+
+       virtual_schedule_next(obj);
+}
+
+/**
+ * virtual_wakeup_tx: - wakeups TX processing
+ * @chip: pointer to chip state structure
+ * @obj: pointer to message object structure
+ *
+ * Function is responsible for initiating message transmition.
+ * It is responsible for clearing of object TX_REQUEST flag
+ *
+ * Return Value: negative value reports error.
+ * File: src/virtual.c
+ */
+int virtual_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
+{
+       /* can_msgobj_set_fl(obj,TX_REQUEST); */
+       
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       int cmd;
+
+       can_msgobj_clear_fl(obj,TX_REQUEST);
+
+    #ifndef CAN_WITH_RTL
+       if(!virtual_bus_latency(obj)) {
+    #endif /*CAN_WITH_RTL*/
+               /* Ensure delivery of all ready slots */
+               while((cmd=canque_test_outslot(obj->qends, &qedge, &slot)) >= 0){
+                       if(cmd==0) {
+                               /* fill CAN message timestamp */
+                               can_filltimestamp(&slot->msg.timestamp);
+                               
+                               canque_filter_msg2edges(obj->qends, &slot->msg);
+                               DEBUGMSG("virtual: direct delivery\n");
+                       }
+                       canque_free_outslot(obj->qends, qedge, slot);
+               }
+    #ifndef CAN_WITH_RTL
+       } else {
+               virtual_schedule_next(obj);
+       }
+    #endif /*CAN_WITH_RTL*/
+
+       return 0;
+}
+
+
+/* * * Virtual Board Functionality * * */
+
+/**
+ * virtual_request_io: - reserve io or memory range for can board
+ * @candev: pointer to candevice/board which asks for io. Field @io_addr
+ *     of @candev is used in most cases to define start of the range
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/virtual.c
+ */
+int virtual_request_io(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * virtual_elease_io - free reserved io memory range
+ * @candev: pointer to candevice/board which releases io
+ *
+ * Return Value: The function always returns zero
+ * File: src/virtual.c
+ */
+int virtual_release_io(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * virtual_reset - hardware reset routine
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function returns zero on success or %-ENODEV on failure
+ * File: src/virtual.c
+ */
+int virtual_reset(struct candevice_t *candev)
+{
+       return 0;
+}
+
+/**
+ * virtual_init_hw_data - Initialize hardware cards
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return Value: The function always returns zero
+ * File: src/virtual.c
+ */
+int virtual_init_hw_data(struct candevice_t *candev) 
+{
+       candev->res_addr=0;
+       candev->nr_82527_chips=0;
+       candev->nr_sja1000_chips=0;
+       candev->nr_all_chips=1;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
+
+       return 0;
+}
+
+#define CHIP_TYPE "virtual"
+
+/**
+ * virtual_init_chip_data - Initialize chips
+ * @candev: Pointer to candevice/board structure
+ * @chipnr: Number of the CAN chip on the hardware card
+ *
+ * Return Value: The function always returns zero
+ * File: src/virtual.c
+ */
+int virtual_init_chip_data(struct candevice_t *candev, int chipnr)
+{
+       struct canchip_t *chip = candev->chip[chipnr];
+       chip->chip_type = CHIP_TYPE;
+       chip->chip_base_addr = 0;
+       chip->clock = 10000000;
+       chip->int_clk_reg = 0x0;
+       chip->int_bus_reg = 0x0;
+       chip->max_objects = 1;
+
+       CANMSG("initializing virtual chip operations\n");
+       chip->chipspecops->chip_config=virtual_chip_config;
+       chip->chipspecops->baud_rate=virtual_baud_rate;
+       chip->chipspecops->standard_mask=virtual_standard_mask;
+       chip->chipspecops->extended_mask=virtual_extended_mask;
+       chip->chipspecops->message15_mask=virtual_extended_mask;
+       chip->chipspecops->clear_objects=virtual_clear_objects;
+       chip->chipspecops->config_irqs=virtual_config_irqs;
+       chip->chipspecops->pre_read_config=virtual_pre_read_config;
+       chip->chipspecops->pre_write_config=virtual_pre_write_config;
+       chip->chipspecops->send_msg=virtual_send_msg;
+       chip->chipspecops->check_tx_stat=virtual_check_tx_stat;
+       chip->chipspecops->wakeup_tx=virtual_wakeup_tx;
+       chip->chipspecops->remote_request=virtual_remote_request;
+       chip->chipspecops->enable_configuration=virtual_enable_configuration;
+       chip->chipspecops->disable_configuration=virtual_disable_configuration;
+       chip->chipspecops->attach_to_chip=virtual_attach_to_chip;
+       chip->chipspecops->release_chip=virtual_release_chip;
+       chip->chipspecops->set_btregs=virtual_set_btregs;
+       chip->chipspecops->start_chip=virtual_start_chip;
+       chip->chipspecops->stop_chip=virtual_stop_chip;
+       chip->chipspecops->irq_handler=NULL;
+       chip->chipspecops->irq_accept=NULL;
+
+       return 0;
+}
+
+/**
+ * virtual_init_obj_data - Initialize message buffers
+ * @chip: Pointer to chip specific structure
+ * @objnr: Number of the message buffer
+ *
+ * Return Value: The function always returns zero
+ * File: src/virtual.c
+ */
+int virtual_init_obj_data(struct canchip_t *chip, int objnr)
+{
+       struct msgobj_t *obj=chip->msgobj[objnr];
+       obj->obj_base_addr=chip->chip_base_addr;
+       obj->tx_timeout.function=virtual_do_tx_timeout;
+       obj->tx_timeout.data=(unsigned long)obj;
+       return 0;
+}
+
+/**
+ * virtual_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/virtual.c
+ */
+int virtual_program_irq(struct candevice_t *candev)
+{
+       return 0;
+}
+
+int virtual_register(struct hwspecops_t *hwspecops)
+{
+       hwspecops->request_io = virtual_request_io;
+       hwspecops->release_io = virtual_release_io;
+       hwspecops->reset = virtual_reset;
+       hwspecops->init_hw_data = virtual_init_hw_data;
+       hwspecops->init_chip_data = virtual_init_chip_data;
+       hwspecops->init_obj_data = virtual_init_obj_data;
+       hwspecops->write_register = NULL;
+       hwspecops->read_register = NULL;
+       hwspecops->program_irq = virtual_program_irq;
+       return 0;
+}
diff --git a/lincan-0.3.3/src/write.c b/lincan-0.3.3/src/write.c
new file mode 100644 (file)
index 0000000..4b65a14
--- /dev/null
@@ -0,0 +1,114 @@
+/* write.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+#include "../include/write.h"
+
+ssize_t can_write(struct file *file, const char *buffer, size_t length, loff_t *offset)
+{
+       struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct msgobj_t *obj;
+       struct canmsg_t msg_buff;
+       struct canque_ends_t *qends;
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       int ret;
+       unsigned bytes_to_copy;
+
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_write: bad canuser magic\n");
+               return -ENODEV;
+       }
+
+       if (length < sizeof(struct canmsg_t)) {
+               DEBUGMSG("Trying to write less bytes than a CAN message,\n");
+               DEBUGMSG("this will always return 0 !\n");
+               return 0;
+       }
+       if (length > INT_MAX) {
+               CANMSG("Trying to write more than is supported.\n");
+               return -1;
+       }
+       if (length % sizeof(struct canmsg_t)) {
+               CANMSG("The number of bytes requested to be written is not a multiple of\n");
+               CANMSG("'sizeof(struct canmsg_t)', currently this is not allowed.\n");
+               return -1;
+       } 
+
+       /* Initialize hardware pointers */
+       obj = canuser->msgobj;
+       if (obj == NULL) {
+               CANMSG("Could not assign buffer structure\n");
+               return -1;
+       }
+       qends = canuser->qends;
+
+
+       /* Prepare first message */
+       ret = copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t));
+       if(ret) return -EFAULT;
+
+       /* Automatic selection of extended format if ID>2047 */
+       if (msg_buff.id & ~0x7ffl & MSG_ID_MASK ) msg_buff.flags |= MSG_EXT;
+       /* has been dependent on "extended" option */
+
+       /* If the output buffer is full, return immediately in case O_NONBLOCK
+        * has been specified or loop until space becomes available.
+        */
+       if ((ret=canque_get_inslot4id(qends, &qedge, &slot, 
+                       0, msg_buff.id, 0))<0){
+               DEBUGMSG("Buffer is full\n");
+               if(ret < -1)
+                       return -EIO;
+
+               if (file->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+
+               ret=canque_get_inslot4id_wait_kern(qends, &qedge, &slot, 
+                                               0, msg_buff.id, 0);
+               if(ret<0) {
+                       if (signal_pending(current))
+                               return -EINTR;
+                       /*if (!can_timeout)*/
+                       return -EIO;
+               }
+       }
+       slot->msg=msg_buff;
+       canque_put_inslot(qends, qedge, slot);
+       buffer += sizeof(struct canmsg_t);
+       bytes_to_copy = length-sizeof(struct canmsg_t);
+
+       /* 
+        * Try to send more messages
+        */
+       while (bytes_to_copy >= sizeof(struct canmsg_t)) {
+               bytes_to_copy -= sizeof(struct canmsg_t);
+               /* Prepare first message */
+               ret = copy_from_user(&msg_buff, buffer, sizeof(struct canmsg_t));
+               if(ret) return -EFAULT;
+
+               /* Automatic selection of extended format if ID>2047 */
+               if (msg_buff.id & ~0x7ffl & MSG_ID_MASK ) msg_buff.flags |= MSG_EXT;
+               /* has been dependent on "extended" option */
+
+               /* Get slot */
+               if(canque_get_inslot4id(qends, &qedge, &slot, 
+                       0, msg_buff.id, 0) < 0) break;
+               slot->msg=msg_buff;
+               canque_put_inslot(qends, qedge, slot);
+               buffer += sizeof(struct canmsg_t);
+       }
+
+        if(file->f_flags & O_SYNC) {
+               canque_sync_wait_kern(qends, qedge);
+       }
+       return length-bytes_to_copy;
+}      
diff --git a/lincan-0.3.3/src/write_rtl.c b/lincan-0.3.3/src/write_rtl.c
new file mode 100644 (file)
index 0000000..a078c6b
--- /dev/null
@@ -0,0 +1,106 @@
+/* write.c
+ * Linux CAN-bus device driver.
+ * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+ * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
+ * email:pisa@cmp.felk.cvut.cz
+ * This software is released under the GPL-License.
+ * Version lincan-0.3  17 Jun 2004
+ */
+
+#ifdef CAN_WITH_RTL
+
+#include "../include/can.h"
+#include "../include/can_sysdep.h"
+#include "../include/main.h"
+
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+
+ssize_t can_write_rtl_posix(struct rtl_file *fptr, const char *buffer,
+                                size_t length, loff_t *ppos)
+{
+       struct canuser_t *canuser =
+               (struct canuser_t *)can_get_rtl_file_private_data(fptr);
+       const struct canmsg_t *msg_buff = (struct canmsg_t *)buffer;
+       struct canque_ends_t *qends;
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       int      msg_flags;
+       int      ret;
+       size_t   bytes_to_copy;
+
+       if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
+               CANMSG("can_write_rtl_posix: bad canuser magic\n");
+               return -ENODEV;
+       }
+
+       if (length < sizeof(struct canmsg_t)) {
+               DEBUGMSG("Trying to write less bytes than a CAN message,\n");
+               DEBUGMSG("this will always return 0 !\n");
+               return 0;
+       }
+       if (length > INT_MAX) {
+               CANMSG("Trying to write more than is supported.\n");
+               return -1;
+       }
+
+       qends = canuser->qends;
+
+       msg_flags=msg_buff->flags;
+
+       /* Automatic selection of extended format if ID>2047 */
+       if (msg_buff->id & ~0x7ffl & MSG_ID_MASK ) msg_flags |= MSG_EXT;
+       /* has been dependent on "extended" option */
+
+       /* If the output buffer is full, return immediately in case O_NONBLOCK
+        * has been specified or loop until space becomes available.
+        */
+       if ((ret=canque_get_inslot4id(qends, &qedge, &slot, 
+                       0, msg_buff->id, 0))<0){
+               DEBUGMSG("Buffer is full\n");
+               if(ret < -1)
+                       return -EIO;
+
+               if (fptr->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+
+               ret=canque_get_inslot4id_wait_rtl(qends, &qedge, &slot, 
+                                               0, msg_buff->id, 0);
+               if (ret == -1)
+                       return -EINTR;
+               
+               if(ret<0) {
+                       return -EIO;
+               }
+       }
+       slot->msg=*(msg_buff++);
+       slot->msg.flags=msg_flags;
+       canque_put_inslot(qends, qedge, slot);
+       bytes_to_copy = length-sizeof(struct canmsg_t);
+
+       /* 
+        * Try to send more messages
+        */
+       while (bytes_to_copy >= sizeof(struct canmsg_t)) {
+               bytes_to_copy -= sizeof(struct canmsg_t);
+               msg_flags=msg_buff->flags;
+
+               /* Automatic selection of extended format if ID>2047 */
+               if (msg_buff->id & ~0x7ffl & MSG_ID_MASK ) msg_flags |= MSG_EXT;
+               /* has been dependent on "extended" option */
+
+               /* Get slot */
+               if(canque_get_inslot4id(qends, &qedge, &slot, 
+                       0, msg_buff->id, 0) < 0) break;
+               slot->msg=*(msg_buff++);
+               slot->msg.flags=msg_flags;
+               canque_put_inslot(qends, qedge, slot);
+       }
+
+        if(fptr->f_flags & O_SYNC) {
+               canque_sync_wait_rtl(qends, qedge);
+       }
+       return length-bytes_to_copy;
+}      
+
+#endif /*CAN_WITH_RTL*/
diff --git a/lincan-0.3.3/switch-omk2std b/lincan-0.3.3/switch-omk2std
new file mode 100644 (file)
index 0000000..d6eb965
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+# This shell script switches LinCAN build system
+# form OMK framework to standard makefiles
+
+#cd lincan-0.x.y-omk
+cp Makefile.std Makefile
+cp utils/Makefile.std utils/Makefile
+cp src/Makefile.std src/Makefile
+touch Standalone.mk
diff --git a/lincan-0.3.3/utils/Makefile b/lincan-0.3.3/utils/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/lincan-0.3.3/utils/Makefile.omk b/lincan-0.3.3/utils/Makefile.omk
new file mode 100644 (file)
index 0000000..32409d7
--- /dev/null
@@ -0,0 +1,27 @@
+default_CONFIG = CONFIG_OC_LINCAN=x CONFIG_OC_LINCANRTL=x
+
+ifeq ($(CONFIG_OC_LINCAN),y)
+
+INCLUDES = -I $(srcdir)/../include
+
+utils_PROGRAMS = readburst sendburst rxtx send can_proxy 
+
+readburst_SOURCES = readburst.c
+sendburst_SOURCES = sendburst.c
+rxtx_SOURCES = rxtx.c
+send_SOURCES = send.c
+can_proxy_SOURCES = can-proxy.c
+
+# RT-Linux version of build
+
+ifeq ($(CONFIG_OC_LINCANRTL),y)
+
+rtlinux_MODULES = sendburst_rtl readburst_rtl
+
+sendburst_rtl_SOURCES = sendburst_rtl.c
+
+readburst_rtl_SOURCES = readburst_rtl.c
+
+endif #CONFIG_OC_LINCANRTL
+endif #CONFIG_OC_LINCAN
+
diff --git a/lincan-0.3.3/utils/Makefile.std b/lincan-0.3.3/utils/Makefile.std
new file mode 100644 (file)
index 0000000..1912466
--- /dev/null
@@ -0,0 +1,49 @@
+# Makefile for the Linux CAN-bus driver.
+# Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+# This software is released under the GPL-License.
+# Version 0.7  6 Aug 2001
+#
+# Changes made by Pavel Pisa pisa@cmp.felk.cvut.cz as preliminary
+# study for OCERA Real Time CAN/CANOpen project ORTCAN
+#
+########## The following options can be changed ##########
+
+# Compiler
+ifndef CC
+CC = gcc
+endif
+
+CFLAGS = -I../include -O2 -Wall
+
+all: default
+
+.PHONY: dep default subdirs clean cleandepend
+.PHONY: check-dir include-pass library-pass binary-pass utils-pass kernel-pass
+
+default: utils
+
+utils-pass: utils
+
+dep:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M *.c $(MORE_C_FILES) > .depend
+
+install:
+       echo Nothing to install
+
+utils: rxtx sendburst readburst send can-proxy
+
+rxtx: rxtx.o
+
+sendburst: sendburst.o
+
+readburst: readburst.o
+
+send: send.o
+
+clean :
+       rm -f rxtx sendburst readburst send can-proxy *.o .depend
+
+distclean : clean
+
+-include .depend
+
diff --git a/lincan-0.3.3/utils/README b/lincan-0.3.3/utils/README
new file mode 100644 (file)
index 0000000..22a8afe
--- /dev/null
@@ -0,0 +1,10 @@
+README for the rxtx sample program to use with the Linux CAN-bus driver.
+Written by Arnaud Westenberg email:arnaud@wanadoo.nl
+This software is released under the GPL-License.
+Version 0.6  18 Sept 2000
+
+This program is automatically compiled when compiling the driver. It's a very
+simple program wich asks some questions about what you want to do. The program
+allows you to send or receive standard or 'remote transmission' messages.
+
+Just give it a try.
diff --git a/lincan-0.3.3/utils/can-proxy.c b/lincan-0.3.3/utils/can-proxy.c
new file mode 100644 (file)
index 0000000..d9dbcdd
--- /dev/null
@@ -0,0 +1,517 @@
+//#############################################################################
+/** @file                              can-proxy.c
+ @author:              T.Motylewski@bfad.de
+ Operating System:     LINUX
+ Compiler:                     gcc
+ Description:          gateway CAN-UDP.
+receives all CAN packets, prints them and may save them to a file.
+may send packets with ID, len, data entered from keyboard or from text file.
+may send to CAN packets received over UDP
+will forward packets from CAN to the most recent IP/UDP address.
+*/
+//#############################################################################
+
+
+//-----------------------------------------------------------------------------
+//                                  INCLUDES
+//-----------------------------------------------------------------------------
+
+#include <stdio.h>
+#include "can.h"
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+#include <fcntl.h>
+
+#define DEFAULT_CAN_SERVER_PORT 3007
+#define DEFAULT_CAN_CLIENT_PORT 3008
+#define MAX_MSG_SIZE 4000
+
+extern int SendCanMsg(canmsg_t * msg);
+extern int ReceiveCanMsg(canmsg_t * msg);
+extern int ReadInput(int fd);
+
+
+/** tm means time in units of 1/100 s since program started (tsStarted)
+ * tm time stays positive for 24.8 days after system boot.
+ * It can be redefined by changing TM_HZ value to something else than 1000.
+ * Always use TM_HZ when comparing time with real seconds.
+ * The code should work after "time wraparound" but if something happens you know why.
+ * ts means time in sec */
+#define TM_HZ 1000
+
+
+#define MSG_CAN_UNKNOWN -1
+#define MSG_CAN_NONE 0
+#define TRUE 1
+#define FALSE 0
+#define CAN_MSG_SIZE sizeof(canmsg_t)
+#define CAN_DEV "/dev/can0"
+
+enum BusStateFlags {
+       BusReset = 1,
+       BusLocked = 1<<1
+};
+
+#define WARN(fmt...) (fprintf(stderr,"WARN:" fmt),fprintf(stderr,"\n"))
+#define ERR(fmt...) (fprintf(stderr,"ERROR:" fmt),fprintf(stderr,"\n"))
+
+#ifdef DEBUG
+       //#define DMSG(fmt...) (fprintf(stderr,"DBG:" fmt),fprintf(stderr," %f\n",gettime()))
+       //very usefull for debugging data change after some miliseconds combined with dumpnc.c
+
+       #define DMSG(fmt...) (fprintf(stderr,"DBG:" fmt),fprintf(stderr,"\n"))
+#else
+       #define DMSG(fmt...)
+#endif
+
+
+/** global variables */
+
+unsigned short int myport;
+unsigned short int toport;
+struct sockaddr_in myaddr, fromaddr, recvaddr, toaddr;
+
+
+int fdCanDev;
+int fdNet;
+int fdError;
+int fdIn;
+FILE * fLog;
+long iBusFlags;
+time_t tsStarted;
+long tmLastVerified=0;
+long tmNow;  // current time, global, will be updated in many places
+long tmLastSentReceived=0;
+struct timeval tvNow;
+struct timeval tvSelectTimeout;
+double time0;
+double SleepUntil=0;
+
+int quiet = 0;
+int use_select = 0;
+
+
+long tmGet() {
+       gettimeofday(&tvNow,NULL);
+       return (tmNow=TM_HZ*(tvNow.tv_sec-tsStarted) + (TM_HZ*tvNow.tv_usec)/1000000);
+#if TM_HZ>2147
+#error when using 32 bit signed int TM_HZ can not be greater than 2147
+#endif
+}
+
+double gettime() {
+       gettimeofday(&tvNow,NULL);
+       return ( tvNow.tv_sec + tvNow.tv_usec/1000000.0);
+}
+
+/**
+       removes '\r\n' and all spaces and tabs from the end of string str
+       @param str: input/output string
+       @return final string length (without terminating \0) */
+int RemoveNL(char *str)
+{
+       int iLength;
+       for(iLength = strlen(str)-1; iLength >=0; iLength --) {
+               //DMSG("RmNL LineLength:>%i<", iLength);
+               if (isspace(str[iLength])) {
+                       str[iLength] = '\0';
+               }
+               else
+                       break;
+       }
+       return iLength+1;
+}
+
+
+/**
+       sending data over tcp/ip
+       @param fd       - file descriptor for connection
+       @param msg      - pointer to message to be written
+       @param size     - size of message
+       @return result of sendto */
+int WriteNet(int fd, void * msg, int size) {
+       return sendto(fd, msg, size, 0, (struct sockaddr*)&toaddr, sizeof(toaddr));
+}
+
+/**
+       reading data over tcp/ip
+       @param fd       - file descriptor for connection
+       @param msg      - pointer to message to be read
+       @param size     - size of message
+       @return result of recvfrom */
+int ReadNet(int fd, void * msg, int size) {
+       char recvbuf[MAX_MSG_SIZE];
+       int ret;
+       unsigned int recvaddrsize = sizeof(recvaddr);
+
+       // setting recvaddr is required for non-connected sockets
+       memcpy(&recvaddr, &fromaddr, sizeof(recvaddr));
+       ret = recvfrom(fd, recvbuf, MAX_MSG_SIZE, 0, (struct sockaddr*)& recvaddr, &recvaddrsize);
+//  DMSG("NET: %d", ret);
+       if(ret>size)
+               ret = size;
+       if(ret>0)
+               memcpy(msg, recvbuf, size);
+       return ret;
+}
+
+void show_usage(void) {
+       printf("can-proxy options:\n"
+       "-i     : intercative (send CAN packets typed by user)\n"
+       "-o file.log : log all traffic to a file\n"
+       "-p port : send CAN packets arriving at UDP port\n"
+       "-c     : use select() for CAN (driver can-0.7.1-pi3.4 or newer)\n"
+       "-q     : quiet\n"
+       "-h     : this help\n"
+       "UDP arriving at specified port causes can-proxy to forward all CAN\n"
+       "traffic back to the sender, establishing bi-directional communication.\n");
+}
+
+/**
+       handling command line options, calling functions, main program loop 
+       @param argc, char * argv[]      - command line options
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int main(int argc, char * argv[]) {
+       struct timeval tvTimeoutTmp;
+       int fdSelectMax;
+//     int ret;
+       int opt;
+       fd_set readsel;
+       canmsg_t canmsg;
+
+       myport = DEFAULT_CAN_SERVER_PORT;
+       toport = DEFAULT_CAN_CLIENT_PORT;
+       fdNet = fdCanDev = fdIn = -1;
+       fLog = NULL;
+       
+       iBusFlags = 0;
+       time0 = gettime();
+       tsStarted = tvNow.tv_sec;
+       tvSelectTimeout.tv_sec = 0;
+       tvSelectTimeout.tv_usec = 500000; // wake up every 0.5 s even without data
+
+       while((opt=getopt(argc, argv, "io:p:ch"))>0) {
+               switch(opt) {
+               case 'i': // interactive or stdin
+                       fdIn = 0;
+                       break;
+               case 'o': // log file
+                       fLog = fopen(optarg,"a");
+                       break;
+               case 'p':
+                       sscanf(optarg,"%hi", &myport);
+                       break;
+               case 'c':
+                       fdCanDev = open(optarg,O_RDWR/*|O_NONBLOCK - select supported*/);
+                       use_select++;
+                       break;
+               case 'q':
+                       quiet ++;
+                       break;
+               case 'h':
+                       show_usage();
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       if(!quiet)
+               fprintf(stderr, "can-proxy v0.7.1-pi3.5 (C) 2002 BFAD GmbH http://www.getembedded.de/ (GPL) \n");
+
+       
+       if(fdCanDev<0)
+               fdCanDev = open(CAN_DEV,O_RDWR|O_NONBLOCK);
+       fdNet = socket(AF_INET,SOCK_DGRAM,0);
+       memset(&myaddr, 0, sizeof(myaddr));
+       memset(&fromaddr, 0, sizeof(fromaddr));
+       memset(&toaddr, 0, sizeof(toaddr));
+
+       memset(& canmsg, 0, sizeof(canmsg));
+       myaddr.sin_family=AF_INET;
+       myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
+       myaddr.sin_port = htons(myport) ;
+
+       toaddr.sin_family=AF_INET;
+       toaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);;
+       toaddr.sin_port = htons(toport);
+
+       bind(fdNet,(struct sockaddr*) &myaddr,sizeof(myaddr));
+
+       if(fdCanDev< 0 ) {
+               perror(CAN_DEV);
+               ERR("1.CAN-PROXY main fdCanDev not valid:%d, exiting", fdCanDev);
+               exit(1);
+       }
+
+       while(1) {
+               tvTimeoutTmp = tvSelectTimeout;
+               fdSelectMax=0;
+               FD_ZERO(&readsel);
+               if(fdCanDev>=0){
+                       FD_SET(fdCanDev, &readsel);
+                       if(fdCanDev+1>fdSelectMax)
+                               fdSelectMax = fdCanDev+1;
+               }
+               if(fdNet>=0) {
+                        FD_SET(fdNet, &readsel);
+                        if(fdNet+1>fdSelectMax)
+                                fdSelectMax = fdNet+1;
+               }
+               if(fdIn>=0) {
+                        FD_SET(fdIn, &readsel);
+                        if(fdIn+1>fdSelectMax)
+                                fdSelectMax = fdIn+1;
+               }
+               select(fdSelectMax, &readsel, NULL, NULL, &tvTimeoutTmp);
+               if(fdCanDev>=0 && FD_ISSET(fdCanDev, &readsel)) {
+                       if(ReceiveCanMsg(&canmsg) == 0) {
+                               WriteNet(fdNet, &canmsg, sizeof(canmsg));
+                               continue; // reading CAN has priority
+                       }
+               }
+               if(gettime()-time0 < SleepUntil) {
+                       continue;
+               }
+               if(fdNet>=0 && FD_ISSET(fdNet,&readsel)) {
+                       ReadNet(fdNet, &canmsg, sizeof(canmsg));
+                       // TODO: this will work for a single client
+                       // multiple clients should probably use broadcast
+                       //  for now we just reply to the most recent address
+                       toaddr = recvaddr;
+                       SendCanMsg(&canmsg);
+               }
+               if(fdIn>=0 && FD_ISSET(fdIn, &readsel)) {
+                       ReadInput(fdIn);
+               }
+               if(!use_select)
+                       usleep(20000);
+       }
+       return 0;       
+}
+
+/**
+       logging messages to/from CAN
+       @param dir      - direction
+       @param fout - file descriptor for output
+       @param msg      - CanMsgPerma
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int LogMsg(char * dir, FILE *fout, canmsg_t * msg) {
+       int i;
+       double t;
+
+       t = gettime()-time0;
+       if(msg->length < 0)
+               msg->length = 0;
+       if(msg->length > 8)
+               msg->length = 8;
+
+       fprintf(stdout,"%s %8.3f  id=%08lx n=%d", 
+               dir, gettime()-time0, msg->id, msg->length);
+       for(i=0; i< msg->length; i++) {
+               fprintf(stdout, " %02x",  msg->data[i]);
+       }
+       fprintf(stdout, "\n");
+       fflush(stdout);
+
+       if(!fout) 
+               return 0;
+
+       fprintf(fout,"%s %8.3f  id=%08lx n=%d", 
+               dir, gettime()-time0, msg->id, msg->length);
+       for(i=0; i< msg->length; i++) {
+               fprintf(fout, " %02x",  msg->data[i]);
+       }
+       fprintf(fout, "\n");
+       fflush(fout);
+
+       return 0;
+}
+
+
+/** PERMA CAN utility functions */
+
+/**
+       sending messages to CAN
+       @param msg      - CanMsgPerma
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int SendCanMsg(canmsg_t * msg) {
+       int ret;
+
+       msg->flags = MSG_EXT;
+       msg->cob = 0;
+       tmGet();
+       ret=write(fdCanDev, msg, CAN_MSG_SIZE);
+       LogMsg("SEND", fLog, msg);
+       tmLastSentReceived = tmNow;
+       if( ret != CAN_MSG_SIZE) {
+               perror("sending to CAN");
+//TODO: send to error_ico
+               return ret;
+       }
+       return 0;
+}
+       
+/**
+       receiving messages from CAN
+       @param msg      - CanMsgPerma
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int ReceiveCanMsg(canmsg_t * msg) {
+       int ret;
+//     double t;
+//     fdCanDev = open(CAN_DEV,O_RDWR | O_NONBLOCK);
+
+       msg->flags = 0;
+       msg->cob = 0;
+       ret = read(fdCanDev,msg, CAN_MSG_SIZE);
+       if(ret == CAN_MSG_SIZE) {       
+               LogMsg("RECV", fLog, msg);
+               tmLastSentReceived = tmNow;
+               return 0;
+       }
+       // we can receive 0 here
+       if(ret == 0 || (ret == -1 && errno == EAGAIN)) {
+               return -EAGAIN;
+       }
+       DMSG("received %d bytes",ret);
+       return ret;
+}
+
+/** @name GetNumber
+       aliasing: deassign
+       @param buf      - string buffer
+       @param val      - alias value
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int GetNumber(char * buf, int * val) {
+       if(!buf) {
+               return -1;
+       }
+       if(sscanf(buf,"%i", val)==1) {
+               return 0;
+       }
+       return -1;
+}
+
+/** @name BuildCanMsg
+       building the can message from buf string to msg
+       @param buf      - 
+       @param msg      - CanMsgPerma
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int BuildCanMsg(char * buf, canmsg_t *msg) {
+       int val;
+       int i;
+
+       buf = strtok(buf, " \t");
+
+       val = msg->id;
+       buf = strtok(NULL, " \t");
+       GetNumber(buf, &val);
+       msg->id = val;
+
+       val = msg->length;
+       buf = strtok(NULL, " \t");
+       GetNumber(buf, &val);
+       msg->length = val;
+
+       for(i=0;(buf = strtok(NULL, " \t")); i++) {
+               val = msg->data[i];
+               GetNumber(buf, &val);
+               msg->data[i] = val;
+       }
+       return 0;
+}
+
+
+#define LINE_L 66000
+char buf[LINE_L];
+
+extern int ReadCommand(char *buf);
+
+
+/**
+       processing a script or from stdin
+       @param fd       - file descriptor
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int ReadInput(int fd) {
+       int ret;
+       int i,j;
+       ret = read(fd, buf, LINE_L);
+       for(i=0; i< ret; ) {
+               for(j=i; (j<ret) && (buf[j] != '\n'); j++); // find NL
+               if(j<ret) {
+                       buf[j] = '\0';
+                       ReadCommand(buf+i);
+                       i=j+1;
+               } else {
+                       fprintf(stderr, "too big input file\n");
+                       i=j;
+               }
+       }
+       return 0;
+}
+
+/**
+       reading and handling commands from buf string
+       @param buf      - string buffer, 1.char tells about what is to be done: 
+                                                                w - write 
+                                                                s - sleep
+                                                                a - assign (simple aliasing mechanism)
+                                                                r - reset timer
+                                                                l - lock the bus
+                                                                q - quit application
+       @return  0                                      - OK
+                       -1                                      - ERROR */
+int ReadCommand(char *buf) {
+       static int usSleep=20000;
+       char * ptr;
+       static canmsg_t msg;
+
+       buf[LINE_L-1] = '\0';
+       if(RemoveNL(buf) == 0)
+               return 0; // empty line
+
+       switch(tolower(buf[0])) {
+       case 'q':
+               DMSG("1.CAN-PROXY ReadCommand received QUIT command, exiting");
+               exit(0);
+               break;
+       case 'r':
+               time0 = gettime();
+               break;
+       case 't':
+               printf("TIME %8.3f\n", gettime()-time0);
+               break;
+       case 's':
+               strtok(buf, " \t");
+               ptr = strtok(NULL, " \t");
+               if(ptr)
+                       sscanf(ptr,"%i", &usSleep);
+               SleepUntil = gettime()-time0 + usSleep/1000000.0;
+               break;
+       case 'w':
+               if(BuildCanMsg(buf, &msg) == 0) {
+                       SendCanMsg(&msg);
+               } else {
+                       fprintf(stderr,"wrong message syntax: %s\n", buf);
+               }
+               break;
+       }
+       return 0;
+}
+
diff --git a/lincan-0.3.3/utils/readburst.c b/lincan-0.3.3/utils/readburst.c
new file mode 100644 (file)
index 0000000..c0e3ba1
--- /dev/null
@@ -0,0 +1,196 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+
+#include "../include/can.h"
+
+int fd;
+
+struct canfilt_t canfilt = {
+       .flags = 0,
+       .queid = 0,
+       .cob = 0,
+       .id = 0,
+       .mask = 0
+};
+
+int canfilt_fl;
+
+int query_fl;
+
+int can_wait_sec = 5;
+
+char *can_dev_name = "/dev/can0";
+
+#define PRT_PREFIX_SIZE 40
+char prt_prefix[PRT_PREFIX_SIZE];
+
+char *prt_prefix_in = "CAN %s : ";
+
+int can_fd_wait(int fd, int wait_sec)
+{
+       int ret;
+       struct timeval timeout;
+       fd_set set;
+
+       FD_ZERO (&set);
+       FD_SET (fd, &set);
+       timeout.tv_sec = wait_sec;
+       timeout.tv_usec = 0;
+       while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+          &&errno==-EINTR);
+       return ret;
+}
+
+
+/*--- handler on SIGINT signal : the program quit with CTL-C ---*/
+void sortie(int sig)
+{
+       close(fd);
+       printf("Terminated by user\n");
+       exit(0);
+}
+
+static void
+usage(void)
+{
+  printf("usage: readburst\n");
+  printf("  -d, --device  <name>     name of CAN device [/dev/can0]\n");
+  printf("  -m, --mask  <num>        CAN filter mask\n");
+  printf("  -i, --id  <num>          CAN filter message ID\n");
+  printf("  -f, --flags <num>        CAN filter flags\n");
+  printf("  -w, --wait <num>         number of seconds to wait in select call\n");
+  printf("  -p, --prefix <str>       string prefix for output\n");
+  printf("  -q, --query              query driver features\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+
+int main(int argc, char *argv[])
+{
+       static struct option long_opts[] = {
+               { "uldev", 1, 0, 'd' },
+               { "mask",  1, 0, 'm' },
+               { "id",    1, 0, 'i' },
+               { "flags", 1, 0, 'f' },
+               { "wait",  1, 0, 'w' },
+               { "prefix",1, 0, 'p' },
+               { "query" ,0 ,0, 'q' },
+               { "version",0,0, 'V' },
+               { "help",  0, 0, 'h' },
+               { 0, 0, 0, 0}
+       };
+       int opt;
+
+       int n,ret;
+       unsigned long i=0;
+       #ifdef CAN_MSG_VERSION_2
+       struct canmsg_t readmsg={0,0,5,{0,0},0,{0,}};
+       #else /* CAN_MSG_VERSION_2 */
+       struct canmsg_t readmsg={0,0,5,0,0,{0,}};
+       #endif /* CAN_MSG_VERSION_2 */
+       struct sigaction act;
+
+
+       while ((opt = getopt_long(argc, argv, "d:m:i:f:w:p:qVh",
+                           &long_opts[0], NULL)) != EOF) switch (opt) {
+               case 'd':
+                       can_dev_name=optarg;
+                       break;
+               case 'm':
+                       canfilt_fl=1;
+                       canfilt.mask = strtol(optarg,NULL,0);
+                       break;
+               case 'i':
+                       canfilt_fl=1;
+                       canfilt.id = strtol(optarg,NULL,0);
+                       break;
+               case 'f':
+                       canfilt_fl=1;
+                       canfilt.flags = strtol(optarg,NULL,0);
+                       break;
+               case 'w':
+                       can_wait_sec = strtol(optarg,NULL,0);
+                       break;
+               case 'p':
+                       prt_prefix_in = optarg;
+                       break;
+               case 'q':
+                       query_fl=1;
+                       break;
+               case 'V':
+                       fputs("LinCAN utilities v0.2\n", stdout);
+                       exit(0);
+               case 'h':
+               default:
+                       usage();
+                       exit(opt == 'h' ? 0 : 1);
+       }
+
+
+       /*------- register handler on SIGINT signal -------*/
+       act.sa_handler=sortie;
+       sigemptyset(&act.sa_mask);
+       act.sa_flags=0;
+       sigaction(SIGINT,&act,0);
+       /*---------------------------------------*/     
+
+       if ((fd=open(can_dev_name, O_RDWR)) < 0) {
+               perror("open");
+               printf("Error opening %s\n", can_dev_name);
+               exit(1);        
+       }
+       
+       if (query_fl) {
+               n=ioctl(fd, CAN_DRV_QUERY, CAN_DRV_QRY_BRANCH);
+               printf("CAN driver branch:  %c%c%c%c\n",(n>>24)&0xff,(n>>16)&0xff,(n>>8)&0xff,n&0xff);
+               n=ioctl(fd, CAN_DRV_QUERY, CAN_DRV_QRY_VERSION);
+               printf("CAN driver version: %d.%d.%d\n",(n>>16)&0xff,(n>>8)&0xff,n&0xff);
+               n=ioctl(fd, CAN_DRV_QUERY, CAN_DRV_QRY_MSGFORMAT);
+               printf("CAN message format: %08x\n",n);
+               close(fd);
+               return 0;
+       }
+
+       if (canfilt_fl) {
+               ret = ioctl(fd, CANQUE_FILTER, &canfilt);
+               if(ret<0) {
+                       perror("ioctl FILTER_QUE");
+               }
+       }
+
+       snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
+       
+       while (1) {
+               readmsg.flags=0;
+               readmsg.cob=0;
+           #if 1
+               ret=can_fd_wait(fd, can_wait_sec);
+               printf("%scan_fd_wait returned %d\n", prt_prefix, ret);
+           #endif
+               ret=read(fd,&readmsg,sizeof(struct canmsg_t));
+               if(ret <0) {
+                       printf("%sError reading message\n", prt_prefix);
+               }
+               else if(ret == 0) {
+                       printf("%sNo message arrived\n", prt_prefix);
+               } else {
+                       printf("%sRx msg #%lu: id=%lX dlc=%u flg=0x%02x",
+                               prt_prefix,i,readmsg.id,readmsg.length,readmsg.flags);
+                       for(n=0 ; n<readmsg.length ; n++)
+                               printf(" %.2X",(unsigned char)readmsg.data[n]);
+                       printf("\n");
+                       i++;
+               }
+       }
+       return 0;
+}
diff --git a/lincan-0.3.3/utils/readburst_rtl.c b/lincan-0.3.3/utils/readburst_rtl.c
new file mode 100644 (file)
index 0000000..8595eeb
--- /dev/null
@@ -0,0 +1,165 @@
+#include <rtl.h>
+#include <time.h>
+#include <signal.h>
+#include <pthread.h>
+#include <posix/unistd.h>
+
+#define printf rtl_printf
+
+#include "../include/can.h"
+
+int fd;
+
+struct canfilt_t canfilt = {
+       .flags = 0,
+       .queid = 0,
+       .cob = 0,
+       .id = 0,
+       .mask = 0
+};
+
+int canfilt_fl;
+
+int canfilt_mask, canfilt_id, canfilt_flags;
+
+
+int can_wait_sec = 5;
+
+char *can_dev_name = "/dev/can0";
+
+#define PRT_PREFIX_SIZE 40
+char prt_prefix[PRT_PREFIX_SIZE];
+
+char *prt_prefix_in = "CAN %s : ";
+
+MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]");
+MODULE_PARM(can_dev_name,"1s");
+MODULE_PARM_DESC(canfilt_mask,"CAN filter mask");
+MODULE_PARM(canfilt_mask,"1i");
+MODULE_PARM_DESC(canfilt_id,"CAN filter message ID");
+MODULE_PARM(canfilt_id,"1i");
+MODULE_PARM_DESC(canfilt_flags,"CAN filter flags");
+MODULE_PARM(canfilt_flags,"1i");
+MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages");
+MODULE_PARM(can_wait_sec,"1i");
+MODULE_PARM_DESC(prt_prefix_in,"string prefix for output");
+MODULE_PARM(prt_prefix_in,"1i");
+
+MODULE_SUPPORTED_DEVICE("sendburst_rtl");
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
+MODULE_DESCRIPTION("readburst_rtl: receiver of CAN messages for RT-Linux interface to LinCAN driver");
+MODULE_LICENSE("GPL");
+
+void readburst_cleanup(void *arg)
+{
+       printf("%scleanup handler called\n", prt_prefix);
+       close((int)arg);
+}
+
+#if 0
+int can_fd_wait(int fd, int wait_sec)
+{
+       int ret;
+       struct timeval timeout;
+       fd_set set;
+
+       FD_ZERO (&set);
+       FD_SET (fd, &set);
+       timeout.tv_sec = wait_sec;
+       timeout.tv_usec = 0;
+       while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+          &&errno==-EINTR);
+       return ret;
+}
+#endif
+
+int readburst_main(void *arg)
+{
+       int n,ret;
+       unsigned long i=0;
+       #ifdef CAN_MSG_VERSION_2
+       struct canmsg_t readmsg={0,0,5,{0,0},0,{0,}};
+       #else /* CAN_MSG_VERSION_2 */
+       struct canmsg_t readmsg={0,0,5,0,0,{0,}};
+       #endif /* CAN_MSG_VERSION_2 */
+
+       if(canfilt_mask || canfilt_id || canfilt_flags){
+               canfilt_fl=1;
+               canfilt.mask=canfilt_mask;
+               canfilt.id=canfilt_id;
+               canfilt.flags=canfilt_flags;
+       }
+
+       if ((fd=open(can_dev_name, O_RDWR)) < 0) {
+               printf("Error opening %s\n", can_dev_name);
+               return -1;      
+       }
+        pthread_cleanup_push(readburst_cleanup,(void*)fd);
+
+       snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
+       
+       if (canfilt_fl) {
+               ret = ioctl(fd, CANQUE_FILTER, &canfilt);
+               if(ret<0) {
+                       printf("%serror in call ioctl FILTER_QUE",prt_prefix);
+               }
+       }
+
+       
+       while (1) {
+               readmsg.flags=0;
+               readmsg.cob=0;
+           #if 0
+               ret=can_fd_wait(fd, can_wait_sec);
+               printf("%scan_fd_wait returned %d\n", prt_prefix, ret);
+           #endif
+               ret=read(fd,&readmsg,sizeof(struct canmsg_t));
+               if(ret <0) {
+                       printf("%sError reading message\n", prt_prefix);
+               }
+               else if(ret == 0) {
+                       printf("%sNo message arrived\n", prt_prefix);
+               } else {
+                       printf("%sRx msg #%lu: id=%lX dlc=%u flg=0x%02x",
+                               prt_prefix,i,readmsg.id,readmsg.length,readmsg.flags);
+                       for(n=0 ; n<readmsg.length ; n++)
+                               printf(" %.2X",(unsigned char)readmsg.data[n]);
+                       printf("\n");
+                       i++;
+               }
+               pthread_testcancel();
+
+       }
+       /* close(fd); is called by cleanup handler*/
+        pthread_cleanup_pop(1);
+       return 0;
+}
+
+/*===========================================================*/
+
+
+void * t1_routine(void *arg)
+{
+  readburst_main(NULL);
+
+  while (1) {
+    pthread_wait_np ();
+
+  }
+  return 0;
+}
+
+pthread_t t1;
+
+int init_module(void) {
+       
+        return pthread_create (&t1, NULL, t1_routine, 0);
+
+}
+
+void cleanup_module(void) {
+        pthread_delete_np (t1);
+       
+       /*pthread_cancel(t1);
+       pthread_join(t1, NULL);*/
+}
diff --git a/lincan-0.3.3/utils/rxtx.c b/lincan-0.3.3/utils/rxtx.c
new file mode 100644 (file)
index 0000000..62c64a0
--- /dev/null
@@ -0,0 +1,135 @@
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include "../include/can.h"
+#define MAXL 40
+
+int main(void)
+{
+       int i=0, fd=0, ret=0, count=0;
+       int msglen;
+       char loop=0;
+       char ch, transmission[MAXL+1], specialfile[MAXL+1]="/dev/can0", emptystring[MAXL+1]="", buf[MAXL+1];
+       char remote[MAXL+1];
+       struct canmsg_t message;
+
+       printf("\nThis program allows you to send or receive Can messages.\n");
+       printf("Please answer the following questions:\n\n");
+
+       while ( (*transmission!='s') && (*transmission!='r') ) {
+               printf("Would you like to send or receive a message?\n");
+               printf("send: <s> | receive: <r> ");
+               strcpy(transmission,emptystring);
+               count=0;
+               while ( (ch=getchar()) != '\n' )
+                       transmission[count++]=ch;
+               transmission[count]='\0';
+       }
+
+       while ( *remote!='y' && *remote!='n' ) {
+               printf("Should the message be configured for Remote Transmission Requests?\n");
+               printf("yes: <y> | no: <n> ");
+               strcpy(remote,emptystring);
+               count=0;
+               while ( (ch=getchar()) != '\n' )
+                       remote[count++]=ch;
+               remote[count]='\0';
+       }
+       if (remote[0]=='y')
+               message.flags = MSG_RTR;
+       else
+               message.flags = 0;
+//     message.flags |= MSG_EXT;  hard code EXT for now
+
+       if (transmission[0]=='s') {
+                       printf("From wich device file would you like to send the message?\n");
+                       printf(specialfile);
+                       *buf='\0';
+                       fgets(buf,MAXL,stdin);
+                       buf[strcspn(buf,"\n")]='\0';
+                       if(*buf)
+                               strncpy(specialfile,buf,MAXL);
+                       specialfile[MAXL]='\0';
+                       specialfile[MAXL]='\0';
+               printf("Enter the Message ID ");
+               scanf("%lx",&message.id);
+               if(message.id>=(1<<11))
+                 message.flags |= MSG_EXT;
+               printf("Enter the Message Length ");
+               scanf("%d",&msglen);
+               message.length=msglen;
+               for (i=0; i<message.length; i++) {
+                       int val;
+                       printf("Enter data byte [%d] ",i);
+                       scanf("%x",&val);
+                       message.data[i]=val;
+               }
+       }       
+       if (*transmission=='r') {
+                       printf("At which device file would you like to receive the message?\n");
+                       printf(specialfile);
+                       *buf='\0';
+                       fgets(buf,MAXL,stdin);
+                       buf[strcspn(buf,"\n")]='\0';
+                       if(*buf)
+                               strncpy(specialfile,buf,MAXL);
+                       specialfile[MAXL]='\0';
+               printf("Enter the Message ID ");
+               scanf("%lx",&message.id);
+               getchar();
+       }
+
+       fd=open(specialfile,O_RDWR);
+       if (fd<0) {
+               printf("Error opening %s\n",specialfile);
+               return -1;
+       }
+
+       if (transmission[0]=='s') {
+               printf("Press enter to send message\n");
+               getchar();
+               while (getchar() != '\n');
+               ret=write(fd, &message, sizeof(struct canmsg_t));
+               if (ret<0)
+                       printf("Error sending message from %s\n",specialfile);
+               else
+                       printf("Message successfully sent from %s\n",specialfile);
+       }
+
+       if (*transmission=='r') {
+               ioctl(fd,CONF_FILTER,message.id);
+               printf("Press enter to receive message or <l>oop\n");
+               loop = 'l';
+               while ( loop == 'l') {
+                       loop = getchar(); 
+                       ret=read(fd, &message, sizeof(struct canmsg_t));
+                       if (ret<0)
+                               printf("Error receiving message on %s\n",
+                                                               specialfile);
+                       else {
+                               printf("Id      : %lx\n",message.id);
+                               printf("length  : %d\n",message.length);
+                               printf("flags   : 0x%02x\n", message.flags);
+                               #ifdef CAN_MSG_VERSION_2
+                               printf("time    : %lds %ldusec\n", message.timestamp.tv_sec,
+                                       message.timestamp.tv_usec);
+                               #else /* CAN_MSG_VERSION_2 */
+                               printf("time    : %ld\n", message.timestamp);
+                               #endif /* CAN_MSG_VERSION_2 */
+                               for (i=0; i<message.length; i++)
+                                       printf("data%d  : %02x\n",i,
+                                                       message.data[i]);
+                       }
+               }
+       }
+
+       if (close(fd)) {
+               printf("Error closing %s\n",specialfile);
+               return -1;
+       }
+
+       return 0;
+}      
diff --git a/lincan-0.3.3/utils/send.c b/lincan-0.3.3/utils/send.c
new file mode 100644 (file)
index 0000000..b8171fd
--- /dev/null
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include "../include/can.h"
+#define MAXL 40
+
+int main(void)
+{
+       int i=0, fd=0, ret=0;
+       unsigned long bits;
+       int msglen;
+       char specialfile[MAXL+1]="/dev/can0", buf[MAXL+1];
+       struct canmsg_t message;
+
+       printf("\nThis program allows you to send  a stream of Can messages.\n");
+       printf("Please answer the following questions:\n\n");
+
+//             message.flags = 0;
+       message.flags |= MSG_EXT;  //hard code EXT for now
+
+       printf("From wich device file would you like to send the message?\n");
+       printf(specialfile);
+       *buf='\0';
+       fgets(buf,MAXL,stdin);
+       buf[strcspn(buf,"\n")]='\0';
+       if(*buf)
+               strncpy(specialfile,buf,MAXL);
+       specialfile[MAXL]='\0';
+       printf("Enter the starting Message ID ");
+       scanf("%lx",&message.id);
+       printf("Enter the Message Length ");
+       scanf("%d",&msglen);
+       message.length=msglen;
+       for (i=0; i<message.length; i++) {
+               int val;
+               printf("Enter data byte [%d] ",i);
+               scanf("%x",&val);
+               message.data[i]=val;
+       }
+
+       fd=open(specialfile,O_RDWR);
+       if (fd<0) {
+               printf("Error opening %s\n",specialfile);
+               return -1;
+       }
+
+       bits=0;
+       while(1) {
+               message.flags = MSG_EXT;
+               message.id++;
+               message.length %= 8;
+               message.length++;
+               bits += 8*(4+message.length);
+               memcpy(message.data,&bits,sizeof(bits));
+               ret=write(fd, &message, sizeof(struct canmsg_t));
+               if (ret<0)
+                       printf("Error sending message from %s\n",specialfile);
+       }
+
+       if (close(fd)) {
+               printf("Error closing %s\n",specialfile);
+               return -1;
+       }
+
+       return 0;
+}      
diff --git a/lincan-0.3.3/utils/sendburst.c b/lincan-0.3.3/utils/sendburst.c
new file mode 100644 (file)
index 0000000..2890813
--- /dev/null
@@ -0,0 +1,133 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "../include/can.h"
+
+int canmsg_flags = 0;
+unsigned long canmsg_id = 5;
+int block = 10;
+int count = 0;
+
+int can_wait_sec = 1;
+int o_sync_fl = 0;
+
+char *can_dev_name = "/dev/can0";
+
+#define PRT_PREFIX_SIZE 40
+char prt_prefix[PRT_PREFIX_SIZE];
+
+char *prt_prefix_in = "CAN %s : ";
+
+
+static void
+usage(void)
+{
+  printf("usage: sendburst\n");
+  printf("  -d, --device  <name>     name of CAN device [/dev/can0]\n");
+  printf("  -i, --id  <num>          ID of generated messages\n");
+  printf("  -f, --flags <num>        CAN filter flags\n");
+  printf("  -s, --sync               open in synchronous mode\n");
+  printf("  -w, --wait <num>         number of seconds to wait between messages\n");
+  printf("  -b, --block <num>        number of messages in  block\n");
+  printf("  -c, --count <num>        number of sent blocks of messages\n");
+  printf("  -p, --prefix <str>       string prefix for output\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc, char *argv[])
+{
+       static struct option long_opts[] = {
+               { "uldev", 1, 0, 'd' },
+               { "id",    1, 0, 'i' },
+               { "flags", 1, 0, 'f' },
+               { "sync",  0, 0, 's' },
+               { "wait",  1, 0, 'w' },
+               { "block", 1, 0, 'b' },
+               { "count", 1, 0, 'c' },
+               { "prefix",1, 0, 'p' },
+               { "version",0,0, 'V' },
+               { "help",  0, 0, 'h' },
+               { 0, 0, 0, 0}
+       };
+       int opt;
+
+       #ifdef CAN_MSG_VERSION_2
+       struct canmsg_t sendmsg={0,0,5,{0,0},8,{1,2,3,4,5,6,7,8}};
+       #else /* CAN_MSG_VERSION_2 */
+       struct canmsg_t sendmsg={0,0,5,0,8,{1,2,3,4,5,6,7,8}};
+       #endif /* CAN_MSG_VERSION_2 */
+       int fd, ret,i,j;
+
+       while ((opt = getopt_long(argc, argv, "d:i:f:sw:b:c:p:Vh",
+                           &long_opts[0], NULL)) != EOF) switch (opt) {
+               case 'd':
+                       can_dev_name=optarg;
+                       break;
+               case 'i':
+                       canmsg_id = strtol(optarg,NULL,0);
+                       break;
+               case 'f':
+                       canmsg_flags = strtol(optarg,NULL,0);
+                       break;
+               case 's':
+                       o_sync_fl = 1;
+                       break;
+               case 'w':
+                       can_wait_sec = strtol(optarg,NULL,0);
+                       break;
+               case 'b':
+                       block = strtol(optarg,NULL,0);
+                       break;
+               case 'c':
+                       count = strtol(optarg,NULL,0);
+                       break;
+               case 'p':
+                       prt_prefix_in = optarg;
+                       break;
+               case 'V':
+                       fputs("LinCAN utilities v0.2\n", stdout);
+                       exit(0);
+               case 'h':
+               default:
+                       usage();
+                       exit(opt == 'h' ? 0 : 1);
+       }
+
+       if ((fd=open(can_dev_name, O_RDWR | (o_sync_fl? O_SYNC:0))) < 0) {
+               perror("open");
+               printf("Error opening %s\n", can_dev_name);
+               exit(1);        
+       }
+
+       snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
+
+       j=0;
+       while (1) {
+               for(i=0;i<block;i++) {
+                       sendmsg.flags=canmsg_flags;
+                       sendmsg.id=canmsg_id;
+                       sendmsg.data[0]=i;
+                       sendmsg.data[1]=j;
+                       if ((ret=write(fd,&sendmsg,sizeof(struct canmsg_t))) < 0) {
+                               perror("write");
+                               printf("%sError sending message\n", prt_prefix);
+                               break;
+                       }
+               }
+               printf("%sSent block of %d messages #: %u\n", prt_prefix, block, j);
+               j++;
+               usleep(1000000*can_wait_sec);
+               if(count)
+                       if(!--count) break;
+       }
+       close(fd);
+       return 0;
+}
+
+       
diff --git a/lincan-0.3.3/utils/sendburst_rtl.c b/lincan-0.3.3/utils/sendburst_rtl.c
new file mode 100644 (file)
index 0000000..44ba8bc
--- /dev/null
@@ -0,0 +1,126 @@
+#include <rtl.h>
+#include <time.h>
+#include <signal.h>
+#include <pthread.h>
+#include <posix/unistd.h>
+
+#define printf rtl_printf
+
+#include "../include/can.h"
+
+int canmsg_flags = 0;
+unsigned long canmsg_id = 5;
+int block = 10;
+int count = 0;
+
+int can_wait_sec = 1;
+int o_sync_fl = 0;
+
+char *can_dev_name = "/dev/can0";
+
+#define PRT_PREFIX_SIZE 40
+char prt_prefix[PRT_PREFIX_SIZE];
+
+char *prt_prefix_in = "CAN %s : ";
+
+MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]");
+MODULE_PARM(can_dev_name,"1s");
+MODULE_PARM_DESC(canmsg_id,"ID of generated messages");
+MODULE_PARM(canmsg_id,"1i");
+MODULE_PARM_DESC(canmsg_flags,"CAN filter flags");
+MODULE_PARM(canmsg_flags,"1i");
+MODULE_PARM_DESC(o_sync_fl,"open in synchronous mode");
+MODULE_PARM(o_sync_fl,"1i");
+MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages");
+MODULE_PARM(can_wait_sec,"1i");
+MODULE_PARM_DESC(block,"number of messages in  block");
+MODULE_PARM(block,"1i");
+MODULE_PARM_DESC(count,"number of sent blocks of messages");
+MODULE_PARM(count,"1i");
+MODULE_PARM_DESC(prt_prefix_in,"string prefix for output");
+MODULE_PARM(prt_prefix_in,"1i");
+
+
+MODULE_SUPPORTED_DEVICE("sendburst_rtl");
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
+MODULE_DESCRIPTION("sendburst_rtl: generatot of CAN messages for RT-Linux interface to LinCAN driver");
+MODULE_LICENSE("GPL");
+
+void sendburst_cleanup(void *arg)
+{
+       printf("%scleanup handler called\n", prt_prefix);
+       close((int)arg);
+}
+
+int sendburst_main(void *arg)
+{
+       #ifdef CAN_MSG_VERSION_2
+       struct canmsg_t sendmsg={0,0,5,{0,0},8,{1,2,3,4,5,6,7,8}};
+       #else /* CAN_MSG_VERSION_2 */
+       struct canmsg_t sendmsg={0,0,5,0,8,{1,2,3,4,5,6,7,8}};
+       #endif /* CAN_MSG_VERSION_2 */
+       int fd, ret,i,j;
+
+
+       if ((fd=open(can_dev_name, O_RDWR | (o_sync_fl? O_SYNC:0))) < 0) {
+               printf("Error opening %s\n", can_dev_name);
+               return -1;
+       }
+        pthread_cleanup_push(sendburst_cleanup,(void*)fd);
+
+       snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
+
+       j=0;
+       while (1) {
+               for(i=0;i<block;i++) {
+                       sendmsg.flags=canmsg_flags;
+                       sendmsg.id=canmsg_id;
+                       sendmsg.data[0]=i;
+                       sendmsg.data[1]=j;
+                       if ((ret=write(fd,&sendmsg,sizeof(struct canmsg_t))) < 0) {
+                               printf("%sError sending message\n", prt_prefix);
+                               break;
+                       }
+               }
+               printf("%sSent block of %d messages #: %u\n", prt_prefix, block, j);
+               j++;
+               pthread_testcancel();
+               usleep(1000000*can_wait_sec);
+               if(count)
+                       if(!--count) break;
+               pthread_testcancel();
+       }
+       /* close(fd); is called by cleanup handler*/
+        pthread_cleanup_pop(1);
+       return 0;
+}
+
+       
+/*===========================================================*/
+
+
+void * t1_routine(void *arg)
+{
+  sendburst_main(NULL);
+
+  while (1) {
+    pthread_wait_np ();
+
+  }
+  return 0;
+}
+
+pthread_t t1;
+
+int init_module(void) {
+       
+        return pthread_create (&t1, NULL, t1_routine, 0);
+
+}
+
+void cleanup_module(void) {
+        /*pthread_delete_np (t1);*/
+       
+       pthread_cancel(t1);
+       pthread_join(t1, NULL);
+}
diff --git a/ulan/CVS/Entries b/ulan/CVS/Entries
new file mode 100644 (file)
index 0000000..e9fd755
--- /dev/null
@@ -0,0 +1,2 @@
+D/embedded////
+D/host////
diff --git a/ulan/CVS/Repository b/ulan/CVS/Repository
new file mode 100644 (file)
index 0000000..b3b5239
--- /dev/null
@@ -0,0 +1 @@
+ulan
diff --git a/ulan/CVS/Root b/ulan/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/.cvsignore b/ulan/embedded/.cvsignore
new file mode 100644 (file)
index 0000000..0b208d4
--- /dev/null
@@ -0,0 +1,8 @@
+Makefile.rules
+agrosoft
+_darcs
+_build
+_compiled
+config.omk
+config.omk-default
+Makefile.omk-additional
\ No newline at end of file
diff --git a/ulan/embedded/CVS/Entries b/ulan/embedded/CVS/Entries
new file mode 100644 (file)
index 0000000..27bc8b3
--- /dev/null
@@ -0,0 +1,13 @@
+/.cvsignore/1.3/Thu Nov 17 21:25:44 2005//
+/Makefile/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.gcc/1.2/Mon Jan 28 15:22:55 2008//
+/Makefile.keil/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.omk/1.3/Sun Jan 15 21:12:38 2006//
+/Makefile.sdcc/1.5/Sun Feb 12 15:16:10 2006//
+/README.txt/1.1/Wed Sep 21 21:50:03 2005//
+/a51dep.sh/1.1/Mon Oct  3 12:43:22 2005//
+/a51toasx.sh/1.2/Sun Oct  8 20:57:30 2006//
+D/app////
+D/arch////
+D/board////
+D/libs4c////
diff --git a/ulan/embedded/CVS/Repository b/ulan/embedded/CVS/Repository
new file mode 100644 (file)
index 0000000..ce65560
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded
diff --git a/ulan/embedded/CVS/Root b/ulan/embedded/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/Makefile b/ulan/embedded/Makefile
new file mode 100644 (file)
index 0000000..bdb6d45
--- /dev/null
@@ -0,0 +1,15 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
+# DO NOT DELETE
diff --git a/ulan/embedded/Makefile.gcc b/ulan/embedded/Makefile.gcc
new file mode 100644 (file)
index 0000000..6a98fa8
--- /dev/null
@@ -0,0 +1,926 @@
+#                   Version for system-less builds.          #OMK@sysless
+#
+#  Makefile.rules - OCERA make framework common project rules -*- makefile -*- #OMK@base
+#
+#  (C) Copyright 2003 by Pavel Pisa - OCERA team member
+#  (C) Copyright 2006 by Michal Sojka - Czech Technical University, FEE, DCE
+#
+#  Homepage: http://rtime.felk.cvut.cz/omk/
+#
+# The OMK build system is distributed under the GNU General Public
+# License.  See file COPYING for details.
+#
+# input variables
+# V                .. if set to 1, full command text is shown else short form is used
+# W                .. whole tree - if set to 1, make is always called from the top-level directory
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+# LN_HEADERS       .. if "y", header files are symbolicaly linked instead of copied. #OMK@include
+#                                                            #OMK@sysless
+# bin_PROGRAMS     .. list of the require binary programs
+# test_PROGRAMS    .. list of the test programs
+# include_HEADERS  .. list of the user-space public header files
+# lib_LIBRARIES    .. list of the user-space libraries
+# lib_LDSCRIPTS    .. list of LD scripts that should be copied to the lib direcotry
+# lib_obj_SOURCES  .. list of source files which should be compiled and
+#                    the produced object file placed to the lib directory (e.g. crt0.S)
+# shared_LIBRARIES .. list of the user-space shared libraries
+# nobase_include_HEADERS .. public headers copied even with directory part
+# renamed_include_HEADERS .. public headers copied to the different target name (xxx.h->yyy.h)
+# utils_PROGRAMS   .. list of the development utility programs (compiled for host computer, this might change in future)
+# xxx_SOURCES      .. list of specific target sources
+# xxx_LIBS         .. list of specific target libraries
+# INCLUDES         .. additional include directories and defines for user-space
+# lib_LOADLIBES    .. list of libraries linked to each executable
+# link_VARIANTS    .. list of ld script suffixes (after hypen `-') that
+#                     should be used for linking (e.g. ram flash). If this is not
+#                    specified, then the value of DEFAULT_LD_SCRIPT_VARIANT from config.target is used.
+# PREFIX_DIR       .. Prefix to  directories in _compiled and _build. Used in config.omk.
+# LOCAL_CONFIG_H   .. name of local config.h file generated from values #OMK@config_h
+#                     of options defined in the current directory
+# config_include_HEADERS .. names of global config files (possibly
+#                     with subdirectories)
+# xxx_DEFINES      .. list of config directives to be included in
+#                     config header file of the name <somedir>/xxx.h
+# DOXYGEN          .. if non-empty, generated headers includes Doxygen's @file
+#                    command, so it is possible to document config
+#                    variables.
+# local_EVALUATE   .. Makefile hook, which is executed at the end of #OMK@localeval
+#                     the Makefile.rules. Used only for dirty hacks.
+                                                             #OMK@base
+# We need to ensure definition of sources directory first
+ifndef SOURCES_DIR
+# Only shell built-in pwd understands -L
+SOURCES_DIR := $(shell ( pwd -L ) )
+endif
+
+.PHONY: all default check-make-ver omkize
+
+ifdef W
+  ifeq ("$(origin W)", "command line")
+    OMK_WHOLE_TREE:=$(W)
+  endif
+endif
+ifndef OMK_WHOLE_TREE
+  OMK_WHOLE_TREE:=0
+endif
+
+ifneq ($(OMK_WHOLE_TREE),1)
+all: check-make-ver default
+       @echo "Compilation finished"
+else
+# Run make in the top-level directory
+all:
+       @$(MAKE) -C $(MAKERULES_DIR) OMK_SERIALIZE_INCLUDED=n SOURCES_DIR=$(MAKERULES_DIR) RELATIVE_DIR="" $(MAKECMDGOALS) W=0
+endif
+
+ifdef OMK_TESTSROOT
+# Usage: $(call canttest,<error message>)
+define canttest
+       ( echo "$(1)" > $(MAKERULES_DIR)/_canttest; echo "$(1)"; exit 1 )
+endef
+else
+define canttest
+       echo "$(1)"
+endef
+endif
+
+#=========================
+# Include the config file
+
+ifneq ($(CONFIG_FILE_OK),y)
+ifndef CONFIG_FILE
+CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
+endif
+ifneq ($(wildcard $(CONFIG_FILE)-default),)
+-include $(CONFIG_FILE)-default
+else
+ifneq ($(MAKECMDGOALS),default-config)
+$(warning Please, run "make default-config" first)
+endif
+endif
+
+-include $(MAKERULES_DIR)/config.target
+
+ifneq ($(wildcard $(CONFIG_FILE)),)
+include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+endif #$(CONFIG_FILE_OK)
+
+export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR
+export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
+# OMK_SERIALIZE_INCLUDED has to be exported to submakes because passes
+# must to be serialized only in the toplevel make.
+
+ifndef RELATIVE_DIR
+RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
+endif
+#$(warning  === RELATIVE_DIR = "$(RELATIVE_DIR)" ===)
+override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
+override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
+#$(warning  RELATIVE_DIR = "$(RELATIVE_DIR)")
+override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g'  -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__')
+#$(warning  BACK2TOP_DIR = "$(BACK2TOP_DIR)")
+
+#$(warning SOURCES_DIR = "$(SOURCES_DIR)")
+#$(warning MAKERULES_DIR = "$(MAKERULES_DIR)")
+#$(warning RELATIVE_DIR = "$(RELATIVE_DIR)")
+
+# We have to use RELATIVE_PREFIX because of mingw
+override RELATIVE_PREFIX := $(RELATIVE_DIR)/
+override RELATIVE_PREFIX := $(RELATIVE_PREFIX:/%=%)
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+#vpath %.cxx $(SOURCES_DIR)
+
+# Defines for quiet compilation
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    OMK_VERBOSE = $(V)
+  endif
+endif
+ifndef OMK_VERBOSE
+  OMK_VERBOSE = 0
+endif
+ifneq ($(OMK_VERBOSE),0)
+  Q =
+else
+  Q = @
+endif
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  QUIET_CMD_ECHO = true
+  OMK_SILENT = 1
+else
+  QUIET_CMD_ECHO = echo
+endif
+
+MAKEFILE_OMK=Makefile.omk
+# All subdirectories (even linked ones) containing Makefile.omk
+# Usage in Makefile.omk: SUBDIRS = $(ALL_OMK_SUBDIRS)
+ALL_OMK_SUBDIRS = $(patsubst %/$(MAKEFILE_OMK),%,$(patsubst $(SOURCES_DIR)/%,%,$(wildcard $(SOURCES_DIR)/*/$(MAKEFILE_OMK))))
+
+# ===================================================================
+# We have set up all important variables, so we can check and include
+# real OCERA style Makefile.omk now
+ifndef OMK_INCLUDED
+include $(SOURCES_DIR)/$(MAKEFILE_OMK)
+OMK_INCLUDED := 1
+endif
+
+check-make-ver:
+       @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
+       if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
+               echo "Your make program version is too old and does not support OMK system." ; \
+               echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
+       fi
+
+distclean dist-clean:
+       @$(QUIET_CMD_ECHO) "  RM      $(COMPILED_DIR_NAME) $(BUILD_DIR_NAME)"
+       @rm -fr $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)  $(MAKERULES_DIR)/$(BUILD_DIR_NAME)
+
+# Common OMK templates
+# ====================
+
+# Syntax: $(call mkdir,<dir name>)
+define mkdir_def
+       [ -d $(1) ] || mkdir -p $(1) || exit 1
+endef
+
+ifneq ($(V),2)
+NO_PRINT_DIRECTORY := --no-print-directory
+endif
+
+ifeq ($(USE_LEAF_MAKEFILES),n)
+export USE_LEAF_MAKEFILES
+SUBDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+SOURCESDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+else
+SUBDIR_MAKEFILE=$(SOURCES_DIR)/$(dir)/Makefile
+SOURCESDIR_MAKEFILE=$(SOURCES_DIR)/Makefile
+endif
+
+ifdef OMK_TESTSROOT
+check-target = $$(@:%=%-check)
+endif
+
+# Syntax: $(call omk_pass_template,<pass name(s)>,<build dir>,[<local make flags>],[<local condition>])
+define omk_pass_template
+.PHNOY: $(1) $(addsuffix -local,$(1)) $(addsuffix -check,$(1))
+$(1):
+       +@$(foreach dir,$(SUBDIRS),$(call mkdir_def,$(2)/$(dir)); \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) $(NO_PRINT_DIRECTORY) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(2)/$(dir) \
+               -f $(SUBDIR_MAKEFILE) $$@ || exit 1 ;) true
+ifneq ($(4),)
+       @echo "make[omk]: $$@ in $(RELATIVE_DIR)"; \
+       $(call mkdir_def,$(2)); \
+       $(MAKE) $(NO_PRINT_DIRECTORY) SOURCES_DIR=$(SOURCES_DIR) RELATIVE_DIR=$(RELATIVE_DIR) -C $(2) \
+               -f $(SOURCESDIR_MAKEFILE) $(3) $(check-target) $$(@:%=%-local)
+endif
+endef
+
+# =======================
+# DEFAULT CONFIG PASS
+
+default-config:
+       @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
+       @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
+       @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
+       @echo >> "$(CONFIG_FILE)-default"
+       @$(MAKE) $(NO_PRINT_DIRECTORY) -C $(MAKERULES_DIR) \
+               RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
+               -f $(MAKERULES_DIR)/Makefile default-config-pass
+
+$(eval $(call omk_pass_template,default-config-pass,$$(LOCAL_BUILD_DIR),,always))
+
+default-config-pass-local:
+#      @echo Default config for $(RELATIVE_DIR)
+       @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
+       @$(foreach x, $(default_CONFIG), echo '$(x)' | \
+               sed -e 's/^[^=]*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
+
+
+omkize:
+       $(Q)if ! grep -q MAKERULES_DIR Makefile; then \
+          echo "Makefile is not OMK leaf makefile!" >&2; exit 1; \
+       fi
+       $(Q)for i in `find -L . -name Makefile.omk` ; do \
+          i=`dirname $${i}`; \
+          if [ x"$$i" != x"." ]; then \
+             rm -f $${i}/Makefile; \
+             cp Makefile $${i}/Makefile; \
+          fi \
+       done
+                                                             #OMK@gcc
+# Rules for compilation of C, C++ and assembler sources using GNU
+# toolchain.
+
+# Interface to other rules:
+
+# Input variables:
+# LIB_DIR - directory where compiled libraries are stored
+# OBJS_DIR - directory where intermediate files (.o, .map, ...) are stored
+# INCLUDE_DIR - where includes can be found
+# from config.omk or Makefile.omk
+# CROSS_COMPILE - 
+# TARGET_ARCH, DEBUG, OPTIMIZE, DEFS - forms CFLAGS
+# from base: SOURCES_DIR
+# from Makefile.omk: lib_LOADLIBES
+
+# Output variables:
+# SOURCES - all the source files that needs to be compiled (except for shared library sources)
+# SOLIB_SOURCES - all the source files that needs to be compiled for a shared library
+# OBJ_EXT - extension of object files
+# LIB_EXT - extension of library files
+# LIB_PREF - prefix for library files
+# ASM_EXT - extension of assembler sources
+
+# Templates:
+# COMPILER_DEFS_template - definitions that should be defined before
+# the following templates can be used. The input variables needs to be
+# defined before evaluating this template
+
+# COMPILE_c_o_template, COMPILE_cc_o_template, COMPILE_S_o_template -
+# templates that create rules for compilation of sources
+
+# CMETRIC_o_h_template - FIXME
+
+# PROGRAM_template, LIBRARY_template, SOLIB_template - templates that
+# create rules for compilation of a program, library and shared
+# library. The rules can use rules produced by COMPILE_xxx_template.
+
+define COMPILER_DEFS_template
+OBJ_EXT = .o
+LIB_EXT = .a
+LIB_PREF = lib
+ASM_EXT = .S
+
+CC = $(CROSS_COMPILE)gcc
+LINK = $(CROSS_COMPILE)ld
+AR = $(CROSS_COMPILE)ar
+OBJCOPY = $(CROSS_COMPILE)objcopy
+NM = $(CROSS_COMPILE)nm
+
+CFLAGS += $(TARGET_ARCH) $(DEBUG) $(OPTIMIZE)
+CFLAGS += -Wall
+CFLAGS += -I$(SOURCES_DIR)
+CFLAGS += -I$(INCLUDE_DIR)
+
+LOADLIBES += -L$(LIB_DIR)
+LOADLIBES += $(lib_LOADLIBES:%=-l%)
+
+
+-include $(OBJS_DIR)/*.d
+
+#%.lo: %.c
+#      $(CC) -o $@ $(LCFLAGS) -c $<
+
+c_o_COMPILE = $$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $$(CFLAGS)
+
+cc_o_COMPILE = $$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $$(CFLAGS)
+
+S_o_COMPILE = $$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(CPPFLAGS) $(AM_CFLAGS) $$(CFLAGS) $(ASFLAGS)
+
+
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+CC_MAJOR_VERSION = $$(shell $$(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
+endif
+# Prepare suitable define for dependency building
+ifeq ($$(CC_MAJOR_VERSION),2)
+CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp"
+else
+CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp"
+endif
+
+endef # COMPILER_DEFS_template
+
+
+# Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_c_o_template
+$(2): $(1) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CC      $$@"
+       $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+
+# Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_cc_o_template
+$(2): $(1) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CXX     $$@"
+       $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+# Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_S_o_template
+$(2): $(1) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  AS      $$@"
+       $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+# Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
+define CMETRIC_o_h_template
+$(2): $(1)
+       @$(QUIET_CMD_ECHO) "  CMETRIC $$@"
+       $(Q)if [ -n `dirname $$@` ] ; then \
+             if [ ! -e `dirname $$@` ] ; then \
+               mkdir -p `dirname $$@` ; fi ; fi
+       $(Q)echo >$$@ '/* Automatically generated from $$< */'
+       $(Q)echo >>$$@ '/* Conditionals to control compilation */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+       $(Q)echo >>$$@ '/* Defines from the values defined to symbols */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+endef
+
+# Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<link-variant>)
+define PROGRAM_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
+$(1)_OBJS += $$(filter %.o,$(1)_SOURCES)
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+SOURCES += $$($(1)_SOURCES)
+
+ifneq ($(LD_SCRIPT),)
+$(1)$(3:%=-%)_LDFLAGS = -Wl,-T,$(LD_SCRIPT).ld$(3:%=-%)
+endif
+
+$(2)/$(1)$(3:%=-%): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
+         then echo $$(CC)  $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS)   $$(CFLAGS) ; \
+         else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
+         $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)$(3:%=-%)_LDFLAGS) -Wl,-Map,$(1)$(3:%=-%).map \
+         $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_MOREOBJS) $$($(1)_LIBS:%=-l%) \
+         -o $$@
+       @echo "$(2)/$(1)$(3:%=-%): \\" >$(OBJS_DIR)/$(1)$(3:%=-%).exe.d
+       @if [ -n "$(LD_SCRIPT)" ]; then \
+         echo "  $(LIB_DIR)/$(LD_SCRIPT).ld$(3:%=-%) \\" >>$(OBJS_DIR)/$(1)$(3:%=-%).exe.d; fi
+       @sed -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(OBJS_DIR)/$(1)$(3:%=-%).map|tr '&' '\134'  >>$(OBJS_DIR)/$(1)$(3:%=-%).exe.d
+       @echo >>$(OBJS_DIR)/$(1).exe.d
+endef
+
+# Rules for other output formats (can be specified by OUTPUT_FORMATS)
+%.bin: %
+       @$(QUIET_CMD_ECHO) "  OBJCOPY $@"
+       $(Q) $(OBJCOPY)  --output-target=binary -S $< $@
+
+%.hex: %
+       @$(QUIET_CMD_ECHO) "  OBJCOPY $@"
+       $(Q) $(OBJCOPY)  --output-target=ihex -S $< $@
+
+%.srec: %
+       @$(QUIET_CMD_ECHO) "  OBJCOPY $@"
+       $(Q) $(OBJCOPY)  --output-target=srec -S $< $@
+
+# Syntax: $(call LIBRARY_template,<library-name>)
+define LIBRARY_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+SOURCES += $$($(1)_SOURCES)
+
+$(LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR      $$@"
+       $(Q) $(AR) rcs $$@ $$^
+endef
+
+
+# Syntax: $(call SOLIB_template,<library-name>)
+define SOLIB_template
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cxx=%.lo))
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.S=%.lo))
+$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
+
+SOLIB_OBJS  += $$($(1)_OBJSLO)
+SOLIB_SOURCES += $$($(1)_SOURCES)
+
+$(LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
+endef
+
+# Local Variables:
+# mode:makefile
+# End:
+ifeq ($(OMK_VERBOSE),1)                                      #OMK@include
+CPHEADER_FLAGS += -v
+LNHEADER_FLAGS += -v
+endif
+
+ifneq ($(LN_HEADERS),y)
+define cp_cmd
+( echo "  CP      $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; cp $(CPHEADER_FLAGS) $(1) $(2) )
+endef
+else
+define cp_cmd
+( echo "  LN      $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; ln -sf $(LNHEADER_FLAGS) $(1) $(2) )
+endef
+endif
+
+# TODO: Check modification date of changed header files. If it is
+# newer that in source dir, show a warning.
+
+# Syntax: $(call include-pass-template,<include dir>,<keyword>)
+define include-pass-template
+       @$(foreach f, $($(2)_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(1)/$(notdir $(f)) \
+          || $(call cp_cmd,$(SOURCES_DIR)/$(f),$(1)/$(notdir $(f))) || exit 1 ; )
+       @$(foreach f, $(nobase_$(2)_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(1)/$(f) \
+          || ( mkdir -p $(1)/$(dir $(f)) && $(call cp_cmd,$(SOURCES_DIR)/$(f),$(1)/$(f)) ) || exit 1 ; )
+       @$(foreach f, $(renamed_$(2)_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(1)/$${destfname} \
+          || ( mkdir -p `dirname $(1)/$${destfname}` && $(call cp_cmd,$(SOURCES_DIR)/$${srcfname},$(1)/$${destfname}) ) || exit 1 ; )
+endef
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@sysless
+BUILD_DIR_NAME = _build$(addprefix /,$(PREFIX_DIR))
+COMPILED_DIR_NAME = _compiled$(addprefix /,$(PREFIX_DIR))
+
+LOCAL_BUILD_DIR=$(MAKERULES_DIR)/$(BUILD_DIR_NAME)/$(RELATIVE_DIR)
+#$(warning LOCAL_BUILD_DIR = $(LOCAL_BUILD_DIR))
+
+#=====================================================================
+# Common utility rules
+
+link_VARIANTS ?= $(DEFAULT_LD_SCRIPT_VARIANT)
+
+
+#=====================================================================
+# Include correct rules for just running pass
+
+USER_COMPILED_DIR_NAME=$(MAKERULES_DIR)/$(COMPILED_DIR_NAME)
+
+USER_INCLUDE_DIR = $(USER_COMPILED_DIR_NAME)/include
+USER_LIB_DIR     = $(USER_COMPILED_DIR_NAME)/lib
+USER_UTILS_DIR   = $(USER_COMPILED_DIR_NAME)/bin-utils
+USER_TESTS_DIR   = $(USER_COMPILED_DIR_NAME)/bin-tests
+USER_BIN_DIR     = $(USER_COMPILED_DIR_NAME)/bin
+USER_OBJS_DIR    = $(LOCAL_BUILD_DIR)
+
+.PHONY: check-dir
+
+# Some support to serialize some targets for parallel make
+ifneq ($(OMK_SERIALIZE_INCLUDED),y)
+include-pass: check-dir
+library-pass: include-pass
+binary-pass utils-pass: library-pass
+
+override OMK_SERIALIZE_INCLUDED = y
+endif
+
+# -------------------------------------
+# Rules for compilation for target
+ifdef TARGET_RULE_TEMPLATES
+
+LDFLAGS += -nostartfiles
+
+ # FIXME: These are not used. What they are good for?
+LIB_CPPFLAGS += $(CPPFLAGS)
+LIB_CFLAGS   += $(CFLAGS)
+
+SOLIB_PICFLAGS += -shared -fpic
+
+CFLAGS += -DOMK_FOR_TARGET
+
+INCLUDE_DIR := $(USER_INCLUDE_DIR)
+LIB_DIR     := $(USER_LIB_DIR)
+OBJS_DIR    := $(USER_OBJS_DIR)
+
+$(eval $(COMPILER_DEFS_template))
+
+# Special rules for CMETRIC generated headers
+
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call COMPILE_c_o_template,\
+               $(SOURCES_DIR)/$($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES),\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),)))
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call CMETRIC_o_h_template,\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),\
+               $(addprefix $(USER_INCLUDE_DIR)/,$(cmetrh)))))
+
+GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
+
+# Generate rules for compilation of programs and libraries
+ifneq ($(link_VARIANTS),)
+$(foreach prog,$(bin_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
+$(foreach prog,$(test_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR),$(link)))))
+else
+$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR))))
+$(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR))))
+endif
+
+$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
+$(foreach src,$(lib_obj_SOURCES),$(eval $(call LIBOBJ_template,$(addsuffix $(OBJ_EXT),$(basename $(src))))))
+$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
+
+
+# lib_obj_SOURCES handling
+lib_OBJS = $(addsuffix $(OBJ_EXT),$(basename $(lib_obj_SOURCES)))
+#$(warning lib_OBJS = $(lib_OBJS))
+SOURCES += $(filter-out %$(OBJ_EXT),$(lib_obj_SOURCES))
+
+$(LIB_DIR)/%$(OBJ_EXT): %$(OBJ_EXT)
+       @echo "  CP      $(^:$(MAKERULES_DIR)/%=%) -> $(@:$(MAKERULES_DIR)/%=%)"
+       $(Q)cp $(CP_FLAGS) $< $@
+
+
+# User-space static libraries and applications object files
+SOURCES := $(sort $(SOURCES))
+#$(warning SOURCES = $(SOURCES))
+
+# User-space shared libraries object files
+SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
+#$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
+
+
+# The above generated rules produced $(SOURCES) and $(SOLIB_SOURCES)
+# variables. Now generate rules for compilation of theese sources
+$(foreach src,$(filter %.c,$(SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %.cc,$(SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %.cxx,$(SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %$(ASM_EXT),$(SOURCES)),$(eval $(call COMPILE_S_o_template,$(SOURCES_DIR)/$(src),$(src:%$(ASM_EXT)=%$(OBJ_EXT)),)))
+
+$(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+$(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
+$(foreach src,$(filter %.cxx,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.lo),$(SOLIB_PICFLAGS))))
+$(foreach src,$(filter %$(ASM_EXT),$(SOLIB_SOURCES)),$(eval $(call COMPILE_S_o_template,$(SOURCES_DIR)/$(src),$(src:%$(ASM_EXT)=%.lo),$(SOLIB_PICFLAGS))))
+
+library-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \
+                   $(lib_LIBRARIES:%=$(LIB_DIR)/$(LIB_PREF)%$(LIB_EXT)) $(shared_LIBRARIES:%=$(LIB_DIR)/$(LIB_PREF)%.so) \
+                   $(addprefix $(LIB_DIR)/,$(lib_OBJS))
+
+ifneq ($(link_VARIANTS),)
+binary-pass-local:  $(foreach link,$(link_VARIANTS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link)) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%-$(link)) \
+                   $(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link).$(of)) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%-$(link).$(of))))
+else
+binary-pass-local:  $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%) \
+                   $(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%.$(of)) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%.$(of)))
+endif
+
+endif # TARGET_RULE_TEMPLATES
+
+
+# -------------------------------------
+# Rules for compilation utilities for host (user space)
+ifdef HOST_RULE_TEMPLATES
+
+CROSS_COMPILE =
+TARGET_ARCH =
+
+SOLIB_PICFLAGS += -shared -fpic
+
+# For host compilation, we don't use a specfic ld script
+LD_SCRIPT =
+
+# TODO: It is probably better to use different directories for host
+# includes, libraries and objects
+INCLUDE_DIR := $(USER_INCLUDE_DIR)
+LIB_DIR     := $(USER_LIB_DIR)
+OBJS_DIR    := $(USER_OBJS_DIR)
+
+$(eval $(COMPILER_DEFS_template))
+
+ #User-space static libraries and applications object files
+#SOURCES := $(sort $(SOURCES))
+#$(warning SOURCES = $(SOURCES))
+
+# Generate rules for compilation of utility programs
+$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),)))
+
+# The above generated rule produced $(SOURCES) variable. Now generate
+# rules for compilation of theese sources
+$(foreach src,$(filter %.c,$(SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %.cc,$(SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %.cxx,$(SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%$(OBJ_EXT)),)))
+$(foreach src,$(filter %$(ASM_EXT),$(SOURCES)),$(eval $(call COMPILE_S_o_template,$(SOURCES_DIR)/$(src),$(src:%$(ASM_EXT)=%$(OBJ_EXT)),)))
+
+utils-pass-local: $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%)
+
+endif # HOST_RULE_TEMPLATES
+
+# Checks for OMK tester
+ifdef OMK_TESTSROOT
+default-config-pass-check include-pass-check:
+library-pass-check binary-pass-check:
+       @[ -x "$(shell which $(CC))" ] || $(call canttest,Cannot file compiler: $(CC))
+endif
+
+#=====================================================================
+# Automatic loading of compiled program by issuing "make load"
+
+ifneq ($(OUTPUT_FORMATS),)
+# Select a file extension (e.g. .bin) for "make load" command to load.
+LOAD_EXTENSION = .$(firstword $(OUTPUT_FORMATS))
+endif
+
+# Syntax: $(call LOAD_PROGRAM_template,<executable-name>,<dir>,<link-variant>)
+# Used to load program to the target hardware
+define LOAD_PROGRAM_template
+.PHONY: load-$(1)$(3:%=-%)
+load-$(1)$(3:%=-%): $(2)/$(1)$(3:%=-%)$(LOAD_EXTENSION)
+       @$(QUIET_CMD_ECHO) "  LOAD    $$<"
+       @if [ -z "$$(LOAD_CMD$(3:%=-%))" ]; then echo "No command for loading applications to '$(3)' is specified."; exit 1; fi
+       $(Q) $$(LOAD_CMD$(3:%=-%)) $$<
+endef
+
+# Syntax: $(call LOAD__RUN_VARIANT_template,<link-variant>)
+# Used to load and/or run non-default variant of the default program
+define LOAD_RUN_VARIANT_template
+.PHONY: load-$(1) run-$(1)
+
+load-$(1): load-$(firstword $(bin_PROGRAMS) $(test_PROGRAMS))-$(1)
+
+run-$(1):
+       @$(QUIET_CMD_ECHO) "  RUN     $(1)"
+       @if [ -z "$(RUN_CMD-$(1))" ]; then echo "No command for running '$(1)' variant is specified."; exit 1; fi
+       $(Q) $(RUN_CMD-$(1))
+
+endef
+
+$(foreach link,$(link_VARIANTS),$(foreach prog,$(bin_PROGRAMS),$(eval $(call LOAD_PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
+$(foreach link,$(link_VARIANTS),$(foreach prog,$(test_PROGRAMS),$(eval $(call LOAD_PROGRAM_template,$(prog),$(USER_TEST_DIR),$(link)))))
+$(foreach link,$(link_VARIANTS),$(eval $(call LOAD_RUN_VARIANT_template,$(link))))
+
+.PHONY: load run
+load: $(addprefix load-,$(firstword $(bin_PROGRAMS) $(test_PROGRAMS))-$(firstword $(link_VARIANTS)))
+
+run: run-$(firstword $(link_VARIANTS))
+
+
+
+#=====================================================================
+# Generate pass rules from generic templates
+OTHER_PASSES = dep clean install
+
+$(eval $(call omk_pass_template, include-pass, $(LOCAL_BUILD_DIR),,$(include_HEADERS)$(nobase_include_HEADERS)$(renamed_include_HEADERS)$(lib_LDSCRIPTS)$(config_include_HEADERS)$(LOCAL_CONFIG_H)))
+$(eval $(call omk_pass_template, library-pass, $(LOCAL_BUILD_DIR),TARGET_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES)$(lib_obj_SOURCES)))
+$(eval $(call omk_pass_template, binary-pass,  $(LOCAL_BUILD_DIR),TARGET_RULE_TEMPLATES=y,$(bin_PROGRAMS) $(test_PROGRAMS)))
+$(eval $(call omk_pass_template, utils-pass,   $(LOCAL_BUILD_DIR),HOST_RULE_TEMPLATES=y,$(utils_PROGRAMS)))
+
+
+$(eval $(call omk_pass_template,$(OTHER_PASSES),$(LOCAL_BUILD_DIR),,always))
+
+
+dep-local:
+
+install-local:
+
+include-pass-local:
+       $(call include-pass-template,$(USER_INCLUDE_DIR),include)
+       @$(foreach f, $(lib_LDSCRIPTS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) \
+          || $(call cp_cmd,$(SOURCES_DIR)/$(f),$(USER_LIB_DIR)/$(notdir $(f))) || exit 1 ; )
+
+
+.PHONY: clean-custom
+clean-local: clean-custom
+       $(Q)rm -f $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
+              $(USER_OBJS_DIR)/*.d \
+              $(USER_OBJS_DIR)/*.map \
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)
+
+check-dir:
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(call mkdir_def,$(USER_LIB_DIR))
+       @$(call mkdir_def,$(USER_BIN_DIR))
+       @$(call mkdir_def,$(USER_UTILS_DIR))
+       @$(call mkdir_def,$(USER_TESTS_DIR))
+
+# Which passes to pass
+default: include-pass library-pass binary-pass utils-pass
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@config_h
+# Syntax: $(call BUILD_CONFIG_H_template,<stamp_dir>,<header_file_path>,<list_of_options_to_export>,<header_barrier>)
+define BUILD_CONFIG_H_template
+
+$(addprefix $(1)/,$(notdir $(addsuffix .stamp,$(2)))) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
+       @$(QUIET_CMD_ECHO) "  CONFGEN $$(@:%.stamp=%)"
+       @if [ ! -d `dirname $(2).tmp` ] ; then \
+               mkdir -p `dirname $(2).tmp` ; fi
+       @echo "/* Automatically generated from */" > "$(2).tmp"
+       @echo "/* config file: $$< */" >> "$(2).tmp"
+       $(if $(DOXYGEN),@echo "/** @file */" >> "$(2).tmp")
+       @echo "#ifndef $(4)" >> "$(2).tmp"
+       @echo "#define $(4)" >> "$(2).tmp"
+       @( $(foreach x, $(shell echo '$($(3))' | tr 'x\t ' 'x\n\n' | sed -e 's/^\([^ =]*\)\(=[^ ]\+\|\)$$/\1/' ), \
+               echo '$(x).$($(x))' ; ) echo ; ) | \
+               sed -e '/^[^.]*\.n$$$$/d' -e '/^[^.]*\.$$$$/d' -e 's/^\([^.]*\)\.[ym]$$$$/\1.1/' | \
+               sed -n -e 's/^\([^.]*\)\.\(.*\)$$$$/#define \1 \2/p' \
+                 >> "$(2).tmp"
+       @echo "#endif /*$(4)*/" >> "$(2).tmp"
+       @touch "$$@"
+       @if cmp --quiet "$(2).tmp" "$(2)" ; then rm "$(2).tmp"; \
+       else mv "$(2).tmp" "$(2)" ; \
+       echo "Updated configuration $(2)" ; fi
+
+endef
+
+ifdef LOCAL_CONFIG_H
+
+# This must be declared after the default cflags are assigned!
+# Override is used to override command line assignemnt.
+override CFLAGS += -I.
+$(eval $(call BUILD_CONFIG_H_template,$(USER_OBJS_DIR),$(USER_OBJS_DIR)/$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+
+endif
+
+# Special rules for configuration exported headers
+
+#FIXME: The directory for headers should not be specified here.
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(USER_OBJS_DIR),$(addprefix $(USER_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+config_h_stamp_files = $(addprefix $(USER_OBJS_DIR)/,$(notdir $(addsuffix .stamp,$(config_include_HEADERS) $(LOCAL_CONFIG_H))))
+
+# Add some hooks to standard passes
+include-pass-local: $(config_h_stamp_files)
+
+ifneq ($(KERN_CONFIG_HEADERS_REQUIRED),)
+
+ifdef LOCAL_CONFIG_H
+$(eval $(call BUILD_CONFIG_H_template,$(KERN_OBJS_DIR),$(KERN_OBJS_DIR)/$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+endif
+
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(KERN_OBJS_DIR),$(addprefix $(KERN_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+kern_config_h_stamp_files = $(addprefix $(KERN_OBJS_DIR)/,$(notdir $(addsuffix .stamp,$(config_include_HEADERS) $(LOCAL_CONFIG_H))))
+
+# Add some hooks to standard passes
+include-pass-local: $(kern_config_h_stamp_files)
+
+endif
+
+clean-local: clean-local-config-h
+
+clean-local-config-h:
+       @$(foreach confh,$(config_h_stamp_files) $(kern_config_h_stamp_files),\
+           if [ -e $(confh) ] ; then rm $(confh) ; fi ; \
+       )
+
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@sources-list
+# Rules that creates the list of files which are used during
+# compilation. The list reflects conditional compilation depending on
+# config.omk and other variables.
+
+SOURCES_LIST_FN=sources.txt
+ifndef SOURCES_LIST
+SOURCES_LIST_DIR:=$(RELATIVE_DIR)
+SOURCES_LIST:=$(MAKERULES_DIR)/$(SOURCES_LIST_DIR)/$(SOURCES_LIST_FN)
+export SOURCES_LIST SOURCES_LIST_DIR
+endif
+
+ifeq ($(MAKECMDGOALS),sources-list)
+NEED_SOURCES_LIST=y
+endif
+ifeq ($(MAKECMDGOALS),TAGS)
+NEED_SOURCES_LIST=y
+endif
+ifeq ($(MAKECMDGOALS),tags)
+NEED_SOURCES_LIST=y
+endif
+
+ifeq ($(NEED_SOURCES_LIST),y) # avoid execution of find command bellow if it is not useful
+.PHONY: sources-list
+sources-list: $(SOURCES_LIST)
+
+$(SOURCES_LIST): $(CONFIG_FILE) $(CONFIG_FILE)-default $(shell find -name $(MAKEFILE_OMK))
+       @echo -n "" > "$(SOURCES_LIST).tmp"
+       @$(MAKE) --no-print-directory sources-list-pass
+       @echo "# Automatically generated list of files in '$(RELATIVE_DIR)' that are used during OMK compilation" > "$(SOURCES_LIST).tmp2"
+       @cat "$(SOURCES_LIST).tmp"|sort|uniq >> "$(SOURCES_LIST).tmp2"
+       @rm "$(SOURCES_LIST).tmp"
+       @mv "$(SOURCES_LIST).tmp2" "$(SOURCES_LIST)"
+endif
+
+$(eval $(call omk_pass_template,sources-list-pass,$$(LOCAL_BUILD_DIR),,always))
+
+sources-list-pass-local:
+       @$(foreach h,$(include_HEADERS) $(nobase_include_HEADERS) $(kernel_HEADERS),\
+         echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(h)" >> "$(SOURCES_LIST).tmp";)
+       @$(foreach ch,$(config_include_HEADERS), \
+         echo "$(USER_INCLUDE_DIR:$(MAKERULES_DIR)/$(addsuffix /,$(SOURCES_LIST_DIR))%=%)/$(ch)" >> "$(SOURCES_LIST).tmp";)
+       @$(foreach h,$(renamed_include_HEADERS),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(h)"|sed -e 's/\(.*\)->.*/\1/' >> "$(SOURCES_LIST).tmp";)
+       @$(foreach bin,$(lib_LIBRARIES) $(shared_LIBRARIES) $(bin_PROGRAMS) $(test_PROGRAMS) $(utils_PROGRAMS) \
+         $(kernel_LIBRARIES) $(rtlinux_LIBRARIES) $(kernel_MODULES),\
+         $(foreach src,$(filter-out %.o,$($(bin)_SOURCES)),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(src)" >> "$(SOURCES_LIST).tmp";))
+
+############ TAGS ###########
+
+ifeq ($(MAKECMDGOALS),TAGS)
+ETAGS=etags
+TAGS_CMD = $(ETAGS)
+TAGS: $(SOURCES_LIST)
+       @$(MAKE) --no-print-directory do-tags
+endif
+ifeq ($(MAKECMDGOALS),tags) 
+CTAGS=ctags -N
+TAGS_CMD = $(CTAGS)
+tags: $(SOURCES_LIST)
+       @$(MAKE) --no-print-directory do-tags
+endif
+export TAGS_CMD
+
+ifeq ($(MAKECMDGOALS),do-tags)
+.PHONY: do-tags
+do-tags: $(shell sed -e '/^\#/d' $(SOURCES_LIST))
+       @$(QUIET_CMD_ECHO) "  TAGS    $(SOURCES_LIST_FN)"
+       $(Q)$(TAGS_CMD) $^
+endif
+
+############ CSCOPE ###########
+
+cscope: $(SOURCES_LIST)
+       @$(QUIET_CMD_ECHO) "  CSCOPE  < $(SOURCES_LIST_FN)"
+       $(Q)sed -e '/^#/d' $(SOURCES_LIST)|cscope -b -i-
+#FIXME: see doc to -i in cscope(1)
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@localeval
+ifneq ($(local_EVALUATE),)
+#$(warning $(local_EVALUATE))
+$(eval $(local_EVALUATE))
+endif
+
+# Local Variables:
+# mode:makefile
+# End:
diff --git a/ulan/embedded/Makefile.keil b/ulan/embedded/Makefile.keil
new file mode 100644 (file)
index 0000000..00df014
--- /dev/null
@@ -0,0 +1,460 @@
+#  Makefile.rules - OCERA make framework common project rules
+#                   This version is adapted for SDCC build
+#   
+#  (C) Copyright 2003-2005 by Pavel Pisa - OCERA team member
+#
+#  The uLan driver is distributed under the Gnu General Public License. 
+#  See file COPYING for details.
+#
+#
+# input variables
+# V                .. if set to 1, full command text is shown else short form is used
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# lib_LIBRARIES    .. list of the user-space libraries
+# shared_LIBRARIES .. list of the user-space shared libraries
+# include_HEADERS  .. list of the user-space public header files
+# nobase_include_HEADERS .. public headers copied even with directory part
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+# tar_EMBEDFILES   .. list of tars with embedded files
+#
+
+BUILD_DIR_NAME = _build
+COMPILED_DIR_NAME = _compile
+GROUP_DIR_NAME = 
+
+CC = c51
+OBJ_EXT = .obj
+LIB_EXT = .lib
+LIB_PREF =
+AR = lib51
+AS = a51intel
+HC = oh51
+LI = l51
+
+# We need to ensure definition of sources directory first
+ifndef SOURCES_DIR
+SOURCES_DIR := $(shell ( pwd -W ) )
+endif
+
+all: default
+
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+ifndef CONFIG_FILE
+CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
+endif
+ifneq ($(wildcard $(CONFIG_FILE)-default),)
+-include $(CONFIG_FILE)-default
+else
+$(warning Please, run "make default-config" first)
+endif
+ifneq ($(wildcard $(CONFIG_FILE)),)
+include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+
+# Check and include real OCERA style Makefile.omk now
+ifndef OMK_INCLUDED
+include $(SOURCES_DIR)/Makefile.omk
+OMK_INCLUDED := 1
+endif
+
+export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR
+export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
+
+#CFLAGS += -ggdb
+#CFLAGS += -O2 
+#CFLAGS += -Wall
+#CXXFLAGS += -ggdb
+#CXXFLAGS += -O2
+#CXXFLAGS += -Wall
+
+ifndef DEFAULT_INCLUDES
+override DEFAULT_INCLUDES = $(INCLUDES) -I $(USER_INCLUDE_DIR) -I $(SOURCES_DIR) \
+  $(shell echo $${C51INC} | sed -e 's/;/ -I /g' -e 's/^\(.\)/-I \1/')
+endif
+#$(warning DEFAULT_INCLUDES = $(DEFAULT_INCLUDES))
+
+#CPPFLAGS  += -I $(USER_INCLUDE_DIR)
+
+CPPFLAGS  += $(CONFIG_OMK_DEFINES)
+
+#CPPFLAGS  += $(AM_CPPFLAGS)
+#CFLAGS    += $(AM_CFLAGS)
+#CXXFLAGS  += $(AM_CXXFLAGS)
+#LDFLAGS   += $(CFLAGS) $(AM_CFLAGS) $(LD_PATHS:%=-L%)
+#LOADLIBES += -L$(USER_LIB_DIR) 
+
+#LOADLIBES += $(lib_LOADLIBES:%=-l%)
+
+SOLIB_PICFLAGS += -shared -fpic
+
+ifndef RELATIVE_DIR
+override RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
+endif
+ifeq ("$(RELATIVE_DIR)","")
+override RELATIVE_DIR := .
+endif
+override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
+override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
+
+#$(warning SOURCES_DIR = $(SOURCES_DIR))
+#$(warning MAKERULES_DIR = $(MAKERULES_DIR))
+#$(warning RELATIVE_DIR = $(RELATIVE_DIR))
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+
+VPATH = $(SOURCES_DIR)
+srcdir = $(SOURCES_DIR)
+
+USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
+
+.PHONY: default dep subdirs clean cleandepend default-config
+.PHONY: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
+.PHONY: default-config-pass
+.PHONY: check-dir-local include-pass-local library-pass-local binary-pass-local 
+.PHONY: utils-pass-local default-config-pass-local
+
+# Some support to serialize some targets for parallel make
+ifneq ($(OMK_SERIALIZE_INCLUDED),y)
+include-pass: check-dir
+library-pass: include-pass
+binary-pass utils-pass: library-pass
+
+OMK_SERIALIZE_INCLUDED = y
+endif
+
+# Defines for quiet compilation
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    OMK_VERBOSE = $(V)
+  endif
+endif
+ifndef OMK_VERBOSE
+  OMK_VERBOSE = 0
+endif
+ifeq ($(OMK_VERBOSE),1)
+  Q =
+else
+  Q = @
+endif
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  QUIET_CMD_ECHO = true
+  OMK_SILENT = 1
+else
+  QUIET_CMD_ECHO = echo
+  CPHEADER_FLAGS += -v
+endif
+
+default: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
+
+#=====================================================================
+# Common utility rules
+
+define mkdir_def
+       [ -d $(1) ] || mkdir -p $(1) || exit 1
+endef
+
+ifdef LOCAL_CONFIG_H
+
+$(LOCAL_CONFIG_H) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
+       @echo LOCAL_CONFIG_H=`pwd -W`/$(LOCAL_CONFIG_H)
+       @echo "/* Automatically generated from */" > "$(LOCAL_CONFIG_H).tmp"
+       @echo "/* config file : $< */" >> "$(LOCAL_CONFIG_H).tmp"
+       @echo "#ifndef _LOCAL_CONFIG_H" >> "$(LOCAL_CONFIG_H).tmp"
+       @echo "#define _LOCAL_CONFIG_H" >> "$(LOCAL_CONFIG_H).tmp"
+       @( $(foreach x, $(shell echo $(default_CONFIG) | sed -e 's/\<\([^ ]*\)=[^ ]\>/\1/g' ), \
+               echo $(x).$($(x)) ; ) echo ; ) | \
+               sed -n -e 's/^\(.*\)\.[ym]$$/#define \1 1/p' \
+                 >> "$(LOCAL_CONFIG_H).tmp"
+       @echo "#endif /*_LOCAL_CONFIG_H*/" >> "$(LOCAL_CONFIG_H).tmp"
+       @if cmp --quiet "$(LOCAL_CONFIG_H).tmp" "$(LOCAL_CONFIG_H)" ; then \
+       echo rm "$(LOCAL_CONFIG_H).tmp" ; \
+       else mv "$(LOCAL_CONFIG_H).tmp" "$(LOCAL_CONFIG_H)" ; \
+       echo Updated configuration "$(LOCAL_CONFIG_H)" ; fi
+
+endif
+
+check-make-ver:
+       @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
+       if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
+               echo "Your make program version is too old and does not support OMK system." ; \
+               echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
+       fi
+
+#=====================================================================
+# Special rules for target filesystem and data preparation
+
+
+define TARFILE_template
+
+.PHONY: $(2)
+
+$(2):
+       $(Q) ABSOLUTETARFILE=`cd $$(dir $$@) ; pwd -W`/$$@ ; \
+            ( test -e $$$$ABSOLUTETARFILE && ( cd  $(3) && tar -df $$$$ABSOLUTETARFILE ) ) || \
+            ( cd  $(3) && tar -cf $$$$ABSOLUTETARFILE . )
+
+$(2)$(OBJ_EXT): $(2)
+       @$(QUIET_CMD_ECHO) "  TARFILE $$@"
+       $(Q) $(OBJCOPY) -I binary -O elf32-littlearm  $$^ $$@
+
+endef
+
+#=====================================================================
+# User-space rules and templates to compile programs, libraries etc.
+
+ifdef USER_RULE_TEMPLATES
+
+
+#%.lo: %.c
+#      $(CC) -o $@ $(LCFLAGS) -c $<
+
+c_o_COMPILE = $(CC) $(DEFS) $(AM_CPPFLAGS)
+
+cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CXXFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
+
+
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+CC_MAJOR_VERSION := sdcc
+endif
+# Prepare suitable define for dependency building
+#CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+
+
+#"OBJECT($$@)"
+#      export C51INC="${C51INC};$$(USER_INCLUDE_DIR);$$(SOURCES_DIR)" ; \
+#        echo fastdep "$$(DEFAULT_INCLUDES)" <$$< >"$$@.d"; \
+
+define COMPILE_c_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CC      $$@"
+       $(Q) cp $$< .;\
+       export C51INC=`echo "$$(DEFAULT_INCLUDES)" | sed -e 's/-I//' -e 's/-I/;/g' -e 's/ //g'`;\
+       $$(c_o_COMPILE) $(3) `basename $$<      ` SRC ; \
+       if [ $$$$? -le 1 ] ; \
+         then if  a51 `basename $$< .c`.src ; \
+         then \
+         touch "$$@.d" ; \
+         else echo ERRORLEVEL $$$$? ; exit 1; \
+         fi \
+       else echo ERRORLEVEL $$$$? ; exit 1; \
+       fi
+endef
+
+
+
+define COMPILE_cc_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CXX     $$@"
+       $(Q) echo "C++ compilation not suported for this compiler"
+endef
+
+define COMPILE_asm_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  ASM      $$@"
+       $(Q) \
+       cp $$< .; \
+       if [ -f $(SOURCES_DIR)/reg1210.inc ] ; then \
+         cp $(SOURCES_DIR)/reg1210.inc .; \
+       fi;\
+       $$(AS) $(2:%$(OBJ_EXT)=%.asm)
+endef
+
+
+define PROGRAM_template
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+$(2)/$(1): $(USER_LIB_DIR)/timestamp
+
+
+#      $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
+#        then echo $$(CC)  $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
+#        else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
+#        $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
+#        -o $(2)/$(1)
+#      $(HC) $(2)/$(1) >$(2)/$(1).hex
+
+#        $$(LI) $$($(1)_OBJS) $$(LOADLIBES)
+
+$(2)/$(1): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) \
+         export C51LIB="$${C51LIB};$(USER_LIB_DIR)"; \
+         export LI_FILES="$$($(1)_OBJS) $$(lib_LOADLIBES:%=%$$(LIB_EXT))"; \
+         export LI_FILES="`echo "$$$${LI_FILES}" | sed -e 's/\(.\) \(.\)/\1,\2/g'`";\
+         $$(LI) $$$${LI_FILES}
+endef
+
+
+
+define LIBRARY_template
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+$(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR      $$@"
+       $(Q) \
+       rm -f $$@; \
+       $(AR) CREATE $$@; \
+       for i in $$^ ; do $(AR) ADD $$$$i TO $$@ ; done
+       @touch $(USER_LIB_DIR)/timestamp
+endef
+
+define SOLIB_template
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
+
+SOLIB_OBJS  += $$($(1)_OBJSLO)
+SOLIB_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+$(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
+endef
+
+
+
+library-pass-local: $(lib_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%$(LIB_EXT)) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%.so)
+
+binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%)
+
+utils-pass-local: $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%)
+
+$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR))))
+
+$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR))))
+
+$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
+
+$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
+
+-include $(USER_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+
+
+library-pass binary-pass utils-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_DIR)/$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile USER_RULE_TEMPLATES=y $(@:%=%-local)
+
+
+dep clean install check-dir include-pass default-config-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_DIR)/$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile $(@:%=%-local)
+
+
+dep-local:
+       
+check-dir-local:
+       @$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(call mkdir_def,$(USER_LIB_DIR))
+       @$(call mkdir_def,$(USER_BIN_DIR))
+       @$(call mkdir_def,$(USER_UTILS_DIR))
+
+install-local:
+
+default-config:
+       @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
+       @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
+       @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
+       @echo >> "$(CONFIG_FILE)-default"
+       @$(MAKE) --no-print-directory -C $(MAKERULES_DIR) \
+               RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
+               -f $(MAKERULES_DIR)/Makefile default-config-pass
+
+default-config-pass-local:
+       @echo Default config for $(RELATIVE_DIR)
+       @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
+       @$(foreach x, $(default_CONFIG), echo $(x) | \
+               sed -e 's/^.*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
+
+include-pass-local:
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(foreach f, $(include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) \
+          || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; )
+       @$(foreach f, $(nobase_include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) \
+          || ( mkdir -p $(USER_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) ) || exit 1 ; )
+
+ifdef USER_RULE_TEMPLATES
+
+# User-space static libraries and applications object files
+
+USER_SOURCES := $(sort $(USER_SOURCES))
+
+#$(warning USER_SOURCES = $(USER_SOURCES))
+
+$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%$(OBJ_EXT)),)))
+
+$(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%$(OBJ_EXT)),)))
+
+$(foreach src,$(filter %.asm,$(USER_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),)))
+
+# User-space shared libraries object files
+
+SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
+
+#$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
+
+$(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.asm,$(SOLIB_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),$(SOLIB_PICFLAGS))))
+
+$(foreach tarfile,$(USER_EMBEDTARFILES),$(eval $(call TARFILE_template,$(tarfile),$(tarfile)_tarfile,$(SOURCES_DIR)/$(tarfile))))
+
+endif
+
+
+clean-local:
+       @echo Cleaning in $(USER_OBJS_DIR)
+       @rm -f $(USER_OBJS_DIR)/*$(OBJ_EXT) $(USER_OBJS_DIR)/*.lo \
+              $(USER_OBJS_DIR)/*.d \
+              $(USER_OBJS_DIR)/*.map \
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%) \
+              $(tar_EMBEDFILES:%=$(USER_OBJS_DIR)/%_tarfile)
+              
+
diff --git a/ulan/embedded/Makefile.omk b/ulan/embedded/Makefile.omk
new file mode 100644 (file)
index 0000000..c0f9113
--- /dev/null
@@ -0,0 +1,6 @@
+# -*- makefile -*-
+
+SUBDIRS = app arch board libs4c 
+
+-include $(SOURCES_DIR)/Makefile.omk-additional 
+
diff --git a/ulan/embedded/Makefile.sdcc b/ulan/embedded/Makefile.sdcc
new file mode 100644 (file)
index 0000000..06161d5
--- /dev/null
@@ -0,0 +1,534 @@
+#  Makefile.rules - OCERA make framework common project rules
+#                   This version is adapted for SDCC build
+#   
+#  (C) Copyright 2003-2005 by Pavel Pisa - OCERA team member
+#
+#  The uLan driver is distributed under the Gnu General Public License. 
+#  See file COPYING for details.
+#
+#
+# input variables
+# V                .. if set to 1, full command text is shown else short form is used
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# lib_LIBRARIES    .. list of the user-space libraries
+# lib_LDSCRIPTS    .. list of LD scripts that should be copied to the lib direcotry 
+# shared_LIBRARIES .. list of the user-space shared libraries
+# include_HEADERS  .. list of the user-space public header files
+# nobase_include_HEADERS .. public headers copied even with directory part
+# renamed_include_HEADERS .. public headers copied to the different target name
+# asm_build_HEADERS .. list of files copied to the build object directory
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+# tar_EMBEDFILES   .. list of tars with embedded files
+# link_VARIANTS    .. list of ld script suffixes (after hypen `-') that
+#                     should be used for linking (e.g. ram flash). If this is not
+#                    specified, then the value of DEFAULT_LD_SCRIPT_VARIANT from config.target is used.
+#
+
+BUILD_DIR_NAME = _build
+COMPILED_DIR_NAME = _compiled
+GROUP_DIR_NAME = 
+
+CC = sdcc
+OBJ_EXT = .rel
+LIB_EXT = .lib
+LIB_PREF =
+AR = sdcclib
+AS = asx8051
+HC = packihx
+TOHIT = ul_sendhex
+ARFLAGS = -a
+A51TOASX = $(MAKERULES_DIR)/a51toasx.sh
+
+# We need to ensure definition of sources directory first
+ifndef SOURCES_DIR
+SOURCES_DIR := $(shell ( pwd -L ) )
+endif
+
+all: default
+
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+ifndef CONFIG_FILE
+CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
+endif
+ifneq ($(wildcard $(CONFIG_FILE)-default),)
+-include $(CONFIG_FILE)-default
+else
+$(warning Please, run "make default-config" first)
+endif
+ifneq ($(wildcard $(CONFIG_FILE)),)
+include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+
+# Check and include real OCERA style Makefile.omk now
+ifndef OMK_INCLUDED
+include $(SOURCES_DIR)/Makefile.omk
+OMK_INCLUDED := 1
+endif
+
+export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR
+export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
+export MOD
+
+#CFLAGS += -ggdb
+#CFLAGS += -O2 
+#CFLAGS += -Wall
+#CXXFLAGS += -ggdb
+#CXXFLAGS += -O2
+#CXXFLAGS += -Wall
+
+#DEFAULT_INCLUDES = -I $(PROJECT_INCLUDE)
+
+CPPFLAGS  += -I $(USER_INCLUDE_DIR)
+
+CPPFLAGS  += $(CONFIG_OMK_DEFINES)
+
+#CPPFLAGS  += $(AM_CPPFLAGS)
+#CFLAGS    += $(AM_CFLAGS)
+#CXXFLAGS  += $(AM_CXXFLAGS)
+#LDFLAGS   += $(CFLAGS) $(AM_CFLAGS) $(LD_PATHS:%=-L%)
+CFLAGS  += $(TARGET_ARCH) 
+LDFLAGS += $(TARGET_ARCH) 
+
+LOADLIBES += -L$(USER_LIB_DIR) 
+
+LOADLIBES += $(lib_LOADLIBES:%=-l%)
+
+SOLIB_PICFLAGS += -shared -fpic
+
+ifndef RELATIVE_DIR
+RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
+endif
+override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
+override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
+#$(warning  RELATIVE_DIR $(RELATIVE_DIR))
+override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g'  -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__')
+#$(warning  BACK2TOP_DIR $(BACK2TOP_DIR))
+
+#$(warning SOURCES_DIR = $(SOURCES_DIR))
+#$(warning MAKERULES_DIR = $(MAKERULES_DIR))
+#$(warning RELATIVE_DIR = $(RELATIVE_DIR))
+
+override RELATIVE_PREFIX := $(RELATIVE_DIR)/
+override RELATIVE_PREFIX := $(RELATIVE_PREFIX:/%=%)
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+
+VPATH = $(SOURCES_DIR)
+srcdir = $(SOURCES_DIR)
+
+USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
+
+
+.PHONY: default dep subdirs clean cleandepend default-config
+.PHONY: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
+.PHONY: default-config-pass
+.PHONY: check-dir-local include-pass-local library-pass-local binary-pass-local 
+.PHONY: utils-pass-local default-config-pass-local
+
+# Some support to serialize some targets for parallel make
+ifneq ($(OMK_SERIALIZE_INCLUDED),y)
+include-pass: check-dir
+library-pass: include-pass
+binary-pass utils-pass: library-pass
+
+OMK_SERIALIZE_INCLUDED = y
+endif
+
+# Defines for quiet compilation
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    OMK_VERBOSE = $(V)
+  endif
+endif
+ifndef OMK_VERBOSE
+  OMK_VERBOSE = 0
+endif
+ifeq ($(OMK_VERBOSE),1)
+  Q =
+else
+  Q = @
+endif
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  QUIET_CMD_ECHO = true
+  OMK_SILENT = 1
+else
+  QUIET_CMD_ECHO = echo
+  CPHEADER_FLAGS += -v
+endif
+
+default: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
+
+#=====================================================================
+# Common utility rules
+
+define mkdir_def
+       [ -d $(1) ] || mkdir -p $(1) || exit 1
+endef
+
+# Syntax: $(call BUILD_CONFIG_H_template,<header_file_path>,<list_of_options_to_export>,<header_barrier>)
+define BUILD_CONFIG_H_template
+
+$(1) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
+       @$(QUIET_CMD_ECHO) "  CONFGEN $$@ in `pwd`"
+       @if [ ! -d `dirname $(1).tmp` ] ; then \
+               mkdir `dirname $(1).tmp` ; fi
+       @echo "/* Automatically generated from */" > "$(1).tmp"
+       @echo "/* config file : $< */" >> "$(1).tmp"
+       @echo "#ifndef $(3)" >> "$(1).tmp"
+       @echo "#define $(3)" >> "$(1).tmp"
+       @( $(foreach x, $(shell echo '$($(2))' | sed -e 's/\<\([^ =]*\)\(=[^ ]\+\|\)\>/\1/g' ), \
+               echo '$(x).$($(x))' ; ) echo ; ) | \
+               sed -e '/^[^.]*\.n$$$$/d' -e '/^[^.]*\.$$$$/d' -e 's/^\([^.]*\)\.[ym]$$$$/\1.1/' | \
+               sed -n -e 's/^\([^.]*\)\.\(.*\)$$$$/#define \1 \2/p' \
+                 >> "$(1).tmp"
+       @echo "#endif /*$(3)*/" >> "$(1).tmp"
+       @if cmp --quiet "$(1).tmp" "$(1)" ; then \
+       echo rm "$(1).tmp" ; \
+       else mv "$(1).tmp" "$(1)" ; \
+       echo Updated configuration "$(1)" ; fi
+endef
+
+ifdef LOCAL_CONFIG_H
+
+$(eval $(call BUILD_CONFIG_H_template,$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+
+endif
+
+check-make-ver:
+       @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
+       if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
+               echo "Your make program version is too old and does not support OMK system." ; \
+               echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
+       fi
+
+link_VARIANTS ?= $(DEFAULT_LD_SCRIPT_VARIANT)
+
+#=====================================================================
+# Special rules for target filesystem and data preparation
+
+
+define TARFILE_template
+
+.PHONY: $(2)
+
+$(2):
+       $(Q) ABSOLUTETARFILE=`cd $$(dir $$@) ; pwd`/$$@ ; \
+            ( test -e $$$$ABSOLUTETARFILE && ( cd  $(3) && tar -df $$$$ABSOLUTETARFILE ) ) || \
+            ( cd  $(3) && tar -cf $$$$ABSOLUTETARFILE . )
+
+$(2)$(OBJ_EXT): $(2)
+       @$(QUIET_CMD_ECHO) "  TARFILE $$@"
+       $(Q) $(OBJCOPY) -I binary -O elf32-littlearm  $$^ $$@
+
+endef
+
+#=====================================================================
+# User-space rules and templates to compile programs, libraries etc.
+
+ifdef USER_RULE_TEMPLATES
+
+
+#%.lo: %.c
+#      $(CC) -o $@ $(LCFLAGS) -c $<
+
+c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
+
+cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CXXFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
+
+
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+CC_MAJOR_VERSION := sdcc
+endif
+# Prepare suitable define for dependency building
+#CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+
+
+
+
+# Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_c_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CC      $$@"
+       $(Q) if $$(c_o_COMPILE) $(3) -o "$$@" -c $$< ; \
+       then $$(c_o_COMPILE) $(3) -M $$< > "$$@.d" ; \
+       else exit 1; \
+       fi
+endef
+
+
+# Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_cc_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  CXX     $$@"
+       $(Q) echo "C++ compilation not suported for this compiler"
+endef
+
+
+# Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_asm_o_template
+$(2): $(1) $(LOCAL_CONFIG_H)
+       @$(QUIET_CMD_ECHO) "  ASM      $$@"
+       $(Q) $$(A51TOASX) $(1) $(2:%$(OBJ_EXT)=%.s)
+       $(Q) $$(AS) -l -o $(2:%$(OBJ_EXT)=%.s)
+endef
+
+
+# Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<executable-suffix>,<linker-sript>)
+define PROGRAM_template
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+-include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
+
+$(2)/$(1)$(addprefix -,$(3)): $(USER_LIB_DIR)/timestamp
+
+$(2)/$(1)$(addprefix -,$(3)): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
+         then echo $$(CC)  $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
+         else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
+         $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
+         -o $(2)/$(1)$(addprefix -,$(3))
+       $(HC) $(2)/$(1)$(addprefix -,$(3)) >$(2)/$(1)$(addprefix -,$(3)).hex
+       hex2bin $(2)/$(1)$(addprefix -,$(3)).hex
+#@echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
+#@sed -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(USER_OBJS_DIR)/$(1).exe.map  >>$(USER_OBJS_DIR)/$(1).exe.d
+#@echo >>$(USER_OBJS_DIR)/$(1).exe.d
+#-Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map
+endef
+
+
+# Syntax: $(call LIBRARY_template,<library-name>)
+define LIBRARY_template
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
+$(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+$(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR      $$@"
+       $(Q) for i in $$^ ; do $(AR) $(ARFLAGS) $$@ $$$$i ; done
+       @touch $(USER_LIB_DIR)/timestamp
+endef
+
+
+# Syntax: $(call SOLIB_template,<library-name>)
+define SOLIB_template
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
+$(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
+$(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
+$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
+
+SOLIB_OBJS  += $$($(1)_OBJSLO)
+SOLIB_SOURCES += $$($(1)_SOURCES)
+USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
+
+$(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
+endef
+
+
+library-pass-local: $(lib_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%$(LIB_EXT)) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%.so)
+
+binary-pass-local: $(foreach link,$(link_VARIANTS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link)) $(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link).$(of))))
+
+utils-pass-local: $(foreach link,$(link_VARIANTS),$(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%-$(link)) $(foreach of,$(OUTPUT_FORMATS),$(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%-$(link).$(of))))
+
+$(foreach prog,$(utils_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(link)))))
+
+$(foreach prog,$(bin_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
+
+$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
+
+$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
+
+-include $(USER_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+
+
+library-pass binary-pass utils-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile USER_RULE_TEMPLATES=y $(@:%=%-local)
+
+
+dep clean install check-dir include-pass default-config-pass:
+       +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
+       +@$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
+               -f $(SOURCES_DIR)/Makefile $(@:%=%-local)
+
+
+dep-local:
+       
+check-dir-local:
+       @$(call mkdir_def,$(USER_OBJS_DIR))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(call mkdir_def,$(USER_LIB_DIR))
+       @$(call mkdir_def,$(USER_BIN_DIR))
+       @$(call mkdir_def,$(USER_UTILS_DIR))
+
+install-local:
+
+default-config:
+       @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
+       @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
+       @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
+       @echo >> "$(CONFIG_FILE)-default"
+       @$(MAKE) --no-print-directory -C $(MAKERULES_DIR) \
+               RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
+               -f $(MAKERULES_DIR)/Makefile default-config-pass
+
+default-config-pass-local:
+       @echo Default config for $(RELATIVE_DIR)
+       @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
+       @$(foreach x, $(default_CONFIG), echo '$(x)' | \
+               sed -e 's/^[^=]*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
+
+include-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(foreach f, $(include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) \
+          || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; )
+       @$(foreach f, $(nobase_include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) \
+          || ( mkdir -p $(USER_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) ) || exit 1 ; )
+       @$(foreach f, $(renamed_include_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} \
+          || ( mkdir -p `dirname $(USER_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} ) || exit 1 ; )
+       @$(foreach f, $(asm_build_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_OBJS_DIR)/$${destfname} \
+          || ( mkdir -p `dirname $(USER_OBJS_DIR)/$${destfname}` && \
+          $(A51TOASX) $(SOURCES_DIR)/$${srcfname} $(USER_OBJS_DIR)/$${destfname} ) || exit 1 ; )
+       $(foreach f, $(lib_LDSCRIPTS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) \
+          || cp $(CP_FLAGS) $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) || exit 1 ; ) 
+
+
+ifdef USER_RULE_TEMPLATES
+
+# User-space static libraries and applications object files
+
+USER_SOURCES := $(sort $(USER_SOURCES))
+
+#$(warning USER_SOURCES = $(USER_SOURCES))
+
+$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%$(OBJ_EXT)),)))
+
+$(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%$(OBJ_EXT)),)))
+
+$(foreach src,$(filter %.asm,$(USER_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),)))
+
+# User-space shared libraries object files
+
+SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
+
+#$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
+
+$(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.asm,$(SOLIB_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),$(SOLIB_PICFLAGS))))
+
+$(foreach tarfile,$(USER_EMBEDTARFILES),$(eval $(call TARFILE_template,$(tarfile),$(tarfile)_tarfile,$(SOURCES_DIR)/$(tarfile))))
+
+endif
+
+
+#=====================================================================
+# Automatic loading of compiled program by issuing "make load"
+
+ifneq ($(OUTPUT_FORMATS),)
+# Select a file extension (e.g. .bin) for "make load" command to load.
+LOAD_EXTENSION = .$(firstword $(OUTPUT_FORMATS))
+endif
+
+# Syntax: $(call LOAD_PROGRAM_template,<executable-name>,<dir>,<link-variant>)
+# Used to load program to the target hardware
+define LOAD_PROGRAM_template
+.PHONY: load-$(1)$(addprefix -,$(3))
+-include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
+load-$(1)$(addprefix -,$(3)): $(2)/$(1)$(addprefix -,$(3))$(LOAD_EXTENSION)
+       @$(QUIET_CMD_ECHO) "  LOAD    $$<"
+       @if [ -z "$$(LOAD_CMD$(addprefix -,$(3)))" ]; then echo "No command for loading applications to '$(3)' is specified."; exit 1; fi
+       $(Q) $$(LOAD_CMD$(addprefix -,$(3))) $$<
+endef
+
+# Syntax: $(call LOAD__RUN_VARIANT_template,<link-variant>)
+# Used to load and/or run non-default variant of the default program
+define LOAD_RUN_VARIANT_template
+.PHONY: load-$(1) run-$(1)
+-include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
+load-$(1): load-$(firstword $(bin_PROGRAMS))-$(1)
+run-$(1):
+       @$(QUIET_CMD_ECHO) "  RUN     $(1)"
+       @if [ -z "$(RUN_CMD-$(1))" ]; then echo "No command for running '$(1)' variant is specified."; exit 1; fi
+       $(Q) $(RUN_CMD-$(1))
+endef
+
+$(foreach link,$(link_VARIANTS),$(foreach prog,$(bin_PROGRAMS),$(eval $(call LOAD_PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
+$(foreach link,$(link_VARIANTS),$(eval $(call LOAD_RUN_VARIANT_template,$(link))))
+
+.PHONY: load run
+load: $(addprefix load-,$(firstword $(bin_PROGRAMS))-$(firstword $(link_VARIANTS)))
+
+run: run-$(firstword $(link_VARIANTS))
+
+
+# Special rules for configuration exported headers
+
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(addprefix $(USER_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+
+#=====================================================================
+
+clean-local:
+       @echo Cleaning in $(USER_OBJS_DIR)
+       @rm -f $(USER_OBJS_DIR)/*$(OBJ_EXT) $(USER_OBJS_DIR)/*.lo \
+              $(USER_OBJS_DIR)/*.d \
+              $(USER_OBJS_DIR)/*.map \
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%) \
+              $(tar_EMBEDFILES:%=$(USER_OBJS_DIR)/%_tarfile)
+       @$(foreach confh,$(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS)),\
+           if [ -e $(confh) ] ; then touch -t 200001010101 $(confh) ; fi ; \
+       )
+
diff --git a/ulan/embedded/README.txt b/ulan/embedded/README.txt
new file mode 100644 (file)
index 0000000..52b1e62
--- /dev/null
@@ -0,0 +1,93 @@
+uLan embedded source tree v 0.5
+===============================
+
+This is highly experimental code, look for latest
+version on the project related pages
+
+  http://ulan.sourceforge.net/
+  http://sourceforge.net/projects/ulan
+  http://cmp.felk.cvut.cz/~pisa#ulan
+
+To build code you need to have SDCC 2.5.3-CVS.
+The snapshot past Sep 3 2005 are OK.
+The GNU make program 3.81beta3 or better is required.
+The full build has been tested on Linux based hosts only
+for now. The uLan protocol code has been successfully build
+by Keil compiler under Windows in the past.
+
+The archive has to be unpacked with symbolic links
+for now. We are thinking about rearrangement
+of the code to make it more portable and drop
+link requirements.
+
+The MCS51 is only port provided in this version.
+
+To build do
+
+  cd ul_embedded-x.y/mcs51
+  make defaul-config
+  make
+
+You should find resulting binaries in the "_compiled/bin"
+directory. The board and application is selected by used
+"config.omk" file. Example files can be found in the "configs"
+directory.
+
+The next boards and applications are supported
+
+Device: MCS51 TI MSC-1210
+   Board: ULAD-21 - AD converter and uLan2USB converter
+   Applications:
+     config.mscboot-ulad21 - uLan enabled remote boot-loader and boot-block
+     config.u2u-ulad21     - uLan to USB converter
+
+   Board: HISC - Home Information System Controller
+     config.mscboot-hisc   - boot block for distributed HISC system
+     config.blinder        - blinder controller
+     config.kswtimer       - kettle switch timer
+   
+Device: MCS51 Atmel AT89C51RD2
+     config.u2u-ps1        - AT89C51RD2 based uLan2USB converter
+
+
+The procedure to write boot-block into ULAD-21 MSC1210 based board
+requires next steps
+
+  FLASHMSC_TTY=/dev/ttyS1
+  flashmsc -d $FLASHMSC_TTY -E 0x807f
+  flashmsc -d $FLASHMSC_TTY -E 0x7fff
+  flashmsc -d $FLASHMSC_TTY -X 18432000 ulad21-hcr.hex
+  flashmsc -d $FLASHMSC_TTY -X 18432000 ulad21-boot.hex
+
+The "flashmsc" sources can be found at page
+  http://cmp.felk.cvut.cz/~pisa/#mcuutils
+
+To replace application in the converter or other uLan node
+over uLan communication protocol, next steps are required
+
+  echo Reset application if running
+  ul_sendhex -g 0 -m 0
+  echo Waiting to target to go into boot block
+  echo If application blocks, reset device at this time
+  echo to activate boot block now
+  ul_sendhex -o 0 -m 0
+  echo Found devices
+  ul_sendhex -p 64
+  echo Erasing flash
+  ul_sendhex -m 62 -t 5 -e -s 0x2000 -l 0x6000
+  sleep 2
+  echo Loading application
+  ul_sendhex -m 62 -t 5 application.hex
+
+Look for uLan driver for host side (Linux, Windows, DOS)
+uLan protocol driver. The uLan2USB converter requires
+at least version ul_drv-0.7 release.
+
+The code authors
+
+  (C) Copyright 1996-2005 by Pavel Pisa
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2005 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2005 Petr Smolik
+
diff --git a/ulan/embedded/a51dep.sh b/ulan/embedded/a51dep.sh
new file mode 100755 (executable)
index 0000000..662e11c
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+if [ $# -gt 1 ] ; then
+  FILENAMEIN="$1"
+  FILENAMEOUT="$2"
+fi
+
+echo $0;
+
+if true ; then
+  export FILESINCLUDE=`cat ${FILENAMEIN} | grep .include | \
+  sed -e 's/^[[:blank:]]*\.include[[:blank:]]"\(.*\)\..*"/\1 /g'`;
+  echo ${FILESINCLUDE};
+#  for f in ${FILESINCLUDE} ; do 
+      echo ${FILESINCLUDE} >${FILENAMEOUT}
+ # done
+fi
diff --git a/ulan/embedded/a51toasx.sh b/ulan/embedded/a51toasx.sh
new file mode 100755 (executable)
index 0000000..d110b17
--- /dev/null
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+FILENAME=ulan
+
+if [ $# -gt 0 ] ; then
+  FILENAME=`basename "$1" .asm`
+fi
+FILENAMEIN="${FILENAME}.asm"
+FILENAMEOUT="${FILENAME}.s"
+
+if [ $# -gt 1 ] ; then
+  FILENAMEIN="$1"
+  FILENAMEOUT="$2"
+fi
+
+# SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.5.1
+
+SDCC_VERSION="$(sdcc --version 2>&1 | sed -n -e 's/SDCC *: *[^ ]* *\<\([0-9]*\.[0-9]*\.[0-9]*\)\>.*$/\1/p')"
+
+case "${SDCC_VERSION}" in
+  1.*.* | 2.4.* | 2.5.1 | 2.5.2 ) SDCC_IS_OLD=yes ;;
+esac
+
+if [ -n "${SDCC_IS_OLD}" ] ; then
+  exec $0-old "$@"
+fi
+
+if true ; then
+cat ${FILENAMEIN} | strip0d | \
+tr '[A-Z]' '[a-z]' | \
+sed -e 's/^[[:blank:]]*\$include[[:blank:]]*(\(.*\))/.include "\1"/g' \
+ -e 's/^[[:blank:]]*%define[[:blank:]]*(\(.*\))[[:blank:]]*(\(.*\))/\1 = \2/g' \
+ -e 's/[[:blank:]]*%if[[:blank:]]*([[:blank:]]*not[[:blank:]]*\(.*\))[[:blank:]]*then[[:blank:]]*(/.if 1^\1/g' \
+ -e 's/[[:blank:]]*%if[[:blank:]]*(\(.*\))[[:blank:]]*then[[:blank:]]*(/.if \1/g' \
+ -e 's/[[:blank:]]*)[[:blank:]]*fi/.endif /g' \
+ -e 's/[[:blank:]]*)[[:blank:]]*else[[:blank:]]*(/.else /g' \
+ -e 's/\(..*\)\(.endif\|.else\)/\1\
+\2/g' \
+ -e 's/\<equ\>/=/g' \
+ -e "s/\<db[[:blank:]]*'\([^']*\)',0\>/.asciz '\1'/g" \
+ -e 's/\<\(db\|ds\|dw\)\>/.\1/g' \
+ -e 's/\<public\>/.globl/g' \
+ -e 's/\<extrn\>[[:blank:]]*\([[:alpha:]]*\)[[:blank:]]*(\(.*\))/.globl \2 ; \1/g' \
+ -e 's/%//g' \
+ -e 's/\<\([0-9][0-9A-Fa-f]*\)[Hh]\>/0x\1/g' \
+ -e 's/\<\([0-1][0-1]*\)[Bb]\>/0b\1/g' \
+ -e 's/^[^;]*\<segment\>/;\0/g' \
+ -e 's/^\([^;]*\)\<call\>/\1lcall/g' \
+ -e 's/^\([^;]*\)\<jmp\>/\1ljmp/g' \
+ -e 's/^\([^;]*\)\<end\>/\1/g' \
+ -e 's/^\([^;]*\)\<low\>/\1</g' \
+ -e 's/^\([^;]*\)\<high\>/\1>/g' \
+ -e 's/^\([^;]*\)\<and\>/\1\&/g' \
+ -e 's/^\([^;]*\)\<or\>/\1|/g' \
+ -e 's/^\([^;]*\)\<xor\>/\1^/g' \
+ -e 's/^\([^;]*\)\<not\>/\1~/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_c\)/.area CSEG (CODE) ;\1/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_x\)/.area XSEG (XDATA);\1/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_d\)/.area DSEG (DATA) ;\1/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_i\)/.area ISEG (DATA) ;\1/g' \
+\
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_b\)/.area BSEG_BYTES (DATA) ;\1/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*_rb1\)/.area REG_BANK_1 (REL,OVR,DATA) ;\1/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\(ser_stack\)/.area DSEG (DATA) \
+\1:/g' \
+ -e 's/^[[:blank:]]*\([[:alnum:]_]*\)[[:blank:]]*bit[[:blank:]]*\([[:alnum:]_]*\)\.\([0-7]\)/\1=\2[\3] /g' \
+ -e 's/^[[:blank:]]*\([[:alnum:]_]*\)[[:blank:]]*bit[[:blank:]]*\([[:alnum:]_.]*\)/\1=\2 /g' \
+\
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\(ser_stack\)/.area DSEG (DATA) \
+\1:/g' \
+ -e 's/^[[:blank:]]*rseg[[:blank:]]*\([[:alnum:]_]*\)/.area \1/g' \
+ -e 's/^[[:blank:]]*\([[:alnum:]_]*\)[[:blank:]]*\(xdata\|data\|idata\|code\)[[:blank:]]*\([[:alnum:]_]*\)/\1=\3 ;\2 /g' \
+ -e 's/\<cseg[[:blank:]]*at\>/.area CSEG_A (ABS,CODE)\
+.org/g' \
+ -e 's/\<xseg[[:blank:]]*at\>/.area XSEG_A (ABS,XDATA)\
+.org/g' \
+ -e 's/\<dseg[[:blank:]]*at\>/.area DSEG_A (ABS,DATA)\
+.org/g' \
+ -e 's/^[[:blank:]]*using[[:blank:]]*\([0-3]\)/; switch to bank \1 \
+ar0=0+8*\1 \
+ar1=1+8*\1 \
+ar2=2+8*\1 \
+ar3=3+8*\1 \
+ar4=4+8*\1 \
+ar5=5+8*\1 \
+ar6=6+8*\1 \
+ar7=7+8*\1 \
+/g' \
+ -e 's/\$nomod51//g' \
+ -e 's/^for_sdcc = 0/for_sdcc = 1/g' \
+ -e 's/\<s_gsinit\>/s_GSINIT/g'  | \
+cat >${FILENAMEOUT}
+#tee ${FILENAME}.s
+fi
+
+#
+if false ; then 
+echo 'A OR B' | \
+sed -e 's/\<OR\>/|/g' | \
+cat
+fi
+
+#sed -e 's/^[[:blank:]]*\([[:alnum:]_]*\)[[:blank:]]*bit[[:blank:]]*\([[:alnum:]_.]*\)/\1=\2 /g' | \
+#sed -e 's/^[[:blank:]]*\([[:alnum:]_]*\)[[:blank:]]*bit[[:blank:]]*\(ul_fl[[:alnum:]_]*\)\.\([0-7]\)/\1=((\2-ul_flg)*8)+\3 /g' | \
diff --git a/ulan/embedded/app/CVS/Entries b/ulan/embedded/app/CVS/Entries
new file mode 100644 (file)
index 0000000..bed6e3d
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.omk/1.3/Thu Nov 22 19:54:58 2007//
+D/ha////
+D/hisc////
+D/template////
+D/u2u////
+D/ulboot////
diff --git a/ulan/embedded/app/CVS/Repository b/ulan/embedded/app/CVS/Repository
new file mode 100644 (file)
index 0000000..0c0fae8
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app
diff --git a/ulan/embedded/app/CVS/Root b/ulan/embedded/app/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/Makefile b/ulan/embedded/app/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/Makefile.omk b/ulan/embedded/app/Makefile.omk
new file mode 100644 (file)
index 0000000..5f6be07
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = hisc u2u ulboot ha
+
diff --git a/ulan/embedded/app/ha/CVS/Entries b/ulan/embedded/app/ha/CVS/Entries
new file mode 100644 (file)
index 0000000..0f218e5
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Thu Nov 22 19:54:58 2007//
+/Makefile.omk/1.1/Thu Nov 22 19:54:58 2007//
+D/light_switch////
diff --git a/ulan/embedded/app/ha/CVS/Repository b/ulan/embedded/app/ha/CVS/Repository
new file mode 100644 (file)
index 0000000..3fa70f9
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/ha
diff --git a/ulan/embedded/app/ha/CVS/Root b/ulan/embedded/app/ha/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/ha/Makefile b/ulan/embedded/app/ha/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/ha/Makefile.omk b/ulan/embedded/app/ha/Makefile.omk
new file mode 100644 (file)
index 0000000..9ccc77e
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = light_switch
+
diff --git a/ulan/embedded/app/ha/light_switch/CVS/Entries b/ulan/embedded/app/ha/light_switch/CVS/Entries
new file mode 100644 (file)
index 0000000..f8962e2
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Thu Nov 22 19:54:58 2007//
+/Makefile.omk/1.2/Wed Dec 26 21:15:55 2007//
+/light_switch.c/1.3/Wed Dec 26 21:15:55 2007//
+/light_switch.h/1.1/Wed Dec 26 21:15:55 2007//
+/light_switchoi.c/1.1/Wed Dec 26 21:15:55 2007//
+/ul_idstr.c/1.1/Thu Nov 22 19:54:58 2007//
+/ul_idstr.h/1.1/Thu Nov 22 19:54:58 2007//
+D
diff --git a/ulan/embedded/app/ha/light_switch/CVS/Repository b/ulan/embedded/app/ha/light_switch/CVS/Repository
new file mode 100644 (file)
index 0000000..bd93448
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/ha/light_switch
diff --git a/ulan/embedded/app/ha/light_switch/CVS/Root b/ulan/embedded/app/ha/light_switch/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/ha/light_switch/Makefile b/ulan/embedded/app/ha/light_switch/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/ha/light_switch/Makefile.omk b/ulan/embedded/app/ha/light_switch/Makefile.omk
new file mode 100644 (file)
index 0000000..e39fb72
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_HA_LIGHT_SWITCH=n
+
+ifeq ($(CONFIG_HA_LIGHT_SWITCH),y)
+
+ULAN_ID=ha_light_switch
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I.
+
+bin_PROGRAMS = light_switch
+light_switch_SOURCES =  light_switch.c light_switchoi.c 
+
+light_switch_SOURCES +=  ul_idstr.c
+light_switch_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+lib_LOADLIBES =  bspbase ul_drv lpciap uloi keyval lpciap_kvpb mach_hal uldy
+
+# This selects linker script
+link_VARIANTS = app
+
+endif #CONFIG_HA_LIGHT_SWITCH
diff --git a/ulan/embedded/app/ha/light_switch/light_switch.c b/ulan/embedded/app/ha/light_switch/light_switch.c
new file mode 100644 (file)
index 0000000..fa7261e
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+    HA LIGHT SWITCH
+*/
+
+#include <stdio.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#include <uldy_base.h>
+#include <keyval_loc.h>
+#include <lpciap_kvpb.h>
+#include <hal_machperiph.h>
+#include "light_switch.h"
+#include "ul_idstr.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+/***********************************/
+// global variables
+kvpb_block_t kvpb_block_global;
+uloi_coninfo_t uloi_coninfo_global;
+ul_dyac_t ul_dyac_global;
+int tled_off;
+
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+ul_dyac_t *ul_dyac=&ul_dyac_global;
+ul_fd_t ul_fd;
+ul_fd_t ul_fd1;
+ul_msginfo msginfo;
+
+/* ulan variables */
+unsigned char ubuff[30];
+unsigned int  DATA uaddr;
+unsigned long DATA usn;
+uchar ustatus;
+
+//object interface variables
+unsigned int oi_led_state;
+
+/****************************************************************************/
+int uloi_led_state_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  if (oi_led_state==1) {
+    SET_OUT_PIN(LED_PORT,LED4_BIT);
+    tled_off=50;
+  }
+  return 1;
+}
+
+/***********************************/
+char ul_save_sn(uint32_t usn)
+{
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  return 0;
+}
+
+/***********************************/
+char ul_save_adr(uint8_t uaddr)
+{
+  unsigned int v=uaddr;
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&v);
+  return 0;
+}
+
+void sys_err()
+{
+  while(1);
+}
+
+int main(void) 
+{
+  int i=0;
+
+  /***********************************/
+  // timer
+  lt_100msec_init();
+
+  /***********************************/
+  //init values
+  tled_off=0;
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(uint8_t CODE*)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  // read data from kvpb
+  uaddr=62;
+  usn=0L;
+  oi_led_state=0;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+
+  //********************
+  // uLan init
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+  ul_fd1=ul_open(NULL,NULL);
+  if (ul_fd1==UL_FD_INVALID) sys_err();    
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+  coninfo->ul_fd=ul_fd;
+  coninfo->ul_fd1=ul_fd1;
+
+  /***********************************/
+  // uLan dyac init
+  uldy_init(ul_dyac,ul_fd,ul_save_sn,ul_save_adr,(char*)ul_idstr,usn);
+
+  //********************
+  // start
+  while (1) {
+
+    /* processing of ulan messages */
+    if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
+          if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)<0) {
+            ul_freemsg(ul_fd);
+          }
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+    
+     if (tled_off) {
+       tled_off--;    
+       if (!tled_off) {
+         CLR_OUT_PIN(LED_PORT,LED4_BIT);
+       }
+     }
+
+      CLR_OUT_PIN(LED_PORT,LED1_BIT);
+      CLR_OUT_PIN(LED_PORT,LED2_BIT);
+      CLR_OUT_PIN(LED_PORT,LED3_BIT);
+      if (i++>2) i=0;
+      switch (i) {
+        case 1:SET_OUT_PIN(LED_PORT,LED1_BIT);break;
+        case 2:SET_OUT_PIN(LED_PORT,LED2_BIT);break;
+        case 3:SET_OUT_PIN(LED_PORT,LED3_BIT);break;
+      };
+
+      /* watchdog */
+     #ifdef WATCHDOG_ENABLED
+      watchdog_feed();
+     #endif /* WATCHDOG_ENABLED */
+    
+      /* ulan stroke */
+     #ifdef SDCC 
+      ul_stroke(ul_fd);
+     #endif
+    }
+  }
+  return 0;
+}
diff --git a/ulan/embedded/app/ha/light_switch/light_switch.h b/ulan/embedded/app/ha/light_switch/light_switch.h
new file mode 100644 (file)
index 0000000..83e1bf6
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _LIGHT_SWITCH_H
+#define _LIGHT_SWITCH_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+extern const uloi_objdes_array_t uloi_objdes_main;
+
+extern unsigned int oi_led_state;
+
+int uloi_led_state_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _LIGHT_SWITCH_H */
+
diff --git a/ulan/embedded/app/ha/light_switch/light_switchoi.c b/ulan/embedded/app/ha/light_switch/light_switchoi.c
new file mode 100644 (file)
index 0000000..ce7c99e
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+    HOMEBELL KEYPAD
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "light_switch.h"
+
+#define I_LED_STATE    200
+
+unsigned status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(LED_STATE,I_LED_STATE,"u2",NULL_CODE,NULL,uloi_led_state_wrfnc,&oi_led_state)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_LED_STATE
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    (uloi_objdes_t **)uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/ha/light_switch/ul_idstr.c b/ulan/embedded/app/ha/light_switch/ul_idstr.c
new file mode 100644 (file)
index 0000000..9387a39
--- /dev/null
@@ -0,0 +1,27 @@
+#include <local_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/ha/light_switch/ul_idstr.h b/ulan/embedded/app/ha/light_switch/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/hisc/CVS/Entries b/ulan/embedded/app/hisc/CVS/Entries
new file mode 100644 (file)
index 0000000..acd76e6
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.omk/1.4/Tue Jun  5 17:48:44 2007//
+D/bell////
+D/blinder////
+D/garage_gate////
+D/heating////
+D/thermometer////
+D/weather_station////
diff --git a/ulan/embedded/app/hisc/CVS/Repository b/ulan/embedded/app/hisc/CVS/Repository
new file mode 100644 (file)
index 0000000..a4047de
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc
diff --git a/ulan/embedded/app/hisc/CVS/Root b/ulan/embedded/app/hisc/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/Makefile b/ulan/embedded/app/hisc/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/Makefile.omk b/ulan/embedded/app/hisc/Makefile.omk
new file mode 100644 (file)
index 0000000..0a8933e
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = heating blinder thermometer weather_station bell garage_gate
+
diff --git a/ulan/embedded/app/hisc/bell/CVS/Entries b/ulan/embedded/app/hisc/bell/CVS/Entries
new file mode 100644 (file)
index 0000000..ed53624
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Sat Dec 30 12:05:53 2006//
+/Makefile.omk/1.2/Sun Apr 29 06:44:53 2007//
+D/home////
+D/keypad////
diff --git a/ulan/embedded/app/hisc/bell/CVS/Repository b/ulan/embedded/app/hisc/bell/CVS/Repository
new file mode 100644 (file)
index 0000000..a0fbd55
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/bell
diff --git a/ulan/embedded/app/hisc/bell/CVS/Root b/ulan/embedded/app/hisc/bell/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/bell/Makefile b/ulan/embedded/app/hisc/bell/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/bell/Makefile.omk b/ulan/embedded/app/hisc/bell/Makefile.omk
new file mode 100644 (file)
index 0000000..26a69ea
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = home keypad
\ No newline at end of file
diff --git a/ulan/embedded/app/hisc/bell/home/CVS/Entries b/ulan/embedded/app/hisc/bell/home/CVS/Entries
new file mode 100644 (file)
index 0000000..2de923d
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Sat Dec 30 12:05:54 2006//
+/Makefile.omk/1.1/Sat Dec 30 12:05:54 2006//
+/homebell.c/1.1/Sat Dec 30 12:05:55 2006//
+/homebell.h/1.1/Sat Dec 30 12:05:55 2006//
+/homebelloi.c/1.1/Sat Dec 30 12:05:55 2006//
+D
diff --git a/ulan/embedded/app/hisc/bell/home/CVS/Repository b/ulan/embedded/app/hisc/bell/home/CVS/Repository
new file mode 100644 (file)
index 0000000..1f10dac
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/bell/home
diff --git a/ulan/embedded/app/hisc/bell/home/CVS/Root b/ulan/embedded/app/hisc/bell/home/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/bell/home/Makefile b/ulan/embedded/app/hisc/bell/home/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/bell/home/Makefile.omk b/ulan/embedded/app/hisc/bell/home/Makefile.omk
new file mode 100644 (file)
index 0000000..52ddd62
--- /dev/null
@@ -0,0 +1,39 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_BELL_HOME=n
+
+ifeq ($(CONFIG_APP_HISC_BELL_HOME),y)
+
+ULAN_ID=homebell
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = ulan_config.h
+
+INCLUDES += -I.
+
+ifeq ($(ARCH),mcs51)
+CFLAGS += -DKEYVAL_START=$(KVPB_BASE) -DKEYVAL_PAGE_LEN=$(KVPB_SIZE)
+endif # ARCH
+
+bin_PROGRAMS = homebell
+homebell_SOURCES =  homebell.c homebelloi.c 
+
+ifeq ($(ARCH),mcs51)
+lib_LOADLIBES =  ulan misc uloi misc mcuflash keyval bspbase
+OUTPUT_FORMATS = bin
+endif
+ifeq ($(ARCH),arm)
+kswtimer_SOURCES +=  ul_idstr.c
+lib_LOADLIBES =  bspbase ul_drv lpciap uloi keyval lpciap_kvpb mach_hal uldy
+kswtimer_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+endif
+
+# This selects linker script
+link_VARIANTS = app
+
+endif # CONFIG_APP_HISC_HOME_BELL
+
diff --git a/ulan/embedded/app/hisc/bell/home/homebell.c b/ulan/embedded/app/hisc/bell/home/homebell.c
new file mode 100644 (file)
index 0000000..6c3fc46
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+    HOME BELL
+*/
+
+#include <system_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#if !defined(SDCC) 
+  #include <keyval_loc.h>
+  #include <lpciap_kvpb.h>
+#endif
+#include <tonegen.h>
+#include "homebell.h"
+
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+/***********************************/
+// global variables
+kvpb_block_t kvpb_block_global;
+uloi_coninfo_t uloi_coninfo_global;
+
+#ifndef UL_WITHOUT_HANDLE
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+ul_fd_t ul_fd;
+ul_fd_t ul_fd1;
+ul_msginfo msginfo;
+#endif /* UL_WITHOUT_HANDLE */
+
+/* ulan variables */
+unsigned int  DATA uaddr;
+unsigned long DATA usn;
+uchar ustatus;
+
+
+const tg_tone_t *code song1[]={
+&tg_do,&tg_re,&tg_mi,&tg_fa,&tg_so,&tg_la,&tg_si,
+&tg_si,&tg_la,&tg_so,&tg_fa,&tg_mi,&tg_re,&tg_do,
+&tg_si,&tg_so,&tg_mi,
+&tg_si,&tg_so,&tg_mi
+};
+
+unsigned char DATA si; /* song index */
+
+//object interface variables
+unsigned int DATA oi_song_play;
+extern unsigned DATA status_val;
+
+int oi_song_play_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  if (oi_song_play) {
+    si=1;
+  } 
+  return 1;
+}
+
+
+void sys_err()
+{
+  while(1);
+}
+
+void main(void) 
+{
+  /***********************************/
+  // timer
+  lt_100msec_init();
+
+  /***********************************/
+  //init values
+  si=0;
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(uint8_t CODE*)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+ #ifndef  KVPB_MINIMALIZED
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+ #endif
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  // read data from kvpb
+  uaddr=62;
+  usn=0L;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+ #ifdef UL_WITH_HANDLE
+  ul_fd1=ul_open(NULL,NULL);
+  if (ul_fd1==UL_FD_INVALID) sys_err();    
+ #endif
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+  coninfo->ul_fd=ul_fd;
+ #ifdef UL_WITH_HANDLE
+  coninfo->ul_fd1=ul_fd1;
+ #endif
+
+  //********************
+  // start
+ #ifdef SDCC 
+  EA=1;       // Enable interrupts
+ #endif
+  while (1) {
+    
+    /* processing of ulan messages */
+    if (ul_acceptmsg(ul_fd, &msginfo)>=0) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
+          ul_freemsg(ul_fd);       
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    /* play the song */
+    if (si!=0) {
+      if ((si==1) || (tg_expired(song1[si-2]->d))) {
+        tg_stop();
+        if (si<=((sizeof(song1)/sizeof(const tg_tone_t *code)))) {
+          tg_start(song1[si-1]->t); 
+          si++;
+        } else 
+          si=0;
+      }
+    }
+
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+
+      /* ulan stroke */
+     #ifdef SDCC 
+      ul_stroke(ul_fd);
+     #endif
+    }
+  }
+}
diff --git a/ulan/embedded/app/hisc/bell/home/homebell.h b/ulan/embedded/app/hisc/bell/home/homebell.h
new file mode 100644 (file)
index 0000000..0359202
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _HOMEBELL_H
+#define _HOMEBELL_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+#include <cpu_def.h>
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+
+extern unsigned int DATA oi_song_play;
+
+int oi_song_play_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _HOMEBELL_H */
+
diff --git a/ulan/embedded/app/hisc/bell/home/homebelloi.c b/ulan/embedded/app/hisc/bell/home/homebelloi.c
new file mode 100644 (file)
index 0000000..2dc5d41
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+    HOME BELL 
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "homebell.h"
+
+#define I_SONG_PLAY 210
+
+
+unsigned DATA status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(SONG_PLAY,I_SONG_PLAY,"u2",NULL_CODE,NULL,oi_song_play_wrfnc,&oi_song_play)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_SONG_PLAY
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/hisc/bell/keypad/CVS/Entries b/ulan/embedded/app/hisc/bell/keypad/CVS/Entries
new file mode 100644 (file)
index 0000000..d30cf30
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Sun Apr 29 06:44:54 2007//
+/Makefile.omk/1.1/Sun Apr 29 06:44:54 2007//
+/keypad.c/1.2/Sat May 26 14:17:52 2007//
+/keypad.h/1.2/Sat May 26 14:17:52 2007//
+/keypadoi.c/1.2/Sat May 26 14:17:52 2007//
+/ul_idstr.c/1.1/Sun Apr 29 06:44:54 2007//
+/ul_idstr.h/1.1/Sun Apr 29 06:44:54 2007//
+D
diff --git a/ulan/embedded/app/hisc/bell/keypad/CVS/Repository b/ulan/embedded/app/hisc/bell/keypad/CVS/Repository
new file mode 100644 (file)
index 0000000..9848b4c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/bell/keypad
diff --git a/ulan/embedded/app/hisc/bell/keypad/CVS/Root b/ulan/embedded/app/hisc/bell/keypad/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/bell/keypad/Makefile b/ulan/embedded/app/hisc/bell/keypad/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/bell/keypad/Makefile.omk b/ulan/embedded/app/hisc/bell/keypad/Makefile.omk
new file mode 100644 (file)
index 0000000..c4966c6
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_BELL_KEYPAD=n
+
+ifeq ($(CONFIG_APP_HISC_BELL_KEYPAD),y)
+
+ULAN_ID=homebell-keypad
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = ulan_config.h
+
+INCLUDES += -I.
+
+bin_PROGRAMS = keypad
+keypad_SOURCES =  keypad.c keypadoi.c 
+
+keypad_SOURCES +=  ul_idstr.c
+lib_LOADLIBES =  kbd bspbase ul_drv lpciap uloi keyval lpciap_kvpb mach_hal uldy
+keypad_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+
+# This selects linker script
+link_VARIANTS = app
+
+endif # CONFIG_APP_HISC_BELL_KEYPAD
+
diff --git a/ulan/embedded/app/hisc/bell/keypad/keypad.c b/ulan/embedded/app/hisc/bell/keypad/keypad.c
new file mode 100644 (file)
index 0000000..625ce07
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+    HOMEBELL KEYPAD
+*/
+
+#include <stdio.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#include <uldy_base.h>
+#if !defined(SDCC) 
+  #include <keyval_loc.h>
+  #include <lpciap_kvpb.h>
+  #include <hal_machperiph.h>
+  #include <kbd.h>
+#endif
+#include "keypad.h"
+#include "ul_idstr.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+LT_TIMER_DEC(lt_1msec)
+LT_TIMER_IMP(lt_1msec)
+
+/***********************************/
+// global variables
+kvpb_block_t kvpb_block_global;
+uloi_coninfo_t uloi_coninfo_global;
+ul_dyac_t ul_dyac_global;
+unsigned char kbuff[30];
+int kbuff_ptr;
+
+#ifndef UL_WITHOUT_HANDLE
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+ul_dyac_t *ul_dyac=&ul_dyac_global;
+ul_fd_t ul_fd;
+ul_fd_t ul_fd1;
+ul_msginfo msginfo;
+#endif /* UL_WITHOUT_HANDLE */
+
+/* ulan variables */
+unsigned char ubuff[30];
+unsigned int  DATA uaddr;
+unsigned long DATA usn;
+uchar ustatus;
+
+//object interface variables
+unsigned int oi_access_code;
+unsigned int oi_ring_sign;
+
+/****************************************************************************/
+int uloi_access_code_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  kvpb_set_key(kvpb_block,KVPB_KEYID_HIS_ACCESS_CODE,sizeof(unsigned int),context);
+  return 1;
+}
+
+/****************************************************************************/
+int uloi_ring_sign_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  int r=uloi_uint_rdfnc(ULOI_ARG_coninfo context);
+  oi_ring_sign=0;
+  return r;
+}
+
+
+/***********************************/
+char ul_save_sn(uint32_t usn)
+{
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  return 0;
+}
+
+/***********************************/
+char ul_save_adr(uint8_t uaddr)
+{
+  unsigned int v=uaddr;
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&v);
+  return 0;
+}
+
+void sys_err()
+{
+  while(1);
+}
+
+int main(void) 
+{
+  kbd_key_t buf;
+  kbd_keymod_t modifiers;
+  kbd_scan_code_t scancode;
+  int r,ring_key,sound_div,tsound,taccess;
+
+  /***********************************/
+  // timer
+  lt_100msec_init();
+  lt_1msec_init();
+
+  /***********************************/
+  //init values
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(uint8_t CODE*)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+ #ifndef  KVPB_MINIMALIZED
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+ #endif
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  // read data from kvpb
+  uaddr=62;
+  usn=0L;
+  oi_access_code=641;
+  oi_ring_sign=0;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_HIS_ACCESS_CODE,sizeof(unsigned int),&oi_access_code);
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+ #ifndef UL_WITHOUT_HANDLE
+  ul_fd1=ul_open(NULL,NULL);
+  if (ul_fd1==UL_FD_INVALID) sys_err();    
+ #endif
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+  coninfo->ul_fd=ul_fd;
+ #ifndef UL_WITHOUT_HANDLE
+  coninfo->ul_fd1=ul_fd1;
+ #endif
+
+  /***********************************/
+  // uLan dyac init
+  uldy_init(ul_dyac,ul_fd,ul_save_sn,ul_save_adr,(char*)ul_idstr,usn);
+
+  //********************
+  // start
+ #ifdef SDCC 
+  EA=1;       // Enable interrupts
+ #endif
+
+  kbd_Open(0);
+  ring_key=0;
+
+  sound_div=0;tsound=0;
+  kbuff_ptr=0;
+  taccess=0;
+  while (1) {
+
+    /* processing of ulan messages */
+    if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
+          if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)<0) {
+            ul_freemsg(ul_fd);
+          }
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    /* keyboard */
+    r=kbd_Read(&buf, &modifiers, &scancode);
+    /* bell */
+    if (((r==1) && (!ring_key)) && ((buf=='A') || (buf=='B') || (buf=='C'))) {
+      oi_ring_sign=1;
+      tsound=50;
+      CLR_OUT_PIN(LED_PORT,P0_30_LED_R);
+      ring_key=1;
+      ubuff[0]=UL_CMD_OISV+1;
+      ubuff[1]=0x41;
+      ubuff[2]=0;
+      ubuff[3]=210;
+      ubuff[4]=0;
+      ubuff[5]=1;
+      ubuff[6]=0;
+      msginfo.cmd=UL_CMD_OISV;
+      msginfo.flg=UL_BFL_SND | UL_BFL_ARQ;
+      msginfo.dadr=40;
+      ul_newmsg(ul_fd,&msginfo);
+      ul_write(ul_fd,ubuff,7);
+      ul_freemsg(ul_fd);
+    }
+    if (((r==2) && (ring_key)) && ((buf=='A') || (buf=='B') || (buf=='C'))) {
+      ring_key=0;
+    }
+    /* all keys */
+    if ((r==1) && (!ring_key)) {
+      tsound=50;
+      CLR_OUT_PIN(LED_PORT,P0_30_LED_R);
+      kbuff[kbuff_ptr]=buf;
+      if (kbuff_ptr<sizeof(kbuff)) kbuff_ptr++;
+      if (buf==13) {
+        int unit,oid,val,ret=0;
+        kbuff[kbuff_ptr]=0;
+       /* test for access command */
+        ret=sscanf(kbuff,"1%d\n",&val);
+        if ((ret==1) && (val==oi_access_code)) {
+          SET_OUT_PIN(OUT_PORT,P1_16_RELE);
+         taccess=5000;
+          CLR_OUT_PIN(LED_PORT,P0_31_LED_G);
+        }
+       /* test for oid value setting command */
+        ret=sscanf(kbuff,"9%d*%d*%d\n",&unit,&oid,&val);
+       if (ret==3) {
+          ubuff[0]=UL_CMD_OISV+1;
+          ubuff[1]=0x41;
+          ubuff[2]=0;
+          ubuff[3]=oid;
+          ubuff[4]=oid>>8;
+          ubuff[5]=val;
+          ubuff[6]=val>>8;
+          msginfo.cmd=UL_CMD_OISV;
+          msginfo.flg=UL_BFL_SND | UL_BFL_ARQ;
+          msginfo.dadr=unit;
+          ul_newmsg(ul_fd,&msginfo);
+          ul_write(ul_fd,ubuff,7);
+          ul_freemsg(ul_fd);
+        }
+        kbuff_ptr=0;
+      }
+    }
+
+    /* 1ms timer */
+    if (lt_1msec_expired(1)) {
+      if (tsound) {
+        tsound--;
+        if (!tsound) {
+          CLR_OUT_PIN(IO0,P0_29_SOUND);
+          SET_OUT_PIN(LED_PORT,P0_30_LED_R);
+        } else {
+          sound_div++;
+          if (sound_div&1) {
+            SET_OUT_PIN(IO0,P0_29_SOUND);
+          } else {
+            CLR_OUT_PIN(IO0,P0_29_SOUND);
+          }
+        }
+      }
+      if (taccess) {
+        taccess--;
+        if (!taccess) {
+          CLR_OUT_PIN(OUT_PORT,P1_16_RELE);
+          SET_OUT_PIN(LED_PORT,P0_31_LED_G);
+        }
+      }
+    }
+
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+
+      /* watchdog */
+     #ifdef WATCHDOG_ENABLED
+      watchdog_feed();
+     #endif /* WATCHDOG_ENABLED */
+    
+      /* ulan stroke */
+     #ifdef SDCC 
+      ul_stroke(ul_fd);
+     #endif
+    }
+  }
+  return 0;
+}
diff --git a/ulan/embedded/app/hisc/bell/keypad/keypad.h b/ulan/embedded/app/hisc/bell/keypad/keypad.h
new file mode 100644 (file)
index 0000000..b2573b8
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _KEYPAD_H
+#define _KEYPAD_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+extern const uloi_objdes_array_t uloi_objdes_main;
+
+extern unsigned int oi_access_code;
+extern unsigned int oi_ring_sign;
+
+int uloi_access_code_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_ring_sign_rdfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _KEYPAD_H */
+
diff --git a/ulan/embedded/app/hisc/bell/keypad/keypadoi.c b/ulan/embedded/app/hisc/bell/keypad/keypadoi.c
new file mode 100644 (file)
index 0000000..f1003b0
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+    HOMEBELL KEYPAD
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "keypad.h"
+
+#define I_ACCESS_CODE  200
+#define I_RING_SIGN    210
+
+unsigned status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(ACCESS_CODE,I_ACCESS_CODE,"u2",uloi_uint_rdfnc,&oi_access_code,uloi_access_code_wrfnc,&oi_access_code)
+ULOI_GENOBJDES(RING_SIGN,I_RING_SIGN,"u2",uloi_ring_sign_rdfnc,&oi_ring_sign,NULL_CODE,NULL)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_ACCESS_CODE,
+  &uloid_objdes_RING_SIGN
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    (uloi_objdes_t **)uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/hisc/bell/keypad/ul_idstr.c b/ulan/embedded/app/hisc/bell/keypad/ul_idstr.c
new file mode 100644 (file)
index 0000000..3c13d6c
--- /dev/null
@@ -0,0 +1,27 @@
+#include <ulan_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/hisc/bell/keypad/ul_idstr.h b/ulan/embedded/app/hisc/bell/keypad/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/hisc/blinder/CVS/Entries b/ulan/embedded/app/hisc/blinder/CVS/Entries
new file mode 100644 (file)
index 0000000..475cf60
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.omk/1.8/Wed Nov 22 19:32:15 2006//
+/blinder.c/1.17/Wed Nov 22 19:32:15 2006//
+/blinder.h/1.4/Wed Nov 22 19:32:15 2006//
+/blinderoi.c/1.7/Wed Nov 22 19:32:15 2006//
+D
diff --git a/ulan/embedded/app/hisc/blinder/CVS/Repository b/ulan/embedded/app/hisc/blinder/CVS/Repository
new file mode 100644 (file)
index 0000000..1df52b8
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/blinder
diff --git a/ulan/embedded/app/hisc/blinder/CVS/Root b/ulan/embedded/app/hisc/blinder/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/blinder/Makefile b/ulan/embedded/app/hisc/blinder/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/blinder/Makefile.omk b/ulan/embedded/app/hisc/blinder/Makefile.omk
new file mode 100644 (file)
index 0000000..303ee90
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_BLINDER=n
+
+ifeq ($(CONFIG_APP_HISC_BLINDER),y)
+
+CFLAGS += -DKVPB_BASE=$(KVPB_BASE) -DKVPB_SIZE=$(KVPB_SIZE) 
+
+bin_PROGRAMS = blinder
+blinder_SOURCES =  blinder.c blinderoi.c
+lib_LOADLIBES =  ulan misc mcuflash keyval uloi bspbase
+
+# This selects linker script 
+LD_SCRIPT = $(BOARD)
+DEFAULT_LD_SCRIPT_VARIANT = flash
+
+OUTPUT_FORMATS = bin
+
+endif #CONFIG_APP_HISC_BLINDER
+
diff --git a/ulan/embedded/app/hisc/blinder/blinder.c b/ulan/embedded/app/hisc/blinder/blinder.c
new file mode 100644 (file)
index 0000000..ac93545
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+    BLINDER
+*/
+
+#include <system_def.h>
+#include <ul_lib/ulan.h>
+#include <vect.h>
+#include <keyval_id.h>
+#include <keyval_id_his.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#include "blinder.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+uloi_coninfo_t uloi_coninfo_global;
+kvpb_block_t kvpb_block_global;
+
+#ifndef UL_WITHOUT_HANDLE
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+ul_msginfo msginfo;
+#endif  /*UL_WITHOUT_HANDLE*/
+
+//ulan variables
+unsigned int DATA uaddr;
+unsigned long DATA usn;
+//timers
+uint8_t DATA tnew_cmd;
+int DATA tblinder_off,tblinder_off_start,tblinder_off_extra;
+//blinder variables
+uint16_t DATA new_bl_pos;
+
+//object interface variables
+unsigned int DATA oi_lighting;
+unsigned int DATA oi_bl_pos;
+unsigned int DATA oi_open_time;
+unsigned int DATA oi_bl_stop;
+unsigned int DATA oi_blp_enabled;
+unsigned int DATA oi_blp_up;
+unsigned int DATA oi_blp_down;
+
+void bl_set_pos(uint8_t pos)
+{
+  new_bl_pos=pos;
+  if (new_bl_pos>100) new_bl_pos=100;
+  if (tnew_cmd==0) {
+    OUTB(OUT_PORT,0xff); //stop
+    tnew_cmd=10;
+    if (tblinder_off)   //set new actual possition when blinder was runnig
+      oi_bl_pos+=(100*(tblinder_off_start-tblinder_off))/oi_open_time;
+    tblinder_off_extra=0;
+  }
+}
+
+int oi_bl_pos_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uint16_t npos;
+  uloi_uint_wrfnc(ULOI_ARG_coninfo &npos);
+  bl_set_pos(npos);
+  return 1;
+}
+
+int oi_open_time_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  kvpb_set_key(kvpb_block,KVPB_KEYID_BLINDER_OPENTIME,sizeof(unsigned int),context);
+  return 1;
+}
+
+int oi_blp_up_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  kvpb_set_key(kvpb_block,KVPB_KEYID_BLP_UP,sizeof(unsigned int),context);
+  return 1;
+}
+
+int oi_blp_down_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  kvpb_set_key(kvpb_block,KVPB_KEYID_BLP_DOWN,sizeof(unsigned int),context);
+  return 1;
+}
+
+void main(void) 
+{
+  uint16_t DATA blp_last;
+
+  /***********************************/
+  // timers 
+  lt_100msec_init();
+
+  /***********************************/
+  //init values
+  tblinder_off=0;
+  tblinder_off_extra=0;
+  tnew_cmd=0;
+  uaddr=25;
+  usn=0L;
+  oi_bl_pos=0;
+  oi_open_time=160;
+  oi_bl_stop=0;
+  oi_blp_enabled=1;
+  oi_blp_up=0;
+  oi_blp_down=0;
+  blp_last=0xffff; //impossible value
+
+  //********************
+  // kvpb init
+  kvpb_block->base=(CODE uint8_t*)KVPB_BASE;
+  kvpb_block->size=KVPB_SIZE;
+  kvpb_block->flags=KVPB_DESC_DOUBLE;
+  if(kvpb_check(kvpb_block,1)<0) 
+    while(1);
+
+  // read data from kvpb
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_BLINDER_POSSITION,sizeof(unsigned int),&oi_bl_pos);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_BLINDER_OPENTIME,sizeof(unsigned int),&oi_open_time);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_BLP_UP,sizeof(unsigned int),&oi_blp_up);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_BLP_DOWN,sizeof(unsigned int),&oi_blp_down);
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) while(1);    
+  ul_setmyadr(ul_fd,uaddr);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+
+  //********************
+  // start
+ #ifdef SDCC
+  EA=1;         // Enable interrupt
+ #endif
+  while (1) {
+    
+    /* processing of ulan messages */
+    if (ul_acceptmsg(ul_fd, &msginfo)>=0) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo &uloi_objdes_main, &msginfo)<0) {
+          ul_freemsg(ul_fd);
+        } 
+      } else {
+        ul_freemsg(ul_fd);
+      }
+    }
+    
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+
+      /* ulan stroke */
+      ul_stroke(ul_fd);
+
+      /* timers */
+      if (tblinder_off!=0) {
+        if (tblinder_off>0) tblinder_off--;
+        else tblinder_off++;
+        if (tblinder_off==0) {
+          oi_bl_pos=new_bl_pos;
+          kvpb_set_key(kvpb_block,KVPB_KEYID_BLINDER_POSSITION,2,&oi_bl_pos);
+          if (tblinder_off_extra==0) {
+            OUTB(OUT_PORT,0xff); //stop
+            LED_GP=1;
+          }
+        }
+      } else {
+        if (tblinder_off_extra) {
+          if (tblinder_off_extra>0) tblinder_off_extra--;
+          else tblinder_off_extra++;
+          if (tblinder_off_extra==0) {
+            OUTB(OUT_PORT,0xff); //stop
+            LED_GP=1;
+          }
+        }
+      }
+
+      /* stop command */
+      if (oi_bl_stop) {
+        oi_bl_stop=0;
+        if (tblinder_off) {   //set new actual possition when blinder was running
+          oi_bl_pos+=(100*(tblinder_off_start-tblinder_off))/oi_open_time;
+          tblinder_off=0;
+          kvpb_set_key(kvpb_block,KVPB_KEYID_BLINDER_POSSITION,2,&oi_bl_pos);
+        }
+        tblinder_off_extra=0;
+        OUTB(OUT_PORT,0xff); //stop
+        LED_GP=1;
+      }
+
+      /* new possition */
+      if (tnew_cmd) {
+        tnew_cmd--;
+        if (!tnew_cmd) {
+          tblinder_off=((int16_t)(new_bl_pos-oi_bl_pos)*(int16_t)oi_open_time)/100;
+          tblinder_off_start=tblinder_off;
+          if (new_bl_pos==100)
+            tblinder_off_extra=30;
+          if (new_bl_pos==0)
+            tblinder_off_extra=-30;
+          /* set outputs */
+          if ((tblinder_off>0) || (tblinder_off_extra>0)) 
+            OUTB(OUT_PORT,0x7f);     //close
+          if ((tblinder_off<0) || (tblinder_off_extra<0))
+            OUTB(OUT_PORT,0xfe);     //open
+          if ((tblinder_off) || (tblinder_off_extra))
+            LED_GP=0;
+        }
+      }
+
+      /* blps */
+      if ((!tblinder_off_extra) && (!tblinder_off) && 
+          (!tnew_cmd) && (oi_lighting) && (oi_blp_enabled)) {
+        uint8_t DATA blp;
+        uint8_t DATA l;
+
+        if (oi_blp_up) {
+          l=oi_blp_up>>8;
+          blp=oi_blp_up;
+          if (oi_lighting>l) {
+            if (blp!=blp_last) { 
+              blp_last=blp;
+              bl_set_pos(blp);
+            }
+          }
+        }
+
+        if (oi_blp_down) {
+          l=oi_blp_down>>8;
+          blp=oi_blp_down;
+          if (oi_lighting<l) {
+            if (blp!=blp_last) { 
+              blp_last=blp;
+              bl_set_pos(blp);
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/ulan/embedded/app/hisc/blinder/blinder.h b/ulan/embedded/app/hisc/blinder/blinder.h
new file mode 100644 (file)
index 0000000..9ba5e85
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _BLINDER_H
+#define _BLINDER_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+#include <cpu_def.h>
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+extern unsigned int DATA oi_lighting;
+extern unsigned int DATA oi_bl_pos;
+extern unsigned int DATA oi_open_time;
+extern unsigned int DATA oi_bl_stop;
+extern unsigned int DATA oi_blp_enabled;
+extern unsigned int DATA oi_blp_up;
+extern unsigned int DATA oi_blp_down;
+
+int oi_bl_pos_wrfnc(ULOI_PARAM_coninfo void *context);
+int oi_open_time_wrfnc(ULOI_PARAM_coninfo void *context);
+int oi_blp_up_wrfnc(ULOI_PARAM_coninfo void *context);
+int oi_blp_down_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _BLINDER_H */
+
diff --git a/ulan/embedded/app/hisc/blinder/blinderoi.c b/ulan/embedded/app/hisc/blinder/blinderoi.c
new file mode 100644 (file)
index 0000000..509c8b1
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+    OBJECT INTERFACE FOR BLINDER
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "blinder.h"
+
+#define I_LIGHTING 230
+#define I_BLINDER_POSSITION 240
+#define I_BLINDER_STOP 241
+#define I_OPEN_TIME 242
+#define I_BLP_ENABLED 245       /* BLINDER LIGHTING POSSITION */
+#define I_BLP_UP 246           
+#define I_BLP_DOWN 247
+
+uint16_t status_val;
+
+int uloi_int_rdfnc1(int *context);
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,(void*)&status_val)
+ULOI_GENOBJDES(LIGHTING,I_LIGHTING,"u2",NULL_CODE,NULL,uloi_uint_wrfnc,&oi_lighting)
+ULOI_GENOBJDES(BLINDER_POSSITION,I_BLINDER_POSSITION,"u2",uloi_uint_rdfnc,&oi_bl_pos,oi_bl_pos_wrfnc,&oi_bl_pos)
+ULOI_GENOBJDES(BLINDER_STOP,I_BLINDER_STOP,"u2",NULL_CODE,NULL,uloi_uint_wrfnc,&oi_bl_stop)
+ULOI_GENOBJDES(OPEN_TIME,I_OPEN_TIME,"u2",uloi_uint_rdfnc,&oi_open_time,oi_open_time_wrfnc,&oi_open_time)
+ULOI_GENOBJDES(BLP_ENABLED,I_BLP_ENABLED,"u2",uloi_uint_rdfnc,&oi_blp_enabled,uloi_uint_wrfnc,&oi_blp_enabled)
+ULOI_GENOBJDES(BLP_UP,I_BLP_UP,"u2",uloi_uint_rdfnc,&oi_blp_up,oi_blp_up_wrfnc,&oi_blp_up)
+ULOI_GENOBJDES(BLP_DOWN,I_BLP_DOWN,"u2",uloi_uint_rdfnc,&oi_blp_down,oi_blp_down_wrfnc,&oi_blp_down)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_LIGHTING,
+  &uloid_objdes_BLINDER_POSSITION,
+  &uloid_objdes_BLINDER_STOP,
+  &uloid_objdes_OPEN_TIME,
+  &uloid_objdes_BLP_ENABLED,
+  &uloid_objdes_BLP_UP,
+  &uloid_objdes_BLP_DOWN
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
+
+
diff --git a/ulan/embedded/app/hisc/garage_gate/CVS/Entries b/ulan/embedded/app/hisc/garage_gate/CVS/Entries
new file mode 100644 (file)
index 0000000..7c8e2a5
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Tue Jun  5 17:48:44 2007//
+/Makefile.omk/1.1/Tue Jun  5 17:48:44 2007//
+/garage_gate.c/1.1/Tue Jun  5 17:48:44 2007//
+/garage_gate.h/1.1/Tue Jun  5 17:48:44 2007//
+/garage_gateoi.c/1.1/Tue Jun  5 17:48:44 2007//
+/ul_idstr.c/1.1/Tue Jun  5 17:48:44 2007//
+/ul_idstr.h/1.1/Tue Jun  5 17:48:44 2007//
+D
diff --git a/ulan/embedded/app/hisc/garage_gate/CVS/Repository b/ulan/embedded/app/hisc/garage_gate/CVS/Repository
new file mode 100644 (file)
index 0000000..d4f911e
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/garage_gate
diff --git a/ulan/embedded/app/hisc/garage_gate/CVS/Root b/ulan/embedded/app/hisc/garage_gate/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/garage_gate/Makefile b/ulan/embedded/app/hisc/garage_gate/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/garage_gate/Makefile.omk b/ulan/embedded/app/hisc/garage_gate/Makefile.omk
new file mode 100644 (file)
index 0000000..281a7bb
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_GARAGE_GATE=n
+
+ifeq ($(CONFIG_APP_HISC_GARAGE_GATE),y)
+
+ULAN_ID=garage-gate
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = ulan_config.h
+
+INCLUDES += -I.
+
+bin_PROGRAMS = garage_gate
+garage_gate_SOURCES =  garage_gate.c garage_gateoi.c 
+
+garage_gate_SOURCES +=  ul_idstr.c
+garage_gate_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+lib_LOADLIBES =  bspbase ul_drv lpciap uloi keyval lpciap_kvpb mach_hal uldy
+
+# This selects linker script
+link_VARIANTS = app
+
+endif # CONFIG_APP_HISC_GARAGE_GATE
+
diff --git a/ulan/embedded/app/hisc/garage_gate/garage_gate.c b/ulan/embedded/app/hisc/garage_gate/garage_gate.c
new file mode 100644 (file)
index 0000000..08307f4
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+    GARAGE GATE
+*/
+
+#include <stdio.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#include <uldy_base.h>
+#if !defined(SDCC) 
+  #include <keyval_loc.h>
+  #include <lpciap_kvpb.h>
+  #include <hal_machperiph.h>
+#endif
+#include "garage_gate.h"
+#include "ul_idstr.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+/***********************************/
+// global variables
+kvpb_block_t kvpb_block_global;
+uloi_coninfo_t uloi_coninfo_global;
+ul_dyac_t ul_dyac_global;
+int tgate_off;
+
+#ifndef UL_WITHOUT_HANDLE
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+ul_dyac_t *ul_dyac=&ul_dyac_global;
+ul_fd_t ul_fd;
+ul_fd_t ul_fd1;
+ul_msginfo msginfo;
+#endif /* UL_WITHOUT_HANDLE */
+
+/* ulan variables */
+unsigned char ubuff[30];
+unsigned int  DATA uaddr;
+unsigned long DATA usn;
+uchar ustatus;
+
+//object interface variables
+unsigned int oi_gate_open;
+
+/****************************************************************************/
+int uloi_gate_open_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo context);
+  if (oi_gate_open==1) {
+    CLR_OUT_PIN(OUT_PORT,P1_26_GATE);
+    tgate_off=5;
+  }
+  return 1;
+}
+
+/***********************************/
+char ul_save_sn(uint32_t usn)
+{
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  return 0;
+}
+
+/***********************************/
+char ul_save_adr(uint8_t uaddr)
+{
+  unsigned int v=uaddr;
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&v);
+  return 0;
+}
+
+void sys_err()
+{
+  while(1);
+}
+
+int main(void) 
+{
+
+  /***********************************/
+  // timer
+  lt_100msec_init();
+
+  /***********************************/
+  //init values
+  tgate_off=0;
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(uint8_t CODE*)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+ #ifndef  KVPB_MINIMALIZED
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+ #endif
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  // read data from kvpb
+  uaddr=62;
+  usn=0L;
+  oi_gate_open=0;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+ #ifndef UL_WITHOUT_HANDLE
+  ul_fd1=ul_open(NULL,NULL);
+  if (ul_fd1==UL_FD_INVALID) sys_err();    
+ #endif
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+  coninfo->ul_fd=ul_fd;
+ #ifndef UL_WITHOUT_HANDLE
+  coninfo->ul_fd1=ul_fd1;
+ #endif
+
+  /***********************************/
+  // uLan dyac init
+  uldy_init(ul_dyac,ul_fd,ul_save_sn,ul_save_adr,(char*)ul_idstr,usn);
+
+  //********************
+  // start
+ #ifdef SDCC 
+  EA=1;       // Enable interrupts
+ #endif
+
+  while (1) {
+
+    /* processing of ulan messages */
+    if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
+          if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)<0) {
+            ul_freemsg(ul_fd);
+          }
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+    
+     if (tgate_off) {
+       tgate_off--;    
+       if (!tgate_off) {
+         SET_OUT_PIN(OUT_PORT,P1_26_GATE);
+       }
+     }
+
+      /* watchdog */
+     #ifdef WATCHDOG_ENABLED
+      watchdog_feed();
+     #endif /* WATCHDOG_ENABLED */
+    
+      /* ulan stroke */
+     #ifdef SDCC 
+      ul_stroke(ul_fd);
+     #endif
+    }
+  }
+  return 0;
+}
diff --git a/ulan/embedded/app/hisc/garage_gate/garage_gate.h b/ulan/embedded/app/hisc/garage_gate/garage_gate.h
new file mode 100644 (file)
index 0000000..8a54d85
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _KEYPAD_H
+#define _KEYPAD_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+extern const uloi_objdes_array_t uloi_objdes_main;
+
+extern unsigned int oi_gate_open;
+
+int uloi_gate_open_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _KEYPAD_H */
+
diff --git a/ulan/embedded/app/hisc/garage_gate/garage_gateoi.c b/ulan/embedded/app/hisc/garage_gate/garage_gateoi.c
new file mode 100644 (file)
index 0000000..65557a5
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+    HOMEBELL KEYPAD
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "garage_gate.h"
+
+#define I_GATE_OPEN    200
+
+unsigned status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(GATE_OPEN,I_GATE_OPEN,"u2",NULL_CODE,NULL,uloi_gate_open_wrfnc,&oi_gate_open)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_GATE_OPEN
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    (uloi_objdes_t **)uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/hisc/garage_gate/ul_idstr.c b/ulan/embedded/app/hisc/garage_gate/ul_idstr.c
new file mode 100644 (file)
index 0000000..3c13d6c
--- /dev/null
@@ -0,0 +1,27 @@
+#include <ulan_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/hisc/garage_gate/ul_idstr.h b/ulan/embedded/app/hisc/garage_gate/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/hisc/heating/CVS/Entries b/ulan/embedded/app/hisc/heating/CVS/Entries
new file mode 100644 (file)
index 0000000..13230bc
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Mon Oct  3 12:43:22 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:22 2005//
+D/kswtimer////
diff --git a/ulan/embedded/app/hisc/heating/CVS/Repository b/ulan/embedded/app/hisc/heating/CVS/Repository
new file mode 100644 (file)
index 0000000..bfc7b55
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/heating
diff --git a/ulan/embedded/app/hisc/heating/CVS/Root b/ulan/embedded/app/hisc/heating/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/heating/Makefile b/ulan/embedded/app/hisc/heating/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/heating/Makefile.omk b/ulan/embedded/app/hisc/heating/Makefile.omk
new file mode 100644 (file)
index 0000000..f0985f5
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = kswtimer
+
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/CVS/Entries b/ulan/embedded/app/hisc/heating/kswtimer/CVS/Entries
new file mode 100644 (file)
index 0000000..638681c
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Mon Oct  3 12:43:23 2005//
+/Makefile.omk/1.8/Sat Dec 30 11:50:20 2006//
+/kswtimer.c/1.10/Wed Nov 22 19:32:15 2006//
+/kswtimer.h/1.3/Wed Nov 22 19:32:15 2006//
+/kswtimeroi.c/1.2/Sat Mar 25 20:34:43 2006//
+/ul_idstr.c/1.1/Thu Nov  9 23:18:51 2006//
+/ul_idstr.h/1.1/Thu Nov  9 23:18:51 2006//
+D
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/CVS/Repository b/ulan/embedded/app/hisc/heating/kswtimer/CVS/Repository
new file mode 100644 (file)
index 0000000..c90b4c2
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/heating/kswtimer
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/CVS/Root b/ulan/embedded/app/hisc/heating/kswtimer/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/Makefile b/ulan/embedded/app/hisc/heating/kswtimer/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/Makefile.omk b/ulan/embedded/app/hisc/heating/kswtimer/Makefile.omk
new file mode 100644 (file)
index 0000000..f4dffb9
--- /dev/null
@@ -0,0 +1,38 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_HEATING_KSWTIMER=n
+
+ifeq ($(CONFIG_APP_HISC_HEATING_KSWTIMER),y)
+
+ULAN_ID=hisc-kswtimer
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = ulan_config.h
+
+INCLUDES += -I.
+
+ifeq ($(ARCH),mcs51)
+CFLAGS += -DKEYVAL_START=$(KVPB_BASE) -DKEYVAL_PAGE_LEN=$(KVPB_SIZE)
+endif # ARCH
+
+bin_PROGRAMS = kswtimer
+kswtimer_SOURCES =  kswtimer.c kswtimeroi.c 
+
+ifeq ($(ARCH),mcs51)
+lib_LOADLIBES =  ulan misc uloi misc mcuflash keyval bspbase
+endif
+ifeq ($(ARCH),arm)
+kswtimer_SOURCES +=  ul_idstr.c
+lib_LOADLIBES =  bspbase ul_drv lpciap uloi keyval lpciap_kvpb mach_hal uldy
+kswtimer_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+endif
+
+# This selects linker script
+link_VARIANTS = app
+
+endif # CONFIG_APP_HISC_HEATING_KSWTIMER
+
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/kswtimer.c b/ulan/embedded/app/hisc/heating/kswtimer/kswtimer.c
new file mode 100644 (file)
index 0000000..992c758
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+    KETTLE SWITCH TIMER
+*/
+
+#include <system_def.h>
+#include <cpu_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <uloi_base.h>
+#include <lt_timer.h>
+#if !defined(SDCC) 
+  #include <keyval_loc.h>
+  #include <lpciap_kvpb.h>
+#endif
+#include "kswtimer.h"
+#include "ul_idstr.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+/***********************************/
+// global variables
+kvpb_block_t kvpb_block_global;
+uloi_coninfo_t uloi_coninfo_global;
+
+#ifndef UL_WITHOUT_HANDLE
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+ul_fd_t ul_fd;
+ul_fd_t ul_fd1;
+ul_msginfo msginfo;
+#endif /* UL_WITHOUT_HANDLE */
+
+/* ulan variables */
+unsigned int  DATA uaddr;
+unsigned long DATA usn;
+uchar ustatus;
+
+//object interface variables
+unsigned int oi_cp_val;
+
+int oi_cp_val_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_uint_wrfnc(ULOI_ARG_coninfo &oi_cp_val);
+  if (oi_cp_val) { 
+    CLR_OUT_PIN(OUT_PORT,OUT_CYCLE_PUMP);
+    CLR_OUT_PIN(LED_PORT,LED_GP);
+  } else {
+    SET_OUT_PIN(OUT_PORT,OUT_CYCLE_PUMP);
+    SET_OUT_PIN(LED_PORT,LED_GP);
+  }
+  return 1;
+}
+
+
+void sys_err()
+{
+  while(1);
+}
+
+void main(void) 
+{
+
+  /***********************************/
+  // timer
+  lt_100msec_init();
+
+  /***********************************/
+  //init values
+  oi_cp_val=0;
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(uint8_t CODE*)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+ #ifndef  KVPB_MINIMALIZED
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+ #endif
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  // read data from kvpb
+  uaddr=62;
+  usn=0L;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+ #ifdef UL_WITH_HANDLE
+  ul_fd1=ul_open(NULL,NULL);
+  if (ul_fd1==UL_FD_INVALID) sys_err();    
+ #endif
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+  coninfo->ul_fd=ul_fd;
+ #ifdef UL_WITH_HANDLE
+  coninfo->ul_fd1=ul_fd1;
+ #endif
+
+  //********************
+  // start
+ #ifdef SDCC 
+  EA=1;       // Enable interrupts
+ #endif
+  while (1) {
+    
+    /* processing of ulan messages */
+    if (ul_acceptmsg(ul_fd, &msginfo)>=0) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
+          ul_freemsg(ul_fd);       
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+
+      /* ulan stroke */
+     #ifdef SDCC 
+      ul_stroke(ul_fd);
+     #endif
+    }
+  }
+}
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/kswtimer.h b/ulan/embedded/app/hisc/heating/kswtimer/kswtimer.h
new file mode 100644 (file)
index 0000000..cea5aaa
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _KSWTIMER_H
+#define _KSWTIMER_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+extern unsigned int oi_cp_val;
+
+int oi_cp_val_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _KSWTIMER_H */
+
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/kswtimeroi.c b/ulan/embedded/app/hisc/heating/kswtimer/kswtimeroi.c
new file mode 100644 (file)
index 0000000..3f7711e
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+    KETTLE SWITCH TIMER
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "kswtimer.h"
+
+#define I_CYCLE_PUMP 230
+
+unsigned status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(CYCLE_PUMP,I_CYCLE_PUMP,"u2",uloi_uint_rdfnc,&oi_cp_val,oi_cp_val_wrfnc,&oi_cp_val)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_CYCLE_PUMP
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.c b/ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.c
new file mode 100644 (file)
index 0000000..3c13d6c
--- /dev/null
@@ -0,0 +1,27 @@
+#include <ulan_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.h b/ulan/embedded/app/hisc/heating/kswtimer/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/hisc/thermometer/CVS/Entries b/ulan/embedded/app/hisc/thermometer/CVS/Entries
new file mode 100644 (file)
index 0000000..bc9a5f0
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:23 2005//
+/Makefile.omk/1.3/Wed Nov 22 19:32:15 2006//
+/msc_adc.c/1.1/Fri Oct  7 12:58:02 2005//
+/thermometer.c/1.1/Mon Oct  3 12:43:23 2005//
+D
diff --git a/ulan/embedded/app/hisc/thermometer/CVS/Repository b/ulan/embedded/app/hisc/thermometer/CVS/Repository
new file mode 100644 (file)
index 0000000..4c1af5f
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/thermometer
diff --git a/ulan/embedded/app/hisc/thermometer/CVS/Root b/ulan/embedded/app/hisc/thermometer/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/thermometer/Makefile b/ulan/embedded/app/hisc/thermometer/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/thermometer/Makefile.omk b/ulan/embedded/app/hisc/thermometer/Makefile.omk
new file mode 100644 (file)
index 0000000..88dba97
--- /dev/null
@@ -0,0 +1,21 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_THERMOMETR=n
+
+ifeq ($(CONFIG_APP_HISC_THERMOMETR),y) 
+
+bin_PROGRAMS = thermometer
+thermometer_SOURCES = thermometer.c
+
+lib_LOADLIBES = uloi ulan
+ifeq ($(ARCH),mcs51) 
+lib_LOADLIBES += misc
+endif #ARCH
+
+# This selects linker script 
+LD_SCRIPT = $(BOARD)
+DEFAULT_LD_SCRIPT_VARIANT = flash
+
+OUTPUT_FORMATS = bin
+
+endif #CONFIG_APP_HISC_THERMOMETR
diff --git a/ulan/embedded/app/hisc/thermometer/msc_adc.c b/ulan/embedded/app/hisc/thermometer/msc_adc.c
new file mode 100644 (file)
index 0000000..6e60690
--- /dev/null
@@ -0,0 +1,81 @@
+#include "reg1210.h"
+#include "ul_histb.h"
+
+static
+bit msc_adc_ready(void)
+{
+   return AIE&0x20; 
+}
+
+static
+long msc_adc_unipolar(void)
+{
+  #pragma asm
+       mov     r4,#0
+       mov     r5,ADRESH
+       mov     r6,ADRESM
+       mov     r7,ADRESL
+  #pragma endasm
+}
+
+static
+long msc_adc_bipolar(void)
+{
+  #pragma asm
+        mov     a,ADRESH
+        mov     r5,a
+       mov     c,acc.7
+       subb    a,acc
+        mov     r4,a
+        mov     r6,ADRESM
+        mov     r7,ADRESL
+  #pragma endasm
+}
+
+long msc_adc_summer(void)
+{
+  #pragma asm
+        mov     r4,SUMR3
+        mov     r5,SUMR2
+        mov     r6,SUMR1
+        mov     r7,SUMR0
+  #pragma endasm
+}
+
+
+#include <stdio.h>
+
+int msc_adc_init(void)
+{
+  PDCON &= 0x0f7;      //turn on adc
+                       // ACLK min 32
+  ACLK = 15;           // ACLK = 18.432MHz/(1+1)= 0.9216MHz
+  
+  // max 2047          // Data Rate = (ACLK + 1)/64/DECIMATION
+  DECIMATION = 1800;   // Data Rate = 18.432/2/64/14400 = 10.00Hz
+
+  //         7   6    5      4     3    2    1    0
+  // ADCON0  -   BOD  EVREF  VREFH EBUF PGA2 PGA1 PGA0
+  ADCON0 = 0x20;       // Vref on 1.25V, Buff on, BOD off, PGA 1
+
+  //       7    6    5    4    3    2    1    0
+  // ADMUX INP3 INP2 INP1 INP0 INN3 INN2 INN1 INN0
+  // 0-7 inputs, 8 AINCOM, 0xFF Temperature
+  ADMUX = 0x01;                // differencial AIN0-AIN1
+
+  //         7  6   5   4   3   2    1    0
+  // ADCON1  -  POL SM1 SM0 -   CAL2 CAL1 CAL0
+  ADCON1 = 0x01;       // bipolar, auto, self calibration, offset
+
+  return 0;
+}
+
+long msc_adc_test(void)
+{
+  long result;
+  while(!msc_adc_ready());
+  result=msc_adc_bipolar();
+  //printf("ADC: %08lx\n",result);
+  printf("%08ld\n",result);
+  return result;
+}
diff --git a/ulan/embedded/app/hisc/thermometer/thermometer.c b/ulan/embedded/app/hisc/thermometer/thermometer.c
new file mode 100644 (file)
index 0000000..8d01fe1
--- /dev/null
@@ -0,0 +1,109 @@
+#include <string.h>
+#include <uloi_base.h>
+#ifdef UL_WITHOUT_HANDLE
+#include <system_def.h>
+#endif  /*UL_WITHOUT_HANDLE*/
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+
+#define I_TEST 230
+
+unsigned status_val=0x1234;
+int test_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  if(status_val<0)
+    status_val=0;
+  else
+    status_val++;
+  return 1;
+}
+
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(TEST,I_TEST,"s2",uloi_uint_rdfnc,&test_val,uloi_uint_wrfnc,&test_val)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_TEST
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
+
+
+uloi_coninfo_t uloi_coninfo_global;
+
+int main()
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+  ul_msginfo msginfo;
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_set_adr(3);
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+  ul_drv_init();
+  ul_fd=ul_open(0,0);
+  EA=1;   // Enable interrupts
+ #else  /*UL_WITHOUT_HANDLE*/
+  coninfo->ul_fd=ul_open(NULL,NULL);
+  if(coninfo->ul_fd==UL_FD_INVALID)
+    return 1;
+  coninfo->ul_fd1=ul_open(NULL,NULL);
+  if(coninfo->ul_fd1==UL_FD_INVALID){
+    ul_close(coninfo->ul_fd1);
+    return 1;
+  }
+  memset(&msginfo, 0, sizeof(msginfo));
+  msginfo.cmd=UL_CMD_OISV;
+  ul_addfilt(coninfo->ul_fd, &msginfo);
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+
+  while(1){
+  
+    if((ul_inepoll(coninfo->ul_fd)>0)||(ul_fd_wait(coninfo->ul_fd,100)>0)){
+      uloi_process_msg(ULOI_ARG_coninfo &uloi_objdes_main, NULL);
+    }
+  }
+}
diff --git a/ulan/embedded/app/hisc/weather_station/CVS/Entries b/ulan/embedded/app/hisc/weather_station/CVS/Entries
new file mode 100644 (file)
index 0000000..f661f0d
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Sat Jan 14 19:16:58 2006//
+/Makefile.omk/1.4/Wed Nov 22 19:32:15 2006//
+/kty.c/1.1/Wed Feb  1 20:46:58 2006//
+/kty.h/1.1/Wed Feb  1 20:46:58 2006//
+/weather_station.c/1.8/Fri Jun 15 12:43:20 2007//
+/weather_station.h/1.3/Fri Jun 15 12:43:20 2007//
+/weather_stationoi.c/1.3/Fri Jun 15 12:43:20 2007//
+D
diff --git a/ulan/embedded/app/hisc/weather_station/CVS/Repository b/ulan/embedded/app/hisc/weather_station/CVS/Repository
new file mode 100644 (file)
index 0000000..e56afd1
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/hisc/weather_station
diff --git a/ulan/embedded/app/hisc/weather_station/CVS/Root b/ulan/embedded/app/hisc/weather_station/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/hisc/weather_station/Makefile b/ulan/embedded/app/hisc/weather_station/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/hisc/weather_station/Makefile.omk b/ulan/embedded/app/hisc/weather_station/Makefile.omk
new file mode 100644 (file)
index 0000000..04eb555
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_APP_HISC_WEATHER_STATION=n
+
+ifeq ($(CONFIG_APP_HISC_WEATHER_STATION),y) 
+
+CFLAGS += -DKVPB_BASE=$(KVPB_BASE) -DKVPB_SIZE=$(KVPB_SIZE) 
+
+bin_PROGRAMS = weather_station
+weather_station_SOURCES = weather_station.c weather_stationoi.c kty.c
+
+lib_LOADLIBES = uloi ulan bspbase misc msc_adc
+
+# This selects linker script 
+LD_SCRIPT = $(BOARD)
+DEFAULT_LD_SCRIPT_VARIANT = flash
+
+OUTPUT_FORMATS = bin
+
+endif #CONFIG_APP_WEATHER_STATION
diff --git a/ulan/embedded/app/hisc/weather_station/kty.c b/ulan/embedded/app/hisc/weather_station/kty.c
new file mode 100644 (file)
index 0000000..e5828a7
--- /dev/null
@@ -0,0 +1,34 @@
+#include <cpu_def.h>
+#include "kty.h"
+
+CODE kty_t kty81_2[]={
+    {-40,1135},
+    {-30,1247},
+    {-20,1367},
+    {-10,1495},
+    {1,1630},
+    {10,1772},
+    {20,1922},
+    {30,2080},
+    {40,2245},
+    {50,2417},
+    {60,2597},
+    {70,2785}
+  };
+
+int8_t kty81_2_r2t(uint16_t r) 
+{
+  int8_t i;
+  i=sizeof(kty81_2)/sizeof(kty_t)-2;
+  while(i!=0) {
+    if (kty81_2[i].r_base<=r) {
+      uint8_t k,td;
+      td=kty81_2[i+1].temp_base-kty81_2[i].temp_base;
+      k=(uint16_t)(kty81_2[i+1].r_base-kty81_2[i].r_base)*10/td;
+      i=kty81_2[i].temp_base+(uint16_t)((r-kty81_2[i].r_base)*10/k);
+      return i;
+    }
+    i--;
+  }
+  return 0;
+}
diff --git a/ulan/embedded/app/hisc/weather_station/kty.h b/ulan/embedded/app/hisc/weather_station/kty.h
new file mode 100644 (file)
index 0000000..2ccbf14
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _KTY_H
+#define _KTY_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+typedef struct kty {
+  int8_t temp_base;
+  uint16_t r_base;
+  } kty_t;
+
+int8_t kty81_2_r2t(uint16_t r);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _WEATHER_STATION_H */
+
diff --git a/ulan/embedded/app/hisc/weather_station/weather_station.c b/ulan/embedded/app/hisc/weather_station/weather_station.c
new file mode 100644 (file)
index 0000000..6e63adb
--- /dev/null
@@ -0,0 +1,179 @@
+#include <system_def.h>
+#include <string.h>
+#include <uloi_base.h>
+#include <msc_adc.h>
+#include <vect.h>
+#include "kty.h"
+//#include <keyval_id.h>
+//#include <keyval_id_his.h>
+#include <lt_timer.h>
+#include "weather_station.h"
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+
+uloi_coninfo_t uloi_coninfo_global;
+//kvpb_block_t kvpb_block_global;
+
+uchar ubuff[7];
+
+//ulan variables
+//uint8_t DATA uaddr;
+
+//object interface variables
+uint16_t oi_lighting;
+int16_t oi_temp_cpu;
+int16_t oi_temp;
+uint16_t oi_press;
+        
+int main()
+{
+ int tmin=0;
+ #ifndef UL_WITHOUT_HANDLE
+  uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+//  kvpb_block_t *kvpb_block=&kvpb_block_global;
+  ul_msginfo msginfo;
+ #endif  /*UL_WITHOUT_HANDLE*/
+  msc_adc_input_t msc_adc_input_temp_cpu={0xFF,0x41,0,30,0,5};
+  msc_adc_input_t msc_adc_input_lighting={0x08,0x41,0,30,0,5};
+  msc_adc_input_t msc_adc_input_temp={0x18,0x41,0,30,0,5};
+  msc_adc_input_t msc_adc_input_press={0x28,0x41,0,30,0,5};
+  msc_adc_input_t *msc_adc_input_defaults[]={
+    &msc_adc_input_temp_cpu,
+    &msc_adc_input_lighting,
+    &msc_adc_input_temp,
+    &msc_adc_input_press
+  };
+  msc_adc_input_list_t msc_adc_input_list={
+    sizeof(msc_adc_input_defaults)/sizeof(msc_adc_input_defaults[0]),
+    -1,
+    msc_adc_input_defaults,
+    0
+  };
+
+  /***********************************/
+  // timers 
+  lt_100msec_init();
+
+  //********************
+  // kvpb init
+/*  kvpb_block->base=(CODE uint8_t*)KVPB_BASE;
+  kvpb_block->size=KVPB_SIZE;
+  kvpb_block->flags=KVPB_DESC_DOUBLE;
+  if(kvpb_check(kvpb_block,1)<0) 
+    while(1);
+
+  // read data from kvpb
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,1,&uaddr);
+*/
+
+  //********************
+  // uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) while(1);    
+  ul_setmyadr(ul_fd,10);
+
+  /***********************************/
+  // uLan object interface init
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+
+  //********************
+  // start
+ #ifdef SDCC 
+  EA=1;            // Enable interrupts
+ #endif
+  msc_adc_set_input(0xff,0x41); 
+  while(1){
+  
+    /* processing of ulan messages */
+    if (ul_acceptmsg(ul_fd, &msginfo)>=0) {
+      if (!(msginfo.flg&(UL_BFL_PROC|UL_BFL_FAIL))) {
+        if (uloi_process_msg(ULOI_ARG_coninfo &uloi_objdes_main, &msginfo)<0) {
+          ul_freemsg(ul_fd);       
+        }
+      } else 
+        ul_freemsg(ul_fd);
+    }
+
+    if (msc_adc_ready()) {
+      msc_adc_input_t *msc_adc_input;
+      unsigned long lvalue;
+      float value;
+      
+      msc_adc_input=msc_adc_input_list.inputs[msc_adc_input_list.input_position];
+      lvalue=msc_adc_unipolar();
+      if (msc_adc_input->adcon1&0x40) 
+        value=(float)lvalue*MSC_ADC_LSB_UNIPOLAR;    
+      else
+        value=(float)lvalue*MSC_ADC_LSB_BIPOLAR;    
+      msc_adc_input->samples_cnt++;
+      if(msc_adc_input->samples_cnt>msc_adc_input->calibration) {
+        msc_adc_input->avg_value=(value+msc_adc_input->avg_value)/2;
+      }
+      //new stored value
+      if (msc_adc_input->samples_cnt>msc_adc_input->samples) {
+        msc_adc_input->samples_cnt=0;
+        //update values for oi
+        switch (msc_adc_input_list.input_position) {
+         case 0:
+            oi_temp_cpu=MSC_ADC_V2T_INTERNAL(msc_adc_input->avg_value);
+           break;
+          case 1:
+            oi_lighting=(msc_adc_input->avg_value/2.5)*100.0;
+           break;
+          case 2:{
+            uint16_t r;
+            r=4690*(msc_adc_input->avg_value/(2.5-msc_adc_input->avg_value));
+            oi_temp=kty81_2_r2t(r);
+           };break;
+          case 3:{
+            float error;
+            /* Vout = VS x (0.009 x P - 0.095) ± (Pressure Error x Temp. Factor x 0.009 x VS) */
+           /* VS = 5.0 ± 0.25 Vdc -> for me 2.48V */
+            error=0*1*0.009*4.97;
+            oi_press=(((msc_adc_input->avg_value*2.016/4.97+error)+0.095)/0.009) * 10;
+            };break;
+         default:break;
+        }
+        msc_adc_input_list.input_position++;
+        if (msc_adc_input_list.input_position==msc_adc_input_list.count) {
+          msc_adc_input_list.input_position=0;
+        }
+        msc_adc_input=msc_adc_input_list.inputs[msc_adc_input_list.input_position];
+        msc_adc_set_input(msc_adc_input->ain,msc_adc_input->adcon1); 
+      }      
+    }
+    
+    /* 100ms timer */
+    if (lt_100msec_expired(100)) {
+
+      /* 1min timer */
+      if (++tmin==600) {
+        tmin=0;
+        ubuff[0]=UL_CMD_OISV+1;
+        ubuff[1]=0x41;
+        ubuff[2]=0;
+        ubuff[3]=0xe6;
+        ubuff[4]=0;
+        ubuff[5]=oi_lighting;
+        ubuff[6]=oi_lighting>>8;
+        msginfo.cmd=UL_CMD_OISV;
+        msginfo.flg=UL_BFL_SND | UL_BFL_ARQ;
+        msginfo.dadr=0;
+        ul_newmsg(ul_fd,&msginfo);
+        ul_write(ul_fd,ubuff,7);
+        ul_freemsg(ul_fd);
+      }
+
+      /* ulan stroke */
+      ul_stroke(ul_fd);
+    }
+  }
+}
diff --git a/ulan/embedded/app/hisc/weather_station/weather_station.h b/ulan/embedded/app/hisc/weather_station/weather_station.h
new file mode 100644 (file)
index 0000000..a461d04
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef _WEATHER_STATION_H
+#define _WEATHER_STATION_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+#define I_LIGHTING 230
+#define I_TEMP_CPU 231
+#define I_TEMP 232
+#define I_PRESS 233
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+
+//object interface variables
+extern uint16_t oi_lighting;
+extern int16_t oi_temp_cpu;
+extern int16_t oi_temp;
+extern uint16_t oi_press;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _WEATHER_STATION_H */
+
diff --git a/ulan/embedded/app/hisc/weather_station/weather_stationoi.c b/ulan/embedded/app/hisc/weather_station/weather_stationoi.c
new file mode 100644 (file)
index 0000000..060080a
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+    WEATHER_STATION
+*/
+
+#include <types.h>
+#include <uloi_base.h>
+#include "weather_station.h"
+
+unsigned status_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  status_val=0;
+  return 1;
+}
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(LIGHTING,I_LIGHTING,"u2",uloi_uint_rdfnc,&oi_lighting,NULL_CODE,NULL)
+ULOI_GENOBJDES(TEMP_CPU,I_TEMP_CPU,"u2",uloi_int_rdfnc,&oi_temp_cpu,NULL_CODE,NULL)
+ULOI_GENOBJDES(TEMP,I_TEMP,"u2",uloi_int_rdfnc,&oi_temp,NULL_CODE,NULL)
+ULOI_GENOBJDES(PRESS,I_PRESS,"u2",uloi_int_rdfnc,&oi_press,NULL_CODE,NULL)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_LIGHTING,
+  &uloid_objdes_TEMP_CPU,
+  &uloid_objdes_TEMP,
+  &uloid_objdes_PRESS
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
diff --git a/ulan/embedded/app/template/CVS/Entries b/ulan/embedded/app/template/CVS/Entries
new file mode 100644 (file)
index 0000000..1784810
--- /dev/null
@@ -0,0 +1 @@
+D
diff --git a/ulan/embedded/app/template/CVS/Repository b/ulan/embedded/app/template/CVS/Repository
new file mode 100644 (file)
index 0000000..0e7026b
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/template
diff --git a/ulan/embedded/app/template/CVS/Root b/ulan/embedded/app/template/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/CVS/Entries b/ulan/embedded/app/u2u/CVS/Entries
new file mode 100644 (file)
index 0000000..af86d2c
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:23 2005//
+/Makefile.omk/1.2/Sat Apr 28 19:42:46 2007//
+D/ver1////
+D/ver2////
diff --git a/ulan/embedded/app/u2u/CVS/Repository b/ulan/embedded/app/u2u/CVS/Repository
new file mode 100644 (file)
index 0000000..d4e3f1c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/u2u
diff --git a/ulan/embedded/app/u2u/CVS/Root b/ulan/embedded/app/u2u/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/Makefile b/ulan/embedded/app/u2u/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/u2u/Makefile.omk b/ulan/embedded/app/u2u/Makefile.omk
new file mode 100644 (file)
index 0000000..fe98ce5
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = ver1 ver2
+
diff --git a/ulan/embedded/app/u2u/ver1/CVS/Entries b/ulan/embedded/app/u2u/ver1/CVS/Entries
new file mode 100644 (file)
index 0000000..62ec95d
--- /dev/null
@@ -0,0 +1,9 @@
+/Makefile/1.1/Mon Oct  3 12:43:23 2005//
+/Makefile.omk/1.5/Wed Mar 21 01:22:32 2007//
+/u2u.c/1.9/Fri Mar  7 19:12:34 2008//
+/u2u_vend.c/1.2/Tue Jan 31 12:20:46 2006//
+/u2u_vend.h/1.1/Mon Oct  3 12:43:23 2005//
+/ul_dcnv.c/1.1/Mon Oct  3 12:43:23 2005//
+/ul_dcnv.h/1.2/Wed Feb 22 11:19:13 2006//
+/usb_srq.c/1.1/Mon Oct  3 12:43:23 2005//
+D/usb////
diff --git a/ulan/embedded/app/u2u/ver1/CVS/Repository b/ulan/embedded/app/u2u/ver1/CVS/Repository
new file mode 100644 (file)
index 0000000..d88dc5f
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/u2u/ver1
diff --git a/ulan/embedded/app/u2u/ver1/CVS/Root b/ulan/embedded/app/u2u/ver1/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/ver1/Makefile b/ulan/embedded/app/u2u/ver1/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/u2u/ver1/Makefile.omk b/ulan/embedded/app/u2u/ver1/Makefile.omk
new file mode 100644 (file)
index 0000000..eb8806e
--- /dev/null
@@ -0,0 +1,28 @@
+default_CONFIG = CONFIG_APP_U2U=n
+
+ifeq ($(CONFIG_APP_U2U),y)
+
+bin_PROGRAMS = u2u
+
+u2u_SOURCES = u2u.c ul_dcnv.c u2u_vend.c usb_srq.c
+#u2u_SOURCES += ulan1-$(APPID).asm
+
+lib_LOADLIBES = bspbase ulan usbbase usbpdi
+ifeq ($(CONFIG_MISC_VECT),y)
+lib_LOADLIBES += misc
+CFLAGS  += -D HAVE_VECT_H 
+endif #CONFIG_MISC_VECT)
+
+nobase_include_HEADERS = usb/usb_defs.h
+
+# The specification for load and run command should be
+# specified in the board provided config.omk file fragment
+# (LOAD_CMD-flash, RUN_CMD-flash)
+
+# This selects linker script 
+LD_SCRIPT = $(BOARD)
+DEFAULT_LD_SCRIPT_VARIANT = flash
+
+OUTPUT_FORMATS = hex
+
+endif #CONFIG_APP_U2U
diff --git a/ulan/embedded/app/u2u/ver1/u2u.c b/ulan/embedded/app/u2u/ver1/u2u.c
new file mode 100644 (file)
index 0000000..bec69bf
--- /dev/null
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <string.h>
+/* USB support */
+#include <usb/usb.h>
+#include <usb/usbdebug.h>
+#include <usb/pdiusb.h> /* pdiGetFrameNumber */
+#include <system_def.h>
+#include <cpu_def.h> 
+#include <ul_lib/ulan.h>
+#include <lt_timer.h>
+#include "ul_dcnv.h"
+#include "u2u_vend.h"
+#ifdef HAVE_VECT_H
+#include "vect.h"
+#endif
+
+#define MASK_EP1RX  0x01
+#define MASK_EP1TX  0x02
+
+LT_TIMER_DEC(lt_10msec)
+LT_TIMER_IMP(lt_10msec)
+
+usb_device_t usb_pdi_device;
+usb_ep_t eps[2]; 
+#ifndef UL_WITHOUT_HANDLE
+ul_fd_t ul_fd;
+#endif
+ul_dcnv_state_t XDATA ep1_dcnv_state;
+uint8_t ulan_configured;
+unsigned char XDATA ep1_rx_buff[PDI_EP1_PACKET_SIZE];
+unsigned char XDATA ep1_tx_buff[PDI_EP1_PACKET_SIZE];
+uint8_t timer_str,timer_rx_off,timer_tx_off,timer_configured; 
+
+void timer_10ms(void) 
+{
+  if (timer_rx_off!=0) timer_rx_off--;
+  else LEDRX=1;
+  if (timer_tx_off!=0) timer_tx_off--;
+  else LEDTX=1;
+  if (!timer_str) {
+    timer_str=5;
+    ul_stroke(ul_fd);
+  } else timer_str--;
+  if (timer_configured!=0) timer_configured--;
+  else {
+    timer_configured=20;
+    if (!ulan_configured) {
+      LEDRX=LEDTX=0;
+      timer_rx_off=timer_tx_off=5;
+    }
+  }
+}
+    
+int main() {  
+#ifndef HAVE_VECT_H
+  setup_board();
+#endif
+
+  /***********************************/
+  // timers 
+  lt_10msec_init();
+
+  //********************
+  //uLan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_init();
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+ #endif
+  ul_fd=ul_open(NULL, NULL);
+  ul_setmyadr(ul_fd,62);
+  //unconfigure ->
+  ES_U=0;ulan_configured=0;
+
+  //********************
+  // USB init
+  memset( &usb_pdi_device, 0, sizeof( usb_pdi_device));
+  usb_pdi_device.id = 1;
+  #ifndef USB_PDI_DIRECT_FNC
+  usb_pdi_device.init = usb_pdi_init;
+  #endif /*USB_PDI_DIRECT_FNC*/
+  usb_debug_set_level(DEBUG_LEVEL_VERBOSE);
+  usb_pdi_device.cntep = 2;
+  usb_pdi_device.ep = eps;
+
+  eps[0].max_packet_size = PDI_EP1_PACKET_SIZE;
+  eps[1].max_packet_size = PDI_EP1_PACKET_SIZE;
+  eps[0].epnum = PDI_EP1_RX;
+  eps[1].epnum = PDI_EP1_TX;
+  eps[0].event_mask = PDI_INT_EP1_OUT;
+  eps[1].event_mask = PDI_INT_EP1_IN;
+
+  usb_pdi_device.vendor_fnc=usb_u2u_vendor;
+
+  usb_init(&usb_pdi_device);
+  usb_connect(&usb_pdi_device);
+
+  //********************
+  //start
+  timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
+  ul_dcnv_init(&ep1_dcnv_state,ul_fd,ul_fd);
+
+  EA=1;   // Enable interrupts
+
+  while(1){
+  
+    if( !(IPDI)) 
+      usb_check_events( &usb_pdi_device);
+    usb_control_response( &usb_pdi_device);
+        
+    if (usb_pdi_device.ep_events & MASK_EP1RX) {  //EP1RX
+      int size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,PDI_EP1_PACKET_SIZE);
+      ul_dcnv_send(&ep1_dcnv_state,ep1_rx_buff,size);
+      usb_pdi_device.ep_events &= ~MASK_EP1RX;
+      timer_tx_off=5;LEDTX=0;         //rozsviceni diod pri vysilani 
+    }
+
+    if(usb_pdi_device.ep_events & MASK_EP1TX){
+      ep1_dcnv_state.rx_wait4host=0;
+      usb_pdi_device.ep_events &= ~MASK_EP1TX;
+    }
+
+    if (!ep1_dcnv_state.rx_wait4host) { // EP1TX
+      int size=ul_dcnv_rec(&ep1_dcnv_state, ep1_tx_buff, PDI_EP1_PACKET_SIZE);
+      if (size){
+        usb_udev_write_endpoint(&eps[1],ep1_tx_buff,size);
+        ep1_dcnv_state.rx_wait4host=1;
+      } else {
+        if (ul_dcnv_rec_start(&ep1_dcnv_state, ep1_tx_buff,8)==8) { //HEADER
+          usb_udev_write_endpoint(&eps[1],ep1_tx_buff,8);
+          timer_rx_off=5;LEDRX=0;        //rosviceni diody pri prijmu 
+          ep1_dcnv_state.rx_wait4host=1;
+        }
+      }
+    }
+    
+    /* 10ms timer */
+    if (lt_10msec_expired(10)) 
+      timer_10ms();
+  }
+}
diff --git a/ulan/embedded/app/u2u/ver1/u2u_vend.c b/ulan/embedded/app/u2u/ver1/u2u_vend.c
new file mode 100644 (file)
index 0000000..fd24984
--- /dev/null
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <system_def.h>
+#include <ul_lib/ulan.h>
+#include "u2u_vend.h"
+
+extern char ulan_configured;
+
+int usb_u2u_vendor(usb_device_t *udev) reentrant
+{
+  switch ( udev->request.bRequest) {
+    case VENDOR_START_ULAN:
+      ulan_configured=0;
+      ES_U=0;                                            //disable int. from serial
+      switch (udev->request.wValue) {
+        case 9600:
+          ulan_configured=1;
+          ul_drv_set_adr(udev->request.wIndex & 0x3F);
+          ul_drv_set_bdiv(BAUD2BAUDDIV(9600));
+          ES_U=1;
+          break;
+        case 19200:
+          ulan_configured=1;
+          ul_drv_set_adr(udev->request.wIndex & 0x3F);
+          ul_drv_set_bdiv(BAUD2BAUDDIV(19200)); 
+          ES_U=1;
+          break;
+        case 38400:
+          ulan_configured=1;
+          ul_drv_set_adr(udev->request.wIndex & 0x3F);
+          ul_drv_set_bdiv(BAUD2BAUDDIV(38400));
+          ES_U=1;
+          break;
+        case 56800:
+          ulan_configured=1;
+          ul_drv_set_adr(udev->request.wIndex & 0x3F);
+          ul_drv_set_bdiv(BAUD2BAUDDIV(56800));
+          ES_U=1;
+          break;
+      }
+      usb_send_control_data(udev,&ulan_configured,1);
+      return 1;
+    case VENDOR_STOP_ULAN:
+      ulan_configured=0;
+      ES_U=0;                                            //disable int. from serial
+      return 1;
+    case VENDOR_IS_RUNNING_ULAN:
+      return ulan_configured;
+  }
+
+  return 0;
+}
diff --git a/ulan/embedded/app/u2u/ver1/u2u_vend.h b/ulan/embedded/app/u2u/ver1/u2u_vend.h
new file mode 100644 (file)
index 0000000..592c53f
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef USB_VENDOR
+#define USB_VENDOR
+
+#include <usb/usb.h>
+
+#define VENDOR_START_ULAN       0     /* Inform converter about uLan driver ready */
+#define VENDOR_STOP_ULAN        1     /* Inform about uLan driver stopping  */
+#define VENDOR_IS_RUNNING_ULAN  2
+#define VENDOR_ARC_ON_ULAN      3     /* Set promiscuous monitoring mode */
+#define VENDOR_ARC_OFF_ULAN     4     /* Return to std. adress recognition mode */
+  
+int usb_u2u_vendor(usb_device_t *udev) reentrant;
+  
+#endif /* USB_VENDOR */
diff --git a/ulan/embedded/app/u2u/ver1/ul_dcnv.c b/ulan/embedded/app/u2u/ver1/ul_dcnv.c
new file mode 100644 (file)
index 0000000..550b4ab
--- /dev/null
@@ -0,0 +1,105 @@
+#include <system_def.h>
+#include <cpu_def.h>
+#include <stdio.h>
+#include <usb/usb.h>
+#include "ul_dcnv.h"
+
+int 
+ul_dcnv_init(ul_dcnv_state_t XDATA *cnvst,ul_fd_t tx_fd,ul_fd_t rx_fd) 
+{
+  cnvst->tx_2send=-1;
+  cnvst->rx_2rec=-1;           //wait for request for receiving
+  cnvst->tx_error=cnvst->rx_error=0;
+  cnvst->rx_wait4host=0;
+#ifndef UL_WITHOUT_HANDLE 
+  cnvst->tx_fd=tx_fd;
+  cnvst->rx_fd=rx_fd;
+#endif
+  return 0;
+}
+
+int 
+ul_dcnv_send(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+ #endif /*UL_WITHOUT_HANDLE*/
+  int ret=0;
+
+  if (cnvst->tx_2send==-1) {
+    if(size<8) return 0;
+    cnvst->tx_2send =buff[6]+buff[7]*0x100;
+    msginfo.dadr=buff[0]&0x7F;  // dadr
+    msginfo.sadr=buff[1]&0x7F;  // sadr
+    msginfo.cmd =buff[2];       // cmd
+    msginfo.flg =buff[3];       // status zpravy
+    msginfo.stamp=buff[4];      // stamp
+    if(ul_newmsg(cnvst->tx_fd, &msginfo)<0) {
+      cnvst->tx_error++;
+      return -1;
+    }
+    buff+=8;
+  } else {
+    if (cnvst->tx_2send>0) {
+      if(ul_write(cnvst->tx_fd, buff, size) != size){
+        cnvst->tx_error++;
+        ret=-1;
+      }
+      cnvst->tx_2send-=size;
+    }
+  }
+  if (cnvst->tx_2send<=0) {
+    ul_o_close(cnvst->tx_fd);
+    cnvst->tx_2send=-1;
+  }
+  return ret;
+}
+
+int 
+ul_dcnv_rec(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+  int ret;
+  if (cnvst->rx_2rec == -1) {
+    return 0;
+  } else {
+    if(size>cnvst->rx_2rec) size=cnvst->rx_2rec;
+    ret=ul_read(cnvst->rx_fd, buff, size);
+    if(ret!=size){
+      cnvst->rx_error++;
+      ret=-2;
+      cnvst->rx_2rec=-1;
+      //ul_abortmsg(cnvst->rx_fd);
+    } else {
+      cnvst->rx_2rec-=size;
+      if(!cnvst->rx_2rec) {
+        ul_i_close(cnvst->rx_fd);
+        cnvst->rx_2rec=-1;
+      }
+    }
+    return ret;
+  }
+}
+
+int 
+ul_dcnv_rec_start(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+ #endif /*UL_WITHOUT_HANDLE*/
+
+  if ((cnvst->rx_2rec==-1) && (ul_acceptmsg(cnvst->rx_fd, &msginfo)>=0) && 1) {
+    cnvst->rx_2rec=msginfo.len;
+    buff[0]=msginfo.dadr;      buff[1]=msginfo.sadr;
+    buff[2]=msginfo.cmd;       buff[3]=msginfo.flg;
+    buff[4]=msginfo.stamp;     buff[5]=0;
+    buff[6]=cnvst->rx_2rec%0x100;  buff[7]=cnvst->rx_2rec/0x100;
+    if (cnvst->rx_2rec<=0) {
+      ul_i_close(cnvst->rx_fd);
+      cnvst->rx_2rec=-1;
+    }
+    buff+=8; size-=8;
+    return 8;
+  } else {
+    return 0;
+  }
+}
diff --git a/ulan/embedded/app/u2u/ver1/ul_dcnv.h b/ulan/embedded/app/u2u/ver1/ul_dcnv.h
new file mode 100644 (file)
index 0000000..87d0e52
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _UL_DCNV_H
+#define _UL_DCNV_H
+
+#include "ul_lib/ulan.h"
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#ifndef XDATA
+  #define XDATA
+#endif
+
+typedef struct ul_dcnv_state_t {
+  int tx_2send;
+  int tx_error;
+  int rx_2rec;
+  int rx_error;
+  int rx_wait4host;
+#ifndef UL_WITHOUT_HANDLE 
+  ul_fd_t tx_fd;
+  ul_fd_t rx_fd;
+#endif /*UL_WITHOUT_HANDLE*/
+} ul_dcnv_state_t;
+
+int ul_dcnv_init(ul_dcnv_state_t XDATA *cnvst,ul_fd_t tx_fd,ul_fd_t rx_fd);
+int ul_dcnv_send(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+int ul_dcnv_rec(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+int ul_dcnv_rec_start(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_UTIL_H */
diff --git a/ulan/embedded/app/u2u/ver1/usb/CVS/Entries b/ulan/embedded/app/u2u/ver1/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..314ca8d
--- /dev/null
@@ -0,0 +1,2 @@
+/usb_defs.h/1.2/Tue Mar 20 23:50:57 2007//
+D
diff --git a/ulan/embedded/app/u2u/ver1/usb/CVS/Repository b/ulan/embedded/app/u2u/ver1/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..67f6128
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/u2u/ver1/usb
diff --git a/ulan/embedded/app/u2u/ver1/usb/CVS/Root b/ulan/embedded/app/u2u/ver1/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/ver1/usb/usb_defs.h b/ulan/embedded/app/u2u/ver1/usb/usb_defs.h
new file mode 100644 (file)
index 0000000..b47f207
--- /dev/null
@@ -0,0 +1,375 @@
+
+#ifndef USB_DEFS_MODULE
+  #define USB_DEFS_MODULE
+  
+  #include <usb/usb_spec.h>
+  #include <usb/pdiusb.h>
+  #include <endian.h>
+  #include <cpu_def.h>
+
+  #include <endian.h>
+  #if __BYTE_ORDER == __BIG_ENDIAN
+    #include <byteswap.h>
+    #define SWAP(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
+  #else /*__LITTLE_ENDIAN*/
+    #define SWAP(x) (x)
+  #endif
+
+  #ifndef CODE
+    #define CODE
+  #endif
+    
+/*****************************************************/
+/*** Static data structures for device descriptors ***/
+/*****************************************************/
+#ifndef USB_VENDOR_ID
+  #define USB_VENDOR_ID      0xDEAD  /* vymyslene cislo ( snad ho nikdo nema ... ;-) */
+#endif
+#ifndef USB_PRODUCT_ID
+  #define USB_PRODUCT_ID     0x1001  /* test code for ULAD21 */
+#endif
+  #define USB_RELEASE_VER    0x0100
+
+/*** Class codes for device description ***/
+  #define USB_CLASS_CODE      0xFF
+  #define USB_SUBCLASS_CODE   0x00
+  #define USB_PROTOCOL_CODE   0x00
+  
+  
+  #define NUM_ENDPOINTS  2
+  #define CONFIG_DESCRIPTOR_LENGTH sizeof( USB_CONFIGURATION_DESCRIPTOR) \
+                                     + sizeof( USB_INTERFACE_DESCRIPTOR) \
+                                     + ( NUM_ENDPOINTS * sizeof( USB_ENDPOINT_DESCRIPTOR))
+
+/*** Device descriptor ***/
+  CODE const USB_DEVICE_DESCRIPTOR DeviceDescription = {
+    sizeof( USB_DEVICE_DESCRIPTOR),
+    USB_DESCRIPTOR_TYPE_DEVICE,
+    SWAP( 0x0100),
+    USB_CLASS_CODE,
+    USB_SUBCLASS_CODE,
+    USB_PROTOCOL_CODE,
+    PDI_EP0_PACKET_SIZE,
+    SWAP( USB_VENDOR_ID),
+    SWAP( USB_PRODUCT_ID),  
+    SWAP( USB_RELEASE_VER),
+    1, /* manufacturer string ID */
+    2, /* product string ID */
+    3, /* serial number string ID */
+    1
+  };
+  
+/*** All In Configuration 0 ***/
+  CODE const struct {
+    USB_CONFIGURATION_DESCRIPTOR configuration;
+    USB_INTERFACE_DESCRIPTOR interface;
+    USB_ENDPOINT_DESCRIPTOR endpoint_tx;
+    USB_ENDPOINT_DESCRIPTOR endpoint_rx;
+  } ConfigDescription = {
+    /*** Configuration descriptor ***/
+    {
+      sizeof( USB_CONFIGURATION_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_CONFIGURATION,
+      SWAP( CONFIG_DESCRIPTOR_LENGTH),
+      1, /* cnt of interfaces */
+      1, /* this configuration ID */
+      4, /* config.name string ID*/
+      0x80, /* cfg, in spec is, taha bit 7 must be set to one -> 0xe0 , orig 0x60*/ 
+      0x32    /* device power current from host 100mA */
+    },
+    /*** Interface Descriptor ***/
+    {
+      sizeof( USB_INTERFACE_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_INTERFACE,
+      0,    /* index of this interface for SetInterface request */
+      0,    /* ID alternate interface */
+      NUM_ENDPOINTS,
+      USB_CLASS_CODE,
+      USB_SUBCLASS_CODE,
+      USB_PROTOCOL_CODE,
+      5
+    },
+    /*** Endpoint 1 - Tx,Bulk ***/
+    {
+      sizeof( USB_ENDPOINT_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_ENDPOINT,
+      0x01,
+      USB_ENDPOINT_TYPE_BULK,
+      SWAP( PDI_EP1_PACKET_SIZE),
+      0
+    },
+    /*** Endpoint 1 - Rx,Bulk ***/
+    {
+      sizeof( USB_ENDPOINT_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_ENDPOINT,
+      0x81,
+      USB_ENDPOINT_TYPE_BULK,
+      SWAP( PDI_EP2_PACKET_SIZE),
+      0
+    }    
+  };
+  /*** Strings - in unicode ***/
+  CODE const char Str0Desc[] = {  /* supported languages of strings */
+    4, 0x03,  /* 2+2*N , N is count of supported languages */
+    0x09,0x04 /* english 0x0409 */
+  };
+  
+  CODE const char Str1Desc[] = {  /* 1 = manufacturer */  
+    48,0x03,
+    'S',0,
+    'm',0,
+    'o',0,
+    'l',0,
+    'i',0,
+    'k',0,
+    ',',0,
+    'B',0,
+    'a',0,
+    'r',0,
+    't',0,
+    'o',0,
+    's',0,
+    'i',0,
+    'n',0,
+    's',0,
+    'k',0,
+    'i',0,
+    ',',0,
+    'P',0,
+    'i',0,
+    's',0,
+    'a',0
+  };
+
+  CODE const char Str2Desc[] = {  /* 2 = product */
+    38, 0x03,                                               
+    'u',0,
+    'L',0,
+    'a',0,
+    'n',0,
+    '2',0,
+    'u',0,
+    's',0,
+    'b',0,
+    ' ',0,
+    'c',0,
+    'o',0,
+    'n',0,
+    'v',0,
+    'e',0,
+    'r',0,
+    't',0,
+    'o',0,
+    'r',0
+  };
+
+
+  CODE const char Str3Desc[] = {  /* 3 = version */
+    26, 0x03,                                               
+    '2',0,
+    '3',0,
+    '.',0,
+    '0',0,
+    '7',0,
+    '.',0,
+    '0',0,
+    '4',0,
+    '-',0,
+    '1',0,
+    '.',0,
+    '1',0
+  };
+  CODE const char Str4Desc[] = {  /* 4 = configuration */
+    34, 0x03,                                               
+    'C',0,
+    'o',0,
+    'n',0,
+    'f',0,
+    'i',0,
+    'g',0,
+    'u',0,
+    'r',0,
+    'a',0,
+    't',0,
+    'i',0,
+    'o',0,
+    'n',0,
+    ' ',0,
+    '#',0,
+    '1',0
+  };
+  CODE const char Str5Desc[] = {  /* 5 = interface */
+    26,0x03,                                               
+    'I',0,
+    'n',0,
+    't',0,
+    'e',0,
+    'r',0,
+    'f',0,
+    'a',0,
+    'c',0,
+    'e',0,
+    ' ',0,
+    '#',0,
+    '0',0
+  };
+
+  CODE const char Str6Desc[] = {  /* EP1 OUT descriptor */
+    136,0x03,  
+    'E',0,
+    'P',0,
+    '1',0,
+    'O',0,
+    'U',0,
+    'T',0,
+    '-',0,
+    's',0,
+    'e',0,
+    'n',0,
+    'd',0,
+    ' ',0,
+    'm',0,
+    'e',0,
+    's',0,
+    's',0,
+    'a',0,
+    'g',0,
+    'e',0,
+    '-',0,
+    'd',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    's',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    'c',0,
+    'm',0,
+    'd',0,
+    ',',0,
+    'f',0,
+    'l',0,
+    'g',0,
+    ',',0,
+    's',0,
+    't',0,
+    'a',0,
+    'm',0,
+    'p',0,
+    ',',0,
+    'f',0,
+    'r',0,
+    'e',0,
+    'e',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'l',0,
+    'o',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'h',0,
+    'i',0,
+    ',',0,
+    'd',0,
+    'a',0,
+    't',0,
+    'a',0
+  };
+
+  CODE const char Str7Desc[] = {  /* EP2 IN descriptor */
+    140,0x03,
+    'E',0,
+    'P',0,
+    '1',0,
+    'I',0,
+    'N',0,
+    '-',0,
+    'r',0,
+    'e',0,
+    'c',0,
+    'e',0,
+    'i',0,
+    'v',0,
+    'e',0,
+    ' ',0,
+    'm',0,
+    'e',0,
+    's',0,
+    's',0,
+    'a',0,
+    'g',0,
+    'e',0,
+    '-',0,
+    'd',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    's',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    'c',0,
+    'm',0,
+    'd',0,
+    ',',0,
+    'f',0,
+    'l',0,
+    'g',0,
+    ',',0,
+    's',0,
+    't',0,
+    'a',0,
+    'm',0,
+    'p',0,
+    ',',0,
+    'f',0,
+    'r',0,
+    'e',0,
+    'e',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'l',0,
+    'o',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'h',0,
+    'i',0,
+    ',',0,
+    'd',0,
+    'a',0,
+    't',0,
+    'a',0
+  };
+
+  #define CNT_STRINGS 0x08
+  
+  /* all strings in pointers array */
+  CODE const PUSB_STRING_DESCRIPTOR StringDescriptors[] = {
+    (PUSB_STRING_DESCRIPTOR) Str0Desc,
+    (PUSB_STRING_DESCRIPTOR) Str1Desc,
+    (PUSB_STRING_DESCRIPTOR) Str2Desc,
+    (PUSB_STRING_DESCRIPTOR) Str3Desc,
+    (PUSB_STRING_DESCRIPTOR) Str4Desc,
+    (PUSB_STRING_DESCRIPTOR) Str5Desc,
+    (PUSB_STRING_DESCRIPTOR) Str6Desc,
+    (PUSB_STRING_DESCRIPTOR) Str7Desc
+  };
+
+#endif /* USB_DEFS_MODULE */
diff --git a/ulan/embedded/app/u2u/ver1/usb_srq.c b/ulan/embedded/app/u2u/ver1/usb_srq.c
new file mode 100644 (file)
index 0000000..b76acf1
--- /dev/null
@@ -0,0 +1,239 @@
+/*****************************************************/
+/***   Module : USB module                         ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <string.h>
+
+#include <system_def.h>
+#include <usb/usb.h>
+#include <usb/usb_spec.h>
+#include <usb/pdiusb.h>
+#include <usb/usbdebug.h>
+#include <usb/usb_srq.h>
+#include <usb/usb_defs.h>
+#include "ul_dcnv.h"
+
+extern ul_dcnv_state_t XDATA ep1_dcnv_state;
+
+  // ****************************
+  int usb_stdreq_get_status( usb_device_t *udev)
+  {
+    unsigned char c,buf[2] = { 0, 0};
+    unsigned char epid = (unsigned char) udev->request.wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
+    switch( udev->request.bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( udev->flags & USB_FLAG_REMOTE_WAKE) //.remote_wake_up == 1)
+          buf[0] = USB_GETSTATUS_REMOTE_WAKEUP_ENABLED | USB_GETSTATUS_SELF_POWERED;
+        else
+          buf[0] = USB_GETSTATUS_SELF_POWERED;
+        break;
+      case USB_RECIPIENT_INTERFACE:
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+          c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
+        else
+          c = pdiSelectEp(pdiEp2Idx(epid));     // endpoint Out
+          #ifdef PDIUSBD12
+          buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
+          #else
+          buf[0] = 0;
+          #endif
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    pdiWriteEndpoint( PDI_EP0_TX, 2, buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_clear_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("ClearFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags &= ~USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 0;
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear TX stall for IN on EPn
+          else
+            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear RX stall for OUT on EPn
+          usb_udev_ack_setup( udev);
+         //initialize state of ulan convertor
+         switch (epid&(USB_ENDPOINT_DIRECTION_MASK|0x03)) {
+           case 0x01:                          //rx USB -> tx ulan
+             ul_o_close(ep1_dcnv_state.tx_fd);
+              ep1_dcnv_state.tx_2send=-1;
+             break;
+           case 0x81:                          //tx USB -> rx ulan
+             ul_o_close(ep1_dcnv_state.rx_fd);
+              ep1_dcnv_state.rx_2rec=-1;
+              ep1_dcnv_state.rx_wait4host=0;
+             break;
+         }
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags |= USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 1;
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+            pdiSetEpStatus( pdiEp2Idx(epid), 1); // set TX stall for IN on EPn
+          else
+            pdiSetEpStatus( pdiEp2Idx(epid), 1);     // set RX stall for OUT on EPn
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_address( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr\n"));
+    usb_udev_ack_setup( udev);
+    pdiSetAddressEnable( (dreq->wValue & DEVICE_ADDRESS_MASK) + PDI_ENAD_ENABLE);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_get_configuration( usb_device_t *udev)
+  {
+    unsigned char buf = udev->configuration; //usb_flags.configured;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
+    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_configuration( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char iCfg = dreq->wValue & 0xff;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
+    if ( iCfg < 2) {       // put device in unconfigured state or set configuration 1 ( no else)
+      usb_udev_ack_setup( udev);
+      pdiSetEndpointEnable( 0); // USBInitUnconfig();
+      if ( iCfg) {
+        pdiSetEndpointEnable( PDI_EPEN_ENABLE); //USBInitConfig();
+        udev->flags |= USB_FLAG_CONFIGURED;
+      } else {
+        udev->flags &= ~USB_FLAG_CONFIGURED;
+      }
+      udev->configuration = iCfg;  //usb_flags.configured = iCfg;
+      return USB_COMPLETE_OK;
+    } else
+      return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_get_interface( usb_device_t *udev)
+  {
+    unsigned char buf = 0; /// udev->interface
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
+    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_interface( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetIface\n"));
+    if (( dreq->wValue == 0) && ( dreq->wIndex == 0)) {
+      usb_udev_ack_setup( udev);
+      return USB_COMPLETE_OK;
+    } else {
+      return USB_COMPLETE_FAIL;
+    }
+  }
+
+  int usb_stdreq_get_descriptor( usb_device_t *udev)
+  {
+    unsigned char *pDesc;
+    unsigned short Len = 0;
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    int i;
+
+    i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetDesc\n"));
+    usb_debug_print( DEBUG_LEVEL_VERBOSE, ( " - %s desc.\n", /*(unsigned int)*/ usb_debug_get_std_descriptor(i)));
+
+    switch (i) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:
+        pDesc = (unsigned char *)&DeviceDescription;
+        Len = sizeof( USB_DEVICE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:
+        pDesc = (unsigned char *)&ConfigDescription;
+        Len = CONFIG_DESCRIPTOR_LENGTH;
+        break;
+      case USB_DESCRIPTOR_TYPE_INTERFACE:
+        pDesc = (unsigned char *)&ConfigDescription.interface;
+        Len = sizeof( USB_INTERFACE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_STRING:
+        i = dreq->wValue & 0xff; /* LSB part of wValue */
+        /*printf("Get descriptor indx=0x%02x\n", i);*/
+        if ( i < CNT_STRINGS) {
+          pDesc = (unsigned char *) StringDescriptors[ i];
+          Len = *pDesc;
+          /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
+        } else {
+          return USB_COMPLETE_FAIL;
+        }
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    if ( dreq->wLength < Len) Len = dreq->wLength;
+    usb_send_control_data( udev, pDesc, Len);
+    return USB_COMPLETE_OK;
+  }
+
+
+/*  
+  void usb_init_stdreq_fnc( usb_device_t *udev)
+  {
+    // memset( udev->stdreq, 0, sizeof(udev->stdreq));
+    
+    udev->stdreq[USB_REQUEST_GET_STATUS] = usb_stdreq_get_status;
+    udev->stdreq[USB_REQUEST_CLEAR_FEATURE] = usb_stdreq_clear_feature;
+    udev->stdreq[USB_REQUEST_SET_FEATURE] = usb_stdreq_set_feature;
+    udev->stdreq[USB_REQUEST_SET_ADDRESS] = usb_stdreq_set_address;
+    udev->stdreq[USB_REQUEST_GET_DESCRIPTOR] = usb_stdreq_get_descriptor;
+    udev->stdreq[USB_REQUEST_GET_CONFIGURATION] = usb_stdreq_get_configuration;
+    udev->stdreq[USB_REQUEST_SET_CONFIGURATION] = usb_stdreq_set_configuration;
+    udev->stdreq[USB_REQUEST_GET_INTERFACE] = usb_stdreq_get_interface;
+    udev->stdreq[USB_REQUEST_SET_INTERFACE] = usb_stdreq_set_interface;
+  }
+*/
diff --git a/ulan/embedded/app/u2u/ver2/CVS/Entries b/ulan/embedded/app/u2u/ver2/CVS/Entries
new file mode 100644 (file)
index 0000000..645a8ad
--- /dev/null
@@ -0,0 +1,11 @@
+/Makefile/1.1/Sat Apr 28 19:42:46 2007//
+/Makefile.omk/1.2/Fri May 25 19:14:29 2007//
+/u2u.c/1.4/Tue Jun  5 17:33:08 2007//
+/u2u_vend.c/1.2/Tue Jun  5 17:33:08 2007//
+/u2u_vend.h/1.1/Tue May 29 20:17:58 2007//
+/ul_dcnv.c/1.4/Tue Sep 18 08:18:43 2007//
+/ul_dcnv.h/1.1/Tue May 29 20:17:58 2007//
+/ul_idstr.c/1.1/Tue May 29 20:17:59 2007//
+/ul_idstr.h/1.1/Tue May 29 20:17:59 2007//
+/usb_srq.c/1.3/Fri May 25 19:14:29 2007//
+D/usb////
diff --git a/ulan/embedded/app/u2u/ver2/CVS/Repository b/ulan/embedded/app/u2u/ver2/CVS/Repository
new file mode 100644 (file)
index 0000000..ee7a707
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/u2u/ver2
diff --git a/ulan/embedded/app/u2u/ver2/CVS/Root b/ulan/embedded/app/u2u/ver2/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/ver2/Makefile b/ulan/embedded/app/u2u/ver2/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/u2u/ver2/Makefile.omk b/ulan/embedded/app/u2u/ver2/Makefile.omk
new file mode 100644 (file)
index 0000000..2b32af6
--- /dev/null
@@ -0,0 +1,27 @@
+default_CONFIG = CONFIG_APP_U2U_V2=n
+
+ifeq ($(CONFIG_APP_U2U_V2),y)
+
+ULAN_ID=rja2006m70
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I.
+
+bin_PROGRAMS = u2u
+
+u2u_SOURCES = u2u.c ul_dcnv.c u2u_vend.c usb_srq.c ul_idstr.c
+u2u_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+
+lib_LOADLIBES = bspbase usbbase lpcusb mach_hal ul_drv
+
+nobase_include_HEADERS = usb/usb_defs.h
+
+link_VARIANTS = boot
+
+endif #CONFIG_APP_U2U_V2
diff --git a/ulan/embedded/app/u2u/ver2/u2u.c b/ulan/embedded/app/u2u/ver2/u2u.c
new file mode 100644 (file)
index 0000000..39acb45
--- /dev/null
@@ -0,0 +1,138 @@
+#include <stdio.h>
+#include <string.h>
+#include <cpu_def.h> 
+#include <system_def.h>
+#include <lt_timer.h>
+/* ulan */
+#include <ul_lib/ulan.h>
+/* USB support */
+#include <usb/usbdebug.h>
+#include <usb/lpc.h>
+#include "ul_dcnv.h"
+#include "u2u_vend.h"
+#include <ul_idstr.h>
+
+#define MASK_EP1RX  0x01
+#define MASK_EP1TX  0x02
+
+LT_TIMER_DEC(lt_10msec)
+LT_TIMER_IMP(lt_10msec)
+
+usb_device_t usb_device;
+usb_ep_t eps[2]; 
+ul_fd_t ul_fd_rx,ul_fd_tx;
+ul_msginfo msginfo;
+ul_dcnv_state_t ep1_dcnv_state;
+uint8_t ulan_configured;
+unsigned char ep1_rx_buff[USB_MAX_PACKET];
+unsigned char ep1_tx_buff[USB_MAX_PACKET];
+uint8_t timer_str,timer_rx_off,timer_tx_off,timer_configured; 
+
+void timer_10ms(void) 
+{
+  if (timer_tx_off!=0) timer_tx_off--;
+  else SET_OUT_PIN(LED_PORT,LED1_BIT);
+  if (timer_rx_off!=0) timer_rx_off--;
+  else SET_OUT_PIN(LED_PORT,LED2_BIT);
+  if (!timer_str) {
+    timer_str=5;
+    ul_stroke(ul_fd_rx);
+  } else timer_str--;
+  if (timer_configured!=0) timer_configured--;
+  else {
+    timer_configured=20;
+    if (!ulan_configured) {
+      CLR_OUT_PIN(LED_PORT,LED1_BIT);
+      CLR_OUT_PIN(LED_PORT,LED2_BIT);
+      timer_rx_off=timer_tx_off=5;
+    }
+  }
+}
+    
+int main() {  
+
+  /***********************************/
+  // timers 
+  lt_10msec_init();
+
+  //********************
+  //uLan init
+  ul_fd_rx=ul_open(NULL, NULL);
+  ul_fd_tx=ul_open(NULL, NULL);
+  ul_setidstr(ul_fd_rx,ul_idstr);
+  ul_setmyadr(ul_fd_rx,2);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd_rx,&msginfo);
+  ul_stroke(ul_fd_rx);
+  //unconfigure ->
+  ulan_configured=0;
+
+  //********************
+  // USB init
+  memset( &usb_device, 0, sizeof( usb_device));
+  usb_device.id = 1;
+  usb_device.init = usb_lpc_init;
+  usb_debug_set_level(DEBUG_LEVEL_NONE);
+  usb_device.cntep = 2;
+  usb_device.ep = eps;
+
+  eps[0].max_packet_size = USB_MAX_PACKET;
+  eps[1].max_packet_size = USB_MAX_PACKET;
+  eps[0].epnum = 0x01;
+  eps[1].epnum = 0x81;
+  eps[0].event_mask = 0x04;
+  eps[1].event_mask = 0x08;
+  eps[0].udev = &usb_device;
+  eps[1].udev = &usb_device;
+
+  usb_device.vendor_fnc=usb_u2u_vendor;
+
+  usb_init(&usb_device);
+  usb_connect(&usb_device);
+
+  //********************
+  //start
+  timer_rx_off=timer_tx_off=timer_str=timer_configured=0;
+  ul_dcnv_init(&ep1_dcnv_state,ul_fd_tx,ul_fd_rx);
+
+  while(1){
+  
+    usb_check_events(&usb_device);
+    usb_control_response(&usb_device);
+        
+    if (usb_device.ep_events & MASK_EP1RX) {  //EP1RX
+      int size;
+      size=usb_udev_read_endpoint(&eps[0],ep1_rx_buff,USB_MAX_PACKET);
+      ul_dcnv_send(&ep1_dcnv_state,ep1_rx_buff,size);
+      usb_device.ep_events &= ~MASK_EP1RX;
+      timer_tx_off=5;          //rozsviceni diod pri vysilani 
+      CLR_OUT_PIN(LED_PORT,LED1_BIT);
+    }
+
+    if(usb_device.ep_events & MASK_EP1TX){
+      ep1_dcnv_state.rx_wait4host=0;
+      usb_device.ep_events &= ~MASK_EP1TX;
+    }
+
+    if (!ep1_dcnv_state.rx_wait4host) { // EP1TX
+      int size=ul_dcnv_rec(&ep1_dcnv_state, ep1_tx_buff, USB_MAX_PACKET);
+      if (size){
+        usb_udev_write_endpoint(&eps[1],ep1_tx_buff,size);
+        ep1_dcnv_state.rx_wait4host=1;
+      } else {
+        if (ul_dcnv_rec_start(&ep1_dcnv_state, ep1_tx_buff,8)==8) { //HEADER
+          usb_udev_write_endpoint(&eps[1],ep1_tx_buff,8);
+          timer_rx_off=5;        //rosviceni diody pri prijmu 
+          CLR_OUT_PIN(LED_PORT,LED2_BIT);
+          ep1_dcnv_state.rx_wait4host=1;
+        }
+      }
+    }
+    
+    /* 10ms timer */
+    if (lt_10msec_expired(10)) 
+      timer_10ms();
+  }
+}
diff --git a/ulan/embedded/app/u2u/ver2/u2u_vend.c b/ulan/embedded/app/u2u/ver2/u2u_vend.c
new file mode 100644 (file)
index 0000000..feb0a40
--- /dev/null
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <system_def.h>
+#include <ul_lib/ulan.h>
+#include <hal_intr.h>
+#include "u2u_vend.h"
+
+extern char ulan_configured;
+extern ul_fd_t ul_fd_rx,ul_fd_tx;
+
+int usb_u2u_vendor(usb_device_t *udev)
+{
+  int my_adr;
+  my_adr=(udev->request.wIndex & 0x3F);
+  switch ( udev->request.bRequest) {
+    case VENDOR_START_ULAN:
+      ulan_configured=0;
+      switch (udev->request.wValue) {
+        case 9600:
+          ulan_configured=1;
+          ul_setmyadr(ul_fd_rx,my_adr);
+          ul_setbaudrate(ul_fd_rx,9600);
+          break;
+        case 19200:
+          ulan_configured=1;
+          ul_setmyadr(ul_fd_rx,my_adr);
+          ul_setbaudrate(ul_fd_rx,19200);
+          break;
+        case 38400:
+          ulan_configured=1;
+          ul_setmyadr(ul_fd_rx,my_adr);
+          ul_setbaudrate(ul_fd_rx,38400);
+          break;
+        case 56800:
+          ulan_configured=1;
+          ul_setmyadr(ul_fd_rx,my_adr);
+          ul_setbaudrate(ul_fd_rx,56800);
+          break;
+      }
+      if (ulan_configured) HAL_INTERRUPT_UNMASK(UL_DRV_SYSLESS_IRQ);
+      else HAL_INTERRUPT_MASK(UL_DRV_SYSLESS_IRQ);
+      usb_send_control_data(udev,&ulan_configured,1);
+      return 1;
+    case VENDOR_STOP_ULAN:
+      ulan_configured=0;
+      HAL_INTERRUPT_MASK(UL_DRV_SYSLESS_IRQ);
+      return 1;
+    case VENDOR_IS_RUNNING_ULAN:
+      return ulan_configured;
+  }
+
+  return 0;
+}
diff --git a/ulan/embedded/app/u2u/ver2/u2u_vend.h b/ulan/embedded/app/u2u/ver2/u2u_vend.h
new file mode 100644 (file)
index 0000000..7e378ba
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef USB_VENDOR
+#define USB_VENDOR
+
+#include <usb/usb.h>
+
+#define VENDOR_START_ULAN       0     /* Inform converter about uLan driver ready */
+#define VENDOR_STOP_ULAN        1     /* Inform about uLan driver stopping  */
+#define VENDOR_IS_RUNNING_ULAN  2
+#define VENDOR_ARC_ON_ULAN      3     /* Set promiscuous monitoring mode */
+#define VENDOR_ARC_OFF_ULAN     4     /* Return to std. adress recognition mode */
+  
+int usb_u2u_vendor(usb_device_t *udev);
+  
+#endif /* USB_VENDOR */
diff --git a/ulan/embedded/app/u2u/ver2/ul_dcnv.c b/ulan/embedded/app/u2u/ver2/ul_dcnv.c
new file mode 100644 (file)
index 0000000..096858c
--- /dev/null
@@ -0,0 +1,203 @@
+#include <system_def.h>
+#include <cpu_def.h>
+#include <stdio.h>
+#include <usb/usb.h>
+#include "ul_dcnv.h"
+
+//#define U2UBFL_LNMM     0x080         /* Length of received frame must match expected len */ 
+#define U2UBFL_NORE     0x040         /* Do not try to repeat if error occurs */ 
+#define U2UBFL_TAIL     0x020         /* Message has tail frame */
+#define U2UBFL_REC      0x010         /* Request receiption of block */
+#define U2UBFL_FAIL     0x008         /* Message cannot be send - error */
+#define U2UBFL_PROC    0x004         /* Message succesfull send */
+#define U2UBFL_AAP     0x003         /* Request imediate proccessing of frame by receiver station with acknowledge */
+#define U2UBFL_PRQ     0x002         /* Request imediate proccessing of frame by receiver station */
+#define U2UBFL_ARQ     0x001         /* Request imediate acknowledge by receiving station */
+
+unsigned char 
+cbfl_ul2ps(unsigned int bfl,int proc)
+{
+  unsigned char ret=0;
+  if(bfl&UL_BFL_ARQ) ret|=U2UBFL_ARQ;
+  if(bfl&UL_BFL_PRQ) ret|=U2UBFL_PRQ;
+  if(proc) ret|=U2UBFL_PROC;
+  if(bfl&UL_BFL_FAIL) ret|=U2UBFL_FAIL;
+  if(bfl&UL_BFL_REC) ret|=U2UBFL_REC;
+  if(bfl&UL_BFL_TAIL) ret|=U2UBFL_TAIL;
+  if(bfl&UL_BFL_NORE) ret|=U2UBFL_NORE;
+  return ret;
+}
+
+unsigned int 
+cbfl_ps2ul(unsigned char bfl)
+{
+  unsigned int ret=0;
+  if(bfl&U2UBFL_ARQ) ret|=UL_BFL_ARQ;
+  if(bfl&U2UBFL_PRQ) ret|=UL_BFL_PRQ;
+  if(bfl&U2UBFL_REC) ret|=UL_BFL_REC;
+  else ret|=UL_BFL_SND;
+  if(bfl&U2UBFL_TAIL) ret|=UL_BFL_TAIL;
+  if(bfl&U2UBFL_NORE) ret|=UL_BFL_NORE;
+  return ret;
+}
+
+int 
+ul_dcnv_init(ul_dcnv_state_t XDATA *cnvst,ul_fd_t tx_fd,ul_fd_t rx_fd) 
+{
+  cnvst->tx_2send=-1;
+  cnvst->rx_2rec=-1;           //wait for request for receiving
+  cnvst->tx_error=cnvst->rx_error=0;
+  cnvst->rx_wait4host=0;
+#ifndef UL_WITHOUT_HANDLE 
+  cnvst->tx_fd=tx_fd;
+  cnvst->rx_fd=rx_fd;
+  cnvst->tx_tail=0;
+  cnvst->rx_tail=0;
+  cnvst->stamp_queue.head=cnvst->stamp_queue.stamps;
+  cnvst->stamp_queue.tail=cnvst->stamp_queue.head;
+#endif
+
+  return 0;
+}
+
+int 
+ul_dcnv_send(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+ #endif /*UL_WITHOUT_HANDLE*/
+  int ret=0,stamp;
+
+  if (cnvst->tx_2send==-1) {
+    if(size<8) return 0;
+    cnvst->tx_2send =buff[6]+buff[7]*0x100;
+    msginfo.dadr=buff[0]&0x7F;  // dadr
+    msginfo.sadr=buff[1]&0x7F;  // sadr
+    msginfo.cmd =buff[2];       // cmd
+    msginfo.flg =cbfl_ps2ul(buff[3]); // flg zpravy
+    msginfo.flg |= UL_BFL_M2IN;
+    cnvst->tx_psstamp=buff[4];      // stamp
+    if(cnvst->tx_tail) {
+      msginfo.len=cnvst->tx_2send;
+      ret = ul_tailmsg(cnvst->tx_fd, &msginfo);
+    } else
+      ret = ul_newmsg(cnvst->tx_fd, &msginfo);
+    if(ret<0) {
+      cnvst->tx_error++;
+      return -1;
+    }
+    cnvst->tx_tail=msginfo.flg&UL_BFL_TAIL?1:0;
+    buff+=8;
+  } else {
+    if (cnvst->tx_2send>0) {
+      if(ul_write(cnvst->tx_fd, buff, size) != size){
+        cnvst->tx_error++;
+        ret=-1;
+      }
+      cnvst->tx_2send-=size;
+    }
+  }
+  if (cnvst->tx_2send<=0) {
+    cnvst->tx_2send=-1;
+    if(!cnvst->tx_tail){
+      stamp=ul_freemsg(cnvst->tx_fd);
+      if(stamp>=0){
+        cnvst->stamp_queue.head->ps=cnvst->tx_psstamp;
+        cnvst->stamp_queue.head->ul=stamp;
+        ps2ul_stamp_idx_inc(&cnvst->stamp_queue, &cnvst->stamp_queue.head);
+      }
+    }
+  }
+  return ret;
+}
+
+int 
+ul_dcnv_rec(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+  int ret;
+  if (cnvst->rx_2rec == -1) {
+    return 0;
+  } else {
+    if(size>cnvst->rx_2rec) size=cnvst->rx_2rec;
+    ret=ul_read(cnvst->rx_fd, buff, size);
+    if(ret!=size){
+      cnvst->rx_error++;
+      ret=-2;
+      cnvst->rx_2rec=-1;
+      ul_abortmsg(cnvst->rx_fd);
+    } else {
+      cnvst->rx_2rec-=size;
+      if(!cnvst->rx_2rec) {
+        cnvst->rx_2rec=-1;
+        if(!cnvst->rx_tail) {
+          ul_freemsg(cnvst->rx_fd);
+        }
+      }
+    }
+    return ret;
+  }
+}
+
+int 
+ul_dcnv_rec_start(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size)
+{
+  ul_msginfo msginfo;
+  int proc, psstamp, ret;
+  ps2ul_stamp_t *stamp_p;
+
+  
+  ul_inepoll(cnvst->tx_fd);
+
+  /* I can't call ul_acceptmsg during processing of a tx message (tail) - tx message will be freed */
+  if ((cnvst->tx_2send==-1) && (cnvst->tx_tail==0) &&
+      (ul_acceptmsg(cnvst->tx_fd, &msginfo)>=0)) { 
+    ul_freemsg(cnvst->tx_fd);
+  }
+
+  if (cnvst->rx_2rec==-1){
+    proc=0;
+    psstamp=0;
+    if (cnvst->rx_tail) {
+      ret=ul_actailmsg(cnvst->rx_fd, &msginfo);
+      psstamp=cnvst->rx_tail_stamp;
+      proc=1;
+    } else
+      ret=ul_acceptmsg(cnvst->rx_fd, &msginfo);
+    if (ret<0) return 0;
+    cnvst->rx_2rec=msginfo.len;
+    stamp_p=cnvst->stamp_queue.tail;
+    while(stamp_p!=cnvst->stamp_queue.head){
+      if(stamp_p->ul==msginfo.stamp){
+        psstamp=stamp_p->ps;
+        cnvst->rx_tail_stamp=psstamp;
+        if(!(msginfo.flg&UL_BFL_FAIL))
+          proc=1;
+        ps2ul_stamp_idx_inc(&cnvst->stamp_queue, &stamp_p);
+        cnvst->stamp_queue.tail=stamp_p;
+       break;
+      }
+      ps2ul_stamp_idx_inc(&cnvst->stamp_queue, &stamp_p);
+    }
+    if (proc && !(msginfo.flg&UL_BFL_REC))
+      cnvst->rx_2rec=0;
+    buff[0]=msginfo.dadr;      
+    buff[1]=msginfo.sadr;
+    buff[2]=msginfo.cmd;       
+    buff[3]=cbfl_ul2ps(msginfo.flg,proc);
+    buff[4]=psstamp;
+    buff[5]=0;
+    buff[6]=cnvst->rx_2rec%0x100;  
+    buff[7]=cnvst->rx_2rec/0x100;
+    if ((cnvst->rx_tail) || !(msginfo.flg&UL_BFL_TAIL) || (msginfo.flg&UL_BFL_FAIL)) {
+      cnvst->rx_tail=0;
+      if (cnvst->rx_2rec<=0) {
+        ul_freemsg(cnvst->rx_fd);
+        cnvst->rx_2rec=-1;    
+      }
+    } else 
+      cnvst->rx_tail=1;
+    buff+=8; size-=8;
+    return 8;
+  } else 
+    return 0;
+}
diff --git a/ulan/embedded/app/u2u/ver2/ul_dcnv.h b/ulan/embedded/app/u2u/ver2/ul_dcnv.h
new file mode 100644 (file)
index 0000000..2f34bd9
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef _UL_DCNV_H
+#define _UL_DCNV_H
+
+#include "ul_lib/ulan.h"
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#ifndef XDATA
+  #define XDATA
+#endif
+
+#ifndef UL_WITHOUT_HANDLE 
+
+#define PS2UL_INPROC_MAX 16
+
+typedef struct ps2ul_stamp {
+  int ul;
+  unsigned char ps;
+} ps2ul_stamp_t;
+
+typedef struct ps2ul_stamp_queue {
+  ps2ul_stamp_t *head;
+  ps2ul_stamp_t *tail;
+  ps2ul_stamp_t stamps[PS2UL_INPROC_MAX];
+} ps2ul_stamp_queue_t;
+
+static inline void ps2ul_stamp_idx_inc(ps2ul_stamp_queue_t *queue, ps2ul_stamp_t **ptr)
+{
+  ps2ul_stamp_t *p=(*ptr);
+  p++;
+  if(p>queue->stamps+PS2UL_INPROC_MAX)
+    p=queue->stamps;
+  *ptr=p;
+}
+
+#endif /*UL_WITHOUT_HANDLE*/
+
+typedef struct ul_dcnv_state_t {
+  int tx_2send;
+  int tx_error;
+  int rx_2rec;
+  int rx_error;
+  int rx_wait4host;
+#ifndef UL_WITHOUT_HANDLE 
+  ul_fd_t tx_fd;
+  ul_fd_t rx_fd;
+  int tx_tail;
+  int rx_tail;
+  int rx_tail_stamp;
+  ps2ul_stamp_queue_t stamp_queue;
+  unsigned char tx_psstamp;
+#endif /*UL_WITHOUT_HANDLE*/
+} ul_dcnv_state_t;
+
+int ul_dcnv_init(ul_dcnv_state_t XDATA *cnvst,ul_fd_t tx_fd,ul_fd_t rx_fd);
+int ul_dcnv_send(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+int ul_dcnv_rec(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+int ul_dcnv_rec_start(ul_dcnv_state_t XDATA *cnvst, unsigned char XDATA *buff, int size);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_UTIL_H */
diff --git a/ulan/embedded/app/u2u/ver2/ul_idstr.c b/ulan/embedded/app/u2u/ver2/ul_idstr.c
new file mode 100644 (file)
index 0000000..9387a39
--- /dev/null
@@ -0,0 +1,27 @@
+#include <local_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/u2u/ver2/ul_idstr.h b/ulan/embedded/app/u2u/ver2/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/u2u/ver2/usb/CVS/Entries b/ulan/embedded/app/u2u/ver2/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..f823c7e
--- /dev/null
@@ -0,0 +1,2 @@
+/usb_defs.h/1.2/Fri May 25 19:14:29 2007//
+D
diff --git a/ulan/embedded/app/u2u/ver2/usb/CVS/Repository b/ulan/embedded/app/u2u/ver2/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..a08f191
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/u2u/ver2/usb
diff --git a/ulan/embedded/app/u2u/ver2/usb/CVS/Root b/ulan/embedded/app/u2u/ver2/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/u2u/ver2/usb/usb_defs.h b/ulan/embedded/app/u2u/ver2/usb/usb_defs.h
new file mode 100644 (file)
index 0000000..c3e3f83
--- /dev/null
@@ -0,0 +1,376 @@
+
+#ifndef USB_DEFS_MODULE
+  #define USB_DEFS_MODULE
+  
+  #include <usb/usb_spec.h>
+//  #include <usb/pdiusb.h>
+  #include <usb/lpcusb.h>
+  #include <endian.h>
+  #include <cpu_def.h>
+
+  #include <endian.h>
+  #if __BYTE_ORDER == __BIG_ENDIAN
+    #include <byteswap.h>
+    #define SWAP(x) ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
+  #else /*__LITTLE_ENDIAN*/
+    #define SWAP(x) (x)
+  #endif
+
+  #ifndef CODE
+    #define CODE
+  #endif
+    
+/*****************************************************/
+/*** Static data structures for device descriptors ***/
+/*****************************************************/
+#ifndef USB_VENDOR_ID
+  #define USB_VENDOR_ID      0xDEAD  /* vymyslene cislo ( snad ho nikdo nema ... ;-) */
+#endif
+#ifndef USB_PRODUCT_ID
+  #define USB_PRODUCT_ID     0x1001  /* test code for ULAD21 */
+#endif
+  #define USB_RELEASE_VER    0x0100
+
+/*** Class codes for device description ***/
+  #define USB_CLASS_CODE      0xFF
+  #define USB_SUBCLASS_CODE   0x00
+  #define USB_PROTOCOL_CODE   0x00
+  
+  
+  #define NUM_ENDPOINTS  2
+  #define CONFIG_DESCRIPTOR_LENGTH sizeof( USB_CONFIGURATION_DESCRIPTOR) \
+                                     + sizeof( USB_INTERFACE_DESCRIPTOR) \
+                                     + ( NUM_ENDPOINTS * sizeof( USB_ENDPOINT_DESCRIPTOR))
+
+/*** Device descriptor ***/
+  CODE const USB_DEVICE_DESCRIPTOR DeviceDescription = {
+    sizeof( USB_DEVICE_DESCRIPTOR),
+    USB_DESCRIPTOR_TYPE_DEVICE,
+    SWAP( 0x0100),
+    USB_CLASS_CODE,
+    USB_SUBCLASS_CODE,
+    USB_PROTOCOL_CODE,
+    USB_MAX_PACKET0,
+    SWAP( USB_VENDOR_ID),
+    SWAP( USB_PRODUCT_ID),  
+    SWAP( USB_RELEASE_VER),
+    1, /* manufacturer string ID */
+    2, /* product string ID */
+    3, /* serial number string ID */
+    1
+  };
+  
+/*** All In Configuration 0 ***/
+  CODE const struct {
+    USB_CONFIGURATION_DESCRIPTOR configuration;
+    USB_INTERFACE_DESCRIPTOR interface;
+    USB_ENDPOINT_DESCRIPTOR endpoint_tx;
+    USB_ENDPOINT_DESCRIPTOR endpoint_rx;
+  } ConfigDescription = {
+    /*** Configuration descriptor ***/
+    {
+      sizeof( USB_CONFIGURATION_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_CONFIGURATION,
+      SWAP( CONFIG_DESCRIPTOR_LENGTH),
+      1, /* cnt of interfaces */
+      1, /* this configuration ID */
+      4, /* config.name string ID*/
+      0x80, /* cfg, in spec is, taha bit 7 must be set to one -> 0xe0 , orig 0x60*/ 
+      0x32    /* device power current from host 100mA */
+    },
+    /*** Interface Descriptor ***/
+    {
+      sizeof( USB_INTERFACE_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_INTERFACE,
+      0,    /* index of this interface for SetInterface request */
+      0,    /* ID alternate interface */
+      NUM_ENDPOINTS,
+      USB_CLASS_CODE,
+      USB_SUBCLASS_CODE,
+      USB_PROTOCOL_CODE,
+      5
+    },
+    /*** Endpoint 1 - Tx,Bulk ***/
+    {
+      sizeof( USB_ENDPOINT_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_ENDPOINT,
+      0x01,
+      USB_ENDPOINT_TYPE_BULK,
+      SWAP( USB_MAX_PACKET),
+      0
+    },
+    /*** Endpoint 1 - Rx,Bulk ***/
+    {
+      sizeof( USB_ENDPOINT_DESCRIPTOR),
+      USB_DESCRIPTOR_TYPE_ENDPOINT,
+      0x81,
+      USB_ENDPOINT_TYPE_BULK,
+      SWAP( USB_MAX_PACKET),
+      0
+    }    
+  };
+  /*** Strings - in unicode ***/
+  CODE const char Str0Desc[] = {  /* supported languages of strings */
+    4, 0x03,  /* 2+2*N , N is count of supported languages */
+    0x09,0x04 /* english 0x0409 */
+  };
+  
+  CODE const char Str1Desc[] = {  /* 1 = manufacturer */  
+    48,0x03,
+    'S',0,
+    'm',0,
+    'o',0,
+    'l',0,
+    'i',0,
+    'k',0,
+    ',',0,
+    'B',0,
+    'a',0,
+    'r',0,
+    't',0,
+    'o',0,
+    's',0,
+    'i',0,
+    'n',0,
+    's',0,
+    'k',0,
+    'i',0,
+    ',',0,
+    'P',0,
+    'i',0,
+    's',0,
+    'a',0
+  };
+
+  CODE const char Str2Desc[] = {  /* 2 = product */
+    38, 0x03,                                               
+    'u',0,
+    'L',0,
+    'a',0,
+    'n',0,
+    '2',0,
+    'u',0,
+    's',0,
+    'b',0,
+    ' ',0,
+    'c',0,
+    'o',0,
+    'n',0,
+    'v',0,
+    'e',0,
+    'r',0,
+    't',0,
+    'o',0,
+    'r',0
+  };
+
+
+  CODE const char Str3Desc[] = {  /* 3 = version */
+    26, 0x03,                                               
+    '2',0,
+    '3',0,
+    '.',0,
+    '0',0,
+    '7',0,
+    '.',0,
+    '0',0,
+    '4',0,
+    '-',0,
+    '1',0,
+    '.',0,
+    '1',0
+  };
+  CODE const char Str4Desc[] = {  /* 4 = configuration */
+    34, 0x03,                                               
+    'C',0,
+    'o',0,
+    'n',0,
+    'f',0,
+    'i',0,
+    'g',0,
+    'u',0,
+    'r',0,
+    'a',0,
+    't',0,
+    'i',0,
+    'o',0,
+    'n',0,
+    ' ',0,
+    '#',0,
+    '1',0
+  };
+  CODE const char Str5Desc[] = {  /* 5 = interface */
+    26,0x03,                                               
+    'I',0,
+    'n',0,
+    't',0,
+    'e',0,
+    'r',0,
+    'f',0,
+    'a',0,
+    'c',0,
+    'e',0,
+    ' ',0,
+    '#',0,
+    '0',0
+  };
+
+  CODE const char Str6Desc[] = {  /* EP1 OUT descriptor */
+    136,0x03,  
+    'E',0,
+    'P',0,
+    '1',0,
+    'O',0,
+    'U',0,
+    'T',0,
+    '-',0,
+    's',0,
+    'e',0,
+    'n',0,
+    'd',0,
+    ' ',0,
+    'm',0,
+    'e',0,
+    's',0,
+    's',0,
+    'a',0,
+    'g',0,
+    'e',0,
+    '-',0,
+    'd',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    's',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    'c',0,
+    'm',0,
+    'd',0,
+    ',',0,
+    'f',0,
+    'l',0,
+    'g',0,
+    ',',0,
+    's',0,
+    't',0,
+    'a',0,
+    'm',0,
+    'p',0,
+    ',',0,
+    'f',0,
+    'r',0,
+    'e',0,
+    'e',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'l',0,
+    'o',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'h',0,
+    'i',0,
+    ',',0,
+    'd',0,
+    'a',0,
+    't',0,
+    'a',0
+  };
+
+  CODE const char Str7Desc[] = {  /* EP2 IN descriptor */
+    140,0x03,
+    'E',0,
+    'P',0,
+    '1',0,
+    'I',0,
+    'N',0,
+    '-',0,
+    'r',0,
+    'e',0,
+    'c',0,
+    'e',0,
+    'i',0,
+    'v',0,
+    'e',0,
+    ' ',0,
+    'm',0,
+    'e',0,
+    's',0,
+    's',0,
+    'a',0,
+    'g',0,
+    'e',0,
+    '-',0,
+    'd',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    's',0,
+    'a',0,
+    'd',0,
+    'r',0,
+    ',',0,
+    'c',0,
+    'm',0,
+    'd',0,
+    ',',0,
+    'f',0,
+    'l',0,
+    'g',0,
+    ',',0,
+    's',0,
+    't',0,
+    'a',0,
+    'm',0,
+    'p',0,
+    ',',0,
+    'f',0,
+    'r',0,
+    'e',0,
+    'e',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'l',0,
+    'o',0,
+    ',',0,
+    'l',0,
+    'e',0,
+    'n',0,
+    '-',0,
+    'h',0,
+    'i',0,
+    ',',0,
+    'd',0,
+    'a',0,
+    't',0,
+    'a',0
+  };
+
+  #define CNT_STRINGS 0x08
+  
+  /* all strings in pointers array */
+  CODE const PUSB_STRING_DESCRIPTOR StringDescriptors[] = {
+    (PUSB_STRING_DESCRIPTOR) Str0Desc,
+    (PUSB_STRING_DESCRIPTOR) Str1Desc,
+    (PUSB_STRING_DESCRIPTOR) Str2Desc,
+    (PUSB_STRING_DESCRIPTOR) Str3Desc,
+    (PUSB_STRING_DESCRIPTOR) Str4Desc,
+    (PUSB_STRING_DESCRIPTOR) Str5Desc,
+    (PUSB_STRING_DESCRIPTOR) Str6Desc,
+    (PUSB_STRING_DESCRIPTOR) Str7Desc
+  };
+
+#endif /* USB_DEFS_MODULE */
diff --git a/ulan/embedded/app/u2u/ver2/usb_srq.c b/ulan/embedded/app/u2u/ver2/usb_srq.c
new file mode 100644 (file)
index 0000000..925130a
--- /dev/null
@@ -0,0 +1,239 @@
+/*****************************************************/
+/***   Module : USB module                         ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <string.h>
+#include <cpu_def.h>
+#include <system_def.h>
+#include <usb/usb.h>
+#include <usb/usb_spec.h>
+#include <usb/usbdebug.h>
+#include <usb/usb_srq.h>
+#include <usb/usb_defs.h>
+#include <usb/lpcusb.h>
+#include "ul_dcnv.h"
+
+extern ul_dcnv_state_t ep1_dcnv_state;
+
+  // ****************************
+  int usb_stdreq_get_status( usb_device_t *udev)
+  {
+    unsigned char c,buf[2] = { 0, 0};
+    unsigned char epid = (unsigned char) udev->request.wIndex;
+    usb_ep_t *ep0 = &(udev->ep0);
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
+    switch( udev->request.bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( udev->flags & USB_FLAG_REMOTE_WAKE) //.remote_wake_up == 1)
+          buf[0] = USB_GETSTATUS_REMOTE_WAKEUP_ENABLED | USB_GETSTATUS_SELF_POWERED;
+        else
+          buf[0] = USB_GETSTATUS_SELF_POWERED;
+        break;
+      case USB_RECIPIENT_INTERFACE:
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+/*        if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+          c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
+        else
+          c = pdiSelectEp(pdiEp2Idx(epid));     // endpoint Out
+          #ifdef PDIUSBD12
+          buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
+          #else
+          buf[0] = 0;
+          #endif*/
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    usb_udev_write_endpoint( ep0, buf, 2);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_clear_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("ClearFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags &= ~USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 0;
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          lpc_usb_clrstallEP(epid); 
+          usb_udev_ack_setup( udev);
+         //initialize state of ulan convertor
+         switch (epid&(USB_ENDPOINT_DIRECTION_MASK|0x03)) {
+           case 0x01:                          //rx USB -> tx ulan
+             ul_freemsg(ep1_dcnv_state.tx_fd);
+              ep1_dcnv_state.tx_2send=-1;
+             break;
+           case 0x81:                          //tx USB -> rx ulan
+             ul_freemsg(ep1_dcnv_state.rx_fd);
+              ep1_dcnv_state.rx_2rec=-1;
+              ep1_dcnv_state.rx_wait4host=0;
+             break;
+         }
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags |= USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 1;
+          lpc_usb_setstallEP (epid); 
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_address( usb_device_t *udev)
+  {
+    int adr;
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    adr=dreq->wValue & DEVICE_ADDRESS_MASK;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr-%d\n",adr));
+    usb_udev_ack_setup( udev);
+    lpc_usb_set_addr(adr);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_get_configuration( usb_device_t *udev)
+  {
+    unsigned char buf = udev->configuration; //usb_flags.configured;
+    usb_ep_t *ep0 = &(udev->ep0);
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
+    usb_udev_write_endpoint( ep0, &buf, 1);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_configuration( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char iCfg = dreq->wValue & 0xff;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
+    if ( iCfg < 2) {       // put device in unconfigured state or set configuration 1 ( no else)
+      usb_udev_ack_setup( udev);
+      lpc_usb_config_device(iCfg);
+      if ( iCfg) {
+        udev->flags |= USB_FLAG_CONFIGURED;
+        lpc_usb_configEP(0x01,USB_MAX_PACKET0);
+        lpc_usb_configEP(0x81,USB_MAX_PACKET0);
+      } else {
+        udev->flags &= ~USB_FLAG_CONFIGURED;
+      }
+      udev->configuration = iCfg;  //usb_flags.configured = iCfg;
+      return USB_COMPLETE_OK;
+    } else 
+      return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_get_interface( usb_device_t *udev)
+  {
+    unsigned char buf = 0; /// udev->interface
+    usb_ep_t *ep0 = &(udev->ep0);
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
+    usb_udev_write_endpoint( ep0, &buf, 1);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_interface( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetIface\n"));
+    if (( dreq->wValue == 0) && ( dreq->wIndex == 0)) {
+      usb_udev_ack_setup( udev);
+      return USB_COMPLETE_OK;
+    } else {
+      return USB_COMPLETE_FAIL;
+    }
+  }
+
+  int usb_stdreq_get_descriptor( usb_device_t *udev)
+  {
+    unsigned char *pDesc;
+    unsigned short Len = 0;
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    int i;
+
+    i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetDesc\n"));
+    usb_debug_print( DEBUG_LEVEL_VERBOSE, ( " - %s desc.\n", /*(unsigned int)*/ usb_debug_get_std_descriptor(i)));
+
+    switch (i) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:
+        pDesc = (unsigned char *)&DeviceDescription;
+        Len = sizeof( USB_DEVICE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:
+        pDesc = (unsigned char *)&ConfigDescription;
+        Len = CONFIG_DESCRIPTOR_LENGTH;
+        break;
+      case USB_DESCRIPTOR_TYPE_INTERFACE:
+        pDesc = (unsigned char *)&ConfigDescription.interface;
+        Len = sizeof( USB_INTERFACE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_STRING:
+        i = dreq->wValue & 0xff; /* LSB part of wValue */
+        /*printf("Get descriptor indx=0x%02x\n", i);*/
+        if ( i < CNT_STRINGS) {
+          pDesc = (unsigned char *) StringDescriptors[ i];
+          Len = *pDesc;
+          /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
+        } else {
+          return USB_COMPLETE_FAIL;
+        }
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    if ( dreq->wLength < Len) Len = dreq->wLength;
+    usb_send_control_data( udev, pDesc, Len);
+    return USB_COMPLETE_OK;
+  }
+
+
+/*  
+  void usb_init_stdreq_fnc( usb_device_t *udev)
+  {
+    // memset( udev->stdreq, 0, sizeof(udev->stdreq));
+    
+    udev->stdreq[USB_REQUEST_GET_STATUS] = usb_stdreq_get_status;
+    udev->stdreq[USB_REQUEST_CLEAR_FEATURE] = usb_stdreq_clear_feature;
+    udev->stdreq[USB_REQUEST_SET_FEATURE] = usb_stdreq_set_feature;
+    udev->stdreq[USB_REQUEST_SET_ADDRESS] = usb_stdreq_set_address;
+    udev->stdreq[USB_REQUEST_GET_DESCRIPTOR] = usb_stdreq_get_descriptor;
+    udev->stdreq[USB_REQUEST_GET_CONFIGURATION] = usb_stdreq_get_configuration;
+    udev->stdreq[USB_REQUEST_SET_CONFIGURATION] = usb_stdreq_set_configuration;
+    udev->stdreq[USB_REQUEST_GET_INTERFACE] = usb_stdreq_get_interface;
+    udev->stdreq[USB_REQUEST_SET_INTERFACE] = usb_stdreq_set_interface;
+  }
+*/
diff --git a/ulan/embedded/app/ulboot/CVS/Entries b/ulan/embedded/app/ulboot/CVS/Entries
new file mode 100644 (file)
index 0000000..13f88ca
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Mon Sep 25 20:25:47 2006//
+/Makefile.omk/1.5/Wed Nov 22 19:32:15 2006//
+/msc_hcr-hisc.asm/1.1/Thu Nov  9 23:18:53 2006//
+/msc_hcr-ulad21.asm/1.1/Thu Nov  9 23:18:53 2006//
+/ul_idstr.c/1.2/Wed Nov 22 19:32:15 2006//
+/ul_idstr.h/1.1/Mon Sep 25 20:25:47 2006//
+/ulboot.c/1.9/Thu Jan 18 20:55:56 2007//
+D
diff --git a/ulan/embedded/app/ulboot/CVS/Repository b/ulan/embedded/app/ulboot/CVS/Repository
new file mode 100644 (file)
index 0000000..414ab80
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/app/ulboot
diff --git a/ulan/embedded/app/ulboot/CVS/Root b/ulan/embedded/app/ulboot/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/app/ulboot/Makefile b/ulan/embedded/app/ulboot/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/app/ulboot/Makefile.omk b/ulan/embedded/app/ulboot/Makefile.omk
new file mode 100644 (file)
index 0000000..e357045
--- /dev/null
@@ -0,0 +1,44 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_ULBOOT=n
+
+ifeq ($(CONFIG_ULBOOT),y)
+
+ULAN_ID=ulboot
+
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+default_CONFIG += CONFIG_MISC_VECT=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I.
+
+include_HEADERS  = ul_idstr.h
+
+ifeq ($(ARCH),mcs51)
+CFLAGS += -DKEYVAL_START=$(KVPB_BASE) -DKEYVAL_PAGE_LEN=$(KVPB_SIZE) -DMEM_APP_START=$(PROG_BASE)
+endif # ARCH
+
+bin_PROGRAMS = ulboot
+ulboot_SOURCES = ulboot.c 
+
+ifeq ($(MACH),msc1210)
+ulboot_SOURCES +=  msc_hcr-$(BOARD).asm
+endif #MACH
+
+ifeq ($(ARCH),mcs51)
+lib_LOADLIBES =  bspbase ulan keyval mcuflash uldy misc
+endif
+
+ifeq ($(ARCH),arm)
+ulboot_SOURCES +=  ul_idstr.c
+lib_LOADLIBES =  bspbase ul_drv lpciap keyval lpciap_kvpb mach_hal uldy
+ulboot_MOREOBJS = $(USER_LIB_DIR)/system_stub.o $(USER_LIB_DIR)/ivt.o
+endif
+
+link_VARIANTS = boot
+
+endif #CONFIG_ULBOOT
diff --git a/ulan/embedded/app/ulboot/msc_hcr-hisc.asm b/ulan/embedded/app/ulboot/msc_hcr-hisc.asm
new file mode 100644 (file)
index 0000000..539a467
--- /dev/null
@@ -0,0 +1,6 @@
+CSEG   AT  0807EH      ;Address of HCR1\r
+       DB  011111111b  ;HCR1:  76:DBLSEL 54:ABLSEL 3:DAB 2:DDB 1:EGP0\r
+                               ;0:EGP23\r
+       DB  010011111b  ;HCR0: 7:EPMA 6:PML 5:RSL 4:EBR 3:EWDR 210:DFSEL\r
+\r
+        END\r
diff --git a/ulan/embedded/app/ulboot/msc_hcr-ulad21.asm b/ulan/embedded/app/ulboot/msc_hcr-ulad21.asm
new file mode 100644 (file)
index 0000000..b91b807
--- /dev/null
@@ -0,0 +1,6 @@
+CSEG   AT  0807EH      ;Address of HCR1\r
+       DB  011111100b  ;HCR1:  76:DBLSEL 54:ABLSEL 3:DAB 2:DDB 1:EGP0\r
+                               ;0:EGP23\r
+       DB  010011111b  ;HCR0: 7:EPMA 6:PML 5:RSL 4:EBR 3:EWDR 210:DFSEL\r
+\r
+        END\r
diff --git a/ulan/embedded/app/ulboot/ul_idstr.c b/ulan/embedded/app/ulboot/ul_idstr.c
new file mode 100644 (file)
index 0000000..9387a39
--- /dev/null
@@ -0,0 +1,27 @@
+#include <local_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+const char *ul_idstr = NAME;
diff --git a/ulan/embedded/app/ulboot/ul_idstr.h b/ulan/embedded/app/ulboot/ul_idstr.h
new file mode 100644 (file)
index 0000000..2221d1d
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _UL_IDSTR_H
+#define _UL_IDSTR_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+extern const char *ul_idstr;
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_IDSTR_H */
diff --git a/ulan/embedded/app/ulboot/ulboot.c b/ulan/embedded/app/ulboot/ulboot.c
new file mode 100644 (file)
index 0000000..d37d4c0
--- /dev/null
@@ -0,0 +1,179 @@
+#include <system_def.h>
+#include <keyval_id.h>
+#include <ul_lib/ulan.h>
+#include <uldy_base.h>
+#include <lt_timer.h>
+#include <local_config.h>
+#ifndef SDCC
+  #include <mem_loc.h>
+  #include <hal_machperiph.h>
+  #include <keyval_loc.h>
+  #include <lpciap_kvpb.h>
+  #include <ul_idstr.h>
+#else
+  #include <vect.h>
+  void timer(void);
+#endif /* SDCC */
+
+LT_TIMER_DEC(lt_100msec)
+LT_TIMER_IMP(lt_100msec)
+LT_TIMER_DEC(lt_2sec)
+LT_TIMER_IMP(lt_2sec)
+
+/***********************************/
+// global variables
+KVPB_BLOCK_LOC kvpb_block_t kvpb_block_global;
+UL_DYAC_VAR_LOC ul_dyac_t ul_dyac_global;
+
+#ifndef UL_WITHOUT_HANDLE
+kvpb_block_t *kvpb_block=&kvpb_block_global;
+ul_dyac_t *ul_dyac=&ul_dyac_global;
+ul_fd_t ul_fd;
+ul_msginfo msginfo;
+#endif /* UL_WITHOUT_HANDLE */
+
+/* ulan variables */
+unsigned int XDATA uaddr;
+unsigned long XDATA usn;
+//uint16_t ustatus;
+
+typedef void (*FNC)(); //function ptr
+
+/***********************************/
+int sys_err() 
+{
+  unsigned char i=0;
+
+  while(1) {
+   #ifdef SDCC
+    /* serve interrupt rutine for timer */
+    timer();      
+   #endif
+
+    if (lt_100msec_expired(100)) {
+      i++;
+      if (i&1) {
+        SET_OUT_PIN(LED_PORT,LED_ERR);
+      } else {
+        CLR_OUT_PIN(LED_PORT,LED_ERR);
+      }
+     #ifdef WATCHDOG_ENABLED
+      watchdog_feed();
+     #endif /* WATCHDOG_ENABLED */
+    }
+  }
+}
+
+/***********************************/
+char ul_save_sn(uint32_t usn)
+{
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+  return 0;
+}
+
+/***********************************/
+char ul_save_adr(uint8_t uaddr_new)
+{
+  uaddr=uaddr_new;
+  kvpb_set_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  return 0;
+}
+
+/***********************************/
+int main(void) 
+{
+
+  /***********************************/
+  // timers 
+  lt_100msec_init();
+  lt_2sec_init();
+
+//  ustatus=0;
+  CLR_OUT_PIN(LED_PORT,LED_GP);
+
+  /***********************************/
+  // kvpb init
+  kvpb_block->base=(CODE uint8_t *)KEYVAL_START;
+  kvpb_block->size=KEYVAL_PAGE_LEN;
+  kvpb_block->flags=KVPB_DEFAULT_FLAGS;
+ #ifndef KVPB_MINIMALIZED
+  kvpb_block->chunk_size=KVPB_CHUNK_SIZE;
+  kvpb_block->erase=kvpb_erase;
+  kvpb_block->copy=kvpb_copy;
+  kvpb_block->flush=kvpb_flush;
+ #endif
+  if (kvpb_check(kvpb_block,1)<0) sys_err();
+
+  /***********************************/
+  // set configuration for device
+  uaddr=62;
+  usn=0;
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,sizeof(unsigned int),&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,sizeof(unsigned long),&usn);
+
+  /***********************************/
+  // ulan init
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+  ul_drv_init();
+ #endif
+  ul_fd=ul_open(NULL,NULL);
+  if (ul_fd==UL_FD_INVALID) sys_err();    
+  ul_setidstr(ul_fd,ul_idstr);
+  ul_setmyadr(ul_fd,uaddr);
+  msginfo.sadr=0;
+  msginfo.dadr=0;
+  msginfo.cmd=0;
+  ul_addfilt(ul_fd,&msginfo);
+  ul_stroke(ul_fd);
+  
+  /***********************************/
+  // uLan dyac init
+  uldy_init(ULDY_ARG_ul_dyac ULDY_ARG_ul_fd ul_save_sn,ul_save_adr,(char*)ul_idstr,usn);
+
+  /********************/
+  // start
+  while (1) {
+    if(!(ul_dyac->boot_activated)) {
+      if(*(int CODE*)MEM_APP_START != (int) ~0)
+        if(lt_2sec_expired(2000))
+          break;
+    }
+
+   #ifdef SDCC
+    /* serve interrupt rutine for uLan */
+    ul_int();
+
+    /* serve interrupt rutine for timer */
+    timer();      
+   #endif
+
+    /* test for ulan message */
+    if(ul_inepoll(ul_fd)>0){
+      uldy_process_msg(ULDY_ARG_ul_dyac NULL);
+    }
+
+    /* test request for address */
+    if (uldy_rqa(ULDY_ARG1_ul_dyac)) 
+      uldy_addr_rq(ULDY_ARG1_ul_dyac);
+
+    
+   #ifdef WATCHDOG_ENABLED
+    watchdog_feed();
+   #endif /* WATCHDOG_ENABLED */
+
+    /* serve 100ms timer */
+    if (lt_100msec_expired(100)) {
+    
+      /* ulan stroke */
+      ul_stroke(ul_fd);
+    }
+  }
+  SET_OUT_PIN(LED_PORT,LED_GP);
+  ((FNC)MEM_APP_START)();
+  /* unreachable code */
+ #ifdef SDCC
+  vec_jmp(0x0);  /* need to call a function from misc to correct linking */
+ #endif
+  return 0;
+}
diff --git a/ulan/embedded/arch/CVS/Entries b/ulan/embedded/arch/CVS/Entries
new file mode 100644 (file)
index 0000000..75bfee1
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:23 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:23 2005//
+D/arm////
+D/generic////
+D/mcs51////
diff --git a/ulan/embedded/arch/CVS/Repository b/ulan/embedded/arch/CVS/Repository
new file mode 100644 (file)
index 0000000..c126546
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch
diff --git a/ulan/embedded/arch/CVS/Root b/ulan/embedded/arch/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/Makefile b/ulan/embedded/arch/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/Makefile.omk b/ulan/embedded/arch/Makefile.omk
new file mode 100644 (file)
index 0000000..974732f
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = generic $(ARCH)
diff --git a/ulan/embedded/arch/arm/CVS/Entries b/ulan/embedded/arch/arm/CVS/Entries
new file mode 100644 (file)
index 0000000..28ddf30
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Tue Jan 31 10:15:37 2006//
+/Makefile.omk/1.1/Tue Jan 31 10:15:37 2006//
+D/generic////
+D/mach-lpc21xx////
diff --git a/ulan/embedded/arch/arm/CVS/Repository b/ulan/embedded/arch/arm/CVS/Repository
new file mode 100644 (file)
index 0000000..d4b798a
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm
diff --git a/ulan/embedded/arch/arm/CVS/Root b/ulan/embedded/arch/arm/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/Makefile b/ulan/embedded/arch/arm/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/Makefile.omk b/ulan/embedded/arch/arm/Makefile.omk
new file mode 100644 (file)
index 0000000..3f99071
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = generic mach-$(MACH)
diff --git a/ulan/embedded/arch/arm/generic/CVS/Entries b/ulan/embedded/arch/arm/generic/CVS/Entries
new file mode 100644 (file)
index 0000000..79394b9
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Tue Jan 31 10:15:37 2006//
+/Makefile.omk/1.1/Tue Jan 31 10:15:37 2006//
+D/defines////
+D/libs////
diff --git a/ulan/embedded/arch/arm/generic/CVS/Repository b/ulan/embedded/arch/arm/generic/CVS/Repository
new file mode 100644 (file)
index 0000000..746bd26
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/generic
diff --git a/ulan/embedded/arch/arm/generic/CVS/Root b/ulan/embedded/arch/arm/generic/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/generic/Makefile b/ulan/embedded/arch/arm/generic/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/generic/Makefile.omk b/ulan/embedded/arch/arm/generic/Makefile.omk
new file mode 100644 (file)
index 0000000..dba8475
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines libs
diff --git a/ulan/embedded/arch/arm/generic/defines/CVS/Entries b/ulan/embedded/arch/arm/generic/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..c64370a
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Tue Jan 31 10:15:38 2006//
+/Makefile.omk/1.1/Tue Jan 31 10:15:38 2006//
+/cpu_def.h/1.3/Thu Nov  9 23:18:55 2006//
+/hal_intr.h/1.1/Sun Oct 29 21:14:12 2006//
+/types.h/1.1/Tue Jan 31 10:15:38 2006//
+D
diff --git a/ulan/embedded/arch/arm/generic/defines/CVS/Repository b/ulan/embedded/arch/arm/generic/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..f025770
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/generic/defines
diff --git a/ulan/embedded/arch/arm/generic/defines/CVS/Root b/ulan/embedded/arch/arm/generic/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/generic/defines/Makefile b/ulan/embedded/arch/arm/generic/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/generic/defines/Makefile.omk b/ulan/embedded/arch/arm/generic/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..702e343
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+include_HEADERS = $(notdir $(wildcard $(SOURCES_DIR)/*.h))
diff --git a/ulan/embedded/arch/arm/generic/defines/cpu_def.h b/ulan/embedded/arch/arm/generic/defines/cpu_def.h
new file mode 100644 (file)
index 0000000..8c7b97d
--- /dev/null
@@ -0,0 +1,262 @@
+#ifndef _ARM_CPU_DEF_H
+#define _ARM_CPU_DEF_H
+
+#ifndef CODE
+  #define CODE
+#endif
+
+#ifndef XDATA
+  #define XDATA
+#endif
+
+#ifndef DATA
+  #define DATA
+#endif
+
+struct pt_regs {
+        long uregs[18];
+};
+
+#define ARM_cpsr        uregs[16]
+#define ARM_pc          uregs[15]
+#define ARM_lr          uregs[14]
+#define ARM_sp          uregs[13]
+#define ARM_ip          uregs[12]
+#define ARM_fp          uregs[11]
+#define ARM_r10         uregs[10]
+#define ARM_r9          uregs[9]
+#define ARM_r8          uregs[8]
+#define ARM_r7          uregs[7]
+#define ARM_r6          uregs[6]
+#define ARM_r5          uregs[5]
+#define ARM_r4          uregs[4]
+#define ARM_r3          uregs[3]
+#define ARM_r2          uregs[2]
+#define ARM_r1          uregs[1]
+#define ARM_r0          uregs[0]
+#define ARM_ORIG_r0     uregs[17]
+
+struct undef_hook {
+        struct undef_hook *next;
+        unsigned long instr_mask;
+        unsigned long instr_val;
+        unsigned long cpsr_mask;
+        unsigned long cpsr_val;
+        int (*fn)(struct pt_regs *regs, unsigned int instr);
+};
+
+int register_undef_hook(struct undef_hook *hook);
+
+#define NR_IRQS 256
+
+typedef struct irq_handler {
+  void            (*handler)(int, void *, struct pt_regs *);
+  unsigned long   flags;
+  void            *dev_id;
+  const char      *devname;
+  struct irq_handler *next;
+  short                  vectno;
+} irq_handler_t;
+
+#define        IRQH_ON_LIST    0x100   /* handler is used */
+
+extern irq_handler_t *irq_array[NR_IRQS];
+extern void          *irq_vec[NR_IRQS];
+
+int add_irq_handler(int vectno,irq_handler_t *handler);
+
+int del_irq_handler(int vectno,irq_handler_t *handler);
+
+int test_irq_handler(int vectno,const irq_handler_t *handler);
+
+void irq_redirect2vector(int vectno,struct pt_regs *regs);
+
+/* IRQ handling code */
+
+#define sti()                                                   \
+        ({                                                      \
+                unsigned long temp;                             \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ sti\n"                \
+"       bic     %0, %0, #128\n"                                 \
+"       msr     cpsr_c, %0"                                     \
+        : "=r" (temp)                                           \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define cli()                                                   \
+        ({                                                      \
+                unsigned long temp;                             \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ cli\n"                \
+"       orr     %0, %0, #128\n"                                 \
+"       msr     cpsr_c, %0"                                     \
+        : "=r" (temp)                                           \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define save_and_cli(flags)                                     \
+        ({                                                      \
+                unsigned long temp;                             \
+                (void) (&temp == &flags);                       \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ save_and_cli\n"       \
+"       orr     %1, %0, #128\n"                                 \
+"       msr     cpsr_c, %1"                                     \
+        : "=r" (flags), "=r" (temp)                             \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define save_flags(flags)                                       \
+        ({                                                      \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ save_flags\n"         \
+        : "=r" (flags)                                          \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define restore_flags(flags)                                    \
+        __asm__ __volatile__(                                   \
+        "msr    cpsr_c, %0              @ restore_flags\n"      \
+        :                                                       \
+        : "r" (flags)                                           \
+        : "memory", "cc")
+
+
+/* FIQ handling code */
+
+#define fiq_sti()                                                   \
+        ({                                                      \
+                unsigned long temp;                             \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ sti\n"                \
+"       bic     %0, %0, #64\n"                                  \
+"       msr     cpsr_c, %0"                                     \
+        : "=r" (temp)                                           \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define fiq_cli()                                                   \
+        ({                                                      \
+                unsigned long temp;                             \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ cli\n"                \
+"       orr     %0, %0, #64\n"                                  \
+"       msr     cpsr_c, %0"                                     \
+        : "=r" (temp)                                           \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+#define fiq_save_and_cli(flags)                                     \
+        ({                                                      \
+                unsigned long temp;                             \
+                (void) (&temp == &flags);                       \
+        __asm__ __volatile__(                                   \
+        "mrs    %0, cpsr                @ save_and_cli\n"       \
+"       orr     %1, %0, #192\n"                                 \
+"       msr     cpsr_c, %1"                                     \
+        : "=r" (flags), "=r" (temp)                             \
+        :                                                       \
+        : "memory", "cc");                                      \
+        })
+
+void __cpu_coherent_range(unsigned long start, unsigned long end);
+
+static inline void flush_icache_range(unsigned long start, unsigned long end)
+{
+       __cpu_coherent_range(start, end);
+}
+
+/* atomic access routines */
+
+//typedef unsigned long atomic_t;
+
+static inline void atomic_clear_mask(unsigned long mask, volatile unsigned long *addr)
+{
+        unsigned long flags;
+
+        save_and_cli(flags);
+        *addr &= ~mask;
+        restore_flags(flags);
+}
+
+static inline void atomic_set_mask(unsigned long mask, volatile unsigned long *addr)
+{
+        unsigned long flags;
+
+        save_and_cli(flags);
+        *addr |= mask;
+        restore_flags(flags);
+}
+
+static inline void set_bit(int nr, volatile unsigned long *addr)
+{
+        unsigned long flags;
+
+        save_and_cli(flags);
+        *addr |= 1<<nr;
+        restore_flags(flags);
+}
+
+static inline void clear_bit(int nr, volatile unsigned long *addr)
+{
+        unsigned long flags;
+
+        save_and_cli(flags);
+        *addr &= ~(1<<nr);
+        restore_flags(flags);
+}
+
+static inline int test_bit(int nr, volatile unsigned long *addr)
+{
+        return ((*addr) & (1<<nr))?1:0;
+}
+
+static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
+{
+        unsigned long flags;
+       long m=(1<<nr);
+        long r;
+
+        save_and_cli(flags);
+        r=*addr;
+       *addr=r|m;
+        restore_flags(flags);
+        return r&m?1:0;
+}
+
+#define __memory_barrier() \
+ __asm__ __volatile__("": : : "memory")
+
+/*masked fields macros*/
+
+#define __val2mfld(mask,val) (((mask)&~((mask)<<1))*(val)&(mask))
+#define __mfld2val(mask,val) (((val)&(mask))/((mask)&~((mask)<<1)))
+
+static inline void outb(unsigned int port, int val) {
+  *(volatile unsigned char *)(port)=val;
+}
+
+static inline unsigned char inb(unsigned int port) {
+  return *(volatile unsigned char *)(port);
+}
+
+#endif /* _ARM_CPU_DEF_H */
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ulan/embedded/arch/arm/generic/defines/hal_intr.h b/ulan/embedded/arch/arm/generic/defines/hal_intr.h
new file mode 100644 (file)
index 0000000..68df921
--- /dev/null
@@ -0,0 +1,82 @@
+#ifndef HAL_INTR_H
+#define HAL_INTR_H
+
+#include <hal_ints.h>
+
+//--------------------------------------------------------------------------
+// Static data used by HAL
+// ISR tables
+extern uint32_t hal_interrupt_handlers[HAL_ISR_COUNT];
+extern uint32_t hal_interrupt_data[HAL_ISR_COUNT];
+
+//--------------------------------------------------------------------------
+// Default ISR
+// The #define is used to test whether this routine exists, and to allow
+// code outside the HAL to call it.
+typedef void (*hal_isr)(int vector, uint32_t data); //function ptr
+extern uint32_t hal_default_isr(int vector, uint32_t data);
+#define HAL_DEFAULT_ISR hal_default_isr
+
+//--------------------------------------------------------------------------
+// Vector translation.
+
+#ifndef HAL_TRANSLATE_VECTOR
+#define HAL_TRANSLATE_VECTOR(_vector_,_index_) \
+    (_index_) = (_vector_)
+#endif
+
+//--------------------------------------------------------------------------
+// Interrupt and VSR attachment macros
+
+#define HAL_INTERRUPT_IN_USE( _vector_, _state_)                          \
+    {                                                                     \
+    uint32_t _index_;                                                     \
+    HAL_TRANSLATE_VECTOR ((_vector_), _index_);                           \
+                                                                          \
+    if( hal_interrupt_handlers[_index_] == (uint32_t)hal_default_isr ) \
+        (_state_) = 0;                                                    \
+    else                                                                  \
+        (_state_) = 1;                                                    \
+    }
+
+#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_)                     \
+    {                                                                      \
+    if( hal_interrupt_handlers[_vector_] == (uint32_t)hal_default_isr ) \
+    {                                                                      \
+        hal_interrupt_handlers[_vector_] = (uint32_t)_isr_;             \
+        hal_interrupt_data[_vector_] = (uint32_t) _data_;                  \
+    }                                                                      \
+    }
+
+#define HAL_INTERRUPT_DETACH( _vector_, _isr_ )                            \
+    {                                                                      \
+    if( hal_interrupt_handlers[_vector_] == (uint32_t)_isr_ )           \
+    {                                                                      \
+        hal_interrupt_handlers[_vector_] = (uint32_t)hal_default_isr;   \
+        hal_interrupt_data[_vector_] = 0;                                  \
+    }                                                                      \
+    }
+
+
+//--------------------------------------------------------------------------
+// Interrupt controller access
+
+extern void hal_interrupt_mask(int);
+extern void hal_interrupt_unmask(int);
+extern void hal_interrupt_acknowledge(int);
+extern void hal_interrupt_configure(int, int, int);
+extern void hal_interrupt_set_level(int, int);
+
+#define HAL_INTERRUPT_MASK( _vector_ )                     \
+    hal_interrupt_mask( _vector_ ) 
+#define HAL_INTERRUPT_UNMASK( _vector_ )                   \
+    hal_interrupt_unmask( _vector_ )
+#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ )              \
+    hal_interrupt_acknowledge( _vector_ )
+#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) \
+    hal_interrupt_configure( _vector_, _level_, _up_ )
+#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ )       \
+    hal_interrupt_set_level( _vector_, _level_ )
+
+#endif /* HAL_DEFAULT_ISR */
diff --git a/ulan/embedded/arch/arm/generic/defines/types.h b/ulan/embedded/arch/arm/generic/defines/types.h
new file mode 100644 (file)
index 0000000..e5d5a57
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef __ASM_ARM_TYPES_H
+#define __ASM_ARM_TYPES_H
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+#ifndef __BIT_TYPES_DEFINED__
+#define __BIT_TYPES_DEFINED__
+
+typedef __u8  uint8_t;
+typedef __s8  int8_t;
+typedef __u16 uint16_t;
+typedef __s16 int16_t;
+typedef __u32 uint32_t;
+typedef __s32 int32_t;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __s64 int64_t;
+typedef __u64 uint64_t;
+#endif
+
+#endif /* !(__BIT_TYPES_DEFINED__) */
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+#define BITS_PER_LONG 32
+
+#ifndef __ASSEMBLY__
+
+typedef __s8 s8;
+typedef __u8 u8;
+
+typedef __s16 s16;
+typedef __u16 u16;
+
+typedef __s32 s32;
+typedef __u32 u32;
+
+typedef __s64 s64;
+typedef __s64 u64;
+
+/* Dma addresses are 32-bits wide.  */
+
+typedef u32 dma_addr_t;
+typedef u32 dma64_addr_t;
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+#endif
+
diff --git a/ulan/embedded/arch/arm/generic/libs/CVS/Entries b/ulan/embedded/arch/arm/generic/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..8cf8523
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Tue Jan 31 10:15:38 2006//
+/Makefile.omk/1.2/Thu Jul 20 12:40:55 2006//
+D/misc////
diff --git a/ulan/embedded/arch/arm/generic/libs/CVS/Repository b/ulan/embedded/arch/arm/generic/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..063eec2
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/generic/libs
diff --git a/ulan/embedded/arch/arm/generic/libs/CVS/Root b/ulan/embedded/arch/arm/generic/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/generic/libs/Makefile b/ulan/embedded/arch/arm/generic/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/generic/libs/Makefile.omk b/ulan/embedded/arch/arm/generic/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..d833bce
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = misc
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/CVS/Entries b/ulan/embedded/arch/arm/generic/libs/misc/CVS/Entries
new file mode 100644 (file)
index 0000000..4aaf848
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Thu Jul 20 12:40:56 2006//
+/Makefile.omk/1.1/Thu Jul 20 12:40:56 2006//
+/system_stub.c/1.1/Thu Jul 20 12:40:56 2006//
+/system_stub.h/1.1/Thu Jul 20 12:40:56 2006//
+/undef_support.c/1.1/Thu Jul 20 12:40:56 2006//
+D
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/CVS/Repository b/ulan/embedded/arch/arm/generic/libs/misc/CVS/Repository
new file mode 100644 (file)
index 0000000..3c7c2b4
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/generic/libs/misc
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/CVS/Root b/ulan/embedded/arch/arm/generic/libs/misc/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/Makefile b/ulan/embedded/arch/arm/generic/libs/misc/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/Makefile.omk b/ulan/embedded/arch/arm/generic/libs/misc/Makefile.omk
new file mode 100644 (file)
index 0000000..b94858c
--- /dev/null
@@ -0,0 +1,9 @@
+# -*- makefile -*-
+
+include_HEADERS = system_stub.h
+
+lib_LIBRARIES = arch
+
+arch_SOURCES = system_stub.c
+
+lib_obj_SOURCES = system_stub.c
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/system_stub.c b/ulan/embedded/arch/arm/generic/libs/misc/system_stub.c
new file mode 100644 (file)
index 0000000..24fa2f9
--- /dev/null
@@ -0,0 +1,209 @@
+/* Support files for GNU libc.  Files in the system namespace go here.
+   Files in the C namespace (ie those that do not start with an
+   underscore) go in .c.  */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/fcntl.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <errno.h>
+#include <reent.h>
+#include <system_def.h>
+
+/* Register name faking - works in collusion with the linker.  */
+register char * stack_ptr asm ("sp");
+
+system_stub_ops_t system_stub_ops;
+
+int
+_read (int file,
+       char * ptr,
+       int len)
+{
+  if(!system_stub_ops.read)
+    return -1;
+  return system_stub_ops.read(file,ptr,len);
+}
+
+int
+_write (int    file,
+       char * ptr,
+       int    len)
+{
+  if(!system_stub_ops.write)
+    return len;
+  return system_stub_ops.write(file,ptr,len);
+}
+
+
+int
+_lseek (int file,
+       int pos,
+       int dir)
+{
+  if(!system_stub_ops.lseek)
+    return -1;
+  return system_stub_ops.lseek(file,pos,dir);
+}
+
+int
+_open (const char * path,
+       int          flags,
+       ...)
+{
+  if(!system_stub_ops.open)
+    return -1;
+  return system_stub_ops.open(path,flags,0);
+}
+
+int
+_close (int file)
+{
+  if(!system_stub_ops.close)
+    return -1;
+  return system_stub_ops.close(file);
+}
+
+typedef int (local_call_t)(void);
+
+void
+_exit (int n)
+{
+  ((local_call_t*)0)();
+  while(1);
+}
+
+int
+_kill (int n, int m)
+{
+  return -1;
+}
+
+int
+_getpid (int n)
+{
+  return 1;
+}
+
+
+caddr_t
+_sbrk (int incr)
+{
+  extern char   end asm ("end");       /* Defined by the linker.  */
+  static char   *heap_end;
+  char *        prev_heap_end;
+
+  incr=(incr+3) & ~3;
+
+  if (heap_end == NULL)
+    heap_end = & end;
+  
+  prev_heap_end = heap_end;
+    
+  if (heap_end + incr > stack_ptr)
+    {
+      /* Some of the libstdc++-v3 tests rely upon detecting
+        out of memory errors, so do not abort here.  */
+#if 0
+      extern void abort (void);
+
+      _write (1, "_sbrk: Heap and stack collision\n", 32);
+      
+      abort ();
+#else
+      errno = ENOMEM;
+      return (caddr_t) -1;
+#endif
+    }
+  
+  heap_end += incr;
+
+  return (caddr_t) prev_heap_end;
+}
+
+int
+_fstat (int file, struct stat * st)
+{
+  return -1;
+}
+
+int _stat (const char *fname, struct stat *st)
+{
+  return -1;
+}
+
+int
+_link (void)
+{
+  return -1;
+}
+
+int
+_unlink (void)
+{
+  return -1;
+}
+
+void
+_raise (void)
+{
+  return;
+}
+
+int
+_gettimeofday (struct timeval * tp, struct timezone * tzp)
+{
+
+  if(tp) 
+    {
+      tp->tv_sec = 0;
+      tp->tv_usec = 0;
+    }
+  /* Return fixed data for the timezone.  */
+  if (tzp)
+    {
+      tzp->tz_minuteswest = 0;
+      tzp->tz_dsttime = 0;
+    }
+
+  return 0;
+}
+
+/* Return a clock that ticks at 100Hz.  */
+clock_t 
+_times (struct tms * tp)
+{
+  clock_t timeval = 0;
+  
+  if (tp)
+    {
+      tp->tms_utime  = timeval;        /* user time */
+      tp->tms_stime  = 0;      /* system time */
+      tp->tms_cutime = 0;      /* user time, children */
+      tp->tms_cstime = 0;      /* system time, children */
+    }
+  
+  return timeval;
+};
+
+
+int
+isatty (int fd)
+{
+  return 1;
+}
+
+int
+_system (const char *s)
+{
+  return -1;
+}
+
+int
+_rename (const char * oldpath, const char * newpath)
+{
+  return -1;
+}
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/system_stub.h b/ulan/embedded/arch/arm/generic/libs/misc/system_stub.h
new file mode 100644 (file)
index 0000000..b1e3375
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _SYSTEM_STUB_H_
+#define _SYSTEM_STUB_H_
+
+#include <types.h>
+
+typedef struct system_stub_ops_t {
+  int (*open)(const char * path, int flags, ...);
+  int (*close)(int file);
+  int (*read)(int file, char * ptr, int len);
+  int (*write)(int file, char * ptr, int len);
+  int (*lseek)(int file, int ptr, int dir);
+} system_stub_ops_t;
+
+extern system_stub_ops_t system_stub_ops;
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/arch/arm/generic/libs/misc/undef_support.c b/ulan/embedded/arch/arm/generic/libs/misc/undef_support.c
new file mode 100644 (file)
index 0000000..a51b708
--- /dev/null
@@ -0,0 +1,55 @@
+#include <cpu_def.h>
+#include <irq_def.h>
+
+static int undef_initialized = 0;
+
+static unsigned long cpu_undef_stack[256];
+
+struct undef_hook *undef_hook_chain = NULL;
+
+static void undef_exception_handler(int excptnum, struct pt_regs *regs)
+{
+  /*unsigned int correction = thumb_mode(regs) ? 2 : 4;*/
+  unsigned int correction = 0;
+  struct undef_hook *hook;
+  void *pc;
+  unsigned long instr;
+
+  regs->ARM_pc -= correction;
+
+  pc = (void *)regs->ARM_pc;
+
+  instr = *(unsigned long *)pc;
+
+  for(hook = undef_hook_chain; hook; hook = hook->next) {
+    if (((instr & hook->instr_mask) == hook->instr_val) &&
+      ((regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val)) {
+      if (hook->fn(regs, instr) == 0) {
+        return;
+      }
+    }
+  }
+
+  for(;;){
+    /* Fatal error */
+  }
+}
+
+int register_undef_hook(struct undef_hook *hook)
+{
+  unsigned long flags;
+
+  save_and_cli(flags);
+
+  if(!undef_initialized) {
+    set_cpu_exception_handler(ARM_EXCEPTION_UNDEF, (long)undef_exception_handler);
+    set_cpu_exception_stack(ARM_EXCEPTION_UNDEF, (long)((char*)cpu_undef_stack+sizeof(cpu_undef_stack)-8));
+    undef_initialized = 1;
+  }
+
+  hook->next = undef_hook_chain;
+  undef_hook_chain = hook;
+  restore_flags(flags);
+  
+  return 0;
+}
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Entries b/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Entries
new file mode 100644 (file)
index 0000000..e2e1f9a
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Thu Jul 20 12:40:56 2006//
+/Makefile.omk/1.1/Thu Jul 20 12:40:56 2006//
+D/defines////
+D/libs////
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Repository b/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Repository
new file mode 100644 (file)
index 0000000..b50fbf7
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/mach-lpc21xx
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Root b/ulan/embedded/arch/arm/mach-lpc21xx/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/Makefile b/ulan/embedded/arch/arm/mach-lpc21xx/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/Makefile.omk b/ulan/embedded/arch/arm/mach-lpc21xx/Makefile.omk
new file mode 100644 (file)
index 0000000..2ebd5c8
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = defines libs
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Entries b/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..4f0b87f
--- /dev/null
@@ -0,0 +1,22 @@
+/LPC210x.h/1.2/Wed Dec 26 21:15:55 2007//
+/LPC214x.h/1.4/Wed Dec 26 21:15:55 2007//
+/LPC21xx.h/1.3/Wed Dec 26 21:15:55 2007//
+/LPC22xx.h/1.1/Thu Jul 20 12:40:56 2006//
+/Makefile/1.1/Thu Jul 20 13:52:41 2006//
+/Makefile.omk/1.1/Thu Jul 20 13:52:41 2006//
+/armVIC.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcADC-214x.h/1.1/Thu Nov 30 13:40:00 2006//
+/lpcADC.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcEMC.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcGPIO.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcI2C.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcPIN.h/1.1/Thu Jul 20 12:40:56 2006//
+/lpcRTC.h/1.1/Thu Jul 20 12:40:57 2006//
+/lpcSCB.h/1.2/Thu Aug  3 00:08:55 2006//
+/lpcSPI.h/1.2/Tue Jan 16 16:03:12 2007//
+/lpcTMR.h/1.2/Thu Nov 30 13:40:00 2006//
+/lpcUART.h/1.1/Thu Jul 20 12:40:57 2006//
+/lpcUSB.h/1.3/Fri May 25 19:14:30 2007//
+/lpcVIC.h/1.1/Thu Jul 20 12:40:57 2006//
+/lpcWD.h/1.1/Thu Jul 20 12:40:57 2006//
+D
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Repository b/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..b4e5870
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/mach-lpc21xx/defines
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Root b/ulan/embedded/arch/arm/mach-lpc21xx/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC210x.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC210x.h
new file mode 100644 (file)
index 0000000..1e4e2f4
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef INC_LPC210x_H
+#define INC_LPC210x_H
+
+#include "LPC21xx.h"
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC214x.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC214x.h
new file mode 100644 (file)
index 0000000..d6a95d4
--- /dev/null
@@ -0,0 +1,165 @@
+/******************************************************************************
+ *
+ * $RCSfile: LPC214x.h,v $
+ * $Revision: 1.4 $
+ *
+ * Header file for Philips LPC214x ARM Processors 
+ * Copyright 2006 Pavel Pisa <pisa@cmp.felk.cvut.cz>
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact or GPL license is applied.
+ *
+ *****************************************************************************/
+
+#ifndef INC_LPC214x_H
+#define INC_LPC214x_H
+
+///////////////////////////////////////////////////////////////////////////////
+// ISP_RAM2FLASH_BLOCK_SIZE for 210x CPU
+#ifndef ISP_RAM2FLASH_BLOCK_SIZE
+  #define ISP_RAM2FLASH_BLOCK_SIZE     256
+#endif /* ISP_RAM2FLASH_BLOCK_SIZE */
+
+#include "LPC21xx.h"
+
+#include "lpcUSB.h"
+#include "lpcADC-214x.h"
+
+// USB Phase Locked Loop Registers (PLL48)
+#define PLLCON48        SCB->pll48.con    /* Control Register */
+#define PLLCFG48        SCB->pll48.cfg    /* Configuration Register */
+#define PLLSTAT48       SCB->pll48.stat   /* Status Register */
+#define PLLFEED48       SCB->pll48.feed   /* Feed Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// USB Device
+
+#define USBIntSt (*(REG32*)0xE01FC1C0) /* USB Interrupt Status (R/W) */
+
+#if 1
+
+#define USB             ((usbRegs_t *)0xE0090000)
+
+#define USBDevIntSt    USB->DevIntSt
+#define USBDevIntEn    USB->DevIntEn
+#define USBDevIntClr   USB->DevIntClr
+#define USBDevIntSet   USB->DevIntSet
+#define USBDevIntPri   USB->DevIntPri
+#define USBEpIntSt     USB->EpIntSt
+#define USBEpIntEn     USB->EpIntEn
+#define USBEpIntClr    USB->EpIntClr
+#define USBEpIntSet    USB->EpIntSet
+#define USBEpIntPri    USB->EpIntPri
+#define USBReEp                USB->ReEp
+#define USBEpInd       USB->EpInd
+#define USBMaxPSize    USB->MaxPSize
+#define USBRxData      USB->RxData
+#define USBRxPLen      USB->RxPLen
+#define USBTxData      USB->TxData
+#define USBTxPLen      USB->TxPLen
+#define USBCtrl                USB->Ctrl
+#define USBCmdCode     USB->CmdCode
+#define USBCmdData     USB->CmdData
+#define USBDMARSt      USB->DMARSt
+#define USBDMARClr     USB->DMARClr
+#define USBDMARSet     USB->DMARSet
+#define USBUDCAH       USB->UDCAH
+#define USBEpDMASt     USB->EpDMASt
+#define USBEpDMAEn     USB->EpDMAEn
+#define USBEpDMADis    USB->EpDMADis
+#define USBDMAIntSt    USB->DMAIntSt
+#define USBDMAIntEn    USB->DMAIntEn
+#define USBEoTIntSt    USB->EoTIntSt
+#define USBEoTIntClr   USB->EoTIntClr
+#define USBEoTIntSet   USB->EoTIntSet
+#define USBNDDRIntSt   USB->NDDRIntSt
+#define USBNDDRIntClr  USB->NDDRIntClr
+#define USBNDDRIntSet  USB->NDDRIntSet
+#define USBSysErrIntSt USB->SysErrIntSt
+#define USBSysErrIntClr        USB->SysErrIntClr
+#define USBSysErrIntSet        USB->SysErrIntSet
+#define USB_MODULE_ID  USB->MODULE_ID
+# else
+
+#define USB_REGS_BASE             0xE0090000
+
+#define USBDevIntSt    (*(REG32*)(USB_REGS_BASE+USBDevIntSt_o))
+#define USBDevIntEn    (*(REG32*)(USB_REGS_BASE+USBDevIntEn_o))
+#define USBDevIntClr   (*(REG32*)(USB_REGS_BASE+USBDevIntClr_o))
+#define USBDevIntSet   (*(REG32*)(USB_REGS_BASE+USBDevIntSet_o))
+#define USBDevIntPri   (*(REG_8*)(USB_REGS_BASE+USBDevIntPri_o))
+#define USBEpIntSt     (*(REG32*)(USB_REGS_BASE+USBEpIntSt_o))
+#define USBEpIntEn     (*(REG32*)(USB_REGS_BASE+USBEpIntEn_o))
+#define USBEpIntClr    (*(REG32*)(USB_REGS_BASE+USBEpIntClr_o))
+#define USBEpIntSet    (*(REG32*)(USB_REGS_BASE+USBEpIntSet_o))
+#define USBEpIntPri    (*(REG32*)(USB_REGS_BASE+USBEpIntPri_o))
+#define USBReEp                (*(REG32*)(USB_REGS_BASE+USBReEp_o))
+#define USBEpInd       (*(REG32*)(USB_REGS_BASE+USBEpInd_o))
+#define USBMaxPSize    (*(REG32*)(USB_REGS_BASE+USBMaxPSize_o))
+#define USBRxData      (*(REG32*)(USB_REGS_BASE+USBRxData_o))
+#define USBRxPLen      (*(REG32*)(USB_REGS_BASE+USBRxPLen_o))
+#define USBTxData      (*(REG32*)(USB_REGS_BASE+USBTxData_o))
+#define USBTxPLen      (*(REG32*)(USB_REGS_BASE+USBTxPLen_o))
+#define USBCtrl                (*(REG32*)(USB_REGS_BASE+USBCtrl_o))
+#define USBCmdCode     (*(REG32*)(USB_REGS_BASE+USBCmdCode_o))
+#define USBCmdData     (*(REG32*)(USB_REGS_BASE+USBCmdData_o))
+#define USBDMARSt      (*(REG32*)(USB_REGS_BASE+USBDMARSt_o))
+#define USBDMARClr     (*(REG32*)(USB_REGS_BASE+USBDMARClr_o))
+#define USBDMARSet     (*(REG32*)(USB_REGS_BASE+USBDMARSet_o))
+#define USBUDCAH       (*(REG32*)(USB_REGS_BASE+USBUDCAH_o))
+#define USBEpDMASt     (*(REG32*)(USB_REGS_BASE+USBEpDMASt_o))
+#define USBEpDMAEn     (*(REG32*)(USB_REGS_BASE+USBEpDMAEn_o))
+#define USBEpDMADis    (*(REG32*)(USB_REGS_BASE+USBEpDMADis_o))
+#define USBDMAIntSt    (*(REG32*)(USB_REGS_BASE+USBDMAIntSt_o))
+#define USBDMAIntEn    (*(REG32*)(USB_REGS_BASE+USBDMAIntEn_o))
+#define USBEoTIntSt    (*(REG32*)(USB_REGS_BASE+USBEoTIntSt_o))
+#define USBEoTIntClr   (*(REG32*)(USB_REGS_BASE+USBEoTIntClr_o))
+#define USBEoTIntSet   (*(REG32*)(USB_REGS_BASE+USBEoTIntSet_o))
+#define USBNDDRIntSt   (*(REG32*)(USB_REGS_BASE+USBNDDRIntSt_o))
+#define USBNDDRIntClr  (*(REG32*)(USB_REGS_BASE+USBNDDRIntClr_o))
+#define USBNDDRIntSet  (*(REG32*)(USB_REGS_BASE+USBNDDRIntSet_o))
+#define USBSysErrIntSt (*(REG32*)(USB_REGS_BASE+USBSysErrIntSt_o))
+#define USBSysErrIntClr        (*(REG32*)(USB_REGS_BASE+USBSysErrIntClr_o))
+#define USBSysErrIntSet        (*(REG32*)(USB_REGS_BASE+USBSysErrIntSet_o))
+#define USB_MODULE_ID  (*(REG32*)(USB_REGS_BASE+USB_MODULE_ID_o))
+
+#endif
+
+
+///////////////////////////////////////////////////////////////////////////////
+// A/D Converter
+#define ADC0             ((adc214xRegs_t *)0xE0034000)
+
+#define AD0CR            ADC0->cr       // Control Register 
+#define AD0GDR           ADC0->gdr     // Global Data Register
+#define AD0GSR           ADC0->gsr     // Global Start Register
+#define AD0INTEN         ADC0->inten   // Interrupt Enable Register
+#define AD0DR0           ADC0->dr0     // Channel 0 Data Register
+#define AD0DR1           ADC0->dr1     // Channel 1 Data Register
+#define AD0DR2           ADC0->dr2     // Channel 2 Data Register
+#define AD0DR3           ADC0->dr3     // Channel 3 Data Register
+#define AD0DR4           ADC0->dr4     // Channel 4 Data Register
+#define AD0DR5           ADC0->dr5     // Channel 5 Data Register
+#define AD0DR6           ADC0->dr6     // Channel 6 Data Register
+#define AD0DR7           ADC0->dr7     // Channel 7 Data Register
+#define AD0STAT          ADC0->stat    // Status Register
+
+#define ADC1             ((adc214xRegs_t *)0xE0060000)
+
+#define AD1CR            ADC0->cr       // Control Register 
+#define AD1GDR           ADC0->gdr     // Global Data Register
+#define AD1GSR           ADC0->gsr     // Global Start Register
+#define AD1INTEN         ADC0->inten   // Interrupt Enable Register
+#define AD1DR0           ADC0->dr0     // Channel 0 Data Register
+#define AD1DR1           ADC0->dr1     // Channel 1 Data Register
+#define AD1DR2           ADC0->dr2     // Channel 2 Data Register
+#define AD1DR3           ADC0->dr3     // Channel 3 Data Register
+#define AD1DR4           ADC0->dr4     // Channel 4 Data Register
+#define AD1DR5           ADC0->dr5     // Channel 5 Data Register
+#define AD1DR6           ADC0->dr6     // Channel 6 Data Register
+#define AD1DR7           ADC0->dr7     // Channel 7 Data Register
+#define AD1STAT          ADC0->stat    // Status Register
+
+
+#endif /*INC_LPC21xx_H*/
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC21xx.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC21xx.h
new file mode 100644 (file)
index 0000000..c9d06c8
--- /dev/null
@@ -0,0 +1,333 @@
+/******************************************************************************
+ *
+ * $RCSfile: LPC21xx.h,v $
+ * $Revision: 1.3 $
+ *
+ * Header file for Philips LPC21xx ARM Processors 
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC21xx_H
+#define INC_LPC21xx_H
+
+#define REG_8           volatile unsigned char
+#define REG16           volatile unsigned short
+#define REG32           volatile unsigned long
+
+#include "lpcWD.h"
+#include "lpcTMR.h"
+#include "lpcUART.h"
+#include "lpcI2C.h"
+#include "lpcSPI.h"
+#include "lpcRTC.h"
+#include "lpcGPIO.h"
+#include "lpcPIN.h"
+#include "lpcADC.h"
+#include "lpcSCB.h"
+#include "lpcVIC.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Keyval
+#define KVPB_CHUNK_SIZE 16
+
+///////////////////////////////////////////////////////////////////////////////
+// ISP_RAM2FLASH_BLOCK_SIZE for CPU - minimal is 512, can be smaller for some CPU
+#ifndef ISP_RAM2FLASH_BLOCK_SIZE
+  #define ISP_RAM2FLASH_BLOCK_SIZE     512
+#endif /* ISP_RAM2FLASH_BLOCK_SIZE */
+
+///////////////////////////////////////////////////////////////////////////////
+// Watchdog
+#define WD              ((wdRegs_t *)0xE0000000)
+
+// Watchdog Registers
+#define WDMOD           WD->mod         /* Watchdog Mode Register */
+#define WDTC            WD->tc          /* Watchdog Time Constant Register */
+#define WDFEED          WD->feed        /* Watchdog Feed Register */
+#define WDTV            WD->tv          /* Watchdog Time Value Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Timer 0
+#define TMR0            ((pwmTmrRegs_t *)0xE0004000)
+
+// Timer 0 Registers
+#define T0IR            TMR0->ir        /* Interrupt Register */
+#define T0TCR           TMR0->tcr       /* Timer Control Register */
+#define T0TC            TMR0->tc        /* Timer Counter */
+#define T0PR            TMR0->pr        /* Prescale Register */
+#define T0PC            TMR0->pc        /* Prescale Counter Register */
+#define T0MCR           TMR0->mcr       /* Match Control Register */
+#define T0MR0           TMR0->mr0       /* Match Register 0 */
+#define T0MR1           TMR0->mr1       /* Match Register 1 */
+#define T0MR2           TMR0->mr2       /* Match Register 2 */
+#define T0MR3           TMR0->mr3       /* Match Register 3 */
+#define T0CCR           TMR0->ccr       /* Capture Control Register */
+#define T0CR0           TMR0->cr0       /* Capture Register 0 */
+#define T0CR1           TMR0->cr1       /* Capture Register 1 */
+#define T0CR2           TMR0->cr2       /* Capture Register 2 */
+#define T0CR3           TMR0->cr3       /* Capture Register 3 */
+#define T0EMR           TMR0->emr       /* External Match Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Timer 1
+#define TMR1            ((pwmTmrRegs_t *)0xE0008000)
+
+// Timer 1 Registers
+#define T1IR            TMR1->ir        /* Interrupt Register */
+#define T1TCR           TMR1->tcr       /* Timer Control Register */
+#define T1TC            TMR1->tc        /* Timer Counter */
+#define T1PR            TMR1->pr        /* Prescale Register */
+#define T1PC            TMR1->pc        /* Prescale Counter Register */
+#define T1MCR           TMR1->mcr       /* Match Control Register */
+#define T1MR0           TMR1->mr0       /* Match Register 0 */
+#define T1MR1           TMR1->mr1       /* Match Register 1 */
+#define T1MR2           TMR1->mr2       /* Match Register 2 */
+#define T1MR3           TMR1->mr3       /* Match Register 3 */
+#define T1CCR           TMR1->ccr       /* Capture Control Register */
+#define T1CR0           TMR1->cr0       /* Capture Register 0 */
+#define T1CR1           TMR1->cr1       /* Capture Register 1 */
+#define T1CR2           TMR1->cr2       /* Capture Register 2 */
+#define T1CR3           TMR1->cr3       /* Capture Register 3 */
+#define T1EMR           TMR1->emr       /* External Match Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Pulse Width Modulator (PWM)
+#define PWM             ((pwmTmrRegs_t *)0xE0014000)
+
+// PWM Registers
+#define PWMIR           PWM->ir         /* Interrupt Register */
+#define PWMTCR          PWM->tcr        /* Timer Control Register */
+#define PWMTC           PWM->tc         /* Timer Counter */
+#define PWMPR           PWM->pr         /* Prescale Register */
+#define PWMPC           PWM->pc         /* Prescale Counter Register */
+#define PWMMCR          PWM->mcr        /* Match Control Register */
+#define PWMMR0          PWM->mr0        /* Match Register 0 */
+#define PWMMR1          PWM->mr1        /* Match Register 1 */
+#define PWMMR2          PWM->mr2        /* Match Register 2 */
+#define PWMMR3          PWM->mr3        /* Match Register 3 */
+#define PWMMR4          PWM->mr4        /* Match Register 4 */
+#define PWMMR5          PWM->mr5        /* Match Register 5 */
+#define PWMMR6          PWM->mr6        /* Match Register 6 */
+#define PWMPCR          PWM->pcr        /* Control Register */
+#define PWMLER          PWM->ler        /* Latch Enable Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Universal Asynchronous Receiver Transmitter 0 (UART0)
+#define UART0           ((uartRegs_t *)0xE000C000)
+#define U0_PINSEL       (0x00000005)    /* PINSEL0 Value for UART0 */
+#define U0_PINMASK      (0x0000000F)    /* PINSEL0 Mask for UART0 */
+
+// UART0 Registers
+#define U0RBR           UART0->rbr      /* Receive Buffer Register */
+#define U0THR           UART0->thr      /* Transmit Holding Register */
+#define U0IER           UART0->ier      /* Interrupt Enable Register */
+#define U0IIR           UART0->iir      /* Interrupt ID Register */
+#define U0FCR           UART0->fcr      /* FIFO Control Register */
+#define U0LCR           UART0->lcr      /* Line Control Register */
+#define U0LSR           UART0->lsr      /* Line Status Register */
+#define U0SCR           UART0->scr      /* Scratch Pad Register */
+#define U0DLL           UART0->dll      /* Divisor Latch Register (LSB) */
+#define U0DLM           UART0->dlm      /* Divisor Latch Register (MSB) */
+
+///////////////////////////////////////////////////////////////////////////////
+// Universal Asynchronous Receiver Transmitter 1 (UART1)
+#define UART1           ((uartRegs_t *)0xE0010000)
+#define U1_PINSEL       (0x00050000)    /* PINSEL0 Value for UART1 */
+#define U1_PINMASK      (0x000F0000)    /* PINSEL0 Mask for UART1 */
+
+// UART1 Registers
+#define U1RBR           UART1->rbr      /* Receive Buffer Register */
+#define U1THR           UART1->thr      /* Transmit Holding Register */
+#define U1IER           UART1->ier      /* Interrupt Enable Register */
+#define U1IIR           UART1->iir      /* Interrupt ID Register */
+#define U1FCR           UART1->fcr      /* FIFO Control Register */
+#define U1LCR           UART1->lcr      /* Line Control Register */
+#define U1MCR           UART1->mcr      /* MODEM Control Register */
+#define U1LSR           UART1->lsr      /* Line Status Register */
+#define U1MSR           UART1->msr      /* MODEM Status Register */
+#define U1SCR           UART1->scr      /* Scratch Pad Register */
+#define U1DLL           UART1->dll      /* Divisor Latch Register (LSB) */
+#define U1DLM           UART1->dlm      /* Divisor Latch Register (MSB) */
+
+///////////////////////////////////////////////////////////////////////////////
+// I2C Interface
+#define I2C             ((i2cRegs_t *)0xE001C000)
+
+// I2C Registers
+#define I2CONSET        I2C->conset     /* Control Set Register */
+#define I2STAT          I2C->stat       /* Status Register */
+#define I2DAT           I2C->dat        /* Data Register */
+#define I2ADR           I2C->adr        /* Slave Address Register */
+#define I2SCLH          I2C->sclh       /* SCL Duty Cycle Register (high half word) */
+#define I2SCLL          I2C->scll       /* SCL Duty Cycle Register (low half word) */
+#define I2CONCLR        I2C->conclr     /* Control Clear Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Serial Peripheral Interface 0 (SPI0)
+#define SPI0            ((spiRegs_t *)0xE0020000)
+
+// SPI0 Registers
+#define S0SPCR          SPI0->cr        /* Control Register */
+#define S0SPSR          SPI0->sr        /* Status Register */
+#define S0SPDR          SPI0->dr        /* Data Register */
+#define S0SPCCR         SPI0->ccr       /* Clock Counter Register */
+#define S0SPINT         SPI0->flag      /* Interrupt Flag Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Serial Peripheral Interface 1 (SPI1)
+#define SPI1            ((spiRegs_t *)0xE0030000)
+
+// SPI1 Registers
+#define S1SPCR          SPI1->cr        /* Control Register */
+#define S1SPSR          SPI1->sr        /* Status Register */
+#define S1SPDR          SPI1->dr        /* Data Register */
+#define S1SPCCR         SPI1->ccr       /* Clock Counter Register */
+#define S1SPINT         SPI1->flag      /* Interrupt Flag Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Real Time Clock
+#define RTC             ((rtcRegs_t *)0xE0024000)
+
+// RTC Registers
+#define RTCILR          RTC->ilr        /* Interrupt Location Register */
+#define RTCCTC          RTC->ctc        /* Clock Tick Counter */
+#define RTCCCR          RTC->ccr        /* Clock Control Register */
+#define RTCCIIR         RTC->ciir       /* Counter Increment Interrupt Register */
+#define RTCAMR          RTC->amr        /* Alarm Mask Register */
+#define RTCCTIME0       RTC->ctime0     /* Consolidated Time Register 0 */
+#define RTCCTIME1       RTC->ctime1     /* Consolidated Time Register 1 */
+#define RTCCTIME2       RTC->ctime2     /* Consolidated Time Register 2 */
+#define RTCSEC          RTC->sec        /* Seconds Register */
+#define RTCMIN          RTC->min        /* Minutes Register */
+#define RTCHOUR         RTC->hour       /* Hours Register */
+#define RTCDOM          RTC->dom        /* Day Of Month Register */
+#define RTCDOW          RTC->dow        /* Day Of Week Register */
+#define RTCDOY          RTC->doy        /* Day Of Year Register */
+#define RTCMONTH        RTC->month      /* Months Register */
+#define RTCYEAR         RTC->year       /* Years Register */
+#define RTCALSEC        RTC->alsec      /* Alarm Seconds Register */
+#define RTCALMIN        RTC->almin      /* Alarm Minutes Register */
+#define RTCALHOUR       RTC->alhour     /* Alarm Hours Register */
+#define RTCALDOM        RTC->aldom      /* Alarm Day Of Month Register */
+#define RTCALDOW        RTC->aldow      /* Alarm Day Of Week Register */
+#define RTCALDOY        RTC->aldoy      /* Alarm Day Of Year Register */
+#define RTCALMON        RTC->almon      /* Alarm Months Register */
+#define RTCALYEAR       RTC->alyear     /* Alarm Years Register */
+#define RTCPREINT       RTC->preint     /* Prescale Value Register (integer) */
+#define RTCPREFRAC      RTC->prefrac    /* Prescale Value Register (fraction) */
+
+///////////////////////////////////////////////////////////////////////////////
+// General Purpose Input/Output
+#define GPIO            ((gpioRegs_t *)0xE0028000)
+
+// GPIO Registers
+#define IO0PIN          GPIO->in0       /* P0 Pin Value Register */
+#define IO0SET          GPIO->set0      /* P0 Pin Output Set Register */
+#define IO0DIR          GPIO->dir0      /* P0 Pin Direction Register */
+#define IO0CLR          GPIO->clr0      /* P0 Pin Output Clear Register */
+#define IO1PIN          GPIO->in1       /* P1 Pin Value Register */
+#define IO1SET          GPIO->set1      /* P1 Pin Output Set Register */
+#define IO1DIR          GPIO->dir1      /* P1 Pin Direction Register */
+#define IO1CLR          GPIO->clr1      /* P1 Pin Output Clear Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Pin Connect Block
+#define PINSEL          ((pinRegs_t *)0xE002C000)
+
+// Pin Connect Block Registers
+#define PINSEL0         PINSEL->sel0    /* Pin Function Select Register 0 */
+#define PINSEL1         PINSEL->sel1    /* Pin Function Select Register 1 */
+#define PINSEL2         PINSEL->sel2    /* Pin Function Select Register 2 */
+
+///////////////////////////////////////////////////////////////////////////////
+// A/D Converter
+#define ADC             ((adcRegs_t *)0xE0034000)
+
+// A/D Converter Registers
+#define ADCR            ADC->cr         /* Control Register */
+#define ADDR            ADC->dr         /* Data Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// System Contol Block
+#define SCB             ((scbRegs_t *)0xE01FC000)
+
+// Memory Accelerator Module Registers (MAM)
+#define MAMCR           SCB->mam.cr     /* Control Register */
+#define MAMTIM          SCB->mam.tim    /* Timing Control Register */
+
+// Memory Mapping Control Register
+#define MEMMAP          SCB->memmap
+
+// Phase Locked Loop Registers (PLL)
+#define PLLCON          SCB->pll.con    /* Control Register */
+#define PLLCFG          SCB->pll.cfg    /* Configuration Register */
+#define PLLSTAT         SCB->pll.stat   /* Status Register */
+#define PLLFEED         SCB->pll.feed   /* Feed Register */
+
+// Power Control Registers
+#define PCON            SCB->p.con      /* Control Register */
+#define PCONP           SCB->p.conp     /* Peripherals Register */
+
+// VPB Divider Register
+#define VPBDIV          SCB->vpbdiv
+
+// External Interrupt Registers
+#define EXTINT          SCB->ext.flag   /* Flag Register */
+#define EXTWAKE         SCB->ext.wake   /* Wakeup Register */
+#define EXTMODE         SCB->ext.mode   /* Mode Register */
+#define EXTPOLAR        SCB->ext.polar  /* Polarity Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Vectored Interrupt Controller
+#define VIC             ((vicRegs_t *)0xFFFFF000)
+
+// Vectored Interrupt Controller Registers
+#define VICIRQStatus    VIC->irqStatus  /* IRQ Status Register */
+#define VICFIQStatus    VIC->fiqStatus  /* FIQ Status Register */
+#define VICRawIntr      VIC->rawIntr    /* Raw Interrupt Status Register */
+#define VICIntSelect    VIC->intSelect  /* Interrupt Select Register */
+#define VICIntEnable    VIC->intEnable  /* Interrupt Enable Register */
+#define VICIntEnClear   VIC->intEnClear /* Interrupt Enable Clear Register */
+#define VICSoftInt      VIC->softInt    /* Software Interrupt Register */
+#define VICSoftIntClear VIC->softIntClear /* Software Interrupt Clear Register */
+#define VICProtection   VIC->protection /* Protection Enable Register */
+#define VICVectAddr     VIC->vectAddr   /* Vector Address Register */
+#define VICDefVectAddr  VIC->defVectAddr /* Default Vector Address Register */
+#define VICVectAddr0    VIC->vectAddr0  /* Vector Address 0 Register */
+#define VICVectAddr1    VIC->vectAddr1  /* Vector Address 1 Register */
+#define VICVectAddr2    VIC->vectAddr2  /* Vector Address 2 Register */
+#define VICVectAddr3    VIC->vectAddr3  /* Vector Address 3 Register */
+#define VICVectAddr4    VIC->vectAddr4  /* Vector Address 4 Register */
+#define VICVectAddr5    VIC->vectAddr5  /* Vector Address 5 Register */
+#define VICVectAddr6    VIC->vectAddr6  /* Vector Address 6 Register */
+#define VICVectAddr7    VIC->vectAddr7  /* Vector Address 7 Register */
+#define VICVectAddr8    VIC->vectAddr8  /* Vector Address 8 Register */
+#define VICVectAddr9    VIC->vectAddr9  /* Vector Address 9 Register */
+#define VICVectAddr10   VIC->vectAddr10 /* Vector Address 10 Register */
+#define VICVectAddr11   VIC->vectAddr11 /* Vector Address 11 Register */
+#define VICVectAddr12   VIC->vectAddr12 /* Vector Address 12 Register */
+#define VICVectAddr13   VIC->vectAddr13 /* Vector Address 13 Register */
+#define VICVectAddr14   VIC->vectAddr14 /* Vector Address 14 Register */
+#define VICVectAddr15   VIC->vectAddr15 /* Vector Address 15 Register */
+#define VICVectCntl0    VIC->vectCntl0  /* Vector Control 0 Register */
+#define VICVectCntl1    VIC->vectCntl1  /* Vector Control 1 Register */
+#define VICVectCntl2    VIC->vectCntl2  /* Vector Control 2 Register */
+#define VICVectCntl3    VIC->vectCntl3  /* Vector Control 3 Register */
+#define VICVectCntl4    VIC->vectCntl4  /* Vector Control 4 Register */
+#define VICVectCntl5    VIC->vectCntl5  /* Vector Control 5 Register */
+#define VICVectCntl6    VIC->vectCntl6  /* Vector Control 6 Register */
+#define VICVectCntl7    VIC->vectCntl7  /* Vector Control 7 Register */
+#define VICVectCntl8    VIC->vectCntl8  /* Vector Control 8 Register */
+#define VICVectCntl9    VIC->vectCntl9  /* Vector Control 9 Register */
+#define VICVectCntl10   VIC->vectCntl10 /* Vector Control 10 Register */
+#define VICVectCntl11   VIC->vectCntl11 /* Vector Control 11 Register */
+#define VICVectCntl12   VIC->vectCntl12 /* Vector Control 12 Register */
+#define VICVectCntl13   VIC->vectCntl13 /* Vector Control 13 Register */
+#define VICVectCntl14   VIC->vectCntl14 /* Vector Control 14 Register */
+#define VICVectCntl15   VIC->vectCntl15 /* Vector Control 15 Register */
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC22xx.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/LPC22xx.h
new file mode 100644 (file)
index 0000000..c2d30e0
--- /dev/null
@@ -0,0 +1,342 @@
+/******************************************************************************
+ *
+ * $RCSfile: LPC22xx.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC22xx ARM Processors 
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC22xx_H
+#define INC_LPC22xx_H
+
+#define REG_8           volatile unsigned char
+#define REG16           volatile unsigned short
+#define REG32           volatile unsigned long
+
+#include "lpcWD.h"
+#include "lpcTMR.h"
+#include "lpcUART.h"
+#include "lpcI2C.h"
+#include "lpcSPI.h"
+#include "lpcRTC.h"
+#include "lpcGPIO.h"
+#include "lpcPIN.h"
+#include "lpcADC.h"
+#include "lpcSCB.h"
+#include "lpcEMC.h"
+#include "lpcVIC.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Watchdog
+#define WD              ((wdRegs_t *)0xE0000000)
+
+// Watchdog Registers
+#define WDMOD           WD->mod         /* Watchdog Mode Register */
+#define WDTC            WD->tc          /* Watchdog Time Constant Register */
+#define WDFEED          WD->feed        /* Watchdog Feed Register */
+#define WDTV            WD->tv          /* Watchdog Time Value Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Timer 0
+#define TMR0            ((pwmTmrRegs_t *)0xE0004000)
+
+// Timer 0 Registers
+#define T0IR            TMR0->ir        /* Interrupt Register */
+#define T0TCR           TMR0->tcr       /* Timer Control Register */
+#define T0TC            TMR0->tc        /* Timer Counter */
+#define T0PR            TMR0->pr        /* Prescale Register */
+#define T0PC            TMR0->pc        /* Prescale Counter Register */
+#define T0MCR           TMR0->mcr       /* Match Control Register */
+#define T0MR0           TMR0->mr0       /* Match Register 0 */
+#define T0MR1           TMR0->mr1       /* Match Register 1 */
+#define T0MR2           TMR0->mr2       /* Match Register 2 */
+#define T0MR3           TMR0->mr3       /* Match Register 3 */
+#define T0CCR           TMR0->ccr       /* Capture Control Register */
+#define T0CR0           TMR0->cr0       /* Capture Register 0 */
+#define T0CR1           TMR0->cr1       /* Capture Register 1 */
+#define T0CR2           TMR0->cr2       /* Capture Register 2 */
+#define T0CR3           TMR0->cr3       /* Capture Register 3 */
+#define T0EMR           TMR0->emr       /* External Match Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Timer 1
+#define TMR1            ((pwmTmrRegs_t *)0xE0008000)
+
+// Timer 1 Registers
+#define T1IR            TMR1->ir        /* Interrupt Register */
+#define T1TCR           TMR1->tcr       /* Timer Control Register */
+#define T1TC            TMR1->tc        /* Timer Counter */
+#define T1PR            TMR1->pr        /* Prescale Register */
+#define T1PC            TMR1->pc        /* Prescale Counter Register */
+#define T1MCR           TMR1->mcr       /* Match Control Register */
+#define T1MR0           TMR1->mr0       /* Match Register 0 */
+#define T1MR1           TMR1->mr1       /* Match Register 1 */
+#define T1MR2           TMR1->mr2       /* Match Register 2 */
+#define T1MR3           TMR1->mr3       /* Match Register 3 */
+#define T1CCR           TMR1->ccr       /* Capture Control Register */
+#define T1CR0           TMR1->cr0       /* Capture Register 0 */
+#define T1CR1           TMR1->cr1       /* Capture Register 1 */
+#define T1CR2           TMR1->cr2       /* Capture Register 2 */
+#define T1CR3           TMR1->cr3       /* Capture Register 3 */
+#define T1EMR           TMR1->emr       /* External Match Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Pulse Width Modulator (PWM)
+#define PWM             ((pwmTmrRegs_t *)0xE0014000)
+
+// PWM Registers
+#define PWMIR           PWM->ir         /* Interrupt Register */
+#define PWMTCR          PWM->tcr        /* Timer Control Register */
+#define PWMTC           PWM->tc         /* Timer Counter */
+#define PWMPR           PWM->pr         /* Prescale Register */
+#define PWMPC           PWM->pc         /* Prescale Counter Register */
+#define PWMMCR          PWM->mcr        /* Match Control Register */
+#define PWMMR0          PWM->mr0        /* Match Register 0 */
+#define PWMMR1          PWM->mr1        /* Match Register 1 */
+#define PWMMR2          PWM->mr2        /* Match Register 2 */
+#define PWMMR3          PWM->mr3        /* Match Register 3 */
+#define PWMMR4          PWM->mr4        /* Match Register 4 */
+#define PWMMR5          PWM->mr5        /* Match Register 5 */
+#define PWMMR6          PWM->mr6        /* Match Register 6 */
+#define PWMPCR          PWM->pcr        /* Control Register */
+#define PWMLER          PWM->ler        /* Latch Enable Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Universal Asynchronous Receiver Transmitter 0 (UART0)
+#define UART0           ((uartRegs_t *)0xE000C000)
+#define U0_PINSEL       (0x00000005)    /* PINSEL0 Value for UART0 */
+#define U0_PINMASK      (0x0000000F)    /* PINSEL0 Mask for UART0 */
+
+// UART0 Registers
+#define U0RBR           UART0->rbr      /* Receive Buffer Register */
+#define U0THR           UART0->thr      /* Transmit Holding Register */
+#define U0IER           UART0->ier      /* Interrupt Enable Register */
+#define U0IIR           UART0->iir      /* Interrupt ID Register */
+#define U0FCR           UART0->fcr      /* FIFO Control Register */
+#define U0LCR           UART0->lcr      /* Line Control Register */
+#define U0LSR           UART0->lsr      /* Line Status Register */
+#define U0SCR           UART0->scr      /* Scratch Pad Register */
+#define U0DLL           UART0->dll      /* Divisor Latch Register (LSB) */
+#define U0DLM           UART0->dlm      /* Divisor Latch Register (MSB) */
+
+///////////////////////////////////////////////////////////////////////////////
+// Universal Asynchronous Receiver Transmitter 1 (UART1)
+#define UART1           ((uartRegs_t *)0xE0010000)
+#define U1_PINSEL       (0x00050000)    /* PINSEL0 Value for UART1 */
+#define U1_PINMASK      (0x000F0000)    /* PINSEL0 Mask for UART1 */
+
+// UART1 Registers
+#define U1RBR           UART1->rbr      /* Receive Buffer Register */
+#define U1THR           UART1->thr      /* Transmit Holding Register */
+#define U1IER           UART1->ier      /* Interrupt Enable Register */
+#define U1IIR           UART1->iir      /* Interrupt ID Register */
+#define U1FCR           UART1->fcr      /* FIFO Control Register */
+#define U1LCR           UART1->lcr      /* Line Control Register */
+#define U1MCR           UART1->mcr      /* MODEM Control Register */
+#define U1LSR           UART1->lsr      /* Line Status Register */
+#define U1MSR           UART1->msr      /* MODEM Status Register */
+#define U1SCR           UART1->scr      /* Scratch Pad Register */
+#define U1DLL           UART1->dll      /* Divisor Latch Register (LSB) */
+#define U1DLM           UART1->dlm      /* Divisor Latch Register (MSB) */
+
+///////////////////////////////////////////////////////////////////////////////
+// I2C Interface
+#define I2C             ((i2cRegs_t *)0xE001C000)
+
+// I2C Registers
+#define I2CONSET        I2C->conset     /* Control Set Register */
+#define I2STAT          I2C->stat       /* Status Register */
+#define I2DAT           I2C->dat        /* Data Register */
+#define I2ADR           I2C->adr        /* Slave Address Register */
+#define I2SCLH          I2C->sclh       /* SCL Duty Cycle Register (high half word) */
+#define I2SCLL          I2C->scll       /* SCL Duty Cycle Register (low half word) */
+#define I2CONCLR        I2C->conclr     /* Control Clear Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Serial Peripheral Interface 0 (SPI0)
+#define SPI0            ((spiRegs_t *)0xE0020000)
+
+// SPI0 Registers
+#define S0SPCR          SPI0->cr        /* Control Register */
+#define S0SPSR          SPI0->sr        /* Status Register */
+#define S0SPDR          SPI0->dr        /* Data Register */
+#define S0SPCCR         SPI0->ccr       /* Clock Counter Register */
+#define S0SPINT         SPI0->flag      /* Interrupt Flag Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Serial Peripheral Interface 1 (SPI1)
+#define SPI1            ((spiRegs_t *)0xE0030000)
+
+// SPI1 Registers
+#define S1SPCR          SPI1->cr        /* Control Register */
+#define S1SPSR          SPI1->sr        /* Status Register */
+#define S1SPDR          SPI1->dr        /* Data Register */
+#define S1SPCCR         SPI1->ccr       /* Clock Counter Register */
+#define S1SPINT         SPI1->flag      /* Interrupt Flag Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Real Time Clock
+#define RTC             ((rtcRegs_t *)0xE0024000)
+
+// RTC Registers
+#define RTCILR          RTC->ilr        /* Interrupt Location Register */
+#define RTCCTC          RTC->ctc        /* Clock Tick Counter */
+#define RTCCCR          RTC->ccr        /* Clock Control Register */
+#define RTCCIIR         RTC->ciir       /* Counter Increment Interrupt Register */
+#define RTCAMR          RTC->amr        /* Alarm Mask Register */
+#define RTCCTIME0       RTC->ctime0     /* Consolidated Time Register 0 */
+#define RTCCTIME1       RTC->ctime1     /* Consolidated Time Register 1 */
+#define RTCCTIME2       RTC->ctime2     /* Consolidated Time Register 2 */
+#define RTCSEC          RTC->sec        /* Seconds Register */
+#define RTCMIN          RTC->min        /* Minutes Register */
+#define RTCHOUR         RTC->hour       /* Hours Register */
+#define RTCDOM          RTC->dom        /* Day Of Month Register */
+#define RTCDOW          RTC->dow        /* Day Of Week Register */
+#define RTCDOY          RTC->doy        /* Day Of Year Register */
+#define RTCMONTH        RTC->month      /* Months Register */
+#define RTCYEAR         RTC->year       /* Years Register */
+#define RTCALSEC        RTC->alsec      /* Alarm Seconds Register */
+#define RTCALMIN        RTC->almin      /* Alarm Minutes Register */
+#define RTCALHOUR       RTC->alhour     /* Alarm Hours Register */
+#define RTCALDOM        RTC->aldom      /* Alarm Day Of Month Register */
+#define RTCALDOW        RTC->aldow      /* Alarm Day Of Week Register */
+#define RTCALDOY        RTC->aldoy      /* Alarm Day Of Year Register */
+#define RTCALMON        RTC->almon      /* Alarm Months Register */
+#define RTCALYEAR       RTC->alyear     /* Alarm Years Register */
+#define RTCPREINT       RTC->preint     /* Prescale Value Register (integer) */
+#define RTCPREFRAC      RTC->prefrac    /* Prescale Value Register (fraction) */
+
+///////////////////////////////////////////////////////////////////////////////
+// General Purpose Input/Output
+#define GPIO            ((gpioRegs_t *)0xE0028000)
+
+// GPIO Registers
+#define IO0PIN          GPIO->in0       /* P0 Pin Value Register */
+#define IO0SET          GPIO->set0      /* P0 Pin Output Set Register */
+#define IO0DIR          GPIO->dir0      /* P0 Pin Direction Register */
+#define IO0CLR          GPIO->clr0      /* P0 Pin Output Clear Register */
+#define IO1PIN          GPIO->in1       /* P1 Pin Value Register */
+#define IO1SET          GPIO->set1      /* P1 Pin Output Set Register */
+#define IO1DIR          GPIO->dir1      /* P1 Pin Direction Register */
+#define IO1CLR          GPIO->clr1      /* P1 Pin Output Clear Register */
+#define IO2PIN          GPIO->in2       /* P2 Pin Value Register */
+#define IO2SET          GPIO->set2      /* P2 Pin Output Set Register */
+#define IO2DIR          GPIO->dir2      /* P2 Pin Direction Register */
+#define IO2CLR          GPIO->clr2      /* P2 Pin Output Clear Register */
+#define IO3PIN          GPIO->in3       /* P3 Pin Value Register */
+#define IO3SET          GPIO->set3      /* P3 Pin Output Set Register */
+#define IO3DIR          GPIO->dir3      /* P3 Pin Direction Register */
+#define IO3CLR          GPIO->clr3      /* P3 Pin Output Clear Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Pin Connect Block
+#define PINSEL          ((pinRegs_t *)0xE002C000)
+
+// Pin Connect Block Registers
+#define PINSEL0         PINSEL->sel0    /* Pin Function Select Register 0 */
+#define PINSEL1         PINSEL->sel1    /* Pin Function Select Register 1 */
+#define PINSEL2         PINSEL->sel2    /* Pin Function Select Register 2 */
+
+///////////////////////////////////////////////////////////////////////////////
+// A/D Converter
+#define ADC             ((adcRegs_t *)0xE0034000)
+
+// A/D Converter Registers
+#define ADCR            ADC->cr         /* Control Register */
+#define ADDR            ADC->dr         /* Data Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// System Contol Block
+#define SCB             ((scbRegs_t *)0xE01FC000)
+
+// Memory Accelerator Module Registers (MAM)
+#define MAMCR           SCB->mam.cr     /* Control Register */
+#define MAMTIM          SCB->mam.tim    /* Timing Control Register */
+
+// Memory Mapping Control Register
+#define MEMMAP          SCB->memmap
+
+// Phase Locked Loop Registers (PLL)
+#define PLLCON          SCB->pll.con    /* Control Register */
+#define PLLCFG          SCB->pll.cfg    /* Configuration Register */
+#define PLLSTAT         SCB->pll.stat   /* Status Register */
+#define PLLFEED         SCB->pll.feed   /* Feed Register */
+
+// Power Control Registers
+#define PCON            SCB->p.con      /* Control Register */
+#define PCONP           SCB->p.conp     /* Peripherals Register */
+
+// VPB Divider Register
+#define VPBDIV          SCB->vpbdiv
+
+// External Interrupt Registers
+#define EXTINT          SCB->ext.flag   /* Flag Register */
+#define EXTWAKE         SCB->ext.wake   /* Wakeup Register */
+#define EXTMODE         SCB->ext.mode   /* Mode Register */
+#define EXTPOLAR        SCB->ext.polar  /* Polarity Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// External Memory Controller (EMC)
+#define EMC             ((volatile emcRegs_t *)0xFFE00000)
+
+// External Memory Controller Registers
+#define BCFG0           EMC->bcfg0      /* Bank 0 Configuration Register */
+#define BCFG1           EMC->bcfg1      /* Bank 1 Configuration Register */
+#define BCFG2           EMC->bcfg2      /* Bank 2 Configuration Register */
+#define BCFG3           EMC->bcfg3      /* Bank 3 Configuration Register */
+
+///////////////////////////////////////////////////////////////////////////////
+// Vectored Interrupt Controller
+#define VIC             ((vicRegs_t *)0xFFFFF000)
+
+// Vectored Interrupt Controller Registers
+#define VICIRQStatus    VIC->irqStatus  /* IRQ Status Register */
+#define VICFIQStatus    VIC->fiqStatus  /* FIQ Status Register */
+#define VICRawIntr      VIC->rawIntr    /* Raw Interrupt Status Register */
+#define VICIntSelect    VIC->intSelect  /* Interrupt Select Register */
+#define VICIntEnable    VIC->intEnable  /* Interrupt Enable Register */
+#define VICIntEnClear   VIC->intEnClear /* Interrupt Enable Clear Register */
+#define VICSoftInt      VIC->softInt    /* Software Interrupt Register */
+#define VICSoftIntClear VIC->softIntClear /* Software Interrupt Clear Register */
+#define VICProtection   VIC->protection /* Protection Enable Register */
+#define VICVectAddr     VIC->vectAddr   /* Vector Address Register */
+#define VICDefVectAddr  VIC->defVectAddr /* Default Vector Address Register */
+#define VICVectAddr0    VIC->vectAddr0  /* Vector Address 0 Register */
+#define VICVectAddr1    VIC->vectAddr1  /* Vector Address 1 Register */
+#define VICVectAddr2    VIC->vectAddr2  /* Vector Address 2 Register */
+#define VICVectAddr3    VIC->vectAddr3  /* Vector Address 3 Register */
+#define VICVectAddr4    VIC->vectAddr4  /* Vector Address 4 Register */
+#define VICVectAddr5    VIC->vectAddr5  /* Vector Address 5 Register */
+#define VICVectAddr6    VIC->vectAddr6  /* Vector Address 6 Register */
+#define VICVectAddr7    VIC->vectAddr7  /* Vector Address 7 Register */
+#define VICVectAddr8    VIC->vectAddr8  /* Vector Address 8 Register */
+#define VICVectAddr9    VIC->vectAddr9  /* Vector Address 9 Register */
+#define VICVectAddr10   VIC->vectAddr10 /* Vector Address 10 Register */
+#define VICVectAddr11   VIC->vectAddr11 /* Vector Address 11 Register */
+#define VICVectAddr12   VIC->vectAddr12 /* Vector Address 12 Register */
+#define VICVectAddr13   VIC->vectAddr13 /* Vector Address 13 Register */
+#define VICVectAddr14   VIC->vectAddr14 /* Vector Address 14 Register */
+#define VICVectAddr15   VIC->vectAddr15 /* Vector Address 15 Register */
+#define VICVectCntl0    VIC->vectCntl0  /* Vector Control 0 Register */
+#define VICVectCntl1    VIC->vectCntl1  /* Vector Control 1 Register */
+#define VICVectCntl2    VIC->vectCntl2  /* Vector Control 2 Register */
+#define VICVectCntl3    VIC->vectCntl3  /* Vector Control 3 Register */
+#define VICVectCntl4    VIC->vectCntl4  /* Vector Control 4 Register */
+#define VICVectCntl5    VIC->vectCntl5  /* Vector Control 5 Register */
+#define VICVectCntl6    VIC->vectCntl6  /* Vector Control 6 Register */
+#define VICVectCntl7    VIC->vectCntl7  /* Vector Control 7 Register */
+#define VICVectCntl8    VIC->vectCntl8  /* Vector Control 8 Register */
+#define VICVectCntl9    VIC->vectCntl9  /* Vector Control 9 Register */
+#define VICVectCntl10   VIC->vectCntl10 /* Vector Control 10 Register */
+#define VICVectCntl11   VIC->vectCntl11 /* Vector Control 11 Register */
+#define VICVectCntl12   VIC->vectCntl12 /* Vector Control 12 Register */
+#define VICVectCntl13   VIC->vectCntl13 /* Vector Control 13 Register */
+#define VICVectCntl14   VIC->vectCntl14 /* Vector Control 14 Register */
+#define VICVectCntl15   VIC->vectCntl15 /* Vector Control 15 Register */
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile b/ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile.omk b/ulan/embedded/arch/arm/mach-lpc21xx/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..176b8a6
--- /dev/null
@@ -0,0 +1,2 @@
+# -*- makefile -*-
+include_HEADERS = $(notdir $(wildcard $(SOURCES_DIR)/*.h))
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/armVIC.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/armVIC.h
new file mode 100644 (file)
index 0000000..560a6b4
--- /dev/null
@@ -0,0 +1,157 @@
+/******************************************************************************
+ *
+ * $RCSfile: armVIC.h,v $
+ * $Revision: 1.1 $
+ *
+ * This module provides the interface definitions for setting up and
+ * controlling the various interrupt modes present on the ARM processor.
+ * Copyright 2004, R O SoftWare
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_ARM_VIC_H
+#define INC_ARM_VIC_H
+
+/******************************************************************************
+ *
+ * MACRO Name: ISR_ENTRY()
+ *
+ * Description:
+ *    This MACRO is used upon entry to an ISR.  The current version of
+ *    the gcc compiler for ARM does not produce correct code for
+ *    interrupt routines to operate properly with THUMB code.  The MACRO
+ *    performs the following steps:
+ *
+ *    1 - Adjust address at which execution should resume after servicing
+ *        ISR to compensate for IRQ entry
+ *    2 - Save the non-banked registers r0-r12 and lr onto the IRQ stack.
+ *    3 - Get the status of the interrupted program is in SPSR.
+ *    4 - Push it onto the IRQ stack as well.
+ *
+ *****************************************************************************/
+#define ISR_ENTRY() asm volatile(" sub   lr, lr,#4\n" \
+                                 " stmfd sp!,{r0-r12,lr}\n" \
+                                 " mrs   r1, spsr\n" \
+                                 " stmfd sp!,{r1}")
+
+/******************************************************************************
+ *
+ * MACRO Name: ISR_EXIT()
+ *
+ * Description:
+ *    This MACRO is used to exit an ISR.  The current version of the gcc
+ *    compiler for ARM does not produce correct code for interrupt
+ *    routines to operate properly with THUMB code.  The MACRO performs
+ *    the following steps:
+ *
+ *    1 - Recover SPSR value from stack       
+ *    2 - and restore  its value                   
+ *    3 - Pop the return address & the saved general registers from
+ *        the IRQ stack & return
+ *
+ *****************************************************************************/
+#define ISR_EXIT()  asm volatile(" ldmfd sp!,{r1}\n" \
+                                 " msr   spsr_c,r1\n" \
+                                 " ldmfd sp!,{r0-r12,pc}^")
+
+/******************************************************************************
+ *
+ * Function Name: disableIRQ()
+ *
+ * Description:
+ *    This function sets the IRQ disable bit in the status register
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned disableIRQ(void);
+
+/******************************************************************************
+ *
+ * Function Name: enableIRQ()
+ *
+ * Description:
+ *    This function clears the IRQ disable bit in the status register
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned enableIRQ(void);
+
+/******************************************************************************
+ *
+ * Function Name: restoreIRQ()
+ *
+ * Description:
+ *    This function restores the IRQ disable bit in the status register
+ *    to the value contained within passed oldCPSR
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned restoreIRQ(unsigned oldCPSR);
+
+/******************************************************************************
+ *
+ * Function Name: disableFIQ()
+ *
+ * Description:
+ *    This function sets the FIQ disable bit in the status register
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned disableFIQ(void);
+
+/******************************************************************************
+ *
+ * Function Name: enableFIQ()
+ *
+ * Description:
+ *    This function clears the FIQ disable bit in the status register
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned enableFIQ(void);
+
+/******************************************************************************
+ *
+ * Function Name: restoreIRQ()
+ *
+ * Description:
+ *    This function restores the FIQ disable bit in the status register
+ *    to the value contained within passed oldCPSR
+ *
+ * Calling Sequence: 
+ *    void
+ *
+ * Returns:
+ *    previous value of CPSR
+ *
+ *****************************************************************************/
+unsigned restoreFIQ(unsigned oldCPSR);
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC-214x.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC-214x.h
new file mode 100644 (file)
index 0000000..7e66dae
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef INC_LPC_ADC_214x_H
+#define INC_LPC_ADC_214x_H
+
+// A/D Converter Registers
+typedef struct
+{
+  REG32 cr;                     // Control Register
+  REG32 gdr;                   // Global Data Register
+  REG32 gsr;                   // Global Start Register
+  REG32 inten;                 // Interrupt Enable Register
+  REG32 dr0;                   // Channel 0 Data Register
+  REG32 dr1;                   // Channel 1 Data Register
+  REG32 dr2;                   // Channel 2 Data Register
+  REG32 dr3;                   // Channel 3 Data Register
+  REG32 dr4;                   // Channel 4 Data Register
+  REG32 dr5;                   // Channel 5 Data Register
+  REG32 dr6;                   // Channel 6 Data Register
+  REG32 dr7;                   // Channel 7 Data Register
+  REG32 stat;                  // Status Register
+} adc214xRegs_t;
+
+#define        ADCR_SEL                0x000000FF
+#define        ADCR_CLKDIV             0x0000FF00
+#define        ADCR_BURST              0x00010000
+#define        ADCR_CLKS               0x000E0000
+#define        ADCR_PDN                0x00200000
+#define        ADCR_START              0x07000000
+#define        ADCR_EDGE               0x08000000
+
+#define        ADGDR_RESULT            0x0000FFC0
+#define        ADGDR_CHN               0x07000000
+#define        ADGDR_OVERRUN           0x40000000
+#define        ADGDR_DONE              0x80000000
+
+#define        ADGSR_BURST             0x00010000
+#define        ADGSR_START             0x07000000
+#define        ADGSR_EDGE              0x08000000
+
+#define        ADSTAT_DONE             0x000000FF
+#define        ADSTAT_DONE0            0x00000001
+#define        ADSTAT_DONE1            0x00000002
+#define        ADSTAT_DONE2            0x00000004
+#define        ADSTAT_DONE3            0x00000008
+#define        ADSTAT_DONE4            0x00000010
+#define        ADSTAT_DONE5            0x00000020
+#define        ADSTAT_DONE6            0x00000040
+#define        ADSTAT_DONE7            0x00000080
+#define        ADSTAT_OVERRUN          0x0000FF00
+#define        ADSTAT_OVERRUN0         0x00000100
+#define        ADSTAT_OVERRUN1         0x00000200
+#define        ADSTAT_OVERRUN2         0x00000400
+#define        ADSTAT_OVERRUN3         0x00000800
+#define        ADSTAT_OVERRUN4         0x00001000
+#define        ADSTAT_OVERRUN5         0x00002000
+#define        ADSTAT_OVERRUN6         0x00004000
+#define        ADSTAT_OVERRUN7         0x00008000
+#define        ADSTAT_ADINT            0x00010000
+
+#define        ADINTEN_INTEN           0x000000FF
+#define        ADINTEN_INTEN0          0x00000001
+#define        ADINTEN_INTEN1          0x00000002
+#define        ADINTEN_INTEN2          0x00000004
+#define        ADINTEN_INTEN3          0x00000008
+#define        ADINTEN_INTEN4          0x00000010
+#define        ADINTEN_INTEN5          0x00000020
+#define        ADINTEN_INTEN6          0x00000040
+#define        ADINTEN_INTEN7          0x00000080
+#define        ADINTEN_GINTEN          0x00000100
+
+#define        ADDR_RESULT             0x0000FFC0
+#define        ADDR_OVERRUN            0x40000000
+#define        ADDR_DONE               0x80000000
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcADC.h
new file mode 100644 (file)
index 0000000..11bc2a3
--- /dev/null
@@ -0,0 +1,24 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcADC.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_ADC_H
+#define INC_LPC_ADC_H
+
+// A/D Converter Registers
+typedef struct
+{
+  REG32 cr;                             // Control Register
+  REG32 dr;                             // Data Register
+} adcRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcEMC.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcEMC.h
new file mode 100644 (file)
index 0000000..2349617
--- /dev/null
@@ -0,0 +1,26 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcEMC.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_EMC_H
+#define INC_LPC_EMC_H
+
+// External Memory Controller Registers
+typedef struct
+{
+  REG32 bcfg0;                          // Bank 0 Configuration Register
+  REG32 bcfg1;                          // Bank 1 Configuration Register
+  REG32 bcfg2;                          // Bank 2 Configuration Register
+  REG32 bcfg3;                          // Bank 3 Configuration Register
+} emcRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcGPIO.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcGPIO.h
new file mode 100644 (file)
index 0000000..f4c78c9
--- /dev/null
@@ -0,0 +1,38 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcGPIO.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_GPIO_H
+#define INC_LPC_GPIO_H
+
+// General Purpose Input/Output Registers (GPIO)
+typedef struct
+{
+  REG32 in0;                            // P0 Pin Value Register
+  REG32 set0;                           // P0 Pin Output Set Register
+  REG32 dir0;                           // P0 Pin Direction Register
+  REG32 clr0;                           // P0 Pin Output Clear Register
+  REG32 in1;                            // P1 Pin Value Register
+  REG32 set1;                           // P1 Pin Output Set Register
+  REG32 dir1;                           // P1 Pin Direction Register
+  REG32 clr1;                           // P1 Pin Output Clear Register
+  REG32 in2;                            // P2 Pin Value Register
+  REG32 set2;                           // P2 Pin Output Set Register
+  REG32 dir2;                           // P2 Pin Direction Register
+  REG32 clr2;                           // P2 Pin Output Clear Register
+  REG32 in3;                            // P3 Pin Value Register
+  REG32 set3;                           // P3 Pin Output Set Register
+  REG32 dir3;                           // P3 Pin Direction Register
+  REG32 clr3;                           // P3 Pin Output Clear Register
+} gpioRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcI2C.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcI2C.h
new file mode 100644 (file)
index 0000000..e874abc
--- /dev/null
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcI2C.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_I2C_H
+#define INC_LPC_I2C_H
+
+// I2C Interface Registers
+typedef struct
+{
+  REG_8 conset;                         // Control Set Register
+  REG_8 _pad0[3];
+  REG_8 stat;                           // Status Register
+  REG_8 _pad1[3];
+  REG_8 dat;                            // Data Register
+  REG_8 _pad2[3];
+  REG_8 adr;                            // Slave Address Register
+  REG_8 _pad3[3];
+  REG16 sclh;                           // SCL Duty Cycle Register (high half word)
+  REG16 _pad4;
+  REG16 scll;                           // SCL Duty Cycle Register (low half word)
+  REG16 _pad5;
+  REG_8 conclr;                         // Control Clear Register
+  REG_8 _pad6[3];
+} i2cRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcPIN.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcPIN.h
new file mode 100644 (file)
index 0000000..df52b37
--- /dev/null
@@ -0,0 +1,26 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcPIN.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_PIN_H
+#define INC_LPC_PIN_H
+
+// Pin Connect Block Registers
+typedef struct
+{
+  REG32 sel0;                           // Pin Function Select Register 0
+  REG32 sel1;                           // Pin Function Select Register 1
+  REG32 _pad[3];
+  REG32 sel2;                           // Pin Function Select Register 2
+} pinRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcRTC.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcRTC.h
new file mode 100644 (file)
index 0000000..f9d9c0b
--- /dev/null
@@ -0,0 +1,70 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcRTC.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_RTC_H
+#define INC_LPC_RTC_H
+
+typedef struct
+{
+  REG_8 ilr;                            // Interrupt Location Register
+  REG_8 _pad0[3];
+  REG16 ctc;                            // Clock Tick Counter
+  REG16 _pad1;
+  REG_8 ccr;                            // Clock Control Register
+  REG_8 _pad2[3];
+  REG_8 ciir;                           // Counter Increment Interrupt Register
+  REG_8 _pad3[3];
+  REG_8 amr;                            // Alarm Mask Register
+  REG_8 _pad4[3];
+  REG32 ctime0;                         // Consolidated Time Register 0
+  REG32 ctime1;                         // Consolidated Time Register 1
+  REG32 ctime2;                         // Consolidated Time Register 2
+  REG_8 sec;                            // Seconds Register
+  REG_8 _pad5[3];
+  REG_8 min;                            // Minutes Register
+  REG_8 _pad6[3];
+  REG_8 hour;                           // Hours Register
+  REG_8 _pad7[3];
+  REG_8 dom;                            // Day Of Month Register
+  REG_8 _pad8[3];
+  REG_8 dow;                            // Day Of Week Register
+  REG_8 _pad9[3];
+  REG16 doy;                            // Day Of Year Register
+  REG16 _pad10;
+  REG_8 month;                          // Months Register
+  REG_8 _pad11[3];
+  REG16 year;                           // Years Register
+  REG32 _pad12[8];
+  REG_8 alsec;                          // Alarm Seconds Register
+  REG_8 _pad13[3];
+  REG_8 almin;                          // Alarm Minutes Register
+  REG_8 _pad14[3];
+  REG_8 alhour;                         // Alarm Hours Register
+  REG_8 _pad15[3];
+  REG_8 aldom;                          // Alarm Day Of Month Register
+  REG_8 _pad16[3];
+  REG_8 aldow;                          // Alarm Day Of Week Register
+  REG_8 _pad17[3];
+  REG16 aldoy;                          // Alarm Day Of Year Register
+  REG16 _pad18;
+  REG_8 almon;                          // Alarm Months Register
+  REG_8 _pad19[3];
+  REG16 alyear;                         // Alarm Years Register
+  REG16 _pad20;
+  REG16 preint;                         // Prescale Value Register (integer)
+  REG16 _pad21;
+  REG16 prefrac;                        // Prescale Value Register (fraction)
+  REG16 _pad22;
+} rtcRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSCB.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSCB.h
new file mode 100644 (file)
index 0000000..5612a94
--- /dev/null
@@ -0,0 +1,129 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcSCB.h,v $
+ * $Revision: 1.2 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_SCB_H
+#define INC_LPC_SCB_H
+
+// System Control Block Registers
+typedef struct
+{
+  // Memory Accelerator Module Registers (MAM)
+  struct
+    {
+    REG_8 cr;                           // Control Register
+    REG_8 _pad0[3];
+    REG_8 tim;                          // Timing Control Register
+    REG32 _pad1[14];
+    } mam;
+
+  // Memory Mapping Control Register
+  REG_8 memmap;
+  REG32 _pad0[15];
+
+  // Phase Locked Loop Registers (PLL)
+  struct
+    {
+    REG_8 con;                          // Control Register
+    REG_8 _pad0[3];
+    REG_8 cfg;                          // Configuration Register
+    REG_8 _pad1[3];
+    REG16 stat;                         // Status Register
+    REG16 _pad2;
+    REG_8 feed;                         // Feed Register
+    REG_8 _pad3[3];
+    REG32 _pad4[4];
+    } pll;
+
+  struct
+    {
+    REG_8 con;                          // Control Register
+    REG_8 _pad0[3];
+    REG_8 cfg;                          // Configuration Register
+    REG_8 _pad1[3];
+    REG16 stat;                         // Status Register
+    REG16 _pad2;
+    REG_8 feed;                         // Feed Register
+    REG_8 _pad3[3];
+    REG32 _pad4[4];
+    } pll48;
+
+  // Power Control Registers
+  struct
+    {
+    REG_8 con;                          // Control Register
+    REG_8 _pad0[3];
+    REG32 conp;                         // Peripherals Register
+    REG32 _pad1[14];
+    } p;
+
+  // VPB Divider Register
+  REG_8 vpbdiv;
+  REG32 _pad1[15];
+
+  // External Interrupt Registers
+  struct
+    {
+    REG_8 flag;                         // Flag Register
+    REG_8 _pad0[3];
+    REG_8 wake;                         // Wakeup Register
+    REG_8 _pad1[3];
+    REG_8 mode;                         // Mode Register
+    REG_8 _pad2[3];
+    REG_8 polar;                        // Polarity Register
+    REG32 _pad3[12];
+    } ext;
+} scbRegs_t;
+
+
+///////////////////////////////////////////////////////////////////////////////
+// MAM defines
+#define MAMCR_OFF     0
+#define MAMCR_PART    1
+#define MAMCR_FULL    2
+
+#define MAMTIM_CYCLES (((CCLK) + 19999999) / 20000000)
+
+///////////////////////////////////////////////////////////////////////////////
+// MEMMAP defines
+#define MEMMAP_BBLK   0                 // Interrupt Vectors in Boot Block
+#define MEMMAP_FLASH  1                 // Interrupt Vectors in Flash
+#define MEMMAP_SRAM   2                 // Interrupt Vectors in SRAM
+
+///////////////////////////////////////////////////////////////////////////////
+// PLL defines & computations
+// Compute the value of PLL_DIV and test range validity
+// FOSC & PLL_MUL should be defined in project configuration file (config.h)
+#ifndef CCLK
+#define CCLK          (FOSC * PLL_MUL)  // CPU Clock Freq.
+#endif
+
+#define FCCO_MAX      (320000000)       // Max CC Osc Freq.
+#define PLL_DIV       (FCCO_MAX / (2 * CCLK)) // PLL Divider
+#define FCCO          (FOSC * PLL_MUL * 2 * PLL_DIV) // CC Osc. Freq.
+
+// PLLCON Register Bit Definitions
+#define PLLCON_PLLE   (1 << 0)          // PLL Enable
+#define PLLCON_PLLC   (1 << 1)          // PLL Connect
+
+// PLLCFG Register Bit Definitions
+#define PLLCFG_MSEL   ((PLL_MUL - 1) << 0) // PLL Multiplier
+#define PLLCFG_PSEL   ((PLL_DIV - 1) << 5) // PLL Divider
+
+// PLLSTAT Register Bit Definitions
+#define PLLSTAT_LOCK  (1 << 10)         // PLL Lock Status Bit
+
+///////////////////////////////////////////////////////////////////////////////
+// VPBDIV defines & computations
+#define VPBDIV_VALUE  (PBSD & 0x03)     // VPBDIV value
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSPI.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcSPI.h
new file mode 100644 (file)
index 0000000..9e6bd2b
--- /dev/null
@@ -0,0 +1,72 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcSPI.h,v $
+ * $Revision: 1.2 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_SPI_H
+#define INC_LPC_SPI_H
+
+// Serial Peripheral Interface Registers (SPI)
+typedef struct
+{
+  REG_8 cr;                             // Control Register
+  REG_8 _pad0[3];
+  REG_8 sr;                             // Status Register
+  REG_8 _pad1[3];
+  REG_8 dr;                             // Data Register
+  REG_8 _pad2[3];
+  REG_8 ccr;                            // Clock Counter Register
+  REG_8 _pad3[3];
+  REG_8 tcr;                            // Test Control Register
+  REG_8 _pad4[3];
+  REG_8 tsr;                            // Test Status Register
+  REG_8 _pad5[3];
+  REG_8 tor;                            // Test Observe Register
+  REG_8 _pad6[3];
+  REG_8 flag;                           // Interrupt Flag Register
+  REG_8 _pad7[3];
+} spiRegs_t;
+
+
+// SPI Control Register
+#define SPCR_BE    (1 << 2)            // BitEnable : If set the SPI controller
+                                       // sends and receives the number of bits
+                                      // selected by bits 11:8.
+#define SPCR_CPHA  (1 << 3)            // Clock phase control
+#define SPCR_CPOL  (1 << 4)            // Clock polarity control.
+#define SPCR_MSTR  (1 << 5)            // Master mode select.
+#define SPCR_LSBF  (1 << 6)            // LSB First controls
+#define SPCR_SPIE  (1 << 7)            // Serial peripheral interrupt enable.
+#define SPCR_BITS  (0xF << 8)          // When bit 2 of this register is 1,
+                                       // this field controls the number of 
+                                      // bits per transfer
+                                      // 1000 :  8 bits per transfer
+                                      // 1001 :  9 bits per transfer
+                                      // 1010 : 10 bits per transfer
+                                      // 1011 : 11 bits per transfer
+                                      // 1100 : 12 bits per transfer
+                                      // 1101 : 13 bits per transfer
+                                      // 1110 : 14 bits per transfer
+                                      // 1111 : 15 bits per transfer
+                                      // 0000 : 16 bits per transfer
+
+//SPI Status Register
+#define SPSR_ABRT  (1 << 3)           // Slave abort.
+#define SPSR_MODF  (1 << 4)           // Mode fault.
+#define SPSR_ROVR  (1 << 5)           // Read overrun.
+#define SPSR_WCOL  (1 << 6)           // Write collision.
+#define SPSR_SPIF  (1 << 7)           // SPI transfer complete flag.
+
+//SPI Interrupt register
+#define SPINT_IF   (1 << 0)           // SPI interrupt flag.
+
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcTMR.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcTMR.h
new file mode 100644 (file)
index 0000000..cbc7bed
--- /dev/null
@@ -0,0 +1,108 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcTMR.h,v $
+ * $Revision: 1.2 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_TMR_H
+#define INC_LPC_TMR_H
+
+// Timer & PWM Registers
+typedef struct
+{
+  REG32 ir;                             // Interrupt Register
+  REG32 tcr;                            // Timer Control Register
+  REG32 tc;                             // Timer Counter
+  REG32 pr;                             // Prescale Register
+  REG32 pc;                             // Prescale Counter Register
+  REG32 mcr;                            // Match Control Register
+  REG32 mr0;                            // Match Register 0
+  REG32 mr1;                            // Match Register 1
+  REG32 mr2;                            // Match Register 2
+  REG32 mr3;                            // Match Register 3
+  REG32 ccr;                            // Capture Control Register
+  REG32 cr0;                            // Capture Register 0
+  REG32 cr1;                            // Capture Register 1
+  REG32 cr2;                            // Capture Register 2
+  REG32 cr3;                            // Capture Register 3
+  REG32 emr;                            // External Match Register
+  REG32 mr4;                            // Match Register 4
+  REG32 mr5;                            // Match Register 5
+  REG32 mr6;                            // Match Register 6
+  REG32 pcr;                            // Control Register
+  REG32 ler;                            // Latch Enable Register
+} pwmTmrRegs_t;
+
+// Timer Interrupt Register Bit Definitions
+#define TIR_MR0I    (1 << 0)            // Interrupt flag for match channel 0
+#define TIR_MR1I    (1 << 1)            // Interrupt flag for match channel 1
+#define TIR_MR2I    (1 << 2)            // Interrupt flag for match channel 2
+#define TIR_MR3I    (1 << 3)            // Interrupt flag for match channel 3
+#define TIR_CR0I    (1 << 4)            // Interrupt flag for capture channel 0 event
+#define TIR_CR1I    (1 << 5)            // Interrupt flag for capture channel 1 event
+#define TIR_CR2I    (1 << 6)            // Interrupt flag for capture channel 2 event
+#define TIR_CR3I    (1 << 7)            // Interrupt flag for capture channel 3 event
+
+// PWM Interrupt Register Bit Definitions
+#define PWMIR_MR0I  (1 << 0)            // Interrupt flag for match channel 0
+#define PWMIR_MR1I  (1 << 1)            // Interrupt flag for match channel 1
+#define PWMIR_MR2I  (1 << 2)            // Interrupt flag for match channel 2
+#define PWMIR_MR3I  (1 << 3)            // Interrupt flag for match channel 3
+#define PWMIR_MR4I  (1 << 8)            // Interrupt flag for match channel 4
+#define PWMIR_MR5I  (1 << 9)            // Interrupt flag for match channel 5
+#define PWMIR_MR6I  (1 << 10)           // Interrupt flag for match channel 6
+#define PWMIR_MASK  (0x070F)
+
+// Timer Control Register Bit Definitions
+#define TCR_ENABLE  (1 << 0)
+#define TCR_RESET   (1 << 1)
+
+// PWM Control Register Bit Definitions
+#define PWMCR_ENABLE (1 << 0)
+#define PWMCR_RESET (1 << 1)
+
+// PWM Latch Enable Register Bit Definitions
+#define PWMLER_PWML0E  (1<<0)
+#define PWMLER_PWML1E  (1<<1)
+#define PWMLER_PWML2E  (1<<2)
+#define PWMLER_PWML3E  (1<<3)
+#define PWMLER_PWML4E  (1<<4)
+#define PWMLER_PWML5E  (1<<5)
+#define PWMLER_PWML6E  (1<<6)
+
+// Timer Match Control Register Bit Definitions
+#define TMCR_MR0_I  (1 << 0)            // Enable Interrupt when MR0 matches TC
+#define TMCR_MR0_R  (1 << 1)            // Enable Reset of TC upon MR0 match
+#define TMCR_MR0_S  (1 << 2)            // Enable Stop of TC upon MR0 match
+#define TMCR_MR1_I  (1 << 3)            // Enable Interrupt when MR1 matches TC
+#define TMCR_MR1_R  (1 << 4)            // Enable Reset of TC upon MR1 match
+#define TMCR_MR1_S  (1 << 5)            // Enable Stop of TC upon MR1 match
+#define TMCR_MR2_I  (1 << 6)            // Enable Interrupt when MR2 matches TC
+#define TMCR_MR2_R  (1 << 7)            // Enable Reset of TC upon MR2 match
+#define TMCR_MR2_S  (1 << 8)            // Enable Stop of TC upon MR2 match
+#define TMCR_MR3_I  (1 << 9)            // Enable Interrupt when MR3 matches TC
+#define TMCR_MR3_R  (1 << 10)           // Enable Reset of TC upon MR3 match
+#define TMCR_MR3_S  (1 << 11)           // Enable Stop of TC upon MR3 match
+
+// Timer Capture Control Register Bit Definitions
+#define TCCR_CR0_R (1 << 0)            // Enable Rising edge on CAPn.0 will load TC to CR0
+#define TCCR_CR0_F (1 << 1)            // Enable Falling edge on CAPn.0 will load TC to CR0
+#define TCCR_CR0_I (1 << 2)            // Enable Interrupt on load of CR0
+#define TCCR_CR1_R (1 << 3)            // Enable Rising edge on CAPn.1 will load TC to CR1
+#define TCCR_CR1_F (1 << 4)            // Enable Falling edge on CAPn.1 will load TC to CR1
+#define TCCR_CR1_I (1 << 5)            // Enable Interrupt on load of CR1
+#define TCCR_CR2_R (1 << 6)            // Enable Rising edge on CAPn.2 will load TC to CR2
+#define TCCR_CR2_F (1 << 7)            // Enable Falling edge on CAPn.2 will load TC to CR2
+#define TCCR_CR2_I (1 << 8)            // Enable Interrupt on load of CR2
+#define TCCR_CR3_R (1 << 9)            // Enable Rising edge on CAPn.3 will load TC to CR3
+#define TCCR_CR3_F (1 << 10)           // Enable Falling edge on CAPn.3 will load TC to CR3
+#define TCCR_CR3_I (1 << 11)           // Enable Interrupt on load of CR3
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUART.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUART.h
new file mode 100644 (file)
index 0000000..74e257a
--- /dev/null
@@ -0,0 +1,122 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcUART.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_UART_H
+#define INC_LPC_UART_H
+
+// Universal Asynchronous Receiver Transmitter Registers
+typedef struct
+{
+  union
+    {
+    REG_8 rbr;                          // Receive Buffer Register
+    REG_8 thr;                          // Transmit Holding Register
+    REG_8 dll;                          // Divisor Latch Register (LSB)
+    REG_8 _pad0[4];
+    };
+
+  union
+    {
+    REG_8 ier;                          // Interrupt Enable Register
+    REG_8 dlm;                          // Divisor Latch Register (MSB)
+    REG_8 _pad1[4];
+    };
+
+  union
+    {
+    REG_8 iir;                          // Interrupt ID Register
+    REG_8 fcr;                          // FIFO Control Register
+    REG_8 _pad2[4];
+    };
+
+  REG_8 lcr;                            // Line Control Registe
+  REG_8 _pad3[3];
+  REG_8 mcr;                            // MODEM Control Register
+  REG_8 _pad4[3];
+  REG_8 lsr;                            // Line Status Register
+  REG_8 _pad5[3];
+  REG_8 msr;                            // MODEM Status Register
+  REG_8 _pad6[3];
+  REG_8 scr;                            // Scratch Pad Register
+  REG_8 _pad7[3];
+} uartRegs_t;
+
+///////////////////////////////////////////////////////////////////////////////
+// UART defines
+
+// Interrupt Enable Register bit definitions
+#define UIER_ERBFI          (1 << 0)    // Enable Receive Data Available Interrupt
+#define UIER_ETBEI          (1 << 1)    // Enable Transmit Holding Register Empty Interrupt
+#define UIER_ELSI           (1 << 2)    // Enable Receive Line Status Interrupt
+#define UIER_EDSSI          (1 << 3)    // Enable MODEM Status Interrupt
+
+// Interrupt ID Register bit definitions
+#define UIIR_NO_INT         (1 << 0)    // NO INTERRUPTS PENDING
+#define UIIR_MS_INT         (0 << 1)    // MODEM Status
+#define UIIR_THRE_INT       (1 << 1)    // Transmit Holding Register Empty
+#define UIIR_RDA_INT        (2 << 1)    // Receive Data Available
+#define UIIR_RLS_INT        (3 << 1)    // Receive Line Status
+#define UIIR_CTI_INT        (6 << 1)    // Character Timeout Indicator
+#define UIIR_ID_MASK        0x0E
+
+// FIFO Control Register bit definitions
+#define UFCR_FIFO_ENABLE    (1 << 0)    // FIFO Enable
+#define UFCR_RX_FIFO_RESET  (1 << 1)    // Reset Receive FIFO
+#define UFCR_TX_FIFO_RESET  (1 << 2)    // Reset Transmit FIFO
+#define UFCR_FIFO_TRIG1     (0 << 6)    // Trigger @ 1 character in FIFO
+#define UFCR_FIFO_TRIG4     (1 << 6)    // Trigger @ 4 characters in FIFO
+#define UFCR_FIFO_TRIG8     (2 << 6)    // Trigger @ 8 characters in FIFO
+#define UFCR_FIFO_TRIG14    (3 << 6)    // Trigger @ 14 characters in FIFO
+
+// Line Control Register bit definitions
+#define ULCR_CHAR_5         (0 << 0)    // 5-bit character length
+#define ULCR_CHAR_6         (1 << 0)    // 6-bit character length
+#define ULCR_CHAR_7         (2 << 0)    // 7-bit character length
+#define ULCR_CHAR_8         (3 << 0)    // 8-bit character length
+#define ULCR_STOP_1         (0 << 2)    // 1 stop bit
+#define ULCR_STOP_2         (1 << 2)    // 2 stop bits
+#define ULCR_PAR_NO         (0 << 3)    // No Parity
+#define ULCR_PAR_ODD        (1 << 3)    // Odd Parity
+#define ULCR_PAR_EVEN       (3 << 3)    // Even Parity
+#define ULCR_PAR_MARK       (5 << 3)    // MARK "1" Parity
+#define ULCR_PAR_SPACE      (7 << 3)    // SPACE "0" Paruty
+#define ULCR_BREAK_ENABLE   (1 << 6)    // Output BREAK line condition
+#define ULCR_DLAB_ENABLE    (1 << 7)    // Enable Divisor Latch Access
+
+// Modem Control Register bit definitions
+#define UMCR_DTR            (1 << 0)    // Data Terminal Ready
+#define UMCR_RTS            (1 << 1)    // Request To Send
+#define UMCR_LB             (1 << 4)    // Loopback
+
+// Line Status Register bit definitions
+#define ULSR_RDR            (1 << 0)    // Receive Data Ready
+#define ULSR_OE             (1 << 1)    // Overrun Error
+#define ULSR_PE             (1 << 2)    // Parity Error
+#define ULSR_FE             (1 << 3)    // Framing Error
+#define ULSR_BI             (1 << 4)    // Break Interrupt
+#define ULSR_THRE           (1 << 5)    // Transmit Holding Register Empty
+#define ULSR_TEMT           (1 << 6)    // Transmitter Empty
+#define ULSR_RXFE           (1 << 7)    // Error in Receive FIFO
+#define ULSR_ERR_MASK       0x1E
+
+// Modem Status Register bit definitions
+#define UMSR_DCTS           (1 << 0)    // Delta Clear To Send
+#define UMSR_DDSR           (1 << 1)    // Delta Data Set Ready
+#define UMSR_TERI           (1 << 2)    // Trailing Edge Ring Indicator
+#define UMSR_DDCD           (1 << 3)    // Delta Data Carrier Detect
+#define UMSR_CTS            (1 << 4)    // Clear To Send
+#define UMSR_DSR            (1 << 5)    // Data Set Ready
+#define UMSR_RI             (1 << 6)    // Ring Indicator
+#define UMSR_DCD            (1 << 7)    // Data Carrier Detect
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUSB.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcUSB.h
new file mode 100644 (file)
index 0000000..3f924b5
--- /dev/null
@@ -0,0 +1,229 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcUSB.h,v $
+ * $Revision: 1.3 $
+ *
+ * Header file for Philips LPC214x USB enabled ARM Processors 
+ * Copyright 2006 Pavel Pisa <pisa@cmp.felk.cvut.cz>
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact or GPL license is applied.
+ *
+ *****************************************************************************/
+
+/* USBIntSt - USB Interrupt Status (R/W) */
+#define   USB_INT_REQ_LP       (1<<0) /*Low priority interrupt line status (RO) */
+#define   USB_INT_REQ_HP       (1<<1) /*High priority interrupt line status. (RO) */
+#define   USB_INT_REQ_DMA      (1<<2) /*DMA interrupt line status. This bit is read only. (LPC2146/8 only) 0*/
+#define   USB_need_clock       (1<<8) /*USB need clock indicator*/
+#define   USB_EN_USB_INTS      (1<<31) /*Enable all USB interrupts*/
+
+/* Device interrupt registers */
+#define USBDevIntSt_o  0x0000  /* USB Device Interrupt Status (RO) */
+#define USBDevIntEn_o  0x0004  /* USB Device Interrupt Enable (R/W) */
+#define USBDevIntClr_o 0x0008  /* USB Device Interrupt Clear (WO) */
+#define USBDevIntSet_o 0x000C  /* USB Device Interrupt Set (WO) */
+#define   USBDevInt_FRAME      (1<<0) /*Frame interrupt @1kHz for ISO transfers*/
+#define   USBDevInt_EP_FAST    (1<<1) /*Fast interrupt transfer for the endpoint*/
+#define   USBDevInt_EP_SLOW    (1<<2) /*Slow interrupt transfer for the endpoint*/
+#define   USBDevInt_DEV_STAT   (1<<3) /*USB Bus reset, USB suspend change or Connect occured*/
+#define   USBDevInt_CCEMTY     (1<<4) /*Command code register is empty/ready for CMD*/
+#define   USBDevInt_CDFULL     (1<<5) /*Command data register is full/data available*/
+#define   USBDevInt_RxENDPKT   (1<<6) /*Current packet in the FIFO is transferred to the CPU*/
+#define   USBDevInt_TxENDPKT   (1<<7) /*TxPacket bytes written to FIFO*/
+#define   USBDevInt_EP_RLZED   (1<<8) /*Endpoints realized after Maxpacket size update*/
+#define   USBDevInt_ERR_INT    (1<<9) /*Error Interrupt - Use Read Error Status Command 0xFB*/
+
+#define USBDevIntPri_o 0x002C  /* USB Device Interrupt Priority (WO) */
+#define   USBDevIntPri_FRAME   (1<<0) /*0/1 FRAME int routed to the low/high priority interrupt line*/
+#define   USBDevIntPri_EP_FAST (1<<1) /*0/1 EP_FAST int routed to the low/high priority line*/
+
+/* Endpoint interrupt registers - bits corresponds to  EP0 to EP31 */
+#define USBEpIntSt_o   0x0030  /* USB Endpoint Interrupt Status (RO) */
+#define USBEpIntEn_o   0x0034  /* USB Endpoint Interrupt Enable (R/W) */
+#define USBEpIntClr_o  0x0038  /* USB Endpoint Interrupt Clear (WO) */
+#define USBEpIntSet_o  0x003C  /* USB Endpoint Interrupt Set (WO) */
+#define USBEpIntPri_o  0x0040  /* USB Endpoint Priority (WO) */
+/* Endpoint realization registers */
+#define USBReEp_o      0x0044  /* USB Realize Endpoint (R/W) */
+#define USBEpInd_o     0x0048  /* USB Endpoint Index (WO) */
+#define   USBEpInd_Ind         0x001F  /* Index for subsequent USBMaxPSize (WO) */
+#define USBMaxPSize_o  0x004C  /* USB MaxPacketSize (R/W) */
+#define   USBMaxPSize_Size     0x03FF  /* The maximum packet size value */
+/* USB transfer registers */
+#define USBRxData_o    0x0018  /* USB Receive Data (RO) */
+#define USBRxPLen_o    0x0020  /* USB Receive Packet Length (RO) */
+#define   USBRxPLen_PKT_LNGTH  (0x03FF) /*Remaining amount of bytes to be read from RAM*/
+#define   USBRxPLen_DV         (1<<10) /*Data valid. 0 only for error ISO packet*/
+#define   USBRxPLen_PKT_RDY    (1<<11) /*Packet length valid and packet is ready for reading*/
+#define USBTxData_o    0x001C  /* USB Transmit Data (WO) */
+#define USBTxPLen_o    0x0024  /* USB Transmit Packet Length (WO) */
+#define   USBTxPLen_PKT_LNGTH  (0x03FF) /*Remaining amount of bytes to be written to the EP_RAM*/
+#define USBCtrl_o      0x0028  /* USB Control (R/W) */
+#define   USBCtrl_RD_EN                (1<<0) /*Read mode control*/
+#define   USBCtrl_WR_EN                (1<<1) /*Write mode control*/
+#define   USBCtrl_LOG_ENDPOINT 0x003C /*Logical Endpoint number*/
+/* Command registers */
+#define USBCmdCode_o   0x0010  /* USB Command Code (WO) */
+#define   USBCmdCode_CMD_PHASE 0x0000FF00 /*The command phase*/
+#define   USBCmdCode_CMD_CODE  0x00FF0000 /*The code for the command*/
+#define USBCmdData_o   0x0014  /* USB Command Data (RO) */
+/* DMA registers (LPC2146/8 only) */
+#define USBDMARSt_o    0x0050  /* USB DMA Request Status (RO) */
+#define USBDMARClr_o   0x0054  /* USB DMA Request Clear (WO) */
+#define USBDMARSet_o   0x0058  /* USB DMA Request Set (WO) */
+#define USBUDCAH_o     0x0080  /* USB UDCA Head (R/W) has to be aligned to 128 bytes */
+#define USBEpDMASt_o   0x0084  /* USB Endpoint DMA Status (RO) */
+#define USBEpDMAEn_o   0x0088  /* USB Endpoint DMA Enable (WO) */
+#define USBEpDMADis_o  0x008C  /* USB Endpoint DMA Disable (WO) */
+#define USBDMAIntSt_o  0x0090  /* USB DMA Interrupt Status (RO) */
+#define USBDMAIntEn_o  0x0094  /* USB DMA Interrupt Enable (R/W) */
+#define   USBDMAInt_EoT                (1<<0) /*End of Transfer Interrupt bit, 1 if USBEoTIntSt != 0*/
+#define   USBDMAInt_New_DD_Rq  (1<<1) /*  New DD Request Interrupt bit, 1 if USBNDDRIntSt != 0*/
+#define   USBDMAInt_SysError   (1<<2) /*System Error Interrupt bit, 1 if USBSysErrIntSt != 0*/
+#define USBEoTIntSt_o  0x00A0  /* USB End of Transfer Interrupt Status (RO) */
+#define USBEoTIntClr_o 0x00A4  /* USB End of Transfer Interrupt Clear (WO) */
+#define USBEoTIntSet_o 0x00A8  /* USB End of Transfer Interrupt Set (WO) */
+#define USBNDDRIntSt_o 0x00AC  /* USB New DD Request Interrupt Status (RO) */
+#define USBNDDRIntClr_o        0x00B0  /* USB New DD Request Interrupt Clear (WO) */
+#define USBNDDRIntSet_o        0x00B4  /* USB New DD Request Interrupt Set (WO) */
+#define USBSysErrIntSt_o       0x00B8  /* USB System Error Interrupt Status (RO) */
+#define USBSysErrIntClr_o      0x00BC  /* USB System Error Interrupt Clear (WO) */
+#define USBSysErrIntSet_o      0x00C0  /* USB System Error Interrupt Set (WO) */
+#define USB_MODULE_ID_o                0x00FC  /* USB Module ID */
+
+/* Command Codes */
+#define USB_CMD_SET_ADDR        0x00D00500
+#define USB_CMD_CFG_DEV         0x00D80500
+#define USB_CMD_SET_MODE        0x00F30500
+#define USB_CMD_RD_FRAME        0x00F50500
+#define USB_DAT_RD_FRAME        0x00F50200
+#define USB_CMD_RD_TEST         0x00FD0500
+#define USB_DAT_RD_TEST         0x00FD0200
+#define USB_CMD_SET_DEV_STAT    0x00FE0500
+#define USB_CMD_GET_DEV_STAT    0x00FE0500
+#define USB_DAT_GET_DEV_STAT    0x00FE0200
+#define USB_CMD_GET_ERR_CODE    0x00FF0500
+#define USB_DAT_GET_ERR_CODE    0x00FF0200
+#define USB_CMD_RD_ERR_STAT     0x00FB0500
+#define USB_DAT_RD_ERR_STAT     0x00FB0200
+#define USB_DAT_WR_BYTE(x)     (0x00000100 | ((x) << 16))
+#define USB_CMD_SEL_EP(x)      (0x00000500 | ((x) << 16))
+#define USB_DAT_SEL_EP(x)      (0x00000200 | ((x) << 16))
+#define USB_CMD_SEL_EP_CLRI(x) (0x00400500 | ((x) << 16))
+#define USB_DAT_SEL_EP_CLRI(x) (0x00400200 | ((x) << 16))
+#define USB_CMD_SET_EP_STAT(x) (0x00400500 | ((x) << 16))
+#define USB_CMD_CLR_BUF         0x00F20500
+#define USB_DAT_CLR_BUF         0x00F20200
+#define USB_CMD_VALID_BUF       0x00FA0500
+
+/* Device Address Register Definitions */
+#define USBC_DEV_ADDR_MASK       0x7F
+#define USBC_DEV_EN              0x80
+
+/* Device Configure Register Definitions */
+#define USBC_CONF_DEVICE         0x01
+
+/* Device Mode Register Definitions */
+#define USBC_AP_CLK              0x01
+#define USBC_INAK_CI             0x02
+#define USBC_INAK_CO             0x04
+#define USBC_INAK_II             0x08
+#define USBC_INAK_IO             0x10
+#define USBC_INAK_BI             0x20
+#define USBC_INAK_BO             0x40
+
+/* Device Status Register Definitions */
+#define USBC_DEV_CON             0x01
+#define USBC_DEV_CON_CH          0x02
+#define USBC_DEV_SUS             0x04
+#define USBC_DEV_SUS_CH          0x08
+#define USBC_DEV_RST             0x10
+
+/* Error Code Register Definitions */
+#define USBC_ERR_EC_MASK         0x0F
+#define USBC_ERR_EA              0x10
+
+/* Error Status Register Definitions */
+#define USBC_ERR_PID             0x01
+#define USBC_ERR_UEPKT           0x02
+#define USBC_ERR_DCRC            0x04
+#define USBC_ERR_TIMOUT          0x08
+#define USBC_ERR_EOP             0x10
+#define USBC_ERR_B_OVRN          0x20
+#define USBC_ERR_BTSTF           0x40
+#define USBC_ERR_TGL             0x80
+
+/* Endpoint Select Register Definitions */
+#define USBC_EP_SEL_F            0x01
+#define USBC_EP_SEL_ST           0x02
+#define USBC_EP_SEL_STP          0x04
+#define USBC_EP_SEL_PO           0x08
+#define USBC_EP_SEL_EPN          0x10
+#define USBC_EP_SEL_B_1_FULL     0x20
+#define USBC_EP_SEL_B_2_FULL     0x40
+
+/* Endpoint Status Register Definitions */
+#define USBC_EP_STAT_ST          0x01
+#define USBC_EP_STAT_DA          0x20
+#define USBC_EP_STAT_RF_MO       0x40
+#define USBC_EP_STAT_CND_ST      0x80
+
+/* Clear Buffer Register Definitions */
+#define USBC_CLR_BUF_PO          0x01
+
+typedef struct
+{
+/* Device interrupt registers */
+  REG32 DevIntSt;      /* USB Device Interrupt Status (RO) 0000 */
+  REG32 DevIntEn;      /* USB Device Interrupt Enable (R/W) 0004 */
+  REG32 DevIntClr;     /* USB Device Interrupt Clear (WO) 0008 */
+  REG32 DevIntSet;     /* USB Device Interrupt Set (WO) 000C */
+/* Command registers */
+  REG32 CmdCode;       /* USB Command Code (WO) 0010 */
+  REG32 CmdData;       /* USB Command Data (RO) 0014 */
+/* USB transfer registers */
+  REG32 RxData;                /* USB Receive Data (RO) 0018 */
+  REG32 TxData;                /* USB Transmit Data (WO) 001C */
+  REG32 RxPLen;                /* USB Receive Packet Length (RO) 0020 */
+  REG32 TxPLen;                /* USB Transmit Packet Length (WO) 0024 */
+  REG32 Ctrl;          /* USB Control (R/W) 0028 */
+/* Device interrupt priority register */
+  REG_8  USBDevIntPri; /* USB Device Interrupt Priority (WO) 002C */
+  REG_8  _pad0[3];
+/* Endpoint interrupt registers */
+  REG32 EpIntSt;       /* USB Endpoint Interrupt Status (RO) 0030 */
+  REG32 EpIntEn;       /* USB Endpoint Interrupt Enable (R/W) 0034 */
+  REG32 EpIntClr;      /* USB Endpoint Interrupt Clear (WO) 0038 */
+  REG32 EpIntSet;      /* USB Endpoint Interrupt Set (WO) 003C */
+  REG32 EpIntPri;      /* USB Endpoint Priority (WO) 0040 */
+/* Endpoint realization registers */
+  REG32 ReEp;          /* USB Realize Endpoint (R/W) 0044 */
+  REG32 EpInd;         /* USB Endpoint Index (WO) 0048 */
+  REG32 MaxPSize;      /* USB MaxPacketSize (R/W) 004C */
+/* DMA registers (LPC2146/8 only) */
+  REG32 DMARSt;                /* USB DMA Request Status (RO) 0050 */
+  REG32 DMARClr;       /* USB DMA Request Clear (WO) 0054 */
+  REG32 DMARSet;       /* USB DMA Request Set (WO) 0058 */
+  REG32 _pad1[9];
+  REG32 UDCAH;         /* USB UDCA Head (R/W) 0080 */
+  REG32 EpDMASt;       /* USB Endpoint DMA Status (RO) 0084 */
+  REG32 EpDMAEn;       /* USB Endpoint DMA Enable (WO) 0088 */
+  REG32 EpDMADis;      /* USB Endpoint DMA Disable (WO) 008C */
+  REG32 DMAIntSt;      /* USB DMA Interrupt Status (RO) 0090 */
+  REG32 DMAIntEn;      /* USB DMA Interrupt Enable (R/W) 0094 */
+  REG32 _pad2[2];
+  REG32 EoTIntSt;      /* USB End of Transfer Interrupt Status (RO) 00A0 */
+  REG32 EoTIntClr;     /* USB End of Transfer Interrupt Clear (WO) 00A4 */
+  REG32 EoTIntSet;     /* USB End of Transfer Interrupt Set (WO) 00A8 */
+  REG32 NDDRIntSt;     /* USB New DD Request Interrupt Status (RO) 00AC */
+  REG32 NDDRIntClr;    /* USB New DD Request Interrupt Clear (WO) 00B0 */
+  REG32 NDDRIntSet;    /* USB New DD Request Interrupt Set (WO) 00B4 */
+  REG32 SysErrIntSt;   /* USB System Error Interrupt Status (RO) 00B8 */
+  REG32 SysErrIntClr;  /* USB System Error Interrupt Clear (WO) 00BC */
+  REG32 SysErrIntSet;  /* USB System Error Interrupt Set (WO) 00C0 */
+  REG32 _pad3[0xE];
+  REG32 MODULE_ID;     /* Module ID (RO) 00FC */
+} usbRegs_t;
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcVIC.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcVIC.h
new file mode 100644 (file)
index 0000000..28d12a6
--- /dev/null
@@ -0,0 +1,95 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcVIC.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_VIC_H
+#define INC_LPC_VIC_H
+
+// Vectored Interrupt Controller Registers (VIC)
+typedef struct
+{
+  REG32 irqStatus;                      // IRQ Status Register
+  REG32 fiqStatus;                      // FIQ Status Register
+  REG32 rawIntr;                        // Raw Interrupt Status Register
+  REG32 intSelect;                      // Interrupt Select Register
+  REG32 intEnable;                      // Interrupt Enable Register
+  REG32 intEnClear;                     // Interrupt Enable Clear Register
+  REG32 softInt;                        // Software Interrupt Register
+  REG32 softIntClear;                   // Software Interrupt Clear Register
+  REG32 protection;                     // Protection Enable Register
+  REG32 _pad0[3];
+  REG32 vectAddr;                       // Vector Address Register
+  REG32 defVectAddr;                    // Default Vector Address Register
+  REG32 _pad1[50];
+  REG32 vectAddr0;                      // Vector Address 0 Register
+  REG32 vectAddr1;                      // Vector Address 1 Register
+  REG32 vectAddr2;                      // Vector Address 2 Register
+  REG32 vectAddr3;                      // Vector Address 3 Register
+  REG32 vectAddr4;                      // Vector Address 4 Register
+  REG32 vectAddr5;                      // Vector Address 5 Register
+  REG32 vectAddr6;                      // Vector Address 6 Register
+  REG32 vectAddr7;                      // Vector Address 7 Register
+  REG32 vectAddr8;                      // Vector Address 8 Register
+  REG32 vectAddr9;                      // Vector Address 9 Register
+  REG32 vectAddr10;                     // Vector Address 10 Register
+  REG32 vectAddr11;                     // Vector Address 11 Register
+  REG32 vectAddr12;                     // Vector Address 12 Register
+  REG32 vectAddr13;                     // Vector Address 13 Register
+  REG32 vectAddr14;                     // Vector Address 14 Register
+  REG32 vectAddr15;                     // Vector Address 15 Register
+  REG32 _pad2[48];
+  REG32 vectCntl0;                      // Vector Control 0 Register
+  REG32 vectCntl1;                      // Vector Control 1 Register
+  REG32 vectCntl2;                      // Vector Control 2 Register
+  REG32 vectCntl3;                      // Vector Control 3 Register
+  REG32 vectCntl4;                      // Vector Control 4 Register
+  REG32 vectCntl5;                      // Vector Control 5 Register
+  REG32 vectCntl6;                      // Vector Control 6 Register
+  REG32 vectCntl7;                      // Vector Control 7 Register
+  REG32 vectCntl8;                      // Vector Control 8 Register
+  REG32 vectCntl9;                      // Vector Control 9 Register
+  REG32 vectCntl10;                     // Vector Control 10 Register
+  REG32 vectCntl11;                     // Vector Control 11 Register
+  REG32 vectCntl12;                     // Vector Control 12 Register
+  REG32 vectCntl13;                     // Vector Control 13 Register
+  REG32 vectCntl14;                     // Vector Control 14 Register
+  REG32 vectCntl15;                     // Vector Control 15 Register
+} vicRegs_t;
+
+// VIC Channel Assignments
+#define VIC_WDT         0
+#define VIC_TIMER0      4
+#define VIC_TIMER1      5
+#define VIC_UART0       6
+#define VIC_UART1       7
+#define VIC_PWM         8
+#define VIC_PWM0        8
+#define VIC_I2C         9
+#define VIC_SPI         10
+#define VIC_SPI0        10
+#define VIC_SPI1        11
+#define VIC_PLL         12
+#define VIC_RTC         13
+#define VIC_EINT0       14
+#define VIC_EINT1       15
+#define VIC_EINT2       16
+#define VIC_EINT3       17
+#define VIC_ADC         18
+
+// Vector Control Register bit definitions
+#define VIC_ENABLE      (1 << 5)
+
+// Convert Channel Number to Bit Value
+#define VIC_BIT(chan)   (1 << (chan))
+
+#endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcWD.h b/ulan/embedded/arch/arm/mach-lpc21xx/defines/lpcWD.h
new file mode 100644 (file)
index 0000000..65f1d73
--- /dev/null
@@ -0,0 +1,27 @@
+/******************************************************************************
+ *
+ * $RCSfile: lpcWD.h,v $
+ * $Revision: 1.1 $
+ *
+ * Header file for Philips LPC ARM Processors.
+ * Copyright 2004 R O SoftWare
+ *
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ *****************************************************************************/
+#ifndef INC_LPC_WD_H
+#define INC_LPC_WD_H
+
+// Watchdog Registers
+typedef struct
+{
+  REG_8 mod;                            // Watchdog Mode Register
+  REG_8 _pad0[3];
+  REG32 tc;                             // Watchdog Time Constant Register
+  REG_8 feed;                           // Watchdog Feed Register
+  REG32 tv;                             // Watchdog Time Value Register
+} wdRegs_t;
+
+#endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Entries b/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..c94039e
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Thu Jul 20 12:40:57 2006//
+/Makefile.omk/1.3/Sun Oct 29 21:14:12 2006//
+D/hal////
+D/iap////
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Repository b/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..6788790
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/mach-lpc21xx/libs
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Root b/ulan/embedded/arch/arm/mach-lpc21xx/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile b/ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile.omk b/ulan/embedded/arch/arm/mach-lpc21xx/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..778cdc0
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = hal iap 
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Entries b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Entries
new file mode 100644 (file)
index 0000000..47e3620
--- /dev/null
@@ -0,0 +1,9 @@
+/Makefile/1.1/Sun Oct 29 21:14:12 2006//
+/Makefile.omk/1.1/Sun Oct 29 21:14:12 2006//
+/hal.c/1.1/Sun Oct 29 21:14:13 2006//
+/hal_ints.h/1.2/Sat Sep 15 21:26:28 2007//
+/hal_machperiph.c/1.1/Sun Oct 29 21:14:13 2006//
+/hal_machperiph.h/1.1/Sun Oct 29 21:14:13 2006//
+/ivt.S/1.1/Sun Oct 29 21:14:13 2006//
+/startup.S/1.2/Thu Jan 18 00:12:08 2007//
+D
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Repository b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Repository
new file mode 100644 (file)
index 0000000..e31b0c4
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/mach-lpc21xx/libs/hal
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Root b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile.omk b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/Makefile.omk
new file mode 100644 (file)
index 0000000..a7917db
--- /dev/null
@@ -0,0 +1,12 @@
+# -*- makefile -*-
+
+lib_obj_SOURCES = startup.S ivt.S
+
+lib_LIBRARIES = mach_hal 
+
+include_HEADERS = hal_ints.h hal_machperiph.h
+
+mach_hal_SOURCES = hal.c hal_machperiph.c
+
+
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal.c b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal.c
new file mode 100644 (file)
index 0000000..a983e95
--- /dev/null
@@ -0,0 +1,189 @@
+#include <system_def.h>
+#include <hal_ints.h>
+#include <hal_intr.h>
+#include <types.h>
+// -------------------------------------------------------------------------
+// Hardware init
+
+// Return value of VPBDIV register. According to errata doc
+// we need to read twice consecutively to get correct value
+uint32_t lpc_get_vpbdiv(void)
+{   
+    uint32_t vpbdiv_reg;
+
+    vpbdiv_reg=VPBDIV;
+    vpbdiv_reg=VPBDIV;
+
+    return (vpbdiv_reg);
+}
+
+
+// -------------------------------------------------------------------------
+// This routine is called to respond to a hardware interrupt (IRQ).  It
+// should interrogate the hardware and return the IRQ vector number.
+int hal_IRQ_handler(void)
+{
+    uint32_t irq_num, irq_stat;
+
+    irq_stat=VICIRQStatus;
+    for (irq_num = 0; irq_num < 32; irq_num++)
+      if (irq_stat & (1 << irq_num))
+        break;
+    
+    // If not a valid interrrupt source, treat as spurious interrupt    
+    if (irq_num < HAL_ISR_MIN || irq_num > HAL_ISR_MAX)
+      irq_num = HAL_INTERRUPT_NONE;
+    
+    return (irq_num);
+}
+
+
+// -------------------------------------------------------------------------
+// Interrupt control
+//
+
+// Block the the interrupt associated with the vector
+void hal_interrupt_mask(int vector)
+{
+    VICIntEnClear = 1 << vector;
+}
+
+// Unblock the the interrupt associated with the vector
+void hal_interrupt_unmask(int vector)
+{
+    VICIntEnable = 1 << vector;
+}
+
+// Acknowledge the the interrupt associated with the vector. This
+// clears the interrupt but may result in another interrupt being
+// delivered
+void hal_interrupt_acknowledge(int vector)
+{
+
+    // External interrupts have to be cleared from the EXTINT register
+    if (vector >= HAL_INTERRUPT_EINT0 &&
+        vector <= HAL_INTERRUPT_EINT3)
+      {
+        // Map int vector to corresponding bit (0..3)
+        vector = 1 << (vector - HAL_INTERRUPT_EINT0);
+               
+        // Clear the external interrupt
+       EXTINT=vector;
+      }
+    
+    // Acknowledge interrupt in the VIC
+    VICVectAddr=0;
+}
+
+// This provides control over how an interrupt signal is detected.
+// Options are between level or edge sensitive (level) and high/low
+// level or rising/falling edge triggered (up).
+//
+// This should be simple, but unfortunately on some processor revisions,
+// it trips up on two errata issues (for the LPC2294 Rev.A these are
+// EXTINT.1 and VPBDIV.1) and so on these devices a somewhat convoluted
+// sequence in order to work properly. There is nothing in the errata
+// sequence that won't work on a processor without these issues.
+void hal_interrupt_configure(int vector, int level, int up)
+{
+    uint32_t regval;
+#ifdef HAL_ARM_LPC2XXX_EXTINT_ERRATA
+    uint32_t saved_vpbdiv;
+#endif
+
+    // Map int vector to corresponding bit (0..3)
+    vector = 1 << (vector - HAL_INTERRUPT_EINT0);
+    
+#ifdef HAL_ARM_LPC2XXX_EXTINT_ERRATA
+    // From discussions with the Philips applications engineers on the
+    // Yahoo LPC2000 forum, it appears that in order up change both
+    // EXTMODE and EXTPOLAR, the operations have to be performed in
+    // two passes as follows:
+    // old=VPBDIV (x2),
+    //     VPBDIV=0, EXTMODE=n, VPBDIV=n, VPBDIV=0, EXTPOLAR=y, VPBDIV=y
+    // VPCDIV=old
+    
+    // Save current VPBDIV register settings
+    saved_vpbdiv = lpc_get_vpbdiv();
+    
+    // Clear VPBDIV register
+    VPBDIV=0;
+    
+    // Read current mode and update for level (0) or edge detection (1)
+    regval=EXTMODE;
+    if (level)
+      regval &= ~vector;
+    else
+      regval |= vector;
+    EXTMODE=regval;
+    
+    // Set VPBDIV register to same value as mode
+    VPBDIV=regval;
+    
+    // Clear VPBDIV register
+    VPBDIV=0;
+    
+    // Read current polarity and update for trigger level or edge
+    // level: high (1), low (0) edge: rising (1), falling (0)
+    regval=EXTPOLAR;
+    if (up)
+      regval |= vector;
+    else
+      regval &= ~vector;
+    EXTPOLAR=regval;
+      
+    
+    // Set VPBDIV register to same value as mode
+    VPBDIV=regval;
+    
+    // Restore saved VPBDIV register
+    VPBDIV=saved_vpbdiv;
+#else
+    // Read current mode and update for level (0) or edge detection (1)
+    regval=EXTMODE;
+    if (level)
+      regval &= ~vector;
+    else
+      regval |= vector;
+    EXTMODE=regval;
+    
+    // Read current polarity and update for trigger level or edge
+    // level: high (1), low (0) edge: rising (1), falling (0)
+    regval=EXTPOLAR;
+    if (up)
+      regval |= vector;
+    else
+      regval &= ~vector;
+    EXTPOLAR=regval;
+#endif
+    // Clear any spurious interrupt that might have been generated
+    EXTINT=vector;
+}
+
+// Change interrupt level. This is a non-operation on the LPC2XXX
+void hal_interrupt_set_level(int vector, int level)
+{
+}
+
+uint32_t hal_default_isr(int vector, uint32_t data)
+{
+  return 0;
+}
+
+uint32_t hal_interrupt_handlers[HAL_ISR_COUNT]={[0 ... HAL_ISR_COUNT-1]=(uint32_t)hal_default_isr};
+uint32_t hal_interrupt_data[HAL_ISR_COUNT];
+
+void irq_handler_resolver(void) __attribute__ ((interrupt));
+void irq_handler_resolver(void)
+{
+  int v;
+  uint32_t f,d;
+
+  v=hal_IRQ_handler();
+  if (v==HAL_INTERRUPT_NONE) return;
+  f=hal_interrupt_handlers[v];
+  d=hal_interrupt_data[v];
+  ((hal_isr)f)(v,d);  
+  hal_interrupt_acknowledge(v);
+}
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_ints.h b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_ints.h
new file mode 100644 (file)
index 0000000..d218725
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef HAL_INTS_H
+#define HAL_INTS_H
+
+#define HAL_INTERRUPT_NONE    -1
+
+#define HAL_INTERRUPT_WD      0
+#define HAL_INTERRUPT_SOFT    1
+#define HAL_INTERRUPT_DCC_RX  2
+#define HAL_INTERRUPT_DCC_TX  3
+#define HAL_INTERRUPT_TIMER0  4
+#define HAL_INTERRUPT_TIMER1  5
+#define HAL_INTERRUPT_UART0   6
+#define HAL_INTERRUPT_UART1   7
+#define HAL_INTERRUPT_PWM0    8
+#define HAL_INTERRUPT_I2C0    9
+#define HAL_INTERRUPT_SPI0    10
+#define HAL_INTERRUPT_SPI1    11
+#define HAL_INTERRUPT_PLL     12
+#define HAL_INTERRUPT_RTCDEV  13       
+#define HAL_INTERRUPT_EINT0   14
+#define HAL_INTERRUPT_EINT1   15
+#define HAL_INTERRUPT_EINT2   16
+#define HAL_INTERRUPT_EINT3   17
+#define HAL_INTERRUPT_AD      18 
+#define HAL_INTERRUPT_I2C1    19
+
+#define HAL_ISR_MIN           0
+#define HAL_ISR_MAX           (31)
+
+#define HAL_ISR_COUNT         (HAL_ISR_MAX+1)
+
+//The vector used by the Real time clock
+#define HAL_INTERRUPT_RTC     HAL_INTERRUPT_TIMER0
+
+#endif /* HAL_INTS_H */
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.c b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.c
new file mode 100644 (file)
index 0000000..599fdc3
--- /dev/null
@@ -0,0 +1,49 @@
+#include <system_def.h>
+#include <cpu_def.h>
+#include <hal_machperiph.h>
+
+void lpc_pll_on()
+{
+  // set PLL multiplier & divisor.
+  // values computed from config.h
+  PLLCFG = PLLCFG_MSEL | PLLCFG_PSEL;
+
+  // enable PLL
+  PLLCON = PLLCON_PLLE;
+  PLLFEED = 0xAA;                       // Make it happen.  These two updates
+  PLLFEED = 0x55;                       // MUST occur in sequence.
+
+  // wait for PLL lock
+  while (!(PLLSTAT & PLLSTAT_LOCK))
+    continue;
+
+  // enable & connect PLL
+  PLLCON = PLLCON_PLLE | PLLCON_PLLC;
+  PLLFEED = 0xAA;                       // Make it happen.  These two updates
+  PLLFEED = 0x55;                       // MUST occur in sequence.
+}
+
+void lpc_pll_off()
+{
+  // disable PLL
+  PLLCON = 0;
+  PLLFEED = 0xAA;                       // Make it happen.  These two updates
+  PLLFEED = 0x55;                       // MUST occur in sequence.
+}
+
+void lpc_watchdog_feed()
+{
+  unsigned long flags;
+
+  save_and_cli(flags);
+  WDFEED = 0xAA;
+  WDFEED = 0x55;
+  restore_flags(flags);
+}
+
+void lpc_watchdog_init(int on,int timeout_ms)
+{
+  if (!on) return;
+  WDTC = PCLK/(1000/timeout_ms);
+  WDMOD = 0x03;                                   /* Enable watchdog timer and reset */
+}
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.h b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/hal_machperiph.h
new file mode 100644 (file)
index 0000000..9f8c27f
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _HAL_MACHPERIPH_H
+#define _HAL_MACHPERIPH_H
+
+void lpc_pll_on();
+void lpc_pll_off();
+void lpc_watchdog_init(int on,int timeout_ms);
+void lpc_watchdog_feed();
+
+#endif /* _HAL_MACHPERIPH_H */
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/ivt.S b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/ivt.S
new file mode 100644 (file)
index 0000000..ae9032a
--- /dev/null
@@ -0,0 +1,34 @@
+/* Setup vector table.  Note that undf, pabt, dabt, fiq just execute
+a null loop. */
+
+.section .ivt,"ax"
+         .code 32
+         .align 0
+
+         .global hal_vectors
+
+hal_vectors:    LDR     PC, Reset_Addr         
+                LDR     PC, Undef_Addr
+                LDR     PC, SWI_Addr
+                LDR     PC, PAbt_Addr
+                LDR     PC, DAbt_Addr
+                NOP                            /* Reserved Vector */
+                LDR     PC, IRQ_Addr
+                LDR     PC, FIQ_Addr
+
+Reset_Addr:     .word   reset_handler
+Undef_Addr:     .word   Undef_Handler
+SWI_Addr:       .word   SWI_Handler
+PAbt_Addr:      .word   PAbt_Handler
+DAbt_Addr:      .word   DAbt_Handler
+                .word   0                      /* Reserved Address */
+IRQ_Addr:       .word   irq_handler_resolver
+FIQ_Addr:       .word   FIQ_Handler
+
+Undef_Handler:  B       Undef_Handler
+SWI_Handler:    B       SWI_Handler
+PAbt_Handler:   B       PAbt_Handler
+DAbt_Handler:   B       DAbt_Handler
+FIQ_Handler:    B       FIQ_Handler
+
+        .end
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/startup.S b/ulan/embedded/arch/arm/mach-lpc21xx/libs/hal/startup.S
new file mode 100644 (file)
index 0000000..3201fbc
--- /dev/null
@@ -0,0 +1,128 @@
+#/***********************************************************************/
+#/*  Startup file for LPC21xx MCU applications                          */
+#/*  Partially inspired by KEIL ELEKTRONIK startup code                 */
+#/***********************************************************************/
+
+
+# *** Startup Code (executed after Reset) ***
+
+# Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
+        .set  MODE_USR, 0x10            // User Mode
+        .set  MODE_FIQ, 0x11            // FIQ Mode
+        .set  MODE_IRQ, 0x12            // IRQ Mode
+        .set  MODE_SVC, 0x13            // Supervisor Mode
+        .set  MODE_ABT, 0x17            // Abort Mode
+        .set  MODE_UND, 0x1B            // Undefined Mode
+        .set  MODE_SYS, 0x1F            // System Mode
+
+        .equ  I_BIT, 0x80               // when I bit is set, IRQ is disabled
+        .equ  F_BIT, 0x40               // when F bit is set, FIQ is disabled
+
+        .set  UND_STACK_SIZE, 0x00000004
+        .set  ABT_STACK_SIZE, 0x00000004
+        .set  FIQ_STACK_SIZE, 0x00000004
+        .set  IRQ_STACK_SIZE, 0X00000400
+        .set  SVC_STACK_SIZE, 0x00000004
+
+# Starupt Code must be linked first at Address at which it expects to run.
+
+        .text
+#       .arm
+
+        .global _stack                  // top of stack
+        .global _startup
+       .global  reset_handler
+        .func   _startup
+_startup:
+
+reset_handler:  
+
+# Memory Mapping (when Interrupt Vectors are in RAM)
+        .equ    MEMMAP, 0xE01FC040  /* Memory Mapping Control */
+
+        MOV     R1, #1
+        LDR     R0, =hal_vectors
+       CMP     R0, #0
+       BEQ     mam_sram
+        MOV     R1, #2
+mam_sram:
+        LDR     R0, =MEMMAP
+        STR     R1, [R0]
+
+# Initialize Interrupt System
+# - Set stack location for each mode
+# - Leave in System Mode with Interrupts Disabled
+# -----------------------------------------------
+        ldr   r0,=_stack
+        msr   CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
+        mov   sp,r0
+        sub   r0,r0,#UND_STACK_SIZE
+        msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
+        mov   sp,r0
+        sub   r0,r0,#ABT_STACK_SIZE
+        msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
+        mov   sp,r0
+        sub   r0,r0,#FIQ_STACK_SIZE
+        msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
+        mov   sp,r0
+        sub   r0,r0,#IRQ_STACK_SIZE
+        msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
+        mov   sp,r0
+        sub   r0,r0,#SVC_STACK_SIZE
+        msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
+        mov   sp,r0
+
+# Disable interrupt from VIC
+        .equ    VICINTENABLE,    0xFFFFF010
+        .equ    VICINTENCLR,     0xFFFFF014
+        .equ    VICSOFTINT,      0xFFFFF018
+        .equ    VICSOFTINTCLEAR, 0xFFFFF01C
+        LDR     R0, =VICINTENABLE
+        MOV     R1, #0
+        STR     R1, [R0]
+        MOV     R1, #0xFFFFFFFF
+        STR     R1, [R0,#VICINTENCLR-VICINTENABLE]
+        STR     R1, [R0,#VICSOFTINTCLEAR-VICINTENABLE]
+
+# Enable interrupts and return back into supervisor mode
+        msr   CPSR_c,#MODE_SVC  // Supervisor Mode
+
+# Relocate .data section (Copy from ROM to RAM)
+        LDR     R1, =_etext
+        LDR     R2, =_data
+        LDR     R3, =_edata
+       CMP     R1, R2
+       BEQ     ZI
+LoopRel:CMP     R2, R3
+        LDRLO   R0, [R1], #4
+        STRLO   R0, [R2], #4
+        BLO     LoopRel
+
+ZI:
+# Clear .bss section (Zero init)
+        MOV     R0, #0
+        LDR     R1, =__bss_start__
+        LDR     R2, =__bss_end__
+LoopZI: CMP     R1, R2
+        STRLO   R0, [R1], #4
+        BLO     LoopZI
+
+
+# Enter the C _setup_board code
+       ADR     LR, __main_start
+        LDR     R0, =_setup_board
+       CMP     R0, #0
+       BEQ     __main_start
+        BX      R0
+
+__main_start:   
+       ADR     LR, __main_exit
+        LDR     R0, =main
+        BX      R0
+
+__main_exit:    B       __main_exit
+
+        .size   _start, . - _start
+        .endfunc
+
+        .end
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Entries b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Entries
new file mode 100644 (file)
index 0000000..959a568
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Thu Jul 20 12:40:57 2006//
+/Makefile.omk/1.1/Thu Jul 20 12:40:58 2006//
+/iap.c/1.4/Wed Dec 26 21:15:55 2007//
+/iap_asm.S/1.1/Thu Jul 20 12:40:58 2006//
+/iap_kvpb.c/1.4/Wed Dec 26 21:15:55 2007//
+/lpciap.h/1.1/Thu Jul 20 12:40:58 2006//
+/lpciap_kvpb.h/1.3/Wed Dec 26 21:15:55 2007//
+D
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Repository b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Repository
new file mode 100644 (file)
index 0000000..b43fa7c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/arm/mach-lpc21xx/libs/iap
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Root b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile.omk b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/Makefile.omk
new file mode 100644 (file)
index 0000000..b0c47ee
--- /dev/null
@@ -0,0 +1,14 @@
+# -*- makefile -*-
+
+lib_LIBRARIES = lpciap 
+lpciap_SOURCES = iap.c iap_asm.S
+
+include_HEADERS = lpciap.h
+
+ifeq ($(CONFIG_KEYVAL),y)
+lib_LIBRARIES += lpciap_kvpb
+lpciap_kvpb_SOURCES = iap_kvpb.c
+
+include_HEADERS += lpciap_kvpb.h
+
+endif
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap.c b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap.c
new file mode 100644 (file)
index 0000000..9403f68
--- /dev/null
@@ -0,0 +1,118 @@
+#include <system_def.h>
+#include <cpu_def.h>
+#include <hal_machperiph.h>
+
+#define CMD_SUCCESS 0
+#define BUSY 11
+
+#define IAP_CMD_PREPARE        50
+#define IAP_CMD_WRITE          51
+#define IAP_CMD_ERASE          52
+#define IAP_CMD_READ_PARTID    54
+
+uint32_t command[5];
+uint32_t result[2];
+
+extern void iap_asm_entry (unsigned int *,unsigned int *);
+#define iap_entry iap_asm_entry
+
+#ifdef INC_LPC210x_H
+inline int addr2sec(unsigned long addr)
+{
+  return addr/0x2000;
+}
+#elif defined INC_LPC214x_H
+inline int addr2sec(unsigned long addr)
+{
+  if (addr<0x8000) return (addr>>12);
+  else if (addr<0x78000) return (addr>>15)+7;
+       else return 22+((addr&0x7fff)>>12); 
+}
+#else
+#error "Undefined type of CPU for function addr2sec!"
+#endif
+
+int lpcisp_read_partid() 
+{
+  command[0] = IAP_CMD_READ_PARTID;
+  iap_entry(command, result);
+  return result[1];
+}
+
+int lpcisp_prepare_sectors(unsigned char start, unsigned char end)
+{
+  command[0] = IAP_CMD_PREPARE;
+  command[1] = start;
+  command[2] = end;
+  command[3] = FOSC/1000;
+
+  iap_entry(command, result);
+
+  return (CMD_SUCCESS == *result);
+}
+
+int lpcisp_erase_sectors(unsigned char start, unsigned char end)
+{
+  command[0] = IAP_CMD_ERASE;
+  command[1] = start;
+  command[2] = end;
+  command[3] = FOSC/1000;
+
+  iap_entry(command, result);
+
+  return (CMD_SUCCESS == *result);
+}
+
+int lpcisp_erase(void *addr, int len)
+{
+  int start,end;
+  unsigned long flags;
+  
+  start=addr2sec((unsigned long)addr);
+  end=addr2sec((unsigned long)addr+len-1);
+  
+  if (end<start) return 0;
+
+  save_and_cli(flags);
+  lpc_pll_off();
+
+  lpcisp_prepare_sectors(start,end);
+  if (CMD_SUCCESS != *result) return 0;
+
+  lpcisp_erase_sectors(start,end);
+
+  lpc_pll_on();
+  restore_flags(flags);
+
+  return (CMD_SUCCESS == *result);
+}
+
+int lpcisp_write(void *addr_des, const void *addr_src, int len)
+{
+  int start,end;
+  unsigned long flags;
+  
+  start=addr2sec((unsigned long)addr_des);
+  end=start;
+
+  save_and_cli(flags);
+  lpc_pll_off();
+
+  lpcisp_prepare_sectors(start,end);
+  if (CMD_SUCCESS != *result) return 0;
+
+  command[0] = IAP_CMD_WRITE;
+  command[1] = (unsigned int)addr_des;
+  command[2] = (unsigned int)addr_src;
+  command[3] = len;
+  command[4] = FOSC/1000;
+
+  iap_entry(command, result);
+
+  lpc_pll_on();
+  restore_flags(flags);
+
+  return (CMD_SUCCESS == *result);
+}
+
+
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_asm.S b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_asm.S
new file mode 100644 (file)
index 0000000..8867e32
--- /dev/null
@@ -0,0 +1,13 @@
+.global iap_asm_entry
+.func iap_asm_entry
+iap_asm_entry:
+       stmfd   sp!,{r1, r2, lr}
+       adr     lr,iap_asm_exit
+       ldr     r2,=0x7FFFFFF1
+       bx      r2
+
+iap_asm_exit:
+       ldmfd   sp!,{r1, r2, lr}
+       mov     pc,lr
+.endfunc
+.end
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_kvpb.c b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/iap_kvpb.c
new file mode 100644 (file)
index 0000000..268ec9e
--- /dev/null
@@ -0,0 +1,50 @@
+#include <string.h>
+#include <keyvalpb.h>
+#include <lpciap.h>
+
+unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
+char *lpciap_addr_base=NULL;
+
+#define ISP_RAM2FLASH_BLOCK_SIZE_MASK (ISP_RAM2FLASH_BLOCK_SIZE-1)
+
+int lpcisp_kvpb_erase(struct kvpb_block *store, void *base,int size)
+{
+  return lpcisp_erase(base, size);
+}
+
+int lpcisp_kvpb_flush(struct kvpb_block *store) 
+{
+  if (lpciap_addr_base==NULL) return -1;
+  lpcisp_write(lpciap_addr_base,lpciap_buff,ISP_RAM2FLASH_BLOCK_SIZE);
+  lpciap_addr_base=NULL;
+  return 0;
+}
+
+int lpcisp_kvpb_copy(struct kvpb_block *store,void *des, const void *src, int len)
+{
+  char *addr_base,*addr_src=(char*)src;
+  int cp_len;
+
+  while(len) {
+    addr_base=(char*)((unsigned long)des&~ISP_RAM2FLASH_BLOCK_SIZE_MASK);
+    cp_len=ISP_RAM2FLASH_BLOCK_SIZE-((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK);
+    if (len<cp_len) cp_len=len;
+    if (lpciap_addr_base) {
+      if (lpciap_addr_base!=addr_base) {
+        lpcisp_kvpb_flush(store);
+        memcpy(lpciap_buff,addr_base,ISP_RAM2FLASH_BLOCK_SIZE);
+        lpciap_addr_base=addr_base;
+      }
+    } else {
+      memcpy(lpciap_buff,addr_base,ISP_RAM2FLASH_BLOCK_SIZE);
+      lpciap_addr_base=addr_base;
+    }
+    memcpy((char*)lpciap_buff+((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK),addr_src,cp_len);
+    des=(char*)des+cp_len;
+    addr_src+=cp_len;
+    len-=cp_len;
+    if (((unsigned long)des&ISP_RAM2FLASH_BLOCK_SIZE_MASK)==0x00) 
+      lpcisp_kvpb_flush(store);
+  }
+  return 1;
+}
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap.h b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap.h
new file mode 100644 (file)
index 0000000..5a8af6e
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _LPCIAP_H
+#define _LPCIAP_H
+
+int lpcisp_read_partid();
+int lpcisp_erase(void *addr, int len);
+int lpcisp_write(void *addr_des, const void *addr_src, int len);
+
+#endif  /* _LPCIAP_H */
diff --git a/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap_kvpb.h b/ulan/embedded/arch/arm/mach-lpc21xx/libs/iap/lpciap_kvpb.h
new file mode 100644 (file)
index 0000000..3057ab9
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _LPCIAP_KVPB_H
+#define _LPCIAP_KVPB_H
+
+#include <system_def.h>
+
+extern unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
+
+int lpcisp_kvpb_erase(struct kvpb_block *store, void *base,int size);
+int lpcisp_kvpb_flush(struct kvpb_block *store); 
+int lpcisp_kvpb_copy(struct kvpb_block *store,void *des, const void *src, int len);
+
+#endif  /* _LPCIAP_KVPB_ */
diff --git a/ulan/embedded/arch/generic/CVS/Entries b/ulan/embedded/arch/generic/CVS/Entries
new file mode 100644 (file)
index 0000000..b189b1a
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:24 2005//
+D/defines////
diff --git a/ulan/embedded/arch/generic/CVS/Repository b/ulan/embedded/arch/generic/CVS/Repository
new file mode 100644 (file)
index 0000000..a2bb5aa
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/generic
diff --git a/ulan/embedded/arch/generic/CVS/Root b/ulan/embedded/arch/generic/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/generic/Makefile b/ulan/embedded/arch/generic/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/generic/Makefile.omk b/ulan/embedded/arch/generic/Makefile.omk
new file mode 100644 (file)
index 0000000..4291134
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines
\ No newline at end of file
diff --git a/ulan/embedded/arch/generic/defines/CVS/Entries b/ulan/embedded/arch/generic/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..1a26c49
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.3/Wed Nov 22 19:32:15 2006//
+/byteswap.h/1.1/Mon Oct  3 12:43:24 2005//
+/endian.h/1.1/Mon Oct  3 12:43:24 2005//
+/lt_timer.h/1.2/Wed Nov 22 19:32:15 2006//
+/lt_timer_types.h/1.1/Wed Nov 22 19:32:15 2006//
+D
diff --git a/ulan/embedded/arch/generic/defines/CVS/Repository b/ulan/embedded/arch/generic/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..6a9f9ab
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/generic/defines
diff --git a/ulan/embedded/arch/generic/defines/CVS/Root b/ulan/embedded/arch/generic/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/generic/defines/Makefile b/ulan/embedded/arch/generic/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/generic/defines/Makefile.omk b/ulan/embedded/arch/generic/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..5bbf0f6
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+include_HEADERS +=  byteswap.h endian.h lt_timer.h lt_timer_types.h
+#include_HEADERS = $(notdir $(wildcard $(SOURCES_DIR)/*.h)) 
diff --git a/ulan/embedded/arch/generic/defines/byteswap.h b/ulan/embedded/arch/generic/defines/byteswap.h
new file mode 100644 (file)
index 0000000..2324696
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef _BYTESWAP_H
+#define _BYTESWAP_H    1
+
+#if defined(__KEIL__)
+#define __bswap_16(x) ( (((x) << 8) & 0xFF00) | (((x) >> 8) & 0x00FF) )
+#else
+#define __bswap_16(x) ({unsigned short __x=(x); \
+                       (((__x>>8)&0xff)|((__x&0xff)<<8)); })
+#endif
+
+#if defined(__KEIL__)
+    //todo
+#else
+#define __bswap_32(x) ({unsigned long __y=(x); \
+                       (__bswap_16(__y>>16)|__bswap_16(__y)<<16); })
+#endif
+
+#define bswap_16(x) __bswap_16 (x)
+
+#define bswap_32(x) __bswap_32 (x)
+
+#endif /* byteswap.h */
diff --git a/ulan/embedded/arch/generic/defines/endian.h b/ulan/embedded/arch/generic/defines/endian.h
new file mode 100644 (file)
index 0000000..13d6d51
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef        _ENDIAN_H
+#define        _ENDIAN_H       1
+
+#define        __LITTLE_ENDIAN 1234
+#define        __BIG_ENDIAN    4321
+#define        __PDP_ENDIAN    3412
+
+#if defined(__i386__) || defined(SDCC) || defined (__ARMEL__)
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#if defined(__H8300__) || defined(__H8500__) || defined (__H8300H__) ||  defined(__W65__) || defined (__H8300S__) || defined (__m68k__) || defined (__ARMEB__) || defined(__KEIL__)
+#define __BYTE_ORDER __BIG_ENDIAN
+#endif
+
+#endif /* endian.h */
diff --git a/ulan/embedded/arch/generic/defines/lt_timer.h b/ulan/embedded/arch/generic/defines/lt_timer.h
new file mode 100644 (file)
index 0000000..772cf13
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef _LT_TIMER_H
+#define _LT_TIMER_H
+
+#include <types.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <lt_timer_types.h>
+
+//timers
+
+#ifndef LT_TIMER_VAR_LOC
+#define LT_TIMER_VAR_LOC
+#endif
+
+static lt_ticks_t LT_TIMER_VAR_LOC last_ticks;
+static lt_mstime_t LT_TIMER_VAR_LOC actual_msec; 
+
+/* Declaration of ulan light timers */
+
+#define lt_get_msbase()     (1000/SYS_TIMER_HZ)                /* in ms */
+#define lt_get_ticks()      (get_sys_timer_ticks())
+
+static inline void
+lt_mstime_update()
+{
+  lt_ticks_t LT_TIMER_VAR_LOC act_ticks;
+  lt_mstime_t LT_TIMER_VAR_LOC msec_diff;
+
+  act_ticks=lt_get_ticks();
+  msec_diff=((lt_tidiff_t)(act_ticks-last_ticks))*lt_get_msbase();
+  last_ticks=act_ticks;
+
+  actual_msec+=msec_diff;
+}
+
+
+#define LT_TIMER_DEC(cust_prefix) \
+\
+extern lt_mstime_t LT_TIMER_VAR_LOC cust_prefix##_last_expired; \
+static inline void \
+cust_prefix##_init() \
+{\
+  lt_mstime_update();\
+  cust_prefix##_last_expired=actual_msec;\
+}\
+static inline int \
+cust_prefix##_expired(lt_mstime_t expiration) \
+{\
+  lt_mstime_update();\
+  \
+  if ((lt_msdiff_t)(actual_msec-cust_prefix##_last_expired)>=expiration) {\
+    cust_prefix##_last_expired=actual_msec;\
+    return 1;\
+  }\
+  \
+  return 0;\
+}
+
+#define LT_TIMER_IMP(cust_prefix) \
+\
+lt_mstime_t LT_TIMER_VAR_LOC cust_prefix##_last_expired; \
+
+
+#endif /* _LT_TIMER_H */
diff --git a/ulan/embedded/arch/generic/defines/lt_timer_types.h b/ulan/embedded/arch/generic/defines/lt_timer_types.h
new file mode 100644 (file)
index 0000000..e7dc27c
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _LT_TIMER_TYPES_H
+#define _LT_TIMER_TYPES_H
+
+//timers
+
+#ifdef SDCC
+typedef unsigned char lt_ticks_t;
+typedef char lt_tidiff_t;
+typedef unsigned int lt_mstime_t;
+typedef int lt_msdiff_t;
+#define LT_TIMER_VAR_LOC DATA
+#else
+typedef unsigned int lt_ticks_t;
+typedef int lt_tidiff_t;
+typedef unsigned long lt_mstime_t;
+typedef signed long lt_msdiff_t;
+#endif
+
+#endif /* _LT_TIMER_TYPES_H */
diff --git a/ulan/embedded/arch/mcs51/CVS/Entries b/ulan/embedded/arch/mcs51/CVS/Entries
new file mode 100644 (file)
index 0000000..92fa926
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:24 2005//
+D/generic////
+D/mach-at89c51ed2////
+D/mach-msc1210////
diff --git a/ulan/embedded/arch/mcs51/CVS/Repository b/ulan/embedded/arch/mcs51/CVS/Repository
new file mode 100644 (file)
index 0000000..5bfe5c8
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51
diff --git a/ulan/embedded/arch/mcs51/CVS/Root b/ulan/embedded/arch/mcs51/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/Makefile b/ulan/embedded/arch/mcs51/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/Makefile.omk b/ulan/embedded/arch/mcs51/Makefile.omk
new file mode 100644 (file)
index 0000000..4e726a8
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = generic mach-$(MACH)
diff --git a/ulan/embedded/arch/mcs51/generic/CVS/Entries b/ulan/embedded/arch/mcs51/generic/CVS/Entries
new file mode 100644 (file)
index 0000000..c8cd14f
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:24 2005//
+D/defines////
+D/libs////
diff --git a/ulan/embedded/arch/mcs51/generic/CVS/Repository b/ulan/embedded/arch/mcs51/generic/CVS/Repository
new file mode 100644 (file)
index 0000000..6a9417b
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic
diff --git a/ulan/embedded/arch/mcs51/generic/CVS/Root b/ulan/embedded/arch/mcs51/generic/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/Makefile b/ulan/embedded/arch/mcs51/generic/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/Makefile.omk b/ulan/embedded/arch/mcs51/generic/Makefile.omk
new file mode 100644 (file)
index 0000000..dba8475
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines libs
diff --git a/ulan/embedded/arch/mcs51/generic/defines/CVS/Entries b/ulan/embedded/arch/mcs51/generic/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..2a041c5
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:24 2005//
+/cpu_def.h/1.1/Mon Oct  3 12:43:24 2005//
+/types.h/1.1/Mon Oct  3 12:43:24 2005//
+D
diff --git a/ulan/embedded/arch/mcs51/generic/defines/CVS/Repository b/ulan/embedded/arch/mcs51/generic/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..0884805
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/defines
diff --git a/ulan/embedded/arch/mcs51/generic/defines/CVS/Root b/ulan/embedded/arch/mcs51/generic/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/defines/Makefile b/ulan/embedded/arch/mcs51/generic/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/defines/Makefile.omk b/ulan/embedded/arch/mcs51/generic/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..690f1ce
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+include_HEADERS =  cpu_def.h types.h
\ No newline at end of file
diff --git a/ulan/embedded/arch/mcs51/generic/defines/cpu_def.h b/ulan/embedded/arch/mcs51/generic/defines/cpu_def.h
new file mode 100644 (file)
index 0000000..d13ce7c
--- /dev/null
@@ -0,0 +1,20 @@
+
+#if defined(SDCC) // sdcc
+  #ifndef NULL
+    #define NULL 0x0000
+  #endif /*NULL*/ 
+#endif // keil, gcc ???
+
+#ifndef CODE
+  #define CODE code
+#endif
+
+#ifndef XDATA
+  #define XDATA xdata
+#endif
+
+#ifndef DATA
+  #define DATA data
+#endif
+
+#define inline
diff --git a/ulan/embedded/arch/mcs51/generic/defines/types.h b/ulan/embedded/arch/mcs51/generic/defines/types.h
new file mode 100644 (file)
index 0000000..615e0f1
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef _MSC1210_TYPES_H
+#define _MSC1210_TYPES_H
+
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+#define __signed__ signed
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+#if defined (__KEIL__) || (SDCC) || __INT_MAX__ == 32767
+typedef __signed__ long __s32;
+typedef unsigned long __u32;
+#else
+typedef int __s32;
+typedef unsigned int __u32;
+#endif
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+#ifndef __BIT_TYPES_DEFINED__
+#define __BIT_TYPES_DEFINED__
+
+typedef __u8  uint8_t;
+typedef __s8  int8_t;
+typedef __u16 uint16_t;
+typedef __s16 int16_t;
+typedef __u32 uint32_t;
+typedef __s32 int32_t;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __s64 int64_t;
+typedef __u64 uint64_t;
+#endif
+
+#endif /* !(__BIT_TYPES_DEFINED__) */
+
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+typedef __s8 s8;
+typedef __u8 u8;
+
+typedef __s16 s16;
+typedef __u16 u16;
+
+typedef __s32 s32;
+typedef __u32 u32;
+
+typedef __s64 s64;
+typedef __s64 u64;
+
+#define BITS_PER_LONG 32
+
+#endif /* __KERNEL__ */
+
+#endif /* _MSC1210_TYPES_H */
diff --git a/ulan/embedded/arch/mcs51/generic/libs/CVS/Entries b/ulan/embedded/arch/mcs51/generic/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..fd58073
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.3/Wed Nov 16 22:22:30 2005//
+D/boot////
+D/misc////
+D/plan////
+D/ulan////
diff --git a/ulan/embedded/arch/mcs51/generic/libs/CVS/Repository b/ulan/embedded/arch/mcs51/generic/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..bd65e55
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/libs
diff --git a/ulan/embedded/arch/mcs51/generic/libs/CVS/Root b/ulan/embedded/arch/mcs51/generic/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/Makefile b/ulan/embedded/arch/mcs51/generic/libs/Makefile
new file mode 100644 (file)
index 0000000..bdb6d45
--- /dev/null
@@ -0,0 +1,15 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
+# DO NOT DELETE
diff --git a/ulan/embedded/arch/mcs51/generic/libs/Makefile.omk b/ulan/embedded/arch/mcs51/generic/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..77419ea
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = ulan misc plan boot
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Entries b/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Entries
new file mode 100644 (file)
index 0000000..28ce03f
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Wed Nov 16 22:22:30 2005//
+/Makefile.omk/1.4/Wed Nov 22 19:32:15 2006//
+/boot.c/1.7/Wed Nov 22 19:32:15 2006//
+/msc_hcr-hisc.asm/1.1/Wed Nov 16 22:22:30 2005//
+/msc_hcr-ulad21.asm/1.1/Wed Nov 16 22:22:30 2005//
+D
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Repository b/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Repository
new file mode 100644 (file)
index 0000000..da04a1c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/libs/boot
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Root b/ulan/embedded/arch/mcs51/generic/libs/boot/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/Makefile b/ulan/embedded/arch/mcs51/generic/libs/boot/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/Makefile.omk b/ulan/embedded/arch/mcs51/generic/libs/boot/Makefile.omk
new file mode 100644 (file)
index 0000000..0685de8
--- /dev/null
@@ -0,0 +1,30 @@
+default_CONFIG = CONFIG_MCS51_ULBOOT=n
+
+ifeq ($(CONFIG_MCS51_ULBOOT),y)
+
+default_CONFIG += CONFIG_MISC_VECT=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I.
+
+CFLAGS += -DKVPB_BASE=$(KVPB_BASE) -DKVPB_SIZE=$(KVPB_SIZE) 
+
+bin_PROGRAMS = boot
+boot_SOURCES =  boot.c 
+ifeq ($(MACH),msc1210)
+boot_SOURCES +=  msc_hcr-$(BOARD).asm
+endif #MACH
+
+lib_LOADLIBES =  ulan keyval mcuflash uldy
+ifeq ($(CONFIG_MISC_VECT),y)
+lib_LOADLIBES += misc
+endif
+
+# This selects linker script 
+LD_SCRIPT = $(BOARD)
+DEFAULT_LD_SCRIPT_VARIANT = boot
+
+OUTPUT_FORMATS = bin
+
+endif #CONFIG_MCS51_BOOT
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/boot.c b/ulan/embedded/arch/mcs51/generic/libs/boot/boot.c
new file mode 100644 (file)
index 0000000..d71c3bb
--- /dev/null
@@ -0,0 +1,131 @@
+#include <system_def.h>
+#include <ul_lib/ulan.h>
+#include <keyval_id.h>
+#include <ul_drv_fnc.h>
+#include <uldy_base.h>
+#include <local_config.h>
+#ifdef CONFIG_MISC_VECT
+#include <vect.h>
+#endif
+
+#define HZ_TIMER    100               //100Hz pro casovac
+
+KVPB_BLOCK_LOC kvpb_block_t kvpb_block_global;
+UL_DYAC_VAR_LOC ul_dyac_t ul_dyac_global;
+
+volatile uchar timer_str,jump_timer;
+uchar XDATA ustatus;
+
+/****************************************************************************/
+//definice casovace
+void timer(void) 
+{
+  if (!TF0) return;
+  TF0=0;
+  TH0=HZ2TMODE1H(HZ_TIMER);                    //nastav casovac0
+  TL0=HZ2TMODE1L(HZ_TIMER);      
+  if (timer_str!=0) {
+    timer_str=5;
+    ul_str();
+  } else timer_str--;
+  if (jump_timer) jump_timer--;
+}
+
+char ul_save_adr(uchar uaddr) UL_DYAC_REENTRANT
+{
+  kvpb_set_key(&kvpb_store,KVPB_KEYID_ULAN_ADDR,1,&uaddr);
+  return 0;
+}
+
+char ul_save_sn(unsigned long usn) UL_DYAC_REENTRANT
+{
+  kvpb_set_key(&kvpb_store,KVPB_KEYID_ULAN_SN,4,&usn);
+  return 0;
+}
+
+void setup_board(void)
+{
+}
+
+void main(void) 
+{
+ #ifndef UL_WITHOUT_HANDLE
+  kvpb_block_t *kvpb_block=&kvpb_block_global;
+  ul_dyac_t *ul_dyac=&ul_dyac_global;
+  ul_msginfo msginfo;
+ #endif  /*UL_WITHOUT_HANDLE*/
+  unsigned long usn=0L;
+  uchar uaddr=62;
+
+  ustatus=0;
+  LED_GP=0;
+
+  //********************
+  // timers
+  TMOD=0x21;                                    //citac0-16bitovy,1-8bitovy(reload)
+  TH0=HZ2TMODE1H(HZ_TIMER);                    //nastav casovac0
+  TL0=HZ2TMODE1L(HZ_TIMER);      
+  TCON=0x10;                                    //nul. priz. casov0,1;spust casov0
+#ifdef CPU_X2_MODE
+  CKCON0=0x01;                                 //X2 mod for at89c51ed2
+#endif
+#ifdef __REG1210_H__
+  MCON|=1;                                     //XDATA memory map to 0x8400
+#endif
+#ifdef WATCHDOG_ENABLED
+  WATCHDOG_ON();
+  WATCHDOG_SET_MS(1000); //1s
+  WATCHDOG_REFRESH();
+#endif
+
+  //********************
+  // keyval init
+  kvpb_block->base=(CODE uint8_t*)KVPB_BASE;
+  kvpb_block->size=KVPB_SIZE;
+  kvpb_block->flags=KVPB_DESC_DOUBLE;
+  if(kvpb_check(kvpb_block,1)<0) 
+    while(1);
+
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_ADDR,1,&uaddr);
+  kvpb_get_key(kvpb_block,KVPB_KEYID_ULAN_SN,4,&usn);
+
+  //********************
+  // uLan init
+  ul_drv_set_adr(uaddr);
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+  ul_drv_init();
+  ul_fd=ul_open(0,0);
+
+  /***********************************/
+  // uLan dyac init
+  uldy_init(ULDY_ARG_ul_dyac ULDY_ARG_ul_fd ul_save_sn,ul_save_adr,NULL,usn);
+  ul_drv_set_status(ustatus,sizeof(ustatus));
+
+  //********************
+  // start
+  jump_timer=200;
+
+  while ((jump_timer) || (ul_dyac->boot_activated)) {
+
+    /* serve interrupt rutine for uLan */
+    ul_int();
+
+    /* serve interrupt rutine for timer */
+    timer();
+
+    if((ul_inepoll(ul_fd)>0)||(ul_fd_wait(ul_fd,100)>0)){
+      uldy_process_msg(ULDY_ARG_ul_dyac NULL);
+    }
+
+    /* test request for address */
+    if (uldy_rqa(ULDY_ARG1_ul_dyac)) 
+      uldy_addr_rq(ULDY_ARG1_ul_dyac);
+
+  #ifdef WATCHDOG_ENABLED
+    WATCHDOG_REFRESH();
+  #endif
+
+  }
+  LED_GP=1;
+  vec_jmp(IADDR_ASTARTUP);  //application startup code
+}
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-hisc.asm b/ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-hisc.asm
new file mode 100644 (file)
index 0000000..539a467
--- /dev/null
@@ -0,0 +1,6 @@
+CSEG   AT  0807EH      ;Address of HCR1\r
+       DB  011111111b  ;HCR1:  76:DBLSEL 54:ABLSEL 3:DAB 2:DDB 1:EGP0\r
+                               ;0:EGP23\r
+       DB  010011111b  ;HCR0: 7:EPMA 6:PML 5:RSL 4:EBR 3:EWDR 210:DFSEL\r
+\r
+        END\r
diff --git a/ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-ulad21.asm b/ulan/embedded/arch/mcs51/generic/libs/boot/msc_hcr-ulad21.asm
new file mode 100644 (file)
index 0000000..b91b807
--- /dev/null
@@ -0,0 +1,6 @@
+CSEG   AT  0807EH      ;Address of HCR1\r
+       DB  011111100b  ;HCR1:  76:DBLSEL 54:ABLSEL 3:DAB 2:DDB 1:EGP0\r
+                               ;0:EGP23\r
+       DB  010011111b  ;HCR0: 7:EPMA 6:PML 5:RSL 4:EBR 3:EWDR 210:DFSEL\r
+\r
+        END\r
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Entries b/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Entries
new file mode 100644 (file)
index 0000000..d65baac
--- /dev/null
@@ -0,0 +1,12 @@
+/Makefile/1.1/Mon Oct  3 12:43:24 2005//
+/Makefile.omk/1.2/Wed Nov 16 22:22:30 2005//
+/configv-hisc-boot.inc/1.3/Sun Nov 20 20:22:14 2005//
+/configv-hisc.inc/1.1/Wed Nov 16 22:22:30 2005//
+/configv-rja2000-boot.inc/1.3/Sun Nov 20 20:22:14 2005//
+/configv-rja2000.inc/1.1/Wed Nov 16 22:22:30 2005//
+/configv-ulad21-boot.inc/1.3/Sun Nov 20 20:22:14 2005//
+/configv-ulad21.inc/1.1/Wed Nov 16 22:22:30 2005//
+/vect.h/1.1/Mon Oct  3 12:43:24 2005//
+/vect_a2c.c/1.2/Wed Nov 16 22:22:30 2005//
+/vect_fnc.asm/1.3/Sat Jan 14 19:16:58 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Repository b/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Repository
new file mode 100644 (file)
index 0000000..9491e78
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/libs/misc
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Root b/ulan/embedded/arch/mcs51/generic/libs/misc/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/Makefile b/ulan/embedded/arch/mcs51/generic/libs/misc/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/Makefile.omk b/ulan/embedded/arch/mcs51/generic/libs/misc/Makefile.omk
new file mode 100644 (file)
index 0000000..6a5bd8e
--- /dev/null
@@ -0,0 +1,12 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_MISC_VECT=n
+
+ifeq ($(CONFIG_MISC_VECT),y)
+asm_build_HEADERS += \
+configv-$(ULAN_CFG).inc->cf_vect.inc
+lib_LIBRARIES = misc
+include_HEADERS += vect.h
+misc_SOURCES += vect_a2c.c vect_fnc.asm
+endif #CONFIG_MISC_VECT
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc-boot.inc
new file mode 100644 (file)
index 0000000..9a78eea
--- /dev/null
@@ -0,0 +1,10 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (1)
+%DEFINE (TGT_MSC1210)           (1)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (0)     ; Kod pro T89c51RD2 
+
+VEC_ARR XDATA 08400H
+VEC_CAR CODE 08400H
+
+VEC_ABEG CODE 02800H
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-hisc.inc
new file mode 100644 (file)
index 0000000..a05194d
--- /dev/null
@@ -0,0 +1,8 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (0)  
+%DEFINE (TGT_MSC1210)           (1)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (0)     ; Kod pro T89c51RD2 
+
+VEC_ARR XDATA 08400H
+VEC_CAR CODE 08400H
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000-boot.inc
new file mode 100644 (file)
index 0000000..050c8e0
--- /dev/null
@@ -0,0 +1,17 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (1)
+%DEFINE (TGT_MSC1210)           (0)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (1)     ; Kod pro T89c51RD2 
+
+%IF(%TGT_MSC1210)THEN(
+VEC_ARR XDATA 08400H
+VEC_CAR CODE 08400H
+)FI
+
+%IF(%TGT_T89C51RD2)THEN(
+VEC_ARR XDATA 0000H
+VEC_CAR CODE 0000H
+)FI
+
+VEC_ABEG CODE 02800H
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-rja2000.inc
new file mode 100644 (file)
index 0000000..bd80391
--- /dev/null
@@ -0,0 +1,15 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (0)
+%DEFINE (TGT_MSC1210)           (0)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (1)     ; Kod pro T89c51RD2 
+
+%IF(%TGT_MSC1210)THEN(
+VEC_ARR XDATA 8400H
+VEC_CAR CODE 8400H
+)FI
+
+%IF(%TGT_T89C51RD2)THEN(
+VEC_ARR XDATA 0000H
+VEC_CAR CODE 0000H
+)FI
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21-boot.inc
new file mode 100644 (file)
index 0000000..9a78eea
--- /dev/null
@@ -0,0 +1,10 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (1)
+%DEFINE (TGT_MSC1210)           (1)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (0)     ; Kod pro T89c51RD2 
+
+VEC_ARR XDATA 08400H
+VEC_CAR CODE 08400H
+
+VEC_ABEG CODE 02800H
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21.inc b/ulan/embedded/arch/mcs51/generic/libs/misc/configv-ulad21.inc
new file mode 100644 (file)
index 0000000..a05194d
--- /dev/null
@@ -0,0 +1,8 @@
+%DEFINE (FOR_SDCC)              (1)     ; The SDCC ASX8051 is used
+%DEFINE (FOR_BOOTLOADER)        (0)  
+%DEFINE (TGT_MSC1210)           (1)     ; Kod pro MSC1210 
+%DEFINE (TGT_T89C51RD2)         (0)     ; Kod pro T89c51RD2 
+
+VEC_ARR XDATA 08400H
+VEC_CAR CODE 08400H
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/vect.h b/ulan/embedded/arch/mcs51/generic/libs/misc/vect.h
new file mode 100644 (file)
index 0000000..7494349
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef _VECT_H
+#define _VECT_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#if !defined(SDCC_MODEL_LARGE) || !defined(SDCC)
+  #define VECT_FNC_REENTRANT
+#else
+  #define VECT_FNC_REENTRANT reentrant
+#endif
+
+typedef code void (*prot_int)(void) interrupt;
+
+void code *vec_set(prot_int fnc,unsigned char vec) VECT_FNC_REENTRANT;
+void vec_jmp(unsigned char vec); 
+
+#define        IADDR_EXTI0     0x03
+#define        IADDR_SYSFNC    0x06
+#define        IADDR_TIMER0    0x0B
+//#define      VADDR_?         0x0E
+#define        IADDR_EXTI1     0x13
+//#define      VADDR_?         0x16
+#define        IADDR_TIMER1    0x1B
+#define        IADDR_V_uL_ADD  0x1E
+#define        IADDR_SINT      0x23
+#define        IADDR_SINT      0x23
+#define        IADDR_V_uL_FNC  0x26
+#define        IADDR_SIIC      0x2B
+#define        IADDR_TIMER2    0x2B
+//#define      VADDR_?         0x2E
+#define        IADDR_T2CAP0    0x33
+//#define      VADDR_?         0x36
+#define        IADDR_T2CAP1    0x3B
+//#define      VADDR_?         0x3E
+#define        IADDR_T2CAP2    0x43
+//#define      VADDR_?         0x46
+#define        IADDR_T2CAP3    0x4B
+//#define      VADDR_?         0x4E
+#define        IADDR_ADCINT    0x53
+//#define      VADDR_?         0x56
+#define        IADDR_T2CMP0    0x5B
+//#define      VADDR_?         0x5E
+#define        IADDR_T2CMP1    0x63
+//#define      VADDR_?         0x66
+#define        IADDR_T2CMP2    0x6B
+//#define      VADDR_?         0x6E
+//#define      IADDR_TIMER2    0x73
+#define        IADDR_ASTARTUP    0x7B  
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _VECT_H */
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/vect_a2c.c b/ulan/embedded/arch/mcs51/generic/libs/misc/vect_a2c.c
new file mode 100644 (file)
index 0000000..7fd08bd
--- /dev/null
@@ -0,0 +1,80 @@
+#include "vect.h"
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+data unsigned char vec_param1;
+#endif /* SDCC_MODEL_LARGE */
+#endif /* SDCC */
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+void code *vec_set(prot_int fnc,unsigned char vec) VECT_FNC_REENTRANT
+{
+  vec_param1=vec;
+  _asm
+       .globl vec_set
+       mov  r4,_vec_param1
+       lcall vec_set
+       mov  dpl,r4
+       mov  dph,r5
+  _endasm;
+}
+#else
+/* For large model
+ * vec   Allocated to stack - offset -3  (the push _bp taken into account)
+ * fnc Allocated to registers 
+ */
+void code *vec_set(prot_int fnc,unsigned char vec) VECT_FNC_REENTRANT
+{
+  _asm
+       .globl vec_set
+       mov  a,sp
+       add  a,#-3
+       mov  r0,a
+       mov  a,@r0
+       mov  r4,a
+       lcall vec_set
+       mov  dpl,r4
+       mov  dph,r5
+  _endasm;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else
+void code *vec_set(void code *fnc,unsigned char vec) VECT_FNC_REENTRANT
+{
+#pragma asm
+       extrn code(VEC_SET)
+       mov  dpl,r7     ; fnc address into DPTR
+       mov  dph,r6
+        mov  a,r5       ; vec into r4
+        mov  r4,a
+       lcall VEC_SET   ; 
+       mov  a,r4
+       mov  r7,a
+       mov  a,r5       ; return previous vector setting
+       mov  r6,a
+#pragma endasm
+}
+#endif /* SDCC */
+
+#ifdef SDCC
+void vec_jmp(unsigned char vec) 
+{
+  _asm
+       .globl vec_get
+       mov   dph,#0
+       clr  a
+       jmp  @a+dptr
+  _endasm;
+}
+#else /*SDCC*/
+void vec_jmp(unsigned char vec) 
+{
+#pragma asm
+       mov   dpl,r7
+       mov   dph,#0
+       clr  a
+       jmp  @a+dptr
+#pragma endasm
+}
+#endif
diff --git a/ulan/embedded/arch/mcs51/generic/libs/misc/vect_fnc.asm b/ulan/embedded/arch/mcs51/generic/libs/misc/vect_fnc.asm
new file mode 100644 (file)
index 0000000..2f34a67
--- /dev/null
@@ -0,0 +1,175 @@
+$INCLUDE(cf_vect.inc)\r
+
+%IF(%TGT_MSC1210)THEN(
+EICON   DATA  0D8H
+AIE     DATA  0A6H
+EIE     DATA  0E8H
+PDCON   DATA  0F1H
+EWU     DATA  0C6H
+)FI
+
+%IF(%TGT_T89C51RD2)THEN(
+FCON    DATA  0D1H
+AUXR1   DATA  0A2H
+)FI
+
+PUBLIC VEC_SET,VEC_USR,VEC_GET
+EXTRN CODE(_SETUP_BOARD)
+
+%IF(%FOR_SDCC)THEN(
+PUBLIC __SDCC_EXTERNAL_STARTUP
+)ELSE(
+EXTRN CODE(?C_START)
+PUBLIC ?C_STARTUP
+?STACK__I SEGMENT IDATA
+       RSEG    ?STACK__I
+        DS      1
+)FI
+
+C51START__C SEGMENT CODE
+
+       RSEG    C51START__C
+
+%IF(%FOR_BOOTLOADER)THEN(
+CSEG AT 0000H
+       JMP   080H        ;  BOOTLOADER STARTUP CODE
+       JMP   VEC_CAR+03H ;  EXTI0
+       JMP   VEC_CAR+06H ;  SYS_FNC
+       DS    2
+       JMP   VEC_CAR+0BH ;  TIMER0
+       JMP   VEC_CAR+0EH ;
+       DS    2
+       JMP   VEC_CAR+13H ;  EXTI1
+       JMP   VEC_CAR+16H ;
+       DS    2
+       JMP   VEC_CAR+1BH ;  TIMER1
+       JMP   VEC_CAR+1EH ;  V_uL_ADD
+       DS    2
+       JMP   VEC_CAR+23H ;  SINT
+       JMP   VEC_CAR+26H ;  V_uL_FNC
+       DS    2
+       JMP   VEC_CAR+2BH ;  SIIC
+       JMP   VEC_CAR+2EH ;
+       DS    2
+       JMP   VEC_CAR+33H ;  T2CAP0
+       JMP   VEC_CAR+36H ;
+       DS    2
+       JMP   VEC_CAR+3BH ;  T2CAP1
+       JMP   VEC_CAR+3EH ;
+       DS    2
+       JMP   VEC_CAR+43H ;  T2CAP2
+       JMP   VEC_CAR+46H ;
+       DS    2
+       JMP   VEC_CAR+4BH ;  T2CAP3
+       JMP   VEC_CAR+4EH ;
+       DS    2
+       JMP   VEC_CAR+53H ;  ADCINT
+       JMP   VEC_CAR+56H ;
+       DS    2
+       JMP   VEC_CAR+5BH ;  T2CMP0
+       JMP   VEC_CAR+5EH ;
+       DS    2
+       JMP   VEC_CAR+63H ;  T2CMP1
+       JMP   VEC_CAR+66H ;
+       DS    2
+       JMP   VEC_CAR+6BH ;  T2CMP2
+       JMP   VEC_CAR+6EH ;
+       DS    2
+       JMP   VEC_CAR+73H ;  TIMER2
+       JMP   VEC_CAR+76H ;
+       DS    2
+;      JMP   VEC_CAR+7BH ;
+       JMP   VEC_ABEG ;
+
+CSEG AT VEC_ABEG
+VEC_STL:JMP   VEC_STL
+
+)FI
+
+VECT__C SEGMENT CODE
+
+RSEG   VECT__C
+
+VEC_SET:MOV   A,R4
+        MOV   R4,DPL
+        MOV   R5,DPH
+    %IF(0)THEN(
+        MOV   DPTR,#VEC_ARR
+        CALL  ADDATDP
+    )ELSE(
+       ADD   A,#LOW VEC_ARR
+       MOV   DPL,A
+       CLR   A
+       ADDC  A,#HIGH VEC_ARR
+       MOV   DPH,A
+    )FI
+    %IF(%TGT_T89C51RD2)THEN(
+        CLR   A
+       MOVC  A,@A+DPTR
+       CJNE  A,#2,VEC_TE1
+        MOV   A,#1
+        MOVC  A,@A+DPTR
+        XRL   A,R5
+       JNZ   VEC_TE1
+        MOV   A,#2
+        MOVC  A,@A+DPTR
+        XRL   A,R4
+       JNZ   VEC_TE1
+       RET
+VEC_TE1:
+       MOV   FCON,#08H       ; zapis do programove pameti
+    )FI
+VEC_USR:MOV   A,#2
+        MOV   C,EA
+        CLR   EA
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        XCH   A,R5
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        XCH   A,R4
+        MOVX  @DPTR,A
+    %IF(%TGT_T89C51RD2)THEN(
+        MOV   FCON,#050H      ; zapisovaci sequence
+        MOV   FCON,#0A0H      ; zapisovaci sequence
+S_WRM31:MOV   A,FCON          ; cekej na dozapsani
+        ANL   A,#01H
+        JNZ   S_WRM31
+    )FI
+        MOV   EA,C
+        RET
+
+VEC_GET:MOV   DPL,R4
+        MOV   DPH,#HIGH VEC_ARR
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R5,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R4,A
+        RET
+
+__SDCC_EXTERNAL_STARTUP:
+        MOV     IE,#0
+       MOV     PSW,#0
+       MOV     P0,#0FFH
+       MOV     P1,#0FFH
+       MOV     P2,#0FFH
+       MOV     P3,#0FFH
+%IF(%TGT_MSC1210)THEN(
+        MOV     EICON,#040h
+        MOV     AIE,#0
+        MOV     EWU,#0
+)FI
+        CALL    SRETI
+        CALL    SRETI
+        CALL    SRETI
+        CALL    SRETI
+       CALL    _SETUP_BOARD
+       MOV     DPL,#0
+       RET
+SRETI:  RETI
+
+        END
\ No newline at end of file
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Entries b/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Entries
new file mode 100644 (file)
index 0000000..69526b9
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Thu Oct 20 12:36:24 2005//
+/Makefile.omk/1.1/Thu Oct 20 12:36:24 2005//
+/config-generic.inc/1.1/Thu Oct 20 12:36:24 2005//
+/pl_l_c2a.c/1.1/Thu Oct 20 12:36:24 2005//
+/plan.asm/1.1/Thu Oct 20 12:36:24 2005//
+/plan.h/1.1/Thu Oct 20 12:36:24 2005//
+/ul_idstr.c/1.1/Thu Oct 20 12:36:24 2005//
+D
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Repository b/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Repository
new file mode 100644 (file)
index 0000000..b048087
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/libs/plan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Root b/ulan/embedded/arch/mcs51/generic/libs/plan/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/Makefile b/ulan/embedded/arch/mcs51/generic/libs/plan/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/Makefile.omk b/ulan/embedded/arch/mcs51/generic/libs/plan/Makefile.omk
new file mode 100644 (file)
index 0000000..d3d10c2
--- /dev/null
@@ -0,0 +1,18 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_PLAN=n
+
+ifeq ($(CONFIG_PLAN),y)
+
+lib_LIBRARIES = plan
+
+include_HEADERS  = plan.h 
+
+asm_build_HEADERS += \
+config-$(ULAN_CFG).inc->cf_plan.inc
+
+CFLAGS += -DMACH=$(MACH) -DAPPID=$(APPID) 
+
+plan_SOURCES = pl_l_c2a.c plan.asm ul_idstr.c
+
+endif #CONFIG_PLAN
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/config-generic.inc b/ulan/embedded/arch/mcs51/generic/libs/plan/config-generic.inc
new file mode 100644 (file)
index 0000000..319aa9f
--- /dev/null
@@ -0,0 +1,15 @@
+
+%DEFINE (DEBUG_FL) (1)        ; Povoleni vlozeni debug rutin
+%DEFINE (PB_ON_IB) (0)        ; Proc Buf same as In Buf
+%DEFINE (MASTER_E) (1)        ; Bude se pouzivat i master mode
+%DEFINE (XDATA_FL) (1)        ; Je pripojena i vnejsi pamet
+%DEFINE (VECTOR_FL)(0)        ; Nastav vektory pro vyvojovou verzi
+%DEFINE (DR_EO_NG) (1)        ; Negovana hodnota DR_EO
+%DEFINE (COMM_S)   (1)        ; Synchronizace TIRIS
+
+SER_STACK_EXT  EQU  0        ; Pridavna hodnota pro stack
+
+DR_EO   BIT   P3.7    ; Aktivni v 0 (dle DR_EO_NG)
+LENG_IB EQU   16      ; Delka vstupniho bufferu v bytech
+LENG_OB EQU   16      ; Delka vystupniho bufferu
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/pl_l_c2a.c b/ulan/embedded/arch/mcs51/generic/libs/plan/pl_l_c2a.c
new file mode 100644 (file)
index 0000000..007f775
--- /dev/null
@@ -0,0 +1,34 @@
+#include "plan.h"
+
+//*****************************************************************************
+unsigned char 
+pl_send(unsigned char dadr,unsigned char req,unsigned char *pmsg,unsigned char len) {
+  unsigned char i=0;
+
+  uLF_ERR=0;
+  BEG_OB[0]=dadr;
+  BEG_OB[1]=req;
+  BEG_OB[2]=(unsigned char)BEG_OB+3+len;
+  while(i!=len) {BEG_OB[3+i]=*pmsg;i++;pmsg++;}
+  BEG_OB[0]|=128;
+  uL_SND();
+  while ((BEG_OB[0]!=0) && (uLF_ERR==0));      //cekej na odvysilani
+  return(!uLF_ERR);
+}
+
+//*****************************************************************************
+unsigned char 
+pl_recv(unsigned char *sadr,unsigned char *req,unsigned char *pmsg,unsigned char *len) {
+  unsigned char i=0;
+
+  *len=0;
+  if ((BEG_IB[0] & 128)!=0) {                  //prijmuty nove data ?
+    *sadr=BEG_IB[0];
+    *req=BEG_IB[1];
+    *len=BEG_IB[2]-(unsigned char)(BEG_IB+3);
+    while(i!=*len) {*pmsg=BEG_IB[3+i];i++;pmsg++;}
+    BEG_IB[0]=0;                               //odebrana data
+    return 1;
+  }
+  return 0;
+}
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/plan.asm b/ulan/embedded/arch/mcs51/generic/libs/plan/plan.asm
new file mode 100644 (file)
index 0000000..c6b6a99
--- /dev/null
@@ -0,0 +1,1194 @@
+;********************************************************************
+;*            pLan komunikace - PLAN.ASM                            *
+;*     Komunikacni rutiny pro 8051 bez vnejsi pameti               *
+;*                  Stav ke dni 17. 1.1995                          *
+;*                      (C) Pisoft 1994                             *
+;*                          Pavel Pisa Praha                        *
+;********************************************************************
+
+$INCLUDE(cf_plan.inc)
+
+%IF (%VECTOR_FL) THEN (
+  EXTRN    CODE(VEC_SET)
+)FI
+
+; Vnejsi rutina vyslani statusu musi volat ACK_CMD, SND_BEB,
+; n.SND_CHR, SND_END a skocit na S_WAITD nebo skok na NAK_CMD
+;EXTRN   CODE(uL_SNST,uL_IDB,uL_IDE)
+EXTRN   CODE(_uL_IDSTR)       ; Jmeno modulu
+; Rutiny volane z uL_SNST
+PUBLIC  ACK_CMD,SND_BEB,SND_CHC,SND_END,S_WAITD,NAK_CMD,SND_Bi,SND_Bc
+PUBLIC          REC_BEG,REC_CHR,REC_END,REC_CME,        REC_Bi
+PUBLIC  uL_ADR,uL_CMD,uL_SA
+PUBLIC  BEG_PB,END_PB,BEG_IB,END_IB,BEG_OB,END_OB
+%IF (%COMM_S) THEN (
+EXTRN   BIT(SYNCH_COMM)
+)FI
+
+; Rutiny pro spolupraci s PLAN mino preruseni
+PUBLIC  uL_STR,_uL_INIT,uL_SND
+PUBLIC  uLF_ERR,uLF_SN,uLF_RS,uLF_NB, uLF_NA
+
+PLAN__C SEGMENT CODE
+PLAN__D SEGMENT DATA
+PLAN__I SEGMENT IDATA
+PLAN__B SEGMENT DATA BITADDRESSABLE
+
+S_SPEED EQU   3       ; Bd=OSC/12/16/S_SPEED
+S_FRLN  EQU   1024    ; maximalni delka ramce
+
+CSEG AT SINT
+       JMP   S_INT
+       JMP   uL_FNC
+
+PCON    DATA  087H
+FCON    DATA  0D1H
+TF2    BIT   0C8H.7
+;=================================================================
+;
+
+; Rizeni linky - prikazy
+
+uL_ERRI EQU   0FFH ; Ignoruj vse doslo k chybe
+uL_ERR  EQU   07FH ; Chyba v datech
+uL_END  EQU   07CH ; Konec dat
+uL_ARQ  EQU   07AH ; Konec dat - vysli ACK
+uL_PRQ  EQU   079H ; Konec dat - proved prikaz
+uL_AAP  EQU   076H ; ARQ + PRQ
+uL_BEG  EQU   075H ; Zacatek dat
+
+; Potvrzovaci zpravy
+uL_ACK  EQU   019H ; Potvrzeni
+uL_NAK  EQU   07FH ; Doslo k chybe
+uL_WAK  EQU   025H ; Ted nemohu splnit
+
+; Prikazy posilane linkou
+; 00H .. 3FH    uloz do bufferu
+; 40H .. 7FH    uloz do bufferu bez ACK
+; 80H .. 9FH    okamzite proved a konci
+; A0H .. BFH    proved a prijimej
+; C0H .. FFH    proved a vysilej
+
+uL_NCS  EQU   07FH ; Ridici sluzby site
+
+uL_RES  EQU   080H ; Znovu inicializuj RS485
+uL_SFT  EQU   081H ; Otestuj velikost volne pameti
+uL_SYN  EQU   085H ; Sychronizace vysilani TIRIS (zapni EXT2 + flag synch_comm)
+uL_SID  EQU   0F0H ; Predstav se
+uL_SFI  EQU   0F1H ; Vysli velikost volne pameti v IB
+uL_TF0  EQU   098H ; Konec krokovani
+uL_TF1  EQU   099H ; Pocatek krokovani
+uL_STP  EQU   09AH ; Krok
+uL_DEB EQU   09BH ; Dalsi prikazy pro debug
+uL_SPC  EQU   0DAH ; Vysle PCL PCH PSW ACC
+
+uL_RDM  EQU   0F8H ; Cte pamet typu   T T B B L L
+uL_WRM  EQU   0B8H ; Zapise do pameti T T B B L L
+
+uL_GST  EQU   0C1H ; Zavola rutinu vyslani statusu uL_PST
+
+RSEG PLAN__B
+
+uL_FLG: DS    1
+uLF_ER0 BIT   uL_FLG.0  ; Chyba pri vysilani
+uLF_ER1 BIT   uL_FLG.1  ; Chyba pri vysilani
+uLF_ERR BIT   uL_FLG.2  ; Chyba pri vysilani
+uLF_SN  BIT   uL_FLG.3  ; uLan vysila - master mode
+uLF_RS  BIT   uL_FLG.4  ; Potreba vysilat
+uLF_NB  BIT   uL_FLG.5  ; Zbernice neobsazena
+uLF_NA  BIT   uL_FLG.6  ; Mazano kazdou akci
+uLF_TRP BIT   uL_FLG.7  ; Jiny duvod preruseni
+
+RSEG    PLAN__D
+
+uL_ADR: DS    1  ;    Adresa daneho ucastnika site
+uL_CMD: DS    1  ;    Prave prenaseny prikaz
+uL_SA:  DS    1  ;    Adresa vysilace
+
+SP_BUF: DS    5+SER_STACK_EXT    
+
+RSEG    PLAN__I
+
+BEG_IB: DS    LENG_IB         ; Input buffer  : SA CMD END
+END_IB:
+
+BEG_OB: DS    LENG_OB         ; Output buffer : DA CMD END
+END_OB:
+
+%IF (%PB_ON_IB) THEN (
+BEG_PB IDATA BEG_IB+3        ; PROC_BUF
+END_PB  IDATA END_IB
+)ELSE(
+BEG_PB: DS    16              ; Proceed buffer
+END_PB:
+)FI
+
+%IF (%XDATA_FL) THEN (
+PLAN__X SEGMENT XDATA
+RSEG   PLAN__X
+XPR_BUF:DS    3
+)FI
+
+;=================================================================
+;
+
+RSEG    PLAN__C
+
+USING  1
+
+; Cekani na znak R0 - 1 znaku  jinak S_ERR
+WTF_CHR:DJNZ  R0,SND_SPC
+V2_ERR: JMP   S_ERR
+
+; Test a docekani po dobu 1 znaku
+SND_SPT:CLR   TI
+       JNB   TXD,S_RET
+SND_SPR:RET
+
+; Ceka kdyz je nutne shodit DR_EO
+%IF (%DR_EO_NG) THEN (
+SND_SPS:JB   DR_EO,SND_SPR
+)ELSE(
+SND_SPS:JNB   DR_EO,SND_SPR
+)FI
+
+; Cekani po dobu 1 znaku
+SND_SPC:CLR   SM2
+       SETB  REN
+%IF (%DR_EO_NG) THEN (
+SND_SP1:CLR   DR_EO           ; *** Ceka 1 znak
+)ELSE(
+SND_SP1:SETB  DR_EO           ; *** Ceka 1 znak
+)FI
+       CLR   A
+       SJMP  SND_CH2
+
+SND_CTR:SETB  C                      ; *** Send control character
+       SJMP  SND_CH1
+SND_CHC:XRL   AR1,A           ; *** Send data + add chk sum
+       INC   R1
+SND_CHR:CLR   C               ; *** Send data character
+SND_CH1:MOV   TB8,C           ; ACC .. character
+       CLR   REN
+%IF (%DR_EO_NG) THEN (
+       SETB  DR_EO
+)ELSE(
+       CLR   DR_EO
+)FI
+
+SND_CH2:MOV   SBUF,A
+       CLR   TI
+       SJMP  S_RET
+
+REC_CTR:SETB  C               ; *** Receive control character
+       DB    74H             ; MOV A,#d8
+REC_CHR:CLR   C               ; *** Receive character
+REC_CH1:MOV   SM2,C          ; ACC .. rec. char
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO           ; CY  .. RB8
+)ELSE(
+       SETB  DR_EO           ; CY  .. RB8
+)FI
+
+       SETB  REN
+       CLR   TI
+
+RS232:
+S_RET:  JB    uLF_TRP,S_INT_T
+S_RETI: MOV   A,SP
+       XCH   A,SP_BUF
+       MOV   SP,A
+       POP   ACC
+       POP   PSW
+       RETI
+
+; *************************************
+; Interupt TI nebo RI
+; *************************************
+
+S_INT  :PUSH  PSW
+       PUSH  ACC
+       MOV   A,SP
+       XCH   A,SP_BUF
+       JZ    S_ERROR
+       MOV   SP,A
+
+S_INT_T:MOV   PSW,#AR0; Banka1
+;      JB    DR_EI,RS232
+        MOV   C,RB8           ; errata 89c51rd2, point 6 !!!!!!
+        CLR   RB8             ; nutno dodrzet !!!!!!!!!!!!!!!!!
+        JBC   RI,S_INT_2
+       JNB   TI,S_RET
+S_INT_1:CLR   uLF_NA
+       RET
+S_INT_2:JB    REN,S_INT_3     ; errata 89c51rd2, point 8
+        SJMP  S_RETI
+S_INT_3:SETB  AC             ; Preruseni od RI => AC=1
+       CLR   uLF_NB
+       MOV   A,SBUF
+        JNC   S_INT_1
+       JNB   ACC.7,S_INT_1
+       SETB  uLF_NB
+       CJNE  A,#uL_ERRI,S_INT_1
+S_ERROR:MOV   PSW,#AR0; Banka1
+       CLR   uLF_SN
+       JMP   S_ERR
+
+; Doslo k chybe pri prijmu nebo vysilani
+
+S_ERR:  MOV   SP,#SP_BUF
+       JNB   uLF_SN,S_WAITD
+       MOV   R0,#3           ; Pocet vyslani ERRI pri normalni chybe
+       JNB   F0,S_ERR_1
+       MOV   R0,#10          ; Pocet vyslani ERRI pri zavazne chybe
+S_ERR_1:MOV   A,#uL_ERRI
+       CALL  SND_CTR
+       DJNZ  R0,S_ERR_1
+S_ERR_2:INC   uL_FLG
+       MOV   A,uL_FLG
+       ANL   A,#3
+       JNZ   S_END
+       DEC   uL_FLG
+S_ERR_3:SETB  uLF_ERR
+       MOV   R0,#0FFH
+       SJMP  S_ENDTE
+
+; Rutina maze posledni zpravu
+
+S_ENDT: MOV   R0,#0
+S_ENDTE:MOV   SP,#SP_BUF
+       ANL   uL_FLG,#0FCH
+%IF (%MASTER_E) THEN (
+       MOV   R0,#BEG_OB; Mazani posledni vysilane zpravy
+       MOV   @R0,#0
+)FI
+S_ENDT1:;?JMP S_END     ; Neexistuje dalsi zprava
+       CLR   uLF_RS
+
+; Konec vysilani nebo prijmu
+
+S_END:  MOV   SP,#SP_BUF
+       JNB   uLF_SN,S_WAITD
+       JB    uLF_NB,S_WAITD
+       CALL  SND_SPS
+       JB    AC,S_WAITD
+       MOV   A,uL_ADR
+       ORL   A,#80H
+       CALL  SND_CTR
+       SETB  uLF_NB
+
+; Cekani na komunikaci
+
+%IF (%DR_EO_NG) THEN (
+S_WAITD:CLR   DR_EO
+) ELSE (
+S_WAITD:SETB  DR_EO
+)FI
+       MOV   SP,#SP_BUF
+       CLR   TI
+       SETB  F0
+       SETB  REN
+       SETB  TXD
+
+; Cekai na vlastni adresu nebo pozadavek k vysilani
+
+S_WAIT: CLR   uLF_SN
+%IF (%MASTER_E) THEN (
+       JNB   uLF_NB,S_WAIT1  ; Nelze vysilat
+       JNB   uLF_RS,S_WAIT1  ; Neni potreba vysilat
+       SETB  uLF_SN
+       MOV   A,uL_ADR
+       MOV   R0,A            ; Vlastni adresa
+       SETB  C
+       SUBB  A,R1            ;  - Posledni vysilajici
+       ANL   A,#00FH         ; Token pasing delay
+       ADD   A,#4            ; min 4
+       JNB   F0,S_CONN1
+       ADD   A,#010H         ; Prodlouzit - byla chyba
+S_CONN1:MOV   R1,A
+S_CONN2:CALL  SND_SPC         ; Cekani token pasing delay
+       JB    AC,S_WAIT2
+       DJNZ  R1,S_CONN2
+       CALL  S_ARB           ; Arbitrace pristupu
+       JB    F0,S_WAIT1
+SND_OB: MOV   R0,#BEG_OB      ; Nasledujici blok
+       MOV   A,@R0
+       JB    ACC.7,SND_OBV
+       JMP   S_ENDT          ; Neexistuje
+SND_OBV:MOV   R1,A
+       INC   R0
+       MOV   A,@R0
+       INC   R0
+       MOV   AR6,@R0
+       INC   R0
+       XCH   A,R0
+       MOV   R2,A
+       XRL   A,R6
+       XCH   A,R1
+       JMP   SND_OB1         ; Vysli blok
+)ELSE(
+       JMP   S_WAIT1         ; Cekani
+)FI
+
+S_WAIT1:MOV   C,uLF_NB
+       CPL   C
+       CALL  REC_CH1         ; Ceka se na znak
+S_WAIT2:CLR   uLF_SN
+       JNB   AC,S_WAITD      ; Vybuzovaci TI
+       MOV   R1,A
+       JNC   S_WAITD         ; Neni ridici
+       JB    ACC.7,S_WAIT    ; Ukonceni vysilani
+       MOV   R1,#0
+       CALL  REC_BE2         ; Cekani na prikaz v R0
+       SJMP  REC_CM1
+
+REC_CMD:CALL  REC_BEG         ; Cekani na prikaz v R0
+REC_CM1:MOV   A,R0
+       JB    ACC.7,REC_CM2
+       MOV   R0,#BEG_IB      ; Prijem do IB
+       MOV   A,@R0
+       JNZ   REC_CMEV
+       MOV   R2,#BEG_IB+3
+       MOV   R6,#END_IB
+       CALL  REC_Bi
+       JNC   REC_CMEV
+       CALL  REC_EN2
+        MOV   R1,A
+       CALL  IB_ENDR
+        MOV   A,R1
+       JB    ACC.1,REC_CM0
+V1_WAIT:JMP   S_WAITD
+
+; Ukonceni prijmu do IB
+IB_ENDR:MOV   R0,#BEG_IB
+       MOV   A,uL_SA
+       ORL   A,#80H
+       MOV   @R0,A
+       INC   R0
+       INC   R0
+       MOV   A,R2
+       MOV   R6,A
+       MOV   @R0,A
+       DEC   R0
+       MOV   A,uL_CMD
+       MOV   @R0,A
+       RET
+
+REC_CMEV:JMP  REC_CME
+
+REC_CM2:                     ; Prijem do PB
+%IF (%PB_ON_IB) THEN (
+       MOV   R0,#BEG_IB
+       MOV   A,@R0
+       JNZ   REC_CMEV
+)FI    MOV   R2,#BEG_PB
+       MOV   R6,#END_PB
+       CALL  REC_Bi
+       MOV   AR6,R2
+       JNC   REC_CMEV
+       CALL  REC_EN2
+       JNB   ACC.1,V1_WAIT
+REC_CM0:MOV   A,uL_CMD        ; Cislo prikazu
+       CJNE  A,#uL_SID,REC_CM3
+
+; Vysle svoji identifikaci
+       CALL  ACK_CMD
+       CALL  SND_BEB
+        MOV   DPTR,#_uL_IDSTR
+        CLR   A
+        MOVC  A,@A+DPTR
+        MOV   R2,A
+       MOV   A,#1
+        MOVC  A,@A+DPTR
+        MOV   R3,A
+       MOV   A,#3
+        MOVC  A,@A+DPTR
+        ADD   A,R2
+        MOV   R6,A
+        CLR   A
+        ADDC  A,R3
+        MOV   R7,A
+REC_C_0:MOV   R5,AR4
+       CALL  SND_Bc
+REC_C_1:CALL  SND_END
+       SJMP  V1_WAIT
+
+REC_CM3:CJNE  A,#uL_GST,REC_CM4
+;      JMP   uL_SNST
+        JMP   S_WAITD
+REC_CM4:
+
+%IF (%DEBUG_FL) THEN (
+; Krokovani pocatek
+       CJNE  A,#uL_TF0,REC_CM5
+       CLR   uLF_TRP       ; Ukonci krokovani
+REC_C_2:CALL  ACK_CMD
+       JMP   S_WAITD
+REC_CM5:CJNE  A,#uL_TF1,REC_CM6
+       SETB  uLF_TRP       ; Zacne krokovani
+       SJMP  REC_C_2
+REC_CM6:CJNE  A,#uL_STP,REC_CM7
+       SETB  TI            ; Provede jednu instrukci
+       CALL  S_RETI
+       CLR   TI
+       CLR   A
+       SJMP  REC_C_2
+REC_CM7:CJNE  A,#uL_SPC,REC_CM8
+       CALL  ACK_CMD
+       CALL  SND_BEB
+       MOV   A,SP_BUF      ; Vysle PCL PCH PSW ACC
+       INC   A
+       MOV   R6,A
+       ADD   A,#-4
+       MOV   R2,A
+       CALL  SND_Bi
+       JMP   REC_C_1
+REC_CM8:CJNE  A,#uL_RDM,REC_CM9
+
+; Vyslani pameti
+       CALL  ACK_CMD
+       CALL  SND_BEB
+       CALL  S_PRPMM
+       CJNE  R4,#1,S_RDM1
+       CALL  SND_Bi
+S_RDM1:
+%IF (%XDATA_FL) THEN (
+        CJNE  R4,#2,S_RDM2
+       CALL  SND_Bx
+S_RDM2:        CJNE  R4,#4,S_RDM3
+       CALL  SND_Bs
+)FI
+S_RDM3:        CJNE  R4,#6,S_RDM4
+       CALL  SND_Bc
+S_RDM4:
+        JMP   REC_C_1
+
+REC_CM9:CJNE  A,#uL_WRM,REC_C10
+       CALL  ACK_CMD
+       CALL  REC_BEG
+       CJNE  R0,#uL_WRM AND 7FH,REC_CME
+       CALL  S_PRPMM
+       MOV   A,#1
+       CJNE  R4,#1,S_WRM1
+       CALL  REC_Bi
+S_WRM1:
+%IF (%XDATA_FL) THEN (
+       CJNE  R4,#2,S_WRM2
+       CALL  REC_Bx
+S_WRM2: CJNE  R4,#4,S_WRM3
+       CALL  REC_Bs
+S_WRM3: CJNE  R4,#6,S_WRM4    ; zapis do code 89c51rd2?
+       CALL  REC_Bc
+       JNZ   REC_CME
+       CALL  REC_END
+       CLR   EA
+       MOV   FCON,#050H      ; zapisovaci sequence
+       MOV   FCON,#0A0H      ; zapisovaci sequence
+S_WRM31:MOV   A,FCON         ; cekej na dozapsani
+       ANL   A,#01H
+       JNZ   S_WRM31
+       SETB  EA                
+        JMP   S_WAITD
+S_WRM4: JNZ   REC_CME
+       CALL  REC_END
+        JMP   S_WAITD
+)FI
+
+REC_C10:CJNE  A,#uL_DEB,REC_C11
+;S_DEB:        CALL  S_INCP2
+;      JZ    NAK_CMD
+       CALL  ACK_CMD
+       MOV   R0,#BEG_PB
+        MOV   A,@R0
+        INC   R0
+       CJNE  A,#10H,S_DEB98
+        INC   R0            ; Prikaz GO xxxx
+        INC   R0
+       MOV   A,SP_BUF      ; Zapise  PCL PCH
+       ADD   A,#-3
+       MOV   R1,A
+        MOV   A,@R0
+       MOV   @R1,A
+        INC   R0
+       INC   R1
+        MOV   A,@R0
+       MOV   @R1,A
+S_DEB98:JMP   S_WAITD
+
+)FI
+
+REC_C11:
+%IF (%COMM_S) THEN (
+        CJNE  A,#uL_SYN,NAK_CMD
+        CALL  ACK_CMD
+       SETB  SYNCH_COMM     ; synchronizace TIRIS
+;        SETB  TF2            ; zasynchronizovani
+        SETB  IE1            ; zasynchronizovani
+       JMP   S_WAITD
+)FI
+
+NAK_CMD:MOV   R1,#uL_NAK
+       JMP   REC_EN4
+
+WAK_CMD:MOV   R1,#uL_WAK
+       JMP   REC_EN4
+
+REC_CME:CALL  REC_ERR
+       JMP   REC_CMD
+
+%IF (%MASTER_E) THEN (
+; Pripojeni mastera ke sbernici
+; vstup vlastni adresy v R0
+
+S_ARB:         MOV   R1,#3+1         ; 3x2 bitu arbitrace
+       CLR   uLF_NB
+%IF (%DR_EO_NG) THEN (
+S_ARB1:        CLR  DR_EO
+)ELSE(
+S_ARB1:        SETB  DR_EO
+)FI
+       JNB   RXD,S_ARBE
+       JB    AC,S_ARBE
+       CLR   TXD
+       CALL  SND_CH1
+       SETB  TXD
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO
+)ELSE(
+       SETB  DR_EO
+)FI
+S_ARB2:        CALL  SND_CH2
+       JB    AC,S_ARB2
+       MOV   A,R0          ; Rotace adresy
+       RR    A
+       RR    A
+       XCH   A,R0
+       ANL   A,#3          ; Nejnizsi 2 bity
+       INC   A
+       MOV   R2,A          ; Pocet cekani
+       DJNZ  R1,S_ARB4
+       RET
+S_ARB3: JB    AC,S_ARBE
+       CALL  SND_SPC
+S_ARB4:        DJNZ  R2,S_ARB3
+       SJMP  S_ARB1
+
+S_ARBE: SETB  F0
+       RET
+
+SND_OB1:CJNE  R1,#0,SND_OB2
+       CALL  SND_BEG
+       SJMP  SND_OB3
+SND_OB2:CALL  SND_BEG
+       CALL  SND_Bi
+SND_OB3:CALL  SND_END
+        JMP   S_ENDT
+)FI
+
+; Prijem bloku do IDATA
+
+REC_Bi: CLR   SM2            ; R2  .. where
+       SETB  REN             ; X R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO           ; R6  .. end of buffer
+)ELSE(
+       SETB  DR_EO           ; R6  .. end of buffer
+)FI
+       CLR   TI              ; R1  =  check sum
+REC_Bi1:CALL  S_RET           ; CY  =  1 when ended by CTR
+       JB    AC,REC_Bi2
+       CLR   TI
+       SJMP  REC_Bi1
+REC_Bi2:JC    REC_BiR
+       PUSH  AR1
+       MOV   R1,AR2
+       MOV   @R1,A
+       POP   AR1
+       XRL   AR1,A
+       INC   R1
+       INC   R2
+       MOV   A,R2
+       XRL   A,R6
+       JNZ   REC_Bi1
+       CLR   C
+REC_BiR:RET
+
+; Vyslani bloku z IDATA
+
+SND_Bi: CALL  SND_SPS         ; R2  .. where
+SND_Bi0:CLR   REN            ; X R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       SETB  DR_EO           ; R6  .. end of buffer
+)ELSE(
+       CLR   DR_EO           ; R6  .. end of buffer
+)FI
+       CLR   RI              ; R1  =  check sum
+       CLR   TB8
+SND_Bi1:PUSH  AR1
+       MOV   R1,AR2
+       MOV   A,@R1
+       MOV   SBUF,A
+       POP   AR1
+       XRL   AR1,A
+       INC   R1
+       INC   R2
+       MOV   A,R2
+       XRL   A,R6
+       CLR   TI
+       JZ    SND_BiR
+SND_Bi2:CALL  S_RET
+       JB    AC,SND_Bi2
+       SJMP  SND_Bi1
+SND_BiR:CALL  S_RET
+       CLR   TI
+       RET
+
+; Vyslani bloku z CDATA
+
+SND_Bc: CALL  SND_SPS         ; R23 .. where
+SND_Bc0:CLR   REN            ; R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       SETB  DR_EO           ; R67 .. end of buffer
+)ELSE(
+       CLR   DR_EO           ; R67 .. end of buffer
+)FI
+       CLR   RI              ; R1  =  check sum
+       CLR   TB8
+SND_Bc1:CALL  S_SNFC
+       CLR   TI
+       JZ    SND_BcR
+SND_Bc2:CALL  S_RET
+       JB    AC,SND_Bc2
+       SJMP  SND_Bc1
+SND_BcR:CALL  S_RET
+       CLR   TI
+       RET
+
+%IF (%XDATA_FL) THEN (
+
+; Prijem bloku do XDATA
+
+REC_Bx: CLR   SM2            ; R23 .. where
+       SETB  REN             ; R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO           ; R67 .. end of buffer
+)ELSE(
+       SETB  DR_EO           ; R67 .. end of buffer
+)FI
+       CLR   TI              ; R1  =  check sum
+REC_Bx1:CALL  S_RET           ; CY  =  1 when ended by CTR
+       JB    AC,REC_Bx2
+       CLR   TI
+       SJMP  REC_Bx1
+REC_Bx2:JC    REC_BxR
+       CALL  S_RCTB1
+       JNZ   REC_Bx1
+       CLR   C
+REC_BxR:RET
+
+; Prijem bloku do CDATA (t89c51rd2)
+REC_Bc: CLR   SM2            ; R23 .. where
+       SETB  REN             ; R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO           ; R67 .. end of buffer
+)ELSE(
+       SETB  DR_EO           ; R67 .. end of buffer
+)FI
+       CLR   TI              ; R1  =  check sum
+REC_Bc1:CALL  S_RET           ; CY  =  1 when ended by CTR
+       JB    AC,REC_Bc2
+       CLR   TI
+       SJMP  REC_Bc1
+REC_Bc2:JC    REC_BcR
+       CLR   EA
+        MOV   FCON,#08H       ; zapis do programove pameti
+       CALL  S_RCTB1
+        MOV   FCON,#00H       ; vypni zapis do programove pameti
+       SETB  EA
+       JNZ   REC_Bc1
+       CLR   C
+REC_BcR:RET
+
+; Vyslani bloku z XDATA
+SND_Bx: CALL  SND_SPC         ; R23 .. where
+SND_BX0:CLR   REN            ; R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       SETB  DR_EO           ; R67 .. end of buffer
+)ELSE(
+       CLR   DR_EO           ; R67 .. end of buffer
+)FI
+       CLR   RI              ; R1  =  check sum
+       CLR   TB8
+SND_Bx1:CALL  S_SNFB
+       CLR   TI
+       JZ    SND_BxR
+SND_Bx2:CALL  S_RET
+       JB    AC,SND_Bx2
+       SJMP  SND_Bx1
+SND_BxR:CALL  S_RET
+       CLR   TI
+       RET
+
+; Vyslani bloku z SDATA
+
+SND_Bs: CALL  SND_SPC         ; R2  .. where
+SND_Bs0:CLR   REN            ; X R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       SETB  DR_EO           ; R6  .. end of buffer
+)ELSE(
+       CLR   DR_EO           ; R6  .. end of buffer
+)FI
+       CLR   RI              ; R1  =  check sum
+       CLR   TB8
+SND_Bs1:PUSH  DPL
+       PUSH  DPH
+       MOV   DPTR,#XPR_BUF
+       MOV   A,#0E5H         ; MOV A,dir
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,R2            ; adresa
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,#022H         ; RET
+       MOVX  @DPTR,A
+       INC   DPTR
+       POP   DPH
+       POP   DPL
+       DB    12H             ; CALL XPR_BUF
+       DW    XPR_BUF
+       MOV   SBUF,A
+       XRL   AR1,A
+       INC   R1
+       INC   R2
+       MOV   A,R2
+       XRL   A,R6
+       CLR   TI
+       JZ    SND_BsR
+SND_Bs2:CALL  S_RET
+       JB    AC,SND_Bs2
+       SJMP  SND_Bs1
+SND_BsR:CALL  S_RET
+       CLR   TI
+       RET
+
+; Prijem bloku do SDATA
+
+REC_Bs: CLR   SM2            ; R2  .. where
+       SETB  REN             ; X R45 .. buffer bot/top
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO           ; R6  .. end of buffer
+)ELSE(
+       SETB  DR_EO           ; R6  .. end of buffer
+)FI
+       CLR   TI              ; R1  =  check sum
+REC_Bs1:CALL  S_RET           ; CY  =  1 when ended by CTR
+       JB    AC,REC_Bs2
+       CLR   TI
+       SJMP  REC_Bs1
+REC_Bs2:JC    REC_BsR
+       XRL   AR1,A
+       INC   R1
+       PUSH  DPL
+       PUSH  DPH
+       MOV   R3,A
+       MOV   DPTR,#XPR_BUF
+       MOV   A,#08BH         ; MOV dir,R3
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,R2            ; adresa
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,#022H         ; RET
+       MOVX  @DPTR,A
+       INC   DPTR
+       POP   DPH
+       POP   DPL
+       DB    12H             ; CALL XPR_BUF
+       DW    XPR_BUF
+       INC   R2
+       MOV   A,R2
+       XRL   A,R6
+       JNZ   REC_Bs1
+       CLR   C
+REC_BsR:RET
+
+S_SNFB: XCH   A,R3          ; Vyslani znaku z bufferu
+       XCH   A,DPH
+       XCH   A,R3
+       XCH   A,R2
+       XCH   A,DPL
+       XCH   A,R2
+       MOVX  A,@DPTR
+       MOV   SBUF,A
+       XCH   A,R1          ; Check sum
+       XRL   A,R1
+       INC   A
+       XCH   A,R1
+       SJMP  S_ACCT1
+
+S_R0FB: XCH   A,R3          ; Naplneni R0 z bufferu
+       XCH   A,DPH
+       XCH   A,R3
+       XCH   A,R2
+       XCH   A,DPL
+       XCH   A,R2
+       MOVX  A,@DPTR
+       MOV   R0,A
+       SJMP  S_ACCT1
+
+S_RCTB: MOV   A,SBUF        ; Prijem znaku do bufferu
+S_RCTB1:XCH   A,R1          ; Check sum
+       XRL   A,R1
+       INC   A
+       XCH   A,R1
+S_ACCTB:XCH   A,R3
+       XCH   A,DPH
+       XCH   A,R3
+       XCH   A,R2
+       XCH   A,DPL
+       XCH   A,R2
+       MOVX  @DPTR,A
+       SJMP  S_ACCT1
+)FI
+
+S_SNFC: XCH   A,R3          ; Vyslani znaku z CODE
+       XCH   A,DPH
+       XCH   A,R3
+       XCH   A,R2
+       XCH   A,DPL
+       XCH   A,R2
+       CLR   A
+       MOVC  A,@A+DPTR
+       MOV   SBUF,A
+       XCH   A,R1          ; Check sum
+       XRL   A,R1
+       INC   A
+       XCH   A,R1
+       SJMP  S_ACCT1
+
+S_ACCT1:XCH   A,R3
+       XCH   A,DPH
+       XCH   A,R3
+       XCH   A,R2
+       XCH   A,DPL
+       XCH   A,R2
+
+S_INCP: INC   R2            ; Pripraveni nasledujici adresy
+       CJNE  R2,#0,S_INCP1
+       INC   R3
+S_INCP1:MOV   A,R5
+       XRL   A,R3
+       JNZ   S_INCP2
+       MOV   A,R4
+       MOV   R3,A
+S_INCP2:MOV   A,R2          ; Kontrola prostoru pro data
+       XRL   A,R6          ; ACC=0 => konec dat nebo preteceni IB
+       JNZ   S_INCP3
+       MOV   A,R3
+       XRL   A,R7
+S_INCP3:RET
+
+; Vyslani konce ramce
+; podle CMD vysle uL_ARQ, uL_AAP nebo uL_END
+
+SND_END:MOV   A,uL_CMD        ; Vysilany prikaz
+       XCH   A,R0
+       MOV   A,uL_SA         ; Adresa spojeni
+       JZ    SND_EN1
+       JB    ACC.6,SND_EN1
+       JNB   uLF_SN,SND_EN1
+       XCH   A,R0
+       MOV   R0,#uL_AAP
+       JB    ACC.7,SND_EN2
+       MOV   R0,#uL_ARQ
+       JNB   ACC.6,SND_EN2
+SND_EN1:MOV   R0,#uL_END
+SND_EN2:MOV   A,R0
+       XRL   AR1,A
+       INC   R1
+       CALL  SND_CTR         ; Vyslani zakonceni
+       MOV   A,R1
+       CALL  SND_CHR         ; Vyslani checksum
+       CJNE  R0,#uL_END,SND_EN3
+       RET
+SND_EN3:MOV   R0,#5
+SND_EN4:CALL  WTF_CHR
+       JNB   AC,SND_EN4      ; Prijeti uL_ACK
+       JC    V3_ERR
+       CJNE  A,#uL_ACK,V3_ERR
+       RET
+
+; Vyslani uL_NAK pri chybe v nektere z  rutin zpracovani prikazu
+REC_ERR:CALL  REC_CTR
+       JNB   AC,REC_ERR
+REC_ER2:CALL  CMP_END         ; Vstup s prijatym znakem v ACC a CY
+       JC    V3_ERR
+       MOV   R1,AR0
+       MOV   R0,#5
+REC_ER3:CALL  WTF_CHR         ; Prijem checksum
+       JNB   AC,REC_EN3
+       MOV   R0,AR1
+       MOV   R1,#uL_NAK
+       SJMP  REC_EN4
+
+; Potvrzeni prikazu
+ACK_CMD:MOV   R1,#uL_ACK
+       SJMP  REC_EN4
+
+; Nacteni konce ramce
+; ret: ACC = CMP_END
+
+REC_END:MOV   R0,#5
+REC_EN1:CALL  WTF_CHR         ; Prijem zakonceni ramce
+       JNB   AC,REC_EN1
+REC_EN2:XRL   AR1,A           ; Vstup s prijatym znakem v ACC a CY
+       INC   R1
+       CALL  CMP_END
+       JC    V3_ERR
+       CALL  SND_SPC         ; Prijem checksum
+       JB    AC,REC_EN3
+       CALL  SND_SPC
+       JB    AC,REC_EN3
+       CALL  SND_SPC
+       JB    AC,REC_EN3
+       CALL  SND_SPC
+       JB    AC,REC_EN3
+REC_E3N:CALL  SND_SPC
+       JB    AC,REC_EN3
+       SJMP  V3_ERR
+REC_EN3:JC    V3_ERR
+       XRL   A,R1
+       MOV   R1,#uL_NAK
+       JNZ   REC_EN4         ; Pri chybe a ARQ nebo AAP vysle NAK
+       MOV   R1,#uL_ACK      ; Pri   OK  a ARQ vysle ACK
+       MOV   A,R0            ; Pri   OK  a AAP je R1=ACK ale vysle
+       JB    ACC.1,REC_EN5   ;  az prooceed rutina
+REC_EN4:MOV   A,R0
+       JNB   ACC.0,REC_EN5
+       SETB  REN
+       CALL  SND_SPT
+       CALL  SND_SPC
+       MOV   A,R1
+       CALL  SND_CHR
+REC_EN5:CJNE  R1,#uL_NAK,REC_EN6
+V3_ERR: JMP   S_ERR
+REC_EN6:MOV   A,R0
+       RET
+
+; Pocatek ramce bez urceni Destignation Address
+
+SND_BEB:MOV   A,uL_CMD        ; Vysilany prikaz
+       ANL   A,#7FH
+       MOV   R0,A
+       MOV   A,#uL_BEG
+
+; Vyslani zacatku ramce
+; call: ACC  Destignation Address
+;       R0   CoMmanD
+
+SND_BEG:ANL   A,#07FH
+       MOV   R1,A
+       CALL  SND_SPT
+       CALL  SND_SPS
+       MOV   A,R0            ; Vysilany prikaz
+       MOV   uL_CMD,A        ; Zapis CMD
+       MOV   A,R1            ; Sdresa spojeni
+       MOV   uL_SA,A         ; Zapis SA
+       INC   R1
+       CALL  SND_CTR         ; Destignation Address nebo uL_BEG
+       MOV   A,uL_ADR        ; Vlastni adresa
+       XRL   AR1,A
+       INC   R1
+       CALL  SND_CHR
+       MOV   A,R0
+       XRL   AR1,A
+       INC   R1
+       JMP   SND_CHR
+
+; Nacteni zacatku ramce
+; call: R1=uL_BEG je Selected WAIT jinak Pasive WAIT
+; ret:  ACC  Source Address
+;       R0   CoMmanD
+
+REC_BEG:MOV   R1,#uL_BEG       ; Cekani ze SWAIT
+       MOV   R0,#9
+REC_BE1:CALL  WTF_CHR
+       JNB   AC,REC_BE1
+REC_BE2:JNC   V4_ERR
+       JB    uLF_NB,V4_ERR    ; Cekani z  PWAIT s R1=0
+       MOV   R0,A
+       JZ    REC_BE3         ; Obecna adresa
+       XRL   A,uL_ADR
+       JZ    REC_BE3         ; Vlastni adresa
+       CJNE  R1,#uL_BEG,V4_ERR
+       CJNE  A,#uL_BEG,S_EWAIT    ; S_BEG a SWAIT
+REC_BE3:MOV   AR1,R0          ; **********************
+       INC   R1              ; V R1 se bude pocitat chksum
+       MOV   R0,#5
+REC_BE4:CALL  WTF_CHR
+       JNB   AC,REC_BE4
+       JC    V4_ERR
+       XRL   AR1,A
+       INC   R1
+       MOV   R0,A
+REC_BE5:CALL  REC_CHR
+       JNB   AC,REC_BE5      ; Cekani na  CMD -prikaz
+       JC    V4_ERR
+       XRL   AR1,A
+       INC   R1
+       MOV   uL_CMD,A        ; Zapis CMD
+       XCH   A,R0
+       MOV   uL_SA,A         ; Zapis SA
+       RET
+
+; Cekani na konec bloku pri REC_BEG a SWAIT
+S_EWAIT:CALL  REC_CTR
+       JNB   AC,S_EWAIT
+       CALL  CMP_END
+       JC    V4_ERR
+       MOV   A,R0
+       JNB   ACC.0,REC_BEG
+       MOV   R0,#5
+S_EWAI1:CALL  WTF_CHR
+       JNB   AC,S_EWAI1
+       JNC   REC_BEG
+V4_ERR:        JMP   S_ERR
+
+; Vrati v R0  0..S_END,1..S_ARQ,2..S_PRQ,3..S_AAP,JINAK CY
+CMP_END:JNC   CMP_EN4
+CMP_EN0:MOV   R0,#0
+       CJNE  A,#uL_END,CMP_EN1
+       RET
+CMP_EN1:INC   R0
+       CJNE  A,#uL_ARQ,CMP_EN2
+       RET
+CMP_EN2:INC   R0
+       CJNE  A,#uL_PRQ,CMP_EN3
+       RET
+CMP_EN3:INC   R0
+       CJNE  A,#uL_AAP,CMP_EN4
+       RET
+CMP_EN4:SETB  C
+       RET
+
+%IF (%DEBUG_FL) THEN (
+; Priprava pro cteni a zapis pameti
+
+S_PRPMM:MOV   R0,#BEG_PB
+       MOV   A,@R0
+       MOV   R4,A
+       INC   R0
+       MOV   A,@R0
+       MOV   R7,A
+       INC   R0
+       MOV   A,@R0
+       MOV   R2,A
+       INC   R0
+       MOV   A,@R0
+       MOV   R3,A
+       INC   R0
+       MOV   A,@R0
+       MOV   R6,A
+       INC   R0
+       MOV   A,@R0
+       XCH   A,R7
+       MOV   R0,A
+       CJNE  R4,#9,S_PRPM2
+       MOV   A,#SP_BUF
+       SJMP  S_PRPM4
+S_PRPM2:CJNE  R4,#8,S_PRPM3
+       MOV   A,SP_BUF
+       INC   A
+       SJMP  S_PRPM4
+S_PRPM3:CJNE  R4,#7,S_PRPM5
+       MOV   R0,SP_BUF
+       DEC   R0
+       MOV   A,@R0
+       ANL   A,#18H
+S_PRPM4:ADD   A,R2
+       MOV   R2,A
+       MOV   R4,#1
+S_PRPM5:MOV   AR5,R4
+)FI
+; Pricte k R67 R23
+
+AR67R23:MOV   A,R6
+       ADD   A,R2
+       MOV   R6,A
+       MOV   A,R7
+       ADDC  A,R3
+       MOV   R7,A
+       CLR   C
+       SUBB  A,R5
+       JC    AR67R6R
+       ADD   A,R4
+       MOV   R7,A
+AR67R6R:RET
+
+;=================================================================
+
+RSEG    PLAN__C
+
+uL_FNC: SETB  F0
+       RET
+
+uL_STR: JBC   ES,uL_STRG
+       RET
+uL_STRG:MOV   C,EA
+       CLR   EA
+       JNB   uLF_NA,uL_STRE
+       JNB   uLF_NB,uL_STRF
+       JNB   uLF_RS,uL_STRF
+       SETB  TI
+uL_STRF:SETB  uLF_NB
+uL_STRE:SETB  uLF_NA
+       SETB  ES
+       MOV   EA,C
+       RET
+
+uL_SND: SETB  uLF_RS
+       JB    uLF_NB,uL_SN1
+       JB    ES,uL_SN1
+       SETB  TI
+uL_SN1:        RET
+
+_uL_INIT:CLR   ES            ; Funkce spusti RS485
+       CLR   ET1            ; R7 = baud divisor, R5 - adresa ucastnika
+%IF (%DR_EO_NG) THEN (
+       CLR   DR_EO
+)ELSE(
+       SETB  DR_EO
+)FI
+;      CLR   DR_EI
+;      SETB  PS
+;      CLR   PT1
+       ANL   TMOD,#00FH
+       ORL   TMOD,#020H
+       MOV   SCON,#11010000B
+       ORL   PCON,#10000000B ; Bd = OSC/12/16/(256-TH1)
+       MOV   A,R7
+       JNZ   uL_INI1
+       MOV   A,#S_SPEED
+uL_INI1:CPL   A
+       INC   A
+       MOV   TH1,A
+       SETB  TR1
+        MOV   A,R5            ;adresa
+       MOV   uL_ADR,A
+       CLR   A
+       MOV   SP_BUF,A
+       MOV   uL_FLG,A
+       MOV   R0,#BEG_IB
+       MOV   @R0,A
+       MOV   R0,#BEG_OB
+       MOV   @R0,A
+       MOV   SBUF,#0
+%IF (%VECTOR_FL) THEN (
+       MOV   R4,#SINT
+       MOV   DPTR,#S_INT
+       CALL  VEC_SET
+) FI
+       SETB  ES
+       RET
+
+       END
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/plan.h b/ulan/embedded/arch/mcs51/generic/libs/plan/plan.h
new file mode 100644 (file)
index 0000000..7f8ec4e
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef _plan_h
+#define _plan_h
+
+
+//******************************************************************************
+// Prikazy posilane linkou
+// 00H .. 3FH    uloz do bufferu
+// 40H .. 7FH    uloz do bufferu bez ACK
+// 80H .. 9FH    okamzite proved a konci
+// A0H .. BFH    proved a prijimej
+// C0H .. FFH    proved a vysilej
+
+//******************************************************************************
+//Rizeni linky - prikazy
+#define        uL_ERRI         0xFF            //Ignoruj vse doslo k chybe
+#define                uL_ERR          0x7F            //Chyba v datech
+#define                uL_END          0x7C            //Konec dat
+#define                uL_ARQ          0x7A            //Konec dat - vysli ACK
+#define                uL_PRQ          0x79            //Konec dat - proved prikaz
+#define                uL_AAP          0x76            //ARQ + PRQ
+#define                uL_BEG          0x75H           //Zacatek dat
+
+//******************************************************************************
+//Potvrzovaci zpravy
+#define                uL_ACK          0x19            //Potvrzeni
+#define                uL_NAK          0x7F            //Doslo k chybe
+#define                uL_WAK          0x25            //Ted nemohu splnit
+
+//******************************************************************************
+extern code ACK_CMD(),SND_BEB(),SND_CHC(),SND_END(),S_WAITD(),NAK_CMD();
+extern code REC_BEG(),REC_CHR(),REC_END,REC_CME();
+extern code REC_Bi(),SND_Bi(),SND_Bc();
+extern data unsigned char uL_ADR,uL_CMD,uL_SA;
+extern idata unsigned char BEG_PB[],BEG_OB[],BEG_IB[];
+
+//******************************************************************************
+//Rutiny pro spolupraci s PLAN mino preruseni
+extern bit uLF_ERR,uLF_SN,uLF_RS,uLF_NB,uLF_NA;
+extern code uL_INIT(unsigned char bauderate,unsigned char sadr),uL_STR(),uL_SND();
+
+typedef struct ul_idstr_t {
+  char *name;
+  char len; 
+} ul_idstr_t;
+
+//*****************************************************************************
+unsigned char 
+pl_send(unsigned char dadr,unsigned char req,unsigned char *pmsg,unsigned char len);
+unsigned char 
+pl_recv(unsigned char *sadr,unsigned char *req,unsigned char *pmsg,unsigned char *len);
+
+#endif /* _plan_h */
diff --git a/ulan/embedded/arch/mcs51/generic/libs/plan/ul_idstr.c b/ulan/embedded/arch/mcs51/generic/libs/plan/ul_idstr.c
new file mode 100644 (file)
index 0000000..ff8feb4
--- /dev/null
@@ -0,0 +1,14 @@
+#include <cpu_def.h>
+#include <plan.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#define NAME ".mt " \
+            STRINGIFY(APPID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            " .c " \
+              __DATE__ " " __TIME__
+
+ul_idstr_t CODE ul_idstr = {NAME, sizeof(NAME)-1};
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Entries b/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Entries
new file mode 100644 (file)
index 0000000..149f45a
--- /dev/null
@@ -0,0 +1,18 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.6/Wed Feb  1 20:51:55 2006//
+/config-hisc-boot.inc/1.2/Sun Nov 20 18:09:33 2005//
+/config-hisc.inc/1.4/Wed Nov 22 19:32:15 2006//
+/config-ps1.inc/1.1/Wed Nov 16 22:22:30 2005//
+/config-rja2000-boot.inc/1.2/Sun Nov 20 20:22:14 2005//
+/config-rja2000.inc/1.1/Wed Nov 16 22:22:30 2005//
+/config-ulad21-boot.inc/1.3/Sun Nov 20 20:22:14 2005//
+/config-ulad21-u2u.inc/1.2/Sun Nov 20 18:09:33 2005//
+/config-ulad21.inc/1.2/Sun Nov 20 18:09:33 2005//
+/reg1210.inc/1.1/Mon Oct  3 12:43:25 2005//
+/ul_drv_fnc.c/1.3/Mon Nov 28 13:07:02 2005//
+/ul_drv_fnc.h/1.3/Tue Jan 31 12:20:46 2006//
+/ul_idstr.c/1.6/Wed Feb  1 20:51:55 2006//
+/ul_l_c2a.c/1.4/Mon Jan  8 20:27:22 2007//
+/ulan.asm/1.16/Sat Jan 20 09:30:54 2007//
+/ulan.h/1.9/Thu Nov  9 23:18:56 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Repository b/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Repository
new file mode 100644 (file)
index 0000000..5e4369c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/generic/libs/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Root b/ulan/embedded/arch/mcs51/generic/libs/ulan/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile b/ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile.omk b/ulan/embedded/arch/mcs51/generic/libs/ulan/Makefile.omk
new file mode 100644 (file)
index 0000000..fe7a456
--- /dev/null
@@ -0,0 +1,33 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_ULAN=n
+default_CONFIG += CONFIG_ULOI_LT=x
+default_CONFIG += CONFIG_ULAN_DY=x
+
+ifeq ($(CONFIG_ULAN),y)
+
+default_CONFIG += MACH=$(MACH)
+default_CONFIG += ULAN_ID=$(ULAN_ID)
+
+LOCAL_CONFIG_H = ulan_config.h
+
+renamed_include_HEADERS = ulan.h->ul_lib/ulan.h 
+
+INCLUDES += -I . 
+
+lib_LIBRARIES = ulan
+
+asm_build_HEADERS = \
+reg1210.inc->reg1210.inc
+
+asm_build_HEADERS += \
+config-$(ULAN_CFG).inc->cf_ulan.inc
+
+ulan_SOURCES = ul_l_c2a.c ulan.asm ul_idstr.c
+
+ifeq ($(CONFIG_ULAN_DY),y)
+include_HEADERS  += ul_drv_fnc.h
+ulan_SOURCES += ul_drv_fnc.c
+endif #CONFIG_ULAN_DY
+
+endif #CONFIG_ULAN
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc-boot.inc
new file mode 100644 (file)
index 0000000..5230051
--- /dev/null
@@ -0,0 +1,28 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (0)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (0)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (0)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (0)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (0)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (1)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (1)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (1)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0          ; Pridavna hodnota pro stack
+
+END_RAM XDATA 08800H                    ; Konec pameti
+LENG_IB EQU   1                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   1                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.5              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
+%DEFINE        (CPU_SYS_HZ)  (11059200) ; Hodinova frekvence potrebna pro flashovani MSC
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-hisc.inc
new file mode 100644 (file)
index 0000000..c0caef0
--- /dev/null
@@ -0,0 +1,28 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (1)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (1)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (0)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (0)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (0)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (1)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (1)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (1)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   5          ; Pridavna hodnota pro stack - ainterrupts
+
+END_RAM XDATA 08800H            ; Konec pameti
+LENG_IB EQU   1                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   1                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.5              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
+%DEFINE        (CPU_SYS_HZ)  (11059200) ; Hodinova frekvence potrebna pro flashovani MSC
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ps1.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ps1.inc
new file mode 100644 (file)
index 0000000..cff29a7
--- /dev/null
@@ -0,0 +1,27 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (0)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (1)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (1)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (1)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (1)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (0)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (0)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (0)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0          ; Pridavna hodnota pro stack
+
+END_RAM XDATA 0F000H                    ; Konec pameti
+LENG_IB EQU   32                ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   8                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.4              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000-boot.inc
new file mode 100644 (file)
index 0000000..501f468
--- /dev/null
@@ -0,0 +1,27 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (0)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (0)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (1)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (0)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (1)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (0)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (1)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (0)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0                  ; Pridavna hodnota pro stack
+
+END_RAM XDATA 0300H             ; Konec pameti
+LENG_IB EQU   1                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   1                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.7              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-rja2000.inc
new file mode 100644 (file)
index 0000000..3995dbb
--- /dev/null
@@ -0,0 +1,27 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (1)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (1)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (1)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (0)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (1)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (0)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (1)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (1)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (0)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   15                 ; Pridavna hodnota pro stack
+
+END_RAM XDATA 0700H             ; Konec pameti
+LENG_IB EQU   1                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   1                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.7              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-boot.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-boot.inc
new file mode 100644 (file)
index 0000000..f58b44a
--- /dev/null
@@ -0,0 +1,28 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (0)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (0)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (0)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (0)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (0)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (1)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (1)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (1)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0          ; Pridavna hodnota pro stack
+
+END_RAM XDATA 08800H                    ; Konec pameti
+LENG_IB EQU   1                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   1                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.5              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
+%DEFINE        (CPU_SYS_HZ)  (18432000) ; Hodinova frekvence potrebna pro flashovani MSC
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-u2u.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21-u2u.inc
new file mode 100644 (file)
index 0000000..7729c7a
--- /dev/null
@@ -0,0 +1,28 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (1)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (1)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (0)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (1)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (0)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (1)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (0)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (1)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0          ; Pridavna hodnota pro stack
+
+END_RAM XDATA 0F000H                    ; Konec pameti
+LENG_IB EQU   32                        ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   8                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.5              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
+%DEFINE        (CPU_SYS_HZ)  (18432000) ; Hodinova frekvence potrebna pro flashovani MSC
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/config-ulad21.inc
new file mode 100644 (file)
index 0000000..1290309
--- /dev/null
@@ -0,0 +1,28 @@
+
+%DEFINE (FOR_SDCC)       (1)     ; The SDCC ASX8051 is used
+%DEFINE (VECTOR_FL)      (1)     ; Vyuzivaji se vektory preruseni v RAM
+%DEFINE (WITH_INTR)     (1)     ; Pouziva se prerusovaci rutina pro odber znaku
+%DEFINE (NEG_DR_EO)      (0)     ; Negovana hodnota DR_EO
+%DEFINE (WITH_TAILS)     (1)     ; Povolit podporu tailovanych zprav
+%DEFINE (CX_MERGED_FL)   (0)     ; CODE a XDATA zcela sloucena
+%DEFINE (TGT_T89C51RD2)  (0)     ; Kod pro T89C51RD2
+%DEFINE (TGT_MSC1210)    (1)     ; Kod pro MSC1210
+%DEFINE (DY_ADDR)        (0)     ; Dynamicka adresace bez vektoru
+%DEFINE (WITH_SYNCH)     (0)     ; Synchronizace casu
+
+%DEFINE        (SPN)            (1)     ; Cislo serioveho portu
+
+SER_STACK_EXT  EQU   0          ; Pridavna hodnota pro stack
+
+END_RAM XDATA 0F000H                    ; Konec pameti
+LENG_IB EQU   8                 ; Delka vstupniho bufferu v 256 bytu
+LENG_OB EQU   8                 ; Delka vystupniho bufferu
+S_SPEED EQU   3                 ; Bd=OSC/12/16/S_SPEED pro 19200 pri 11.0592 MHz
+S_FRLN  EQU   1024              ; maximalni delka ramce
+
+DR_EO   BIT   P3.5              ; Aktivni v dle NEG_DR_EO
+;DR_EO   BIT   P3.4                     ; Aktivni v dle NEG_DR_EO
+;DR_EI   BIT   P1.6                     ; Aktivni v 0 pro RS-486
+                                ; Aktivni v 1 pro RS-232
+
+%DEFINE        (CPU_SYS_HZ)  (18432000) ; Hodinova frekvence potrebna pro flashovani MSC
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/reg1210.inc b/ulan/embedded/arch/mcs51/generic/libs/ulan/reg1210.inc
new file mode 100644 (file)
index 0000000..ca1dbac
--- /dev/null
@@ -0,0 +1,244 @@
+; Texas Instruments
+; Name:        Reg1210.inc
+; Revision:    1.0
+; Description: Include file for TI MSC1210 microcontroller
+;$NOMOD51
+
+;$SAVE
+;$NOLIST
+
+;  BYTE Registers
+P0     DATA    080H    ;STANDARD 8051
+SP     DATA    081H    ;STANDARD 8051
+DPL    DATA    082H    ;STANDARD 8051
+DPH    DATA    083H    ;STANDARD 8051
+DPL1   DATA    084H
+DPH1   DATA    085H
+DPS    DATA    086H
+PCON   DATA    087H    ;STANDARD 8051
+TCON   DATA    088H    ;STANDARD 8051
+TMOD   DATA    089H    ;STANDARD 8051
+TL0    DATA    08AH    ;STANDARD 8051
+TL1    DATA    08BH    ;STANDARD 8051
+TH0    DATA    08CH    ;STANDARD 8051
+TH1    DATA    08DH    ;STANDARD 8051
+CKCON  DATA    08EH
+MWS    DATA    08FH
+P1     DATA    090H    ;STANDARD 8051
+EXIF   DATA    091H
+MPAGE  DATA    092H
+CADDR  DATA    093H
+CDATA  DATA    094H
+MCON   DATA    095H
+SCON   DATA    098H    ;STANDARD 8051
+SBUF   DATA    099H    ;STANDARD 8051
+SPICON DATA    09AH
+SPIDATA        DATA    09BH
+SPIRCON        DATA    09CH
+SPITCON        DATA    09DH
+SPISTRT        DATA    09EH
+SPIEND DATA    09FH
+P2     DATA    0A0H    ;STANDARD 8051
+PWMCON DATA    0A1H
+PWMLOW DATA    0A2H
+PWMHI  DATA    0A3H
+PAI    DATA    0A5H
+AIE    DATA    0A6H
+AISTAT DATA    0A7H
+IE     DATA    0A8H    ;STANDARD 8051
+BPCON  DATA    0A9H
+BPL    DATA    0AAH
+BPH    DATA    0ABH
+P0DDRL DATA    0ACH
+P0DDRH DATA    0ADH
+P1DDRL DATA    0AEH
+P1DDRH DATA    0AFH
+P3     DATA    0B0H    ;STANDARD 8051
+P2DDRL DATA    0B1H
+P2DDRH DATA    0B2H
+P3DDRL DATA    0B3H
+P3DDRH DATA    0B4H
+IP     DATA    0B8H    ;STANDARD 8051
+SCON1   DATA   0C0H
+SBUF1   DATA   0C1H
+EWU    DATA    0C6H
+T2CON   DATA   0C8H    ;8052 REGISTER
+RCAP2L  DATA   0CAH    ;8052 REGISTER
+RCAP2H  DATA   0CBH    ;8052 REGISTER
+TL2    DATA    0CCH    ;8052 REGISTER
+TH2    DATA    0CDH    ;8052 REGISTER
+PSW    DATA    0D0H    ;STANDARD 8051
+OCL    DATA    0D1H
+OCM    DATA    0D2H
+OCH    DATA    0D3H
+GCL    DATA    0D4H
+GCM    DATA    0D5H
+GCH    DATA    0D6H
+ADMUX  DATA    0D7H
+EICON  DATA    0D8H
+ADRESL DATA    0D9H
+ADRESM DATA    0DAH
+ADRESH DATA    0DBH
+ADCON0 DATA    0DCH
+ADCON1 DATA    0DDH
+ADCON2 DATA    0DEH
+ADCON3 DATA    0DFH
+ACC    DATA    0E0H    ;STANDARD 8051
+SSCON  DATA    0E1H
+SUMR0  DATA    0E2H
+SUMR1  DATA    0E3H
+SUMR2  DATA    0E4H
+SUMR3  DATA    0E5H
+ODAC   DATA    0E6H
+LVDCON DATA    0E7H
+EIE    DATA    0E8H
+HWPCO  DATA    0E9H
+HWPC1  DATA    0EAH
+HWID   DATA    0EBH
+;RSRVD DATA    0ECH
+;RSVRD DATA    0EDH
+FMCON  DATA    0EEH
+FTCON  DATA    0EFH
+B      DATA    0F0H    ;STANDARD 8051
+PDCON  DATA    0F1H
+PASEL  DATA    0F2H
+;RSRVD DATA    0F3H
+;RSRVD DATA    0F4H
+ACLK   DATA    0F6H
+SRST   DATA    0F7H
+EIP    DATA    0F8H
+SECINT DATA    0F9H
+MSINT  DATA    0FAH
+USEC   DATA    0FBH
+MSECL  DATA    0FCH
+MSECH  DATA    0FDH
+HMSEC  DATA    0FEH
+WDTCON DATA    0FFH
+
+
+;  BIT Registers
+; *** TCON (088H) ***
+TF1    BIT     08FH
+TR1    BIT     08EH
+TF0    BIT     08DH
+TR0    BIT     08CH
+IE1    BIT     08BH
+IT1    BIT     08AH
+IE0    BIT     089H
+IT0    BIT     088H
+
+; *** P1 (090H) ***
+INT5   BIT     097H
+INT4   BIT     096H
+INT3   BIT     095H
+INT2   BIT     094H
+TXD1   BIT     093H
+RXD1   BIT     092H
+T2EX   BIT     091H
+T2     BIT     090H
+
+; *** SCON (098H) ***
+SM0    BIT     09FH
+SM1    BIT     09EH
+SM2    BIT     09DH
+REN    BIT     09CH
+TB8    BIT     09BH
+RB8    BIT     09AH
+TI     BIT     099H
+RI     BIT     098H
+
+; *** IE (0A8H) ***
+EA     BIT     0AFH
+ES1    BIT     0AEH
+ET2    BIT     0ADH
+ES     BIT     0ACH
+ET1    BIT     0ABH
+EX1    BIT     0AAH
+ET0    BIT     0A9H
+EX0    BIT     0A8H
+
+; *** P3 (0B0H) ***
+RD     BIT     0B7H
+WR     BIT     0B6H
+T1     BIT     0B5H
+T0     BIT     0B4H
+INT1   BIT     0B3H
+INT0   BIT     0B2H
+TXD0   BIT     0B1H
+RXD0   BIT     0B0H
+
+; *** IP (0B8H) ***
+PS1    BIT     0BEH
+PT2    BIT     0BDH
+PS     BIT     0BCH
+PT1    BIT     0BBH
+PX1    BIT     0BAH
+PT0    BIT     0B9H
+PX0    BIT     0B8H
+
+; *** SCON1 (0C0H) ***
+SM01   BIT     0C7H
+SM11   BIT     0C6H
+SM21   BIT     0C5H
+REN1   BIT     0C4H
+TB81   BIT     0C3H
+RB81   BIT     0C2H
+TI1    BIT     0C1H
+RI1    BIT     0C0H
+
+; *** T2CON (0C8H) ***
+TF2    BIT     0CFH
+EXF2   BIT     0CEH
+RCLK   BIT     0CDH
+TCLK   BIT     0CCH
+EXEN2  BIT     0CBH
+TR2    BIT     0CAH
+C_T2   BIT     0C9H
+CP_RL2 BIT     0C8H
+
+; *** PSW (0D0H) ***
+CY     BIT     0D7H
+AC     BIT     0D6H
+F0     BIT     0D5H
+RS1    BIT     0D4H
+RS0    BIT     0D3H
+OV     BIT     0D2H
+F1     BIT     0D1H
+P      BIT     0D0H
+
+; *** EICON (0D8H) ***
+SMOD1  BIT     0DFH
+EAI    BIT     0DDH
+AI     BIT     0DCH
+WDTI   BIT     0DBH
+
+; *** EIE (0E8H) ***
+EWDI   BIT     0ECH
+EX5    BIT     0EBH
+EX4    BIT     0EAH
+EX3    BIT     0E9H
+EX2    BIT     0E8H
+
+; *** EIP (0F8H) ***
+PWDI   BIT     0FCH
+PX5    BIT     0FBH
+PX4    BIT     0FAH
+PX3    BIT     0F9H
+PX2    BIT     0F8H
+
+; *** Reg ***
+Reg0   Data    00H
+Reg1   Data    01H
+Reg2   Data    02H
+Reg3   Data    03H
+Reg4   Data    04H
+Reg5   Data    05H
+Reg6   Data    06H
+Reg7   Data    07H
+RegB   Data    0F0H
+
+; *** interrupts ***
+SINT0  CODE    0023H
+SINT1  CODE    003BH
+
+;$RESTORE
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.c b/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.c
new file mode 100644 (file)
index 0000000..affd5ec
--- /dev/null
@@ -0,0 +1,177 @@
+#include <cpu_def.h>
+#include "ul_drv_fnc.h"
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+data uchar ul_dy_len;
+#endif /* SDCC_MODEL_LARGE */
+#endif /* SDCC */
+
+#ifdef SDCC
+unsigned long ul_drv_get_sn() 
+{
+  _asm
+       mov  dptr,#ser_num
+       movx a,@dptr
+       mov  r2,a
+       inc  dptr
+       movx a,@dptr
+       mov  r3,a
+       inc  dptr
+       movx a,@dptr
+       mov  b,a
+       inc  dptr
+       movx a,@dptr
+       mov  dpl,r2
+       mov  dph,r3
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+void ul_drv_set_sn(unsigned long sn) 
+{
+  _asm
+       mov  r2,a
+       mov  r3,dpl
+       mov  r4,dph
+       mov  dptr,#ser_num
+       mov  a,r3
+       movx @dptr,a
+       inc  dptr
+       mov  a,r4
+       movx @dptr,a
+       inc  dptr
+       mov  a,b
+       movx @dptr,a
+       inc  dptr
+       mov  a,r2
+       movx @dptr,a
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+
+#ifdef SDCC
+ul_idstr_t *ul_drv_get_idstr() 
+{
+  _asm
+       mov  dptr,#_ul_idstr
+       mov  b,#0x80
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+unsigned char ul_drv_get_adr()
+{
+  _asm
+       mov  dptr,#ul_adr
+       movx a,@dptr
+       mov  dpl,a
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+unsigned char ul_drv_get_dysa()
+{
+  _asm
+       mov  dptr,#ud_dysa
+       movx a,@dptr
+       mov  dpl,a
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+char ul_drv_rqa() UL_FNC_NAKED
+{ 
+  _asm
+       .globl ul_t_rqa
+       lcall ul_t_rqa
+       mov   dpl,a
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+void ul_drv_clr_rq() 
+{ 
+  _asm
+       mov  a,ul_fld
+       anl  a,#0xF8
+       mov  ul_fld,a
+  _endasm;
+}
+#else
+#error "unsuported compiler!"
+#endif
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+void ul_drv_set_status(uchar UL_ARGPTRTYPE *status,uchar len) 
+{
+  ul_dy_len=len;
+  _asm
+       mov  r2,dpl
+       mov  r3,dph
+       mov  dptr,#ud_stad
+       mov  a,r2
+       movx @dptr,a
+       inc  dptr
+       mov  a,r3
+       movx @dptr,a
+       inc  dptr
+       mov  a,_ul_dy_len
+       movx @dptr,a   
+  _endasm;
+}
+#else
+void ul_drv_set_status(uchar UL_ARGPTRTYPE *status,uchar len) UL_FNC_REENTRANT UL_FNC_NAKED
+{
+  _asm
+       mov  a,sp
+    #ifdef UL_WITH_NAKED
+       add  a,#-3
+    #else /*UL_WITH_NAKED*/
+       add  a,#-4
+    #endif /*UL_WITH_NAKED*/
+       mov  r0,a
+       mov  a,@r0
+       mov  r4,a
+       mov  r2,dpl
+       mov  r3,dph
+       mov  dptr,#ud_stad
+       mov  a,r2
+       movx @dptr,a
+       inc  dptr
+       mov  a,r3
+       movx @dptr,a
+       inc  dptr
+       mov  a,r4
+       movx @dptr,a
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else
+#error "unsuported compiler!"
+#endif
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.h b/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_drv_fnc.h
new file mode 100644 (file)
index 0000000..ee0af8a
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _UL_DRV_FNC_H
+#define _UL_DRV_FNC_H
+
+#include <ul_lib/ulan.h>
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+unsigned long ul_drv_get_sn();
+void ul_drv_set_sn(unsigned long sn);
+ul_idstr_t *ul_drv_get_idstr();
+void ul_drv_set_status(uchar UL_ARGPTRTYPE *status,uchar len) UL_FNC_REENTRANT UL_FNC_NAKED;
+unsigned char ul_drv_get_adr();
+unsigned char ul_drv_get_dysa();
+char ul_drv_rqa() UL_FNC_NAKED;
+void ul_drv_clr_rq();
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_DYAC_H */
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_idstr.c b/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_idstr.c
new file mode 100644 (file)
index 0000000..3b1ee22
--- /dev/null
@@ -0,0 +1,29 @@
+#include <cpu_def.h>
+#include <ul_lib/ulan.h>
+#include <ulan_config.h>
+
+#define __STRINGIFY(x)     #x              /* stringify without expanding x */
+#define STRINGIFY(x)    __STRINGIFY(x)        /* expand x, then stringify */
+
+#ifdef CONFIG_ULAN_DY
+  #define UL_DYC " .dy"
+#else
+  #define UL_DYC
+#endif
+
+#ifdef CONFIG_ULOI_LT
+  #define UL_OIC " .oi"
+#else
+  #define UL_OIC
+#endif
+
+#define NAME ".mt " \
+            STRINGIFY(ULAN_ID) \
+            " .uP " \
+            STRINGIFY(MACH) \
+            UL_DYC \
+            UL_OIC \
+            " .co " \
+              __DATE__ " " __TIME__
+
+ul_idstr_t CODE ul_idstr = {NAME, sizeof(NAME)-1};
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_l_c2a.c b/ulan/embedded/arch/mcs51/generic/libs/ulan/ul_l_c2a.c
new file mode 100644 (file)
index 0000000..2387063
--- /dev/null
@@ -0,0 +1,942 @@
+/*******************************************************************
+  uLan Communication - version for generic MCS51 core based MCU
+
+  ul_l_c2a.c      - C language bindings to low level assembly
+                    implementation
+
+  Copyright holders and originators:
+      (C) 2002-2003 by Pavel Pisa pisa@cmp.felk.cvut.cz
+      (C) 2002-2003 by PiKRON Ltd. http://www.pikron.com
+
+  The more uLan related information can be foud at next sites
+            http://cmp.felk.cvut.cz/~pisa/ulan/
+            http://www.pikron.com/en/chromul_over.html
+
+  The uLan for small embedded devices can be used, modified
+  and redistributed if at least conditions of one of the
+  following licenses are met
+     - GPL - General Public License
+     - LGPL - Lesser General Public License
+     - MPL - Mozilla Public License
+     - other license conditions assigned by originators
+
+  If significant code contributor disagrees with some of above
+  licenses, he or she can delete such line/s, but if he deletes
+  all lines, he is not allowed redistribute code in any binary
+  or source form.
+
+ *******************************************************************/
+
+
+/*#define  UL_WITH_HANDLE*/
+
+#include "ulan.h"
+
+/*pragma LESS_PEDANTIC*/
+
+#define SDCC_PTR_DATA 0x40
+#define SDCC_PTR_XDATA 0x00
+#define SDCC_PTR_CODE 0x80
+
+#define KEIL_PTR_DATA 0x00
+#define KEIL_PTR_XDATA 0x01
+#define KEIL_PTR_CODE 0x02
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+data int ul_c2a_len;
+#endif /* SDCC_MODEL_LARGE */
+#endif /*SDCC*/
+
+#ifndef UL_WITH_HANDLE
+ul_fd_t        ul_fd;
+ul_msginfo xdata msginfo;
+#endif
+
+ul_fd_t        ul_open(const char *dev_name, const char *options)
+{
+  return 1;
+}
+
+int ul_close(ul_fd_t ul_fd)
+{
+  return 0;
+}
+
+#ifdef SDCC
+ul_ssize_t __ul_read_avail() UL_FNC_NAKED
+{
+  _asm
+       .globl ul_i_l
+       clr  f0
+       lcall ul_i_l
+       mov  dpl,r4
+       mov  dph,r5
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+
+ul_ssize_t __ul_read_avail(void) UL_FNC_NAKED
+{
+  #pragma asm
+       extrn code(UL_I_L)
+       clr  f0
+       call UL_I_L
+       mov  a,r4
+       mov  r7,a
+       mov  a,r5
+       mov  r6,a
+  #pragma endasm
+}
+#endif /* SDCC */
+
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+/* ul_read function for small model */
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED
+{
+  ul_c2a_len=size;
+  _asm
+       .globl ul_rd
+       mov  r4,_ul_c2a_len
+       mov  r5,_ul_c2a_len+1
+       clr  f0
+       jb    b.6,00001$ /*SDCC_PTR_DATA*/
+       lcall ul_rd
+       sjmp 00002$
+00001$:        lcall ul_rdi
+00002$:        jb   f0,00004$
+       mov  dpl,_ul_c2a_len
+       mov  dph,_ul_c2a_len+1
+00003$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #else /*UL_WITH_NAKED*/
+       sjmp 00005$
+    #endif /*UL_WITH_NAKED*/
+00004$:
+       clr  c
+       mov  a,_ul_c2a_len
+       subb a,r4
+       mov  dpl,a
+       mov  a,_ul_c2a_len+1
+       subb a,r5
+       mov  dph,a
+    #if 0
+       orl  a,dpl
+       jnz  00003$
+       mov  dptr,#0xffff
+    #endif
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+00005$:
+  _endasm;
+}
+#else /* SDCC_MODEL_LARGE */
+/* For large model
+ * size   Allocated to stack - offset -4  (the push _bp taken into account)
+ * buffer Allocated to registers 
+ */
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) reentrant UL_FNC_NAKED 
+{
+  _asm
+       .globl ul_rd
+       mov  a,sp
+       clr  f0
+       mov  a,sp
+    #ifdef UL_WITH_NAKED
+       add  a,#-3
+    #else /*UL_WITH_NAKED*/
+       add  a,#-4
+    #endif /*UL_WITH_NAKED*/
+       mov  r0,a
+       mov  a,@r0
+       mov  r4,a
+       mov  r6,a
+       inc  r0
+       mov  a,@r0
+       mov  r5,a
+       mov  r7,a
+       jb    b.6,00001$  /*SDCC_PTR_DATA*/
+       lcall ul_rd
+       sjmp 00002$
+00001$:        lcall ul_rdi
+00002$:        jb   f0,00004$
+       mov  dpl,r6
+       mov  dph,r7
+00003$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #else /*UL_WITH_NAKED*/
+       sjmp 00005$
+    #endif /*UL_WITH_NAKED*/
+00004$:
+       clr  c
+       mov  a,r6
+       subb a,r4
+       mov  dpl,a
+       mov  a,r7
+       subb a,r5
+       mov  dph,a
+    #if 0
+       orl  a,dpl
+       jnz  00003$
+       mov  dptr,#0xffff
+    #endif
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+00005$:
+  _endasm;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else /* SDCC */
+
+#pragma asm
+;ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
+;{
+       extrn code(UL_RD,UL_RDi)
+       public ___ul_read
+___ul_read:
+       mov  dpl,r1     ; buffer address into DPTR
+       mov  dph,r2
+       mov  a,r4       ; number of bytes to write
+       mov  r6,a
+       xch  a,r5       ; into R45 little endian
+       mov  r4,a
+       mov  r7,a
+       clr  f0
+       mov  a,R3
+/*     cjne A,#KEIL_PTR_XDATA,__ul_read_l1 */
+       cjne A,#01h,__ul_read_l1
+       call UL_RD      ; call read => R45 number of remaining
+       sjmp __ul_read_l2 ; bytes, DPTR moved after read data
+__ul_read_l1:
+       call UL_RDi
+__ul_read_l2:
+       jnb  f0,__ul_read_l3
+       clr  c
+       mov  a,r7
+       subb a,r4
+       mov  r7,a
+       mov  a,r6       ; compute number of read bytes => R76
+       subb a,r5
+       mov  r6,a
+    #if 0
+       orl  a,r7
+       jnz  __ul_read_l3
+       dec  r6         ; return -1 if no byte read
+       dec  r7
+    #endif
+__ul_read_l3:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+/* ul_write function for small model */
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED
+{
+  ul_c2a_len=size;
+  _asm
+       .globl ul_wr
+       .globl ul_wrc
+       .globl ul_wri
+       mov  r4,_ul_c2a_len
+       mov  r5,_ul_c2a_len+1
+       clr  f0
+       jnb   b.6,00001$  /*SDCC_PTR_DATA*/
+       lcall ul_wri
+       sjmp 00003$
+00001$:
+       jnb   b.7,00002$  /*SDCC_PTR_CODE*/
+       lcall ul_wrc
+       sjmp 00003$
+00002$:
+       lcall ul_wr
+00003$:
+       jb   f0,00004$
+       mov  dpl,_ul_c2a_len
+       mov  dph,_ul_c2a_len+1
+    #ifdef UL_WITH_NAKED
+       ret
+    #else /*UL_WITH_NAKED*/
+       sjmp 00005$
+    #endif /*UL_WITH_NAKED*/
+00004$:
+       mov  dptr,#0xffff
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+00005$:
+  _endasm;
+}
+#else /* SDCC_MODEL_LARGE */
+/* For large model
+ * size   Allocated to stack - offset -4 (the push _bp taken into account)
+ * buffer Allocated to registers
+ */
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) reentrant UL_FNC_NAKED
+{
+  _asm
+       .globl ul_wr
+       .globl ul_wrc
+       .globl ul_wri
+       mov  a,sp
+       clr  f0
+       mov  a,sp
+    #ifdef UL_WITH_NAKED
+       add  a,#-3
+    #else /*UL_WITH_NAKED*/
+       add  a,#-4
+    #endif /*UL_WITH_NAKED*/
+       mov  r0,a
+       mov  a,@r0
+       mov  r4,a
+       mov  r6,a
+       inc  r0
+       mov  a,@r0
+       mov  r5,a
+       mov  r7,a
+       jnb   b.6,00001$  /*SDCC_PTR_DATA*/
+       lcall ul_wri
+       sjmp 00003$
+00001$:
+       jnb   b.7,00002$  /*SDCC_PTR_CODE*/
+       lcall ul_wrc
+       sjmp 00003$
+00002$:
+       lcall ul_wr
+00003$:
+       jb   f0,00004$
+       mov  dpl,r6
+       mov  dph,r7
+    #ifdef UL_WITH_NAKED
+       ret
+    #else /*UL_WITH_NAKED*/
+       sjmp 00005$
+    #endif /*UL_WITH_NAKED*/
+00004$:
+       mov  dptr,#0xffff
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+00005$:
+  _endasm;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else /* SDCC */
+
+#pragma asm
+;ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT
+;{
+       extrn code(UL_WR,UL_WRC,UL_WRI)
+       public ___ul_write
+___ul_write:
+       mov  dpl,r1     ; buffer address into DPTR
+       mov  dph,r2
+       mov  a,r4       ; number of bytes to write
+       mov  r6,a
+       xch  a,r5       ; into R45 little endian
+       mov  r4,a
+       mov  r7,a
+       clr  f0         ; call read => R45 number of remaining
+       mov  a,R3
+/*     cjne A,#KEIL_PTR_XDATA,__ul_write_l3 */
+       cjne A,#01h,__ul_write_l3 
+       call UL_WR      ; bytes, DPTR moved after read data
+       sjmp __ul_write_l2
+__ul_write_l3:
+/*     cjne A,#KEIL_PTR_CODE,__ul_write_l4 */
+       cjne A,#02h,__ul_write_l4
+       call UL_WRC
+       sjmp __ul_write_l2
+__ul_write_l4:
+/*     cjne A,#KEIL_PTR_DATA,__ul_write_l2 */
+       cjne A,#00h,__ul_write_l2
+       call UL_WRI
+__ul_write_l2:
+       jnb  f0,__ul_write_l1
+       mov  r6,#0ffh   ; return -1 if there was problem
+       mov  r7,#0ffh
+__ul_write_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+
+#ifdef SDCC
+int    __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+{
+  /* Dadr R4, Com R5, Status R6, Stamp R7 */
+  _asm
+       .globl ul_o_op
+       .globl ul_o_new
+       movx a,@dptr    /* dadr */
+       mov  r4,a
+       inc  dptr       /* sadr */
+       /*movx a,@dptr*/
+       /*uL_ISAD*/
+       inc  dptr
+       movx a,@dptr    /* cmd */
+       mov  r5,a
+       inc  dptr
+       movx a,@dptr    /* flg */
+       mov  r6,a
+       inc  dptr
+       movx a,@dptr    /* stamp */
+       mov  r7,a
+       clr  f0
+       lcall ul_o_new
+       mov  dptr,#0xffff
+       jb   f0,00020$
+       inc  dptr
+00020$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int   __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+;{
+;  /* Dadr R4, Com R5, Status R6, Stamp R7 */
+       extrn code(UL_O_OP)
+       extrn code(UL_O_NEW)
+       public ___ul_newmsg
+___ul_newmsg:  
+       mov  dpl,r7
+       mov  dph,r6
+       movx a,@dptr    ; dadr
+       mov  r4,a
+       inc  dptr       ; sadr 
+       inc  dptr
+       movx a,@dptr    ; cmd
+       mov  r5,a
+       inc  dptr
+       movx a,@dptr    ; flg
+       mov  r6,a
+       inc  dptr
+       movx a,@dptr    ; stamp
+       mov  r7,a
+       clr  f0
+       call UL_O_NEW
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       jnb  f0,__ul_newmsg_l1
+       dec  r7
+       dec  r6
+__ul_newmsg_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+int    __ul_o_close() UL_FNC_NAKED
+{
+  _asm
+       .globl ul_o_cl
+       clr  f0
+       lcall ul_o_cl
+       mov  dptr,#0xffff
+       jb   f0,00020$
+       inc  dptr
+00020$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int   __ul_o_close(void) UL_FNC_NAKED
+;{
+       extrn code(UL_O_CL)
+       public __ul_o_close
+__ul_o_close:  
+       clr  f0
+       call UL_O_CL
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       jnb  f0,__ul_o_close_l1
+       dec  r7
+       dec  r6
+__ul_o_close_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+int    __ul_i_close() UL_FNC_NAKED
+{
+  _asm
+       .globl ul_i_cl
+       clr  f0
+       lcall ul_i_cl
+       mov  dptr,#0xffff
+       jb   f0,00020$
+       inc  dptr
+00020$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int   __ul_i_close(void) UL_FNC_NAKED
+;{
+       extrn code(UL_I_CL)
+       public __ul_i_close
+__ul_i_close:  
+       clr  f0
+       call UL_I_CL
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       jnb  f0,___ul_i_close_l1
+       dec  r7
+       dec  r6
+___ul_i_close_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+int    __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+{
+  /* Dadr R4, Com R5, Status R6, Stamp R7 */
+  _asm
+       .globl ul_o_op
+       clr  f0
+       lcall ul_o_cl   /* close previous output message */
+       movx a,@dptr    /* dadr */
+       mov  r4,a
+       inc  dptr       /* sadr */
+       /*movx a,@dptr*/
+       /*uL_ISAD*/
+       inc  dptr
+       movx a,@dptr    /* cmd */
+       mov  r5,a
+       inc  dptr
+       movx a,@dptr    /* flg */       
+       mov  r6,a
+       inc  dptr
+       movx a,@dptr    /* stamp */
+       mov  r7,a
+       lcall ul_o_op
+       mov  dptr,#0xffff
+       jb   f0,00020$
+       inc  dptr
+00020$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int   __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+;{
+       public ___ul_tailmsg
+___ul_tailmsg: 
+       mov  dpl,r7
+       mov  dph,r6
+       call UL_O_CL    ; close previous output message
+       movx a,@dptr    ; dadr
+       mov  r4,a
+       inc  dptr       ; sadr
+       inc  dptr
+       movx a,@dptr    ; cmd
+       mov  r5,a
+       inc  dptr
+       movx a,@dptr    ; flg
+       mov  r6,a
+       inc  dptr
+       movx a,@dptr    ; stamp
+       mov  r7,a
+       call UL_O_OP
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       jnb  f0,___ul_tailmsg_l1
+       dec  r7
+       dec  r6
+___ul_tailmsg_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+int    __ul_freemsg() UL_FNC_NAKED
+{
+  _asm
+       .globl ul_o_op
+       clr f0
+       lcall ul_i_cl   /* close previous input message */
+       clr f0
+       lcall ul_o_cl   /* close previous output message */
+       mov  dptr,#0xffff
+       jb   f0,00020$
+       inc  dptr
+00020$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int   __ul_freemsg(void) UL_FNC_NAKED
+;{
+       public __ul_freemsg
+__ul_freemsg:  
+       clr  f0
+       call UL_I_CL    ; close previous input message
+       clr  f0
+       call UL_O_CL    ; close previous output message
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       jnb  f0,___ul_freemsg_l1
+       dec  r7
+       dec  r6
+___ul_freemsg_l1:
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+int __ul_acceptmsg(ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+{
+  /* Dadr R4, Com R5, Status R6, Stamp R7 */
+  _asm
+       .globl ul_i_op
+       .globl ul_i_l
+       clr  f0
+       lcall ul_i_op
+       jb   f0,00010$
+       mov  a,r3
+       movx @dptr,a    /* dadr */
+       inc  dptr
+       mov  a,r4
+       movx @dptr,a    /* sadr */
+       inc  dptr
+       mov  a,r5
+       movx @dptr,a    /* cmd */
+       inc  dptr
+       mov  a,r6
+       movx @dptr,a    /* flg */
+       inc  dptr
+       mov  a,r7
+       movx @dptr,a    /* stamp */
+       inc  dptr
+       lcall ul_i_l    /* read length of data */
+       mov  a,r4
+       movx @dptr,a    /* len */
+       inc  dptr
+       mov  a,r5
+       movx @dptr,a
+       mov  dptr,#0
+    #ifdef UL_WITH_NAKED
+       ret
+    #else /*UL_WITH_NAKED*/
+       sjmp 00030$
+    #endif /*UL_WITH_NAKED*/
+00010$:
+       mov  dptr,#0xffff
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+00030$:
+  _endasm;
+}
+#else /* SDCC */
+#pragma asm
+;int __ul_acceptmsg(ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+;{
+;  /* Dadr R4, Com R5, Status R6, Stamp R7 */
+       extrn code(UL_I_OP)
+       public ___ul_acceptmsg
+___ul_acceptmsg:
+       clr  f0
+       mov  dpl,r7
+       mov  dph,r6
+       lcall UL_I_OP
+       jb   f0,___ul_acceptmsg_l1
+       mov  a,r3
+       movx @dptr,a    ; dadr
+       inc  dptr
+       mov  a,r4
+       movx @dptr,a    ; sadr
+       inc  dptr
+       mov  a,r5
+       movx @dptr,a    ; cmd
+       inc  dptr
+       mov  a,r6
+       movx @dptr,a    ; flg
+       inc  dptr
+       mov  a,r7
+       movx @dptr,a    ; stamp
+       inc  dptr
+       lcall UL_I_L    ; read length of data
+       mov  a,r5
+       movx @dptr,a    ; len is bigendian
+       inc  dptr
+       mov  a,r4
+       movx @dptr,a
+       clr  a
+       mov  r7,a
+       mov  r6,a
+       ret
+___ul_acceptmsg_l1:
+       mov  r7,#0ffh
+       mov  r6,#0ffh
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+int __ul_actailmsg(ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED
+{
+  return -1;
+}
+
+int __ul_addfilt(const ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return -1;
+}
+
+#ifdef SDCC
+int __ul_abortmsg()
+{
+  _asm
+       .globl ul_o_abrt
+       lcall ul_i_cl
+       lcall ul_o_abrt
+  _endasm;
+  return 0;
+}
+#else /* SDCC */
+#pragma asm
+;int __ul_abortmsg(void)
+;{
+       public ___ul_abortmsg
+___ul_abortmsg:
+       extrn code(UL_O_ABRT)
+       call UL_I_CL
+       call UL_O_ABRT
+       ret
+;}
+#pragma endasm
+#endif /* SDCC */
+
+#ifdef SDCC
+uchar __ul_inepoll() UL_FNC_NAKED
+{
+  _asm
+       .globl ul_i_ne
+       lcall ul_i_ne
+       mov  dptr,#0
+       jnc  00050$
+       inc  dptr
+00050$:
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#else /*SDCC*/
+#pragma asm
+;uchar __ul_inepoll(void) UL_FNC_NAKED
+;{
+       extrn code(UL_I_NE)
+       public __ul_inepoll
+__ul_inepoll:
+       call UL_I_NE
+       mov  r7,#0
+       jnc  ___ul_inepoll_l1
+       inc  r7
+___ul_inepoll_l1:
+       ret
+;}
+#pragma endasm
+#endif /*SDCC*/
+
+#ifdef SDCC
+char ul_drv_init()
+{
+  _asm
+       .globl ul_init
+       mov  r0,#0
+       mov  r2,#0
+       lcall ul_fnc    /* Init */
+  _endasm;
+  return 0;
+}
+#else /*SDCC*/
+#pragma asm
+;char ul_drv_init()
+;{
+       extrn code(UL_INIT)
+       public ul_drv_init
+ul_drv_init:
+       mov  r0,#0
+       mov  r2,#0
+       jmp  UL_FNC     ; Init
+;  return 0;
+;}
+#pragma endasm
+#endif
+
+#ifdef SDCC
+char ul_drv_set_adr(uchar addr)
+{
+  _asm
+       .globl ul_fnc
+       mov  r0,#2
+       mov  a,dpl
+       lcall ul_fnc    /* Address */
+  _endasm;
+  return 0;
+}
+#else /*SDCC*/
+#pragma asm
+;char ul_drv_set_adr(uchar addr)
+;{
+       extrn code(UL_FNC)
+       public _ul_drv_set_adr
+_ul_drv_set_adr:
+       mov  r0,#2
+       mov  a,r7
+       jmp  UL_FNC     ; Address
+;  return 0;
+;}
+#pragma endasm
+#endif
+
+#ifdef SDCC
+char ul_drv_set_bdiv(uchar addr)
+{
+  _asm
+       .globl ul_fnc
+       mov  r0,#1      /* 2 => 19200 Bd for 11059 kHz */
+       mov  a,dpl      /* 5 => 19200 Bd for 18432 kHz */
+       lcall ul_fnc    /* Baudrate */
+  _endasm;
+  return 0;
+}
+#else /*SDCC*/
+#pragma asm
+;char ul_drv_set_bdiv(uchar addr)
+;{
+       public _ul_drv_set_bdiv
+_ul_drv_set_bdiv:
+       mov  r0,#1      ; 2 => 19200 Bd for 11059 kHz
+       mov  a,r7       ; 5 => 19200 Bd for 18432 kHz
+       jmp  UL_FNC     ; Baudrate
+;  return 0;
+;}
+#pragma endasm
+#endif
+
+#ifndef  UL_WITHOUT_HANDLE
+
+ul_ssize_t ul_read(ul_fd_t ul_fd,void *buffer, ul_size_t size)
+{
+  return __ul_read(buffer, size);
+}
+
+ul_ssize_t ul_write(ul_fd_t ul_fd,const void *buffer, ul_size_t size)
+{
+  return __ul_write(buffer, size);
+}
+
+int ul_newmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return __ul_newmsg(msginfo);
+}
+
+int ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return __ul_tailmsg(msginfo);
+}
+
+int ul_freemsg(ul_fd_t ul_fd)
+{
+  return __ul_freemsg();
+}
+
+int ul_acceptmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return __ul_acceptmsg(msginfo);
+}
+
+int ul_actailmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return __ul_actailmsg(msginfo);
+}
+
+int ul_addfilt(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo)
+{
+  return __ul_addfilt(msginfo);
+}
+
+int ul_abortmsg(ul_fd_t ul_fd)
+{
+  return __ul_abortmsg();
+}
+
+uchar ul_inepoll(ul_fd_t ul_fd)
+{
+  return __ul_inepoll();
+}
+#endif /*UL_WITHOUT_HANDLE*/
+
+int ul_drv_debflg(ul_fd_t ul_fd,int debug_msk)
+{
+  return 0;
+}
+
+int ul_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  return 0;
+}
+
+#if 0
+int test_fnc(int i)
+{
+  _asm
+       mov  a,#0xaa
+       mov  b,#0xbb
+       mov  r0,#0xc0
+       mov  r1,#0xc1
+       mov  r2,#0xc2
+       mov  r3,#0xc3
+       mov  r4,#0xc4
+       mov  r5,#0xc5
+       mov  r6,#0xc6
+       mov  r7,#0xc7
+       mov  dptr,#1
+    #ifdef UL_WITH_NAKED
+       ret
+    #endif /*UL_WITH_NAKED*/
+  _endasm;
+}
+#endif
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.asm b/ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.asm
new file mode 100644 (file)
index 0000000..c3edb38
--- /dev/null
@@ -0,0 +1,2578 @@
+;$NOMOD51
+;********************************************************************
+;*                                                                  *
+;* uLan Communication - version for generic MSC51 core based MCU    *
+;*                                                                  *
+;* ulan.asm        - low level assembly implementation of uLAN      *
+;*                   protocol implementation for MCS51              *
+;*                                                                  *
+;*                                                                  *
+;* Copyright holders and originators:                               *
+;*     (C) 1991-2003 by Pavel Pisa pisa@cmp.felk.cvut.cz            *
+;*     (C) 1992-2003 by PiSOFT Praha                                *
+;*     (C) 1994-2003 by PiKRON Ltd. http://www.pikron.com           *
+;*                                                                  *
+;*   The more uLan related information can be foud at next sites    *
+;*            http://cmp.felk.cvut.cz/~pisa/ulan/                   *
+;*            http://www.pikron.com/en/chromul_over.html            *
+;*                                                                  *
+;* The uLan for small embedded devices can be used, modified        *
+;* and redistributed if at least conditions of one of the           *
+;* following licenses are met                                       *
+;*     - GPL - General Public License                               *
+;*     - LGPL - Lesser General Public License                       *
+;*     - MPL - Mozilla Public License                               *
+;*     - other license conditions assigned by originators           *
+;*                                                                  *
+;* If significant code contributor disagrees with some of above     *
+;* licenses, he or she can delete such line/s, but if he deletes    *
+;* all lines, he is not allowed redistribute code in any binary     *
+;* or source form.                                                  *
+;********************************************************************
+
+$INCLUDE(cf_ulan.inc)
+
+%IF (%TGT_MSC1210)THEN(
+R_USEC  EQU   (%CPU_SYS_HZ/1000000)-1               ; (CPU_SYS_HZ / 1000000)-1
+R_MSECL EQU   ((%CPU_SYS_HZ/1000)-1) / 256          ; ((CPU_SYS_HZ / 1000) - 1) mod 256
+R_MSECH EQU   ((%CPU_SYS_HZ/1000)-1) / 256          ; ((CPU_SYS_HZ / 1000) - 1) / 256
+MSC_WRITE_FLASH EQU 0FFD9H  ; DPTR = address, acc = data
+)FI
+
+%IF(NOT %SPN)THEN(
+; Standardni seriovy port 8051
+PCON    DATA  087H
+SBUF_U DATA  SBUF
+SCON_U DATA  SCON
+SM2_U  BIT   SM2
+REN_U  BIT   REN
+TB8_U  BIT   TB8
+RB8_U  BIT   RB8
+TI_U   BIT   TI
+PCON_U DATA  PCON      ; SMOD bit
+RI_U   BIT   RI
+ES_U   BIT   ES
+RXD_U  BIT   RXD
+TXD_U  BIT   TXD
+SINT_U CODE  SINT
+)ELSE(
+; Port 1 mikrokontroleru TI MSC1210
+$INCLUDE(reg1210.inc)
+SBUF_U DATA  SBUF1
+SCON_U DATA  SCON1
+SM2_U  BIT   SM21
+REN_U  BIT   REN1
+TB8_U  BIT   TB81
+RB8_U  BIT   RB81
+TI_U   BIT   TI1
+RI_U   BIT   RI1
+PCON_U DATA  EICON     ; SMOD bit
+ES_U   BIT   ES1
+RXD_U  BIT   RXD1
+TXD_U  BIT   TXD1
+SINT_U CODE  SINT1
+)FI
+
+%IF (%FOR_SDCC) THEN (
+SINT   CODE  00023H          ; SDCC nema hodnotu definovanu
+)FI
+
+%IF (%VECTOR_FL) THEN (
+  EXTRN    CODE(VEC_SET)
+  V_uL_ADD EQU   1EH
+  V_uL_FNC EQU   26H
+)ELSE(
+;  EXTRN    CODE(uL_R_BU,uL_R_CO)
+)FI
+
+EXTRN   CODE(_uL_IDSTR)       ; Jmeno modulu
+
+PUBLIC  uL_IB_L,uL_OB_L
+PUBLIC  uL_FNC,_uL_FNCC,uL_INIT
+PUBLIC  _uL_STR,uL_STR,uL_ERR,uLF_ERR,uLF_INE,uLF_KMP,uLF_TRP
+PUBLIC  uL_FLG,uL_FLH
+PUBLIC  _uL_INT,S_INT,SER_STACK_B
+
+PUBLIC  uL_O_OP,uL_O_NEW,uL_WR,uL_WRc,uL_WRi,uL_O_CL,uL_WRB,uL_WRB0,uL_O_LN,uL_O_ABRT
+PUBLIC  uL_I_OP,uL_RD,uL_RDi,uL_I_CL,uL_RDB,uL_I_LN,uL_I_L,uL_I_NE
+
+%IF (%DY_ADDR) THEN (
+PUBLIC  uL_FLD,uLD_RQA,UD_DYSA,UD_STAD,UD_STLN,SER_NUM,uL_T_RQA
+)FI
+
+%IF (%WITH_SYNCH) THEN(
+  EXTRN    CODE(_ul_synch)
+)FI
+
+; Funkce volane z rutin zpracovani prikazu
+PUBLIC  ACK_CMD,SND_BEB,SND_CHC,SND_END,S_WAITD,NAK_CMD
+PUBLIC          REC_BEG,REC_CHR,REC_END,REC_CME
+PUBLIC  REC_Bi, SND_Bi, REC_Bx, SND_Bx, SND_Bc, S_R0FB, S_EQP
+; Data
+PUBLIC  uL_ADR,uL_SA,uL_DA,uL_CMD,uL_ST
+PUBLIC  uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA
+PUBLIC  uLF_RS,uLF_NB,uLF_NA
+
+%IF(%TGT_T89C51RD2)THEN(
+FCON    DATA  0D1H
+SADDR   DATA  0A9H
+)FI
+
+SER___C SEGMENT CODE
+SER___X SEGMENT XDATA
+SER___B SEGMENT DATA BITADDRESSABLE
+SER_STACK SEGMENT DATA
+
+%IF (NOT %VECTOR_FL AND %WITH_INTR) THEN(
+CSEG AT SINT_U
+        JMP   S_INT
+        JMP   uL_FNC
+)FI
+
+RSEG SER___X
+
+;********************************************************************
+; Datova oblast site uLAN
+
+; Jen pro debugging, jinak zakomentovat
+PUBLIC uL_HBIB,uL_SPD,uL_STA
+PUBLIC P_NDB,H_BIB,H_EIB,P_NPD,P_AID,P_EID
+PUBLIC P_AOB,H_BOB,H_EOB,P_NOB,P_AOD
+
+%IF(%DY_ADDR)THEN(
+UD_SFN:        DS    1         ; prave ctena subfunkce
+UD_DYSA:DS    1                ; adresa serveru adres
+UD_STAD:DS    2                ; ukazatel na buffer statusu
+UD_STLN:DS    1                ; delka bufferu
+SER_NUM:DS    4                ; serial number
+)FI
+
+uL_HBIB:DS    1  ;    Vyssi cast adresy zacatku IB
+uL_IB_L:DS    1  ;    Delka IB v 256
+uL_OB_L:DS    1  ;    Delka OB v 256
+uL_SPD: DS    1  ;    Delitel frekvence 57.6 kHz
+uL_ADR: DS    1  ;    Vlastni adresa
+uL_CMD: DS    1  ;    Prave prenaseny prikaz (IRQ)
+uL_SA:  DS    1  ;    Adresa vysilace (IRQ)
+uL_DA:  DS    1  ;    Adresa prijimace (IRQ)
+uL_ST:  DS    1  ;    Status zpravy (IRQ)
+uL_STA: DS    1  ;    Stamp zpravy (IRQ)
+uL_FRLN:DS    2  ;    Maximalni delka ramce
+
+; Prijem dat
+
+P_NDB:  DS    2  ;R23 Ukazatel na pocatek prijimaneho bloku (IRQ)
+H_BIB:  DS    1  ;R4  Pocatek vstupniho buferu
+H_EIB:  DS    1  ;R5  Konec vstupniho buferu
+P_NPD:  DS    2  ;R67 Ukazatel na pocatek 1. nezprac. bloku (FNC)
+P_AID:  DS    2  ;    Ukazatel na zpracovavana data (FNC)
+
+; Vysilani dat
+
+P_AOB:  DS    2  ;R23 Ukazatel na vysilany blok        (IRQ)
+H_BOB:  DS    1  ;R4  Pocatek vystupniho buferu
+H_EOB:  DS    1  ;R5  Konec vystupniho buferu
+P_NOB:  DS    2  ;R67 Ukazatel na zapisovany blok (FNC)
+P_AOD:  DS    2  ;    Ukazatel na zapisovana data (FNC)
+%IF(%WITH_TAILS)THEN(
+P_AOT: DS    2  ;    Ukazuje na prvni blok tailovane skupiny (FNC)
+P_TO:  DS    2  ;    Pomocny ukazatel do OB pro taily (IRQ)
+P_TI:  DS    2  ;    Pomocny ukazatel do IB pro taily (IRQ)
+)FI
+
+P_EID:  DS    2  ;    Zjisteny konec vstupnich dat
+uL_ISAD:DS    1  ;    Promiskuitni SAdr zpracovavaneho bloku
+uL_IDAD:DS    1  ;    DA zpracovavaneho bloku
+uL_ICOM:DS    1  ;    Command zpracovavaneho bloku
+uL_IST: DS    1  ;    Status zpracovavaneho bloku
+uL_ISTA:DS    1  ;    Stamp - jedinecne cislo zpravy
+uL_TMPB:DS    1  ;    Pomocny buffer pro uL_WRi a uL_RDi
+
+PROC_BUF:DS   17 ; Buffer prikazu proceed
+PROC_BUFE:
+
+RSEG SER___B
+
+uL_FLG: DS    1
+uLF_ER0 BIT   uL_FLG.0  ; Chyba pri vysilani
+uLF_ER1 BIT   uL_FLG.1  ; Chyba pri vysilani
+uLF_ERR BIT   uL_FLG.2  ; Chyba pri vysilani
+uLF_SN  BIT   uL_FLG.3  ; uLan vysila - master mode
+uLF_RS  BIT   uL_FLG.4  ; Potreba vysilat
+uLF_NB  BIT   uL_FLG.5  ; Zbernice neobsazena
+uLF_NA  BIT   uL_FLG.6  ; Mazano kazdou akci
+uLF_TRP BIT   uL_FLG.7  ; Jiny duvod preruseni
+
+uL_FLH: DS    1
+uLF_INE BIT   uL_FLH.0  ; Zprava presunuta do vstupni fronty
+uLF_KMP BIT   uL_FLH.1  ; Keyboard macro in progress
+uLF_REC BIT   uL_FLH.2  ; Zprava urcena pro tuto stanici
+uLF_ARC BIT   uL_FLH.3  ; Prijimat vsechny zpravy na sbernici
+%IF(%WITH_TAILS)THEN(
+uLF_OWT BIT   uL_FLH.4  ; Pripravuje se vystupni zprava s tailem
+uLF_TPF BIT   uL_FLH.5  ; Zpracovava se tailovani pod prerusenim
+uLF_TMP BIT   uL_FLH.6  ; Pomocny
+)FI
+
+%IF(%DY_ADDR)THEN(
+uL_FLD:DS    1
+uLD_RQA        BIT   uL_FLD.2  ; Pozadavek na pripojeni do site
+uLD_SSIP BIT  uL_FLD.3 ; Send status in progress
+uLD_SCIP BIT  uL_FLD.4 ; Status is changed
+)FI
+
+RSEG    SER_STACK
+SER_STACK_B:
+        DS    8+SER_STACK_EXT
+
+XSEG AT END_RAM-256*LENG_IB-256*LENG_OB
+
+BEG_IB: DS    100H*LENG_IB
+END_IB:
+BEG_OB: DS    100H*LENG_OB
+END_OB:
+
+%IF (%FOR_SDCC) THEN (
+RSEG   SER___RB1
+        DS    8
+)FI
+
+; Rizeni linky - prikazy
+uL_ERRI EQU   0FFH ; Ignoruj vse doslo k chybe
+uL_ERR  EQU   07FH ; Chyba v datech
+uL_END  EQU   07CH ; Konec dat
+uL_ARQ  EQU   07AH ; Konec dat - vysli ACK
+uL_PRQ  EQU   079H ; Konec dat - proved prikaz
+uL_AAP  EQU   076H ; ARQ + PRQ
+uL_BEG  EQU   075H ; Zacatek dat
+
+; Potvrzovaci zpravy
+uL_ACK  EQU   019H ; Potvrzeni
+uL_NAK  EQU   07FH ; Doslo k chybe
+uL_WAK  EQU   025H ; Ted nemohu splnit
+
+; Prikazy posilane linkou
+; 00H .. 3FH    uloz do bufferu
+; 40H .. 7FH    uloz do bufferu bez ACK
+; 80H .. 9FH    okamzite proved a konci
+; A0H .. BFH    proved a prijimej
+; C0H .. FFH    proved a vysilej
+
+uL_RES  EQU   080H ; Znovu inicializuj RS485
+uL_SFT  EQU   081H ; Otestuj velikost volne pameti
+uL_SYN  EQU   085H ; Sychronizace casu
+uL_SID  EQU   0F0H ; Predstav se
+uL_SFI  EQU   0F1H ; Vysli velikost volne pameti v IB
+uL_TF0  EQU   098H ; Konec krokovani
+uL_TF1  EQU   099H ; Pocatek krokovani
+uL_STP  EQU   09AH ; Krok
+uL_DEB  EQU   09BH ; Dalsi prikazy pro debug
+uL_SPC  EQU   0DAH ; Vysle PCL PCH PSW ACC
+
+uL_GST  EQU   0C1H ; Fast module get status
+
+uL_RDM  EQU   0F8H ; Cte pamet typu   T T B B L L
+uL_WRM  EQU   0B8H ; Zapise do pameti T T B B L L
+uL_ERM  EQU   088H ; Vymaze pamet T T B B L L
+
+; Status zprav
+uLBF_NORE   EQU 040H ; Do not try to repeat if error occurs
+uLBF_NOREb  EQU 6
+uLBF_TAIL   EQU 020H ; Message has tail frame
+uLBF_TAILb  EQU 5
+uLBF_REC    EQU 010H ; Request receiption of block
+uLBF_RECb   EQU 4
+uLBF_FAIL   EQU 008H ; Message cannot be send - error
+uLBF_PROC   EQU 004H ; Message succesfull send
+uLBF_AAP    EQU 003H ; Request imediate proccessing of frame by receiver station with acknowledge
+uLBF_PRQ    EQU 002H ; Request imediate proccessing of frame by receiver station
+uLBF_ARQ    EQU 001H ; Request imediate acknowledge by receiving station
+uLBF_END    EQU 000H ; No acknowledge or processing request
+
+RSEG SER___C
+
+USING   1
+
+; Cekani na znak R0 - 1 znaku  jinak S_ERR
+WTF_CHR:DJNZ  R0,SND_SPC
+V2_ERR: JMP   S_ERR
+
+; Cekani po dobu 1 znaku
+SND_SPT:CLR   TI_U
+        JNB   TXD_U,S_RET
+        CLR   AC
+        RET
+
+; Cekani po dobu 1 znaku
+SND_SPC:CLR   SM2_U
+        SETB  REN_U
+SND_SP1:
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; *** Ceka 1 znak
+)ELSE(
+        SETB   DR_EO          ; *** Ceka 1 znak
+)FI
+        CLR   A
+        SJMP  SND_CH2
+
+SND_CTR:SETB  C               ; *** Send control character
+        SJMP  SND_CH1
+SND_CHC:XRL   AR1,A           ; *** Send data + add chk sum
+        INC   R1
+SND_CHR:CLR   C               ; *** Send data character
+SND_CH1:MOV   TB8_U,C         ; ACC .. character
+        CLR   REN_U
+ %IF (%NEG_DR_EO) THEN (
+        SETB   DR_EO
+)ELSE(
+        CLR   DR_EO
+)FI
+SND_CH2:MOV   SBUF_U,A
+        CLR   TI_U
+        SJMP  S_RET
+
+REC_CTR:SETB  C               ; *** Receive control character
+        DB    74H             ; MOV A,#d8
+REC_CHR:CLR   C               ; *** Receive character
+REC_CH1:MOV   SM2_U,C         ; ACC .. rec. char
+ %IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; CY  .. RB8_U
+)ELSE(
+        SETB  DR_EO           ; CY  .. RB8_U
+)FI
+        SETB  REN_U
+        CLR   TI_U
+
+RS232:
+S_RET:  JB    uLF_TRP,S_INT_T
+S_RETI: MOV   A,SP
+        XCH   A,SER_STACK
+        MOV   SP,A
+        POP   DPH
+        POP   DPL
+        POP   ACC
+        POP   PSW
+        RETI
+
+; *************************************
+; Interupt TI_U nebo RI_U
+; *************************************
+
+_uL_INT:
+S_INT  :PUSH  PSW
+        PUSH  ACC
+        PUSH  DPL
+        PUSH  DPH
+        MOV   A,SP
+        XCH   A,SER_STACK
+        JZ    S_ERROR
+        MOV   SP,A
+
+S_INT_T:MOV   PSW,#AR0; Banka1
+;       JB    DR_EI,RS232
+        MOV   C,RB8_U         ; errata 89c51rd2, point 6 !!!!!!
+        CLR   RB8_U           ; nutno dodrzet !!!!!!!!!!!!!!!!!
+        JBC   RI_U,S_INT_2
+        JNB   TI_U,S_RET
+S_INT_1:CLR   uLF_NA
+        RET
+S_INT_2:JB    REN_U,S_INT_3   ; errata 89c51rd2, point 8
+        SJMP  S_RETI
+S_INT_3:SETB  AC              ; Preruseni od RI_U => AC=1
+        CLR   uLF_NB
+        MOV   A,SBUF_U
+        JNC   S_INT_1
+        JNB   ACC.7,S_INT_1
+        SETB  uLF_NB
+        CJNE  A,#uL_ERRI,S_INT_1
+S_ERROR:MOV   PSW,#AR0; Banka1
+        CLR   uLF_SN
+        JMP   S_ERR
+
+; Prijem bloku do XDATA
+
+REC_Bx: CLR   SM2_U           ; R23 .. where
+        SETB  REN_U           ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; R67 .. end of buffer
+)ELSE(
+        SETB   DR_EO          ; R67 .. end of buffer
+)FI
+        CLR   TI_U            ; R1  =  check sum
+REC_Bx1:CALL  S_RET           ; CY  =  1 when ended by CTR
+        JB    AC,REC_Bx2
+        CLR   TI_U
+        SJMP  REC_Bx1
+REC_Bx2:JC    REC_BxR
+        CALL  S_RCTB1
+        JNZ   REC_Bx1
+        CLR   C
+REC_BxR:RET
+
+; Prijem bloku do CDATA (t89c51rd2)
+%IF(%TGT_T89C51RD2 OR %TGT_MSC1210)THEN(
+REC_Bc: CLR   SM2_U           ; R23 .. where
+        SETB  REN_U           ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; R67 .. end of buffer
+)ELSE(
+        SETB   DR_EO          ; R67 .. end of buffer
+)FI
+        CLR   TI_U            ; R1  =  check sum
+REC_Bc1:CALL  S_RET           ; CY  =  1 when ended by CTR
+        JB    AC,REC_Bc2
+        CLR   TI_U
+        SJMP  REC_Bc1
+REC_Bc2:JC    REC_BcR
+       CLR   EA
+%IF(%TGT_T89C51RD2) THEN (
+        MOV   FCON,#08H       ; zapis do programove pameti
+        CALL  S_RCTB1        ; zapis hodnotu z komunikace
+)FI
+%IF(%TGT_MSC1210) THEN (
+        CALL  S_RCTBF        ; zapis hodnotu z komunikace
+)FI
+%IF(%TGT_T89C51RD2) THEN (
+        MOV   FCON,#00H       ; vypni zapis do programove pameti
+)FI
+       SETB  EA
+        JNZ   REC_Bc1
+        CLR   C
+REC_BcR:RET
+)ELSE(
+REC_Bc  CODE  REC_Bx
+)FI
+
+; Vyslani bloku z XDATA
+
+SND_Bx: CALL  SND_SPC         ; R23 .. where
+SND_BX0:CLR   REN_U           ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        SETB   DR_EO          ; R67 .. end of buffer
+)ELSE(
+        CLR   DR_EO           ; R67 .. end of buffer
+)FI
+        CLR   RI_U            ; R1  =  check sum
+        CLR   TB8_U
+SND_Bx1:CALL  S_SNFB
+        CLR   TI_U
+        JZ    SND_BxR
+SND_Bx2:CALL  S_RET
+        JB    AC,SND_Bx2
+        SJMP  SND_Bx1
+SND_BxR:CALL  S_RET
+        CLR   TI_U
+        RET
+
+%IF (%CX_MERGED_FL) THEN (
+SND_Bc  CODE  SND_Bx
+)ELSE(
+; Vyslani bloku z CODE
+SND_Bc: CALL  SND_SPC         ; R23 .. where
+SND_Bc0:CLR   REN_U           ; R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (       ; R67 .. end of buffer
+        SETB   DR_EO          ; R1  =  check sum
+)ELSE(
+        CLR   DR_EO
+)FI
+        CLR   RI_U
+        CLR   TB8_U
+SND_Bc1:CALL  S_SNFC
+        CLR   TI_U
+        JZ    SND_BcR
+SND_Bc2:CALL  S_RET
+        JB    AC,SND_Bc2
+        SJMP  SND_Bc1
+SND_BcR:CALL  S_RET
+        CLR   TI_U
+        RET
+)FI
+
+; Prijem bloku do IDATA
+
+REC_Bi: CLR   SM2_U           ; R2  .. where
+        SETB  REN_U           ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; R6  .. end of buffer
+)ELSE(
+        SETB  DR_EO           ; R6  .. end of buffer
+)FI
+        CLR   TI_U            ; R1  =  check sum
+REC_Bi1:CALL  S_RET           ; CY  =  1 when ended by CTR
+        JB    AC,REC_Bi2
+        CLR   TI_U
+        SJMP  REC_Bi1
+REC_Bi2:JC    REC_BiR
+        PUSH  AR1
+        MOV   R1,AR2
+        MOV   @R1,A
+        POP   AR1
+        XRL   AR1,A
+        INC   R1
+        INC   R2
+        MOV   A,R2
+        XRL   A,R6
+        JNZ   REC_Bi1
+        CLR   C
+REC_BiR:RET
+
+; Vyslani bloku z IDATA
+
+SND_Bi: CALL  SND_SPC         ; R2  .. where
+SND_Bi0:CLR   REN_U           ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        SETB  DR_EO           ; R6  .. end of buffer
+)ELSE(
+        CLR   DR_EO           ; R6  .. end of buffer
+)FI
+        CLR   RI_U            ; R1  =  check sum
+        CLR   TB8_U
+SND_Bi1:PUSH  AR1
+        MOV   R1,AR2
+        MOV   A,@R1
+        MOV   SBUF_U,A
+        POP   AR1
+        XRL   AR1,A
+        INC   R1
+        INC   R2
+        MOV   A,R2
+        XRL   A,R6
+        CLR   TI_U
+        JZ    SND_BiR
+SND_Bi2:CALL  S_RET
+        JB    AC,SND_Bi2
+        SJMP  SND_Bi1
+SND_BiR:CALL  S_RET
+        CLR   TI_U
+        RET
+
+; Vyslani bloku z SDATA
+
+SND_Bs: CALL  SND_SPC         ; R2  .. where
+SND_Bs0:CLR   REN_U           ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        SETB  DR_EO           ; R6  .. end of buffer
+)ELSE(
+        CLR   DR_EO           ; R6  .. end of buffer
+)FI
+        CLR   RI_U            ; R1  =  check sum
+        CLR   TB8_U
+SND_Bs1:MOV   DPTR,#PROC_BUF
+        MOV   A,#0E5H         ; MOV A,dir
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R2            ; adresa
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,#022H         ; RET
+        MOVX  @DPTR,A
+        INC   DPTR
+        DB    12H             ; CALL PROC_BUF
+        DW    PROC_BUF
+        MOV   SBUF_U,A
+        XRL   AR1,A
+        INC   R1
+        INC   R2
+        MOV   A,R2
+        XRL   A,R6
+        CLR   TI_U
+        JZ    SND_BsR
+SND_Bs2:CALL  S_RET
+        JB    AC,SND_Bs2
+        SJMP  SND_Bs1
+SND_BsR:CALL  S_RET
+        CLR   TI_U
+        RET
+
+; Prijem bloku do SDATA
+
+REC_Bs: CLR   SM2_U           ; R2  .. where
+        SETB  REN_U           ; X R45 .. buffer bot/top
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; R6  .. end of buffer
+)ELSE(
+        SETB  DR_EO           ; R6  .. end of buffer
+)FI
+        CLR   TI_U            ; R1  =  check sum
+REC_Bs1:CALL  S_RET           ; CY  =  1 when ended by CTR
+        JB    AC,REC_Bs2
+        CLR   TI_U
+        SJMP  REC_Bs1
+REC_Bs2:JC    REC_BsR
+        XRL   AR1,A
+        INC   R1
+        MOV   R3,A
+        MOV   DPTR,#PROC_BUF
+        MOV   A,#08BH         ; MOV dir,R3
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R2            ; adresa
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,#022H         ; RET
+        MOVX  @DPTR,A
+        INC   DPTR
+        DB    12H             ; CALL PROC_BUF
+        DW    PROC_BUF
+        INC   R2
+        MOV   A,R2
+        XRL   A,R6
+        JNZ   REC_Bs1
+        CLR   C
+REC_BsR:RET
+
+; Vyslani konce ramce
+; se zakoncenim pro odpoved uL_END
+
+SND_END:MOV  A,#uL_END
+       SJMP  SND_EN1
+
+; Vyslani konce ramce
+; podle CMD vysle uL_ARQ, uL_AAP nebo uL_END
+
+SND_ENDST:
+       MOV   DPTR,#uL_ST     ; Status zpravy
+        MOVX  A,@DPTR
+        ;JNB   ACC.uLBF_NOREb,SND_EN0
+       JNB   ACC.6,SND_EN0   ; !!!! ASX8051 is broken
+        ORL   uL_FLG,#003H    ; uz neopakovat vysilani
+SND_EN0:MOVX  A,@DPTR
+        ANL   A,#3
+       ADD   A,#SND_ENt-SND_EN1
+       MOVC  A,@A+PC         ; uL_END,uL_ARQ,uL_PRQ,uL_AAP
+SND_EN1:MOV   R0,A
+        XRL   AR1,A
+        INC   R1
+        CALL  SND_CTR         ; Vyslani zakonceni
+        MOV   A,R1
+        CALL  SND_CHR         ; Vyslani checksum
+        CJNE  R0,#uL_END,SND_EN3
+        RET
+SND_EN3:CJNE  R0,#uL_PRQ,SND_EN4
+        RET
+SND_EN4:MOV   R0,#5
+SND_EN5:CALL  WTF_CHR
+        JNB   AC,SND_EN5      ; Prijeti uL_ACK
+        JC    SND_EN6
+        CJNE  A,#uL_ACK,SND_EN6
+        RET
+SND_EN6:JMP   V3_ERR
+
+SND_ENt:DB    uL_END,uL_ARQ,uL_PRQ,uL_AAP
+
+; Vyslani uL_NAK pri chybe v nektere z rutin zpracovani prikazu
+REC_ERR:CALL  REC_CTR
+        JNB   AC,REC_ERR
+REC_ER2:CALL  CMP_END         ; Vstup s prijatym znakem v ACC a CY
+        JC    V3_ERR
+        MOV   R1,AR0
+        MOV   R0,#5
+REC_ER3:CALL  WTF_CHR         ; Prijem checksum
+        JNB   AC,REC_EN3
+        MOV   R0,AR1
+        MOV   R1,#uL_NAK
+        SJMP  REC_EN4
+
+; Potvrzeni prikazu
+ACK_CMD:MOV   R1,#uL_ACK
+        SJMP  REC_EN4
+
+; Nacteni konce ramce
+; ret: ACC = CMP_END
+
+REC_END:MOV   R0,#5
+REC_EN1:CALL  WTF_CHR         ; Prijem zakonceni ramce
+        JNB   AC,REC_EN1
+REC_EN2:XRL   AR1,A           ; Vstup s prijatym znakem v ACC a CY
+        INC   R1
+        CALL  CMP_END         ; Nastaveni R0 dle zpravy (0-3)
+        JC    V3_ERR
+        MOV   DPTR,#uL_ST     ; Nastav status zpravy
+        MOV   A,R0
+        MOVX  @DPTR,A
+        CALL  SND_SPC         ; Prijem checksum
+        JB    AC,REC_EN3
+        CALL  SND_SPC
+        JB    AC,REC_EN3
+        CALL  SND_SPC
+        JB    AC,REC_EN3
+        CALL  SND_SPC
+        JB    AC,REC_EN3
+REC_E3N:CALL  SND_SPC
+        JB    AC,REC_EN3
+        SJMP  V3_ERR
+REC_EN3:JC    V3_ERR
+        XRL   A,R1
+        JB    uLF_REC,REC_EN7 ; Zprava urcena pro tuto stanici
+        MOV   R0,#0           ; Nastav ukonceni na END (neodpovidat)
+REC_EN7:MOV   R1,#uL_NAK
+        JNZ   REC_EN4         ; Pri chybe a ARQ nebo AAP vysle NAK
+        MOV   R1,#uL_ACK      ; Pri   OK  a ARQ vysle ACK
+        MOV   A,R0            ; Pri   OK  a AAP je R1=ACK ale vysle
+        JB    ACC.1,REC_EN5   ;  az prooceed rutina
+REC_EN4:MOV   A,R0
+        JNB   ACC.0,REC_EN5
+        CLR   ACC.0
+        MOV   R0,A
+        SETB  REN_U
+        CALL  SND_SPT
+        CALL  SND_SPC
+        MOV   A,R1
+        CALL  SND_CHR
+REC_EN5:CJNE  R1,#uL_NAK,REC_EN6
+V3_ERR: JMP   S_ERR
+REC_EN6:MOV   A,R0
+        RET
+
+; Pocatek ramce bez urceni Destignation Address
+
+SND_BEB:MOV   DPTR,#uL_CMD    ; Vysilany prikaz
+        MOVX  A,@DPTR
+        ANL   A,#7FH
+        MOV   R0,A
+        MOV   A,#uL_BEG
+
+; Vyslani zacatku ramce
+; call: ACC  Destignation Address
+;       R0   CoMmanD
+
+SND_BEG:ANL   A,#07FH
+        MOV   R1,A
+        CALL  SND_SPT
+        CALL  SND_SPC
+        MOV   A,R1
+        INC   R1
+        CALL  SND_CTR         ; Destignation Address nebo uL_BEG
+        MOV   DPTR,#uL_SA     ; SA adresa
+        MOVX  A,@DPTR
+        XRL   AR1,A
+        INC   R1
+        CALL  SND_CHR
+        MOV   A,R0
+        XRL   AR1,A
+        INC   R1
+        JMP   SND_CHR
+
+
+; Nacteni zacatku ramce
+; ret:  ACC  Source Address
+;       R0   CoMmanD
+
+REC_BEG:MOV   R1,#uL_BEG      ; Cekani ze SWAIT
+        MOV   R0,#9
+REC_BE1:CALL  WTF_CHR
+        JNB   AC,REC_BE1
+REC_BE2:MOV   R0,A
+        MOV   DPTR,#uL_STA    ; Nuluj stamp
+        CLR   A
+        MOVX  @DPTR,A
+REC_BET:JNC   V4_ERR
+        JB    uLF_NB,V3_ERR   ; Cekani z  PWAIT s R1=0
+        MOV   A,R0
+        MOV   DPTR,#uL_DA     ; Uloz DA
+        MOVX  @DPTR,A
+        SETB  uLF_REC         ; Zprava urcena pro tuto stanici
+        JZ    REC_BE3         ; Vseobecna adresa
+       MOV   DPTR,#uL_ADR    ; Porovnej s vlastni adresou
+        MOVX  A,@DPTR
+        XRL   A,R0
+        JZ    REC_BE3        ; Shoda adresy
+        CLR   uLF_REC
+        JNB   uLF_ARC,REC_BEU ; Neprijimat vsechny zpravy
+       CJNE  R1,#uL_BEG,REC_BE3
+        CJNE  R0,#uL_BEG,REC_BE3
+REC_BEU:CJNE  R1,#uL_BEG,S_ERR
+        CJNE  R0,#uL_BEG,S_EWAIT    ; S_BEG a SWAIT
+        SETB  uLF_REC         ; Zprava urcena pro tuto stanici
+REC_BE3:MOV   AR1,R0          ; **********************
+        INC   R1              ; V R1 se bude pocitat chksum
+        MOV   R0,#5
+REC_BE4:CALL  WTF_CHR         ; Prijem SA
+        JNB   AC,REC_BE4
+        JC    S_ERR
+        XRL   AR1,A
+        INC   R1
+        MOV   R0,A            ; R0=SA
+REC_BE5:CALL  REC_CHR
+        JNB   AC,REC_BE5      ; Cekani na  CMD - prikaz
+        JC    S_ERR
+        XRL   AR1,A
+        INC   R1
+        MOV   DPTR,#uL_CMD
+        MOVX  @DPTR,A         ; Zapis CMD
+        MOV   DPTR,#uL_SA
+        XCH   A,R0
+        MOVX  @DPTR,A         ; Zapis SA
+        JMP   S_POPDP
+
+; Cekani na konec bloku pri REC_BEG a SWAIT
+S_EWAIT:CALL  REC_CTR
+        JNB   AC,S_EWAIT
+        CALL  CMP_END
+        JC    S_ERR
+        MOV   A,R0
+        JNB   ACC.0,REC_BEG
+        MOV   R0,#5
+S_EWAI1:CALL  WTF_CHR
+        JNB   AC,S_EWAI1
+        JNC   REC_BEG
+V4_ERR: JMP   S_ERR
+
+; Vrati v R0  0..S_END,1..S_ARQ,2..S_PRQ,3..S_AAP,JINAK CY
+CMP_END:JNC   CMP_EN4
+CMP_EN0:MOV   R0,#0
+        CJNE  A,#uL_END,CMP_EN1
+        RET
+CMP_EN1:INC   R0
+        CJNE  A,#uL_ARQ,CMP_EN2
+        RET
+CMP_EN2:INC   R0
+        CJNE  A,#uL_PRQ,CMP_EN3
+        RET
+CMP_EN3:INC   R0
+        CJNE  A,#uL_AAP,CMP_EN4
+        RET
+CMP_EN4:SETB  C
+        RET
+
+; Doslo k chybe pri prijmu nebo vysilani
+
+S_ERR:  MOV   SP,#SER_STACK
+        JNB   uLF_SN,S_WAITD
+        MOV   R0,#3           ; Pocet vyslani ERRI pri normalni chybe
+        JNB   F0,S_ERR_1
+        MOV   R0,#10          ; Pocet vyslani ERRI pri zavazne chybe
+S_ERR_1:MOV   A,#uL_ERRI
+        CALL  SND_CTR
+        DJNZ  R0,S_ERR_1
+S_ERR_2:INC   uL_FLG
+        MOV   A,uL_FLG
+        ANL   A,#3
+        JNZ   S_END
+        DEC   uL_FLG
+S_ERR_3:SETB  uLF_ERR
+        CALL  GET_OBA         ; otevreni vystupni zpravy a naplneni promenych
+        CALL  GET_NXT         ; uL_SA,uL_DA, ...
+        MOV   DPTR,#uL_ST     ; priznak neplatneho doruceni zpravy
+        MOVX  A,@DPTR
+        ORL   A,#uLBF_FAIL
+        MOVX  @DPTR,A
+        CALL  GET_IBA         ; otevreni vstupni zpravy
+        CALL  IB_BEGR
+       JZ    S_ERR_4         ; IBfull
+        CALL  IB_ENDR         ; zapis zpravy o nulove delce s prametry uL_SA, ...
+S_ERR_4:SETB  uLF_INE         ; zprava ve vstupni fronte
+       MOV   R0,#0FFH
+        SJMP  S_ENDTE
+
+; Rutina maze posledni zpravu
+
+S_ENDT: MOV   R0,#0
+S_ENDTE:MOV   SP,#SER_STACK
+        ANL   uL_FLG,#0FCH
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO
+)ELSE(
+        SETB  DR_EO
+)FI
+        CALL  GET_OBA
+S_ENDT1:CALL  GET_NXT
+        JNB   ACC.7,S_ENDT3   ; Neexistuje
+        CALL  SET_NXT
+    %IF(%WITH_TAILS)THEN(
+       JC    S_ENDT1         ; Preskocit na konec tailovane skupiny
+    )FI
+        CALL  GET_NXT
+       JB    ACC.7,S_END     ; Je dalsi zprava
+S_ENDT3:CLR   uLF_RS         ; Neni dalsi zprava
+
+; Konec vysilani nebo prijmu
+
+S_END:  MOV   SP,#SER_STACK
+        JNB   uLF_SN,S_WAITD
+        JB    uLF_NB,S_WAITD
+        CALL  SND_SPT
+        JB    AC,S_WAITD
+        CALL  SND_SPC
+        JB    AC,S_WAITD
+        CALL  G_MADR
+        ORL   A,#80H
+        CALL  SND_CTR
+        SETB  uLF_NB
+
+; Cekani na komunikaci
+
+S_WAITD:MOV   SP,#SER_STACK
+        CLR   TI_U
+        SETB  F0
+        SETB  REN_U
+        SETB  TXD_U
+
+; Cekani na vlastni adresu nebo pozadavek k vysilani
+
+S_WAIT: CLR   uLF_SN
+        JNB   uLF_NB,S_WAIT1  ; Nelze vysilat
+        JNB   uLF_RS,S_WAIT1  ; Neni potreba vysilat
+
+        SETB  uLF_SN
+        CALL  G_MADR
+        MOV   R0,A            ; Vlastni adresa
+        SETB  C
+        SUBB  A,R1            ;  - Posledni vysilajici
+        ANL   A,#00FH         ; Token pasing delay
+        ADD   A,#4            ; min 4
+        JNB   F0,S_CONN1
+        ADD   A,#010H         ; Prodlouzit - byla chyba
+S_CONN1:MOV   R1,A
+S_CONN2:CALL  SND_SPC         ; Cekani token pasing delay
+        JB    AC,S_WAIT2
+        DJNZ  R1,S_CONN2
+        CALL  S_ARB           ; Arbitrace pristupu
+        JB    F0,S_WAIT1
+SND_OB: CALL  GET_OBA         ; R23 R4 R5 do OB
+    %IF(%WITH_TAILS)THEN(
+       CLR   uLF_TPF
+    )FI
+SND_OB0:CALL  GET_NXT         ; R67 pristi zprava
+        JB    ACC.7,SND_OBV   ; Neexistuje
+        JMP   S_ENDT
+SND_OBV:JMP   SND_OB1         ; Vysli blok
+
+S_WAIT1:MOV   C,uLF_NB
+        CPL   C
+        CALL  REC_CH1         ; Ceka se na znak
+S_WAIT2:CLR   uLF_SN
+        JNB   AC,S_WAITD      ; Vybuzovaci TI_U
+        MOV   R1,A
+        JNC   S_WAITD         ; Neni ridici
+        JB    ACC.7,S_WAIT    ; Ukonceni vysilani
+        MOV   R1,#0
+        CALL  REC_BE2         ; Cekani na prikaz v R0
+        SJMP  REC_CM1
+
+REC_CMD:CALL  REC_BEG         ; Cekani na prikaz v R0
+REC_CM1:MOV   A,R0
+        JB    ACC.7,REC_CM2
+        CALL  GET_IBA         ; Prijem do IB
+        CALL  IB_BEGR
+        JZ    REC_CMEV
+        CALL  REC_Bx
+        JNC   REC_CMEV
+        CALL  REC_EN2
+        MOV   R1,A
+        CALL  IB_ENDR           ; Prepisuje vse krome R1
+        MOV   A,R1              ; v R0 vraci CMD
+        SETB  uLF_INE
+        JB    ACC.1,REC_CM3     ; PRQ nebo AAP
+%IF (%VECTOR_FL) THEN (
+        MOV   A,#8              ; Priznak IB do R0.3
+REC_CM3:XCH   A,R0
+        JMP   REC_CM8           ; Pro skok na uzivatelsky vektor
+)ELSE(
+        XCH   A,R0
+;       CALL  uL_R_BU           ; Pro zpracovani zprav aplikaci
+
+)FI
+V1_WAIT:JMP   S_WAITD
+
+%IF (NOT %VECTOR_FL) THEN (
+REC_CM3:XCH   A,R0
+        JMP   REC_CM8
+)FI
+
+REC_CMEV:JMP  REC_CME
+
+REC_CM2:CALL  GET_PRB         ; Prijem do PROC_BUF
+        JZ    REC_CMEV
+        CALL  REC_Bx
+        JNC   REC_CMEV
+        CALL  REC_EN2
+%IF (NOT %VECTOR_FL)THEN(
+        JNB   ACC.1,V1_WAIT
+)FI
+        MOV   A,R2
+        MOV   R6,A
+        MOV   A,R3
+        MOV   R7,A
+        CALL  GET_PR1
+REC_CM7:CALL  G_CMD
+REC_CM8:                      ; Prikaz v ACC, zakonceni v R0
+%IF (%VECTOR_FL)THEN(
+;        JMP   V_uL_ADD        ; Moznost rozsirit funkce uzivatelem
+
+uL_EADD:XCH   A,R0
+        JB    ACC.3,V1_WAIT
+        JNB   ACC.1,V1_WAIT
+        XCH   A,R0
+)ELSE(                        ; Pro zpracovani prikazu aplikaci
+;        CALL  uL_R_CO
+)FI                           ; Pocatek provadeni internich prikazu
+
+        CJNE  A,#uL_SID,PR_CM20
+; Vysle svoji identifikaci
+        CALL  ACK_CMD
+        CALL  SND_BEB
+        MOV   DPTR,#_uL_IDSTR
+%IF (%FOR_SDCC) THEN (  
+        CLR   A               ; ptr Lo
+        MOVC  A,@A+DPTR       
+        MOV   R2,A
+       MOV   A,#1            ; ptr Hi
+        MOVC  A,@A+DPTR
+        MOV   R3,A
+       MOV   A,#3            ; len
+        MOVC  A,@A+DPTR
+)ELSE(                        
+; KEIL
+        MOV   A,#1            ; ptr Hi
+        MOVC  A,@A+DPTR
+        MOV   R3,A
+        MOV   A,#2            ; ptr Lo
+        MOVC  A,@A+DPTR
+        MOV   R2,A
+       MOV   A,#3            ; len
+        MOVC  A,@A+DPTR
+)FI      
+        ADD   A,R2
+        MOV   R6,A
+        CLR   A
+        ADDC  A,R3
+        MOV   R7,A
+PR_CM12:MOV   R5,AR4
+        CALL  SND_Bc          ; SND_Bx
+PR_CM19:CALL  SND_END        ; Vysli zakonceni uL_END
+        SJMP  V1_WAIT
+
+; Test volne pameti
+PR_CM20:CJNE  A,#uL_SFT,PR_CM30
+        MOV   A,R0
+        JNB   ACC.0,V1_WAIT
+        CALL  GET_IBA
+        CALL  LEN_DAT
+        MOV   AR4,R0
+        CALL  GET_PRB
+        CALL  S_R0FB
+        MOV   A,R4
+        CLR   C
+        SUBB  A,#6
+        JNC   PR_CM22
+        INC   R1
+PR_CM22:CLR   C
+        SUBB  A,R0
+        PUSH  PSW
+        CALL  SND_SPC
+        CALL  S_R0FB
+        POP   PSW
+        MOV   A,R1
+        SUBB  A,R0
+        MOV   A,#uL_NAK
+        JC    PR_CM24
+        MOV   A,#uL_ACK
+PR_CM24:CALL  SND_CHR
+        JMP   S_WAITD
+
+; Krokovani pocatek
+PR_CM30:CJNE  A,#uL_TF0,PR_CM32
+        CLR   uLF_TRP      ; Ukonci krokovani
+PR_CM31:CALL  ACK_CMD
+        JMP   S_WAITD
+PR_CM32:CJNE  A,#uL_TF1,PR_CM33
+        SETB  uLF_TRP       ; Zacne krokovani
+        SJMP  PR_CM31
+PR_CM33:CJNE  A,#uL_STP,PR_CM36
+        SETB  TI_U          ; Provede jednu instrukci
+        CALL  S_RETI
+        CLR   TI_U
+        CLR   A
+        SJMP  PR_CM31
+PR_CM36:CJNE  A,#uL_SPC,PR_CM40
+        CALL  ACK_CMD
+        CALL  SND_BEB
+        MOV   A,SER_STACK   ; Vysle PCL PCH PSW ACC
+        INC   A
+        MOV   R6,A
+        ADD   A,#-6
+        MOV   R2,A
+        CALL  SND_Bi
+        JMP   PR_CM19
+
+PR_CM40:CJNE  A,#uL_RDM,PR_CM50
+; Vyslani pameti
+        CALL  ACK_CMD
+        CALL  SND_BEB
+        CALL  S_PRPMM
+        CJNE  R4,#1,S_RDM1
+        CALL  SND_Bi
+S_RDM1: CJNE  R4,#2,S_RDM2
+        CALL  SND_Bx
+S_RDM2: CJNE  R4,#4,S_RDM3
+        CALL  SND_Bs
+S_RDM3: CJNE  R4,#5,S_RDM4
+        CALL  SND_Bc
+S_RDM4: JMP   PR_CM19
+
+PR_CM50:CJNE  A,#uL_WRM,PR_CM60
+; Prijem do pameti
+        CALL  ACK_CMD
+        CALL  REC_BEG
+        CJNE  R0,#uL_WRM AND 7FH,REC_CMEV1
+S_WRM0: CALL  S_PRPMM
+        MOV   A,#1
+        CJNE  R4,#1,S_WRM1
+        CALL  REC_Bi
+S_WRM1: CJNE  R4,#2,S_WRM2
+        CALL  REC_Bx
+S_WRM2: CJNE  R4,#4,S_WRM3
+        CALL  REC_Bs
+S_WRM3: CJNE  R4,#5,S_WRM4    ; zapis do code 89c51rd2?
+        CALL  REC_Bc
+        JNZ   REC_CMEV1
+        CALL  REC_END
+%IF(%TGT_T89C51RD2)THEN(
+        CLR   EA
+        MOV   FCON,#050H      ; zapisovaci sequence
+        MOV   FCON,#0A0H      ; zapisovaci sequence
+S_WRM31:
+       MOV   A,FCON          ; cekej na dozapsani
+        ANL   A,#01H
+        JNZ   S_WRM31
+        SETB  EA
+)FI    
+        JMP   S_WAITD
+S_WRM4: JNZ   REC_CME
+        CALL  REC_END
+        JMP   S_WAITD
+REC_CMEV1:JMP  REC_CME
+
+PR_CM60:CJNE  A,#uL_ERM,PR_CM70
+; mazani pameti
+        CALL  ACK_CMD
+        CALL  S_PRPMM
+        CJNE  R4,#5,S_ERM3
+%IF(%TGT_MSC1210) THEN (
+        MOV   MSECL,#R_MSECL
+        MOV   MSECH,#R_MSECH
+        CLR   EA
+S_ERM1: CLR   C
+       MOV   A,R2
+       SUBB  A,R6
+       MOV   A,R3
+       SUBB  A,R7
+       JNC   S_ERM2           ; R23>=R67
+        MOV   A,#0FFH          ; value to write
+        ORL   FMCON,#040h
+        CALL  S_ACCTBF
+        ANL   FMCON,#0BFh
+       MOV   A,PDCON          ; refresh watchdog when is enabled
+       JB    ACC.2,S_ERM4    
+       ORL   WDTCON,#0x20
+       ANL   WDTCON,#0xDF
+S_ERM4: MOV   A,#127           ; R23+128, page length is 128 
+        ADD   A,R2             ; a increment is made in S_ACCTB
+        MOV   R2,A
+        JNC   S_ERM1
+        INC   R3
+        JMP   S_ERM1
+S_ERM2: SETB  EA
+)FI
+S_ERM3:
+        JMP   S_WAITD
+
+PR_CM70:CJNE  A,#uL_DEB,PR_CM80
+; Ladici prikazy
+S_DEB:  CALL  S_EQP
+        JZ    NAK_CMD
+        CALL  ACK_CMD
+        MOV   DPTR,#PROC_BUF
+        MOVX  A,@DPTR
+        INC   DPTR
+        CJNE  A,#10H,S_DEB98
+        INC   DPTR          ; Prikaz GO xxxx
+        INC   DPTR
+        MOV   A,SER_STACK   ; Zapise  PCL PCH
+        ADD   A,#-5
+        MOV   R1,A
+        MOVX  A,@DPTR
+        MOV   @R1,A
+        INC   DPTR
+        INC   R1
+        MOVX  A,@DPTR
+        MOV   @R1,A
+    %IF(%TGT_T89C51RD2)THEN(
+        MOV   DPTR,#uL_ADR    ; zalohuj s vlastni adresou pro presmerovani
+        MOVX  A,@DPTR         ; na bootloader
+        MOV   SADDR,A
+    )FI
+S_DEB98:JMP   S_WAITD
+
+PR_CM80:
+%IF (%WITH_SYNCH) THEN(
+       CJNE  A,#uL_SYN,PR_CM90
+       CALL   _ul_synch
+       JMP   S_WAITD
+)FI
+
+PR_CM90:
+%IF (%DY_ADDR)THEN(
+        CJNE  A,#uL_GST,NAK_CMD
+        JMP   UD_SNST        ; Cteni statusu a podpora dynamicke adresace
+)FI
+
+NAK_CMD:MOV   R1,#uL_NAK
+        JMP   REC_EN4
+
+WAK_CMD:MOV   R1,#uL_WAK
+        JMP   REC_EN4
+
+REC_CME:CALL  REC_ERR
+        JMP   REC_CMD
+
+SND_OB1:CJNE  R1,#0,SND_OB2
+        CALL  SND_BEG
+        SJMP  SND_OB3
+SND_OB2:CALL  SND_BEG
+        CALL  SND_Bx
+SND_OB3:CALL  SND_ENDST              ; Vysli zakonceni podle uL_ST
+        MOV   DPTR,#uL_DA     ; oprav adresu DA
+        MOVX  A,@DPTR
+        ANL   A,#07FH
+        MOVX  @DPTR,A
+        MOV   DPTR,#uL_ST     ; Status zpravy z predchoziho GET_NXT
+        MOVX  A,@DPTR
+        ORL   A,#uLBF_PROC    ; nastavit priznak doruceni zpravy
+        MOVX  @DPTR,A
+    %IF(%WITH_TAILS)THEN(
+       ;MOV   C,ACC.uLBF_TAILb
+       MOV   C,ACC.5         ; !!!! ASX8051 is broken
+       MOV   uLF_TMP,C
+        JB    uLF_TPF,SND_OB5
+        JC    SND_OB4
+    )FI
+        CALL  GET_IBA         ; otevreni vstupni zpravy
+       CALL  IB_BEGR
+       JZ    SND_OBE         ; IBfull
+        CALL  IB_ENDR         ; zapis zpravy o nulove delce s vysilanymi parametry
+SND_OBE:SETB  uLF_INE         ; zprava ve vstupni fronte
+        JMP   S_ENDT
+
+%IF(%WITH_TAILS)THEN(
+SND_OB4:MOV   DPTR,#P_NDB
+       MOVX  A,@DPTR
+       MOV   R0,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       XCH   A,R0
+        MOV   DPTR,#P_TI
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,R0
+       MOVX  @DPTR,A
+SND_OB5:SETB  REN_U
+    %IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO           ; Prepnout na prijem
+    )ELSE(
+        SETB   DR_EO          ; Prepnout na prijem
+    )FI
+        MOV   DPTR,#P_TO
+       MOV   A,R2
+       MOVX  @DPTR,A         ; Zapamatovat si pozici v OB
+       INC   DPTR
+       MOV   A,R3
+       MOVX  @DPTR,A
+        CALL  GET_IBA         ; otevreni vstupni zpravy
+        MOV   DPTR,#P_TI
+       MOVX  A,@DPTR
+       MOV   R2,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R3,A
+       CALL  IB_BEGR
+       JZ    SND_OBF
+       MOV   C,uLF_TPF
+        CALL  IB_ENDRT        ; zapis zpravy o nulove delce s vysilanymi parametry
+SND_OBF:SETB  uLF_TPF
+SND_OB6:JB    uLF_TMP,SND_OB7
+
+       MOV   DPTR,#P_TI
+       MOVX  A,@DPTR
+       MOV   R2,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R3,A
+        MOV   DPTR,#P_NDB
+       MOVX  A,@DPTR
+       XCH   A,R2
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       XCH   A,R3
+       MOVX  @DPTR,A
+       MOV   DPL,R2
+       MOV   DPH,R3
+       MOVX  A,@DPTR
+       ORL   A,#80H          ; Onacit platnost vstupnich dat
+       MOVX  @DPTR,A
+        SETB  uLF_INE         ; zprava ve vstupni fronte
+        JMP   S_ENDT
+       
+SND_OB7:
+        MOV   DPTR,#P_TO
+       MOVX  A,@DPTR
+       MOV   R2,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R3,A
+        MOV   DPTR,#H_BOB
+       MOVX  A,@DPTR
+       MOV   R4,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R5,A
+       
+       CALL  GET_NXT         ; Dalsi ramec, AC=uLBF_RECb
+       JNB   ACC.7,V5_ERR
+       JB    AC,REC_TA1
+       JMP   SND_OB1
+       
+REC_TA1:MOV   uLF_TMP,C              ; Pokracuje dalsim ramcem 
+       MOV   DPTR,#P_TO
+       MOV   A,R6
+       MOVX  @DPTR,A         ; Zapamatovat si pozici v OB
+       INC   DPTR
+       MOV   A,R7
+       MOVX  @DPTR,A
+
+       MOV   R1,#uL_BEG      ; Cekani ze SWAIT
+        MOV   R0,#9
+REC_TA3:CALL  WTF_CHR
+        JNB   AC,REC_TA3
+       MOV   R0,A
+        CALL  REC_BET         ; prijem tailu
+        CALL  GET_IBA         ; Prijem do IB
+        MOV   DPTR,#P_TI
+       MOVX  A,@DPTR
+       MOV   R2,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R3,A
+        CALL  IB_BEGR
+        JZ    REC_TAER
+        CALL  REC_Bx
+        JNC   REC_TAER
+        CALL  REC_EN2
+        MOV   DPTR,#uL_ST     ; priznak doruceni zpravy
+        MOV   A,#(uLBF_REC OR uLBF_PROC)
+       MOV   C,uLF_TMP
+       ;MOV   ACC.uLBF_TAILb,C
+       MOV   ACC.5,C         ; !!!! ASX8051 is broken
+        MOVX  @DPTR,A
+       SETB  C
+        CALL  IB_ENDRT        ; Prepisuje vse krome R1
+        JMP   SND_OB6
+
+REC_TAER:CALL REC_ERR
+V5_ERR:        JMP   S_ERR
+)FI
+
+
+; Priprava pro cteni a zapis pameti
+
+S_PRPMM:MOV   DPTR,#PROC_BUF
+        MOV   R0,#AR2
+S_PRPM1:MOVX  A,@DPTR
+        MOV   @R0,A
+        INC   R0
+        INC   DPTR
+        CJNE  R0,#AR7+1,S_PRPM1
+        MOV   A,R4
+        XCH   A,R2
+        MOV   R4,A
+        MOV   A,R5
+        XCH   A,R3
+        MOV   R0,A
+        CJNE  R4,#9,S_PRPM2
+        MOV   A,#SER_STACK
+        SJMP  S_PRPM4
+S_PRPM2:CJNE  R4,#8,S_PRPM3
+        MOV   A,SER_STACK
+        INC   A
+        SJMP  S_PRPM4
+S_PRPM3:CJNE  R4,#7,S_PRPM5
+        MOV   R0,SER_STACK
+        DEC   R0
+        MOV   A,@R0
+        ANL   A,#18H
+S_PRPM4:ADD   A,R2
+        MOV   R2,A
+        MOV   R4,#1
+S_PRPM5:MOV   AR5,R4
+
+; Pricte k R67 R23
+
+AR67R23:MOV   A,R6
+        ADD   A,R2
+        MOV   R6,A
+        MOV   A,R7
+        ADDC  A,R3
+        MOV   R7,A
+        CLR   C
+        SUBB  A,R5
+        JC    AR67R6R
+        ADD   A,R4
+        MOV   R7,A
+AR67R6R:RET
+
+; Priprav IB pro prijem dat
+
+IB_BEGR:MOV   R0,#7
+IB_BEG1:CLR   A
+        CALL  S_ACCTB
+        JZ    IB_BEGG
+        DJNZ  R0,IB_BEG1
+IB_BEGG:RET
+
+; Zakonceni prijmu do IB
+; call: [R23] konec dat
+;       uL_SA adresa vysilace
+;       uL_DA adresa prijemce
+; Nastavi P_NDB a ukazatel na dalsi blok
+; ret:  [R23] zacatek dat
+;       [R67] za konec dat
+;       R0    prikaz CMD
+;       nesmi mazat R1
+
+IB_ENDR:SETB  C                        ; Zprava ma byt oznacena za platnou
+       MOV   DPL,R2            ; Oznacit za prazdny
+        MOV   DPH,R3            ; blok za prijatou zpravou
+        CLR   A
+        MOVX  @DPTR,A
+        MOV   DPTR,#P_NDB
+IB_END1:MOVX  A,@DPTR           ; Posunout ukazatel na pristi
+        XCH   A,R2              ; prijimany blok za zpravu
+        MOV   R6,A
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        XCH   A,R3              ; R23 na zacatek bloku
+        MOV   R7,A              ; R67 za konec bloku
+        MOVX  @DPTR,A
+        MOV   DPTR,#uL_SA
+        MOVX  A,@DPTR
+        MOV   ACC.7,C           ; Ulozit SA or 80H a tim
+        CALL  S_ACCTB           ; oznacit zpravu za platnou
+        MOV   DPTR,#uL_DA
+        MOVX  A,@DPTR
+        CALL  S_ACCTB           ; Ulozit DA
+        MOV   A,R6
+        CALL  S_ACCTB           ; Ulozit ukazatel za zpravu
+        MOV   A,R7              ; na pristi blok
+        CALL  S_ACCTB
+        MOV   DPTR,#uL_CMD
+        MOVX  A,@DPTR
+        CALL  S_ACCTB           ; Ulozit CMD zpravy
+        MOV   DPTR,#uL_ST
+        MOVX  A,@DPTR
+        CALL  S_ACCTB           ; Ulozit status zpravy
+        MOV   DPTR,#uL_STA
+        MOVX  A,@DPTR
+        CALL  S_ACCTB           ; Ulozit stamp zpravy
+        RET
+%IF(%WITH_TAILS)THEN(
+; Verze IB_ENDR pro tailovani pracuje proti P_TI
+; vstup CY informuje o stavu oznaceni zpravy za dokoncenou
+IB_ENDRT:
+       MOV   DPL,R2            ; Oznacit za prazdny
+        MOV   DPH,R3            ; blok za prijatou zpravou
+        CLR   A
+        MOVX  @DPTR,A
+        MOV   DPTR,#P_TI
+       SJMP  IB_END1
+)FI
+
+; Naplni registry pointry do PROC_BUF
+GET_PRB:MOV   R6,#LOW  PROC_BUFE ; Prijem do PROC_BUF
+        MOV   R7,#HIGH PROC_BUFE
+GET_PR1:MOV   R2,#LOW  PROC_BUF
+        MOV   R3,#HIGH PROC_BUF
+        MOV   AR5,R4
+        RET
+
+; R67 naplni ukazately na pristi blok
+; uL_DA,uL_SA,uL_ST,uL_CMD
+; ret: ACC .. DA
+;      R0  .. command
+;      R1  .. 0 pri nulove delce dat
+;      CY=1 .. zprava s tailem
+;      AC=1 .. zprava typu REC
+
+GET_NXT:CALL  S_R0FB         ; DAdr
+        MOV   A,R0
+       CLR   C
+       JNB   ACC.7,GET_NX4
+        MOV   DPTR,#uL_DA
+        MOVX  @DPTR,A
+        CALL  S_R0FB         ; SAdr
+        MOV   A,R0
+        MOV   DPTR,#uL_SA
+        MOVX  @DPTR,A
+        CALL  S_R0FB         ; Nacist ukazatel za zpravu
+        MOV   A,R0
+        MOV   R6,A
+        CALL  S_R0FB 
+        MOV   A,R0
+        MOV   R7,A
+        CALL  S_R0FB         ; CMD
+        MOV   A,R0
+       MOV   R1,A
+        MOV   DPTR,#uL_CMD 
+        MOVX  @DPTR,A
+        CALL  S_R0FB         ; ST
+        MOV   A,R0
+        MOV   DPTR,#uL_ST
+        MOVX  @DPTR,A
+       ;MOV   C,ACC.uLBF_RECb
+       MOV   C,ACC.4         ; !!!! ASX8051 is broken
+       MOV   AC,C
+       ;MOV   C,ACC.uLBF_TAILb
+       MOV   C,ACC.5         ; !!!! ASX8051 is broken
+       PUSH  PSW ; Nemelo by byt potreba
+        CALL  S_R0FB          ; ACC - 0 pri nulove delce dat
+        XCH   A,R1            ; presun do R1, CMD do A
+        XCH   A,R0           ; CMD konecne do R0
+        MOV   DPTR,#uL_STA    ; Stamp
+        MOVX  @DPTR,A
+        MOV   DPTR,#uL_DA     ; DAdr
+        MOVX  A,@DPTR
+       POP   PSW ; Nemelo by byt potreba
+GET_NX4:RET
+
+; Posune ukazatel za aktualni vystupni zpravu
+; Nesmi menit R0, R1, CY
+SET_NXT:MOV   DPTR,#P_AOB
+        MOV   A,R6
+        MOV   R2,A
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R7
+        MOV   R3,A
+        MOVX  @DPTR,A
+        SJMP  S_POPDP
+
+; Naplni registry pointry do OB
+
+GET_OBA:MOV   DPTR,#P_AOB
+        JMP   GET_BA1
+
+; Naplni registry pointry do IB
+
+GET_IBA:MOV   DPTR,#P_NDB
+GET_BA1:MOV   R0,#AR2
+GET_BA2:MOVX  A,@DPTR
+        INC   DPTR
+        MOV   @R0,A
+        INC   R0
+        CJNE  R0,#AR7+1,GET_BA2
+        SJMP  S_POPDP
+
+; Nacte prikaz CMD
+G_CMD:  MOV   DPTR,#uL_CMD    ; Prikaz
+        SJMP  G_MADR2
+
+; Nacte SA
+G_SA:   MOV   DPTR,#uL_SA     ; Vlastni SA
+        SJMP  G_MADR2
+
+; Nacte vlastni adresu
+G_MADR: MOV   DPTR,#uL_ADR    ; Vlastni adresa
+G_MADR2:MOVX  A,@DPTR
+S_POPDP:RET
+
+; Pripojeni mastera ke sbernici
+; vstup vlastni adresy v R0
+
+S_ARB:  MOV   R1,#3+1         ; 3x2 bitu arbitrace
+        CLR   uLF_NB
+S_ARB1:
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO
+)ELSE(
+        SETB  DR_EO
+)FI
+        JNB   RXD_U,S_ARBE
+        JB    AC,S_ARBE
+        CLR   TXD_U
+        CALL  SND_CH1
+        SETB  TXD_U
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO
+)ELSE(
+        SETB  DR_EO
+)FI
+S_ARB2: CALL  SND_CH2
+        JB    AC,S_ARB2
+        MOV   A,R0          ; Rotace adresy
+        RR    A
+        RR    A
+        XCH   A,R0
+        ANL   A,#3          ; Nejnizsi 2 bity
+        INC   A
+        MOV   R2,A          ; Pocet cekani
+        DJNZ  R1,S_ARB4
+        RET
+S_ARB3: JB    AC,S_ARBE
+        CALL  SND_SPC
+S_ARB4: DJNZ  R2,S_ARB3
+        SJMP  S_ARB1
+
+S_ARBE: SETB  F0
+        RET
+
+
+LEN_DAT:CLR   C             ; Delka dat = R67-R23
+        MOV   A,R6          ; Kdyz je vetsi nez 127 bytu
+        SUBB  A,R2          ;       A = 80h+Delka/256
+        MOV   R0,A          ; Jinak A = Delka
+        MOV   A,R7
+        SUBB  A,R3
+        JNC   LEN_DA1
+        CLR   C
+        SUBB  A,R4
+        ADD   A,R5
+LEN_DA1:MOV   R1,A
+        JNZ   LEN_DA2
+        MOV   A,R0
+        JNB   ACC.7,LEN_DA3
+        CLR   A
+LEN_DA2:ORL   A,#080H
+LEN_DA3:RET
+
+S_CHKSA:XCH   A,R1          ; Check sum
+        XRL   A,R1
+        INC   A
+        XCH   A,R1
+        RET
+
+%IF (NOT %CX_MERGED_FL) THEN (
+S_SNFC: MOV   DPH,R3          ; Vyslani znaku z CODE
+        MOV   DPL,R2
+        CLR   A
+        MOVC  A,@A+DPTR
+        SJMP  S_SNFB1
+)FI
+
+S_SNFB: MOV   DPH,R3          ; Vyslani znaku z bufferu
+        MOV   DPL,R2
+        MOVX  A,@DPTR
+S_SNFB1:MOV   SBUF_U,A
+        XCH   A,R1          ; Check sum
+        XRL   A,R1
+        INC   A
+        XCH   A,R1
+        SJMP  S_ACCT1
+
+S_R0FB: MOV   DPH,R3          ; Naplneni R0 z bufferu
+        MOV   DPL,R2
+        MOVX  A,@DPTR
+        MOV   R0,A
+        SJMP  S_ACCT1
+
+S_RCTB: MOV   A,SBUF_U      ; Prijem znaku do bufferu
+S_RCTB1:XCH   A,R1          ; Check sum
+        XRL   A,R1
+        INC   A
+        XCH   A,R1
+S_ACCTB:MOV   DPH,R3
+        MOV   DPL,R2
+        MOVX  @DPTR,A
+S_ACCT1:
+S_INCP: INC   R2            ; Pripraveni nasledujici adresy
+       MOV   A,R2
+        JNZ   S_INCP1
+        INC   R3
+S_INCP1:MOV   A,R5
+        XRL   A,R3
+        JNZ   S_EQP
+        MOV   A,R4
+        MOV   R3,A
+S_EQP:  MOV   A,R2          ; Kontrola prostoru pro data
+        XRL   A,R6          ; ACC=0 => konec dat nebo preteceni IB
+        JNZ   S_EQP1
+        MOV   A,R3
+        XRL   A,R7
+S_EQP1: RET
+
+%IF(%TGT_MSC1210) THEN (
+S_RCTBF:XCH   A,R1          ; Check sum
+        XRL   A,R1
+        INC   A
+        XCH   A,R1
+S_ACCTBF:MOV   DPH,R3
+        MOV   DPL,R2
+        MOV   USEC,#R_USEC
+       MOV   C,EAI
+       CLR   EAI
+        MOV   MWS,#01h      ; zapisuj do flash
+        CALL  MSC_WRITE_FLASH
+        MOV   MWS,#00h      ; konec zapisu
+       MOV   EAI,C
+        JMP   S_ACCT1
+)FI
+
+
+%IF (%DY_ADDR)THEN(
+; *************************************
+; Rutina vysilani statusu CMD=0C1H
+UD_SNST:MOV   A,R0
+       MOV   C,ACC.0
+       MOV   F0,C
+       CALL  S_EQP
+       JZ    SNSTA04
+       CALL  S_R0FB
+       MOV   A,R0
+       ANL   A,#0FCH           ; Funkce 0-3, start of cycle 
+       JNZ   SNSTA10
+        JB    uLD_RQA,SNSTA04  ; Snaha o zviditelneni
+       INC   uL_FLD
+       JNB   uLD_RQA,SNSTA04
+SNSTA02:; ORL   uL_FLD,#7
+       MOV   DPTR,#uL_SA
+       MOVX  A,@DPTR
+       MOV   DPTR,#UD_DYSA     ; Server dynamickych adres
+       MOVX  @DPTR,A
+       MOV   A,R0
+       JNZ   SNSTA03           ; Nastavi vlastni adresu
+       MOV   DPTR,#uL_ADR      ; na nulu pri spatnem SN
+       MOVX  @DPTR,A           ; v dotazu nebo funkci 0
+SNSTA03:
+SNSTA04:JMP   SNSTAR
+
+SNSTA10:ANL   A,#0F0H
+       CJNE  A,#010H,SNSTA04
+       MOV   A,R0              ; Prikaz cteni udaju
+       MOV   DPTR,#UD_SFN
+       MOVX  @DPTR,A
+       MOV   DPTR,#SER_NUM     ; Kontrola serioveho cisla
+       MOV   R1,#4
+SNSTA11:CALL  S_EQP
+       JZ    SNSTA12
+       CALL  S_R0FB
+       MOVX  A,@DPTR
+       XRL   A,R0
+       JNZ   SNSTA12
+       INC   DPTR
+       DJNZ  R1,SNSTA11
+SNSTA12:MOV   R0,#0
+       JNZ   SNSTA02           ; Nesouhlasi cislo
+SNSTA13:MOV   C,F0
+       MOV   ACC.0,C
+       MOV   R0,A
+       CALL  ACK_CMD
+       ANL   uL_FLD,#NOT 7
+SNSTA20:CALL  SND_BEB
+        MOV   R2,#LOW SER_NUM; ; Vysle SER_NUM
+        MOV   R3,#HIGH SER_NUM
+        MOV   R6,#LOW (SER_NUM+4)
+        MOV   R7,#HIGH (SER_NUM+4)
+        MOV   R5,AR4
+        CALL  SND_Bx          
+       JB    uLD_SCIP,SNSTA50
+       SETB  uLD_SSIP
+       MOV   DPTR,#UD_STAD     ; ukazatel na buffer stavu
+       MOVX  A,@DPTR           ; do R23 a delka do R6
+       MOV   R2,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R3,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   R6,A
+       MOV   DPTR,#UD_SFN      ; stavova subfunkce
+       MOVX  A,@DPTR
+       CJNE  A,#010H,SNSTA30
+       MOV   A,R4              ; Vyslani zakladnich udaju
+       MOV   R5,A              ; no buff wrap
+       MOV   A,R6
+       JZ    SNSTA50
+       CJNE  A,#2,SNSTA28
+SNSTA27:CALL  S_R0FB           ; vysle 2 byte z UD_STAD
+       MOV   A,R0
+       MOV   R6,A
+       CALL  S_R0FB
+       MOV   A,R6
+       CALL  SND_CHC ; mod
+       MOV   A,R0
+       CALL  SND_CHC ; chyby
+       SJMP  SNSTA50
+SNSTA28:ADD   A,R2
+       MOV   R6,A
+       CLR   A                 ; vysle UD_STLN byte z UD_STAD
+       ADDC  A,R3
+       MOV   R7,A
+       CALL  SND_Bx
+       SJMP  SNSTA50
+SNSTA30:CJNE  A,#011H,SNSTA50
+                               ; Vyslani servisnich udaju
+
+SNSTA50:CALL  SND_END
+       CLR   uLD_SSIP
+SNSTAR: JMP   S_WAITD
+;      JMP   NAK_CMD
+)FI
+
+VS_FNC1:JMP   S_FNC1
+; *************************************
+; Inicializace a sluzby RS-485
+; *************************************
+_uL_FNCC:XCH   A,R7         ; V R7 je cislo funkce
+        MOV    R0,A
+        XCH   A,R7          ; ACC nazpet
+        SJMP  uL_FNC
+uL_INIT:MOV   R0,#0
+        MOV   R2,#0
+uL_FNC: CJNE  R0,#0,VS_FNC1
+S_FN0:  CLR   ES_U          ; Po nastaveni ryclosti a adresy se
+        CLR   ET1           ; touto funkci spusti RS485
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO
+)ELSE(
+        SETB  DR_EO
+)FI
+;       CLR   DR_EI
+        CLR   PT1
+        ANL   TMOD,#00FH
+        ORL   TMOD,#020H
+        SETB  TR1
+        MOV   DPTR,#uL_SPD
+        MOVX  A,@DPTR
+        JNZ   S_FN0_0
+        CALL  S_FN1_0
+S_FN0_0:MOV   TH1,A
+S_FN6_0:MOV   SCON_U,#11010000B
+        ORL   PCON_U,#10000000B ; Bd = OSC/12/16/(256-TH1)
+        SETB  PS
+        CLR   A             ; Vstupni bod pro uzivatelsky baud gen
+        MOV   DPTR,#uL_CMD
+        MOV   R1,#PROC_BUFE-uL_CMD
+S_FN0_1:MOVX  @DPTR,A
+        INC   DPTR
+        DJNZ  R1,S_FN0_1
+        MOV   A,R2          ; Zazalohovani autoinicializace
+       PUSH  ACC
+        MOV   DPTR,#uL_HBIB
+        MOV   R1,#3
+        CALL  LDRFDP
+        POP   ACC
+        JNZ   S_FN0_2      ; Autoinicializace ? 
+        CALL  S_FN3_0
+       MOV   A,R2
+S_FN0_2:MOV   DPTR,#P_NDB+1
+        MOVX  @DPTR,A       ; P_NDB=BEG_IB
+        INC   DPTR
+        MOVX  @DPTR,A       ; H_BIB=BEG_IB
+        MOV   DPTR,#P_NPD+1
+        MOVX  @DPTR,A       ; P_NPD=BEG_IB
+        INC   DPTR
+        INC   DPTR
+        MOVX  @DPTR,A       ; P_AID=BEG_IB
+        MOV   DPH,A
+        CLR   A
+        MOV   DPL,A
+        MOVX  @DPTR,A
+        MOV   DPTR,#H_EIB
+        MOV   A,R2
+        ADD   A,R3
+        MOVX  @DPTR,A       ; H_EIB=END_IB
+        MOV   DPTR,#P_AOB+1
+        MOVX  @DPTR,A       ; P_AOB=BEG_OB
+        INC   DPTR
+        MOVX  @DPTR,A       ; H_BOB=BEG_OB
+        MOV   DPTR,#P_NOB+1
+        MOVX  @DPTR,A       ; P_NOB=BEG_OB
+        INC   DPTR
+        INC   DPTR
+        MOVX  @DPTR,A       ; P_AOD=BEG_OB
+        MOV   DPH,A
+        CLR   A
+        MOV   DPL,A
+        MOVX  @DPTR,A
+        MOV   A,R2
+        ADD   A,R3
+        ADD   A,R4
+        MOV   DPTR,#H_EOB   ; H_EOB=END_OB
+        MOVX  @DPTR,A
+        MOV   A,R2
+        MOV   DPTR,#P_EID+1
+        MOVX  @DPTR,A       ; P_EID=BEG_IB
+        MOV   DPTR,#uL_FRLN
+        MOV   A,#LOW  S_FRLN
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,#HIGH S_FRLN
+        MOVX  @DPTR,A
+    %IF(%WITH_TAILS)THEN(
+        CLR   uLF_OWT
+    )FI
+S_FN0_6:CLR   A               ; Spusteni uLan communication
+        MOV   SER_STACK,A
+        MOV   uL_FLG,A
+        MOV   uL_FLH,A
+%IF (%VECTOR_FL)THEN(
+        MOV   R4,#SINT_U
+        MOV   DPTR,#S_INT
+        CALL  VEC_SET
+        MOV   R4,#V_uL_FNC
+        MOV   DPTR,#uL_FNC
+        CALL  VEC_SET
+        MOV   R4,#V_uL_ADD
+        MOV   DPTR,#uL_EADD
+        CALL  VEC_SET
+)ELSE(
+%IF (0)THEN(            ; Test systemu bez slouceneho
+V_uL_ADD EQU   1EH      ; CODE a XDATA na systemu se sloucenim
+V_uL_FNC EQU   26H
+EXTRN   CODE(VEC_SET)
+        MOV   R4,#SINT_U
+        MOV   DPTR,#S_INT
+        CALL  VEC_SET
+        MOV   R4,#V_uL_FNC
+        MOV   DPTR,#uL_FNC
+        CALL  VEC_SET
+)FI)FI
+%IF(%DY_ADDR)THEN(
+       MOV   uL_FLD,#3 ; uLD_RQA
+       MOV   DPTR,#UD_STLN
+       CLR   A
+       MOVX  @DPTR,A
+)FI
+%IF (%WITH_INTR) THEN(
+        SETB  ES_U
+)FI
+        RET
+
+S_FNC1: CJNE  R0,#1,S_FNC2  ; Nastavi ryclost 57.6 kBd/ACC
+S_FN1_0:MOV   DPTR,#uL_SPD
+        JNZ   S_FN1_1
+        MOV   A,#S_SPEED
+S_FN1_1:CPL   A
+        INC   A
+        MOVX  @DPTR,A
+        MOV   TH1,A
+        RET
+
+S_FNC2: CJNE  R0,#2,S_FNC3  ; Nastavuje adresu podle ACC
+        MOV   DPTR,#uL_ADR
+        MOVX  @DPTR,A
+        RET
+
+S_FNC3: CJNE  R0,#3,S_FNC4  ; Nastavi pocatek IB na R2
+        CLR   ES_U
+        CLR   A
+        MOV   SER_STACK,A
+        CJNE  R2,#0,S_FN3_1 ; delku IB na R3 a delku OB na R4
+S_FN3_0:MOV   R2,#HIGH BEG_IB ; Kdyz je R2=0 provede se autoinicializace
+        MOV   R3,#LENG_IB
+        MOV   R4,#LENG_OB
+S_FN3_1:MOV   DPTR,#uL_HBIB
+        MOV   R1,#3
+        JMP   SVRBDP
+
+S_FNC4:
+
+S_FNC5:
+
+S_FNC6: CJNE  R0,#6,S_FNC7    ; Spusti komunikaci s baud generatorem
+        CLR   ES_U            ; pripravenym uzivatelem
+%IF (%NEG_DR_EO) THEN (
+        CLR   DR_EO
+)ELSE(
+        SETB  DR_EO
+)FI
+        JMP   S_FN6_0
+
+S_FNC7: CJNE  R0,#7,S_FNC8    ; Zapnuti/Vypnuti prijimani vsech zprav na sbernici
+        CLR   uLF_ARC
+        JZ    S_FNC71
+        SETB  uLF_ARC
+S_FNC71:RET
+
+S_FNC8:
+
+S_FNC10:CJNE  R0,#10h,S_FNC11
+uL_O_OP:MOV   A,R5           ; Otevre vystupni zpravu pro Dadr R4 s Com R5
+       MOV   R6,#uLBF_AAP
+       JB    ACC.7,uL_O_OP1
+       MOV   R6,#uLBF_ARQ
+       JB    ACC.6,uL_O_OP2
+uL_O_OP1:CJNE R4,#0,uL_O_OP3
+uL_O_OP2:DEC  R6             ; No acknowledge uLBF_ACK
+uL_O_OP3:MOV  R7,#0
+uL_O_NEW:                    ; Dalsi parametry Status R6, Stamp R7
+       PUSH  DPL             ; pri promiskuitnim rezimu uLF_ARC
+        PUSH  DPH            ; je SAdr nastaveno na uL_ISAD
+       MOV   DPTR,#P_NOB
+        CALL  S_GER23
+        CALL  S_PUR23
+        MOV   A,R4            ; DAdr
+        ANL   A,#7FH
+        CALL  uL_WRB0
+        MOV   DPTR,#uL_ADR    ; Vlastni Adresa do SAdr
+       JNB   uLF_ARC,uL_O_OP6
+        MOV   DPTR,#uL_ISAD   ; Promiskuitni adresa do SAdr
+uL_O_OP6:MOVX A,@DPTR
+        CALL  uL_WRB0
+        CALL  uL_WRB0         ; End pointer Low
+        CALL  uL_WRB0         ; End pointer High
+        MOV   A,R5            ; Command
+        CALL  uL_WRB0
+        MOV   A,R6            ; Status
+        CALL  uL_WRB0
+        MOV   A,R7            ; Stamp
+        CALL  uL_WRB0
+       JNB   F0,uL_O_OP8
+uL_O_ABRT1:
+uL_O_OP7:MOV  DPTR,#P_NOB     ; Blokovani uL_O_CL v pripade
+        CALL  S_GER23        ; nespravne otevrene zpravy
+        CALL  S_PUR23
+uL_O_OP8:POP  DPH
+        POP   DPL
+        RET
+
+S_GER23:MOVX  A,@DPTR
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+        INC   DPTR
+        RET
+
+S_PUR23:MOV   A,R2
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R3
+        MOVX  @DPTR,A
+        INC   DPTR
+        RET
+
+S_FNC11:CJNE  R0,#11h,S_FNC12
+uL_WR: JB    F0,uL_WRR       ; Zapise R45 bytu z @DP - Rusi R012345
+uL_WR1: MOV   A,R4
+        ORL   A,R5
+        JZ    uL_WRR
+        CALL  uL_WRB
+        JB    F0,uL_WRR
+        DEC   R4
+        CJNE  R4,#-1,uL_WR1
+        DEC   R5
+        SJMP  uL_WR1
+uL_WRR: RET
+
+uL_I23O:INC   R2             ; Posouva ukazatel R23 ve vystupnim
+        CJNE  R2,#0,uL_I23R   ; cyklickem bufferu a prepisuje ho
+        INC   R3             ; do DP
+        MOV   DPTR,#H_EOB
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_I23R
+        MOV   DPTR,#H_BOB
+        MOVX  A,@DPTR
+        MOV   R3,A
+uL_I23R:MOV   DPL,R2
+        MOV   DPH,R3
+uL_O_CE:RET
+
+S_FNC12:CJNE  R0,#12h,S_FNC13
+uL_O_CL:JB    F0,uL_O_CE      ; Uzavre vystupni zpravu
+        MOV   R6,DPL
+        MOV   R7,DPH
+        MOV   DPTR,#P_AOD
+        MOVX  A,@DPTR        ; R45 ukazatel za konec dat
+        MOV   R4,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R5,A
+       MOV   DPL,R4
+       MOV   DPH,A
+        CLR   A
+        MOVX  @DPTR,A        ; Nastavi DAdr pristiho bloku na 0
+        MOV   DPTR,#P_NOB     ; Pristi blok bude zacinat na R45
+        MOVX  A,@DPTR
+        MOV   R2,A
+       MOV   R0,A
+        MOV   A,R4
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+       MOV   R1,A            ; Zacatek aktualniho bloku do R01 a R23
+        MOV   A,R5
+        MOVX  @DPTR,A
+        XRL   A,R3
+        JNZ   uL_O_C1
+        MOV   A,R4           ; Vylouceni snahy o uL_O_CL
+        XRL   A,R2           ; bez predchoziho uL_O_OP
+        JZ    uL_O_C6
+uL_O_C1:CALL  uL_I23O        ;Preskocit DAdr
+        CALL  uL_I23O        ;Preskocit SAdr
+        MOV   A,R4
+        MOVX  @DPTR,A        ; Ulozi ukazatel na pristi blok
+        CALL  uL_I23O
+        MOV   A,R5
+        MOVX  @DPTR,A
+    %IF(%WITH_TAILS)THEN(
+        CALL  uL_I23O
+        CALL  uL_I23O        ; Preskocit Command
+       MOVX  A,@DPTR         ; Status
+        ;MOV   C,ACC.uLBF_TAILb
+        MOV   C,ACC.5         ; !!!! ASX8051 is broken
+        JNC   uL_O_C5
+       JB    uLF_OWT,uL_O_C5
+       MOV   DPTR,#P_AOT     ; Ulozit zacatek useku zprav
+       MOV   A,R0            ; spojenych tailovanim
+       MOVX  @DPTR,A
+       INC   DPTR
+       MOV   A,R1
+       MOVX  @DPTR,A
+       SETB  uLF_OWT
+uL_O_C4:MOV   DPL,R6
+        MOV   DPH,R7
+       RET
+    )FI
+uL_O_C5:MOV   DPL,R0         ; Pocatek bloku DP=R01
+        MOV   DPH,R1
+       MOVX  A,@DPTR
+        MOV   R4,A
+        ORL   A,#80H          ; Nastavenim DAdr.8 oznaci
+        MOVX  @DPTR,A        ; blok za pripraveny k odeslani
+    %IF(%WITH_TAILS)THEN(
+        JC    uL_O_C4
+       JNB   uLF_OWT,uL_O_C6
+       CLR   uLF_OWT
+        MOV   DPTR,#P_AOT
+       MOVX  A,@DPTR
+       MOV   R0,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   DPL,R0
+       MOV   DPH,A
+       MOVX  A,@DPTR
+        ORL   A,#80H          ; Nastavi DAdr.8 prvniho bloku
+        MOVX  @DPTR,A        ; tailovaneho useku a tim zpusti
+    )FI                              ; jeho zpracovani
+uL_O_C6:MOV   DPL,R6
+        MOV   DPH,R7
+       SJMP  uL_O_ST
+
+S_FNC13:CJNE  R0,#13h,S_FNC14
+uL_WRB: MOVX  A,@DPTR         ; Zapise byte z @DP - Rusi R0123
+uL_WRB0:MOV   R3,A
+        MOV   R0,DPL
+        MOV   R1,DPH
+        JB    F0,uL_WRBE
+        MOV   DPTR,#P_AOD
+        MOVX  A,@DPTR
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   DPH,A
+        XCH   A,R3
+        MOV   DPL,R2
+        MOVX  @DPTR,A
+        INC   R2
+        CJNE  R2,#0,uL_WRB1
+        INC   R3
+        MOV   DPTR,#H_EOB
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_WRB1
+        MOV   DPTR,#H_BOB
+        MOVX  A,@DPTR
+        MOV   R3,A
+uL_WRB1:MOV   DPTR,#P_AOB+1
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_WRB3
+        MOV   DPTR,#P_AOB
+        MOVX  A,@DPTR
+        XRL   A,R2
+        JNZ   uL_WRB3
+        INC   DPTR
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_WRB3
+uL_WRBE:SETB  F0
+        MOV   DPL,R0
+        MOV   DPH,R1
+        RET
+
+uL_WRB3:MOV   DPTR,#P_AOD
+uL_WRB4:MOV   A,R2
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R3
+        MOVX  @DPTR,A
+        MOV   DPL,R0
+        MOV   DPH,R1
+        INC   DPTR
+        RET
+
+uL_O_ST:SETB  uLF_RS
+        CLR   ES_U
+        JNB   uLF_NB,uL_O_SU
+        JB    uLF_SN,uL_O_SU
+        SETB  TI_U
+uL_O_SU:
+%IF (%WITH_INTR) THEN(
+       SETB  ES_U
+)FI
+       RET
+
+S_FNC14:CJNE  R0,#14h,S_FNC15
+uL_O_LN:MOV   R0,DPL
+        MOV   R1,DPH
+        MOV   DPTR,#P_AOD
+        MOVX  A,@DPTR
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+        MOV   DPTR,#P_AOB
+        SETB  C
+        MOVX  A,@DPTR
+        SUBB  A,R2
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        INC   DPTR
+        JMP   uL_O_L1
+
+S_FNC15:CJNE  R0,#15h,S_FNC16
+%IF (%CX_MERGED_FL) THEN (
+uL_WRc: JMP   uL_WR
+)ELSE(
+uL_WRc: JB    F0,uL_WRcR      ; Zapise R45 bytu z CODE @DP
+uL_WRc1:MOV   A,R4            ; Rusi R012345
+        ORL   A,R5
+        JZ    uL_WRcR
+        CLR   A
+        MOVC  A,@A+DPTR
+        CALL  uL_WRB0
+       JB    F0,uL_WRcR
+        DEC   R4
+        CJNE  R4,#-1,uL_WRc1
+        DEC   R5
+        SJMP  uL_WRc1
+uL_WRcR:RET
+)FI
+
+S_FNC16:CJNE  R0,#16h,S_FNC17 ; abors msg
+uL_O_ABRT:PUSH DPL
+        PUSH  DPH
+       JMP   uL_O_ABRT1
+
+
+S_FNC23:CJNE  R0,#23h,S_FNC20
+uL_RDB: MOV   R0,DPL          ; Nacte byte na @DP - Rusi R0123
+        MOV   R1,DPH
+        JB    F0,uL_WRBE
+        MOV   DPTR,#P_AID
+        MOVX  A,@DPTR
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+        MOV   DPTR,#P_EID
+        MOVX  A,@DPTR
+        XRL   A,R2
+        JNZ   uL_RDB1
+        INC   DPTR
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_RDB1
+        JMP   uL_WRBE
+uL_RDB1:MOV   DPL,R2
+        MOV   DPH,R3
+        MOVX  A,@DPTR
+        MOV   DPL,R0
+        MOV   DPH,R1
+        MOVX  @DPTR,A
+        INC   R2
+        CJNE  R2,#0,uL_RDB2
+        INC   R3
+        MOV   DPTR,#H_EIB
+        MOVX  A,@DPTR
+        XRL   A,R3
+        JNZ   uL_RDB2
+        MOV   DPTR,#H_BIB
+        MOVX  A,@DPTR
+        MOV   R3,A
+uL_RDB2:MOV   DPTR,#P_AID
+       MOV   A,R2
+        MOVX  @DPTR,A
+        INC   DPTR
+        MOV   A,R3
+        MOVX  @DPTR,A
+        MOV   DPL,R0
+        MOV   DPH,R1
+       MOVX  A,@DPTR
+        INC   DPTR
+        RET
+
+S_FNC17:CJNE  R0,#17h,S_FNC23
+uL_WRi: JB    F0,uL_WRiR      ; Zapise R45 bytu z IDATA dle DPL
+       MOV   A,R4            ; Rusi R012345
+        MOV   R5,DPL
+        JZ    uL_WRiR
+uL_WRi1:MOV   A,R5
+       MOV   R0,A
+       MOV   A,@R0
+        CALL  uL_WRB0
+       JB    F0,uL_WRiR
+       INC   R5
+        DJNZ  R4,uL_WRi1
+uL_WRiR:MOV   DPL,R5
+       MOV   R5,#0
+       RET
+
+S_FNC20:CJNE  R0,#20h,S_FNC21
+uL_I_OP:PUSH  DPL             ; Otevre vstupni zpravu : vyplni
+        PUSH  DPH             ; uL_ISAD,uL_IDAD,uL_ICOM,uL_IST,uL_ISTA
+        JB    F0,uL_I_OR
+        MOV   DPTR,#P_NPD
+        CALL  S_GER23
+        CALL  S_PUR23
+       INC   R3
+       MOV   DPTR,#P_EID
+       CALL  S_PUR23
+        MOV   DPTR,#uL_ISAD
+        CALL  uL_RDB          ; SAdr
+       MOV   R4,A
+        JNB   ACC.7,uL_I_OE
+        MOV   DPTR,#uL_ISAD
+        ANL   A,#7FH         ; Odmaskuj nejvyssi bit
+       MOV   R4,A            ; Drive bylo se 7 bitem
+        MOVX  @DPTR,A
+        MOV   DPTR,#uL_IDAD   ; DAdr
+        CALL  uL_RDB
+        ANL   A,#7FH         ; Zrusit nejvyssi bit
+       MOV   R7,A
+        MOV   DPTR,#P_EID     ; Konec dat
+        CALL  uL_RDB
+        CALL  uL_RDB
+        MOV   DPTR,#uL_ICOM   ; Command
+        CALL  uL_RDB
+       MOV   R5,A
+        MOV   DPTR,#uL_IST    ; Status
+        CALL  uL_RDB
+       MOV   R6,A
+        MOV   DPTR,#uL_ISTA   ; Stamp
+        CALL  uL_RDB
+       XCH   A,R7
+       MOV   R3,A
+uL_I_OR:POP   DPH
+        POP   DPL
+        RET
+
+uL_I_OE:SETB  F0
+        MOV   DPTR,#P_NPD
+        CALL  S_GER23
+        MOV   DPTR,#P_EID
+        CALL  S_PUR23
+        SJMP  uL_I_OR
+
+S_FNC21:CJNE  R0,#21h,S_FNC22
+uL_RD: JB    F0,uL_RDR       ; Nacte R45 bytu na @DP - Rusi R012345
+uL_RD1: MOV   A,R4
+        ORL   A,R5
+        JZ    uL_RDR
+        CALL  uL_RDB
+        JB    F0,uL_RDR
+        DEC   R4
+        CJNE  R4,#-1,uL_RD1
+        DEC   R5
+        SJMP  uL_RD1
+uL_RDR: RET
+
+S_FNC22:CJNE  R0,#22h,S_FNC24
+uL_I_CL:MOV   R6,DPL          ; Uzavre vstupni zpravu
+        MOV   R7,DPH
+        JB    F0,uL_I_CR
+        MOV   DPTR,#P_EID
+        CALL  S_GER23
+        MOV   DPTR,#P_NPD
+        CALL  S_PUR23
+uL_I_CR:MOV   DPL,R6
+        MOV   DPH,R7
+        RET
+
+S_FNC24:CJNE  R0,#24h,S_FNC25
+uL_I_LN:MOV   R0,DPL
+        MOV   R1,DPH
+        MOV   DPTR,#P_AID
+        MOVX  A,@DPTR
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+        MOV   DPTR,#P_EID
+        CLR   C
+        MOVX  A,@DPTR
+        SUBB  A,R2
+        MOV   R2,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   DPTR,#H_BIB
+uL_O_L1:SUBB  A,R3
+        MOV   R3,A
+        JNC   uL_I_L1
+        MOVX  A,@DPTR
+        XCH   A,R3
+        CLR   C
+        SUBB  A,R4
+        MOV   R3,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        ADD   A,R3
+        MOV   R3,A
+uL_I_L1:CLR   C
+        MOV   A,R2
+        SUBB  A,R4
+        MOV   A,R3
+        SUBB  A,R5
+        JNC   uL_I_L3
+uL_I_L2:SETB  F0
+        MOV   A,R2
+        MOV   R4,A
+        MOV   A,R3
+        MOV   R5,A
+uL_I_L3:CLR   C
+        MOV   DPTR,#uL_FRLN
+        MOVX  A,@DPTR
+        MOV   R2,A
+        SUBB  A,R4
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R3,A
+        SUBB  A,R5
+        JC    uL_I_L2
+        MOV   DPL,R0
+        MOV   DPH,R1
+        RET
+
+S_FNC25:CJNE  R0,#25h,S_FNC26   ; pocet byte do konce zpravy (delka zpravy)
+uL_I_L: MOV   R0,DPL
+        MOV   R1,DPH
+        MOV   DPTR,#P_AID
+        MOVX  A,@DPTR
+        MOV   R4,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        MOV   R5,A
+        MOV   DPTR,#P_EID
+        CLR   C
+        MOVX  A,@DPTR
+        SUBB  A,R4
+        MOV   R4,A
+        INC   DPTR
+        MOVX  A,@DPTR
+        SUBB  A,R5
+        MOV   R5,A
+        JNC   uL_I_LL
+        MOV   DPTR,#H_BIB     ; Nutna korekce cyklicnosti 
+       MOVX  A,@DPTR         ; R5=R5+(H_EIB-H_BIB)
+       SUBB  A,R5            ; R5=H_EIB-(H_BIB-R5-1)-1
+       MOV   R5,A
+       INC   DPTR
+       MOVX  A,@DPTR ; H_EIB
+       SETB  C
+       SUBB  A,R5
+       MOV   R5,A
+uL_I_LL:MOV   DPL,R0
+        MOV   DPH,R1
+       RET
+
+S_FNC26:CJNE  R0,#26h,S_FNC27 ; je na vstupu zprava
+uL_I_NE:JBC   uLF_INE,uL_I_N2
+uL_I_N1:CLR   CY
+       RET
+uL_I_N2:MOV   DPTR,#P_NPD
+       MOVX  A,@DPTR
+       MOV   R0,A
+       INC   DPTR
+       MOVX  A,@DPTR
+       MOV   DPH,A
+       MOV   DPL,R0
+       MOVX  A,@DPTR
+       JZ    uL_I_N1
+       SETB  uLF_INE
+       SETB  CY
+       RET
+
+S_FNC27:CJNE  R0,#27h,S_FNC28
+uL_RDi: JB    F0,uL_RDiR      ; Cte R45 bytu z IDATA dle DPL
+       MOV   A,R4            ; Rusi R012345
+        MOV   R5,DPL
+        JZ    uL_RDiR
+uL_RDi1:MOV   DPTR,#uL_TMPB   ; Toto je nutne, aby uL_RDB nezapsalo
+       CALL  uL_RDB          ; data na nahodnou adresu
+       JB    F0,uL_RDiR
+       MOV   R0,A
+       MOV   A,R5
+       XCH   A,R0
+       MOV   @R0,A
+        INC   R5
+        DJNZ  R4,uL_RDi1
+uL_RDiR:MOV   DPL,R5
+       MOV   R5,#0
+       RET
+
+S_FNC28:
+%IF (%DY_ADDR)THEN(
+S_FNC30:CJNE  R0,#30h,S_FNC31
+uL_T_RQA:CLR  A
+       JNB  uLD_RQA,S_FNC30R
+       DEC  uL_FLD
+       INC  A
+S_FNC30R:RET
+)FI
+S_FNC31:
+       RET
+
+; Nacte od R2 pres DP R1 registru
+LDRFDP :MOV   A,PSW
+        ANL   A,#018H
+        MOV   R0,A
+        INC   R0
+LDRFDP1:INC   R0
+        MOVX  A,@DPTR
+        MOV   @R0,A
+        INC   DPTR
+        DJNZ  R1,LDRFDP1
+        RET
+
+; Ulozi od R2 pres DP R1 registru
+SVRBDP :MOV   A,PSW
+        ANL   A,#018H
+        MOV   R0,A
+        INC   R0
+S_FN3_2:INC   R0
+        MOV   A,@R0
+        MOVX  @DPTR,A
+        INC   DPTR
+        DJNZ  R1,S_FN3_2
+        RET
+
+_uL_STR:
+uL_STR: JBC   ES_U,uL_STRG
+        RET
+uL_STRG:JNB   uLF_NA,uL_STRE
+        JNB   uLF_NB,uL_STRF
+        JNB   uLF_RS,uL_STRF
+        SETB  TI_U
+uL_STRF:SETB  uLF_NB
+uL_STRE:SETB  uLF_NA
+%IF (%WITH_INTR) THEN(
+        SETB  ES_U
+)FI
+        RET
+
+        END
diff --git a/ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.h b/ulan/embedded/arch/mcs51/generic/libs/ulan/ulan.h
new file mode 100644 (file)
index 0000000..8a5a8e3
--- /dev/null
@@ -0,0 +1,259 @@
+#ifndef _ULAN_H
+#define _ULAN_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#ifndef uchar
+ #define uchar unsigned char
+#endif
+
+typedef int ul_ssize_t;
+typedef unsigned int ul_size_t;
+typedef int ul_fd_t;
+
+typedef struct ul_idstr_t {
+  char *name;
+  char len; 
+} ul_idstr_t;
+
+#define UL_FD_INVALID 0
+
+#ifndef UL_WITH_HANDLE
+  #define UL_WITHOUT_HANDLE
+#endif /*UL_WITH_HANDLE*/
+
+#define UL_ARGPTRTYPE xdata
+//#define UL_ARGPTRTYPE
+
+#undef UL_WITH_NAKED
+
+#ifdef UL_WITH_NAKED
+  #define UL_FNC_NAKED _naked
+#else /*UL_WITH_NAKED*/
+  #define UL_FNC_NAKED
+#endif /*UL_WITH_NAKED*/
+
+#if !defined(SDCC_MODEL_LARGE) || !defined(SDCC)
+  #define UL_FNC_REENTRANT
+#else
+  #define UL_FNC_REENTRANT reentrant
+#endif
+
+/*******************************************************************/
+
+/* ul_mess_head flags definition defines proccessing 
+   of message or its frames stored in bll */
+/*#define UL_BFL_LOCK 0x00*/   /* locked message is pointed only once */
+/*#define UL_BFL_MSST 0x00*/      /* Message must be received by some proccess */
+/*#define UL_BFL_M2IN 0x00*/      /* After succesfull proccessing move to proc_bll */
+/*#define UL_BFL_LNMM 0x00*/      /* Length of received frame must match expected len */
+/*#define UL_BFL_VERL 0x00*/      /* Verify free space in buffer of destination station */
+/*#define UL_BFL_REWA 0x00*/      /* If error occurs do wait with retry */
+
+#define UL_BFL_NORE 0x40      /* Do not try to repeat if error occurs */
+#define UL_BFL_TAIL 0x20      /* Multiframe message continues by next bll block */
+#define UL_BFL_SND  0x00      /* Send this frame */
+#define UL_BFL_REC  0x10      /* Receive answer frame into this bll block */
+#define UL_BFL_FAIL 0x08      /* Message cannot be proccessed - error */
+#define UL_BFL_PROC 0x04      /* Processed outgoing message */
+#define UL_BFL_PRQ  0x02      /* Request imediate proccessing of frame by receiver station */
+#define UL_BFL_ARQ  0x01      /* Request imediate acknowledge by receiving station */
+
+typedef struct ul_msginfo {
+       uchar   dadr;           /* destignation address */
+       uchar   sadr;           /* source address */
+       uchar   cmd;            /* command/socket number */
+       uchar   flg;            /* message flags */
+       uchar   stamp;          /* unigue message number */
+       unsigned len;           /* length of frame */
+} ul_msginfo;
+
+/*******************************************************************/
+/* command definitions */
+
+/* standard command codes 
+   00H .. 3FH    store to buffer 
+   40H .. 7FH    store to buffer without ACK
+   80H .. 9FH    proccess at onece
+   A0H .. BFH    process with additional receive
+   C0H .. FFH    process with additional send
+*/
+
+#define UL_CMD_RES     0x80    /* Reinitialize RS485 */
+#define UL_CMD_SFT     0x81    /* Test free space in input buffer */
+#define UL_CMD_SYN      0x85    /* Sychronization */
+#define UL_CMD_SID     0xF0    /* Send identification */
+#define UL_CMD_SFI     0xF1    /* Send amount of free space in IB */
+#define UL_CMD_TF0     0x98    /* End of stepping */
+#define UL_CMD_TF1     0x99    /* Begin of stepping */
+#define UL_CMD_STP     0x9A    /* Do step */
+#define UL_CMD_DEB     0x9B    /* Additional debug commands */
+#define UL_CMD_SPC     0xDA    /* Send state - for 8051 PCL PCH PSW ACC */
+
+#define UL_CMD_RDM     0xF8    /* Read memory   T T B B L L */
+#define UL_CMD_WRM     0xB8    /* Write mamory  T T B B L L */
+#define UL_CMD_ERM      0x88    /* Erase memory T T B B L L */
+
+/* uLan parameter setup and initialization functions */
+char   ul_drv_init(void);
+char   ul_drv_set_adr(uchar addr);
+char   ul_drv_set_bdiv(uchar bdiv);
+void   ul_str(void);
+void    ul_int(void);
+
+/* uLan standard IO functions */
+ul_fd_t        ul_open(const char *dev_name, const char *options);
+int    ul_close(ul_fd_t ul_fd);
+ul_ssize_t ul_read(ul_fd_t ul_fd,void *buffer, ul_size_t size);
+ul_ssize_t ul_write(ul_fd_t ul_fd,const void *buffer, ul_size_t size);
+int    ul_newmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    ul_freemsg(ul_fd_t ul_fd);
+int    ul_acceptmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    ul_actailmsg(ul_fd_t ul_fd,ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    ul_addfilt(ul_fd_t ul_fd,const ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    ul_abortmsg(ul_fd_t ul_fd);
+uchar  ul_inepoll(ul_fd_t ul_fd);
+int    ul_drv_debflg(ul_fd_t ul_fd,int debug_msk);
+int    ul_fd_wait(ul_fd_t ul_fd, int wait_sec);
+int    ul_stroke(ul_fd_t ul_fd);
+int    ul_setmyadr(ul_fd_t ul_fd, int newadr);
+int    ul_setidstr(ul_fd_t ul_fd, const char *idstr);
+
+#ifdef UL_WITHOUT_HANDLE
+ul_ssize_t __ul_read_avail(void) UL_FNC_NAKED;
+ul_ssize_t __ul_read(void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
+ul_ssize_t __ul_write(const void *buffer, ul_size_t size) UL_FNC_NAKED UL_FNC_REENTRANT;
+int    __ul_newmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED;
+int    __ul_tailmsg(const ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED;
+int    __ul_freemsg() UL_FNC_NAKED;
+int    __ul_acceptmsg(ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED;
+int    __ul_actailmsg(ul_msginfo UL_ARGPTRTYPE  *msginfo) UL_FNC_NAKED;
+int    __ul_addfilt(const ul_msginfo UL_ARGPTRTYPE  *msginfo);
+int    __ul_abortmsg(void);
+uchar  __ul_inepoll(void) UL_FNC_NAKED;
+int    __ul_o_close(void) UL_FNC_NAKED;
+int    __ul_i_close(void) UL_FNC_NAKED;
+
+#define ul_read(ul_fd, buffer, size) __ul_read(buffer, size)
+#define ul_write(ul_fd, buffer, size) __ul_write(buffer, size)
+#define ul_newmsg(ul_fd, msginfo) __ul_newmsg(msginfo)
+#define ul_tailmsg(ul_fd, msginfo) __ul_tailmsg(msginfo)
+#define ul_freemsg(ul_fd) __ul_freemsg()
+#define ul_acceptmsg(ul_fd, msginfo) __ul_acceptmsg(msginfo)
+#define ul_actailmsg(ul_fd, msginfo) __ul_actailmsg(msginfo)
+#define ul_addfilt(ul_fd, msginfo) __ul_addfilt(msginfo)
+#define ul_abortmsg(ul_fd) __ul_abortmsg()
+#define ul_inepoll(ul_fd) __ul_inepoll()
+#define ul_i_close(ul_fd) __ul_i_close()
+#define ul_o_close(ul_fd) __ul_o_close()
+#define ul_stroke(ul_fd) ul_str() 
+#define ul_setmyadr(ul_fd,newadr) ul_drv_set_adr(newadr)
+#define ul_setidstr(ul_fd,idstr)
+
+#endif /*UL_WITHOUT_HANDLE*/
+
+/* simple message operations */
+
+int ul_send_command(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                    const void *buf,int len);
+int ul_send_command_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                         const void *buf,int len);
+int ul_send_query(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                  const void *buf,int len);
+int ul_send_query_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                      const void *bufin,int lenin,void **bufout,int *lenout);
+
+/* basic uLan commands/services */
+
+#define UL_CMD_OISV    0x10    /* Object Interface Service */
+#define UL_CMD_LCDABS  0x4f    /* Absorbance data block */
+#define UL_CMD_LCDMRK  0x4e    /* Mark */
+#define UL_CMD_NCS     0x7f    /* Network Control Service */
+#define UL_CMD_GST     0xc1    /* Fast module get status */
+
+/* definitions of basic uLan OI commands */
+
+#define ULOI_AOID   10 /* name is defined in ASCII for DOIx */
+#define ULOI_DOII   12 /* description of input objects */
+#define ULOI_DOIO   14 /* description of output objects */
+#define ULOI_QOII   16 /* ID numbers of recognized input objects */
+#define ULOI_QOIO   18 /* ID numbers of recognized output objects */
+#define ULOI_RDRQ   20 /* object values read request */
+#define ULOI_STATUS 30 /* read instrument status */
+#define ULOI_ERRCLR 31 /* clear error status */
+
+typedef struct uloi_coninfo_t {
+  uchar adr;   /* address of target module */
+  uchar cmd;   /* service/cmd number for uLOI on target */
+  uchar bcmd;  /* service/cmd number for returned messages */
+  uchar sn;    /* sequence counter */
+  uchar bsn;   /* sequence counter of target module */
+  uchar outflg;        /* flags used for outgoing messages */
+  ul_fd_t ul_fd;/* handle for ul_drv */
+  ul_fd_t ul_fd1;/* the auxiliary handle for ULOI direct reply */
+  int timeout; /* timeout */
+  uchar error; /* error condition occurred */
+  uchar state; /* internal state */
+} uloi_coninfo_t;
+
+/* definitions of basic uLan OI functions */
+
+uloi_coninfo_t* uloi_open(char *ul_dev_name,int adr,int cmd,
+                       int bcmd, int timeout);
+void uloi_close(uloi_coninfo_t *coninfo);
+int uloi_transfer(uloi_coninfo_t *coninfo,
+                 uchar *bufin,int lenin,uchar **bufout,int *lenout);
+int uloi_set_var(uloi_coninfo_t *coninfo,int oid, void *val, int size);
+int uloi_get_var(uloi_coninfo_t *coninfo,int oid, void *val, int size);
+int uloi_set_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned val);
+int uloi_get_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned *val);
+int uloi_send_cmd(uloi_coninfo_t *coninfo,int oid);
+int uloi_get_oids(uloi_coninfo_t *coninfo,int list,int **oids_list);
+int uloi_get_oiddes(uloi_coninfo_t *coninfo,int list, int oid);
+int uloi_get_aoiddes(uloi_coninfo_t *coninfo,int list,char *aoid);
+
+/* UL_CMD_NCS  Network Control Service */
+
+#define ULNCS_ADR_RQ     0xC0    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_SET_ADDR   0xC1    /* SN0 SN1 SN2 SN3 NEW_ADR */
+#define ULNCS_SID_RQ     0xC2    /* send serial num and ID string request */
+#define ULNCS_SID_RPLY   0xC3    /* SN0 SN1 SN2 SN3 ID ... */
+#define ULNCS_ADDR_NVSV          0xC4    /* SN0 SN1 SN2 SN3 - save addres to EEPROM */
+#define ULNCS_BOOT_ACT    0xC5    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_BOOT_ACK    0xC6    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_SET_SN      0xE0    /* SN0 SN1 SN2 SN3 */
+
+/* debugging support routines */
+/*int uloi_debug_flg;*/
+
+#define UL_LOGL_MASK (0xff)
+#define UL_LOGL_CONT (0x1000)
+
+/*typedef void (ul_log_fnc_t)(const char *domain, int level,
+       const char *format, va_list ap);*/
+
+/*void ul_log(const char *domain, int level,
+       const char *format, ...);*/
+//#define ul_log(domain,level,format, ...)
+
+/*void ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags);*/
+//#define ul_log_redir(log_fnc, add_flags)
+
+#ifdef UL_WITHOUT_HANDLE
+  /* 
+   * this is used to preserve space and speed consumed by creation
+   * of many local instances of these variables on small MCU systems
+   */
+  extern ul_fd_t       ul_fd;
+  extern UL_ARGPTRTYPE ul_msginfo msginfo;
+#endif /*UL_WITH_HANDLE*/
+        
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _ULAN_H */
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Entries b/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Entries
new file mode 100644 (file)
index 0000000..8b2ceb9
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.2/Wed Nov 16 22:22:30 2005//
+D/defines////
+D/libs////
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Repository b/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Repository
new file mode 100644 (file)
index 0000000..b5fb521
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-at89c51ed2
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Root b/ulan/embedded/arch/mcs51/mach-at89c51ed2/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile b/ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile.omk b/ulan/embedded/arch/mcs51/mach-at89c51ed2/Makefile.omk
new file mode 100644 (file)
index 0000000..dba8475
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines libs
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Entries b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..cd75c27
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:25 2005//
+/mcu_regs.h/1.3/Thu Nov  9 23:18:57 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Repository b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..8b96f48
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-at89c51ed2/defines
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Root b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile.omk b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..63c54d1
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+include_HEADERS = mcu_regs.h 
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/mcu_regs.h b/ulan/embedded/arch/mcs51/mach-at89c51ed2/defines/mcu_regs.h
new file mode 100644 (file)
index 0000000..06c38a8
--- /dev/null
@@ -0,0 +1,20 @@
+// Texas Instruments
+// Name:       Reg1210.h
+// Revision:   1.0
+// Description: Header file for TI MSC1210 microcontroller
+
+///////////////////////////////////////////////////////////////////////////////
+// Keyval
+#define KVPB_CHUNK_SIZE 1
+
+#ifdef SDCC
+  #include <at89c51ed2.h>
+sfr at 0xD1 FCON        ;
+sfr at 0x8F CKCON0      ;
+#else
+  #ifdef __KEIL__
+    #include <atmel/at89c51ed2.h>
+  #else
+    #error Unknown 8051 kompiler
+  #endif
+#endif
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Entries b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..31a0d4a
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Wed Nov 16 22:22:30 2005//
+/Makefile.omk/1.1/Wed Nov 16 22:22:30 2005//
+D/flash////
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Repository b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..c94a73d
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-at89c51ed2/libs
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Root b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile.omk b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..0d091d2
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = flash
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Entries b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Entries
new file mode 100644 (file)
index 0000000..ff33600
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Wed Nov 16 22:22:30 2005//
+/Makefile.omk/1.1/Wed Nov 16 22:22:30 2005//
+/mcuflash.c/1.2/Thu Aug  3 13:36:40 2006//
+/mcuflash.h/1.2/Thu Aug  3 13:36:40 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Repository b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Repository
new file mode 100644 (file)
index 0000000..ea1cdb5
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Root b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile.omk b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/Makefile.omk
new file mode 100644 (file)
index 0000000..cfa93de
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LIBRARIES = mcuflash 
+include_HEADERS = mcuflash.h
+mcuflash_SOURCES = mcuflash.c 
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.c b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.c
new file mode 100644 (file)
index 0000000..cf2b643
--- /dev/null
@@ -0,0 +1,58 @@
+#include "mcuflash.h"
+#include "mcu_regs.h"
+
+bit ea,flashed;
+
+int flash_erase(void *base,int size) {
+  ea=EA;EA=0;
+  flashed=0;
+  while (size--) {
+    FCON=0x08;
+    *(uint8_t xdata*)base=0xff;
+    FCON=0x0;
+    flashed=1;
+    if (((unsigned char)base&0x7f)==0x7f) { /* end of page */
+      FCON=0x50;FCON=0xA0;
+      while(FCON&1);
+      flashed=0;
+    }
+    base=(uint8_t *)base+1;
+  }
+  if (flashed) {
+    FCON=0x50;FCON=0xA0;
+    while(FCON&1);
+  }
+  EA=ea;
+  return 0;
+}
+
+int flash_copy(void *des,const void *src,int len) {
+  ea=EA;EA=0;
+  flashed=0;
+  while(len--) {
+    uint8_t data val;
+    val=*(uint8_t *)src;
+    FCON=0x08;
+    *(uint8_t xdata*)des=val;
+    FCON=0x0;
+    flashed=1;
+    if (((unsigned char)des&0x7f)==0x7f) { /* end of page */
+      FCON=0x50;FCON=0xA0;
+      while(FCON&1);
+      flashed=0;
+    }
+    src=(uint8_t *)src+1;
+    des=(uint8_t *)des+1;
+  }
+  if (flashed) {
+    FCON=0x50;FCON=0xA0;
+    while(FCON&1);
+  }
+  EA=ea;
+  return len;
+}
+
+int flash_flush(void)
+{
+  return 0;
+}
diff --git a/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.h b/ulan/embedded/arch/mcs51/mach-at89c51ed2/libs/flash/mcuflash.h
new file mode 100644 (file)
index 0000000..b39b291
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _MCUFLASH_H
+#define _MCUFLASH_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+int flash_erase(void *base,int size);
+int flash_copy(void *des,const void *src,int len);
+int flash_flush(void);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _MSCFLASH_H */
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Entries b/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Entries
new file mode 100644 (file)
index 0000000..86f7644
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:25 2005//
+D/defines////
+D/libs////
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Repository b/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Repository
new file mode 100644 (file)
index 0000000..bd56a02
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-msc1210
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Root b/ulan/embedded/arch/mcs51/mach-msc1210/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/Makefile b/ulan/embedded/arch/mcs51/mach-msc1210/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/Makefile.omk b/ulan/embedded/arch/mcs51/mach-msc1210/Makefile.omk
new file mode 100644 (file)
index 0000000..dba8475
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines libs
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Entries b/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..3d9e6dc
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:25 2005//
+/mcu_regs.h/1.2/Thu Nov  9 23:18:57 2006//
+/reg1210.hke/1.1/Mon Oct  3 12:43:25 2005//
+/reg1210.hsd/1.1/Mon Oct  3 12:43:25 2005//
+D
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Repository b/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..b3b564c
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-msc1210/defines
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Root b/ulan/embedded/arch/mcs51/mach-msc1210/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile b/ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile.omk b/ulan/embedded/arch/mcs51/mach-msc1210/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..2d56584
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+include_HEADERS =  mcu_regs.h reg1210.hke reg1210.hsd
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/mcu_regs.h b/ulan/embedded/arch/mcs51/mach-msc1210/defines/mcu_regs.h
new file mode 100644 (file)
index 0000000..ae66236
--- /dev/null
@@ -0,0 +1,18 @@
+// Texas Instruments
+// Name:       Reg1210.h
+// Revision:   1.0
+// Description: Header file for TI MSC1210 microcontroller
+
+///////////////////////////////////////////////////////////////////////////////
+// Keyval
+#define KVPB_CHUNK_SIZE 1
+
+#ifdef SDCC
+  #include "reg1210.hsd"
+#else
+  #ifdef __KEIL__
+    #include "reg1210.hke"
+  #else
+    #error Unknown 8051 kompiler
+  #endif
+#endif
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hke b/ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hke
new file mode 100644 (file)
index 0000000..82dd38b
--- /dev/null
@@ -0,0 +1,226 @@
+// Texas Instruments\r
+// Name:       Reg1210.h\r
+// Revision:   1.0\r
+// Description: Header file for TI MSC1210 microcontroller\r
+\r
+#ifndef __REG1210_H__\r
+#define __REG1210_H__\r
+\r
+/*  BYTE Registers  */\r
+sfr P0    = 0x80;\r
+sfr SP    = 0x81;\r
+sfr DPL   = 0x82;\r
+sfr DPH   = 0x83;\r
+sfr DPL0  = 0x82;\r
+sfr DPH0  = 0x83;\r
+sfr DPL1  = 0x84;\r
+sfr DPH1  = 0x85;\r
+sfr DPS   = 0x86;\r
+sfr PCON  = 0x87;\r
+sfr TCON  = 0x88;\r
+  sbit TF1   = TCON^7;\r
+  sbit TR1   = TCON^6;\r
+  sbit TF0   = TCON^5;\r
+  sbit TR0   = TCON^4;\r
+  sbit IE1   = TCON^3;\r
+  sbit IT1   = TCON^2;\r
+  sbit IE0   = TCON^1;\r
+  sbit IT0   = TCON^0;\r
+sfr TMOD  = 0x89;\r
+sfr TL0   = 0x8A;\r
+sfr TL1   = 0x8B;\r
+sfr TH0   = 0x8C;\r
+sfr TH1   = 0x8D;\r
+sfr CKCON = 0x8E;\r
+sfr MWS   = 0x8F;\r
+sfr P1    = 0x90;\r
+  sbit INT5  = P1^7; \r
+  sbit SCK   = P1^7; \r
+  sbit INT4  = P1^6; \r
+  sbit MISO  = P1^6; \r
+  sbit INT3  = P1^5; \r
+  sbit MOSI  = P1^5; \r
+  sbit INT2  = P1^4; \r
+  sbit SS    = P1^4; \r
+  sbit TXD1  = P1^3; \r
+  sbit RXD1  = P1^2; \r
+  sbit T2EX  = P1^1; \r
+  sbit T2    = P1^0;\r
+sfr EXIF  = 0x91;\r
+sfr MPAGE = 0x92;\r
+sfr CADDR = 0x93;\r
+sfr CDATA = 0x94;\r
+sfr MCON  = 0x95;\r
+sfr SCON  = 0x98;\r
+sfr SCON0 = 0x98;\r
+  sbit SM0_0   = SCON0^7;\r
+  sbit SM1_0   = SCON0^6;\r
+  sbit SM2_0   = SCON0^5;\r
+  sbit REN_0   = SCON0^4;\r
+  sbit TB8_0   = SCON0^3;\r
+  sbit RB8_0   = SCON0^2;\r
+  sbit TI_0    = SCON0^1;\r
+  sbit TI      = SCON0^1;\r
+  sbit RI_0    = SCON0^0;\r
+  sbit RI      = SCON0^0;\r
+sfr SBUF     = 0x99;\r
+sfr SBUF0    = 0x99;\r
+sfr SPICON   = 0x9A;\r
+sfr SPIDATA  = 0x9B;\r
+sfr SPIRCON  = 0x9C;\r
+sfr SPITCON  = 0x9D;\r
+sfr SPISTART = 0x9E;\r
+sfr SPIEND   = 0x9F;\r
+sfr P2     = 0xA0;\r
+sfr PWMCON = 0xA1;\r
+sfr PWMLOW = 0xA2;\r
+sfr PWMHI  = 0xA3;\r
+sfr PAI    = 0xA5;\r
+sfr AIE    = 0xA6;\r
+sfr AISTAT = 0xA7;\r
+sfr IE     = 0xA8;\r
+  sbit EA    = IE^7;\r
+  sbit ES1   = IE^6;\r
+  sbit ET2   = IE^5;\r
+  sbit ES    = IE^4;\r
+  sbit ES0   = IE^4;\r
+  sbit ET1   = IE^3;\r
+  sbit EX1   = IE^2;\r
+  sbit ET0   = IE^1;\r
+  sbit EX0   = IE^0;\r
+sfr BPCON  = 0xA9;\r
+sfr BPL    = 0xAA;\r
+sfr BPH    = 0xAB;\r
+sfr P0DDRL = 0xAC;\r
+sfr P0DDRH = 0xAD;\r
+sfr P1DDRL = 0xAE;\r
+sfr P1DDRH = 0xAF;\r
+sfr P3     = 0xB0;\r
+  sbit RD    = P3^7;\r
+  sbit WR    = P3^6;\r
+  sbit T1    = P3^5;\r
+  sbit T0    = P3^4;\r
+  sbit INT1  = P3^3;\r
+  sbit INT0  = P3^2;\r
+  sbit TXD   = P3^1;\r
+  sbit TXD0  = P3^1;\r
+  sbit RXD   = P3^0;\r
+  sbit RXD0  = P3^0;\r
+sfr P2DDRL = 0xB1;\r
+sfr P2DDRH = 0xB2;\r
+sfr P3DDRL = 0xB3;\r
+sfr P3DDRH = 0xB4;\r
+sfr IP     = 0xB8;\r
+  sbit PS1   = IP^6;\r
+  sbit PT2   = IP^5;\r
+  sbit PS    = IP^4;\r
+  sbit PS0   = IP^4;\r
+  sbit PT1   = IP^3;\r
+  sbit PX1   = IP^2;\r
+  sbit PT0   = IP^1;\r
+  sbit PX0   = IP^0;\r
+sfr SCON1  = 0xC0;\r
+  sbit SM0_1   = SCON1^7;\r
+  sbit SM1_1   = SCON1^6;\r
+  sbit SM2_1   = SCON1^5;\r
+  sbit REN_1   = SCON1^4;\r
+  sbit TB8_1   = SCON1^3;\r
+  sbit RB8_1   = SCON1^2;\r
+  sbit TI_1    = SCON1^1;\r
+  sbit RI_1    = SCON1^0;\r
+sfr SBUF1  = 0xC1;\r
+sfr EWU    = 0xC6;\r
+sfr T2CON  = 0xC8;\r
+  sbit TF2    = T2CON^7;\r
+  sbit EXF2   = T2CON^6;\r
+  sbit RCLK   = T2CON^5;\r
+  sbit TCLK   = T2CON^4;\r
+  sbit EXEN2  = T2CON^3;\r
+  sbit TR2    = T2CON^2;\r
+  sbit C_T2   = T2CON^1;\r
+  sbit CP_RL2 = T2CON^0;\r
+sfr RCAP2L = 0xCA;\r
+sfr RCAP2H = 0xCB;\r
+sfr TL2    = 0xCC;\r
+sfr TH2    = 0xCD;\r
+sfr PSW    = 0xD0;\r
+  sbit CY    = PSW^7;\r
+  sbit AC    = PSW^6;\r
+  sbit F0    = PSW^5;\r
+  sbit RS1   = PSW^4;\r
+  sbit RS0   = PSW^3;\r
+  sbit OV    = PSW^2;\r
+  sbit F1    = PSW^1;\r
+  sbit P     = PSW^0;\r
+sfr OCL    = 0xD1;\r
+sfr OCM    = 0xD2;\r
+sfr OCH    = 0xD3;\r
+sfr GCL    = 0xD4;\r
+sfr GCM    = 0xD5;\r
+sfr GCH    = 0xD6;\r
+sfr ADMUX  = 0xD7;\r
+sfr EICON  = 0xD8;\r
+  sbit SMOD1 = EICON^7;\r
+  sbit EAI   = EICON^5;\r
+  sbit AI    = EICON^4;\r
+  sbit WDTI  = EICON^3;\r
+sfr ADRESL = 0xD9;\r
+sfr ADRESM = 0xDA;\r
+sfr ADRESH = 0xDB;\r
+sfr ADCON0 = 0xDC;\r
+sfr ADCON1 = 0xDD;\r
+sfr ADCON2 = 0xDE;\r
+sfr ADCON3 = 0xDF;\r
+sfr ACC    = 0xE0;\r
+sfr SSCON  = 0xE1;\r
+sfr SUMR0  = 0xE2;\r
+sfr SUMR1  = 0xE3;\r
+sfr SUMR2  = 0xE4;\r
+sfr SUMR3  = 0xE5;\r
+sfr ODAC   = 0xE6;\r
+sfr LVDCON = 0xE7;\r
+sfr EIE    = 0xE8;\r
+  sbit EWDI  = EIE^4;\r
+  sbit EX5   = EIE^3;\r
+  sbit EX4   = EIE^2;\r
+  sbit EX3   = EIE^1;\r
+  sbit EX2   = EIE^0;\r
+sfr HWPC0  = 0xE9;\r
+sfr HWPC1  = 0xEA;\r
+sfr HWID   = 0xEB;\r
+sfr FMCON  = 0xEE;\r
+sfr FTCON  = 0xEF;\r
+sfr B      = 0xF0;\r
+sfr PDCON  = 0xF1;\r
+sfr PASEL  = 0xF2;\r
+sfr ACLK   = 0xF6;\r
+sfr SRST   = 0xF7;\r
+sfr EIP    = 0xF8;\r
+  sbit PWDI  = EIP^4;\r
+  sbit PX5   = EIP^3;\r
+  sbit PX4   = EIP^2;\r
+  sbit PX3   = EIP^1;\r
+  sbit PX2   = EIP^0;\r
+sfr SECINT = 0xF9;\r
+sfr MSINT  = 0xFA;\r
+sfr USEC   = 0xFB;\r
+sfr MSECL  = 0xFC;\r
+sfr MSECH  = 0xFD;\r
+sfr HMSEC  = 0xFE;\r
+sfr WDTCON = 0xFF;\r
+\r
+/*-----------------*/\r
+/*  Word Registers  */\r
+/*-----------------*/\r
+sfr16 DECIMATION = 0xde;\r
+sfr16 THL2  = 0xcc;\r
+sfr16 RCAP2 = 0xca;\r
+sfr16 ONEMS = 0xfc;\r
+sfr16 PWM   = 0xa2;\r
+sfr16 P0DDR = 0xac;\r
+sfr16 P1DDR = 0xae;\r
+sfr16 P2DDR = 0xb1;\r
+sfr16 P3DDR = 0xb3;\r
+sfr16 BRKPT = 0xaa;\r
+\r
+#endif /*__REG1210_H__*/\r
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hsd b/ulan/embedded/arch/mcs51/mach-msc1210/defines/reg1210.hsd
new file mode 100644 (file)
index 0000000..bb8eb78
--- /dev/null
@@ -0,0 +1,227 @@
+// Texas Instruments\r
+// Name:       Reg1210.h\r
+// Revision:   1.0\r
+// Description: Header file for TI MSC1210 microcontroller\r
+\r
+#ifndef __REG1210_H__\r
+#define __REG1210_H__\r
+\r
+/*  BYTE Registers  */\r
+sfr at 0x80 P0;\r
+sfr at 0x81 SP;\r
+sfr at 0x82 DPL;\r
+sfr at 0x83 DPH;\r
+sfr at 0x82 DPL0;\r
+sfr at 0x83 DPH0;\r
+sfr at 0x84 DPL1;\r
+sfr at 0x85 DPH1;\r
+sfr at 0x86 DPS;\r
+sfr at 0x87 PCON;\r
+sfr at 0x88 TCON;\r
+  sbit at 0x88+7 TF1;\r
+  sbit at 0x88+6 TR1;\r
+  sbit at 0x88+5 TF0;\r
+  sbit at 0x88+4 TR0;\r
+  sbit at 0x88+3 IE1;\r
+  sbit at 0x88+2 IT1;\r
+  sbit at 0x88+1 IE0;\r
+  sbit at 0x88+0 IT0;\r
+sfr at 0x89 TMOD;\r
+sfr at 0x8A TL0;\r
+sfr at 0x8B TL1;\r
+sfr at 0x8C TH0;\r
+sfr at 0x8D TH1;\r
+sfr at 0x8E CKCON;\r
+sfr at 0x8F MWS;\r
+sfr at 0x90 P1;\r
+  sbit at 0x90+7 INT5; \r
+  sbit at 0x90+7 SCK; \r
+  sbit at 0x90+6 INT4; \r
+  sbit at 0x90+6 MISO; \r
+  sbit at 0x90+5 INT3; \r
+  sbit at 0x90+5 MOSI; \r
+  sbit at 0x90+4 INT2; \r
+  sbit at 0x90+4 SS; \r
+  sbit at 0x90+3 TXD1; \r
+  sbit at 0x90+2 RXD1; \r
+  sbit at 0x90+1 T2EX; \r
+  sbit at 0x90+0 T2;\r
+sfr at 0x91 EXIF;\r
+sfr at 0x92 MPAGE;\r
+sfr at 0x93 CADDR;\r
+sfr at 0x94 CDATA;\r
+sfr at 0x95 MCON;\r
+sfr at 0x98 SCON;\r
+sfr at 0x98 SCON0;\r
+  sbit at 0x98+7 SM0_0;\r
+  sbit at 0x98+6 SM1_0;\r
+  sbit at 0x98+5 SM2_0;\r
+  sbit at 0x98+4 REN_0;\r
+  sbit at 0x98+3 TB8_0;\r
+  sbit at 0x98+2 RB8_0;\r
+  sbit at 0x98+1 TI_0;\r
+  sbit at 0x98+1 TI;\r
+  sbit at 0x98+0 RI_0;\r
+  sbit at 0x98+0 RI;\r
+sfr at 0x99 SBUF;\r
+sfr at 0x99 SBUF0;\r
+sfr at 0x9A SPICON;\r
+sfr at 0x9B SPIDATA;\r
+sfr at 0x9C SPIRCON;\r
+sfr at 0x9D SPITCON;\r
+sfr at 0x9E SPISTART;\r
+sfr at 0x9F SPIEND;\r
+sfr at 0xA0 P2;\r
+sfr at 0xA1 PWMCON;\r
+sfr at 0xA2 PWMLOW;\r
+sfr at 0xA3 PWMHI;\r
+sfr at 0xA5 PAI;\r
+sfr at 0xA6 AIE;\r
+sfr at 0xA7 AISTAT;\r
+sfr at 0xA8 IE;\r
+  sbit at 0xA8+7 EA;\r
+  sbit at 0xA8+6 ES1;\r
+  sbit at 0xA8+5 ET2;\r
+  sbit at 0xA8+4 ES0;\r
+  sbit at 0xA8+3 ET1;\r
+  sbit at 0xA8+2 EX1;\r
+  sbit at 0xA8+1 ET0;\r
+  sbit at 0xA8+0 EX0;\r
+sfr at 0xA9 BPCON;\r
+sfr at 0xAA BPL;\r
+sfr at 0xAB BPH;\r
+sfr at 0xAC P0DDRL;\r
+sfr at 0xAD P0DDRH;\r
+sfr at 0xAE P1DDRL;\r
+sfr at 0xAF P1DDRH;\r
+sfr at 0xB0 P3;\r
+  sbit at 0xB0+7 RD;\r
+  sbit at 0xB0+6 WR;\r
+  sbit at 0xB0+5 T1;\r
+  sbit at 0xB0+4 T0;\r
+  sbit at 0xB0+3 INT1;\r
+  sbit at 0xB0+2 INT0;\r
+  sbit at 0xB0+1 TXD;\r
+  sbit at 0xB0+1 TXD0;\r
+  sbit at 0xB0+0 RXD;\r
+  sbit at 0xB0+0 RXD0;\r
+sfr at 0xB1 P2DDRL;\r
+sfr at 0xB2 P2DDRH;\r
+sfr at 0xB3 P3DDRL;\r
+sfr at 0xB4 P3DDRH;\r
+sfr at 0xB8 IP;\r
+  sbit at 0xB8+6 PS1;\r
+  sbit at 0xB8+5 PT2;\r
+  sbit at 0xB8+4 PS;\r
+  sbit at 0xB8+4 PS0;\r
+  sbit at 0xB8+3 PT1;\r
+  sbit at 0xB8+2 PX1;\r
+  sbit at 0xB8+1 PT0;\r
+  sbit at 0xB8+0 PX0;\r
+sfr at 0xC0 SCON1;\r
+  sbit at 0xc0+7 SM0_1;\r
+  sbit at 0xc0+6 SM1_1;\r
+  sbit at 0xc0+5 SM2_1;\r
+  sbit at 0xc0+4 REN_1;\r
+  sbit at 0xc0+3 TB8_1;\r
+  sbit at 0xc0+2 RB8_1;\r
+  sbit at 0xc0+1 TI_1;\r
+  sbit at 0xc0+0 RI_1;\r
+sfr at 0xC1 SBUF1;\r
+sfr at 0xC6 EWU;\r
+sfr at 0xC8 T2CON;\r
+  sbit at 0xC8+7 TF2;\r
+  sbit at 0xC8+6 EXF2;\r
+  sbit at 0xC8+5 RCLK;\r
+  sbit at 0xC8+4 TCLK;\r
+  sbit at 0xC8+3 EXEN2;\r
+  sbit at 0xC8+2 TR2;\r
+  sbit at 0xC8+1 C_T2;\r
+  sbit at 0xC8+0 CP_RL2;\r
+sfr at 0xCA RCAP2L;\r
+sfr at 0xCB RCAP2H;\r
+sfr at 0xCC TL2;\r
+sfr at 0xCD TH2;\r
+sfr at 0xD0 PSW;\r
+  sbit at 0xD0+7 CY;\r
+  sbit at 0xD0+6 AC;\r
+  sbit at 0xD0+5 F0;\r
+  sbit at 0xD0+4 RS1;\r
+  sbit at 0xD0+3 RS0;\r
+  sbit at 0xD0+2 OV;\r
+  sbit at 0xD0+1 F1;\r
+  sbit at 0xD0+0 P;\r
+sfr at 0xD1 OCL;\r
+sfr at 0xD2 OCM;\r
+sfr at 0xD3 OCH;\r
+sfr at 0xD4 GCL;\r
+sfr at 0xD5 GCM;\r
+sfr at 0xD6 GCH;\r
+sfr at 0xD7 ADMUX;\r
+sfr at 0xD8 EICON;\r
+  sbit at 0xD8+7 SMOD1;\r
+  sbit at 0xD8+5 EAI;\r
+  sbit at 0xD8+4 AI;\r
+  sbit at 0xD8+3 WDTI;\r
+sfr at 0xD9 ADRESL;\r
+sfr at 0xDA ADRESM;\r
+sfr at 0xDB ADRESH;\r
+sfr at 0xDC ADCON0;\r
+sfr at 0xDD ADCON1;\r
+sfr at 0xDE ADCON2;\r
+sfr at 0xDF ADCON3;\r
+sfr at 0xE0 ACC;\r
+sfr at 0xE1 SSCON;\r
+sfr at 0xE2 SUMR0;\r
+sfr at 0xE3 SUMR1;\r
+sfr at 0xE4 SUMR2;\r
+sfr at 0xE5 SUMR3;\r
+sfr at 0xE6 ODAC;\r
+sfr at 0xE7 LVDCON;\r
+sfr at 0xE8 EIE;\r
+  sbit at 0xE8+4 EWDI;\r
+  sbit at 0xE8+3 EX5;\r
+  sbit at 0xE8+2 EX4;\r
+  sbit at 0xE8+1 EX3;\r
+  sbit at 0xE8+0 EX2;\r
+sfr at 0xE9 HWPC0;\r
+sfr at 0xEA HWPC1;\r
+sfr at 0xEB HWID;\r
+sfr at 0xEE FMCON;\r
+sfr at 0xEF FTCON;\r
+sfr at 0xF0 B;\r
+sfr at 0xF1 PDCON;\r
+sfr at 0xF2 PASEL;\r
+sfr at 0xF6 ACLK;\r
+sfr at 0xF7 SRST;\r
+sfr at 0xF8 EIP;\r
+  sbit at 0xF8+4 PWDI;\r
+  sbit at 0xF8+3 PX5;\r
+  sbit at 0xF8+2 PX4;\r
+  sbit at 0xF8+1 PX3;\r
+  sbit at 0xF8+0 PX2;\r
+sfr at 0xF9 SECINT;\r
+sfr at 0xFA MSINT;\r
+sfr at 0xFB USEC;\r
+sfr at 0xFC MSECL;\r
+sfr at 0xFD MSECH;\r
+sfr at 0xFE HMSEC;\r
+sfr at 0xFF WDTCON;\r
+\r
+/*-----------------*/\r
+/*  Word Registers  */\r
+/*-----------------*/\r
+#if 0\r
+sfr16 at 0xde DECIMATION;\r
+sfr16 at 0xcc THL2;\r
+sfr16 at 0xca RCAP2;\r
+sfr16 at 0xfc ONEMS;\r
+sfr16 at 0xa2 PWM;\r
+sfr16 at 0xac P0DDR;\r
+sfr16 at 0xae P1DDR;\r
+sfr16 at 0xb1 P2DDR;\r
+sfr16 at 0xb3 P3DDR;\r
+sfr16 at 0xaa BRKPT;\r
+#endif\r
+\r
+#endif /*__REG1210_H__*/\r
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Entries b/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..70fa19b
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.3/Sat Jan 14 19:16:58 2006//
+/msc_loader.c/1.1/Mon Oct  3 12:43:25 2005//
+D/adc////
+D/flash////
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Repository b/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..93db451
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-msc1210/libs
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Root b/ulan/embedded/arch/mcs51/mach-msc1210/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile b/ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile.omk b/ulan/embedded/arch/mcs51/mach-msc1210/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..4133281
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- makefile -*-
+
+SUBDIRS = flash adc
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Entries b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Entries
new file mode 100644 (file)
index 0000000..a5782de
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Sat Jan 14 19:16:58 2006//
+/Makefile.omk/1.1/Sat Jan 14 19:16:58 2006//
+/msc_adc.c/1.2/Tue Jan 31 21:32:39 2006//
+/msc_adc.h/1.2/Tue Jan 31 21:32:39 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Repository b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Repository
new file mode 100644 (file)
index 0000000..3bacf5d
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-msc1210/libs/adc
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Root b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile.omk b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/Makefile.omk
new file mode 100644 (file)
index 0000000..8230812
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- makefile -*-
+
+include_HEADERS =  msc_adc.h
+
+lib_LIBRARIES = msc_adc
+
+msc_adc_SOURCES = msc_adc.c
\ No newline at end of file
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.c b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.c
new file mode 100644 (file)
index 0000000..f946644
--- /dev/null
@@ -0,0 +1,78 @@
+#include <system_def.h>
+#include <cpu_def.h>
+
+bit 
+msc_adc_ready(void) {
+   return AIE&0x20; 
+}
+
+
+long 
+msc_adc_unipolar(void) {
+  _asm
+       mov  a,#0
+       mov  b,_ADRESH
+       mov  dph,_ADRESM
+       mov  dpl,_ADRESL
+  _endasm;
+
+/*  #pragma asm
+       mov     r4,#0
+       mov     r5,ADRESH
+       mov     r6,ADRESM
+       mov     r7,ADRESL
+  #pragma endasm*/
+}
+
+
+long 
+msc_adc_bipolar(void) {
+/*  #pragma asm
+        mov     a,ADRESH
+        mov     r5,a
+       mov     c,acc.7
+       subb    a,acc
+        mov     r4,a
+        mov     r6,ADRESM
+        mov     r7,ADRESL
+  #pragma endasm*/
+}
+
+long 
+msc_adc_summer(void) {
+/*  #pragma asm
+        mov     r4,SUMR3
+        mov     r5,SUMR2
+        mov     r6,SUMR1
+        mov     r7,SUMR0
+  #pragma endasm*/
+}
+
+
+void
+msc_adc_set_input(unsigned char admux, unsigned char adcon1) {
+
+
+  ADMUX = admux;               
+
+  //         7  6   5   4   3   2    1    0
+  // ADCON1  -  POL SM1 SM0 -   CAL2 CAL1 CAL0
+  ADCON1 = adcon1;     // bipolar, auto, self calibration, offset
+}
+
+int 
+msc_adc_init(void) {
+  PDCON &= 0xf7;       //turn on adc
+                       // ACLK min 32
+  ACLK = 15;           // ACLK = 18.432MHz/(1+1)= 0.9216MHz
+  
+  // max 2047          // Data Rate = (ACLK + 1)/64/DECIMATION
+//  DECIMATION = 1080; // Data Rate = 18.432/2/64/14400 = 10.00Hz
+  ADCON2=1080%256;
+  ADCON3=1080/256;
+
+  //         7   6    5      4     3    2    1    0
+  // ADCON0  -   BOD  EVREF  VREFH EBUF PGA2 PGA1 PGA0
+  ADCON0 = 0x30;       // Vref on 2.5V, Buff on, BOD off, PGA 1
+  return 0;
+}
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.h b/ulan/embedded/arch/mcs51/mach-msc1210/libs/adc/msc_adc.h
new file mode 100644 (file)
index 0000000..a5f7fb8
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef _MSC_ADC_H
+#define _MSC_ADC_H
+
+#include <types.h>
+
+#define MSC_ADC_LSB_BIPOLAR 298.0232e-9
+#define MSC_ADC_LSB_UNIPOLAR 149.0116e-9
+#define MSC_ADC_V2T_INTERNAL(x) (2664.7*(x)-282.14)
+
+typedef struct msc_adc_input {
+    uint8_t ain;               //input
+    uint8_t adcon1;            //ad controler 1
+    float avg_value;           //avg value
+    uint8_t samples;           //period per avg value
+    uint8_t samples_cnt;       //counter period per avg value
+    uint8_t calibration;
+  } msc_adc_input_t;
+
+typedef struct msc_adc_input_list {
+    uint8_t count;
+    int8_t capacity;
+    msc_adc_input_t **inputs;
+    uint8_t input_position;
+  } msc_adc_input_list_t;
+
+bit msc_adc_ready(void);
+int msc_adc_init(void);
+void msc_adc_set_input(unsigned char admux, unsigned char adcon1);
+long msc_adc_unipolar(void);
+
+#endif /* _MSC_ADC_H */
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Entries b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Entries
new file mode 100644 (file)
index 0000000..fa8c477
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:25 2005//
+/Makefile.omk/1.2/Wed Nov 16 22:22:30 2005//
+/mcuflash.c/1.2/Thu Aug  3 13:36:41 2006//
+/mcuflash.h/1.2/Thu Aug  3 13:36:41 2006//
+D
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Repository b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Repository
new file mode 100644 (file)
index 0000000..ba04228
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/arch/mcs51/mach-msc1210/libs/flash
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Root b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile.omk b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/Makefile.omk
new file mode 100644 (file)
index 0000000..0c227e4
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LIBRARIES = mcuflash 
+include_HEADERS = mcuflash.h
+mcuflash_SOURCES = mcuflash.c
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.c b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.c
new file mode 100644 (file)
index 0000000..668149d
--- /dev/null
@@ -0,0 +1,153 @@
+#include "mcuflash.h"
+#include "mcu_regs.h"
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+data char mscflash_fdata;
+data char mscflash_fdm;
+#endif /* SDCC_MODEL_LARGE */
+#endif /*SDCC*/
+bit ea,eai;
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+char __page_erase (int faddr, char fdata, char fdm) 
+{
+  mscflash_fdata=fdata;
+  mscflash_fdm=fdm;
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  _asm
+       mov  r7,dpl
+       mov  r6,dph
+       mov  a,_mscflash_fdata
+       mov  r5,a
+       mov  a,_mscflash_fdm
+       mov  r3,a
+       lcall 0xFFD7
+       mov  dpl,r7
+  _endasm;
+  EAI=eai;EA=ea;
+}
+#else
+/* For large model
+ * vec   Allocated to stack - offset -4  (the push _bp taken into account)
+ * fnc Allocated to registers 
+ */
+char __page_erase (int faddr, char fdata, char fdm) reentrant
+{
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  _asm
+       mov  r7,dpl
+       mov  r6,dph
+       mov  a,sp
+       add  a,#-4
+       mov  r0,a
+       mov  a,@r0
+       mov  r3,a
+       inc  r0
+       mov  a,@r0
+       mov  r5,a
+       lcall 0xFFD7
+       mov  dpl,r7
+  _endasm;
+  EAI=eai;EA=ea;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else /* SDCC */
+char __page_erase (int faddr, char fdata, char fdm)
+{
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  #pragma asm
+       lcall 0xFFD7
+  #pragma endasm
+  EAI=eai;EA=ea;
+}
+#endif /* SDCC */
+
+
+#ifdef SDCC
+#ifndef SDCC_MODEL_LARGE
+char __write_flash_chk (int faddr, char fdata, char fdm) 
+{
+  mscflash_fdata=fdata;
+  mscflash_fdm=fdm;
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  _asm
+       mov  r7,dpl
+       mov  r6,dph
+       mov  a,_mscflash_fdata
+       mov  r5,a
+       mov  a,_mscflash_fdm
+       mov  r3,a
+       lcall 0xFFDB
+       mov  dpl,r7
+  _endasm;
+  EAI=eai;EA=ea;
+}
+#else
+/* For large model
+ * vec   Allocated to stack - offset -4  (the push _bp taken into account)
+ * fnc Allocated to registers 
+ */
+char __write_flash_chk (int faddr, char fdata, char fdm) reentrant
+{
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  _asm
+       mov  r7,dpl
+       mov  r6,dph
+       mov  a,sp
+       add  a,#-4
+       mov  r0,a
+       mov  a,@r0
+       mov  r3,a
+       inc  r0
+       mov  a,@r0
+       mov  r5,a
+       lcall 0xFFDB
+       mov  dpl,r7
+  _endasm;
+  EAI=eai;EA=ea;
+}
+#endif /* SDCC_MODEL_LARGE */
+#else /* SDCC */
+char __write_flash_chk (int faddr, char fdata, char fdm) 
+{
+  ea=EA,eai=EAI;
+  EA=0;EAI=0;   // Disable interrupts
+  #pragma asm
+       call 0FFDBH
+  #pragma endasm
+  EAI=eai;EA=ea;
+}
+#endif /* SDCC */
+
+int flash_erase(void *base,int size) {
+  size=size-((unsigned int)base&0x7f);
+  base=(xdata uint8_t*)((unsigned int)base&0xFF80);
+  while (size) {
+    page_erase ((unsigned int)base, 0xff, MSC_FPM);
+    base=(uint8_t *)base+0x80;
+    size-=0x80;
+  }
+  return 0;
+}
+
+int flash_copy(void *des,const void *src,int len) {
+  while(len) {
+    write_flash_chk ((unsigned int)des, *(uint8_t *)src, MSC_FPM);
+    src=(uint8_t *)src+1;
+    des=(uint8_t *)des+1; 
+    len--;
+  }
+  return len;
+}
+
+int flash_flush(void)
+{
+  return 0;
+}
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.h b/ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.h
new file mode 100644 (file)
index 0000000..8d23f62
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef _MCUFLASH_H
+#define _MCUFLASH_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#include <types.h>
+
+#if !defined(SDCC_MODEL_LARGE) || !defined(SDCC)
+  #define MSC_FNC_REENTRANT
+#else
+  #define MSC_FNC_REENTRANT reentrant
+#endif
+
+#define MSC_FDM                1                       // Flash Data Memory
+#define MSC_FPM                0                       // Flash Program Memory
+
+char page_erase (int faddr, char fdata, char fdm);
+char write_flash_chk (int faddr, char fdata, char fdm);
+int flash_erase(void *base,int size);
+int flash_copy(void *des,const void *src,int len);
+int flash_flush(void);
+
+char __page_erase (int faddr, char fdata, char fdm) MSC_FNC_REENTRANT;
+char __write_flash_chk (int faddr, char fdata, char fdm) MSC_FNC_REENTRANT;
+
+#define page_erase(faddr,fdata,fdm) __page_erase(faddr,fdata,fdm)
+#define write_flash_chk(faddr,fdata,fdm) __write_flash_chk(faddr,fdata,fdm)
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _MCUFLASH_H */
+
diff --git a/ulan/embedded/arch/mcs51/mach-msc1210/libs/msc_loader.c b/ulan/embedded/arch/mcs51/mach-msc1210/libs/msc_loader.c
new file mode 100644 (file)
index 0000000..13a17b1
--- /dev/null
@@ -0,0 +1,154 @@
+#include <types.h>
+#include <system_def.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "usb_loader.h"
+
+#ifdef PDI_EP0_PACKET_SIZE
+  #define LOADER_BUFFER_SIZE PDI_EP0_PACKET_SIZE
+#else /*PDI_EP0_PACKET_SIZE*/
+  #define LOADER_BUFFER_SIZE 128
+#endif /*PDI_EP0_PACKET_SIZE*/
+
+unsigned char loader_buffer[LOADER_BUFFER_SIZE];
+
+int msc1210_erase(unsigned addr, unsigned len)
+{
+  unsigned end = addr + len - 1; 
+  if(addr<0x8000) //0x1000)
+    return -1;
+  
+  while(addr < end) {
+    *((xdata unsigned char *)addr) = 0;
+  }
+  return 0;
+}
+
+int msc1210_mass_erase(unsigned mode, unsigned addr)
+{
+  while( addr != 0xffff) {
+    addr++;
+    if ( !(addr & 0x00ff)) printf(" erase segm. 0x%X\n", addr);
+    *((xdata unsigned char *)addr) = 0;
+  }
+  return 0;
+}
+
+
+#ifdef SDCC
+void msc1210_goto( unsigned addr)
+{
+  _asm
+    pop  acc
+    pop  acc
+    mov  a,dpl
+    push acc
+    mov  a,dph
+    push acc
+    ret
+  _endasm;
+}
+#else /*SDCC*/
+#pragma asm
+;void msc1210_goto( unsigned addr)
+;{
+       public _msc1210_goto
+_msc1210_goto:
+       pop  acc
+       pop  acc
+       mov  a,r7
+       push acc
+       mov  a,r6
+       push acc
+       ret
+;  return 0;
+;}
+#pragma endasm
+#endif
+
+
+
+void msc1210_reset_device( void)
+{
+  printf("...reset...\n");
+}
+
+
+int usb_msc1210_loader(usb_device_t *udev)
+{
+  unsigned long addr;
+  unsigned len;
+
+  switch ( udev->request.bRequest & USB_VENDOR_MASK) {
+
+    case USB_VENDOR_GET_CAPABILITIES:
+      printf("GET_CAPABILITIES\n");
+      loader_buffer[0] = 0xAA; // test
+      usb_send_control_data(udev, loader_buffer, 1);
+      return 1;
+
+    case USB_VENDOR_RESET_DEVICE:
+      printf("RESET_DEVICE\n");
+//      InitController();
+//      InitTarget();
+//      if (!GetDevice()) {
+//        return -1;
+//      }
+      usb_ack_setup(&udev->ep0);
+      msc1210_reset_device();
+      return 1;
+
+    case USB_VENDOR_GOTO:
+      //printf( "GOTO 0x%X\n", udev->request.wValue);
+      usb_ack_setup(&udev->ep0);
+      msc1210_goto(udev->request.wValue);
+      return 1;
+
+    case USB_VENDOR_ERASE_MEMORY:
+      printf( "ERASE 0x%X 0x%X\n", udev->request.wValue, udev->request.wIndex);
+      usb_ack_setup(&udev->ep0);
+      msc1210_erase(udev->request.wValue, udev->request.wIndex);
+      return 1;
+
+    case USB_VENDOR_MASS_ERASE:
+      printf( "MASSERASE 0x%X 0x%X\n", udev->request.wIndex, udev->request.wValue);
+      usb_ack_setup(&udev->ep0);
+      msc1210_mass_erase(udev->request.wIndex, udev->request.wValue);
+      return 1;
+      
+    case USB_VENDOR_GET_SET_MEMORY:
+      addr = (udev->request.wValue & 0xffff) | (((unsigned long)udev->request.wIndex&0xffff)<<16);
+      len = udev->request.wLength;
+      //printf("GET_SET_MEMORY, addr=0x%lx, len=%d\n", (long)addr, len);
+      if (( udev->request.bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST) {
+        // read from HOST ???
+        switch( udev->request.bRequest & USB_VENDOR_TARGET_MASK) {
+          case USB_VENDOR_TARGET_XDATA:
+            udev->ep0.ptr = (xdata unsigned char *)addr;
+            break;
+          case USB_VENDOR_TARGET_DATA:
+            udev->ep0.ptr = (data unsigned char *)addr;
+            break;
+          default: return -1;
+        }
+        if ( len) usb_set_control_endfnc( udev, usb_ack_setup);
+        else usb_ack_setup(&udev->ep0);
+        return 1;
+      } else {
+        switch( udev->request.bRequest & USB_VENDOR_TARGET_MASK) {
+          case USB_VENDOR_TARGET_XDATA:
+            usb_send_control_data( udev, (xdata unsigned char *)addr, len); //(void*)addr, len);
+            break;
+          case USB_VENDOR_TARGET_DATA:
+            usb_send_control_data( udev, (data unsigned char *)addr, len); //(void*)addr, len);
+            break;
+          default: return -1;
+        }
+        return 1;
+      }
+      break;
+  }
+
+  return 0;
+}
diff --git a/ulan/embedded/board/CVS/Entries b/ulan/embedded/board/CVS/Entries
new file mode 100644 (file)
index 0000000..8a12a10
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Mon Oct  3 12:43:26 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:26 2005//
+D/arm////
+D/mcs51////
diff --git a/ulan/embedded/board/CVS/Repository b/ulan/embedded/board/CVS/Repository
new file mode 100644 (file)
index 0000000..9643c31
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board
diff --git a/ulan/embedded/board/CVS/Root b/ulan/embedded/board/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/Makefile b/ulan/embedded/board/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/Makefile.omk b/ulan/embedded/board/Makefile.omk
new file mode 100644 (file)
index 0000000..ae8ebdc
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = $(ARCH)
diff --git a/ulan/embedded/board/arm/CVS/Entries b/ulan/embedded/board/arm/CVS/Entries
new file mode 100644 (file)
index 0000000..b3da84a
--- /dev/null
@@ -0,0 +1,3 @@
+/Makefile/1.1/Tue Jan 31 10:07:37 2006//
+/Makefile.omk/1.1/Tue Jan 31 10:07:37 2006//
+D/ul_usb1////
diff --git a/ulan/embedded/board/arm/CVS/Repository b/ulan/embedded/board/arm/CVS/Repository
new file mode 100644 (file)
index 0000000..c973c43
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm
diff --git a/ulan/embedded/board/arm/CVS/Root b/ulan/embedded/board/arm/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/Makefile b/ulan/embedded/board/arm/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/Makefile.omk b/ulan/embedded/board/arm/Makefile.omk
new file mode 100644 (file)
index 0000000..2ca7db1
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+ifneq ($(wildcard $(SOURCES_DIR)/$(BOARD)),)
+SUBDIRS = $(BOARD)
+endif
\ No newline at end of file
diff --git a/ulan/embedded/board/arm/ul_usb1/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/CVS/Entries
new file mode 100644 (file)
index 0000000..6021fd7
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Thu Jul 20 13:50:18 2006//
+/Makefile.omk/1.1/Thu Jul 20 13:50:18 2006//
+D/config////
+D/defines////
+D/libs////
diff --git a/ulan/embedded/board/arm/ul_usb1/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/CVS/Repository
new file mode 100644 (file)
index 0000000..b28ba88
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1
diff --git a/ulan/embedded/board/arm/ul_usb1/CVS/Root b/ulan/embedded/board/arm/ul_usb1/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/Makefile b/ulan/embedded/board/arm/ul_usb1/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/ul_usb1/Makefile.omk b/ulan/embedded/board/arm/ul_usb1/Makefile.omk
new file mode 100644 (file)
index 0000000..dba8475
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = defines libs
diff --git a/ulan/embedded/board/arm/ul_usb1/config/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/config/CVS/Entries
new file mode 100644 (file)
index 0000000..74716db
--- /dev/null
@@ -0,0 +1,8 @@
+/config.bell-keypad/1.2/Thu Jan  3 00:37:28 2008//
+/config.garage-gate/1.2/Thu Jan  3 00:37:28 2008//
+/config.ha-switch/1.4/Wed Feb 27 21:28:11 2008//
+/config.ha-switch-ulboot/1.3/Wed Feb 27 21:27:17 2008//
+/config.u2uv2/1.4/Thu Jan  3 00:37:28 2008//
+/config.ul_usb1/1.13/Thu Jan  3 00:37:28 2008//
+/config.ulboot/1.5/Thu Jan  3 00:37:28 2008//
+D
diff --git a/ulan/embedded/board/arm/ul_usb1/config/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/config/CVS/Repository
new file mode 100644 (file)
index 0000000..d6eab36
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1/config
diff --git a/ulan/embedded/board/arm/ul_usb1/config/CVS/Root b/ulan/embedded/board/arm/ul_usb1/config/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.bell-keypad b/ulan/embedded/board/arm/ul_usb1/config/config.bell-keypad
new file mode 100644 (file)
index 0000000..65b5279
--- /dev/null
@@ -0,0 +1,51 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+CONFIG_BOARD_VARIANT=hisc-keypad
+
+CONFIG_APP_HISC_BELL_KEYPAD=y
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_TMELATE=y
+CONFIG_ULAN_DY=y
+CONFIG_ULOI_LT=y
+CONFIG_KEYVAL=y
+CONFIG_KBD=y
+
+#CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+LPC_BAUD = 38400
+TOLPC = tolpc --baud $(LPC_BAUD) --sdev /dev/ttyS0
+LOAD_CMD-ramisp = $(TOLPC)  -v -q 7372 -L -f 
+LOAD_CMD-boot = lpc21isp -bin /dev/ttyS0 $(LPC_BAUD) 12000
+
+# This selects linker script
+LD_SCRIPT=lpc2148
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = bin
+
+PROG_BASE=0x20000
+PROG_SIZE=0x20000
+
+UL_SENDHEX ?= ul_sendhex
+MOD ?= 62
+
+LOAD_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r -o 0 ; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -b 256 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.garage-gate b/ulan/embedded/board/arm/ul_usb1/config/config.garage-gate
new file mode 100644 (file)
index 0000000..2949391
--- /dev/null
@@ -0,0 +1,50 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+CONFIG_BOARD_VARIANT=hisc-garage-gate
+
+CONFIG_APP_HISC_GARAGE_GATE=y
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_TMELATE=y
+CONFIG_ULAN_DY=y
+CONFIG_ULOI_LT=y
+CONFIG_KEYVAL=y
+
+#CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+LPC_BAUD = 38400
+TOLPC = tolpc --baud $(LPC_BAUD) --sdev /dev/ttyS0
+LOAD_CMD-ramisp = $(TOLPC)  -v -q 7372 -L -f 
+LOAD_CMD-boot = lpc21isp -bin /dev/ttyS0 $(LPC_BAUD) 12000
+
+# This selects linker script
+LD_SCRIPT=lpc2148
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = bin
+
+PROG_BASE=0x20000
+PROG_SIZE=0x20000
+
+UL_SENDHEX ?= ul_sendhex
+MOD ?= 62
+
+LOAD_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r -o 0 ; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -b 256 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.ha-switch b/ulan/embedded/board/arm/ul_usb1/config/config.ha-switch
new file mode 100644 (file)
index 0000000..4ed1f04
--- /dev/null
@@ -0,0 +1,48 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+CONFIG_BOARD_VARIANT=ha-switch
+
+CONFIG_HA_LIGHT_SWITCH=y
+
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_VARPINS=y
+CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG=y
+CONFIG_OC_UL_DRV_U450_LOOPBACK=y
+CONFIG_ULAN_DY=y
+CONFIG_ULOI_LT=y
+CONFIG_KEYVAL=y
+
+# CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+# This selects linker script
+LD_SCRIPT=lpc2105
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = bin
+
+PROG_BASE=0xA000
+PROG_SIZE=0x10000
+
+UL_SENDHEX ?= ul_sendhex
+MOD ?= 62
+
+LOAD_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r -o 0 ; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -b 512 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.ha-switch-ulboot b/ulan/embedded/board/arm/ul_usb1/config/config.ha-switch-ulboot
new file mode 100644 (file)
index 0000000..bda5aa0
--- /dev/null
@@ -0,0 +1,41 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+CONFIG_BOARD_VARIANT=ha-switch
+
+CONFIG_ULBOOT=y
+
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_VARPINS=y
+CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG=y
+CONFIG_OC_UL_DRV_U450_LOOPBACK=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+
+# CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+# This selects linker script
+LD_SCRIPT=lpc2105
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = hex bin
+
+TOHIT=lpc21isp
+DEV=/dev/ttyUSB0
+CPU_SYS_KHZ=14745
+BAUD=57600
+
+LOAD_CMD-boot = \
+    $(TOHIT) $(DEV) $(BAUD) $(CPU_SYS_KHZ)
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.u2uv2 b/ulan/embedded/board/arm/ul_usb1/config/config.u2uv2
new file mode 100644 (file)
index 0000000..6deb39e
--- /dev/null
@@ -0,0 +1,58 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_VARPINS=y
+CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP=y
+CONFIG_OC_UL_DRV_U450_TMELATE=y
+#CONFIG_ULAN_DY=y
+#CONFIG_ULOI_LT=y
+#CONFIG_ULOI_GENOBJIDTAG=y
+#CONFIG_KEYVAL=y
+CONFIG_USB_BASE=y
+CONFIG_USB_LPCUSB=y
+CONFIG_APP_U2U_V2=y
+
+#CONFIG_APP_TEST_LPC=y
+#CONFIG_APP_ULAD31=y
+#CONFIG_ULBOOT=y
+
+CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+LPC_BAUD = 38400
+TOLPC = tolpc --baud $(LPC_BAUD) --sdev /dev/ttyS0
+LOAD_CMD-ramisp = $(TOLPC)  -v -q 7372 -L -f 
+LOAD_CMD-boot = lpc21isp -bin /dev/ttyUSB0 $(LPC_BAUD) 12000
+
+# This selects linker script
+LD_SCRIPT=lpc2148
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = bin
+
+PROG_BASE=0x20000
+PROG_SIZE=0x20000
+
+UL_SENDHEX ?= ul_sendhex
+MOD ?= 3
+
+LOAD_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r -o 0 ; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -b 256 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.ul_usb1 b/ulan/embedded/board/arm/ul_usb1/config/config.ul_usb1
new file mode 100644 (file)
index 0000000..e0eccad
--- /dev/null
@@ -0,0 +1,55 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+
+#CONFIG_BOARD_VARIANT=aa_rch
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_VARPINS=y
+CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP=y
+CONFIG_OC_UL_DRV_U450_TMELATE=y
+CONFIG_ULAN_DY=y
+CONFIG_ULOI_LT=y
+CONFIG_ULOI_GENOBJIDTAG=y
+CONFIG_KEYVAL=y
+CONFIG_APP_TEST_LPC=y
+CONFIG_APP_ULAD31=y
+CONFIG_ULBOOT=y
+
+CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+LPC_BAUD = 38400
+TOLPC = tolpc --baud $(LPC_BAUD) --sdev /dev/ttyS0
+LOAD_CMD-ramisp = $(TOLPC)  -v -q 7372 -L -f 
+LOAD_CMD-boot = lpc21isp -bin /dev/ttyS0 $(LPC_BAUD) 12000
+
+# This selects linker script
+LD_SCRIPT=lpc2148
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = bin
+
+PROG_BASE=0x20000
+PROG_SIZE=0x20000
+
+UL_SENDHEX ?= ul_sendhex
+MOD ?= 3
+
+LOAD_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -r -o 0 ; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(UL_SENDHEX) -m $(MOD) -o 0 -t 0x101 -b 256 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(UL_SENDHEX) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/arm/ul_usb1/config/config.ulboot b/ulan/embedded/board/arm/ul_usb1/config/config.ulboot
new file mode 100644 (file)
index 0000000..52b0004
--- /dev/null
@@ -0,0 +1,40 @@
+# -*- makefile -*-
+
+ARCH=arm
+MACH=lpc21xx
+BOARD=ul_usb1
+
+CONFIG_ULBOOT=y
+
+CONFIG_OC_UL_DRV_SYSLESS=y
+CONFIG_OC_UL_DRV_U450_VARPINS=y
+CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP=y
+CONFIG_OC_UL_DRV_U450_TMELATE=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+
+# CONFIG_STDIO_COM_PORT=0
+
+CROSS_COMPILE = arm-elf-
+TARGET_ARCH = -mcpu=arm7tdmi 
+
+# Set default C flags. If theese are set elsewhere (e.g. on a command
+# line), these default flags are not used.
+DEBUG ?= -g
+OPTIMIZE ?= -O2
+
+# This selects linker script
+LD_SCRIPT=lpc2148
+#DEFAULT_LD_SCRIPT_VARIANT=boot
+
+#OUTPUT_FORMATS = bin hex srec
+
+OUTPUT_FORMATS = hex bin
+
+TOHIT=lpc21isp
+DEV=/dev/ttyUSB0
+CPU_SYS_KHZ=12000
+BAUD=38400
+
+LOAD_CMD-boot = \
+    $(TOHIT) $(DEV) $(BAUD) $(CPU_SYS_KHZ)
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/defines/CVS/Entries
new file mode 100644 (file)
index 0000000..62c3c69
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Thu Jul 20 13:50:18 2006//
+/Makefile.omk/1.2/Tue Jan 16 17:41:45 2007//
+/system_def-ha-switch.h/1.4/Wed Dec 26 21:15:55 2007//
+/system_def-hisc-garage-gate.h/1.1/Tue Jun  5 17:48:44 2007//
+/system_def-hisc-keypad.h/1.2/Wed Feb 27 20:13:36 2008//
+/system_def.h/1.11/Sun Jan 20 08:33:45 2008//
+D
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/defines/CVS/Repository
new file mode 100644 (file)
index 0000000..e304865
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1/defines
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/CVS/Root b/ulan/embedded/board/arm/ul_usb1/defines/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/Makefile b/ulan/embedded/board/arm/ul_usb1/defines/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/Makefile.omk b/ulan/embedded/board/arm/ul_usb1/defines/Makefile.omk
new file mode 100644 (file)
index 0000000..4ed4e2d
--- /dev/null
@@ -0,0 +1,15 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_BOARD_VARIANT=x
+
+#include_HEADERS = $(notdir $(wildcard $(SOURCES_DIR)/*.h))
+
+ifneq ($(CONFIG_BOARD_VARIANT),)
+
+renamed_include_HEADERS = system_def-$(CONFIG_BOARD_VARIANT).h->system_def.h
+
+else
+
+include_HEADERS = system_def.h
+
+endif # CONFIG_BOARD_VARIANT
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/system_def-ha-switch.h b/ulan/embedded/board/arm/ul_usb1/defines/system_def-ha-switch.h
new file mode 100644 (file)
index 0000000..80c3ba3
--- /dev/null
@@ -0,0 +1,191 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def.h - common cover for definition of hardware adresses,
+                 registers, timing and other hardware dependant
+                parts of embedded hardware
+  Copyright (C) 2001 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_H_
+#define _SYSTEM_DEF_H_
+
+#include <types.h>
+#include <system_stub.h>
+#include <LPC210x.h>
+#include <bspbase.h>
+
+#ifndef NULL
+#define        NULL    0
+#endif
+
+#define WITH_SFI_SEL
+
+#define VER_CODE(major,minor,patch) (major*0x10000+minor*0x100+patch)
+/* Software version */
+#define SW_VER_ID      "UL_HA_SWITCH"
+#define SW_VER_MAJOR   0
+#define SW_VER_MINOR   2
+#define SW_VER_PATCH   0
+#define SW_VER_CODE    VER_CODE(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
+/* Hardware version */
+#define HW_VER_ID      "UL_HA_SWITCH"
+#define HW_VER_MAJOR   1
+#define HW_VER_MINOR   0
+#define HW_VER_PATCH   0
+#define HW_VER_CODE    VER_CODE(HW_VER_MAJOR,HW_VER_MINOR,HW_VER_PATCH)
+/* Version of mechanical  */
+#define MECH_VER_ID     "UL_HA_SWITCH"
+#define MECH_VER_MAJOR  0
+#define MECH_VER_MINOR  0
+#define MECH_VER_PATCH  0
+#define MECH_VER_CODE  VER_CODE(MECH_VER_MAJOR,MECH_VER_MINOR,MECH_VER_PATCH)
+
+
+// PLL setup values are computed within the LPC include file
+// It relies upon the following defines
+#define FOSC                (14745600)  // Master Oscillator Freq.
+#define PLL_MUL             (4)         // PLL Multiplier
+#define CCLK                (FOSC * PLL_MUL) // CPU Clock Freq.
+
+// Pheripheral Bus Speed Divider
+#define PBSD                1           // MUST BE 1, 2, or 4
+#define PCLK                (CCLK / PBSD) // Pheripheal Bus Clock Freq.
+
+#define SYS_TIMER_HZ       1000
+
+#ifndef BIT
+#define BIT(n)              (1 << (n))
+#endif
+
+// Port Bit Definitions & Macros:    Description - initial conditions
+#define TXD0_BIT            BIT(0)      // used by UART0
+#define RXD0_BIT            BIT(1)      // used by UART0
+#define P0_02_UNUSED_BIT    BIT(2)      // P0.02 unused - low output
+#define OUT2_BIT            BIT(3)      // P0.03 unused - low output
+#define P0_04_UNUSED_BIT    BIT(4)      // P0.04 unused - low output
+#define OUT1_BIT            BIT(5)      // P0.05 unused - low output
+#define IR_BIT              BIT(6)      // P0.06 unused - low output
+#define SPK_P_BIT           BIT(7)      // P0.07 unused - low output
+#define TXD1_BIT            BIT(8)      // used by UART1
+#define RXD1_BIT            BIT(9)      // used by UART1
+#define RTS1_BIT            BIT(10)     // used by UART1
+#define CTS1_BIT            BIT(11)     // used by UART1
+#define DSR1_BIT            BIT(12)     // used by UART1
+#define LED3_BIT            BIT(13)     // used by LED
+#define BOOT_BIT            BIT(14)     // SWITCH
+#define IN1_BIT             BIT(15)     // P0.15 unused - low output
+#define IN2_BIT             BIT(16)     // P0.16 unused - low output
+#define P0_17_UNUSED_BIT    BIT(17)     // P0.17 unused - low output
+#define P0_18_UNUSED_BIT    BIT(18)     // P0.18 unused - low output
+#define LED4_BIT            BIT(19)     // used by LED
+#define LED1_BIT            BIT(20)     // used by LED
+#define LED2_BIT            BIT(21)     // used by LED
+#define USENSE_BIT          BIT(22)     // P0.22 unused - low output
+#define SW1_BIT             BIT(23)     // P0.23 unused - low output
+#define SW3_BIT             BIT(24)     // P0.24 unused - low output
+#define SW2_BIT             BIT(25)     // P0.25 unused - low output
+#define SW4_BIT             BIT(26)     // P0.26 unused - low output
+#define P0_27_UNUSED_BIT    BIT(27)     // P0.27 unused - low output
+#define P0_28_UNUSED_BIT    BIT(28)     // P0.28 unused - low output
+#define P0_29_UNUSED_BIT    BIT(29)     // P0.29 unused - low output
+#define LED5_BIT            BIT(30)     // P0.30 unused - low output
+#define P0_31_UNUSED_BIT    BIT(31)     // P0.31 unused - low output
+
+
+#define P0IO_INPUT_BITS      (uint32_t) ( \
+                                        BOOT_BIT | \
+                                        IR_BIT | \
+                                        IN1_BIT | \
+                                        IN2_BIT | \
+                                        SW1_BIT | \
+                                        SW2_BIT | \
+                                        SW3_BIT | \
+                                        SW4_BIT | \
+                                        UNSENSE_BIT | \
+                                         0 )
+
+#define P0IO_ZERO_BITS       (uint32_t) ( \
+                                         SPK_P_BIT | \
+                                         OUT1_BIT | \
+                                         OUT2_BIT | \
+                                         LED1_BIT | \
+                                         LED2_BIT | \
+                                         LED3_BIT | \
+                                         LED4_BIT | \
+                                         LED5_BIT | \
+                                         P0_02_UNUSED_BIT | \
+                                         P0_04_UNUSED_BIT | \
+                                        P0_17_UNUSED_BIT | \
+                                        P0_18_UNUSED_BIT | \
+                                         P0_27_UNUSED_BIT | \
+                                         P0_28_UNUSED_BIT | \
+                                         P0_29_UNUSED_BIT | \
+                                         P0_31_UNUSED_BIT | \
+                                         0 )
+
+
+
+#define P0IO_ONE_BITS        (uint32_t) ( \
+                                        BOOT_BIT | \
+                                         0 )
+
+#define P0IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P0IO_ZERO_BITS | \
+                                         P0IO_ONE_BITS )
+
+
+/***************************************************************************/
+/* io functions */
+#define LED_GP                 LED1_BIT  /* GENREAL PURPOSE LED */
+#define LED_ERR                        LED2_BIT
+
+/***************************************************************************/
+/* io functions */
+#define IN_PORT                        IO0
+#define OUT_PORT               IO0
+#define LED_PORT               IO0
+
+#define CREATE_PORT_NAME_PIN(port) port##PIN
+#define CREATE_PORT_NAME_CLR(port) port##CLR
+#define CREATE_PORT_NAME_SET(port) port##SET
+
+#define GET_IN_PIN(port,in)    ((CREATE_PORT_NAME_PIN(port) & in)?1:0) 
+#define SET_OUT_PIN(port,out)   (CREATE_PORT_NAME_SET(port)=out)
+#define CLR_OUT_PIN(port,out)   (CREATE_PORT_NAME_CLR(port)=out)
+
+/***************************************************************************/
+/* watchdog */
+//#define WATCHDOG_ENABLED
+#define WATCHDOG_TIMEOUT_MS    1000
+
+/***************************************************************************/
+/* uLan configuration */
+#ifdef UL_LOG_ENABLE
+  #undef UL_LOG_ENABLE
+#endif
+
+#ifdef ULD_DEFAULT_BUFFER_SIZE
+  #undef ULD_DEFAULT_BUFFER_SIZE
+  #define ULD_DEFAULT_BUFFER_SIZE 0x0400
+#endif
+
+#define UL_DRV_SYSLESS_PORT 0xE0010000
+#define UL_DRV_SYSLESS_BAUD 19200
+#define UL_DRV_SYSLESS_IRQ HAL_INTERRUPT_UART1
+#define UL_DRV_SYSLESS_MY_ADR_DEFAULT 1
+
+
+#define watchdog_feed lpc_watchdog_feed
+#define kvpb_erase lpcisp_kvpb_erase
+#define kvpb_copy lpcisp_kvpb_copy
+#define kvpb_flush lpcisp_kvpb_flush
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE|KVPB_DESC_CHUNKWO
+
+#define HAL_ARM_LPC2XXX_EXTINT_ERRATA 
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-garage-gate.h b/ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-garage-gate.h
new file mode 100644 (file)
index 0000000..250d27b
--- /dev/null
@@ -0,0 +1,239 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def.h - common cover for definition of hardware adresses,
+                 registers, timing and other hardware dependant
+                parts of embedded hardware
+  Copyright (C) 2001 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_H_
+#define _SYSTEM_DEF_H_
+
+#include <types.h>
+#include <system_stub.h>
+#include <LPC214x.h>
+#include <bspbase.h>
+
+#ifndef NULL
+#define        NULL    0
+#endif
+
+#define WITH_SFI_SEL
+
+#define VER_CODE(major,minor,patch) (major*0x10000+minor*0x100+patch)
+/* Software version */
+#define SW_VER_ID      "UL_USB"
+#define SW_VER_MAJOR   0
+#define SW_VER_MINOR   2
+#define SW_VER_PATCH   0
+#define SW_VER_CODE    VER_CODE(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
+/* Hardware version */
+#define HW_VER_ID      "UL_USB"
+#define HW_VER_MAJOR   1
+#define HW_VER_MINOR   0
+#define HW_VER_PATCH   0
+#define HW_VER_CODE    VER_CODE(HW_VER_MAJOR,HW_VER_MINOR,HW_VER_PATCH)
+/* Version of mechanical  */
+#define MECH_VER_ID     "UL_USB"
+#define MECH_VER_MAJOR  0
+#define MECH_VER_MINOR  0
+#define MECH_VER_PATCH  0
+#define MECH_VER_CODE  VER_CODE(MECH_VER_MAJOR,MECH_VER_MINOR,MECH_VER_PATCH)
+
+
+// PLL setup values are computed within the LPC include file
+// It relies upon the following defines
+#define FOSC                (14745600)  // Master Oscillator Freq.
+#define PLL_MUL             (4)         // PLL Multiplier
+#define CCLK                (FOSC * PLL_MUL) // CPU Clock Freq.
+
+// Pheripheral Bus Speed Divider
+#define PBSD                1           // MUST BE 1, 2, or 4
+#define PCLK                (CCLK / PBSD) // Pheripheal Bus Clock Freq.
+
+#define SYS_TIMER_HZ       1000
+
+#ifndef BIT
+#define BIT(n)              (1 << (n))
+#endif
+
+// Port Bit Definitions & Macros:    Description - initial conditions
+#define TXD0_BIT            BIT(0)      // used by UART0
+#define RXD0_BIT            BIT(1)      // used by UART0
+#define P0_02_UNUSED_BIT    BIT(2)      // P0.02 unused - low output
+#define P0_03_UNUSED_BIT    BIT(3)      // P0.03 unused - low output
+#define P0_04_UNUSED_BIT    BIT(4)      // P0.04 unused - low output
+#define P0_05_UNUSED_BIT    BIT(5)      // P0.05 unused - low output
+#define P0_06_UNUSED_BIT    BIT(6)      // P0.06 unused - low output
+#define P0_07_UNUSED_BIT    BIT(7)      // P0.07 unused - low output
+#define TXD1_BIT            BIT(8)      // used by UART1
+#define RXD1_BIT            BIT(9)      // used by UART1
+#define RTS1_BIT            BIT(10)     // used by UART1
+#define CTS1_BIT            BIT(11)     // used by UART1
+#define DSR1_BIT            BIT(12)     // used by UART1
+#define P0_13_UNUSED_BIT    BIT(13)     // P0.13 unused - low output
+#define BOOT_BIT            BIT(14)     // SWITCH
+#define P0_15_UNUSED_BIT    BIT(15)     // P0.15 unused - low output
+#define P0_16_UNUSED_BIT    BIT(16)     // P0.16 unused - low output
+#define P0_17_UNUSED_BIT    BIT(17)     // P0.17 unused - low output
+#define P0_18_UNUSED_BIT    BIT(18)     // P0.18 unused - low output
+#define P0_19_UNUSED_BIT    BIT(19)     // P0.19 unused - low output
+#define P0_20_UNUSED_BIT    BIT(20)     // P0.20 unused - low output
+#define LED1_BIT            BIT(21)     // used by LED
+#define LED2_BIT            BIT(22)     // used by LED
+#define P0_23_UNUSED_BIT    BIT(23)     // P0.23 unused - low output
+#define P0_24_UNUSED_BIT    BIT(24)     // P0.24 unused - low output
+#define P0_25_UNUSED_BIT    BIT(25)     // P0.25 unused - low output
+#define P0_26_UNUSED_BIT    BIT(26)     // P0.26 unused - low output
+#define P0_27_UNUSED_BIT    BIT(27)     // P0.27 unused - low output
+#define P0_28_UNUSED_BIT    BIT(28)     // P0.28 unused - low output
+#define P0_29_UNUSED_BIT    BIT(29)     // P0.29 unused - low output
+#define P0_30_UNUSED_BIT    BIT(30)     // P0.30 unused - low output
+#define P0_31_UNUSED_BIT    BIT(31)     // P0.31 unused - low output
+
+
+#define P1_16_UNUSED_BIT    BIT(16)     // P1.16 unused - low output
+#define P1_17_UNUSED_BIT    BIT(17)     // P1.17 unused - low output
+#define P1_18_UNUSED_BIT    BIT(18)     // P1.18 unused - low output
+#define P1_19_UNUSED_BIT    BIT(19)     // P1.19 unused - low output
+#define P1_20_UNUSED_BIT    BIT(20)     // P1.20 unused - low output
+#define P1_21_UNUSED_BIT    BIT(21)     // P1.21 unused - low output
+#define P1_22_UNUSED_BIT    BIT(22)     // P1.22 unused - low output
+#define P1_23_UNUSED_BIT    BIT(23)     // P1.23 unused - low output
+#define P1_24_UNUSED_BIT    BIT(24)     // P1.24 unused - low output
+#define P1_25_UNUSED_BIT    BIT(25)     // P1.25 unused - low output
+#define P1_26_GATE          BIT(26)     // used by JTAG
+#define P1_27_UNUSED_BIT    BIT(27)     // used by JTAG
+#define P1_28_UNUSED_BIT    BIT(28)     // used by JTAG
+#define P1_29_UNUSED_BIT    BIT(29)     // used by JTAG
+#define P1_30_UNUSED_BIT    BIT(30)     // used by JTAG
+#define P1_31_UNUSED_BIT    BIT(31)     // used by JTAG
+
+#define P0IO_INPUT_BITS      (uint32_t) ( \
+                                        BOOT_BIT | \
+                                         0 )
+
+#define P1IO_INPUT_BITS      (uint32_t) ( \
+                                         0 )
+
+#define P0IO_ZERO_BITS       (uint32_t) ( \
+                                         P0_02_UNUSED_BIT | \
+                                         P0_03_UNUSED_BIT | \
+                                         P0_04_UNUSED_BIT | \
+                                         P0_05_UNUSED_BIT | \
+                                         P0_06_UNUSED_BIT | \
+                                         P0_07_UNUSED_BIT | \
+                                        P0_13_UNUSED_BIT | \
+                                        P0_15_UNUSED_BIT | \
+                                        P0_16_UNUSED_BIT | \
+                                        P0_17_UNUSED_BIT | \
+                                        P0_18_UNUSED_BIT | \
+                                        P0_19_UNUSED_BIT | \
+                                        P0_20_UNUSED_BIT | \
+                                         P0_23_UNUSED_BIT | \
+                                         P0_24_UNUSED_BIT | \
+                                         P0_25_UNUSED_BIT | \
+                                         P0_26_UNUSED_BIT | \
+                                         P0_27_UNUSED_BIT | \
+                                         P0_28_UNUSED_BIT | \
+                                         P0_29_UNUSED_BIT | \
+                                         P0_30_UNUSED_BIT | \
+                                         P0_31_UNUSED_BIT | \
+                                         0 )
+
+#define P1IO_ZERO_BITS       (uint32_t) ( \
+                                        P1_16_UNUSED_BIT | \
+                                        P1_17_UNUSED_BIT | \
+                                        P1_18_UNUSED_BIT | \
+                                        P1_19_UNUSED_BIT | \
+                                        P1_20_UNUSED_BIT | \
+                                        P1_21_UNUSED_BIT | \
+                                        P1_22_UNUSED_BIT | \
+                                         P1_23_UNUSED_BIT | \
+                                         P1_24_UNUSED_BIT | \
+                                         P1_25_UNUSED_BIT | \
+                                         P1_27_UNUSED_BIT | \
+                                         P1_28_UNUSED_BIT | \
+                                         P1_29_UNUSED_BIT | \
+                                         P1_30_UNUSED_BIT | \
+                                         P1_31_UNUSED_BIT | \
+                                         0 )
+
+
+#define P0IO_ONE_BITS        (uint32_t) ( \
+                                         LED1_BIT | \
+                                        BOOT_BIT | \
+                                         LED2_BIT | \
+                                         0 )
+
+#define P1IO_ONE_BITS        (uint32_t) ( \
+                                         P1_26_GATE | \
+                                         0 )
+
+#define P0IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P0IO_ZERO_BITS | \
+                                         P0IO_ONE_BITS )
+
+#define P1IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P1IO_ZERO_BITS | \
+                                         P1IO_ONE_BITS )
+
+
+/***************************************************************************/
+/* io functions */
+#define LED_GP                 LED1_BIT  /* GENREAL PURPOSE LED */
+#define LED_ERR                        LED2_BIT
+
+#define LED_YELLOW             LED1_BIT
+#define LED_RED                        LED2_BIT
+
+/***************************************************************************/
+/* io functions */
+#define KBD_PORT               IO1
+#define IN_PORT                        IO0
+#define LED_PORT               IO0
+#define OUT_PORT               IO1
+
+#define CREATE_PORT_NAME_PIN(port) port##PIN
+#define CREATE_PORT_NAME_CLR(port) port##CLR
+#define CREATE_PORT_NAME_SET(port) port##SET
+
+#define GET_IN_PIN(port,in)    ((CREATE_PORT_NAME_PIN(port) & in)?1:0) 
+#define SET_OUT_PIN(port,out)   (CREATE_PORT_NAME_SET(port)=out)
+#define CLR_OUT_PIN(port,out)   (CREATE_PORT_NAME_CLR(port)=out)
+
+/***************************************************************************/
+/* watchdog */
+#define WATCHDOG_ENABLED
+#define WATCHDOG_TIMEOUT_MS    1000
+
+/***************************************************************************/
+/* uLan configuration */
+#ifdef UL_LOG_ENABLE
+  #undef UL_LOG_ENABLE
+#endif
+
+#ifdef ULD_DEFAULT_BUFFER_SIZE
+  #undef ULD_DEFAULT_BUFFER_SIZE
+  #define ULD_DEFAULT_BUFFER_SIZE 0x0800
+#endif
+
+#define UL_DRV_SYSLESS_PORT 0xE0010000
+#define UL_DRV_SYSLESS_BAUD 19200
+#define UL_DRV_SYSLESS_IRQ HAL_INTERRUPT_UART1
+#define UL_DRV_SYSLESS_MY_ADR_DEFAULT 1
+
+#define watchdog_feed lpc_watchdog_feed
+#define kvpb_erase lpcisp_kvpb_erase
+#define kvpb_copy lpcisp_kvpb_copy
+#define kvpb_flush lpcisp_kvpb_flush
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE|KVPB_DESC_CHUNKWO
+
+#define HAL_ARM_LPC2XXX_EXTINT_ERRATA 
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-keypad.h b/ulan/embedded/board/arm/ul_usb1/defines/system_def-hisc-keypad.h
new file mode 100644 (file)
index 0000000..09a90c5
--- /dev/null
@@ -0,0 +1,276 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def.h - common cover for definition of hardware adresses,
+                 registers, timing and other hardware dependant
+                parts of embedded hardware
+  Copyright (C) 2001 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_H_
+#define _SYSTEM_DEF_H_
+
+#include <types.h>
+#include <system_stub.h>
+#include <LPC214x.h>
+#include <bspbase.h>
+
+#ifndef NULL
+#define        NULL    0
+#endif
+
+#define WITH_SFI_SEL
+
+#define VER_CODE(major,minor,patch) (major*0x10000+minor*0x100+patch)
+/* Software version */
+#define SW_VER_ID      "UL_USB"
+#define SW_VER_MAJOR   0
+#define SW_VER_MINOR   2
+#define SW_VER_PATCH   0
+#define SW_VER_CODE    VER_CODE(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
+/* Hardware version */
+#define HW_VER_ID      "UL_USB"
+#define HW_VER_MAJOR   1
+#define HW_VER_MINOR   0
+#define HW_VER_PATCH   0
+#define HW_VER_CODE    VER_CODE(HW_VER_MAJOR,HW_VER_MINOR,HW_VER_PATCH)
+/* Version of mechanical  */
+#define MECH_VER_ID     "UL_USB"
+#define MECH_VER_MAJOR  0
+#define MECH_VER_MINOR  0
+#define MECH_VER_PATCH  0
+#define MECH_VER_CODE  VER_CODE(MECH_VER_MAJOR,MECH_VER_MINOR,MECH_VER_PATCH)
+
+
+// PLL setup values are computed within the LPC include file
+// It relies upon the following defines
+#define FOSC                (14745600)  // Master Oscillator Freq.
+#define PLL_MUL             (4)         // PLL Multiplier
+#define CCLK                (FOSC * PLL_MUL) // CPU Clock Freq.
+
+// Pheripheral Bus Speed Divider
+#define PBSD                1           // MUST BE 1, 2, or 4
+#define PCLK                (CCLK / PBSD) // Pheripheal Bus Clock Freq.
+
+#define SYS_TIMER_HZ       1000
+
+#ifndef BIT
+#define BIT(n)              (1 << (n))
+#endif
+
+// Port Bit Definitions & Macros:    Description - initial conditions
+#define TXD0_BIT            BIT(0)      // used by UART0
+#define RXD0_BIT            BIT(1)      // used by UART0
+#define P0_02_UNUSED_BIT    BIT(2)      // P0.02 unused - low output
+#define P0_03_UNUSED_BIT    BIT(3)      // P0.03 unused - low output
+#define P0_04_UNUSED_BIT    BIT(4)      // P0.04 unused - low output
+#define P0_05_UNUSED_BIT    BIT(5)      // P0.05 unused - low output
+#define IP1_BIT                    BIT(6)      // P0.06 unused - low output
+#define IP2_BIT            BIT(7)      // P0.07 unused - low output
+#define TXD1_BIT            BIT(8)      // used by UART1
+#define RXD1_BIT            BIT(9)      // used by UART1
+#define RTS1_BIT            BIT(10)     // used by UART1
+#define CTS1_BIT            BIT(11)     // used by UART1
+#define DSR1_BIT            BIT(12)     // used by UART1
+#define P0_13_UNUSED_BIT    BIT(13)     // P0.13 unused - low output
+#define BOOT_BIT            BIT(14)     // SWITCH
+#define P0_15_UNUSED_BIT    BIT(15)     // P0.15 unused - low output
+#define P0_16_UNUSED_BIT    BIT(16)     // P0.16 unused - low output
+#define P0_17_UNUSED_BIT    BIT(17)     // P0.17 unused - low output
+#define P0_18_UNUSED_BIT    BIT(18)     // P0.18 unused - low output
+#define P0_19_UNUSED_BIT    BIT(19)     // P0.19 unused - low output
+#define P0_20_UNUSED_BIT    BIT(20)     // P0.20 unused - low output
+#define LED1_BIT            BIT(21)     // used by LED
+#define LED2_BIT            BIT(22)     // used by LED
+#define P0_23_UNUSED_BIT    BIT(23)     // P0.23 unused - low output
+#define P0_24_UNUSED_BIT    BIT(24)     // P0.24 unused - low output
+#define P0_25_UNUSED_BIT    BIT(25)     // P0.25 unused - low output
+#define P0_26_UNUSED_BIT    BIT(26)     // P0.26 unused - low output
+#define P0_27_UNUSED_BIT    BIT(27)     // P0.27 unused - low output
+#define P0_28_UNUSED_BIT    BIT(28)     // P0.28 unused - low output
+#define P0_29_SOUND         BIT(29)     // P0.29 unused - low output
+#define P0_30_LED_R         BIT(30)     // P0.30 unused - low output
+#define P0_31_LED_G         BIT(31)     // P0.31 unused - low output
+
+
+#define P1_16_RELE          BIT(16)     // P1.16 unused - low output
+#define P1_17_UNUSED_BIT    BIT(17)     // P1.17 unused - low output
+#define P1_18_UNUSED_BIT    BIT(18)     // P1.18 unused - low output
+#define P1_19_UNUSED_BIT    BIT(19)     // P1.19 unused - low output
+#define P1_20_UNUSED_BIT    BIT(20)     // P1.20 unused - low output
+#define P1_21_UNUSED_BIT    BIT(21)     // P1.21 unused - low output
+#define P1_22_UNUSED_BIT    BIT(22)     // P1.22 unused - low output
+#define P1_23_UNUSED_BIT    BIT(23)     // P1.23 unused - low output
+#define P1_24_COL369H       BIT(24)     // P1.24 unused - low output
+#define P1_25_COL2580       BIT(25)     // P1.25 unused - low output
+#define P1_26_COL147S       BIT(26)     // used by JTAG
+#define P1_27_ROW123        BIT(27)     // used by JTAG
+#define P1_28_ROW456        BIT(28)     // used by JTAG
+#define P1_29_ROW789        BIT(29)     // used by JTAG
+#define P1_30_ROWS0H        BIT(30)     // used by JTAG
+#define P1_31_RING          BIT(31)     // used by JTAG
+
+#define P0IO_INPUT_BITS      (uint32_t) ( \
+                                        BOOT_BIT | \
+                                        IP1_BIT | \
+                                        IP2_BIT | \
+                                         0 )
+
+#define P1IO_INPUT_BITS      (uint32_t) ( \
+                                        P1_27_ROW123 | \
+                                        P1_28_ROW456 | \
+                                        P1_29_ROW789 | \
+                                        P1_30_ROWS0H | \
+                                        P1_31_RING | \
+                                         0 )
+
+#define P0IO_ZERO_BITS       (uint32_t) ( \
+                                         P0_02_UNUSED_BIT | \
+                                         P0_03_UNUSED_BIT | \
+                                         P0_04_UNUSED_BIT | \
+                                         P0_05_UNUSED_BIT | \
+                                        P0_13_UNUSED_BIT | \
+                                        P0_15_UNUSED_BIT | \
+                                        P0_16_UNUSED_BIT | \
+                                        P0_17_UNUSED_BIT | \
+                                        P0_18_UNUSED_BIT | \
+                                        P0_19_UNUSED_BIT | \
+                                        P0_20_UNUSED_BIT | \
+                                         P0_23_UNUSED_BIT | \
+                                         P0_24_UNUSED_BIT | \
+                                         P0_25_UNUSED_BIT | \
+                                         P0_26_UNUSED_BIT | \
+                                         P0_27_UNUSED_BIT | \
+                                         P0_28_UNUSED_BIT | \
+                                        P0_29_SOUND | \
+                                         0 )
+
+#define P1IO_ZERO_BITS       (uint32_t) ( \
+                                        P1_16_RELE | \
+                                        P1_17_UNUSED_BIT | \
+                                        P1_18_UNUSED_BIT | \
+                                        P1_19_UNUSED_BIT | \
+                                        P1_20_UNUSED_BIT | \
+                                        P1_21_UNUSED_BIT | \
+                                        P1_22_UNUSED_BIT | \
+                                         P1_23_UNUSED_BIT | \
+                                         0 )
+
+
+#define P0IO_ONE_BITS        (uint32_t) ( \
+                                         LED1_BIT | \
+                                        BOOT_BIT | \
+                                         LED2_BIT | \
+                                        P0_30_LED_R | \
+                                        P0_31_LED_G | \
+                                         0 )
+
+#define P1IO_ONE_BITS        (uint32_t) ( \
+                                        P1_24_COL369H | \
+                                        P1_25_COL2580 | \
+                                        P1_26_COL147S | \
+                                         0 )
+
+#define P0IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P0IO_ZERO_BITS | \
+                                         P0IO_ONE_BITS )
+
+#define P1IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P1IO_ZERO_BITS | \
+                                         P1IO_ONE_BITS )
+
+
+/***************************************************************************/
+/* io functions */
+#define LED_GP                 LED1_BIT  /* GENREAL PURPOSE LED */
+#define LED_ERR                        LED2_BIT
+
+#define LED_YELLOW             LED1_BIT
+#define LED_RED                        LED2_BIT
+#define LED_KEYPAD_RED         P0_30_LED_R
+#define LED_KEYPAD_YELLOW      P0_31_LED_G
+
+/***************************************************************************/
+/* io functions */
+#define KBD_PORT               IO1
+#define IN_PORT                        IO0
+#define LED_PORT               IO0
+#define OUT_PORT               IO1
+
+#define CREATE_PORT_NAME_PIN(port) port##PIN
+#define CREATE_PORT_NAME_CLR(port) port##CLR
+#define CREATE_PORT_NAME_SET(port) port##SET
+
+#define GET_IN_PIN(port,in)    ((CREATE_PORT_NAME_PIN(port) & in)?1:0) 
+#define SET_OUT_PIN(port,out)   (CREATE_PORT_NAME_SET(port)=out)
+#define CLR_OUT_PIN(port,out)   (CREATE_PORT_NAME_CLR(port)=out)
+
+/***************************************************************************/
+/* watchdog */
+#define WATCHDOG_ENABLED
+#define WATCHDOG_TIMEOUT_MS    1000
+
+/***************************************************************************/
+/* uLan configuration */
+#ifdef UL_LOG_ENABLE
+  #undef UL_LOG_ENABLE
+#endif
+
+#ifdef ULD_DEFAULT_BUFFER_SIZE
+  #undef ULD_DEFAULT_BUFFER_SIZE
+  #define ULD_DEFAULT_BUFFER_SIZE 0x0800
+#endif
+
+#define UL_DRV_SYSLESS_PORT 0xE0010000
+#define UL_DRV_SYSLESS_BAUD 19200
+#define UL_DRV_SYSLESS_IRQ HAL_INTERRUPT_UART1
+#define UL_DRV_SYSLESS_MY_ADR_DEFAULT 1
+
+#define watchdog_feed lpc_watchdog_feed
+#define kvpb_erase lpcisp_kvpb_erase
+#define kvpb_copy lpcisp_kvpb_copy
+#define kvpb_flush lpcisp_kvpb_flush
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE|KVPB_DESC_CHUNKWO
+
+#define HAL_ARM_LPC2XXX_EXTINT_ERRATA 
+
+/***************************************************************************/
+/* kbd */
+#define KEY_TIMER sys_timer_ticks
+#define KBDDEVICE void
+
+typedef unsigned short kbd_key_t;
+typedef unsigned int kbd_keymod_t;
+typedef long kbd_interval_t;
+typedef unsigned short kbd_scan_code_t;
+
+#define KEY_DEFAULT_TIMES
+#define KEY_PUSH_T     70
+#define KEY_RELEASE_T  50
+#define KEY_REPFIRST_T 60000
+#define KEY_REPNEXT_T  300
+
+#define KBD_DR _reg_PTD_DR
+#define KBD_SSR IO1PIN
+#define KBD_DDIR _reg_PTD_DDIR
+#define KBD_PUEN _reg_PTD_PUEN
+
+typedef unsigned long kbdisr_lock_level_t;
+#define kbdisr_lock   save_and_cli
+#define        kbdisr_unlock restore_flags
+
+#define KBD_SCAN_CNT  3
+#define KBD_SCAN_BIT0 24
+#define KBD_RET_CNT   5
+#define KBD_RET_BIT0  27
+
+#define KBD_SCAN_MASK (((1<<KBD_SCAN_CNT)-1)<<KBD_SCAN_BIT0)
+#define KBD_RET_MASK  (((1<<KBD_RET_CNT)-1)<<KBD_RET_BIT0)
+
+#define KBD_USE_IO_SETCLR_OPS
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/board/arm/ul_usb1/defines/system_def.h b/ulan/embedded/board/arm/ul_usb1/defines/system_def.h
new file mode 100644 (file)
index 0000000..12c6cac
--- /dev/null
@@ -0,0 +1,255 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def.h - common cover for definition of hardware adresses,
+                 registers, timing and other hardware dependant
+                parts of embedded hardware
+  Copyright (C) 2001 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_H_
+#define _SYSTEM_DEF_H_
+
+#include <types.h>
+#include <system_stub.h>
+#include <LPC214x.h>
+#include <bspbase.h>
+
+#ifndef NULL
+#define        NULL    0
+#endif
+
+#define WITH_SFI_SEL
+
+#define VER_CODE(major,minor,patch) (major*0x10000+minor*0x100+patch)
+/* Software version */
+#define SW_VER_ID      "UL_USB"
+#define SW_VER_MAJOR   0
+#define SW_VER_MINOR   2
+#define SW_VER_PATCH   0
+#define SW_VER_CODE    VER_CODE(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
+/* Hardware version */
+#define HW_VER_ID      "UL_USB"
+#define HW_VER_MAJOR   1
+#define HW_VER_MINOR   0
+#define HW_VER_PATCH   0
+#define HW_VER_CODE    VER_CODE(HW_VER_MAJOR,HW_VER_MINOR,HW_VER_PATCH)
+/* Version of mechanical  */
+#define MECH_VER_ID     "UL_USB"
+#define MECH_VER_MAJOR  0
+#define MECH_VER_MINOR  0
+#define MECH_VER_PATCH  0
+#define MECH_VER_CODE  VER_CODE(MECH_VER_MAJOR,MECH_VER_MINOR,MECH_VER_PATCH)
+
+
+// PLL setup values are computed within the LPC include file
+// It relies upon the following defines
+//#define FOSC                (11059200)  // Master Oscillator Freq.
+#define FOSC                (12000000)  // Master Oscillator Freq.
+#define PLL_MUL             (4)         // PLL Multiplier
+#define CCLK                (FOSC * PLL_MUL) // CPU Clock Freq.
+
+// Pheripheral Bus Speed Divider
+#define PBSD                1           // MUST BE 1, 2, or 4
+#define PCLK                (CCLK / PBSD) // Pheripheal Bus Clock Freq.
+
+#define SYS_TIMER_HZ       1000
+
+#ifndef BIT
+#define BIT(n)              (1 << (n))
+#endif
+
+// Port Bit Definitions & Macros:    Description - initial conditions
+#define TXD0_BIT            BIT(0)      // used by UART0
+#define RXD0_BIT            BIT(1)      // used by UART0
+#define P0_SCL0_PIN         BIT(2)      // I2C 0 SCL
+#define P0_SDA0_PIN         BIT(3)      // I2C 0 SDA
+#define P0_SCK0_PIN         BIT(4)      // SPI0 clocks
+#define P0_MISO0_PIN        BIT(5)      // SPI0 master input
+#define P0_MOSI0_PIN        BIT(6)      // SPI0 master output
+#define P0_SSEL0_PIN        BIT(7)      // SPI0 external select/ADS1218 DRDY
+#define TXD1_BIT            BIT(8)      // used by UART1
+#define RXD1_BIT            BIT(9)      // used by UART1
+#define RTS1_BIT            BIT(10)     // used by UART1
+#define CTS1_BIT            BIT(11)     // used by UART1
+#define DSR1_BIT            BIT(12)     // used by UART1
+#define LED2_BIT            BIT(13)     // used by LED
+#define BOOT_BIT            BIT(14)     // SWITCH
+#define LED1_BIT            BIT(15)     // used by LED
+#define P0_SWITCH1_PIN      BIT(16)     // pin connected to the switch 1
+#define P0_SCK1_PIN         BIT(17)     // SPI1 clocks
+#define P0_MISO1_PIN        BIT(18)     // SPI1 master input
+#define P0_MOSI1_PIN        BIT(19)     // SPI1 master output
+#define P0_SSEL1_PIN        BIT(20)     // SPI1 slave select/25VF016 chipselect
+#define P0_21_UNUSED_BIT    BIT(21)     // P0.21 unused - low output
+#define P0_22_UNUSED_BIT    BIT(22)     // P0.22 unused - low output
+#define P0_SJA1000_ALE_PIN  BIT(23)     // SJA1000 ALE
+#define P0_24_UNUSED_BIT    BIT(24)     // P0.24 unused - low output
+#define P0_SJA1000_CS_PIN   BIT(25)     // SJA1000 CS
+#define P0_26_UNUSED_BIT    BIT(26)     // P0.26 unused - low output
+#define P0_27_UNUSED_BIT    BIT(27)     // P0.27 unused - low output
+#define P0_SJA1000_RD_PIN   BIT(28)     // SJA1000 RD
+#define P0_SJA1000_WR_PIN   BIT(29)     // SJA1000 WR
+#define P0_SJA1000_INT_PIN  BIT(30)     // SJA1000 INT
+#define P0_USB_CONNECT_PIN  BIT(31)     // USB Connect Control
+
+#define P1_SJA1000_D0_PIN   BIT(16)     // SJA1000 D0
+#define P1_SJA1000_D1_PIN   BIT(17)     // SJA1000 D1
+#define P1_SJA1000_D2_PIN   BIT(18)     // SJA1000 D2
+#define P1_SJA1000_D3_PIN   BIT(19)     // SJA1000 D3
+#define P1_SJA1000_D4_PIN   BIT(20)     // SJA1000 D4
+#define P1_SJA1000_D5_PIN   BIT(21)     // SJA1000 D5
+#define P1_SJA1000_D6_PIN   BIT(22)     // SJA1000 D6
+#define P1_SJA1000_D7_PIN   BIT(23)     // SJA1000 D7
+#define P1_OUT_PORT_CS_PIN  BIT(24)     // Chip select for 74HC574 chip
+#define P1_SJA1000_RST_PIN  BIT(25)     // SJA1000 RST
+#define P1_26_UNUSED_BIT    BIT(26)     // used by JTAG
+#define P1_27_UNUSED_BIT    BIT(27)     // used by JTAG
+#define P1_28_UNUSED_BIT    BIT(28)     // used by JTAG
+#define P1_29_UNUSED_BIT    BIT(29)     // used by JTAG
+#define P1_30_UNUSED_BIT    BIT(30)     // used by JTAG
+#define P1_31_UNUSED_BIT    BIT(31)     // used by JTAG
+
+#define P1_SJA1000_DATA_PINS   (uint32_t) ( \
+                                         P1_SJA1000_D0_PIN | \
+                                         P1_SJA1000_D1_PIN | \
+                                         P1_SJA1000_D2_PIN | \
+                                         P1_SJA1000_D3_PIN | \
+                                         P1_SJA1000_D4_PIN | \
+                                         P1_SJA1000_D5_PIN | \
+                                         P1_SJA1000_D6_PIN | \
+                                         P1_SJA1000_D7_PIN | \
+                                         0 )
+
+#define P0IO_INPUT_BITS      (uint32_t) ( \
+                                         P0_SCL0_PIN | \
+                                         P0_SDA0_PIN | \
+                                         P0_MISO0_PIN | \
+                                         P0_SSEL0_PIN | \
+                                         P0_MISO1_PIN | \
+                                        BOOT_BIT | \
+                                         P0_SWITCH1_PIN | \
+                                         P0_SJA1000_INT_PIN | \
+                                         0 )
+
+#define P1IO_INPUT_BITS      (uint32_t) ( \
+                                         P1_26_UNUSED_BIT | \
+                                         P1_27_UNUSED_BIT | \
+                                         P1_28_UNUSED_BIT | \
+                                         P1_29_UNUSED_BIT | \
+                                         P1_30_UNUSED_BIT | \
+                                         P1_31_UNUSED_BIT | \
+                                         0 )
+
+#define P0IO_ZERO_BITS       (uint32_t) ( \
+                                         P0_21_UNUSED_BIT | \
+                                         P0_22_UNUSED_BIT | \
+                                         P0_24_UNUSED_BIT | \
+                                         P0_26_UNUSED_BIT | \
+                                         P0_27_UNUSED_BIT | \
+                                         P0_USB_CONNECT_PIN | \
+                                         0 )
+
+#define P1IO_ZERO_BITS       (uint32_t) ( \
+                                         P1_SJA1000_DATA_PINS | \
+                                         P1_SJA1000_RST_PIN | \
+                                         0 )
+
+
+#define P0IO_ONE_BITS        (uint32_t) ( \
+                                         P0_SCK0_PIN | \
+                                         P0_MOSI0_PIN | \
+                                         LED1_BIT | \
+                                        BOOT_BIT | \
+                                         LED2_BIT | \
+                                         P0_SCK1_PIN | \
+                                         P0_MOSI1_PIN | \
+                                         P0_SSEL1_PIN | \
+                                        P0_SJA1000_ALE_PIN | \
+                                         P0_SJA1000_CS_PIN | \
+                                         P0_SJA1000_RD_PIN | \
+                                         P0_SJA1000_WR_PIN | \
+                                         0 )
+
+#define P1IO_ONE_BITS        (uint32_t) ( \
+                                         P1_OUT_PORT_CS_PIN | \
+                                         0 )
+
+#define P0IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P0IO_ZERO_BITS | \
+                                         P0IO_ONE_BITS )
+
+#define P1IO_OUTPUT_BITS     (uint32_t) ( \
+                                         P1IO_ZERO_BITS | \
+                                         P1IO_ONE_BITS )
+
+/***************************************************************************/
+/* io functions */
+#define LED_GP                 LED1_BIT  /* GENREAL PURPOSE LED */
+#define LED_ERR                        LED2_BIT
+
+#define LED_YELLOW             LED1_BIT
+#define LED_RED                        LED2_BIT
+
+/***************************************************************************/
+/* io functions */
+#define IN_PORT                        IO0
+#define LED_PORT               IO0
+#define OUT_PORT               IO1
+
+#define CREATE_PORT_NAME_PIN(port) port##PIN
+#define CREATE_PORT_NAME_CLR(port) port##CLR
+#define CREATE_PORT_NAME_SET(port) port##SET
+
+#define GET_IN_PIN(port,in)    ((CREATE_PORT_NAME_PIN(port) & in)?1:0) 
+#define SET_OUT_PIN(port,out)   (CREATE_PORT_NAME_SET(port)=out)
+#define CLR_OUT_PIN(port,out)   (CREATE_PORT_NAME_CLR(port)=out)
+
+/***************************************************************************/
+/* watchdog */
+//#define WATCHDOG_ENABLED
+#define WATCHDOG_TIMEOUT_MS    1000
+
+/***************************************************************************/
+/* uLan configuration */
+
+#ifdef UL_LOG_ENABLE
+  #undef UL_LOG_ENABLE
+#endif
+
+#ifdef ULD_DEFAULT_BUFFER_SIZE
+  #undef ULD_DEFAULT_BUFFER_SIZE
+  #define ULD_DEFAULT_BUFFER_SIZE 0x0800
+#endif
+
+#define UL_DRV_SYSLESS_PORT 0xE0010000
+#define UL_DRV_SYSLESS_BAUD 19200
+#define UL_DRV_SYSLESS_IRQ HAL_INTERRUPT_UART1
+#define UL_DRV_SYSLESS_MY_ADR_DEFAULT 1
+
+#define watchdog_feed lpc_watchdog_feed
+#define kvpb_erase lpcisp_kvpb_erase
+#define kvpb_copy lpcisp_kvpb_copy
+#define kvpb_flush lpcisp_kvpb_flush
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE|KVPB_DESC_CHUNKWO
+
+/***************************************************************************/
+/* USB configuration */
+#define USB_WITH_UDEV_FNC
+#define USB_EP_NUM          32
+#define USB_MAX_PACKET0     64
+#define USB_MAX_PACKET      8
+#define USB_DMA_EP          0x00000000
+
+/***************************************************************************/
+/* i2c0 configuration */
+#define I2C_DRV_SYSLESS_IRQ HAL_INTERRUPT_I2C0
+#define I2C_DRV_SYSLESS_PORT 0xE001C000
+#define I2C_DRV_SYSLESS_BITRATE 100000
+#define I2C_DRV_SYSLESS_SLADR 0
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..cfaf153
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Thu Jul 20 13:50:18 2006//
+/Makefile.omk/1.1/Thu Jul 20 13:50:18 2006//
+D/bspbase////
+D/ldscripts////
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..c025f2a
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1/libs
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/CVS/Root b/ulan/embedded/board/arm/ul_usb1/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/Makefile b/ulan/embedded/board/arm/ul_usb1/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/Makefile.omk b/ulan/embedded/board/arm/ul_usb1/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..1e281da
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = bspbase ldscripts
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Entries
new file mode 100644 (file)
index 0000000..016dbbb
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Thu Jul 20 13:50:18 2006//
+/Makefile.omk/1.8/Sun Jan 20 08:51:57 2008//
+/bsp0hwinit.c/1.23/Wed Feb 27 12:26:52 2008//
+/bspbase.h/1.5/Wed Feb 27 12:26:52 2008//
+/kbd_io_hisc.c/1.1/Sun Apr 29 06:44:54 2007//
+/uart.c/1.1/Thu Jul 20 13:50:18 2006//
+/uart.h/1.2/Wed Dec 26 21:15:55 2007//
+D
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Repository
new file mode 100644 (file)
index 0000000..7ed38d8
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1/libs/bspbase
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Root b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile.omk b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/Makefile.omk
new file mode 100644 (file)
index 0000000..72f7977
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- makefile -*-
+
+default_CONFIG += CONFIG_OC_UL_DRV_SYSLESS=x
+default_CONFIG += CONFIG_OC_IC_DRV_SYSLESS=x
+default_CONFIG += CONFIG_KEYVAL=x
+default_CONFIG += CONFIG_STDIO_COM_PORT=x
+default_CONFIG += CONFIG_OC_UL_DRV_U450_VARPINS=x
+default_CONFIG += CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP=x
+default_CONFIG += CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG=x
+default_CONFIG += CONFIG_OC_I2C_DRV_SYSLESS=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I .
+
+include_HEADERS =  bspbase.h
+
+lib_LIBRARIES = bspbase
+
+bspbase_SOURCES = bsp0hwinit.c 
+
+ifneq ($(CONFIG_STDIO_COM_PORT),)
+bspbase_SOURCES += uart.c
+endif #CONFIG_STDIO_COM_PORT
+
+ifeq ($(CONFIG_KBD),y) 
+bspbase_SOURCES += kbd_io_hisc.c
+endif #CONFIG_KBD
\ No newline at end of file
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/bsp0hwinit.c b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/bsp0hwinit.c
new file mode 100644 (file)
index 0000000..eceffb4
--- /dev/null
@@ -0,0 +1,345 @@
+#include "local_config.h"
+#include <system_def.h>
+#ifdef CONFIG_KEYVAL
+  #include <keyvalpb.h>
+  #include <lpciap.h>
+  #include <lpciap_kvpb.h>
+#endif /* CONFIG_KEYVAL */
+#ifdef CONFIG_STDIO_COM_PORT
+  #include <uart.h>
+#endif
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+  #include <ul_lib/ulan.h>
+  #include <string.h>
+  #include <ul_drv_init.h>
+  #include <ul_drv_iac.h>
+  #include <ul_lib/ul_drvdef.h>
+  extern long int uld_jiffies;
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+#ifdef CONFIG_OC_I2C_DRV_SYSLESS
+  #include <i2c_drv.h>
+#endif /* CONFIG_OC_I2C_DRV_SYSLESS */
+#include <hal_machperiph.h>
+#include <hal_intr.h>
+
+/* timers */
+volatile lt_ticks_t sys_timer_ticks;
+
+static void sysInit(void) 
+{
+
+  lpc_pll_off();
+  lpc_pll_on();
+
+  // setup & enable the MAM
+  MAMCR = 0;
+  MAMTIM = MAMTIM_CYCLES;
+  MAMCR = MAMCR_FULL;
+
+  // set the peripheral bus speed
+  // value computed from config.h
+  VPBDIV = VPBDIV_VALUE;                // set the peripheral bus clock speed
+
+  // setup the parallel port pin
+  IO0CLR = P0IO_ZERO_BITS;                // clear the ZEROs output
+  IO0SET = P0IO_ONE_BITS;                 // set the ONEs output
+  IO0DIR = P0IO_OUTPUT_BITS;              // set the output bit direction
+
+ #ifdef P1IO_OUTPUT_BITS
+  IO1CLR = P1IO_ZERO_BITS;                // clear the ZEROs output
+  IO1SET = P1IO_ONE_BITS;                 // set the ONEs output
+  IO1DIR = P1IO_OUTPUT_BITS;              // set the output bit direction
+ #endif
+
+  IO0CLR = LED1_BIT;                      // Indicate functional state on the LED1
+}
+
+void timer0_isr(void)
+{   
+  unsigned int ir;
+  ir=T0IR;
+  if (ir&TIR_MR0I) {
+    do {
+      T0MR0+=PCLK/SYS_TIMER_HZ;
+      T0IR=TIR_MR0I;               // Clear match0 interrupt
+     #ifdef CONFIG_OC_UL_DRV_SYSLESS
+      uld_jiffies++;
+     #endif
+      sys_timer_ticks++;
+    } while (((int32_t)(T0MR0-T0TC))<0);
+  }
+}
+
+void timerInit(void)
+{
+  sys_timer_ticks=0;
+
+  HAL_INTERRUPT_ATTACH(HAL_INTERRUPT_TIMER0,timer0_isr,0);
+  HAL_INTERRUPT_UNMASK(HAL_INTERRUPT_TIMER0);
+    
+  T0TC=0;
+  T0MCR=0;
+
+  T0MR0=PCLK/SYS_TIMER_HZ;                           /* ms tics */
+  T0MCR|=TMCR_MR0_I;
+
+  T0TCR = TCR_ENABLE; //Run timer 0
+}
+
+#ifdef CONFIG_STDIO_COM_PORT
+
+int uartcon_write(int file, char * ptr, int len)
+{
+  int cnt;
+  unsigned char ch;
+  for(cnt=0;cnt<len;cnt++,ptr++){
+    ch=*ptr;
+    if(ch==0xa)
+      uart0Putch(0xd);
+    uart0Putch(ch);
+  }
+  return cnt;
+}
+
+void init_system_stub(void) {
+  system_stub_ops.write=uartcon_write;
+}
+
+#endif /* CONFIG_STDIO_COM_PORT */
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+
+extern unsigned uld_debug_flg; /* Left application  set defaults */
+
+#ifndef CONFIG_KEYVAL
+unsigned long lpciap_buff[ISP_RAM2FLASH_BLOCK_SIZE/4];
+#endif /* CONFIG_KEYVAL */
+
+#define UL_MTYPE_START32BIT 0x100
+
+static inline int ul_iac_mem_head_rd(uint8_t *buf, int len,
+                      uint32_t* pmtype, uint32_t* pstart, uint32_t* plen)
+{
+  uint32_t val, mtype;
+  if (len<6) return -1;
+  mtype=*(buf++);       /* memory type */
+  mtype+=*(buf++)<<8;
+  val=*(buf++);           /* start address */
+  val+=*(buf++)<<8;
+  if(mtype&UL_MTYPE_START32BIT){
+    if (len<8) return -1;
+    val+=(uint32_t)*(buf++)<<16;
+    val+=(uint32_t)*(buf++)<<24;
+  }
+  *pstart=val;
+  val=*(buf++);           /* length */
+  val+=*(buf++)<<8;
+  if(mtype&UL_MTYPE_START32BIT){
+    if (len==10) {
+      val+=(uint32_t)*(buf++)<<16;
+      val+=(uint32_t)*(buf++)<<24;
+    }
+  }
+  *plen=val;
+  mtype&=~UL_MTYPE_START32BIT;       /* 32-bit start address */
+  *pmtype=mtype;
+  return 0;
+}
+
+int ul_iac_call_rdm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  uint32_t mtype,start,len;
+
+  data->len=0;
+
+  if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
+    return UL_IAC_RC_PROC;
+
+  if (mtype==0x00) {
+    data->len=len;
+    data->buff=(unsigned char*)start;
+    return UL_IAC_RC_FREEMSG;
+  }
+  return UL_IAC_RC_PROC;
+}
+
+int ul_iac_call_erm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  uint32_t mtype,start,len;
+
+  data->len=0;
+
+  if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
+    return UL_IAC_RC_PROC;
+
+ #ifdef CONFIG_KEYVAL
+  if (mtype==0x01) {
+    lpcisp_erase((void*)start,len);
+    data->len=0;
+    return UL_IAC_RC_FREEMSG;
+  }
+ #endif /* CONFIG_KEYVAL */
+  return UL_IAC_RC_PROC;
+}
+
+int ul_iac_call_wrm(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  uint32_t mtype,start,len;
+
+  data->len=0;
+
+  if(ul_iac_mem_head_rd((uint8_t *)ibuff, msginfo->len,&mtype,&start,&len))
+    return UL_IAC_RC_PROC;
+
+  if (mtype==0x00) {
+    memcpy((void*)start,data->buff,data->len);
+    return UL_IAC_RC_FREEMSG;
+  }
+ #ifdef CONFIG_KEYVAL
+  if (mtype==0x01) {
+    lpcisp_write((char*)start, data->buff, ISP_RAM2FLASH_BLOCK_SIZE);
+    return UL_IAC_RC_FREEMSG;
+  }
+ #endif /* CONFIG_KEYVAL */
+  return UL_IAC_RC_PROC;
+}
+
+
+int ul_iac_call_deb(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  uint32_t debcmd,mtype,start;
+  uint8_t *p=(uint8_t*)ibuff;
+
+  if (msginfo->len<1) return UL_IAC_RC_PROC;
+  debcmd=*(p++);
+  switch (debcmd) {
+    case 0x10: /* goto */
+      data->len=0;
+      if (msginfo->len<5) return UL_IAC_RC_PROC;
+      mtype=*(p++);
+      mtype+=*(p++)<<8;
+      start=*(p++);
+      start+=*(p++)<<8;
+      if(mtype&UL_MTYPE_START32BIT){
+        mtype&=~UL_MTYPE_START32BIT;
+        if (msginfo->len<7) return UL_IAC_RC_PROC;
+        start+=(uint32_t)*(p++)<<16;
+        start+=(uint32_t)*(p++)<<24;
+      }
+      if (mtype==0x00)
+        ((void (*)())start)();
+    default:break;
+  }
+  return UL_IAC_RC_PROC;
+}
+
+int ul_iac_call_res(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  uint32_t rescmd,pass;
+  uint8_t *p=(uint8_t*)ibuff;
+
+  if (msginfo->len<1) return UL_IAC_RC_PROC;
+  rescmd=*(p++);
+  switch (rescmd) {
+    case ULRES_CPU: /* CPU */
+      data->len=0;
+      if (msginfo->len<3) return UL_IAC_RC_PROC;
+      pass=*(p++);
+      pass+=*(p++)<<8;
+      if (pass==0xaa55) {
+        MEMMAP=MEMMAP_FLASH;
+        lpc_watchdog_init(1,10); /* 10ms */
+        lpc_watchdog_feed();
+        while(1);
+      }
+    default:break;
+  }
+  return UL_IAC_RC_PROC;
+}
+
+int uLanInit()
+{
+  struct ul_drv *udrv;
+
+  /* set rs485 mode for UART1 */
+  PINSEL0 = (PINSEL0 & ~0xFFFF0000) | 0x01550000; /* dsr(txd), cts(rxd), rts(rs485_dir), rxd, txd */
+
+  udrv=ul_drv_new(UL_DRV_SYSLESS_PORT,     /* port */
+             UL_DRV_SYSLESS_IRQ,            /* irq */
+            UL_DRV_SYSLESS_BAUD,           /* baud */
+            UL_DRV_SYSLESS_MY_ADR_DEFAULT, /* my adr */
+       #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
+         #ifdef CONFIG_OC_UL_DRV_U450_VARPINS_MSRSWAP
+            "16450-msrswap",               /* chip name */
+         #elif defined(CONFIG_OC_UL_DRV_U450_VARPINS_DIRNEG)
+            "16450-dirneg",                /* chip name */
+          #else
+            "16450",                       /* chip name */
+          #endif
+       #else /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+            "16450",                       /* chip name */
+       #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+            0);                            /* baud base - default */
+
+  if (udrv==NULL)
+    return -1;
+
+  ul_drv_add_iac(udrv,UL_CMD_RDM,UL_IAC_OP_SND,ul_iac_call_rdm,NULL,0,0,NULL);
+  ul_drv_add_iac(udrv,UL_CMD_ERM,UL_IAC_OP_CALLBACK,ul_iac_call_erm,NULL,0,0,NULL);
+  ul_drv_add_iac(udrv,UL_CMD_WRM,UL_IAC_OP_REC,ul_iac_call_wrm,(char*)lpciap_buff,0,0,NULL);
+  ul_drv_add_iac(udrv,UL_CMD_DEB,UL_IAC_OP_CALLBACK,ul_iac_call_deb,NULL,0,0,NULL); 
+  ul_drv_add_iac(udrv,UL_CMD_RES,UL_IAC_OP_CALLBACK,ul_iac_call_res,NULL,0,0,NULL); 
+
+  return ul_drv_add_dev(udrv);
+}
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+#ifdef CONFIG_OC_I2C_DRV_SYSLESS
+
+i2c_drv_t i2c_drv;
+
+int
+i2cInit(void)
+{
+
+  /* set io pins */
+  PINSEL0 = (PINSEL0 & ~0x000000F0) | 0x00000050; /* I2C - SCL, SDA */
+
+  if (i2c_drv_init(&i2c_drv, 
+               I2C_DRV_SYSLESS_PORT,
+               I2C_DRV_SYSLESS_IRQ,
+              I2C_DRV_SYSLESS_BITRATE,
+               I2C_DRV_SYSLESS_SLADR)<0) return -1;
+
+  return 1;
+}
+
+#endif /*CONFIG_OC_I2C_DRV_SYSLESS*/
+
+void _setup_board()
+{
+  // initialize the system
+  sysInit();                               
+
+  #ifdef WATCHDOG_ENABLED
+    lpc_watchdog_init(1,WATCHDOG_TIMEOUT_MS);
+    lpc_watchdog_feed();
+  #endif /* WATCHDOG_ENABLED */
+
+  // initialize the system timer
+  timerInit();
+
+  #ifdef CONFIG_STDIO_COM_PORT
+    uart0Init( B57600 , UART_8N1, UART_FIFO_8); 
+    init_system_stub();
+  #endif /* CONFIG_STDIO_COM_PORT */
+
+  #ifdef CONFIG_OC_UL_DRV_SYSLESS
+//    uld_debug_flg=0x3ff;
+    uLanInit();
+  #endif /* CONFIG_OC_UL_DRV_SYSLESS */
+  
+  #ifdef CONFIG_OC_I2C_DRV_SYSLESS
+    i2cInit();
+  #endif /* CONFIG_OC_I2C_DRV_SYSLESS */
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/bspbase.h b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/bspbase.h
new file mode 100644 (file)
index 0000000..5369f81
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _BSPBASE_H
+#define _BSPBASE_H
+
+#include <types.h>
+#include <lt_timer_types.h>
+
+extern volatile lt_ticks_t sys_timer_ticks;
+
+#define get_sys_timer_ticks() sys_timer_ticks
+
+#endif /* _BSPBASE_H */
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/kbd_io_hisc.c b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/kbd_io_hisc.c
new file mode 100644 (file)
index 0000000..ff4d1d5
--- /dev/null
@@ -0,0 +1,88 @@
+#include <cpu_def.h>
+#include "kbd.h"
+
+unsigned char kbd_onerow(unsigned char scan)
+{
+       kbdisr_lock_level_t level;
+       unsigned int scan_mask=KBD_SCAN_MASK;
+       unsigned int scan_val;
+       unsigned int ret;
+       int delay=10;
+
+       kbdisr_lock(level);
+
+       #ifdef KBD_USE_IO_SETCLR_OPS
+       scan_val=(scan<<KBD_SCAN_BIT0) & scan_mask;
+        SET_OUT_PIN(KBD_PORT,scan_mask);
+        CLR_OUT_PIN(KBD_PORT,scan_val);
+       #else   
+       scan_val=(~scan<<KBD_SCAN_BIT0) & scan_mask;
+       KBD_DR|=scan_val;
+       KBD_DR&=scan_val|~scan_mask;
+       #endif /* KBD_USE_IO_SETCLR_OPS */
+       kbdisr_unlock(level);
+
+       while(delay--)
+               ret=KBD_SSR;
+       ret=KBD_SSR;
+
+       kbdisr_lock(level);
+       #ifdef KBD_USE_IO_SETCLR_OPS
+        SET_OUT_PIN(KBD_PORT,scan_mask);
+       #else   
+       KBD_DR |= scan_mask;
+       #endif /* KBD_USE_IO_SETCLR_OPS */
+       kbdisr_unlock(level);
+       
+       return (~ret>>KBD_RET_BIT0)&((1<<KBD_RET_CNT)-1);
+}
+
+void kbd_setio(void)
+{
+       kbdisr_lock_level_t level;
+       unsigned int scan_mask=KBD_SCAN_MASK;
+       #ifndef KBD_USE_IO_SETCLR_OPS
+       unsigned int ret_mask=KBD_RET_MASK;
+       #endif /* KBD_USE_IO_SETCLR_OPS */
+
+       kbdisr_lock(level);
+       
+       #ifdef KBD_USE_IO_SETCLR_OPS
+        SET_OUT_PIN(KBD_PORT,scan_mask);
+       #else   
+       KBD_DR|=scan_mask;
+       KBD_DDIR|=scan_mask;
+       KBD_DDIR&=~ret_mask;
+       KBD_PUEN|=ret_mask;
+       #endif /* KBD_USE_IO_SETCLR_OPS */
+
+       kbdisr_unlock(level);
+}
+
+const scan2key_t kbd_scan2key_hisc_keypad[]={
+       [0x00]={0,0},
+       [0x01]={'3',0},
+       [0x02]={'6',0},
+       [0x03]={'9',0},
+       [0x04]={'\r',0},
+       [0x05]={'A',0},
+       [0x06]={'2',0},
+       [0x07]={'5',0},
+       [0x08]={'8',0},
+       [0x09]={'0',0},
+       [0x0a]={'B',0},
+       [0x0b]={'1',0},
+       [0x0c]={'4',0},
+       [0x0d]={'7',0},
+       [0x0e]={'*',0},
+       [0x0f]={'C',0},
+};
+
+const scan2mod_t kbd_scan2mod_hisc_keypad[]={
+       {0,0,0,0}
+};
+
+scan2key_t *kbd_scan2key_tab=(scan2key_t*)kbd_scan2key_hisc_keypad;
+scan2mod_t *kbd_scan2mod_tab=(scan2mod_t*)kbd_scan2mod_hisc_keypad;
+
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.c b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.c
new file mode 100644 (file)
index 0000000..86982a7
--- /dev/null
@@ -0,0 +1,117 @@
+/******************************************************************************
+ *
+ * $RCSfile: uart.c,v $
+ * $Revision: 1.1 $
+ *
+ * This module provides interface routines to the LPC ARM UARTs.
+ * Copyright 2004, R O SoftWare
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ *
+ * reduced to see what has to be done for minimum UART-support by mthomas
+ *****************************************************************************/
+
+// #warning "this is a reduced version of the R O Software code"
+
+#include "uart.h"
+
+/* on LPC210x: UART0 TX-Pin=P0.2, RX-Pin=P0.1 
+   PINSEL0 has to be set to "UART-Function" = Function "01" 
+   for Pin 0.0 and 0.1 */
+   
+#define PINSEL_BITPIN0  0
+#define PINSEL_BITPIN1  2
+#define PINSEL_BITPIN2  4
+#define PINSEL_FIRST_ALT_FUNC   1
+#define PINSEL_SECOND_ALT_FUNC  2
+
+// Values of Bits 0-3 in PINSEL to activate UART0
+#define UART0_PINSEL    ((PINSEL_FIRST_ALT_FUNC<<PINSEL_BITPIN0)|(PINSEL_FIRST_ALT_FUNC<<PINSEL_BITPIN1))
+// Mask of Bits 0-4
+#define UART0_PINMASK      (0x0000000F)    /* PINSEL0 Mask for UART0 */
+
+// U0_LCR devisor latch bit 
+#define UART0_LCR_DLAB  7
+
+/*    baudrate divisor - use UART_BAUD macro
+ *    mode - see typical modes (uart.h)
+ *    fmode - see typical fmodes (uart.h)
+ *    NOTE: uart0Init(UART_BAUD(9600), UART_8N1, UART_FIFO_8); 
+ */
+void uart0Init(uint16_t baud, uint8_t mode, uint8_t fmode)
+{
+  volatile int i;
+
+  // setup Pin Function Select Register (Pin Connect Block) 
+  // make sure old values of Bits 0-4 are masked out and
+  // set them according to UART0-Pin-Selection
+  PINSEL0 = (PINSEL0 & ~UART0_PINMASK) | UART0_PINSEL; 
+
+  U0IER = 0x00;             // disable all interrupts
+  U0IIR = 0x00;             // clear interrupt ID register
+  U0LSR = 0x00;             // clear line status register
+
+  // set the baudrate - DLAB must be set to access DLL/DLM
+  U0LCR = (1<<UART0_LCR_DLAB); // set divisor latches (DLAB)
+  U0DLL = (uint8_t)baud;         // set for baud low byte
+  U0DLM = (uint8_t)(baud >> 8);  // set for baud high byte
+  
+  // set the number of characters and other
+  // user specified operating parameters
+  // Databits, Parity, Stopbits - Settings in Line Control Register
+  U0LCR = (mode & ~(1<<UART0_LCR_DLAB)); // clear DLAB "on-the-fly"
+  // setup FIFO Control Register (fifo-enabled + xx trig) 
+  U0FCR = fmode;
+
+  for(i=0;i<65000;i++);
+}
+
+int uart0Putch(int ch)
+{
+  while (!(U0LSR & ULSR_THRE))          // wait for TX buffer to empty
+    continue;                           // also either WDOG() or swap()
+
+  U0THR = (uint8_t)ch;  // put char to Transmit Holding Register
+  return (uint8_t)ch;      // return char ("stdio-compatible"?)
+}
+
+const char *uart0Puts(const char *string)
+{
+       char ch;
+       
+       while ((ch = *string)) {
+               if (uart0Putch(ch)<0) break;
+               string++;
+       }
+       
+       return string;
+}
+
+int uart0TxEmpty(void)
+{
+  return (U0LSR & (ULSR_THRE | ULSR_TEMT)) == (ULSR_THRE | ULSR_TEMT);
+}
+
+void uart0TxFlush(void)
+{
+  U0FCR |= UFCR_TX_FIFO_RESET;          // clear the TX fifo
+}
+
+
+/* Returns: character on success, -1 if no character is available */
+int uart0Getch(void)
+{
+  if (U0LSR & ULSR_RDR)                 // check if character is available
+    return U0RBR;                       // return character
+
+  return -1;
+}
+
+/* Returns: character on success, waits */
+int uart0GetchW(void)
+{
+       while ( !(U0LSR & ULSR_RDR) ); // wait for character 
+       return U0RBR;                // return character
+}
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.h b/ulan/embedded/board/arm/ul_usb1/libs/bspbase/uart.h
new file mode 100644 (file)
index 0000000..f13906c
--- /dev/null
@@ -0,0 +1,65 @@
+/******************************************************************************
+ * based on software from:
+ * Copyright 2004, R O SoftWare
+ * No guarantees, warrantees, or promises, implied or otherwise.
+ * May be used for hobby or commercial purposes provided copyright
+ * notice remains intact.
+ * 
+ * reduced to learn what has to be done to enable and use UART0
+ *****************************************************************************/
+#ifndef INC_UART_H
+#define INC_UART_H
+
+#include <system_def.h>
+
+///////////////////////////////////////////////////////////////////////////////
+// use the following macros to determine the 'baud' parameter values
+// for uart0Init() and uart1Init()
+// CAUTION - 'baud' SHOULD ALWAYS BE A CONSTANT or
+// a lot of code will be generated.
+// Baud-Rate is calculated based on pclk (VPB-clock)
+// the devisor must be 16 times the desired baudrate
+#define UART_BAUD(baud) (uint16_t)((PCLK / ((baud) * 16.0)) + 0.5)
+
+///////////////////////////////////////////////////////////////////////////////
+// Definitions for typical UART 'baud' settings
+#define B1200         UART_BAUD(1200)
+#define B9600         UART_BAUD(9600)
+#define B19200        UART_BAUD(19200)
+#define B38400        UART_BAUD(38400)
+#define B57600        UART_BAUD(57600)
+#define B115200       UART_BAUD(115200)
+
+///////////////////////////////////////////////////////////////////////////////
+// Definitions for typical UART 'mode' settings
+#define UART_8N1      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO   + ULCR_STOP_1)
+#define UART_7N1      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_NO   + ULCR_STOP_1)
+#define UART_8N2      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_NO   + ULCR_STOP_2)
+#define UART_7N2      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_NO   + ULCR_STOP_2)
+#define UART_8E1      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_EVEN + ULCR_STOP_1)
+#define UART_7E1      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_EVEN + ULCR_STOP_1)
+#define UART_8E2      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_EVEN + ULCR_STOP_2)
+#define UART_7E2      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_EVEN + ULCR_STOP_2)
+#define UART_8O1      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_ODD  + ULCR_STOP_1)
+#define UART_7O1      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_ODD  + ULCR_STOP_1)
+#define UART_8O2      (uint8_t)(ULCR_CHAR_8 + ULCR_PAR_ODD  + ULCR_STOP_2)
+#define UART_7O2      (uint8_t)(ULCR_CHAR_7 + ULCR_PAR_ODD  + ULCR_STOP_2)
+
+///////////////////////////////////////////////////////////////////////////////
+// Definitions for typical UART 'fmode' settings
+#define UART_FIFO_OFF (0x00)
+#define UART_FIFO_1   (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG1)
+#define UART_FIFO_4   (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG4)
+#define UART_FIFO_8   (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG8)
+#define UART_FIFO_14  (uint8_t)(UFCR_FIFO_ENABLE + UFCR_FIFO_TRIG14)
+
+void uart0Init(uint16_t baud, uint8_t mode, uint8_t fmode);
+int uart0Putch(int ch);
+uint16_t uart0Space(void);
+const char *uart0Puts(const char *string);
+int uart0TxEmpty(void);
+void uart0TxFlush(void);
+int uart0Getch(void);
+int uart0GetchW(void);
+
+#endif
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Entries b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Entries
new file mode 100644 (file)
index 0000000..70f0af5
--- /dev/null
@@ -0,0 +1,13 @@
+/Makefile/1.1/Thu Jul 20 13:50:18 2006//
+/Makefile.omk/1.2/Mon Sep 25 21:03:13 2006//
+/keyval_loc.h/1.1/Thu Jul 20 13:50:18 2006//
+/lpc2103.ld-cfg/1.3/Wed Dec 26 23:12:57 2007//
+/lpc2103.ld-flash/1.2/Sun Nov 25 23:08:02 2007//
+/lpc2105.ld-app/1.1/Wed Dec 26 21:15:55 2007//
+/lpc2105.ld-boot/1.1/Wed Dec 26 21:15:55 2007//
+/lpc2105.ld-cfg/1.2/Wed Dec 26 23:12:57 2007//
+/lpc2148.ld-app/1.3/Sun Nov 25 23:08:02 2007//
+/lpc2148.ld-boot/1.4/Sun Nov 25 23:08:02 2007//
+/lpc2148.ld-cfg/1.5/Wed Dec 26 23:12:57 2007//
+/mem_loc.h/1.1/Mon Sep 25 21:03:13 2006//
+D
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Repository b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Repository
new file mode 100644 (file)
index 0000000..87a2e81
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/arm/ul_usb1/libs/ldscripts
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Root b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile.omk b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/Makefile.omk
new file mode 100644 (file)
index 0000000..01e6b77
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*))
+
+include_HEADERS = mem_loc.h keyval_loc.h
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/keyval_loc.h b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/keyval_loc.h
new file mode 100644 (file)
index 0000000..2ee23e5
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _KEYVAL_LOC_H
+#define _KEYVAL_LOC_H
+
+extern int _keyval_start;
+extern int _keyval_page_len;
+
+#define KEYVAL_START ((unsigned int)&_keyval_start)
+#define KEYVAL_PAGE_LEN ((unsigned int)&_keyval_page_len)
+
+#endif  /* _KVPB_LOC */
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-cfg b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-cfg
new file mode 100644 (file)
index 0000000..a29dfc8
--- /dev/null
@@ -0,0 +1,12 @@
+
+/* Memory Definitions */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00008000
+  RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00001FE0
+  STACK (rw) : ORIGIN = 0x40000000 + 0x00001FE0 - 4, LENGTH = 4
+
+  FLASHVEC (rx) : ORIGIN = 0x00000000, LENGTH = 0x00000020
+  RAMVEC (w)  : ORIGIN = 0x40000000, LENGTH = 0x00000020
+}
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-flash b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2103.ld-flash
new file mode 100644 (file)
index 0000000..e1a20c6
--- /dev/null
@@ -0,0 +1,94 @@
+/***********************************************************************/
+/*                                                                     */
+/*  ROM.ld:  Linker Script File                                        */
+/*                                                                     */
+/***********************************************************************/
+ENTRY(_startup)
+
+INCLUDE "lpc2103.ld-cfg"
+
+STARTUP(startup.o) 
+
+PROVIDE (_setup_board = 0);
+
+/* Section Definitions */
+SECTIONS
+{
+
+  /* first section is .text which is used for code */
+  .text :
+  {
+    . = ALIGN(4);
+    *(.ivt)
+    *(.text)                   /* remaining code */
+    *(.rodata)                 /* read-only data (constants) */
+    *(.rodata*)
+    *(.glue_7)
+    *(.glue_7t)
+    _etext = ALIGN( 4 ) ;
+  } > FLASH
+
+  /* .data section which is used for initialized data */
+/*  .data : AT (_etext)\r*/
+  .data :
+          AT ( ADDR( .text ) + SIZEOF( .text ) )
+  {
+    . = ALIGN(4);
+    _data = .;
+    *(.data)
+    _edata = ALIGN( 4 ) ;
+  } > RAM
+  /* .bss section which is used for uninitialized data */
+  .bss (NOLOAD) :
+  {
+    . = ALIGN(4);
+    __bss_start = . ;
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = ALIGN( 4 ) ;
+    end = ALIGN( 4 ) ;
+    _end = ALIGN( 4 ) ;
+  } > RAM
+
+  .stack :
+  {
+    _stack = .;
+  } > STACK
+
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-app b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-app
new file mode 100644 (file)
index 0000000..4998f11
--- /dev/null
@@ -0,0 +1,99 @@
+/***********************************************************************/
+/*                                                                     */
+/*  ROM.ld:  Linker Script File                                        */
+/*                                                                     */
+/***********************************************************************/
+ENTRY(_startup)
+
+INCLUDE "lpc2105.ld-cfg"
+
+STARTUP(startup.o) 
+
+PROVIDE (_setup_board = 0);
+
+/* Section Definitions */
+SECTIONS
+{
+
+  /* first section is .text which is used for code */
+  .text :
+  {
+    . = ALIGN(4);
+    *(.text)                   /* remaining code */
+    *(.rodata)                 /* read-only data (constants) */
+    *(.rodata*)
+    *(.glue_7)
+    *(.glue_7t)
+    _etext = ALIGN( 4 ) ;
+  } > FLASHAPP
+
+  .keyval :
+  {
+    PROVIDE (_keyval_start = .);
+    PROVIDE (_keyval_page_len = KEYVAL_PAGE_LEN );
+  }> KEYVAL
+
+  /* .data section which is used for initialized data */
+/*  .data : AT (_etext)\r*/
+  .data :
+          AT ( ADDR( .text ) + SIZEOF( .text ) )
+  {
+    . = ALIGN(4);
+    _data = .;
+    *(.ivt)
+    *(.data)
+    _edata = ALIGN( 4 ) ;
+  } > RAM
+  /* .bss section which is used for uninitialized data */
+  .bss (NOLOAD) :
+  {
+    . = ALIGN(4);
+    __bss_start = . ;
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = ALIGN( 4 ) ;
+    end = ALIGN( 4 ) ;
+    _end = ALIGN( 4 ) ;
+  } > RAM
+
+  .stack :
+  {
+    _stack = .;
+  } > STACK
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-boot b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-boot
new file mode 100644 (file)
index 0000000..5ddb822
--- /dev/null
@@ -0,0 +1,104 @@
+/***********************************************************************/
+/*                                                                     */
+/*  ROM.ld:  Linker Script File                                        */
+/*                                                                     */
+/***********************************************************************/
+ENTRY(_startup)
+
+INCLUDE "lpc2105.ld-cfg"
+
+STARTUP(startup.o) 
+
+PROVIDE (_setup_board = 0);
+
+/* Section Definitions */
+SECTIONS
+{
+
+  /* first section is .text which is used for code */
+  .text :
+  {
+    . = ALIGN(4);
+    *(.ivt)
+    *(.text)                   /* remaining code */
+    *(.rodata)                 /* read-only data (constants) */
+    *(.rodata*)
+    *(.glue_7)
+    *(.glue_7t)
+    _etext = ALIGN( 4 ) ;
+  } > FLASHBOOT
+
+  .app :
+  {
+    PROVIDE (_mem_app_start = . );
+  } > FLASHAPP
+
+  .keyval :
+  {
+    PROVIDE (_keyval_start = .);
+    PROVIDE (_keyval_page_len = KEYVAL_PAGE_LEN );
+  }> KEYVAL
+
+  /* .data section which is used for initialized data */
+/*  .data : AT (_etext)\r*/
+  .data :
+          AT ( ADDR( .text ) + SIZEOF( .text ) )
+  {
+    . = ALIGN(4);
+    _data = .;
+    *(.data)
+    _edata = ALIGN( 4 ) ;
+  } > RAM
+  /* .bss section which is used for uninitialized data */
+  .bss (NOLOAD) :
+  {
+    . = ALIGN(4);
+    __bss_start = . ;
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = ALIGN( 4 ) ;
+    end = ALIGN( 4 ) ;
+    _end = ALIGN( 4 ) ;
+  } > RAM
+
+  .stack :
+  {
+    _stack = .;
+  } > STACK
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-cfg b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2105.ld-cfg
new file mode 100644 (file)
index 0000000..d5a9ba9
--- /dev/null
@@ -0,0 +1,18 @@
+
+KEYVAL_PAGE_LEN = 0x00002000;
+
+/* Memory Definitions */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00020000
+  RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00003FE0
+  STACK (rw) : ORIGIN = 0x40000000 + 0x00003FE0 - 4, LENGTH = 4
+
+  FLASHVEC (rx) : ORIGIN = 0x00000000, LENGTH = 0x00000020
+  FLASHBOOT (rx) : ORIGIN = 0x0000000, LENGTH = 0x0000A000
+  FLASHAPP (rx) : ORIGIN = 0x0000A000, LENGTH = 0x0001A000
+  KEYVAL (rx) : ORIGIN = 0x00001A000, LENGTH = 0x00004000
+
+  RAMVEC (w)  : ORIGIN = 0x40000000, LENGTH = 0x00000020
+}
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-app b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-app
new file mode 100644 (file)
index 0000000..767081f
--- /dev/null
@@ -0,0 +1,99 @@
+/***********************************************************************/
+/*                                                                     */
+/*  ROM.ld:  Linker Script File                                        */
+/*                                                                     */
+/***********************************************************************/
+ENTRY(_startup)
+
+INCLUDE "lpc2148.ld-cfg"
+
+STARTUP(startup.o) 
+
+PROVIDE (_setup_board = 0);
+
+/* Section Definitions */
+SECTIONS
+{
+
+  /* first section is .text which is used for code */
+  .text :
+  {
+    . = ALIGN(4);
+    *(.text)                   /* remaining code */
+    *(.rodata)                 /* read-only data (constants) */
+    *(.rodata*)
+    *(.glue_7)
+    *(.glue_7t)
+    _etext = ALIGN( 4 ) ;
+  } > FLASHAPP
+
+  .keyval :
+  {
+    PROVIDE (_keyval_start = .);
+    PROVIDE (_keyval_page_len = KEYVAL_PAGE_LEN );
+  }> KEYVAL
+
+  /* .data section which is used for initialized data */
+/*  .data : AT (_etext)\r*/
+  .data :
+          AT ( ADDR( .text ) + SIZEOF( .text ) )
+  {
+    . = ALIGN(4);
+    _data = .;
+    *(.ivt)
+    *(.data)
+    _edata = ALIGN( 4 ) ;
+  } > RAM
+  /* .bss section which is used for uninitialized data */
+  .bss (NOLOAD) :
+  {
+    . = ALIGN(4);
+    __bss_start = . ;
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = ALIGN( 4 ) ;
+    end = ALIGN( 4 ) ;
+    _end = ALIGN( 4 ) ;
+  } > RAM
+
+  .stack :
+  {
+    _stack = .;
+  } > STACK
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-boot b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-boot
new file mode 100644 (file)
index 0000000..de00d81
--- /dev/null
@@ -0,0 +1,104 @@
+/***********************************************************************/
+/*                                                                     */
+/*  ROM.ld:  Linker Script File                                        */
+/*                                                                     */
+/***********************************************************************/
+ENTRY(_startup)
+
+INCLUDE "lpc2148.ld-cfg"
+
+STARTUP(startup.o) 
+
+PROVIDE (_setup_board = 0);
+
+/* Section Definitions */
+SECTIONS
+{
+
+  /* first section is .text which is used for code */
+  .text :
+  {
+    . = ALIGN(4);
+    *(.ivt)
+    *(.text)                   /* remaining code */
+    *(.rodata)                 /* read-only data (constants) */
+    *(.rodata*)
+    *(.glue_7)
+    *(.glue_7t)
+    _etext = ALIGN( 4 ) ;
+  } > FLASHBOOT
+
+  .app :
+  {
+    PROVIDE (_mem_app_start = . );
+  } > FLASHAPP
+
+  .keyval :
+  {
+    PROVIDE (_keyval_start = .);
+    PROVIDE (_keyval_page_len = KEYVAL_PAGE_LEN );
+  }> KEYVAL
+
+  /* .data section which is used for initialized data */
+/*  .data : AT (_etext)\r*/
+  .data :
+          AT ( ADDR( .text ) + SIZEOF( .text ) )
+  {
+    . = ALIGN(4);
+    _data = .;
+    *(.data)
+    _edata = ALIGN( 4 ) ;
+  } > RAM
+  /* .bss section which is used for uninitialized data */
+  .bss (NOLOAD) :
+  {
+    . = ALIGN(4);
+    __bss_start = . ;
+    __bss_start__ = . ;
+    *(.bss)
+    *(COMMON)
+    __bss_end__ = ALIGN( 4 ) ;
+    end = ALIGN( 4 ) ;
+    _end = ALIGN( 4 ) ;
+  } > RAM
+
+  .stack :
+  {
+    _stack = .;
+  } > STACK
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-cfg b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/lpc2148.ld-cfg
new file mode 100644 (file)
index 0000000..7534208
--- /dev/null
@@ -0,0 +1,18 @@
+
+KEYVAL_PAGE_LEN = 0x00001000;
+
+/* Memory Definitions */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000
+  RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00007FE0
+  STACK (rw) : ORIGIN = 0x40000000 + 0x00007FE0 - 4, LENGTH = 4
+
+  FLASHVEC (rx) : ORIGIN = 0x00000000, LENGTH = 0x00000020
+  FLASHBOOT (rx) : ORIGIN = 0x0000000, LENGTH = 0x00020000
+  FLASHAPP (rx) : ORIGIN = 0x00020000, LENGTH = 0x00058000
+  KEYVAL (rx) : ORIGIN = 0x000078000, LENGTH = 0x00002000
+
+  RAMVEC (w)  : ORIGIN = 0x40000000, LENGTH = 0x00000020
+}
+
diff --git a/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/mem_loc.h b/ulan/embedded/board/arm/ul_usb1/libs/ldscripts/mem_loc.h
new file mode 100644 (file)
index 0000000..77b24d1
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _MEM_LOC_H
+#define _MEM_LOC_H
+
+extern int _mem_app_start;
+
+#define MEM_APP_START ((unsigned int)&_mem_app_start)
+
+#endif  /* _MEM_LOC */
diff --git a/ulan/embedded/board/mcs51/CVS/Entries b/ulan/embedded/board/mcs51/CVS/Entries
new file mode 100644 (file)
index 0000000..5d11ef1
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:26 2005//
+/Makefile.omk/1.2/Sun Jan 15 21:12:38 2006//
+D/hisc////
+D/ps1////
+D/ulad21////
diff --git a/ulan/embedded/board/mcs51/CVS/Repository b/ulan/embedded/board/mcs51/CVS/Repository
new file mode 100644 (file)
index 0000000..95dbaf6
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51
diff --git a/ulan/embedded/board/mcs51/CVS/Root b/ulan/embedded/board/mcs51/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/Makefile b/ulan/embedded/board/mcs51/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/Makefile.omk b/ulan/embedded/board/mcs51/Makefile.omk
new file mode 100644 (file)
index 0000000..2ca7db1
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+ifneq ($(wildcard $(SOURCES_DIR)/$(BOARD)),)
+SUBDIRS = $(BOARD)
+endif
\ No newline at end of file
diff --git a/ulan/embedded/board/mcs51/hisc/CVS/Entries b/ulan/embedded/board/mcs51/hisc/CVS/Entries
new file mode 100644 (file)
index 0000000..e490b29
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Mon Oct  3 12:43:26 2005//
+/Makefile.omk/1.4/Sat Nov 19 13:47:20 2005//
+/keyval_id_his.h/1.3/Fri Mar  3 13:45:35 2006//
+/system_def.h/1.5/Wed Nov 22 19:32:15 2006//
+/ulan_his.h/1.1/Wed Nov 16 22:22:30 2005//
+D/config////
+D/libs////
diff --git a/ulan/embedded/board/mcs51/hisc/CVS/Repository b/ulan/embedded/board/mcs51/hisc/CVS/Repository
new file mode 100644 (file)
index 0000000..e24f09e
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/hisc
diff --git a/ulan/embedded/board/mcs51/hisc/CVS/Root b/ulan/embedded/board/mcs51/hisc/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/hisc/Makefile b/ulan/embedded/board/mcs51/hisc/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/hisc/Makefile.omk b/ulan/embedded/board/mcs51/hisc/Makefile.omk
new file mode 100644 (file)
index 0000000..e1c5c50
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+include_HEADERS  = system_def.h ulan_his.h keyval_id_his.h
+
+SUBDIRS = libs
diff --git a/ulan/embedded/board/mcs51/hisc/config/CVS/Entries b/ulan/embedded/board/mcs51/hisc/config/CVS/Entries
new file mode 100644 (file)
index 0000000..ed87ff8
--- /dev/null
@@ -0,0 +1,8 @@
+/config.bell-home/1.1/Sat Dec 30 12:07:14 2006//
+/config.blinder/1.5/Wed Nov 22 19:32:15 2006//
+/config.boot/1.3/Wed Nov 22 19:32:15 2006//
+/config.heating-kswtimer/1.5/Wed Nov 22 19:32:15 2006//
+/config.thermometer/1.4/Wed Nov 22 19:32:15 2006//
+/config.ulboot/1.2/Wed Nov 22 19:32:15 2006//
+/config.weather_station/1.2/Wed Nov 22 19:32:15 2006//
+D
diff --git a/ulan/embedded/board/mcs51/hisc/config/CVS/Repository b/ulan/embedded/board/mcs51/hisc/config/CVS/Repository
new file mode 100644 (file)
index 0000000..4f43109
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/hisc/config
diff --git a/ulan/embedded/board/mcs51/hisc/config/CVS/Root b/ulan/embedded/board/mcs51/hisc/config/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.bell-home b/ulan/embedded/board/mcs51/hisc/config/config.bell-home
new file mode 100644 (file)
index 0000000..1e14958
--- /dev/null
@@ -0,0 +1,31 @@
+# -*- makefile -*-
+
+APP=homebell
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -m$(ARCH) --model-large
+
+CONFIG_APP_HISC_BELL_HOME=y
+
+CONFIG_ULAN=y
+CONFIG_KEYVAL=y
+CONFIG_MISC_VECT=y
+CONFIG_ULOI_LT=y
+CONFIG_TONEGEN=y
+
+# This selects linker script
+LD_SCRIPT=hisc
+
+LOAD_CMD-app = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128 -s $(PROG_BASE) -f binary
+
+RUN_CMD-app = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.blinder b/ulan/embedded/board/mcs51/hisc/config/config.blinder
new file mode 100644 (file)
index 0000000..face316
--- /dev/null
@@ -0,0 +1,27 @@
+# -*- makefile -*-
+
+APP=blinder
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -m$(ARCH) --model-large
+
+CONFIG_APP_HISC_BLINDER=y
+
+CONFIG_ULAN=y
+CONFIG_KEYVAL=y
+CONFIG_MISC_VECT=y
+CONFIG_ULOI_LT=y
+
+LOAD_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128 -s $(PROG_BASE) -f binary
+
+RUN_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.boot b/ulan/embedded/board/mcs51/hisc/config/config.boot
new file mode 100644 (file)
index 0000000..42de022
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- makefile -*-
+
+APP=boot
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)-boot
+
+TARGET_ARCH = -m$(ARCH) --model-small
+
+# application
+CONFIG_MCS51_ULBOOT=y
+# libraries for the application
+CONFIG_ULAN=y
+CONFIG_MISC_VECT=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+
+TOHIT=flashmsc
+DEV=/dev/ttyUSB0
+CPU_SYS_HZ=11059200
+
+LOAD_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x7fff; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x807f; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ)
+
+RUN_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -s $(BOOT_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.heating-kswtimer b/ulan/embedded/board/mcs51/hisc/config/config.heating-kswtimer
new file mode 100644 (file)
index 0000000..95635f7
--- /dev/null
@@ -0,0 +1,30 @@
+# -*- makefile -*-
+
+APP=kswtimer
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -m$(ARCH) --model-large
+
+CONFIG_APP_HISC_HEATING_KSWTIMER=y
+
+CONFIG_ULAN=y
+CONFIG_KEYVAL=y
+CONFIG_MISC_VECT=y
+CONFIG_ULOI_LT=y
+
+# This selects linker script
+LD_SCRIPT=hisc
+
+LOAD_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128 -s $(PROG_BASE) -f binary
+
+RUN_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.thermometer b/ulan/embedded/board/mcs51/hisc/config/config.thermometer
new file mode 100644 (file)
index 0000000..2b68066
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- makefile -*-
+
+APP=thermometer
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -mmcs51 --model-large
+
+CONFIG_APP_HISC_THERMOMETR=y
+
+CONFIG_ULAN=y
+CONFIG_MISC_VECT=y
+CONFIG_ULOI_LT=y
+
+CONFIG_MSC_ADC=y
+
+LOAD_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128 -s $(PROG_BASE) -f binary
+
+RUN_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.ulboot b/ulan/embedded/board/mcs51/hisc/config/config.ulboot
new file mode 100644 (file)
index 0000000..382438c
--- /dev/null
@@ -0,0 +1,38 @@
+# -*- makefile -*-
+
+APP=ulboot
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)-boot
+
+TARGET_ARCH = -m$(ARCH) --model-small
+
+# application
+CONFIG_ULBOOT=y
+# libraries for the application
+CONFIG_ULAN=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+# some 51 configuration
+CONFIG_MISC_VECT=y
+CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT=y
+
+# This selects linker script
+LD_SCRIPT=$(BOARD)
+
+TOHIT=flashmsc
+DEV=/dev/ttyUSB0
+CPU_SYS_HZ=11059200
+BAUD=19200
+
+LOAD_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x7fff; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x807f; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -B $(BAUD)
+
+RUN_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -s $(BOOT_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/config/config.weather_station b/ulan/embedded/board/mcs51/hisc/config/config.weather_station
new file mode 100644 (file)
index 0000000..afe5b28
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- makefile -*-
+
+APP=weather-station
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=hisc
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -mmcs51 --model-large
+
+CONFIG_APP_HISC_WEATHER_STATION=y
+
+CONFIG_ULAN=y
+CONFIG_MISC_VECT=y
+CONFIG_ULOI_LT=y
+
+CONFIG_MSC_ADC=y
+
+LOAD_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128 -s $(PROG_BASE) -f binary
+
+RUN_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/hisc/keyval_id_his.h b/ulan/embedded/board/mcs51/hisc/keyval_id_his.h
new file mode 100644 (file)
index 0000000..f07cc45
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _KEYVAL_ID_HIS_H_
+#define _KEYVAL_ID_HISC_H_
+
+#include "keyvalpb.h"
+
+#define KVPB_KEYID_BLINDER_POSSITION    0x20
+#define KVPB_KEYID_BLINDER_OPENTIME     0x21
+#define KVPB_KEYID_BLP_UP              0x22
+#define KVPB_KEYID_BLP_DOWN            0x23
+
+#endif /* _KEYVAL_ID_HIS_H_ */
+
diff --git a/ulan/embedded/board/mcs51/hisc/libs/CVS/Entries b/ulan/embedded/board/mcs51/hisc/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..6d2c85e
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Thu Oct 20 12:36:24 2005//
+/Makefile.omk/1.3/Thu Nov  9 23:19:01 2006//
+/hisc.ld-app/1.1/Thu Nov  9 23:19:01 2006//
+/hisc.ld-boot/1.6/Sat Jan 20 09:39:12 2007//
+/hisc.ld-flash/1.5/Sun Oct  8 20:57:30 2006//
+D/bspbase////
diff --git a/ulan/embedded/board/mcs51/hisc/libs/CVS/Repository b/ulan/embedded/board/mcs51/hisc/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..1f3d4ad
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/hisc/libs
diff --git a/ulan/embedded/board/mcs51/hisc/libs/CVS/Root b/ulan/embedded/board/mcs51/hisc/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/hisc/libs/Makefile b/ulan/embedded/board/mcs51/hisc/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/hisc/libs/Makefile.omk b/ulan/embedded/board/mcs51/hisc/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..a680386
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*))
+
+SUBDIRS = bspbase
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Entries b/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Entries
new file mode 100644 (file)
index 0000000..ce6362d
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Sat Jan 14 19:16:59 2006//
+/Makefile.omk/1.3/Sat Dec 30 11:57:52 2006//
+/bsp0hwinit.c/1.5/Sat Dec 30 11:57:52 2006//
+/bspbase.h/1.3/Wed Nov 22 19:32:16 2006//
+/tonegen.c/1.1/Sat Dec 30 11:57:52 2006//
+/tonegen.h/1.1/Sat Dec 30 11:57:52 2006//
+D
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Repository b/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Repository
new file mode 100644 (file)
index 0000000..efa1809
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/hisc/libs/bspbase
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Root b/ulan/embedded/board/mcs51/hisc/libs/bspbase/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile b/ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile.omk b/ulan/embedded/board/mcs51/hisc/libs/bspbase/Makefile.omk
new file mode 100644 (file)
index 0000000..9771976
--- /dev/null
@@ -0,0 +1,22 @@
+# -*- makefile -*-
+
+default_CONFIG += CONFIG_MSC_ADC=x
+default_CONFIG += CONFIG_MISC_VECT=x
+default_CONFIG += CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT=x
+default_CONFIG += CONFIG_ULAN=x
+default_CONFIG += CONFIG_TONEGEN=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I . 
+
+include_HEADERS = bspbase.h 
+
+lib_LIBRARIES = bspbase
+
+bspbase_SOURCES = bsp0hwinit.c
+
+ifeq ($(CONFIG_TONEGEN),y)
+include_HEADERS += tonegen.h
+bspbase_SOURCES += tonegen.c
+endif
\ No newline at end of file
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/bsp0hwinit.c b/ulan/embedded/board/mcs51/hisc/libs/bspbase/bsp0hwinit.c
new file mode 100644 (file)
index 0000000..91fa7ca
--- /dev/null
@@ -0,0 +1,75 @@
+#include <bspbase.h>
+#include <local_config.h>
+#ifdef CONFIG_MSC_ADC
+ #include <msc_adc.h>
+#endif
+#ifdef CONFIG_MISC_VECT
+ #include <vect.h>
+#endif
+#ifdef CONFIG_ULAN
+ #include <ul_lib/ulan.h>
+#endif
+#ifdef CONFIG_TONEGEN
+ #include <tonegen.h>
+#endif
+/* timers */
+lt_ticks_t DATA sys_timer_ticks;
+
+/****************************************************************************/
+//definice pruseni (casovac)
+
+void timer(void) 
+#ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+interrupt 
+#endif
+{
+  if (AIE & 0x10) {
+    uint8_t data msint=MSINT;
+
+    /* timer */
+    sys_timer_ticks++;
+
+  #ifdef WATCHDOG_ENABLED
+    WATCHDOG_REFRESH();
+  #endif
+  }
+  AI=0; // Clear Aux INT (Bit in EICON)
+} 
+
+/****************************************************************************/
+void setup_board(void) 
+{
+  MCON|=1;              //XDATA memory map to 0x8400
+
+  OUTB(OUT_PORT,0xff);  
+
+  sys_timer_ticks=0;
+
+  MSECH=(CPU_SYS_HZ/1000-1) / 0x100;
+  MSECL=(CPU_SYS_HZ/1000-1) % 0x100;
+  PDCON&=~0x02;  // System Timer ON
+  MSINT=9|128;   //10ms
+ #ifdef CONFIG_MISC_VECT
+  vec_set(timer,0x33);
+ #endif
+  AIE=0x10;
+ #ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+  EAI=1;
+ #endif
+
+ #ifdef CONFIG_MSC_ADC
+  msc_adc_init();
+ #endif
+
+  //********************
+  // watchdog
+ #ifdef WATCHDOG_ENABLED
+  WATCHDOG_ON();
+  WATCHDOG_SET_MS(1000); //1s
+  WATCHDOG_REFRESH();
+ #endif
+
+ #ifdef CONFIG_TONEGEN
+  tg_init();
+ #endif
+}
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/bspbase.h b/ulan/embedded/board/mcs51/hisc/libs/bspbase/bspbase.h
new file mode 100644 (file)
index 0000000..74e9bf3
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _BSPBASE_H
+#define _BSPBASE_H
+
+#include <types.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <lt_timer_types.h>
+
+//timers
+extern lt_ticks_t DATA sys_timer_ticks;
+
+#define get_sys_timer_ticks() sys_timer_ticks
+
+
+void setup_board(void);
+
+#endif /* _BSPBASE_H */
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.c b/ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.c
new file mode 100644 (file)
index 0000000..1edc20f
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+    TONE GENERATOR
+*/
+
+#include <system_def.h>
+#include <cpu_def.h>
+#include <lt_timer.h>
+#include <vect.h>
+#include <tonegen.h>
+
+LT_TIMER_DEC(lt_tgmsec)
+LT_TIMER_IMP(lt_tgmsec)
+
+bit tg_cnt;
+
+const tg_tone_t tg_do={262,500};
+const tg_tone_t tg_re={294,500};
+const tg_tone_t tg_mi={330,500};
+const tg_tone_t tg_fa={349,500};
+const tg_tone_t tg_so={392,500};
+const tg_tone_t tg_la={440,500};
+const tg_tone_t tg_si={494,500};
+
+/****************************************************************************/
+//definice pruseni (casovac2)
+void tg_int(void) interrupt 
+{
+  if (!TF2) return;
+  TF2=0;
+  tg_cnt=!tg_cnt;
+  if (tg_cnt) {
+    OUTB(OUT_PORT,0xC0);
+  } else {
+    OUTB(OUT_PORT,0x00);
+  }
+} 
+
+/****************************************************************************/
+void tg_init(void) 
+{
+  T2CON = 0x00; 
+  vec_set(tg_int,IADDR_TIMER2);
+}
+
+/****************************************************************************/
+void tg_start(unsigned int tone) 
+{
+  unsigned long DATA tmp;
+
+  tmp=(CPU_SYS_HZ/12)/tone;
+  tmp=65536-tmp;
+
+  RCAP2L=tmp;
+  RCAP2H=tmp>>8;  
+
+  TH2 = RCAP2H;
+  TL2 = RCAP2L;
+  
+  lt_tgmsec_init();
+  TR2 = 1; 
+  ET2=1;                                //povol preruseni casov2
+}
+
+/****************************************************************************/
+int tg_expired(unsigned int duration) 
+{
+  return lt_tgmsec_expired(duration);
+}
+
+/****************************************************************************/
+void tg_stop(void) 
+{
+  ET2=0;                                //povol preruseni casov2
+  TR2 = 0; 
+  OUTB(OUT_PORT,0xC0);
+}
+
diff --git a/ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.h b/ulan/embedded/board/mcs51/hisc/libs/bspbase/tonegen.h
new file mode 100644 (file)
index 0000000..cf844d7
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _TONEGEN_H
+#define _TONEGEN_H
+/*
+    TONE GENARATOR
+*/
+
+typedef struct tg_tone_t {
+  unsigned int t;
+  unsigned int d;
+} tg_tone_t;
+
+extern const tg_tone_t tg_do;
+extern const tg_tone_t tg_re;
+extern const tg_tone_t tg_mi;
+extern const tg_tone_t tg_fa;
+extern const tg_tone_t tg_so;
+extern const tg_tone_t tg_la;
+extern const tg_tone_t tg_si;
+
+void tg_init(void);
+void tg_start(unsigned int tone);
+int tg_expired(unsigned int duration);
+void tg_stop(void);
+
+#endif /* _TONEGEN_H */
diff --git a/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-app b/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-app
new file mode 100644 (file)
index 0000000..ef89107
--- /dev/null
@@ -0,0 +1,17 @@
+BOOT_BASE = 0x0080
+BOOT_SIZE = 0x2580
+KVPB_BASE = 0x2600
+KVPB_SIZE = 0x0100
+PROG_BASE = 0x2800
+PROG_SIZE = 0x5800
+
+XRAM   = 0x8480
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(PROG_BASE)
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK)
diff --git a/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-boot b/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-boot
new file mode 100644 (file)
index 0000000..91fcaaf
--- /dev/null
@@ -0,0 +1,19 @@
+BOOT_BASE = 0x0080
+BOOT_SIZE = 0x2580
+KVPB_BASE = 0x2600
+KVPB_SIZE = 0x0100
+PROG_BASE = 0x2800
+PROG_SIZE = 0x5800
+
+XRAM   = 0x8480
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(BOOT_BASE)
+DATA   = 0x10
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK) \
+--data-loc $(DATA) 
diff --git a/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-flash b/ulan/embedded/board/mcs51/hisc/libs/hisc.ld-flash
new file mode 100644 (file)
index 0000000..ef89107
--- /dev/null
@@ -0,0 +1,17 @@
+BOOT_BASE = 0x0080
+BOOT_SIZE = 0x2580
+KVPB_BASE = 0x2600
+KVPB_SIZE = 0x0100
+PROG_BASE = 0x2800
+PROG_SIZE = 0x5800
+
+XRAM   = 0x8480
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(PROG_BASE)
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK)
diff --git a/ulan/embedded/board/mcs51/hisc/system_def.h b/ulan/embedded/board/mcs51/hisc/system_def.h
new file mode 100644 (file)
index 0000000..5e7510c
--- /dev/null
@@ -0,0 +1,83 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  hisc firmware  
+  system_def_hisc.h - definition of hardware adresses and registers
+  Copyright (C) 2004 by Petr Smolik petr.smolik@wo.cz
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_HISC_H
+#define _SYSTEM_DEF_HISC_H
+
+#include <mcu_regs.h>
+#include <bspbase.h>
+
+#define CPU_SYS_HZ 11059200l
+#define WATCHDOG_ENABLED
+#define ES_U ES1
+#define SYS_TIMER_HZ    100               //1000Hz pro casovac
+
+#define BAUD2BAUDDIV(baud) \
+       ((CPU_SYS_HZ+12*8l*baud)/(12*16l*baud))
+
+#define HZ2TMODE1H(x) \
+        (0x100-((CPU_SYS_HZ/12/x) / 256))
+#define HZ2TMODE1L(x) \
+        (0x100-((CPU_SYS_HZ/12/x) % 256))
+
+
+#ifdef SDCC
+ sbit at 0xB2 LED_GP;      // P3.2
+ sbit at 0xB2 LED_ERR;     // P3.2
+ sbit at 0xB6 CS_WR;       // P3.6
+ sbit at 0xA6 CS_O;        // P2.6
+ sbit at 0x87 OUT_CYCLE_PUMP; //P0.7
+#else
+ sbit  LED_GP  = P3^2;
+ sbit  LED_ERR  = P3^2;
+ sbit   OUT_CYCLE_PUMP = P0^7;
+#endif /*SDCC*/
+
+
+/***************************************************************************/
+/* io functions */
+#define IN_PORT                        P0
+#define LED_PORT               P3
+#define OUT_PORT               P0
+
+
+#define GET_IN_PIN(port,in)    ((port & in)?1:0)
+#define SET_OUT_PIN(port,out)   out=1;
+#define CLR_OUT_PIN(port,out)   out=0;
+#define OUTB(port,out)         {CS_O=1;CS_WR=0;port=out;CS_O=0;CS_WR=1;}
+
+/***************************************************************************/
+/* watchdog */
+
+#define WATCHDOG_ON() { \
+    WDTCON|=0x20;WDTCON&=~0x20; \
+    PDCON&=~0x04; \
+    WDTCON|=0x80;WDTCON&=~0x80; \
+    }
+
+#define WATCHDOG_OFF() { \
+    WDTCON|=0x40;WDTCON&=~0x40; \
+    PDCON|=0x04; \
+    }
+
+#define WATCHDOG_SET_MS(x) { \
+    WDTCON=(WDTCON&~0xE0)|(x/100); \
+    }
+
+#define WATCHDOG_REFRESH() { \
+    WDTCON|=0x20;WDTCON&=~0x20; \
+    }
+
+#define watchdog_feed WATCHDOG_REFRESH
+
+#define KVPB_MINIMALIZED
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE
+
+#endif /* _SYSTEM_DEF_HISC_H_ */
diff --git a/ulan/embedded/board/mcs51/hisc/ulan_his.h b/ulan/embedded/board/mcs51/hisc/ulan_his.h
new file mode 100644 (file)
index 0000000..a7033d3
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _ULAN_HIS_H
+#define _ULAN_HIS_H
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+/* basic uLan commands/services */
+
+#define UL_CMD_HIS          0x27    /* Home Information System */
+
+/* UL_CMD_HIS  Home Information System */
+#define ULHIS_TIME          0x10    /* Da Mo Ce Ye Hr Mi Se DW */
+#define ULHIS_KSWT_SLST     0x20    /* HrSt MiSt HrSo MiSo DW OUT */ 
+#define ULHIS_KSWT_GLST     0x21    /* HrSt MiSt HrSo MiSo DW OUT */
+#define ULHIS_BLINDER_STOP  0x30    /* Blinder stop */
+#define ULHIS_BLINDER_UP    0x31    /* Blinder up , Time*/
+#define ULHIS_BLINDER_DOWN  0x32    /* Blinder down, Time*/
+        
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _ULAN_HIS_H */
+
diff --git a/ulan/embedded/board/mcs51/ps1/CVS/Entries b/ulan/embedded/board/mcs51/ps1/CVS/Entries
new file mode 100644 (file)
index 0000000..7f8d58e
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Mon Oct  3 12:43:26 2005//
+/Makefile.omk/1.3/Sun Jan 15 21:12:38 2006//
+/system_def.h/1.4/Wed Nov 22 19:32:16 2006//
+D/config////
+D/libs////
+D/periph////
diff --git a/ulan/embedded/board/mcs51/ps1/CVS/Repository b/ulan/embedded/board/mcs51/ps1/CVS/Repository
new file mode 100644 (file)
index 0000000..ee39b6d
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ps1
diff --git a/ulan/embedded/board/mcs51/ps1/CVS/Root b/ulan/embedded/board/mcs51/ps1/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ps1/Makefile b/ulan/embedded/board/mcs51/ps1/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ps1/Makefile.omk b/ulan/embedded/board/mcs51/ps1/Makefile.omk
new file mode 100644 (file)
index 0000000..c757ba8
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- makefile -*-
+
+include_HEADERS  = system_def.h
+
+nobase_include_HEADERS = periph/i2c.h
+
+SUBDIRS = libs
diff --git a/ulan/embedded/board/mcs51/ps1/config/CVS/Entries b/ulan/embedded/board/mcs51/ps1/config/CVS/Entries
new file mode 100644 (file)
index 0000000..8034e3d
--- /dev/null
@@ -0,0 +1,2 @@
+/config.u2u/1.3/Wed Nov 16 22:22:31 2005//
+D
diff --git a/ulan/embedded/board/mcs51/ps1/config/CVS/Repository b/ulan/embedded/board/mcs51/ps1/config/CVS/Repository
new file mode 100644 (file)
index 0000000..b2c71e6
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ps1/config
diff --git a/ulan/embedded/board/mcs51/ps1/config/CVS/Root b/ulan/embedded/board/mcs51/ps1/config/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ps1/config/config.u2u b/ulan/embedded/board/mcs51/ps1/config/config.u2u
new file mode 100644 (file)
index 0000000..4330175
--- /dev/null
@@ -0,0 +1,18 @@
+# -*- makefile -*-
+
+APP=u2u
+
+ARCH=mcs51
+MACH=at89c51ed2
+BOARD=ps1
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -mmcs51 --model-large
+
+CONFIG_APP_U2U=y
+
+CONFIG_ULAN=y
+CONFIG_USB_BASE=y
+CONFIG_USB_PDIUSB=y
diff --git a/ulan/embedded/board/mcs51/ps1/libs/CVS/Entries b/ulan/embedded/board/mcs51/ps1/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..b09aa3b
--- /dev/null
@@ -0,0 +1,4 @@
+/Makefile/1.1/Thu Oct 20 12:36:24 2005//
+/Makefile.omk/1.2/Sun Jan 15 21:12:39 2006//
+/ps1.ld-flash/1.2/Sun Oct  8 20:57:30 2006//
+D/bspbase////
diff --git a/ulan/embedded/board/mcs51/ps1/libs/CVS/Repository b/ulan/embedded/board/mcs51/ps1/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..bc3d812
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ps1/libs
diff --git a/ulan/embedded/board/mcs51/ps1/libs/CVS/Root b/ulan/embedded/board/mcs51/ps1/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ps1/libs/Makefile b/ulan/embedded/board/mcs51/ps1/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ps1/libs/Makefile.omk b/ulan/embedded/board/mcs51/ps1/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..c9db933
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*))
+
+SUBDIRS = bspbase
\ No newline at end of file
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Entries b/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Entries
new file mode 100644 (file)
index 0000000..90cc45b
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Sun Jan 15 21:12:39 2006//
+/Makefile.omk/1.2/Thu Nov  9 23:19:05 2006//
+/bsp0hwinit.c/1.7/Sat Mar 31 20:50:09 2007//
+/bspbase.h/1.5/Wed Nov 22 19:32:16 2006//
+/i2c.c/1.1/Sun Jan 15 21:12:39 2006//
+D
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Repository b/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Repository
new file mode 100644 (file)
index 0000000..ad4f269
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ps1/libs/bspbase
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Root b/ulan/embedded/board/mcs51/ps1/libs/bspbase/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile b/ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile.omk b/ulan/embedded/board/mcs51/ps1/libs/bspbase/Makefile.omk
new file mode 100644 (file)
index 0000000..3892241
--- /dev/null
@@ -0,0 +1,15 @@
+# -*- makefile -*-
+
+default_CONFIG += CONFIG_MISC_VECT=x
+default_CONFIG += CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT=x
+default_CONFIG += CONFIG_ULAN=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I . 
+
+include_HEADERS =  bspbase.h
+
+lib_LIBRARIES = bspbase
+
+bspbase_SOURCES = bsp0hwinit.c i2c.c
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/bsp0hwinit.c b/ulan/embedded/board/mcs51/ps1/libs/bspbase/bsp0hwinit.c
new file mode 100644 (file)
index 0000000..8924dc8
--- /dev/null
@@ -0,0 +1,49 @@
+#include <bspbase.h>
+#include <local_config.h>
+#ifdef CONFIG_MISC_VECT
+ #include <vect.h>
+#endif
+#ifdef CONFIG_ULAN
+ #include <ul_lib/ulan.h>
+#endif
+
+/* timers */
+lt_ticks_t DATA sys_timer_ticks;
+
+/****************************************************************************/
+//definice pruseni (casovac0)
+void timer(void) 
+#ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+ interrupt 
+ #ifndef CONFIG_MISC_VECT
+  1 
+ #endif
+#endif
+{
+  TH0=HZ2TMODE1H(SYS_TIMER_HZ);                        //nastav casovac0
+  TL0=HZ2TMODE1L(SYS_TIMER_HZ);
+
+  sys_timer_ticks++;
+}
+
+/****************************************************************************/
+void setup_board(void) 
+{
+  sys_timer_ticks=0;
+  P3=0xff;P1=0xff;
+  TMOD=0x21;                                    //citac0-16bitovy,1-8bitovy(reload)
+  TH0=HZ2TMODE1H(SYS_TIMER_HZ);                        //nastav casovac0
+  TL0=HZ2TMODE1L(SYS_TIMER_HZ);      
+  TCON=0x10;                                    //nul. priz. casov0,1;spust casov0
+ #ifdef CONFIG_MISC_VECT
+  vec_set(timer,IADDR_TIMER0);
+ #endif
+ #ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+  ET0=1;                                        //povol preruseni casov0  
+ #endif
+ #ifdef WATCHDOG_ENABLED
+  WATCHDOG_ON();
+  WATCHDOG_SET_MS(1000); //1s
+  WATCHDOG_REFRESH();
+ #endif
+}
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/bspbase.h b/ulan/embedded/board/mcs51/ps1/libs/bspbase/bspbase.h
new file mode 100644 (file)
index 0000000..eef520f
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _BSPBASE_H
+#define _BSPBASE_H
+
+#include <types.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <lt_timer_types.h>
+
+//timers
+extern lt_ticks_t DATA sys_timer_ticks;
+
+#define get_sys_timer_ticks() sys_timer_ticks
+
+void setup_board(void);
+
+#endif /* _BSPBASE_H */
diff --git a/ulan/embedded/board/mcs51/ps1/libs/bspbase/i2c.c b/ulan/embedded/board/mcs51/ps1/libs/bspbase/i2c.c
new file mode 100644 (file)
index 0000000..fe1fa0c
--- /dev/null
@@ -0,0 +1,134 @@
+#include <stdio.h>
+#include <system_def.h>
+#include <periph/i2c.h>
+#ifdef __KEIL__
+#include <intrins.h>
+#endif /*__KEIL__*/
+void i2c_init( void) {
+  SDAO = 1; SDAI = 1; SCL = 1;
+}
+/***************************************************************************/
+
+void i2c_wait(void) {
+ #ifdef __KEIL__
+     _nop_();
+     _nop_();
+     _nop_();
+     _nop_();
+     _nop_();
+ #elif SDCC
+  _asm
+     nop;
+     nop;
+     nop;
+     nop;
+     nop;
+  _endasm;
+ #else
+   #error "unsuported compiler!"
+ #endif
+}
+#define i2c_DELAY i2c_wait()
+
+/***************************************************************************/
+void i2c_start( void) {
+  SDAO = 0;
+  i2c_DELAY;
+  SCL = 0;
+  i2c_DELAY;
+}
+/***************************************************************************/
+char i2c_stop( void) {
+  SDAO = 0;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  SDAO = 1;
+  return SDAI;
+}
+/***************************************************************************/
+char i2c_outbyte( unsigned char byte) {
+  unsigned char b=8;
+  bit ack = 1;
+  
+  while(b--) {
+    SDAO = (byte & 0x80) ? 1 : 0;
+    byte<<= 1;
+    i2c_DELAY;
+    SCL = 1;
+    i2c_DELAY;
+    SCL = 0;
+  }
+  i2c_DELAY;
+  SDAO = 1;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  ack = SDAI;
+  SCL = 0;
+//  SDAO = 0;
+  return ack; /* if ack == 0 then OK */
+}
+/***************************************************************************/
+char i2c_inbyte( unsigned char *byte, bit last) {
+  unsigned char b = 8;
+  unsigned char out = 0;
+  bit ack = 1;
+  
+  while(b--) {
+    SDAO = 1;
+    i2c_DELAY;
+    SCL = 1;
+    i2c_DELAY;
+    out <<= 1;
+    out |= SDAI ? 1 : 0;
+    SCL = 0;
+  }
+  SDAO = last;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  ack = SDAI;
+  SCL = 0;
+//  SDAO = 0;
+  if ( ack == last) *byte = out;
+  return ack;
+}
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+char i2c_write( unsigned char adr, unsigned char *bytes, unsigned char cnt) {
+  i2c_start();
+  if ( i2c_outbyte( adr)) {
+    i2c_stop();
+//    printf("iA%02X",adr);
+    return 0;
+  }
+  while(cnt) {
+    if ( i2c_outbyte( *bytes++)) {
+      i2c_stop();
+//      printf("iW%02X(%02X)",adr,*(bytes-1));
+      return 0;
+    }
+    cnt--;
+  }
+  i2c_stop(); /* return bit */
+  return 1;
+}
+/***************************************************************************/
+char i2c_read( unsigned char adr, unsigned char *bytes, unsigned char cnt) {
+  i2c_start();
+  if ( i2c_outbyte( adr)) {
+    i2c_stop();
+//    printf("ia%02X",adr);
+    return 0;
+  }
+  while(cnt) {
+    i2c_inbyte( bytes++, cnt==1); /* check line */
+    cnt--;
+  }
+  i2c_stop(); /* check stop */
+  return 1;
+}
+
diff --git a/ulan/embedded/board/mcs51/ps1/libs/ps1.ld-flash b/ulan/embedded/board/mcs51/ps1/libs/ps1.ld-flash
new file mode 100644 (file)
index 0000000..95520df
--- /dev/null
@@ -0,0 +1,17 @@
+PROG_BASE = 0x0000
+PROG_SIZE = 0xFC00
+BOOT_BASE = 0xFC00
+BOOT_SIZE = 0x0400
+KVPB_BASE = 0x0000
+KVPB_BASE = 0x0000
+
+XRAM   = 0x8000
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(PROG_BASE)
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK) 
diff --git a/ulan/embedded/board/mcs51/ps1/periph/CVS/Entries b/ulan/embedded/board/mcs51/ps1/periph/CVS/Entries
new file mode 100644 (file)
index 0000000..d934010
--- /dev/null
@@ -0,0 +1,2 @@
+/i2c.h/1.1/Mon Oct  3 12:43:26 2005//
+D
diff --git a/ulan/embedded/board/mcs51/ps1/periph/CVS/Repository b/ulan/embedded/board/mcs51/ps1/periph/CVS/Repository
new file mode 100644 (file)
index 0000000..fed60c7
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ps1/periph
diff --git a/ulan/embedded/board/mcs51/ps1/periph/CVS/Root b/ulan/embedded/board/mcs51/ps1/periph/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ps1/periph/i2c.h b/ulan/embedded/board/mcs51/ps1/periph/i2c.h
new file mode 100644 (file)
index 0000000..d0f89c3
--- /dev/null
@@ -0,0 +1,12 @@
+#if !defined(__I2C_H)
+#define __I2C_H
+
+void i2c_init( void);
+char i2c_write( unsigned char adr, unsigned char *bytes, unsigned char cnt);
+char i2c_read( unsigned char adr, unsigned char *bytes, unsigned char cnt);
+
+#define I2C_Write i2c_write
+#define I2C_Read  i2c_read
+
+#endif
+
diff --git a/ulan/embedded/board/mcs51/ps1/system_def.h b/ulan/embedded/board/mcs51/ps1/system_def.h
new file mode 100644 (file)
index 0000000..a967724
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  hisc firmware  
+  system_def_hisc.h - definition of hardware adresses and registers
+  Copyright (C) 2004 by Petr Smolik petr.smolik@wo.cz
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_PS1_H
+#define _SYSTEM_DEF_PS1_H
+
+#include <mcu_regs.h>
+#include <bspbase.h>
+
+#define CPU_SYS_HZ 11059200l
+
+#define BAUD2BAUDDIV(baud) \
+       ((CPU_SYS_HZ+12*8l*baud)/(12*16l*baud))
+
+#define HZ2TMODE1H(x) \
+        (0x100-((CPU_SYS_HZ/12/x) / 256))
+#define HZ2TMODE1L(x) \
+        (0x100-((CPU_SYS_HZ/12/x) % 256))
+
+#define SYS_TIMER_HZ    100               //100Hz pro casovac
+
+#define ES_U ES
+    
+//volatile unsigned long msec_time;
+
+#if 1 /* special for PDIUSBD11 */
+#define PDIUSB_READ_DATA_ADDR   (0x35)
+#define PDIUSB_WRITE_DATA_ADDR  (0x34)
+#define PDIUSB_COMMAND_ADDR     (0x36)
+
+#if defined(SDCC) // sdcc
+ sbit at 0x96 SCL;         // P1.6
+ sbit at 0x97 SDAI;        // P1.7
+ sbit at 0x97 SDAO;        // P1.7
+
+ sbit at 0xB2 IPDI;        // P3.2
+ sbit at 0x94 LEDRX;       // P1.4
+ sbit at 0x95 LEDTX;       // P1.5
+#else
+ sbit  SCL  = P1^6;
+ sbit  SDAI = P1^7;
+ sbit  SDAO = P1^7;
+
+ sbit  IPDI  = P3^2;
+ sbit  LEDRX  = P1^4;
+ sbit  LEDTX  = P1^5; 
+#endif
+
+/* P1.0 .. DACK_N/DMACK0, P7.0 .. DMREQ/DREQ0, P7.2 .. EOT_N/TEND0 */
+//#define ISR_USB_INTV         EXCPTVEC_IRQ6   /* pin IRQ6 on PG.0 */
+#undef  PDIUSB_WITH_ADD_IRQ_HANDLER
+#undef PDIUSB_WITH_EXCPTVECT_SET
+#define PDIUSB_SUPPORT_ENABLED
+#endif 
+
+#endif /* _SYSTEM_DEF_PS1_H_ */
diff --git a/ulan/embedded/board/mcs51/ulad21/CVS/Entries b/ulan/embedded/board/mcs51/ulad21/CVS/Entries
new file mode 100644 (file)
index 0000000..a9f2aa4
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Mon Oct  3 12:43:27 2005//
+/Makefile.omk/1.3/Sun Jan 15 21:14:03 2006//
+/system_def.h/1.1/Mon Oct  3 12:43:27 2005//
+/system_def_msc51_uc1.h/1.5/Wed Nov 22 19:32:16 2006//
+D/config////
+D/libs////
+D/periph////
diff --git a/ulan/embedded/board/mcs51/ulad21/CVS/Repository b/ulan/embedded/board/mcs51/ulad21/CVS/Repository
new file mode 100644 (file)
index 0000000..08c83f9
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ulad21
diff --git a/ulan/embedded/board/mcs51/ulad21/CVS/Root b/ulan/embedded/board/mcs51/ulad21/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ulad21/Makefile b/ulan/embedded/board/mcs51/ulad21/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ulad21/Makefile.omk b/ulan/embedded/board/mcs51/ulad21/Makefile.omk
new file mode 100644 (file)
index 0000000..4b9510b
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- makefile -*-
+
+include_HEADERS  = system_def.h system_def_msc51_uc1.h
+
+nobase_include_HEADERS = periph/i2c.h
+
+SUBDIRS = libs
diff --git a/ulan/embedded/board/mcs51/ulad21/config/CVS/Entries b/ulan/embedded/board/mcs51/ulad21/config/CVS/Entries
new file mode 100644 (file)
index 0000000..5c4e150
--- /dev/null
@@ -0,0 +1,4 @@
+/config.boot/1.3/Wed Nov 22 19:32:16 2006//
+/config.u2u/1.6/Wed Mar 21 01:22:32 2007//
+/config.ulboot/1.2/Wed Nov 22 19:32:16 2006//
+D
diff --git a/ulan/embedded/board/mcs51/ulad21/config/CVS/Repository b/ulan/embedded/board/mcs51/ulad21/config/CVS/Repository
new file mode 100644 (file)
index 0000000..8346eb0
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ulad21/config
diff --git a/ulan/embedded/board/mcs51/ulad21/config/CVS/Root b/ulan/embedded/board/mcs51/ulad21/config/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ulad21/config/config.boot b/ulan/embedded/board/mcs51/ulad21/config/config.boot
new file mode 100644 (file)
index 0000000..d423ec2
--- /dev/null
@@ -0,0 +1,32 @@
+# -*- makefile -*-
+
+APP=boot
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=ulad21
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)-boot
+
+TARGET_ARCH = -m$(ARCH) --model-small
+
+# application
+CONFIG_MCS51_ULBOOT=y
+# libraries for the application
+CONFIG_ULAN=y
+CONFIG_MISC_VECT=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+
+TOHIT=flashmsc
+DEV=/dev/ttyUSB0
+CPU_SYS_HZ=11059200
+
+LOAD_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x7fff; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x807f; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ)
+
+RUN_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -s $(BOOT_BASE)
diff --git a/ulan/embedded/board/mcs51/ulad21/config/config.u2u b/ulan/embedded/board/mcs51/ulad21/config/config.u2u
new file mode 100644 (file)
index 0000000..4517036
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- makefile -*-
+
+APP=u2u
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=ulad21
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)
+
+TARGET_ARCH = -m$(ARCH) --model-large
+
+CONFIG_APP_U2U=y
+CONFIG_ULAN=y
+CONFIG_MISC_VECT=y
+CONFIG_USB_BASE=y
+CONFIG_USB_PDIUSB=y
+
+#CFLAGS += -DUSB_VENDOR_ID=0x1669 -DUSB_PRODUCT_ID=0x1001
+
+LOAD_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g 0; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -s $(PROG_BASE) -l $(PROG_SIZE) -e; \
+    $(TOHIT) -m $(MOD) -o 0 -t 5 -b 128
+
+RUN_CMD-flash = \
+    $(TOHIT) -m $(MOD) -g $(PROG_BASE)
diff --git a/ulan/embedded/board/mcs51/ulad21/config/config.ulboot b/ulan/embedded/board/mcs51/ulad21/config/config.ulboot
new file mode 100644 (file)
index 0000000..245e611
--- /dev/null
@@ -0,0 +1,37 @@
+# -*- makefile -*-
+
+APP=boot
+
+ARCH=mcs51
+MACH=msc1210
+BOARD=ulad21
+
+ULAN_ID=$(APP)-$(BOARD)
+ULAN_CFG=$(BOARD)-boot
+
+TARGET_ARCH = -m$(ARCH) --model-small
+
+# application
+CONFIG_ULBOOT=y
+# libraries for the application
+CONFIG_ULAN=y
+CONFIG_KEYVAL=y
+CONFIG_ULAN_DY=y
+#some configuration
+CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT=y
+CONFIG_MISC_VECT=y
+
+# This selects linker script
+LD_SCRIPT=$(BOARD)
+
+TOHIT=flashmsc
+DEV=/dev/ttyUSB0
+CPU_SYS_HZ=18432100
+
+LOAD_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x7fff; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -E 0x807f; \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ)
+
+RUN_CMD-boot = \
+    $(TOHIT) -d $(DEV) -X $(CPU_SYS_HZ) -s $(BOOT_BASE)
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/CVS/Entries b/ulan/embedded/board/mcs51/ulad21/libs/CVS/Entries
new file mode 100644 (file)
index 0000000..c539bcf
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Thu Oct 20 12:36:24 2005//
+/Makefile.omk/1.2/Sun Jan 15 21:14:03 2006//
+/ulad21.ld-boot/1.6/Sat Jan 20 09:39:12 2007//
+/ulad21.ld-flash/1.5/Sun Oct  8 20:57:30 2006//
+D/bspbase////
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/CVS/Repository b/ulan/embedded/board/mcs51/ulad21/libs/CVS/Repository
new file mode 100644 (file)
index 0000000..c57e446
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ulad21/libs
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/CVS/Root b/ulan/embedded/board/mcs51/ulad21/libs/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/Makefile b/ulan/embedded/board/mcs51/ulad21/libs/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/Makefile.omk b/ulan/embedded/board/mcs51/ulad21/libs/Makefile.omk
new file mode 100644 (file)
index 0000000..c9db933
--- /dev/null
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*))
+
+SUBDIRS = bspbase
\ No newline at end of file
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Entries b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Entries
new file mode 100644 (file)
index 0000000..56e302c
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Sun Jan 15 21:14:05 2006//
+/Makefile.omk/1.2/Thu Nov  9 23:19:11 2006//
+/bsp0hwinit.c/1.8/Sat Mar 31 20:50:10 2007//
+/bspbase.h/1.5/Wed Nov 22 19:32:16 2006//
+/i2c.c/1.1/Sun Jan 15 21:14:05 2006//
+D
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Repository b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Repository
new file mode 100644 (file)
index 0000000..815b033
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ulad21/libs/bspbase
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Root b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile.omk b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/Makefile.omk
new file mode 100644 (file)
index 0000000..3892241
--- /dev/null
@@ -0,0 +1,15 @@
+# -*- makefile -*-
+
+default_CONFIG += CONFIG_MISC_VECT=x
+default_CONFIG += CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT=x
+default_CONFIG += CONFIG_ULAN=x
+
+LOCAL_CONFIG_H = local_config.h
+
+INCLUDES += -I . 
+
+include_HEADERS =  bspbase.h
+
+lib_LIBRARIES = bspbase
+
+bspbase_SOURCES = bsp0hwinit.c i2c.c
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/bsp0hwinit.c b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/bsp0hwinit.c
new file mode 100644 (file)
index 0000000..5f01585
--- /dev/null
@@ -0,0 +1,52 @@
+#include <bspbase.h>
+#include <local_config.h>
+#ifdef CONFIG_MISC_VECT
+ #include <vect.h>
+#endif
+#ifdef CONFIG_ULAN
+ #include <ul_lib/ulan.h>
+#endif
+
+/* timers */
+lt_ticks_t DATA sys_timer_ticks;
+
+/****************************************************************************/
+//definice pruseni (casovac0)
+void timer(void) 
+#ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+ interrupt 
+ #ifndef CONFIG_MISC_VECT
+  1 
+ #endif
+#endif
+{
+  TH0=HZ2TMODE1H(SYS_TIMER_HZ);                        //nastav casovac0
+  TL0=HZ2TMODE1L(SYS_TIMER_HZ);      
+
+  sys_timer_ticks++;
+}
+
+/****************************************************************************/
+void setup_board(void) 
+{
+  sys_timer_ticks=0;
+  P3=0xff;P1=0xff;
+ #ifdef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+  MCON|=1;                                     //XDATA memory map to 0x8400
+ #endif
+  TMOD=0x21;                                    //citac0-16bitovy,1-8bitovy(reload)
+  TH0=HZ2TMODE1H(SYS_TIMER_HZ);                        //nastav casovac0
+  TL0=HZ2TMODE1L(SYS_TIMER_HZ);      
+  TCON=0x10;                                    //nul. priz. casov0,1;spust casov0
+ #ifdef CONFIG_MISC_VECT
+  vec_set(timer,IADDR_TIMER0);
+ #endif
+ #ifndef CONFIG_BSPTIMERFNC_WITHOUT_INTERRUPT
+  ET0=1;                                        //povol preruseni casov0  
+ #endif
+ #ifdef WATCHDOG_ENABLED
+  WATCHDOG_ON();
+  WATCHDOG_SET_MS(1000); //1s
+  WATCHDOG_REFRESH();
+ #endif
+}
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/bspbase.h b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/bspbase.h
new file mode 100644 (file)
index 0000000..eef520f
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _BSPBASE_H
+#define _BSPBASE_H
+
+#include <types.h>
+#include <system_def.h>
+#include <cpu_def.h>
+#include <lt_timer_types.h>
+
+//timers
+extern lt_ticks_t DATA sys_timer_ticks;
+
+#define get_sys_timer_ticks() sys_timer_ticks
+
+void setup_board(void);
+
+#endif /* _BSPBASE_H */
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/bspbase/i2c.c b/ulan/embedded/board/mcs51/ulad21/libs/bspbase/i2c.c
new file mode 100644 (file)
index 0000000..fe1fa0c
--- /dev/null
@@ -0,0 +1,134 @@
+#include <stdio.h>
+#include <system_def.h>
+#include <periph/i2c.h>
+#ifdef __KEIL__
+#include <intrins.h>
+#endif /*__KEIL__*/
+void i2c_init( void) {
+  SDAO = 1; SDAI = 1; SCL = 1;
+}
+/***************************************************************************/
+
+void i2c_wait(void) {
+ #ifdef __KEIL__
+     _nop_();
+     _nop_();
+     _nop_();
+     _nop_();
+     _nop_();
+ #elif SDCC
+  _asm
+     nop;
+     nop;
+     nop;
+     nop;
+     nop;
+  _endasm;
+ #else
+   #error "unsuported compiler!"
+ #endif
+}
+#define i2c_DELAY i2c_wait()
+
+/***************************************************************************/
+void i2c_start( void) {
+  SDAO = 0;
+  i2c_DELAY;
+  SCL = 0;
+  i2c_DELAY;
+}
+/***************************************************************************/
+char i2c_stop( void) {
+  SDAO = 0;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  SDAO = 1;
+  return SDAI;
+}
+/***************************************************************************/
+char i2c_outbyte( unsigned char byte) {
+  unsigned char b=8;
+  bit ack = 1;
+  
+  while(b--) {
+    SDAO = (byte & 0x80) ? 1 : 0;
+    byte<<= 1;
+    i2c_DELAY;
+    SCL = 1;
+    i2c_DELAY;
+    SCL = 0;
+  }
+  i2c_DELAY;
+  SDAO = 1;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  ack = SDAI;
+  SCL = 0;
+//  SDAO = 0;
+  return ack; /* if ack == 0 then OK */
+}
+/***************************************************************************/
+char i2c_inbyte( unsigned char *byte, bit last) {
+  unsigned char b = 8;
+  unsigned char out = 0;
+  bit ack = 1;
+  
+  while(b--) {
+    SDAO = 1;
+    i2c_DELAY;
+    SCL = 1;
+    i2c_DELAY;
+    out <<= 1;
+    out |= SDAI ? 1 : 0;
+    SCL = 0;
+  }
+  SDAO = last;
+  i2c_DELAY;
+  SCL = 1;
+  i2c_DELAY;
+  ack = SDAI;
+  SCL = 0;
+//  SDAO = 0;
+  if ( ack == last) *byte = out;
+  return ack;
+}
+/***************************************************************************/
+/***************************************************************************/
+/***************************************************************************/
+char i2c_write( unsigned char adr, unsigned char *bytes, unsigned char cnt) {
+  i2c_start();
+  if ( i2c_outbyte( adr)) {
+    i2c_stop();
+//    printf("iA%02X",adr);
+    return 0;
+  }
+  while(cnt) {
+    if ( i2c_outbyte( *bytes++)) {
+      i2c_stop();
+//      printf("iW%02X(%02X)",adr,*(bytes-1));
+      return 0;
+    }
+    cnt--;
+  }
+  i2c_stop(); /* return bit */
+  return 1;
+}
+/***************************************************************************/
+char i2c_read( unsigned char adr, unsigned char *bytes, unsigned char cnt) {
+  i2c_start();
+  if ( i2c_outbyte( adr)) {
+    i2c_stop();
+//    printf("ia%02X",adr);
+    return 0;
+  }
+  while(cnt) {
+    i2c_inbyte( bytes++, cnt==1); /* check line */
+    cnt--;
+  }
+  i2c_stop(); /* check stop */
+  return 1;
+}
+
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-boot b/ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-boot
new file mode 100644 (file)
index 0000000..91fcaaf
--- /dev/null
@@ -0,0 +1,19 @@
+BOOT_BASE = 0x0080
+BOOT_SIZE = 0x2580
+KVPB_BASE = 0x2600
+KVPB_SIZE = 0x0100
+PROG_BASE = 0x2800
+PROG_SIZE = 0x5800
+
+XRAM   = 0x8480
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(BOOT_BASE)
+DATA   = 0x10
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK) \
+--data-loc $(DATA) 
diff --git a/ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-flash b/ulan/embedded/board/mcs51/ulad21/libs/ulad21.ld-flash
new file mode 100644 (file)
index 0000000..ef89107
--- /dev/null
@@ -0,0 +1,17 @@
+BOOT_BASE = 0x0080
+BOOT_SIZE = 0x2580
+KVPB_BASE = 0x2600
+KVPB_SIZE = 0x0100
+PROG_BASE = 0x2800
+PROG_SIZE = 0x5800
+
+XRAM   = 0x8480
+STACK  = 0xC0
+IDATA  = 0x80
+CODE   = $(PROG_BASE)
+
+LDFLAGS += \
+--xram-loc $(XRAM) \
+--code-loc $(CODE) \
+--idata-loc $(IDATA) \
+--stack-loc $(STACK)
diff --git a/ulan/embedded/board/mcs51/ulad21/periph/CVS/Entries b/ulan/embedded/board/mcs51/ulad21/periph/CVS/Entries
new file mode 100644 (file)
index 0000000..4d04412
--- /dev/null
@@ -0,0 +1,2 @@
+/i2c.h/1.1/Mon Oct  3 12:43:27 2005//
+D
diff --git a/ulan/embedded/board/mcs51/ulad21/periph/CVS/Repository b/ulan/embedded/board/mcs51/ulad21/periph/CVS/Repository
new file mode 100644 (file)
index 0000000..cecff6f
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/board/mcs51/ulad21/periph
diff --git a/ulan/embedded/board/mcs51/ulad21/periph/CVS/Root b/ulan/embedded/board/mcs51/ulad21/periph/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/board/mcs51/ulad21/periph/i2c.h b/ulan/embedded/board/mcs51/ulad21/periph/i2c.h
new file mode 100644 (file)
index 0000000..d0f89c3
--- /dev/null
@@ -0,0 +1,12 @@
+#if !defined(__I2C_H)
+#define __I2C_H
+
+void i2c_init( void);
+char i2c_write( unsigned char adr, unsigned char *bytes, unsigned char cnt);
+char i2c_read( unsigned char adr, unsigned char *bytes, unsigned char cnt);
+
+#define I2C_Write i2c_write
+#define I2C_Read  i2c_read
+
+#endif
+
diff --git a/ulan/embedded/board/mcs51/ulad21/system_def.h b/ulan/embedded/board/mcs51/ulad21/system_def.h
new file mode 100644 (file)
index 0000000..aef9ba6
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def.h - common cover for definition of hardware adresses,
+                 registers, timing and other hardware dependant
+                parts of embedded hardware
+  Copyright (C) 2001 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_H_
+#define _SYSTEM_DEF_H_
+
+#include <types.h>
+
+#define WITH_SFI_SEL
+
+#define VER_CODE(major,minor,patch) (major*0x10000+minor*0x100+patch)
+/* Software version */
+#define SW_VER_ID      "MSC51_UC"
+#define SW_VER_MAJOR   0
+#define SW_VER_MINOR   1
+#define SW_VER_PATCH   0
+#define SW_VER_CODE    VER_CODE(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
+/* Hardware version */
+#define HW_VER_ID      "MSC51_UC"
+#define HW_VER_MAJOR   1
+#define HW_VER_MINOR   0
+#define HW_VER_PATCH   0
+#define HW_VER_CODE    VER_CODE(HW_VER_MAJOR,HW_VER_MINOR,HW_VER_PATCH)
+/* Version of mechanical  */
+#define MECH_VER_ID     "MSC51_UC"
+#define MECH_VER_MAJOR  0
+#define MECH_VER_MINOR  0
+#define MECH_VER_PATCH  0
+#define MECH_VER_CODE  VER_CODE(MECH_VER_MAJOR,MECH_VER_MINOR,MECH_VER_PATCH)
+
+//#include <system_def_jt_usb1.h>
+#include <system_def_msc51_uc1.h>
+//#include <system_def_msc51_u2u_ps1.h>
+//#include <system_def_hisc.h>
+
+#endif /* _SYSTEM_DEF_H_ */
diff --git a/ulan/embedded/board/mcs51/ulad21/system_def_msc51_uc1.h b/ulan/embedded/board/mcs51/ulad21/system_def_msc51_uc1.h
new file mode 100644 (file)
index 0000000..2a26360
--- /dev/null
@@ -0,0 +1,98 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  system_def_jt_usb1.h - definition of hardware adresses and registers
+                      of the second prototype version of syringe
+                      infussion pump
+  Copyright (C) 2002 by Pavel Pisa pisa@cmp.felk.cvut.cz
+            (C) 2002 by PiKRON Ltd. http://www.pikron.com
+
+ *******************************************************************/
+
+#ifndef _SYSTEM_DEF_HW01_H_
+#define _SYSTEM_DEF_HW01_H_
+
+#include <mcu_regs.h>
+#include <bspbase.h>
+
+#define CPU_SYS_HZ 18432100l
+
+#define BAUD2BAUDDIV(baud) \
+       ((CPU_SYS_HZ+12*8l*baud)/(12*16l*baud))
+
+#define HZ2TMODE1H(x) \
+        (0x100-((CPU_SYS_HZ/12/x) / 256))
+#define HZ2TMODE1L(x) \
+        (0x100-((CPU_SYS_HZ/12/x) % 256))
+
+#define ES_U ES1
+
+#define SYS_TIMER_HZ    100               //1000Hz pro casovac
+
+//volatile unsigned long msec_time;
+
+#if 1 /* special for PDIUSBD11 */
+#define PDIUSB_READ_DATA_ADDR   (0x35)
+#define PDIUSB_WRITE_DATA_ADDR  (0x34)
+#define PDIUSB_COMMAND_ADDR     (0x36)
+
+#ifdef SDCC
+ sbit at 0xB4 SCL;          // P3.4
+ sbit at 0x90 SDAI;         // P1.0
+ sbit at 0x91 SDAO;         // P1.1
+
+ sbit at 0xB2 IPDI;         // P3.2
+ sbit at 0xB3 LEDTX;        // P3.3
+ sbit at 0xB3 LEDRX;        // P3.3
+ sbit at 0xB3 LED_GP;
+ sbit at 0xB3 LED_ERR;
+#else
+ sbit  SCL  = P3^4;
+ sbit  SDAI = P1^0;
+ sbit  SDAO = P1^1;
+
+ sbit  IPDI  = P3^2;
+ sbit  LEDRX  = P3^3;
+ sbit  LEDTX  = P3^3; 
+
+ sbit  LED_GP  = P3^3; 
+ sbit  LED_ERR = P3^3; 
+#endif /*SDCC*/
+
+/***************************************************************************/
+/* io functions */
+#define IN_PORT                        P0
+#define LED_PORT               P3
+#define OUT_PORT               P0
+
+
+#define GET_IN_PIN(port,in)    ((port & in)?1:0)
+#define SET_OUT_PIN(port,out)   out=1;
+#define CLR_OUT_PIN(port,out)   out=0;
+
+
+/* P1.0 .. DACK_N/DMACK0, P7.0 .. DMREQ/DREQ0, P7.2 .. EOT_N/TEND0 */
+//#define ISR_USB_INTV         EXCPTVEC_IRQ6   /* pin IRQ6 on PG.0 */
+#undef  PDIUSB_WITH_ADD_IRQ_HANDLER
+#undef PDIUSB_WITH_EXCPTVECT_SET
+#define PDIUSB_SUPPORT_ENABLED
+#endif 
+
+/* IRAM 16 kB of on-chip memory */
+/* 0xffb000-0xffcfff .. 8 kB free */
+/* 0xffd000-0xffdfff .. 4 kB for Flash emulation */
+/* 0xffe000-0xffffc0 .. 4 kB - 64 B free*/
+/* 0xffffc0-0xffffff .. 64 B free*/
+/*
+#define IRAM_START    (volatile __u8 * const)(0xffb000)
+#define IRAM_START1   (volatile __u8 * const)(0xffe000)
+#define FRAM_START    (volatile __u8 * const)(0xffffc0)
+*/
+
+#define KVPB_MINIMALIZED
+#define KVPB_DEFAULT_FLAGS KVPB_DESC_DOUBLE
+
+#endif /* _SYSTEM_DEF_HW01_H_ */
diff --git a/ulan/embedded/libs4c/CVS/Entries b/ulan/embedded/libs4c/CVS/Entries
new file mode 100644 (file)
index 0000000..0053644
--- /dev/null
@@ -0,0 +1,7 @@
+/Makefile/1.1/Mon Oct  3 12:43:27 2005//
+/Makefile.omk/1.3/Sun Jan 20 07:56:06 2008//
+D/i2c////
+D/kbd////
+D/keyval////
+D/ulan////
+D/usb////
diff --git a/ulan/embedded/libs4c/CVS/Repository b/ulan/embedded/libs4c/CVS/Repository
new file mode 100644 (file)
index 0000000..9ffd882
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c
diff --git a/ulan/embedded/libs4c/CVS/Root b/ulan/embedded/libs4c/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/Makefile b/ulan/embedded/libs4c/Makefile
new file mode 100644 (file)
index 0000000..bdb6d45
--- /dev/null
@@ -0,0 +1,15 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
+# DO NOT DELETE
diff --git a/ulan/embedded/libs4c/Makefile.omk b/ulan/embedded/libs4c/Makefile.omk
new file mode 100644 (file)
index 0000000..1e16966
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = keyval ulan usb kbd i2c
\ No newline at end of file
diff --git a/ulan/embedded/libs4c/i2c/CVS/Entries b/ulan/embedded/libs4c/i2c/CVS/Entries
new file mode 100644 (file)
index 0000000..3f9a06a
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Sun Jan 20 07:56:06 2008//
+/Makefile.omk/1.1/Sun Jan 20 07:56:06 2008//
+/i2c_c552.c/1.2/Mon Jan 21 00:08:02 2008//
+/i2c_drv.c/1.2/Mon Jan 21 00:08:02 2008//
+/i2c_drv.h/1.2/Mon Jan 21 00:08:02 2008//
+D
diff --git a/ulan/embedded/libs4c/i2c/CVS/Repository b/ulan/embedded/libs4c/i2c/CVS/Repository
new file mode 100644 (file)
index 0000000..9d48152
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/i2c
diff --git a/ulan/embedded/libs4c/i2c/CVS/Root b/ulan/embedded/libs4c/i2c/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/i2c/Makefile b/ulan/embedded/libs4c/i2c/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/i2c/Makefile.omk b/ulan/embedded/libs4c/i2c/Makefile.omk
new file mode 100644 (file)
index 0000000..f58b859
--- /dev/null
@@ -0,0 +1,19 @@
+# -*- makefile -*-
+
+default_CONFIG  = CONFIG_OC_I2C_DRV_SYSLESS=n
+default_CONFIG += CONFIG_OC_I2C_CHIP_C552=y
+
+LOCAL_CONFIG_H = i2c_drv_config.h
+
+INCLUDES += -I . 
+
+ifeq ($(CONFIG_OC_I2C_DRV_SYSLESS),y) 
+lib_LIBRARIES = i2c_drv
+include_HEADERS += i2c_drv.h
+i2c_drv_SOURCES += i2c_drv.c
+
+ifeq ($(CONFIG_OC_I2C_CHIP_C552),y) 
+i2c_drv_SOURCES += i2c_c552.c 
+endif #CONFIG_OC_I2C_CHIP_C552
+
+endif #CONFIG_OC_I2C_DRV_SYSLESS
diff --git a/ulan/embedded/libs4c/i2c/i2c_c552.c b/ulan/embedded/libs4c/i2c/i2c_c552.c
new file mode 100644 (file)
index 0000000..56837d0
--- /dev/null
@@ -0,0 +1,396 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  i2c_mx1.c - I2C communication automata for M9328 MX1 microcontroller
+  Copyright holders and project originators
+    (C) 2001-2008 by Pavel Pisa pisa@cmp.felk.cvut.cz
+    (C) 2002-2008 by PiKRON Ltd. http://www.pikron.com
+    (C) 2007-2008 by Petr Smolik
+
+ The COLAMI components can be used and copied under next licenses
+   - MPL - Mozilla Public License
+   - GPL - GNU Public License
+   - LGPL - Lesser GNU Public License
+   - and other licenses added by project originators
+ Code can be modified and re-distributed under any combination
+ of the above listed licenses. If contributor does not agree with
+ some of the licenses, he can delete appropriate line.
+ Warning, if you delete all lines, you are not allowed to
+ distribute code or build project.
+ *******************************************************************/
+
+
+#include <system_def.h>
+#include <hal_intr.h>
+#include "i2c_drv_config.h"
+#include "i2c_drv.h"
+
+int c552_poll(i2c_drv_t *drv);
+void c552_irq_handler(int intno, void *dev_id);
+static int c552_ctrl_fnc(struct i2c_drv *drv, int ctrl, void *p);
+
+// I2C Registers
+#define C552_CONSET(port)  (((i2cRegs_t *)(port))->conset)     /* Control Set Register */
+#define C552_STAT(port)    (((i2cRegs_t *)(port))->stat)       /* Status Register */
+#define C552_DAT(port)     (((i2cRegs_t *)(port))->dat)        /* Data Register */
+#define C552_ADR(port)     (((i2cRegs_t *)(port))->adr)        /* Slave Address Register */
+#define C552_SCLH(port)    (((i2cRegs_t *)(port))->sclh)       /* SCL Duty Cycle Register (high half word) */
+#define C552_SCLL(port)    (((i2cRegs_t *)(port))->scll)       /* SCL Duty Cycle Register (low half word) */
+#define C552_CONCLR(port)  (((i2cRegs_t *)(port))->conclr)     /* Control Clear Register */
+
+#define C552CON_AA     (1 << 2)
+#define C552CON_SI     (1 << 3)
+#define C552CON_STO    (1 << 4)
+#define C552CON_STA    (1 << 5)
+#define C552CON_EN     (1 << 6)
+
+#define C552CON_AAC    (1 << 2)
+#define C552CON_SIC    (1 << 3)
+#define C552CON_STAC   (1 << 5)
+#define C552CON_ENC    (1 << 6)
+
+/***************************************************************************/
+int c552_init_start(struct i2c_drv *drv, int port, int irq, int bitrate, int sladr)
+{
+  C552_ADR(port)=sladr;
+  C552_SCLH(port)=((PCLK/2)/bitrate); //minimal value
+  C552_SCLL(port)=((PCLK/2)/bitrate);
+  drv->irq=irq;
+  drv->port=port;
+  drv->sfnc_act=NULL;
+  drv->ctrl_fnc=c552_ctrl_fnc;
+  drv->poll_fnc=c552_poll;
+  drv->flags=I2C_DRV_ON;    /* todo - use atomic operation */
+  C552_CONCLR(port)=0x6C;   /* clearing all flags */
+  C552_CONSET(port)=C552CON_EN;
+  HAL_INTERRUPT_ATTACH(irq,c552_irq_handler,drv);  
+  HAL_INTERRUPT_UNMASK(irq);
+  return 0;
+}
+
+static int c552_sfnc_ms_end(struct i2c_drv *drv);
+static inline i2c_msg_head_t *c552_sfnc_sl_prep(struct i2c_drv *drv, int cmd, int rxtx);
+
+/***************************************************************************/
+static int c552_sfnc_ms_end(struct i2c_drv *drv)
+{
+  i2c_msg_head_t *msg=drv->msg_act;
+
+  if(msg) {
+    if((msg->flags&I2C_MSG_CB_END) && (msg->callback))
+      msg->callback(drv,I2C_MSG_CB_END,msg);
+    if(msg->flags&I2C_MSG_REPEAT){
+      drv->master_queue=msg->next;
+    }else{
+      i2c_drv_queue_msg(msg->flags&I2C_MSG_NOPROC?NULL:&drv->proc_queue,msg);
+    }
+    msg->flags|=I2C_MSG_FINISHED;
+  }
+
+  if(drv->master_queue) {
+    /* there is some more work for master*/
+    /* We need to request start of the next transfer somewhere */
+    C552_CONSET(drv->port)=C552CON_STA;
+  } else {
+    drv->flags&=~I2C_DRV_MS_INPR;
+  }
+
+  drv->msg_act = NULL;
+  return 0;
+}
+
+static inline
+i2c_msg_head_t *c552_sfnc_sl_prep(struct i2c_drv *drv, int cmd, int rxtx)
+{
+  i2c_msg_head_t *msg=drv->slave_queue;
+  if(!msg) do {
+    if((msg->flags&rxtx) && !((cmd^msg->sl_cmd)&msg->sl_msk)){
+      drv->slave_queue=msg;
+      if((msg->flags&I2C_MSG_CB_START) && (msg->callback))
+        msg->callback(drv,I2C_MSG_CB_START|rxtx,msg);
+      return msg;
+    }
+  } while((msg=msg->next)!=drv->slave_queue);
+  return NULL;
+}
+
+/***************************************************************************/
+static int c552_ctrl_fnc(struct i2c_drv *drv, int ctrl, void *p)
+{
+  unsigned long saveif;
+  switch(ctrl){
+    case I2C_CTRL_MS_RQ:
+      if(!(drv->flags&I2C_DRV_ON))
+        return -1;
+      if(!drv->master_queue)
+        return 0;
+      save_and_cli(saveif);
+      if(!(drv->flags&I2C_DRV_MS_INPR)) {
+        drv->flags|=I2C_DRV_MS_INPR;
+       drv->flags&=~I2C_DRV_NA;
+        C552_CONSET(drv->port)=C552CON_STA;
+      }
+      restore_flags(saveif);
+      return 0;
+    default:
+      return -1;
+  }
+  return 0;
+}
+
+/***************************************************************************/
+int c552_poll(i2c_drv_t *drv)
+{
+  i2c_msg_head_t *msg;
+
+  if((msg=drv->proc_queue)!=NULL){
+    i2c_drv_queue_msg(NULL,msg);
+    if((msg->flags&I2C_MSG_CB_PROC) && (msg->callback))
+      msg->callback(drv,I2C_MSG_CB_PROC,msg);
+  }  
+  return 0;
+}
+
+int i2c_irq_seq_num=0;
+
+/***************************************************************************/
+void c552_irq_handler(int intno, void *dev_id)
+{
+  i2c_drv_t *drv;
+  i2c_msg_head_t *msg;
+  int port;
+  int stat;
+
+  drv=(i2c_drv_t*)dev_id;
+  if(drv->magic!=I2C_DRV_MAGIC)
+  {
+    #ifdef FOR_LINUX_KERNEL
+     panic("i2c_irq_handler : BAD drv magic !!!");
+    #elif defined(_WIN32)
+     I2C_PRINTF("i2c_irq_handler : BAD drv magic !!!\n");
+     return FALSE;
+    #elif defined(__DJGPP__)||defined(CONFIG_OC_I2C_DRV_SYSLESS)
+     I2C_PRINTF("i2c_irq_handler : BAD drv magic !!!\n");
+     return;
+    #else
+     error("i2c_irq_handler : BAD drv magic !!!");
+    #endif
+  }
+  drv->flags&=~I2C_DRV_NA;
+
+  port=drv->port;  
+  msg=drv->msg_act;
+
+  stat=C552_STAT(port);
+
+  switch(stat) {
+    case 0x00: 
+      /* Bus Error has occured */ 
+      drv->msg_act=NULL;
+      C552_CONSET(port)=C552CON_STO;
+      if(drv->master_queue) {
+        /* there is some work for master*/
+        C552_CONSET(port)=C552CON_STA;
+      }
+      break;
+    case 0x08: /* MS_STA */
+      /* the initial start condition has been sent */
+      if(!drv->master_queue) {
+        C552_CONCLR(port)=C552CON_STAC;
+        C552_CONSET(port)=C552CON_STO;
+       drv->msg_act=NULL;
+       break;
+      }
+      C552_CONCLR(port)=C552CON_STAC;
+      C552_CONSET(port)=C552CON_AA;
+
+      msg=drv->master_queue;
+      drv->msg_act=msg;
+      msg->tx_len=msg->rx_len=0;
+
+      if((msg->flags&I2C_MSG_CB_START) && (msg->callback))
+        msg->callback(drv,I2C_MSG_CB_START,msg);
+
+      if (msg->flags&I2C_MSG_MS_TX) {
+        /* proceed Tx request first */
+        C552_DAT(port) = msg->addr&~1;
+       break;
+      }
+      /* if there is no request for transmit, continue by Rx immediately */
+    case 0x10: /* MS_REPS */
+      /* the repeated start has been successfully sent, continue by Rx */
+      C552_CONCLR(port)=C552CON_STAC;
+      C552_CONSET(port)=C552CON_AA;
+      C552_DAT(port) = msg->addr|1;
+      if (!msg || !(msg->flags&I2C_MSG_MS_RX)) {
+        /* there are no data to be received */
+        C552_CONSET(port)=C552CON_STO;
+        c552_sfnc_ms_end(drv);
+      } else {
+        msg->rx_len=0;
+      }
+      break;
+    case 0x18:
+      /* sent SLA W received ACK */
+    case 0x28:
+      /* sent DATA received ACK */
+      if (msg->tx_len<msg->tx_rq) {
+        C552_DAT(port) = msg->tx_buf[msg->tx_len];
+        msg->tx_len++;
+        break;
+      }
+      /* all data has been sent */
+      if (!(msg->flags&I2C_MSG_MS_RX)) {
+        C552_CONSET(port)=C552CON_STO;
+        c552_sfnc_ms_end(drv);
+      } else {
+        C552_CONSET(port)=C552CON_STA;
+      }
+      break;
+    case 0x30:
+      /* sent DATA received NACK */
+    case 0x48:
+      /* sent SLA R received ACK */
+    case 0x20:
+      /* vyslano SLA W prijato NACK */
+      C552_CONSET(port)=C552CON_STO;
+      msg->flags|=I2C_MSG_FAIL;
+      c552_sfnc_ms_end(drv);
+      break;
+    case 0x38:
+      /* arbitration lost during Tx */
+      C552_CONSET(port)=C552CON_STA;
+      break;
+    case 0x40:
+      /* sent SLA R received ACK */
+      if (msg->rx_rq==1)
+        C552_CONCLR(port)=C552CON_AAC;
+      break;
+    case 0x50:
+      /* received DATA sent ACK */   
+      msg->rx_buf[msg->rx_len]= C552_DAT(port);
+      msg->rx_len++;
+      if (msg->rx_rq==msg->rx_len)
+        C552_CONCLR(port)=C552CON_AAC;
+      break;
+    case 0x58:
+      /* received DATA sent NACK */   
+      msg->rx_buf[msg->rx_len]= C552_DAT(port);
+      msg->rx_len++;
+      C552_CONSET(port)=C552CON_STO;
+      c552_sfnc_ms_end(drv);
+      break;
+
+    /*** slave mode ***/
+
+    case 0x68:
+      /* received own SLA W sent ACK after arbitration lost */
+
+    case 0x78:
+      /* received Generall CALL sent ACK after arbitration lost */
+      C552_CONSET(port)=C552CON_STA;
+
+    case 0x60:
+      /* received own SLA W sent ACK */
+
+    case 0x70:
+      /* received Generall CALL sent ACK */
+      if(!drv->slave_queue) {
+        C552_CONCLR(port)=C552CON_AAC;
+       break;
+      }
+      C552_CONSET(port)=C552CON_AA;
+      drv->flags|=I2C_DRV_SL_CEXP|I2C_DRV_SL_INRX;
+      break;
+
+    case 0x80:
+      /* SLA W : received DATA sent ACK */
+
+    case 0x90:
+      /* GCall : received DATA sent ACK */
+
+      if(drv->flags&I2C_DRV_SL_CEXP){
+        drv->flags&=~I2C_DRV_SL_CEXP;
+       drv->sl_last_cmd=C552_DAT(port);
+       msg=c552_sfnc_sl_prep(drv, drv->sl_last_cmd, I2C_MSG_SL_RX);
+        drv->msg_act=msg;
+      }
+      if(!msg || (msg->rx_len>=msg->rx_rq)){
+        C552_CONCLR(port)=C552CON_AAC;
+       break;
+      }
+      msg->rx_buf[msg->rx_len]= C552_DAT(port);
+      msg->rx_len++;
+      break;
+
+    case 0x88:
+      /* SLA W : received DATA sent NACK */
+      /* may it be, the handling should fall into A0 state */
+
+    case 0x98:
+      /* GCall : received DATA sent NACK */
+      /* may it be, the handling should fall into A0 state */
+
+      C552_CONSET(port)=C552CON_AA;
+      break;
+
+    case 0xA0:
+      /* Slave : Repeated START or STOP */
+      if(msg && (msg->flags&I2C_MSG_CB_END) && (msg->callback)) {
+        int cbcode;
+       if(drv->flags&I2C_DRV_SL_INRX)
+          cbcode=I2C_MSG_CB_END|I2C_MSG_SL_RX;
+       else
+          cbcode=I2C_MSG_CB_END|I2C_MSG_SL_TX;
+        msg->callback(drv,cbcode,msg);
+      }
+      C552_CONSET(port)=C552CON_AA;
+      break;
+
+    case 0xB0:
+      /* received own SLA R sent ACK  after arbitration lost */
+      C552_CONSET(port)=C552CON_STA;
+
+    case 0xA8:
+      /* received own SLA R sent ACK */
+      drv->flags&=~I2C_DRV_SL_INRX;
+      msg=c552_sfnc_sl_prep(drv, drv->sl_last_cmd, I2C_MSG_SL_RX);
+      drv->msg_act=msg;
+      if(!msg) {
+        C552_CONCLR(port)=C552CON_AAC;
+       break;
+      }
+      C552_CONSET(port)=C552CON_AA;
+
+    case 0xB8:
+      /* SLA R : sent DATA received ACK */
+      if(!msg || (msg->tx_len>=msg->tx_rq)){
+        C552_DAT(port) = 0xff;
+       break;
+      }
+      C552_DAT(port) = msg->tx_buf[msg->tx_len];
+      msg->tx_len++;
+      break;
+
+    case 0xC0:
+      /* SLA R : sent DATA received NACK */
+      /* the A0 state is not enerred most probably */
+
+    case 0xC8:
+      /* SLA R : last data sent, DATA (AA=0) received ACK */
+      /* the A0 state is not enerred most probably */
+      C552_CONSET(port)=C552CON_AA;
+
+      if(msg && (msg->flags&I2C_MSG_CB_END) && (msg->callback)) {
+        msg->callback(drv,I2C_MSG_CB_END|I2C_MSG_SL_TX,msg);
+      }
+      break;
+
+    default: break;
+  }
+
+  /* vymaz SI bit */
+  C552_CONCLR(port)=C552CON_SIC;
+}
diff --git a/ulan/embedded/libs4c/i2c/i2c_drv.c b/ulan/embedded/libs4c/i2c/i2c_drv.c
new file mode 100644 (file)
index 0000000..3a2f12a
--- /dev/null
@@ -0,0 +1,182 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  i2c_mx1.c - I2C communication automata for M9328 MX1 microcontroller
+  Copyright holders and project originators
+    (C) 2001-2004 by Pavel Pisa pisa@cmp.felk.cvut.cz
+    (C) 2002-2004 by PiKRON Ltd. http://www.pikron.com
+    (C) 2007-2008 by Petr Smolik
+
+ The COLAMI components can be used and copied under next licenses
+   - MPL - Mozilla Public License
+   - GPL - GNU Public License
+   - LGPL - Lesser GNU Public License
+   - and other licenses added by project originators
+ Code can be modified and re-distributed under any combination
+ of the above listed licenses. If contributor does not agree with
+ some of the licenses, he can delete appropriate line.
+ Warning, if you delete all lines, you are not allowed to
+ distribute code or build project.
+ *******************************************************************/
+
+
+#include <system_def.h>
+#include <string.h>
+#include "i2c_drv_config.h"
+#include "i2c_drv.h"
+
+/***************************************************************************/
+int  
+i2c_drv_init(i2c_drv_t *drv, int port, int irq, int bitrate,int sladr) 
+{
+  int r=-1;
+  memset(drv,0,sizeof(i2c_drv_t));
+  drv->magic=I2C_DRV_MAGIC;
+ #ifdef CONFIG_OC_I2C_CHIP_C552
+  r=c552_init_start(drv,port,irq,bitrate,sladr);
+ #endif /* CONFIG_OC_I2C_CHIP_C552 */
+  if (r<0) return r;
+  return 0;
+}
+
+/********************************************************************/
+/* Generic I2C functions */
+
+void i2c_drv_queue_msg(i2c_msg_head_t **queue, i2c_msg_head_t *msg)
+{
+  I2C_IRQ_LOCK_FINI
+  i2c_msg_head_t *prev, *next;
+  I2C_IRQ_LOCK;
+  if(msg->on_queue){
+    if(msg->next==msg){
+      if(*msg->on_queue==msg)
+        *msg->on_queue=NULL;
+    }else{
+      msg->next->prev=msg->prev;
+      msg->prev->next=msg->next;
+      if(*msg->on_queue==msg)
+        *msg->on_queue=msg->next;
+    }
+  }
+  if((msg->on_queue=queue)!=NULL){
+    if((next=*queue)!=NULL){
+      msg->prev=prev=next->prev;
+      msg->next=next;
+      next->prev=msg;
+      prev->next=msg;
+    }else{
+      *queue=msg->prev=msg->next=msg;
+    }
+  }
+  I2C_IRQ_UNLOCK;
+  return;
+}
+
+int i2c_drv_master_msg_ins(i2c_drv_t *drv, i2c_msg_head_t *msg)
+{
+  if(!drv) return -1;
+  if(!(drv->flags&I2C_DRV_ON)) return -1;
+  if(!msg->tx_buf) msg->flags&=~I2C_MSG_MS_TX;
+  if(!msg->rx_buf) msg->flags&=~I2C_MSG_MS_RX;
+  i2c_drv_queue_msg(&drv->master_queue,msg);
+  drv->ctrl_fnc(drv,I2C_CTRL_MS_RQ,NULL);
+  return 0;
+}
+
+int i2c_drv_master_msg_rem(i2c_drv_t *drv, i2c_msg_head_t *msg)
+{
+  int act;
+  I2C_IRQ_LOCK_FINI
+  do {
+    i2c_drv_queue_msg(NULL,msg);
+    I2C_IRQ_LOCK;
+    act = (msg==drv->msg_act);
+    if(act) {
+      drv->msg_act=NULL;
+    }
+    I2C_IRQ_UNLOCK;    
+  } while(msg->on_queue || act);
+  return 0;
+}
+
+int i2c_drv_flush_all(i2c_drv_t *drv)
+{
+  I2C_IRQ_LOCK_FINI
+  i2c_msg_head_t *msg, *next;
+  i2c_msg_head_t *queue[3];
+  int quenum;
+
+  I2C_IRQ_LOCK;
+    queue[0]=drv->master_queue;
+    queue[1]=drv->slave_queue;
+    queue[2]=drv->proc_queue;
+    drv->master_queue=NULL;
+    drv->slave_queue=NULL;
+    drv->proc_queue=NULL;
+    drv->msg_act=NULL;
+  I2C_IRQ_UNLOCK;    
+  for(quenum=0;quenum<3;quenum++){
+    msg=queue[quenum];
+    if(!msg) continue;
+    msg->prev->next=NULL;
+    for(;msg;msg=next){
+      next=msg->next;
+      msg->flags|=I2C_MSG_FAIL;
+      msg->on_queue=NULL;
+      if((msg->flags&I2C_MSG_CB_PROC) && (msg->callback))
+       msg->callback(drv,I2C_MSG_CB_PROC,msg);
+    }
+  }
+  return 0;
+}
+
+int i2c_drv_master_transfer_callback(struct i2c_drv *drv, int code, struct i2c_msg_head *msg)
+{
+  if(code!=I2C_MSG_CB_PROC) return 0;
+  set_bit(0,&(msg->private));
+  return 0;
+}
+
+
+int i2c_drv_master_transfer(i2c_drv_t *drv, int addr, int tx_rq, int rx_rq,
+                   void *tx_buf, void *rx_buf, int *ptx_len, int *prx_len)
+{
+  i2c_msg_head_t msg;
+  
+  msg.flags = I2C_MSG_CB_PROC;
+  msg.addr = addr;
+  msg.tx_rq = tx_rq;
+  msg.rx_rq = rx_rq;
+  msg.tx_buf = tx_buf;
+  msg.rx_buf = rx_buf;
+  msg.on_queue = NULL;
+  msg.callback = i2c_drv_master_transfer_callback;
+  msg.private = 0;
+
+  if(msg.tx_buf)
+    msg.flags |= I2C_MSG_MS_TX;
+
+  if(msg.rx_buf && (msg.rx_rq>=1))
+    msg.flags |= I2C_MSG_MS_RX;
+
+  if(!(msg.flags & (I2C_MSG_MS_TX | I2C_MSG_MS_RX)))
+    return 0;
+
+  if(i2c_drv_master_msg_ins(drv, &msg)<0) 
+    return -1;
+
+  /* wait for message process */
+  while(test_bit(0,&(msg.private))==0)
+    drv->poll_fnc(drv);
+
+  if(ptx_len) *ptx_len = msg.tx_len;
+  if(prx_len) *prx_len = msg.rx_len;
+  
+  if(msg.flags & I2C_MSG_FAIL)
+    return -1;
+  
+  return msg.tx_len+msg.rx_len;
+}
+
diff --git a/ulan/embedded/libs4c/i2c/i2c_drv.h b/ulan/embedded/libs4c/i2c/i2c_drv.h
new file mode 100644 (file)
index 0000000..50725d1
--- /dev/null
@@ -0,0 +1,122 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware  
+  i2c_drv.h - I2C communication automat interface 
+  Copyright holders and project originators
+    (C) 2001-2008 by Pavel Pisa pisa@cmp.felk.cvut.cz
+    (C) 2002-2008 by PiKRON Ltd. http://www.pikron.com
+    (C) 2007-2008 by Petr Smolik
+
+ The COLAMI components can be used and copied under next licenses
+   - MPL - Mozilla Public License
+   - GPL - GNU Public License
+   - LGPL - Lesser GNU Public License
+   - and other licenses added by project originators
+ Code can be modified and re-distributed under any combination
+ of the above listed licenses. If contributor does not agree with
+ some of the licenses, he can delete appropriate line.
+ Warning, if you delete all lines, you are not allowed to
+ distribute code or build project.
+ *******************************************************************/
+
+#ifndef _I2C_DRV_H_
+#define _I2C_DRV_H_
+
+#include <types.h>
+#include <cpu_def.h>
+
+#if defined(CONFIG_OC_I2C_DRV_SYSLESS)
+  #define I2C_IRQ_LOCK_FINI unsigned long i2c_irq_lock_flags=0;
+  #define I2C_IRQ_LOCK \
+    {save_flags(i2c_irq_lock_flags);cli();}
+  #define I2C_IRQ_UNLOCK \
+    {restore_flags(i2c_irq_lock_flags);}
+  #define I2C_MB()       {asm volatile ("":::"memory");}
+#endif
+
+struct i2c_drv;
+
+#define I2C_MSG_TX       0x001
+#define I2C_MSG_RX       0x002
+#define I2C_MSG_MS_TX    I2C_MSG_TX
+#define I2C_MSG_MS_RX    I2C_MSG_RX
+#define I2C_MSG_SL_TX    I2C_MSG_TX
+#define I2C_MSG_SL_RX    I2C_MSG_RX
+#define I2C_MSG_SLAVE    0x004
+#define I2C_MSG_FAIL     0x008
+#define I2C_MSG_REPEAT   0x010
+#define I2C_MSG_NOPROC   0x020
+#define I2C_MSG_FINISHED 0x040
+#define I2C_MSG_CB_START 0x100
+#define I2C_MSG_CB_END   0x200
+#define I2C_MSG_CB_PROC  0x400
+
+typedef struct i2c_msg_head {
+    unsigned long flags;/* message flags */
+    uint8_t  sl_cmd;   /* command for slave queue lookup */
+    uint8_t  sl_msk;   /* sl_cmd match mask */
+    uint16_t addr;     /* message destination address */
+    uint16_t tx_rq;    /* requested TX transfer length */
+    uint16_t rx_rq;    /* requested RX transfer length */
+    uint16_t tx_len;   /* finished TX transfer length */
+    uint16_t rx_len;   /* finished RX transfer length */
+    uint8_t *tx_buf;   /* pointer to TX data */
+    uint8_t *rx_buf;   /* pointer to RX data */
+    struct i2c_msg_head *prev;
+    struct i2c_msg_head *next;
+    struct i2c_msg_head **on_queue;
+    int (*callback)(struct i2c_drv *ifc, int code, struct i2c_msg_head *msg);
+    unsigned long private;
+  } i2c_msg_head_t;
+
+typedef int (i2c_sfnc_t)(struct i2c_drv *drv, int code);
+typedef int (i2c_ctrl_fnc_t)(struct i2c_drv *drv, int ctrl, void *p);
+
+#define I2C_DRV_ON      1 /* flag indicating that driver is ready to operate */
+#define I2C_DRV_MS_INPR 2 /* master request in in progress */
+#define I2C_DRV_NA      4 /* driver is not active for some period */
+#define I2C_DRV_SL_CEXP 8 /* slave expect receive of the first byte */
+#define I2C_DRV_SL_INRX 0x10 /* slave in mode */
+
+#define I2C_DRV_MAGIC 0x12345432
+
+typedef struct i2c_drv {
+    int        magic;          /* magic number */
+    int        irq;            /* irq number */
+    long port;         /* base port number */
+    uint8_t flags;
+    uint16_t self_addr;
+    i2c_msg_head_t *master_queue;
+    i2c_msg_head_t *slave_queue;
+    i2c_msg_head_t *proc_queue;
+    i2c_msg_head_t *msg_act;
+    i2c_sfnc_t *sfnc_act;
+    void *failed;
+    i2c_ctrl_fnc_t *ctrl_fnc;
+    int (*poll_fnc)(struct i2c_drv *drv);
+    uint8_t sl_last_cmd; /* last received slave command */
+  } i2c_drv_t;
+
+#define I2C_CTRL_MS_RQ 1
+
+#ifdef CONFIG_OC_I2C_CHIP_C552
+int c552_init_start(struct i2c_drv *drv, int port, int irq, int bitrate, int sladr);
+#endif /* CONFIG_OC_I2C_CHIP_C552 */
+
+void i2c_drv_queue_msg(i2c_msg_head_t **queue, i2c_msg_head_t *msg);
+int  i2c_drv_init(i2c_drv_t *drv, int port, int irq, int bitrate,int sladr);
+int  i2c_drv_master_msg_ins(i2c_drv_t *drv, i2c_msg_head_t *msg);
+int  i2c_drv_master_msg_rem(i2c_drv_t *drv, i2c_msg_head_t *msg);
+int  i2c_drv_flush_all(i2c_drv_t *drv);
+int  i2c_drv_master_transfer(i2c_drv_t *drv, int addr, int tx_rq, int rx_rq,
+                   void *tx_buf, void *rx_buf, int *ptx_len, int *prx_len);
+
+#ifdef I2C_LOG_ENABLE
+  /* todo */
+#else
+  #define I2C_PRINTF(x,args...) 
+#endif
+
+#endif /* _I2C_DRV_H_ */
diff --git a/ulan/embedded/libs4c/kbd/CVS/Entries b/ulan/embedded/libs4c/kbd/CVS/Entries
new file mode 100644 (file)
index 0000000..6ce900f
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Sun Apr 29 06:41:11 2007//
+/Makefile.omk/1.1/Sun Apr 29 06:41:11 2007//
+/kbd.h/1.2/Wed Feb 27 20:13:38 2008//
+/kbd_base.c/1.1/Sun Apr 29 06:41:11 2007//
+/kbd_dev_ops.c/1.3/Wed Feb 27 20:20:11 2008//
+D
diff --git a/ulan/embedded/libs4c/kbd/CVS/Repository b/ulan/embedded/libs4c/kbd/CVS/Repository
new file mode 100644 (file)
index 0000000..ce55720
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/kbd
diff --git a/ulan/embedded/libs4c/kbd/CVS/Root b/ulan/embedded/libs4c/kbd/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/kbd/Makefile b/ulan/embedded/libs4c/kbd/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/kbd/Makefile.omk b/ulan/embedded/libs4c/kbd/Makefile.omk
new file mode 100644 (file)
index 0000000..72023f5
--- /dev/null
@@ -0,0 +1,9 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_KBD=n
+
+ifeq ($(CONFIG_KBD),y) 
+lib_LIBRARIES = kbd
+include_HEADERS += kbd.h
+kbd_SOURCES += kbd_base.c kbd_dev_ops.c
+endif #CONFIG_KBD
diff --git a/ulan/embedded/libs4c/kbd/kbd.h b/ulan/embedded/libs4c/kbd/kbd.h
new file mode 100644 (file)
index 0000000..6721c8d
--- /dev/null
@@ -0,0 +1,45 @@
+#include <system_def.h>
+
+#ifndef KEY_DEFAULT_TIMES
+  #define KEY_PUSH_T   20
+  #define KEY_RELEASE_T        10
+  #define KEY_REPFIRST_T 800
+  #define KEY_REPNEXT_T        300
+#endif /* KEY_DEFAULT_TIMES */
+
+typedef struct {
+       kbd_key_t bc;
+       kbd_key_t sc;
+} scan2key_t;
+
+typedef struct {
+       int scan;
+       int flag;
+       kbd_keymod_t is_mod;
+       kbd_keymod_t set_mod;
+       kbd_keymod_t xor_mod;
+} scan2mod_t;
+
+#define KBDMOD_SGM_SC          0x8000
+#define KBDMOD_SGM_RELEASE     0x0080
+
+extern int key_last_changed;
+extern kbd_keymod_t key_mod;
+extern unsigned char key_hit;
+extern short key_use_timer;
+extern unsigned char key_down_arr[KBD_SCAN_CNT];
+
+unsigned char kbd_onerow(unsigned char scan);
+void kbd_setio(void);
+
+int kbd_scan();
+void kbd_scan2mod(int scan_code);
+int kbd_down();
+kbd_key_t kbd_scan2key(int scan);
+
+int kbd_Open(KBDDEVICE *pkd);
+void kbd_Close(void);
+void kbd_GetModifierInfo(kbd_keymod_t *modifiers, kbd_keymod_t *curmodifiers);
+int kbd_Read(kbd_key_t *buf, kbd_keymod_t *modifiers, kbd_scan_code_t *scancode);
+int kbd_Poll(void);
+
diff --git a/ulan/embedded/libs4c/kbd/kbd_base.c b/ulan/embedded/libs4c/kbd/kbd_base.c
new file mode 100644 (file)
index 0000000..f59dd52
--- /dev/null
@@ -0,0 +1,183 @@
+#include "kbd.h"
+
+extern scan2key_t *kbd_scan2key_tab;
+extern scan2mod_t *kbd_scan2mod_tab;
+
+/* State of keyboard matrix and key press reporting */
+
+unsigned char key_down_arr[KBD_SCAN_CNT];
+unsigned char key_chng_arr[KBD_SCAN_CNT];
+unsigned char key_hit;
+
+kbd_keymod_t key_mod;
+
+int key_last_changed;
+
+/* Internal state for repeat processing */
+
+short key_use_timer;
+short key_state;
+kbd_interval_t key_time;
+
+#define KEY_STATE_IDLE     0
+#define KEY_STATE_PUSH     1
+#define KEY_STATE_RELEASE  2
+#define KEY_STATE_REPEAT   4
+#define KEY_STATE_NOISE    8
+#define KEY_STATE_BUSY     (KEY_STATE_PUSH|KEY_STATE_RELEASE)
+
+
+/**
+ * kbd_scan - Scan keyboard matrix and report requests for state change
+ *
+ * Scans keyboard matrix connected row by row by calling function
+ * mx1_kbd_onerow(). Number of scanned output lines is defined
+ * by %KBD_SCAN_CNT. Checks read keyboard state against @key_down_arr
+ * and updates @key_change_arr array. The @key_down_arr state is 
+ * left unchanged. It is changed later by kbd_down() function.
+ * Returns 0, if no keyboard activity is found. Returns 1
+ * if at least one key is pressed. Returns 2 or 3 in case
+ * of detected change.
+ */
+int 
+kbd_scan()
+{
+       int i, ret=0;
+       unsigned char mask, val, chng;
+       for(i=0,mask=1;i<KBD_SCAN_CNT;i++,mask<<=1) {
+               val=kbd_onerow(mask);
+               chng=val^key_down_arr[i];
+               key_chng_arr[i]=chng;
+               if(val) ret|=1;
+               if(chng) ret|=2;
+       }
+       /* mx1_kbd_onerow(~0); */
+       return ret;
+}
+
+
+/**
+ * kbd_scan2mod - Propagate keyboard matrix changes between modifiers
+ * @scan_code:         Scan code of last detected key change
+ *
+ * Functions check keyboard matrix state in @key_down_arr.
+ * It updates @key_mod according to @key_down_arr and 
+ * modifiers transformations table @kbd_scan2mwmod_tab.
+ */
+void 
+kbd_scan2mod(int scan_code)
+{
+       unsigned char val, chng;
+       int s;
+       scan2mod_t *mt=kbd_scan2mod_tab;
+
+       for(;(s=mt->scan);mt++) {
+               chng=(s==scan_code);
+               s--;
+               val=key_down_arr[s/KBD_RET_CNT]&(1<<(s%KBD_RET_CNT));
+               if(val) {
+                       key_mod|=mt->set_mod;
+                       if(chng){
+                               key_mod^=mt->xor_mod;
+                       }
+               } else {
+                       key_mod&=~mt->set_mod;
+               }
+       }
+}
+
+/**
+ * kbd_down - Detects changed key scancode and applies changes to matrix state
+ *
+ * Functions check @key_chng_arr and process changes.
+ * It updates its internal state @key_state, does
+ * noise cancellation and repeat timing, then updates 
+ * @key_down_arr, stores detected scancode to @key_last_changed
+ * and calls modifiers processing kbd_scan2mod().
+ * Return value is zero if no change is detected. 
+ * In other case evaluated scancode is returned.
+ * Variable @key_hit signals by value 1 pressed key, by value
+ * 2 key release.
+ */
+int 
+kbd_down()
+{
+       int i, j=0;
+       unsigned char val;
+       
+        if(!(key_state&KEY_STATE_BUSY)){
+               for(i=0;i<KBD_SCAN_CNT;i++) {
+                       if(!(val=key_chng_arr[i])) continue;
+                       for(j=0;!(val&1);j++) val>>=1;
+                       key_last_changed=i*KBD_RET_CNT+j+1;
+                       if(key_down_arr[i]&(1<<j)){
+                               key_time=KEY_TIMER+KEY_PUSH_T;
+                               key_state=KEY_STATE_RELEASE;
+                       }else{
+                               key_time=KEY_TIMER+KEY_RELEASE_T;
+                               key_state=KEY_STATE_PUSH;
+                       }
+                       break;
+               }
+               if(key_state==KEY_STATE_IDLE)
+                       return 0;
+       } else {
+               if(!key_last_changed){
+                       key_state=KEY_STATE_IDLE;
+                       return 0;
+               }
+               i=(key_last_changed-1)/KBD_RET_CNT;
+               j=(key_last_changed-1)%KBD_RET_CNT;
+               if(!(key_chng_arr[i]&(1<<j))){
+                       /* Noise detected */
+                       if(!(key_state&KEY_STATE_NOISE)){
+                               key_time=KEY_TIMER+KEY_RELEASE_T;
+                               key_state|=KEY_STATE_NOISE;
+                       }
+               }
+       }
+
+       if(!key_use_timer){
+               if(KEY_TIMER) key_use_timer=1;
+               if(key_state&KEY_STATE_REPEAT) return 0;
+       }else{
+               if((long)(KEY_TIMER-key_time)<0) return 0;
+       }
+       
+       if(key_state==KEY_STATE_PUSH) {
+               key_down_arr[i]|=1<<j;
+               kbd_scan2mod(key_last_changed);
+               key_state=KEY_STATE_REPEAT;
+               key_time=KEY_TIMER+KEY_REPFIRST_T;
+               key_hit=1;
+               return key_last_changed;
+       } else if(key_state==KEY_STATE_REPEAT) {
+               key_time=KEY_TIMER+KEY_REPNEXT_T;
+               key_hit=1;
+               return key_last_changed;
+       } else if(key_state==KEY_STATE_RELEASE) {
+               key_down_arr[i]&=~(1<<j);
+               kbd_scan2mod(key_last_changed);
+               key_state=KEY_STATE_IDLE;
+               key_hit=2;
+               return key_last_changed;
+       } 
+       key_state=KEY_STATE_IDLE;
+       return 0;
+}
+
+/**
+ * kbd_scan2key - Converts scancode to kbd_key_t keyboard values
+ * @scan:      Detected scancode
+ *
+ * Computes kbd_key_t value for detected scancode.
+ * Uses @kbd_scan2key_tab transformation table
+ * and @key_mod modifiers information.
+ */
+kbd_key_t kbd_scan2key(int scan)
+{
+       if((key_mod&KBDMOD_SGM_SC)&&kbd_scan2key_tab[scan].sc)
+               return kbd_scan2key_tab[scan].sc;
+       return kbd_scan2key_tab[scan].bc;
+}
+
diff --git a/ulan/embedded/libs4c/kbd/kbd_dev_ops.c b/ulan/embedded/libs4c/kbd/kbd_dev_ops.c
new file mode 100644 (file)
index 0000000..1eb3776
--- /dev/null
@@ -0,0 +1,103 @@
+#include <string.h>
+#include "kbd.h"
+
+#ifdef _DEVICE_H
+/* create the microwindows keyboard device */
+
+KBDDEVICE kbddev = {
+       kbd_Open,
+       kbd_Close,
+       kbd_GetModifierInfo,
+       kbd_Read,
+       kbd_Poll
+};
+#endif /* _DEVICE_H */
+
+/**
+ * kbd_Open - Open the keyboard
+ * @pkd:       Pointer to keyboard device
+ */
+int
+kbd_Open(KBDDEVICE *pkd)
+{
+       key_last_changed=0;
+       key_mod=0;
+       key_hit=0;
+       key_use_timer=0;
+       memset(key_down_arr,0,sizeof(key_down_arr));
+       kbd_setio();
+       return 1;
+}
+
+/**
+ * mx1_kbd_Close - Closes keyboard
+ */
+void
+kbd_Close(void)
+{
+}
+
+/**
+ * mx1_kbd_Poll - Polls for keyboard events
+ *
+ * Returns non-zero value if change is detected.
+ */
+int
+kbd_Poll(void)
+{
+       if(key_hit)
+               return 1;
+       if(kbd_scan())
+               kbd_down();
+       return key_hit?1:0;
+}
+
+/**
+ * kbd_GetModifierInfo - Returns the possible modifiers for the keyboard
+ * @modifiers:         If non-NULL, ones in defined modifiers bits are returned.
+ * @curmodifiers:      If non-NULL, ones in actually active modifiers
+ *                     bits are returned.
+ */
+void
+kbd_GetModifierInfo(kbd_keymod_t *modifiers, kbd_keymod_t *curmodifiers)
+{
+       if (modifiers)
+               *modifiers = 0;         /* no modifiers available */
+       if (curmodifiers)
+               *curmodifiers = key_mod&~KBDMOD_SGM_SC;
+}
+
+/**
+ * mx1_kbd_Read - Reads resolved MWKEY value, modifiers and scancode
+ * @buf:               If non-NULL, resolved MWKEY is stored here
+ * @modifiers:         If non-NULL, ones in actually active modifiers
+ *                     bits are returned
+ * @scancode:          If non-NULL, scancode of resolved key is stored
+ *                     here
+ *
+ * This function reads one keystroke from the keyboard, and the current state
+ * of the modifier keys (ALT, SHIFT, etc).  Returns -1 on error, 0 if no data
+ * is ready, 1 on a keypress, and 2 on keyrelease.
+ * This is a non-blocking call.
+ */
+int
+kbd_Read(kbd_key_t *buf, kbd_keymod_t *modifiers, kbd_scan_code_t *scancode)
+{
+        int ret;
+       if(!key_hit) {
+               if(kbd_scan()){
+                       kbd_down();
+               }
+       }
+       if(modifiers)
+               *modifiers = key_mod&~KBDMOD_SGM_SC;
+       if(!key_hit)
+               return 0;
+       if(scancode)
+               *scancode = key_last_changed;
+       if(buf)
+               *buf = kbd_scan2key(key_last_changed);
+       ret=key_hit;
+       key_hit=0;
+       return ret;
+}
diff --git a/ulan/embedded/libs4c/keyval/CVS/Entries b/ulan/embedded/libs4c/keyval/CVS/Entries
new file mode 100644 (file)
index 0000000..8894777
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Mon Apr 18 23:21:34 2005//
+/Makefile.omk/1.3/Mon Oct  3 12:43:27 2005//
+/keyval_id.h/1.5/Sun Apr 29 06:41:11 2007//
+/keyvalpb.c/1.8/Fri Aug  4 10:46:07 2006//
+/keyvalpb.h/1.9/Thu Nov  9 23:19:13 2006//
+D
diff --git a/ulan/embedded/libs4c/keyval/CVS/Repository b/ulan/embedded/libs4c/keyval/CVS/Repository
new file mode 100644 (file)
index 0000000..59cc16b
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/keyval
diff --git a/ulan/embedded/libs4c/keyval/CVS/Root b/ulan/embedded/libs4c/keyval/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/keyval/Makefile b/ulan/embedded/libs4c/keyval/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/keyval/Makefile.omk b/ulan/embedded/libs4c/keyval/Makefile.omk
new file mode 100644 (file)
index 0000000..36743e7
--- /dev/null
@@ -0,0 +1,9 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_KEYVAL=n
+
+ifeq ($(CONFIG_KEYVAL),y) 
+lib_LIBRARIES = keyval
+include_HEADERS += keyvalpb.h keyval_id.h
+keyval_SOURCES += keyvalpb.c 
+endif #CONFIG_KEYVAL
diff --git a/ulan/embedded/libs4c/keyval/keyval_id.h b/ulan/embedded/libs4c/keyval/keyval_id.h
new file mode 100644 (file)
index 0000000..60641d2
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _KEYVAL_ID_H_
+#define _KEYVAL_ID_H_
+
+#include "keyvalpb.h"
+
+#define KVPB_KEYID_ULAN_ADDR            0x10
+#define KVPB_KEYID_ULAN_SN              0x11
+
+#define KVPB_KEYID_HIS_ACCESS_CODE     0x20
+
+#endif /* _KEYVAL_ID_H_ */
+
diff --git a/ulan/embedded/libs4c/keyval/keyvalpb.c b/ulan/embedded/libs4c/keyval/keyvalpb.c
new file mode 100644 (file)
index 0000000..8dd6d1e
--- /dev/null
@@ -0,0 +1,494 @@
+/*******************************************************************
+  Key Value Persistent Storage
+
+  keyvalpb.c   - key value parameters block
+
+  (C) Copyright 2003-2005 by Pavel Pisa - Originator
+  (C) Copyright 2004-2005 by Petr Smolik - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "keyvalpb.h"
+
+/*
+ * kvpb_memsum - Compute checksum of given memory area
+ * @base: Pointer to the base of of the region
+ * @size: Size of utilized part of the region
+ *
+ * Return Value: Computed checksum value
+ * File: keyvalpb.c
+ */
+kvpb_sum_t kvpb_memsum(KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size)
+{
+  KVPB_LOCALDATA kvpb_sum_t sum=0;
+  KVPB_DPTRTYPE uint16_t *p=(KVPB_DPTRTYPE uint16_t *)base;
+  size=(size+1)>>1;
+  while(size--){
+    sum+=*(p++);
+  }
+  sum&=KVPB_SUM_MASK;
+  sum|=KVPB_SUM_OKVAL;
+  return sum;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/*
+ * kvpb_get_psum - Get pointer to the region check sum
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @base: Pointer to the base of of the region
+ * @size: Size of one data block region
+ *
+ * Return Value: Pointer to the actual region check sum placement
+ * File: keyvalpb.c
+ */
+KVPB_DPTRTYPE kvpb_sum_t *kvpb_get_psum(kvpb_block_t *kvpb_block,
+                                  KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size) 
+#else
+KVPB_DPTRTYPE kvpb_sum_t *__kvpb_get_psum(
+                                  KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size) 
+#endif
+{
+  KVPB_DPTRTYPE kvpb_sum_t *psum;
+  psum=kvpb_psum_align(kvpb_block,(KVPB_DPTRTYPE kvpb_sum_t*)(base+size)-1);
+  while((KVPB_DPTRTYPE uint8_t*)psum>=base) {
+    if (*kvpb_psum_valid_loc(kvpb_block,psum)!=0) 
+      return psum;
+    psum=kvpb_psum_align(kvpb_block,psum-1);
+  }
+  return NULL;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/*
+ * kvpb_get_cfk - Get space where to place new key-value pair
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @mode: 0 .. work on active/valid data region;
+ *     1 .. work on the first copy/region, 2 .. work on the second copy/region
+ * @size: Size of required space for stored value
+ *
+ * Return Value: Pointer where next pair should be stored or %NULL
+ * File: keyvalpb.c
+ */
+KVPB_DPTRTYPE kvpb_key_t *kvpb_get_cfk(kvpb_block_t *kvpb_block,uint8_t mode,int size)
+#else
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_get_cfk(uint8_t mode,int size)
+#endif
+{
+  KVPB_DPTRTYPE kvpb_sum_t *psum;
+  KVPB_DPTRTYPE uint8_t    *p;
+  KVPB_DPTRTYPE uint8_t    *r;
+  p=kvpb_region_base(kvpb_block,0);
+  size=kvpb_chunk_align(kvpb_block,size+sizeof(kvpb_key_t))+
+       (kvpb_block->flags&KVPB_DESC_CHUNKWO?kvpb_chunk_size(kvpb_block):0);
+  psum=kvpb_block->psum1;
+  if((!mode && (kvpb_block->flags & KVPB_DESC_USE2ND))||(mode==2)) {
+    if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
+      return NULL;
+    p=kvpb_region_base(kvpb_block,1);
+    psum=kvpb_block->psum2;
+  }
+  do {
+    kvpb_size_t ksize=((KVPB_DPTRTYPE kvpb_key_t *)p)->size;
+    if(ksize==KVPB_EMPTY)
+      break;
+    if(((uint8_t*)psum-(uint8_t*)p)<ksize)
+      return NULL;
+    p+=kvpb_chunk_align(kvpb_block,ksize+sizeof(kvpb_key_t))+
+       (kvpb_block->flags&KVPB_DESC_CHUNKWO?kvpb_chunk_size(kvpb_block):0);
+  } while(1);
+  r=(KVPB_DPTRTYPE uint8_t*)p+size+sizeof(kvpb_key_t);
+  if(r<p)
+    return NULL;
+  if ((uint8_t*)kvpb_psum_align(kvpb_block,psum-1)<r) {
+    return NULL;
+  }
+  return (KVPB_DPTRTYPE kvpb_key_t*)p;
+}
+
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_check - Check data consistency of the KVPB storage
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @mode: if mode is nonzero, try to restore valid state or erase all data
+ *
+ * Return Value: 0 .. all regions are correct, 1 .. the first region is valid, the second
+ *     region is invalid or has been updated if @mode has been set, 2 .. the second region
+ *     is valid, the first is invalid or has been updated if @mode has been set, 3 .. both
+ *     regions has been erased and emptied, -1 .. the state is inconsistent and no valid
+ *     region has been found and state has not be corrected
+ * File: keyvalpb.c
+ */
+int kvpb_check(kvpb_block_t *kvpb_block, uint8_t mode)
+#else
+int __kvpb_check(uint8_t mode)
+#endif
+{
+  KVPB_DPTRTYPE uint8_t *p;
+  KVPB_LOCALDATA int ret=-1;
+  KVPB_LOCALDATA kvpb_sum_t sum;
+  
+  kvpb_block->flags&=~KVPB_DESC_USE2ND;
+  
+  p=kvpb_region_base(kvpb_block,0);
+  kvpb_block->psum1=kvpb_get_psum(kvpb_block,p,kvpb_block->size);
+  if (kvpb_block->psum1) {
+    sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum1-p);
+    if(*kvpb_block->psum1==sum){
+      ret=1;
+    }
+  }
+
+  if(kvpb_block->flags&KVPB_DESC_DOUBLE){
+    p=kvpb_region_base(kvpb_block,1);
+    kvpb_block->psum2=kvpb_get_psum(kvpb_block,p,kvpb_block->size);
+    if (kvpb_block->psum2) {
+      sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum2-p);
+      if(*kvpb_block->psum2==sum) {
+        if(ret>=0){
+          ret=0;
+        } else {
+          ret=2;
+          kvpb_block->flags|=KVPB_DESC_USE2ND;
+        }
+      }
+    }
+  } else {
+    if(ret>=0)
+      ret=0;
+  }
+  
+  if(ret){
+    if(!mode) {
+      kvpb_block->flags|=KVPB_DESC_RO;
+    } else {
+      /* correct for FLASH */
+      if(ret<0){
+        p=kvpb_region_base(kvpb_block,0);
+        kvpb_block_erase(kvpb_block,p,kvpb_block->size);
+        kvpb_block->psum1=kvpb_psum_align(kvpb_block,(KVPB_DPTRTYPE kvpb_sum_t*)(p+kvpb_block->size)-1);
+        sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum1-p);
+       kvpb_block_copy(kvpb_block,kvpb_block->psum1,&sum,sizeof(kvpb_sum_t));
+       if(kvpb_block->flags&KVPB_DESC_DOUBLE){
+          p=kvpb_region_base(kvpb_block,1);
+          kvpb_block_erase(kvpb_block,p,kvpb_block->size);
+          kvpb_block->psum2=kvpb_psum_align(kvpb_block,(KVPB_DPTRTYPE kvpb_sum_t*)(p+kvpb_block->size)-1);
+          sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum2-p);
+          kvpb_block_copy(kvpb_block,kvpb_block->psum2,&sum,sizeof(kvpb_sum_t));
+       }
+       ret=3;
+      }else{
+        if(ret==1){
+          kvpb_block_erase(kvpb_block,kvpb_region_base(kvpb_block,1),kvpb_block->size);
+          kvpb_block_copy(kvpb_block,kvpb_region_base(kvpb_block,1),
+                         kvpb_region_base(kvpb_block,0),kvpb_block->size);
+
+       }else{
+          kvpb_block_erase(kvpb_block,kvpb_region_base(kvpb_block,0),kvpb_block->size);
+          kvpb_block_copy(kvpb_block,kvpb_region_base(kvpb_block,0),
+                         kvpb_region_base(kvpb_block,1),kvpb_block->size);
+       }
+      }
+      kvpb_block->flags&=~KVPB_DESC_RO;
+    }
+  }
+  kvpb_block_flush(kvpb_block); 
+  if(ret>=0) kvpb_block->flags|=KVPB_DESC_VALID;
+  return ret;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_first - Get pointer to the first key-value pair in the KVPB storage
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @mode: 0 .. iterate over active/valid data region;
+ *     1 .. iterate over first copy/region, 2 .. iterate over second copy/region
+ *
+ * Return Value: Pointer to the first key-value pair
+ *     or %NULL if no pair exist.
+ * File: keyvalpb.c
+ */
+KVPB_DPTRTYPE kvpb_key_t *kvpb_first(kvpb_block_t *kvpb_block, uint8_t mode)
+#else
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_first(uint8_t mode)
+#endif
+{
+  KVPB_DPTRTYPE kvpb_key_t *key=(KVPB_DPTRTYPE kvpb_key_t *)kvpb_region_base(kvpb_block,0);
+  if((!mode && (kvpb_block->flags & KVPB_DESC_USE2ND))||(mode==2)) {
+    if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
+      return NULL;
+    key=(KVPB_DPTRTYPE kvpb_key_t *)kvpb_region_base(kvpb_block,1);
+  }
+  while(*kvpb_keyid_valid(kvpb_block,key)==KVPB_KEYID_INVALID) {
+    key=kvpb_next(kvpb_block,key);
+    if (!key) 
+      return NULL;
+  }
+  return key->size!=KVPB_EMPTY?key:NULL;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_next - Iterate to the next consecutive key-value pair
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @key: Pointer to the previous key-value pair
+ *
+ * Return Value: Pointer to the next key-value pair
+ *     or %NULL if no/no-more pairs exist.
+ * File: keyvalpb.c
+ */
+KVPB_DPTRTYPE kvpb_key_t *kvpb_next(kvpb_block_t *kvpb_block, KVPB_DPTRTYPE kvpb_key_t *key)
+#else
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_next(KVPB_DPTRTYPE kvpb_key_t *key)
+#endif
+{
+  do {
+    key=(KVPB_DPTRTYPE kvpb_key_t *)((KVPB_DPTRTYPE uint8_t *)key+
+                               kvpb_chunk_align(kvpb_block,key->size+sizeof(kvpb_key_t))+
+                               (kvpb_block->flags&KVPB_DESC_CHUNKWO?kvpb_chunk_size(kvpb_block):0));
+    if (key->size==KVPB_EMPTY) return NULL;
+  } while(*kvpb_keyid_valid(kvpb_block,key)==KVPB_KEYID_INVALID);
+  return key;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_find - Find first of occurrence of given key ID
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @keyid: Ordinal value representing key ID
+ * @mode: iteration mode modifier: 0 .. search in the active/valid data region;
+ *     1 .. search in the first copy/region, 2 .. search in the second copy/region
+ * @key: Previous key occurrence pointer or %NULL value to find first key ID named key-value pair
+ *
+ * Return Value: Pointer to the first on subsequent occurrence of key-value pair addressed by given key ID
+ *     or %NULL if no/no-more occurrences exists.
+ * File: keyvalpb.c
+ */
+KVPB_DPTRTYPE kvpb_key_t *kvpb_find(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid, uint8_t mode, KVPB_DPTRTYPE kvpb_key_t *key)
+#else
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_find(kvpb_keyid_t keyid, uint8_t mode, KVPB_DPTRTYPE kvpb_key_t *key)
+#endif
+{
+  if(!(kvpb_block->flags&KVPB_DESC_VALID))
+    return NULL;
+  if (key) {
+      key=kvpb_next(kvpb_block, key);
+  } else {
+      key=kvpb_first(kvpb_block, mode);
+  }
+  while(key) {
+    if((key->keyid==keyid) || (keyid==0))
+      return key;
+    key=kvpb_next(kvpb_block, key);
+  }
+  return key;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_compact_region - Compact one KVPB data block/region
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @keyid: Key ID which should be omitted from compacted data
+ * @mode: 0 .. compact active/valid data region;
+ *     1 .. compact the first data copy, 2 .. compact the second copy
+ *
+ * Return Value: Operation cannot be finished.
+ * File: keyvalpb.c
+ */
+int kvpb_compact_region(kvpb_block_t *kvpb_block, uint8_t mode, kvpb_keyid_t keyid) 
+#else
+int __kvpb_compact_region(uint8_t mode, kvpb_keyid_t keyid) 
+#endif
+{
+  KVPB_DPTRTYPE uint8_t *p;
+  KVPB_DPTRTYPE kvpb_key_t *des,*src;
+
+  p=kvpb_region_base(kvpb_block,0);
+  src=(KVPB_DPTRTYPE kvpb_key_t*)kvpb_region_base(kvpb_block,1);
+  des=(KVPB_DPTRTYPE kvpb_key_t*)p;
+  kvpb_block->psum1=kvpb_psum_align(kvpb_block,
+                    (KVPB_DPTRTYPE kvpb_sum_t*)(kvpb_region_base(kvpb_block,1))-1);
+  if((!mode && (kvpb_block->flags & KVPB_DESC_USE2ND))||(mode==2)) {
+    if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
+      return -1;
+    src=(KVPB_DPTRTYPE kvpb_key_t*)p;
+    des=(KVPB_DPTRTYPE kvpb_key_t*)kvpb_region_base(kvpb_block,1);
+    kvpb_block->psum2=kvpb_psum_align(kvpb_block,
+                      (KVPB_DPTRTYPE kvpb_sum_t*)(kvpb_region_base(kvpb_block,2))-1);
+  }
+  kvpb_block_flush(kvpb_block);
+  kvpb_block_erase(kvpb_block,des,kvpb_block->size);
+  while(src) {
+    int s=kvpb_chunk_align(kvpb_block,src->size+sizeof(kvpb_key_t));
+    if((*kvpb_keyid_valid(kvpb_block,src)!=KVPB_KEYID_INVALID) && (src->keyid!=keyid)) {
+      kvpb_block_copy(kvpb_block,des,src,s);    
+      if (kvpb_block->flags&KVPB_DESC_CHUNKWO) s+=kvpb_chunk_size(kvpb_block);
+      des=(KVPB_DPTRTYPE kvpb_key_t*)((uint8_t*)des+s);
+    }
+    src=kvpb_next(kvpb_block, src);
+  }
+  kvpb_block_flush(kvpb_block);
+  return 0;
+}
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_get_key - Get value for given key ID
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @keyid: Ordinal value representing key ID
+ * @size: The size of the buffer provided to store data into
+ * @buf: Pointer to the buffer, where retrieved data should be copied
+ *
+ * Return Value: Number of retrieved value bytes if operation is successful
+ *     or -1 if there is no such key ID or operation fails for other reason.
+ * File: keyvalpb.c
+ */
+int kvpb_get_key(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid, kvpb_size_t size, void *buf)
+#else
+int __kvpb_get_key(kvpb_keyid_t keyid, kvpb_size_t size, void *buf)
+#endif
+{
+  KVPB_DPTRTYPE kvpb_key_t *key;
+  key=kvpb_find(kvpb_block,keyid,0,NULL);
+  if(!key) return -1;
+  if(size && buf){
+    if(key->size<size)
+      size=key->size;
+    memcpy(buf,key+1,size);
+  }
+  return key->size;
+}
+
+
+#ifndef KVPB_WITHOUT_HADLE
+/**
+ * kvpb_set_key - Set new value or define new key-value pair
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @keyid: Ordinal value representing key ID, if or-red with %KVPB_KEYID_DUPLIC,
+ *     the key ID can be defined/inserted  multiple times
+ * @size: Stored value size in bytes
+ * @buf: Pointer to the stored value data
+ *
+ * Return Value: Number of stored bytes (equal to @size) if operation is successful
+ *     or -1 if operation fails.
+ * File: keyvalpb.c
+ */
+int kvpb_set_key(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid, kvpb_size_t size, const void *buf)
+#else
+int __kvpb_set_key(kvpb_keyid_t keyid, kvpb_size_t size, const void *buf)
+#endif
+{
+  KVPB_LOCALDATA kvpb_sum_t sum;
+  KVPB_DPTRTYPE kvpb_sum_t *psum;
+  KVPB_DPTRTYPE kvpb_key_t *key;
+  KVPB_DPTRTYPE uint8_t *p;
+  
+  if(!(kvpb_block->flags&KVPB_DESC_VALID))
+    return -1;
+  if(kvpb_block->flags&KVPB_DESC_RO)
+    return -1;
+  
+  /*first region*/
+  psum=kvpb_psum_align(kvpb_block,kvpb_block->psum1);
+  sum=0;
+  kvpb_block_copy(kvpb_block,kvpb_psum_valid_loc(kvpb_block,psum),&sum,sizeof(kvpb_sum_t));
+  kvpb_block->psum1=kvpb_psum_align(kvpb_block,kvpb_block->psum1-1);
+  if (!(keyid&KVPB_KEYID_DUPLIC) || !buf) {
+    kvpb_each_from(kvpb_block,keyid,1,key) {
+      kvpb_keyid_t dkeyid=KVPB_KEYID_INVALID;
+      kvpb_block_copy(kvpb_block,kvpb_keyid_valid(kvpb_block,key),&dkeyid,sizeof(kvpb_keyid_t));
+    }
+  }
+  key=kvpb_get_cfk(kvpb_block,1,size);
+  if (!key) {
+    kvpb_compact_region(kvpb_block,1,(keyid&KVPB_KEYID_DUPLIC)?0:keyid);
+    key=kvpb_get_cfk(kvpb_block,1,size);
+  }
+  if (keyid && key && buf) {
+    kvpb_block_copy(kvpb_block,&key->size,&size,sizeof(kvpb_size_t));
+    kvpb_block_copy(kvpb_block,&key->keyid,&keyid,sizeof(kvpb_keyid_t));
+    kvpb_block_copy(kvpb_block,(uint8_t*)(key+1),buf,/*align???*/ size);
+  }
+  /* need flush data to count correct value of new check sum */
+  kvpb_block_flush(kvpb_block);
+
+  p=kvpb_region_base(kvpb_block,0);
+  sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum1-p);
+  kvpb_block_copy(kvpb_block,kvpb_block->psum1,&sum,sizeof(kvpb_sum_t));  
+  kvpb_block_flush(kvpb_block);
+  if(!(kvpb_block->flags&KVPB_DESC_DOUBLE))
+     return key?size:-1;
+
+  /*Write in the first region failed, switching to backup region */
+  if(kvpb_block->flags&KVPB_DESC_RO){
+    kvpb_block->flags|=KVPB_DESC_USE2ND;
+    return -1;
+  }
+
+  /*second region*/
+  psum=kvpb_psum_align(kvpb_block,kvpb_block->psum2);
+  sum=0;
+  kvpb_block_copy(kvpb_block,kvpb_psum_valid_loc(kvpb_block,psum),&sum,sizeof(kvpb_sum_t));
+  kvpb_block->psum2=kvpb_psum_align(kvpb_block,kvpb_block->psum2-1);
+  if (!(keyid&KVPB_KEYID_DUPLIC) || !buf) {
+    kvpb_each_from(kvpb_block,keyid,2,key) {
+      kvpb_keyid_t dkeyid=KVPB_KEYID_INVALID;
+      kvpb_block_copy(kvpb_block,kvpb_keyid_valid(kvpb_block,key),&dkeyid,sizeof(kvpb_keyid_t));
+    }
+  }
+  key=kvpb_get_cfk(kvpb_block,2,size);
+  if (!key) {
+    kvpb_compact_region(kvpb_block,2,(keyid&KVPB_KEYID_DUPLIC)?0:keyid);
+    key=kvpb_get_cfk(kvpb_block,2,size);
+  }
+  if (keyid && key && buf) {
+    kvpb_block_copy(kvpb_block,&key->size,&size,sizeof(kvpb_size_t));
+    kvpb_block_copy(kvpb_block,&key->keyid,&keyid,sizeof(kvpb_keyid_t));
+    kvpb_block_copy(kvpb_block,(uint8_t*)(key+1),buf,/*align???*/ size);
+  }
+  kvpb_block_flush(kvpb_block);
+        
+  p=kvpb_region_base(kvpb_block,1);
+  sum=kvpb_memsum(p,(KVPB_DPTRTYPE uint8_t*)kvpb_block->psum2-p);
+  kvpb_block_copy(kvpb_block,kvpb_block->psum2,&sum,sizeof(kvpb_sum_t));
+  kvpb_block_flush(kvpb_block);
+  /*Write in the second region failed, switching to the first region */
+  if(kvpb_block->flags&KVPB_DESC_RO){
+    kvpb_block->flags&=~KVPB_DESC_USE2ND;
+    return -1;
+  }
+
+  return key?size:-1;
+}
+
+#ifndef KVPB_MINIMALIZED
+/**
+ * kvpb_err_keys - Erase/delete key-value pair
+ * @kvpb_block: Pointer to the KVPB access information/state structure
+ * @keyid: Ordinal value representing key ID
+ *
+ * Return Value: Positive or zero value informs about successful operation,
+ *     -1 if operation fails.
+ * File: keyvalpb.c
+ */
+int kvpb_err_keys(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid)
+{
+  return kvpb_set_key(kvpb_block,keyid,0,NULL);
+}
+#endif  /*KVPB_MINIMALIZED*/
+
diff --git a/ulan/embedded/libs4c/keyval/keyvalpb.h b/ulan/embedded/libs4c/keyval/keyvalpb.h
new file mode 100644 (file)
index 0000000..dbb7774
--- /dev/null
@@ -0,0 +1,327 @@
+/*******************************************************************
+  Key Value Persistent Storage
+
+  keyvalpb.h   - key value parameters block
+
+  (C) Copyright 2003-2005 by Pavel Pisa - Originator
+  (C) Copyright 2004-2005 by Petr Smolik - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _KEYVALPB_H_
+#define _KEYVALPB_H_
+
+//#include <inttypes.h>
+#include <types.h>
+#include <system_def.h>
+#include <cpu_def.h>
+
+#ifdef  KVPB_MINIMALIZED
+#define KVPB_WITHOUT_HADLE
+#define KVPB_DPTRTYPE  CODE
+#define KVPB_LOCALDATA DATA
+#endif  /*KVPB_MINIMALIZED*/
+
+#ifndef KVPB_DPTRTYPE
+#define KVPB_DPTRTYPE
+#endif  /*KVPB_DPTRTYPE*/
+
+#ifndef KVPB_LOCALDATA
+#define KVPB_LOCALDATA
+#endif  /*KVPB_DPTRTYPE*/
+
+#ifndef KVPB_BLOCK_LOC
+#define KVPB_BLOCK_LOC
+#endif  /*KVPB_BLOCK_LOC*/
+
+#define KVPB_EMPTY         ((kvpb_size_t)~0)
+
+#define KVPB_KEYID_INVALID      0
+#define KVPB_KEYID_DUPLIC       ((((kvpb_keyid_t)~0)>>1)+1)
+#define KBPB_KEYID_INVALID_BIT  (KVPB_KEYID_DUPLIC>>1)
+
+#define KVPB_SUM_MASK      (((kvpb_sum_t)~0)>>2)
+#define KVPB_SUM_OKVAL     (KVPB_SUM_MASK+1)
+
+#define KVPB_DESC_DOUBLE  0x01
+#define KVPB_DESC_USE2ND  0x02
+#define KVPB_DESC_VALID   0x04
+#define KVPB_DESC_RO      0x08
+#define KVPB_DESC_CHUNKWO 0x10
+#define KVPB_DESC_ALIGN4  0x40
+#define KVPB_DESC_FLASH   0x80  
+
+#ifdef  KVPB_MINIMALIZED
+typedef uint16_t kvpb_sum_t;
+typedef uint16_t kvpb_size_t;
+typedef uint8_t kvpb_keyid_t;
+#else  /*KVPB_MINIMALIZED*/
+typedef uint32_t kvpb_sum_t;
+typedef uint32_t kvpb_size_t;
+typedef uint32_t kvpb_keyid_t;
+#endif  /*KVPB_MINIMALIZED*/
+
+/**
+ * struct kvpb_block - Key-value parameter block access information
+ * @base: Pointer to the start of physically mapped key-value block data
+ * @size: Size of one region (one data copy) of parameter block
+ * @flags: Block state flags:
+ *     %KVPB_DESC_DOUBLE - the information is stored in two consecutive redundant copies/regions;
+ *     %KVPB_DESC_USE2ND - data will be read from the second copy because first one is damaged;
+ *     %KVPB_DESC_VALID - at least one region is valid;
+ *     %KVPB_DESC_RO - because of some problems, only read access is allowed
+ *      %KVPB_DESC_CHUNKWO - chunk can be written only once between erase operations 
+ *     %KVPB_DESC_ALIGN4 - data has to be aligned to four bytes
+ *     %KVPB_DESC_FLASH - flash memory is used for data storage
+ * @psum1: Pointer to the control checksum of the first data region
+ * @psum2: Pointer to the control checksum of the second data region
+ * @erase: Function to erase some range of the storage region
+ * @copy: Function to copy data into or between storage regions
+ * @flush: Function to finish pending copy operations
+ * @chunk_size: Minimal store chunk size which can be independently modified
+ *
+ * File: keyvalpb.h
+ */
+typedef struct kvpb_block {
+  KVPB_DPTRTYPE uint8_t *base;
+  kvpb_size_t size;
+  short flags;
+  KVPB_DPTRTYPE kvpb_sum_t *psum1;
+  KVPB_DPTRTYPE kvpb_sum_t *psum2;
+ #ifndef  KVPB_MINIMALIZED
+  int (*erase)(struct kvpb_block *store, void *base,int size);
+  int (*copy)(struct kvpb_block *store, void *des,const void *src,int len);
+  int (*flush)(struct kvpb_block *store);
+  unsigned chunk_size;
+ #endif  /* KVPB_MINIMALIZED */
+} kvpb_block_t;
+
+
+#define kvpb_region_base(block,regidx) (((block)->base+(regidx*(block)->size)))
+
+#ifndef  KVPB_MINIMALIZED
+ #ifndef kvpb_chunk_size
+   #define kvpb_chunk_size(store) ((store)->chunk_size<4?4:(store)->chunk_size)
+ #endif /*kvpb_chunk_size*/
+ #define kvpb_chunk_size_mask(store) (kvpb_chunk_size(store)-1)
+/**
+ * kvpb_chunk_align - Round up KVPB size to minimal store chunk size multiple
+ * @store: Pointer to the KVPB access information/state structure
+ * @size: Unaligned size
+ *
+ * Return Value: Minimal aligned size to hold unaligned size.
+ * File: keyvalpb.h
+ */
+ static inline unsigned kvpb_chunk_align(struct kvpb_block *store, unsigned size)
+ {
+   return ((size)+kvpb_chunk_size_mask(store))&~kvpb_chunk_size_mask(store);
+ }
+
+/**
+ * kvpb_psum_align - Round up KVPB size to minimal store chunk size multiple
+ * @store: Pointer to the KVPB access information/state structure
+ * @psum: Pointer to proposed location of next check sum location 
+ *
+ * Return Value: Pointer to next check sum location rounded down to next slot.
+ * File: keyvalpb.h
+ */
+ static inline kvpb_sum_t* kvpb_psum_align(struct kvpb_block *store, kvpb_sum_t *psum)
+ {
+   unsigned long mask=~kvpb_chunk_size_mask(store);
+   if(store->flags&KVPB_DESC_CHUNKWO)
+     mask<<=1;
+   return (kvpb_sum_t*)(((unsigned long)(psum))&mask);
+ }
+
+/**
+ * kvpb_psum_valid_loc - Return pointer to check sum validity info location
+ * @store: Pointer to the KVPB access information/state structure
+ * @psum: Pointer to corectly aligned check sum location
+ *
+ * Return Value: Pointer to location which indicates by zero value, that check sum
+ *               is invalidated.
+ * File: keyvalpb.h
+ */
+ static inline kvpb_sum_t* kvpb_psum_valid_loc(struct kvpb_block *store, kvpb_sum_t *psum)
+ {
+   if(!(store->flags&KVPB_DESC_CHUNKWO))
+     return psum;
+   else
+     return (kvpb_sum_t*)(((char *)(psum))+kvpb_chunk_size(store));
+ }
+
+/**
+ * kvpb_block_erase - Wrapper function to call KVPB specific data erase function
+ * @store: Pointer to the KVPB access information/state structure
+ * @base: Base address of erased region inside parameter block data region
+ * @size: Number of bytes to erase
+ *
+ * The KVPB mechanism is intended for FLASH type memories and it expect
+ * that only whole data region can be erased at time. The expected erase state
+ * is all bits set to the ones.
+ *
+ * Return Value: Negative value indicates operation fault.
+ * File: keyvalpb.h
+ */
+ static inline int kvpb_block_erase(struct kvpb_block *store, void *base,int size)
+ {
+   return store->erase(store, base,size) ; 
+ }
+
+/**
+ * kvpb_block_copy - Wrapper function to call KVPB specific data copy function
+ * @store: Pointer to the KVPB access information/state structure
+ * @des: Address of data destination pointing inside mapped parameter block data region
+ * @src: Address of data source pointing inside mapped parameter block data or RAM memory
+ * @len: Number of bytes to transfer
+ *
+ * Return Value: Negative value indicates operation fault.
+ * File: keyvalpb.h
+ */
+ static inline int kvpb_block_copy(struct kvpb_block *store, void *des,const void *src,int len)
+ {
+   return store->copy(store, des, src, len);
+ }
+
+/**
+ * kvpb_block_flush - Wrapper function to call KVPB specific flush function
+ * @store: Pointer to the KVPB access information/state structure
+ *
+ * Return Value: Negative value indicates operation fault.
+ * File: keyvalpb.h
+ */
+ static inline int kvpb_block_flush(struct kvpb_block *store)
+ {
+   if(!(store->flush)) return 0;
+   return store->flush(store);
+ }
+
+#else /* KVPB_MINIMALIZED */
+ #ifndef kvpb_chunk_size
+  #define kvpb_chunk_size(store) 1
+ #endif /*kvpb_chunk_size*/
+ #define kvpb_chunk_size_mask(store) (kvpb_chunk_size(store)-1)
+ #define kvpb_chunk_align(store,x) \
+               (((x)+kvpb_chunk_size_mask(store))&~kvpb_chunk_size_mask(store))
+ #define kvpb_psum_align(store,x) \
+                ((KVPB_DPTRTYPE kvpb_sum_t*)((unsigned)(x)&~kvpb_chunk_size_mask(store)))
+ #define kvpb_psum_valid_loc(store,x) \
+               ((kvpb_sum_t*)((char*)(x)+0*kvpb_chunk_size(store)))
+ #define kvpb_block_erase(store, base, size) flash_erase(base, size)
+ #define kvpb_block_copy(store, des, src, len) flash_copy(des, src, len) 
+ #define kvpb_block_flush(store) flash_flush() 
+ /* forward declarations for external procedures */
+ int flash_erase(void *base,int size);
+ int flash_copy(void *des,const void *src,int len);
+#ifndef flash_flush
+ int flash_flush(void);
+#endif /* flash_flush */
+#endif /* KVPB_MINIMALIZED */
+
+/**
+ * struct kvpb_key - Header of stored key value pair and structure for iteration over KVPB
+ * @size: Non-aligned byte size of the stored value
+ * @keyid: Ordinal value representing stored data key
+ *
+ * The header structure is followed by @size data bytes in the KVPB storage block.
+ * Because only word aligned write accesses are possible on some architectures
+ * and memory types the whole size of space occupied by one key-value pair is
+ * sum of rounded-up data size kvpb_chunk_align(@size)  and size of header sizeof(kvpb_key_t).
+ */
+typedef struct kvpb_key {
+  kvpb_size_t size;
+  kvpb_keyid_t keyid;
+} kvpb_key_t;
+
+#ifndef KVPB_WITHOUT_HADLE
+ static inline kvpb_keyid_t* kvpb_keyid_valid(struct kvpb_block *store, kvpb_key_t *key)
+ {
+   if(store->flags&KVPB_DESC_CHUNKWO)
+     return (kvpb_keyid_t*)((uint8_t*)key+(kvpb_chunk_align(store,key->size+sizeof(kvpb_key_t))));
+   return &(key->keyid);
+ }
+#else
+  #define kvpb_keyid_valid(store,key) (&((key)->keyid))
+#endif /*KVPB_WITHOUT_HADLE*/
+
+
+#ifndef KVPB_WITHOUT_HADLE
+KVPB_DPTRTYPE kvpb_key_t *kvpb_first(kvpb_block_t *block, uint8_t mode);
+KVPB_DPTRTYPE kvpb_key_t *kvpb_next(kvpb_block_t *block, KVPB_DPTRTYPE kvpb_key_t *key);
+KVPB_DPTRTYPE kvpb_key_t *kvpb_find(kvpb_block_t *block, kvpb_keyid_t keyid, uint8_t mode, KVPB_DPTRTYPE kvpb_key_t *key);
+int kvpb_get_key(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid, kvpb_size_t size, void *buf);
+int kvpb_set_key(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid, kvpb_size_t size, const void *buf);
+int kvpb_err_keys(kvpb_block_t *kvpb_block, kvpb_keyid_t keyid);
+int kvpb_check(kvpb_block_t *kvpb_block, uint8_t mode);
+#else
+extern KVPB_BLOCK_LOC kvpb_block_t kvpb_block_global;
+#define kvpb_block (&kvpb_block_global)
+KVPB_DPTRTYPE kvpb_sum_t *__kvpb_get_psum(KVPB_DPTRTYPE uint8_t *base, kvpb_size_t size);
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_first(uint8_t mode);
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_next(KVPB_DPTRTYPE kvpb_key_t *key);
+KVPB_DPTRTYPE kvpb_key_t *__kvpb_find(kvpb_keyid_t keyid, uint8_t mode, KVPB_DPTRTYPE kvpb_key_t *key);
+int __kvpb_get_key(kvpb_keyid_t keyid, kvpb_size_t size, void *buf);
+int __kvpb_set_key(kvpb_keyid_t keyid, kvpb_size_t size, const void *buf);
+int __kvpb_check(uint8_t mode);
+#define kvpb_get_psum(block, base, size) __kvpb_get_psum(base, size)
+#define kvpb_first(block, mode) __kvpb_first(mode)
+#define kvpb_next(block, key) __kvpb_next(key)
+#define kvpb_find(block, keyid, mode, key) __kvpb_find(keyid, mode, key)
+#define kvpb_get_key(block, keyid, size, buf) __kvpb_get_key(keyid, size, buf)
+#define kvpb_set_key(block, keyid, size, buf) __kvpb_set_key(keyid, size, buf)
+#define kvpb_err_keys(block,keyid) kvpb_set_key(block,keyid,0,NULL) 
+#define kvpb_check(block, mode) __kvpb_check(mode)
+#define kvpb_compact_region(block, mode, keyid) __kvpb_compact_region(mode, keyid)
+#define kvpb_get_cfk(block,mode,size) __kvpb_get_cfk(mode,size)
+#endif
+
+/**
+ * kvpb_for_each - Iterate over all key value pairs
+ * @root: Pointer to the KVPB access information/state structure
+ * @key: Iterator of kvpb_key_t* type
+ * @mode: iteration mode modifier: 0 .. iterate over active/valid data region;
+ *     1 .. iterate over first copy, 2 .. iterate over second copy
+ *
+ * File: keyvalpb.h
+ */
+#define kvpb_for_each(root, key,mode) \
+        for(key=kvpb_first(root,mode);key;\
+            key=kvpb_next(key))
+
+/**
+ * kvpb_for_each - Iterate over all key value pairs matching given key ID
+ * @root: Pointer to the KVPB access information/state structure
+ * @keyid: Ordinal value representing key ID
+ * @key: Iterator of kvpb_key_t* type
+ * @mode: iteration mode modifier: 0 .. iterate over active/valid data region;
+ *     1 .. iterate over first copy, 2 .. iterate over second copy
+ *
+ * File: keyvalpb.h
+ */
+#define kvpb_each_from(root, keyid, mode, key) \
+        for(key=kvpb_find(root,keyid,mode,NULL);key;\
+            key=kvpb_find(root,keyid,mode,key))
+
+#ifdef  KVPB_MINIMALIZED
+#define kvpb_key2data(key) ((void*)(key+1))
+#else  /*KVPB_MINIMALIZED*/
+static inline void* kvpb_key2data(kvpb_key_t *key) { return key+1; }
+#endif  /*KVPB_MINIMALIZED*/
+
+#endif /* _KEYVALPB_H_ */
+
diff --git a/ulan/embedded/libs4c/ulan/CVS/Entries b/ulan/embedded/libs4c/ulan/CVS/Entries
new file mode 100644 (file)
index 0000000..3596bbe
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:27 2005//
+/Makefile.omk/1.3/Tue Jan 31 12:23:04 2006//
+D/uldy////
+D/uloi_lt////
+D/ulsup////
diff --git a/ulan/embedded/libs4c/ulan/CVS/Repository b/ulan/embedded/libs4c/ulan/CVS/Repository
new file mode 100644 (file)
index 0000000..04e3f38
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/ulan
diff --git a/ulan/embedded/libs4c/ulan/CVS/Root b/ulan/embedded/libs4c/ulan/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/ulan/Makefile b/ulan/embedded/libs4c/ulan/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/ulan/Makefile.omk b/ulan/embedded/libs4c/ulan/Makefile.omk
new file mode 100644 (file)
index 0000000..f5ce8e0
--- /dev/null
@@ -0,0 +1,7 @@
+# -*- makefile -*-
+
+SUBDIRS = uldy uloi_lt 
+
+ifeq ($(CONFIG_OC_UL_DRV_SYSLESS),y) 
+SUBDIRS += ul_drv
+endif
diff --git a/ulan/embedded/libs4c/ulan/uldy/CVS/Entries b/ulan/embedded/libs4c/ulan/uldy/CVS/Entries
new file mode 100644 (file)
index 0000000..6c62f88
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Mon Oct  3 12:43:28 2005//
+/Makefile.omk/1.1/Mon Oct  3 12:43:28 2005//
+/uldy_base.c/1.4/Sat Jan 19 00:21:28 2008//
+/uldy_base.h/1.3/Thu Sep 28 00:01:31 2006//
+D
diff --git a/ulan/embedded/libs4c/ulan/uldy/CVS/Repository b/ulan/embedded/libs4c/ulan/uldy/CVS/Repository
new file mode 100644 (file)
index 0000000..49910e0
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/ulan/uldy
diff --git a/ulan/embedded/libs4c/ulan/uldy/CVS/Root b/ulan/embedded/libs4c/ulan/uldy/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/ulan/uldy/Makefile b/ulan/embedded/libs4c/ulan/uldy/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/ulan/uldy/Makefile.omk b/ulan/embedded/libs4c/ulan/uldy/Makefile.omk
new file mode 100644 (file)
index 0000000..ab7d19e
--- /dev/null
@@ -0,0 +1,11 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_ULAN_DY=n
+
+ifeq ($(CONFIG_ULAN_DY),y)
+lib_LIBRARIES = uldy
+
+include_HEADERS  = uldy_base.h
+uldy_SOURCES = uldy_base.c
+
+endif #CONFIG_ULAN_DY
diff --git a/ulan/embedded/libs4c/ulan/uldy/uldy_base.c b/ulan/embedded/libs4c/ulan/uldy/uldy_base.c
new file mode 100644 (file)
index 0000000..af372f9
--- /dev/null
@@ -0,0 +1,276 @@
+#include <system_def.h>
+#include <cpu_def.h>
+#include <uldy_base.h>
+#ifdef UL_WITHOUT_HANDLE
+#include "ul_drv_fnc.h"
+#endif
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+#include <string.h>
+#endif
+
+
+void
+ul_dy_sn2buf(uchar *buf,unsigned long mod_sn)
+{
+  buf[0]=mod_sn>>0;
+  buf[1]=mod_sn>>8;
+  buf[2]=mod_sn>>16;
+  buf[3]=mod_sn>>24;
+}
+
+unsigned long
+ul_dy_buf2sn(const uchar *buf)
+{
+  unsigned long l;
+  l=(unsigned long)buf[0];
+  l+=(unsigned long)buf[1]<<8;
+  l+=(unsigned long)buf[2]<<16;
+  l+=(unsigned long)buf[3]<<24;
+  return l;
+}
+
+int 
+uldy_init(ULDY_PARAM_ul_dyac ULDY_PARAM_ul_fd ulf_save_sn save_sn, ulf_save_adr save_adr,
+    char *idstr, uint32_t sn)
+{
+  ul_dyac->f_save_sn=save_sn;
+  ul_dyac->f_save_adr=save_adr;
+  ul_dyac->ul_sn=sn;
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_set_sn(sn);
+ #endif
+ #ifdef UL_WITHOUT_HANDLE
+    ul_dyac->ul_idstr=ul_idstr.name;
+    ul_dyac->ul_idstr_len=ul_idstr.len;        
+ #else
+    ul_dyac->ul_idstr=idstr;
+    ul_dyac->ul_idstr_len=strlen(idstr);
+ #endif
+  ul_dyac->boot_activated=0;
+ #ifdef CONFIG_OC_UL_DRV_SYSLESS
+  ul_dyac->ul_fd=ul_fd;
+  ul_dyac->ul_dysa=0;
+  ul_dyac->ul_fld=0;
+ #endif
+ return 0;
+}
+
+#define ULDY_TMBUF_LEN 5
+
+UL_DYAC_VAR_LOC uchar uldy_tmpbuf[ULDY_TMBUF_LEN];
+
+int 
+uldy_i_open(ULDY_PARAM_ul_dyac UL_ARGPTRTYPE ul_msginfo *msginfo)
+{
+ int ret;
+
+ if(msginfo->sadr<=0){
+    ret=ul_acceptmsg(ul_dyac->ul_fd, msginfo);
+    if(ret<0){
+      return -1;
+    }
+    if((msginfo->cmd!=UL_CMD_NCS)||
+       (msginfo->len<1)||
+       (msginfo->flg&UL_BFL_FAIL)) {
+     #ifdef ul_i_close
+      ul_i_close(ul_dyac->ul_fd);
+     #else
+      ul_abortmsg(ul_dyac->ul_fd);
+     #endif
+      return -1;
+    }
+  }else{
+    if((msginfo->cmd!=UL_CMD_NCS)||
+       (msginfo->len<1)||
+       (msginfo->flg&UL_BFL_FAIL))
+      return -1;
+  }
+
+  return 1;
+}
+
+int 
+uldy_rqa(ULDY_PARAM1_ul_dyac) 
+{
+ #ifndef CONFIG_OC_UL_DRV_SYSLESS
+  return ul_drv_rqa();
+ #else
+  int r;
+  r=ul_dyac->ul_fld&0x04?1:0;
+  if(r)
+    ul_dyac->ul_fld--;
+  return r;
+ #endif
+}
+
+void 
+uldy_clr_rq(ULDY_PARAM1_ul_dyac)
+{
+ #ifndef CONFIG_OC_UL_DRV_SYSLESS
+   ul_drv_clr_rq();
+ #else
+  ul_dyac->ul_fld&=~0x03;
+ #endif
+}
+
+int 
+uldy_process_msg(ULDY_PARAM_ul_dyac UL_ARGPTRTYPE ul_msginfo *imsginfo)
+{  
+ #ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+  msginfo.sadr=0;
+  msginfo.cmd=0;
+  if (!imsginfo) imsginfo=&msginfo;
+
+  if (uldy_i_open(ULDY_ARG_ul_dyac imsginfo)<0)
+    return -1;
+
+ #ifdef UL_WITHOUT_HANDLE
+  if (imsginfo->flg&UL_BFL_PROC) {
+    ul_i_close(ul_dyac->ul_fd);
+    return 0;
+  }
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+  if (ul_read(ul_dyac->ul_fd, uldy_tmpbuf,1)!=1) {
+    ul_freemsg(ul_dyac->ul_fd);
+    return -1;
+  }
+
+  switch (uldy_tmpbuf[0]) { /* ulncs */
+    case ULNCS_BOOT_ACT:
+      if(ul_read(ul_dyac->ul_fd,uldy_tmpbuf,4)!=4) {
+        ul_freemsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      if (ul_dy_buf2sn(uldy_tmpbuf) != 0)
+        if (ul_dy_buf2sn(uldy_tmpbuf)!=ul_dyac->ul_sn)
+          return -1;
+      imsginfo->dadr=imsginfo->sadr&0x7F;
+      imsginfo->flg=UL_BFL_SND;
+      uldy_tmpbuf[4]=ULNCS_BOOT_ACK;
+      if(ul_newmsg(ul_dyac->ul_fd, imsginfo)<0) return -1;
+      if (ul_write(ul_dyac->ul_fd,&uldy_tmpbuf[4],1)!=1) {
+        ul_abortmsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      if (ul_write(ul_dyac->ul_fd,uldy_tmpbuf,4)!=4) {
+        ul_abortmsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      ul_dyac->boot_activated=1;
+      break;
+    case ULNCS_SID_RQ:     /* send serial num and ID string request */
+      ul_freemsg(ul_dyac->ul_fd);
+      imsginfo->dadr=imsginfo->sadr&0x7F;
+      imsginfo->flg =UL_BFL_ARQ;       // status zpravy
+      //new message
+      if(ul_newmsg(ul_dyac->ul_fd, imsginfo)<0) return -1;
+      uldy_tmpbuf[0]=ULNCS_SID_RPLY;
+      ul_dy_sn2buf(&uldy_tmpbuf[1],ul_dyac->ul_sn);
+      if(ul_write(ul_dyac->ul_fd, uldy_tmpbuf, 5) != 5) {
+        ul_abortmsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      if(ul_write(ul_dyac->ul_fd, 
+                 ul_dyac->ul_idstr,ul_dyac->ul_idstr_len ) != ul_dyac->ul_idstr_len) {
+        ul_abortmsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      break;
+    case ULNCS_SET_ADDR:  /* SN0 SN1 SN2 SN3 NEW_ADR */
+      if(ul_read(ul_dyac->ul_fd,uldy_tmpbuf,5)!=5) {
+        ul_freemsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      if (ul_dy_buf2sn(uldy_tmpbuf)!=ul_dyac->ul_sn) return -1;
+     #ifdef CONFIG_OC_UL_DRV_SYSLESS
+      ul_setmyadr(ul_dyac->ul_fd,uldy_tmpbuf[4]);
+     #else
+      ul_drv_set_adr(uldy_tmpbuf[4]);     
+     #endif
+      uldy_clr_rq(ULDY_ARG1_ul_dyac);
+      break;
+    case ULNCS_ADDR_NVSV: /* SN0 SN1 SN2 SN3 - save addres to EEPROM */
+      if(ul_read(ul_dyac->ul_fd,uldy_tmpbuf,4)!=4) {
+        ul_freemsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      if (ul_dy_buf2sn(uldy_tmpbuf)!=ul_dyac->ul_sn) return -1;
+      ul_dyac->f_save_adr(imsginfo->dadr);
+      break;
+   case ULNCS_SET_SN:{
+      if(ul_read(ul_dyac->ul_fd,uldy_tmpbuf,4)!=4) {
+        ul_freemsg(ul_dyac->ul_fd);
+        return -1;
+      }
+      ul_freemsg(ul_dyac->ul_fd);
+      ul_dyac->ul_sn=ul_dy_buf2sn(uldy_tmpbuf);
+     #ifdef UL_WITHOUT_HANDLE
+      ul_drv_set_sn(ul_dyac->ul_sn);
+     #endif 
+      ul_dyac->f_save_sn(ul_dyac->ul_sn);
+      };break;
+    default:
+      break;
+  }
+  return 0;
+}
+
+int 
+uldy_addr_rq(ULDY_PARAM1_ul_dyac)
+{
+#ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+#endif /*UL_WITHOUT_HANDLE*/
+ #ifdef UL_WITHOUT_HANDLE
+  msginfo.dadr=(ul_drv_get_dysa())&0x7F;     // dadr
+ #else
+  msginfo.dadr=(ul_dyac->ul_dysa)&0x7F;      // dadr
+ #endif
+  msginfo.cmd =UL_CMD_NCS;    // cmd
+  msginfo.flg =UL_BFL_ARQ | UL_BFL_SND;    // status zpravy
+  msginfo.stamp=0;            // stamp
+  if(ul_newmsg(ul_dyac->ul_fd, &msginfo)<0) return -1;
+  uldy_tmpbuf[0]=ULNCS_ADR_RQ;
+  ul_dy_sn2buf(&uldy_tmpbuf[1],ul_dyac->ul_sn);
+  if(ul_write(ul_dyac->ul_fd, uldy_tmpbuf, 5) != 5) return -1;
+  ul_freemsg(ul_dyac->ul_fd);
+  return 0;
+}
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+
+int 
+ul_iac_call_gst(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data)
+{
+  ul_dyac_t *ul_dyac;
+  
+  ul_dyac=(ul_dyac_t*)data->ctx;
+  if (msginfo->len<1) return UL_IAC_RC_PROC;
+  if (!(ibuff[0]&0xfc)) {
+    if (!(ul_dyac->ul_fld&0x04)) {
+      ul_dyac->ul_fld++;
+      if (ul_dyac->ul_fld&0x04) {
+        ul_dyac->ul_dysa=msginfo->sadr;
+        if (ibuff[0]==0) 
+         ul_setmyadr(ul_dyac->ul_fd,0);
+      }
+    }
+  } else {
+    if ((ibuff[0]&0xf0)==0x10) {
+      
+    }
+  }  
+  return UL_IAC_RC_PROC;
+}
+
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
diff --git a/ulan/embedded/libs4c/ulan/uldy/uldy_base.h b/ulan/embedded/libs4c/ulan/uldy/uldy_base.h
new file mode 100644 (file)
index 0000000..5e4f1dd
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef _UL_DYAC_H
+#define _UL_DYAC_H
+
+#include <ul_lib/ulan.h>
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+#ifndef UL_ARGPTRTYPE
+#define UL_ARGPTRTYPE
+#endif
+
+#ifdef UL_WITHOUT_HANDLE
+ #include <cpu_def.h>
+ #include <types.h>
+ #ifndef UL_DYAC_VAR_LOC
+  #define UL_DYAC_VAR_LOC xdata
+ #endif
+  extern ul_idstr_t CODE ul_idstr;
+#else
+  #define UL_DYAC_VAR_LOC
+#endif
+
+#ifdef SDCC
+#define UL_DYAC_REENTRANT reentrant
+#else
+#define UL_DYAC_REENTRANT
+#endif
+
+typedef char    (*ulf_save_sn)(uint32_t usn) UL_DYAC_REENTRANT; 
+typedef char    (*ulf_save_adr)(uint8_t uaddr) UL_DYAC_REENTRANT; 
+
+typedef struct ul_dyac_t {
+  ulf_save_sn  f_save_sn; 
+  ulf_save_adr f_save_adr;
+  uint32_t ul_sn;
+  char *ul_idstr;
+  uint8_t ul_idstr_len;
+  char boot_activated;
+ #ifdef CONFIG_OC_UL_DRV_SYSLESS
+  ul_fd_t ul_fd;
+  uint8_t ul_dysa;
+  uint8_t ul_fld;
+ #endif /* CONFIG_OC_UL_DRV_SYSLESS */
+} ul_dyac_t;
+
+#ifdef UL_WITHOUT_HANDLE
+  #define ULDY_ARG_ul_dyac
+  #define ULDY_ARG1_ul_dyac
+  #define ULDY_PARAM_ul_dyac
+  #define ULDY_PARAM1_ul_dyac
+  #define ULDY_ARG_ul_fd
+  #define ULDY_PARAM_ul_fd
+  #define ul_dyac (&ul_dyac_global)
+  extern UL_DYAC_VAR_LOC ul_dyac_t ul_dyac_global;
+#else  /*UL_WITHOUT_HANDLE*/
+  #define ULDY_ARG_ul_dyac ul_dyac,
+  #define ULDY_ARG1_ul_dyac ul_dyac
+  #define ULDY_PARAM_ul_dyac ul_dyac_t *ul_dyac,
+  #define ULDY_PARAM1_ul_dyac ul_dyac_t *ul_dyac
+  #define ULDY_ARG_ul_fd ul_fd,
+  #define ULDY_PARAM_ul_fd ul_fd_t ul_fd,
+#endif /*UL_WITHOUT_HANDLE*/
+
+int uldy_init(ULDY_PARAM_ul_dyac ULDY_PARAM_ul_fd ulf_save_sn save_sn, ulf_save_adr save_adr,
+    char *idstr, uint32_t sn);
+int uldy_process_msg(ULDY_PARAM_ul_dyac UL_ARGPTRTYPE ul_msginfo *imsginfo);
+int uldy_rqa(ULDY_PARAM1_ul_dyac);
+int uldy_addr_rq(ULDY_PARAM1_ul_dyac);
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+
+#include <ul_drv_iac.h>
+
+void uldy_clr_rq(ul_dyac_t *ul_dyac);
+int ul_iac_call_gst(struct ul_drv *udrv,ul_msginfo *msginfo,char *ibuff,ul_iac_data *data);
+
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_DYAC_H */
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Entries b/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Entries
new file mode 100644 (file)
index 0000000..65c5b26
--- /dev/null
@@ -0,0 +1,10 @@
+/Makefile/1.1/Mon Oct  3 12:43:28 2005//
+/Makefile.omk/1.5/Thu Nov 30 17:17:36 2006//
+/uloi_base.c/1.3/Thu Oct 20 12:36:24 2005//
+/uloi_base.h/1.8/Wed Jan 24 21:19:31 2007//
+/uloi_fchar.c/1.2/Mon Dec  4 13:11:51 2006//
+/uloi_fint.c/1.2/Mon Dec  4 13:11:52 2006//
+/uloi_flong.c/1.2/Mon Dec  4 13:11:52 2006//
+/uloi_ioulan.c/1.1/Tue Oct  4 17:32:22 2005//
+/uloi_testlt.c/1.1/Mon Oct  3 12:43:28 2005//
+D
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Repository b/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Repository
new file mode 100644 (file)
index 0000000..a4e285d
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/ulan/uloi_lt
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Root b/ulan/embedded/libs4c/ulan/uloi_lt/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/Makefile b/ulan/embedded/libs4c/ulan/uloi_lt/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/Makefile.omk b/ulan/embedded/libs4c/ulan/uloi_lt/Makefile.omk
new file mode 100644 (file)
index 0000000..86ecb04
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_ULOI_LT=n
+default_CONFIG += CONFIG_ULOI_TEST_APP=n
+default_CONFIG += CONFIG_ULOI_GENOBJIDTAG=x
+
+INCLUDES += -I$(USER_INCLUDE_DIR)/ul_lib
+
+ifeq ($(CONFIG_ULOI_LT),y) 
+lib_LIBRARIES = uloi
+include_HEADERS += uloi_base.h
+uloi_SOURCES += uloi_base.c uloi_ioulan.c uloi_fchar.c uloi_fint.c uloi_flong.c
+
+ifeq ($(CONFIG_ULOI_TEST_APP),y) 
+bin_PROGRAMS = uloi_testlt
+uloi_testlt_SOURCES = uloi_testlt.c
+
+lib_LOADLIBES = uloi ulan
+ifeq ($(CONFIG_DEV_MSC1210),y) 
+lib_LOADLIBES += misc
+endif #CONFIG_DEV_MSC1210
+ifeq ($(CONFIG_OC_UL_DRV_SYSLESS),y) 
+lib_LOADLIBES += bspbase
+uloi_testlt_MOREOBJS = $(USER_LIB_DIR)/system_stub.o
+endif #CONFIG_UL_DRV_SYSLESS
+
+endif #CONFIG_ULOI_TEST_APP
+
+endif #CONFIG_ULOI_LT
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.c
new file mode 100644 (file)
index 0000000..e057888
--- /dev/null
@@ -0,0 +1,533 @@
+#include <uloi_base.h>
+#include <string.h>
+#include <limits.h>
+
+UL_ARGPTRTYPE uchar uloi_tmpbuf[ULOI_TMBUF_LEN];
+
+/*===========================================================*/
+
+#if 0
+
+#include <ul_gsa.h>
+#include <ul_gsacust.h>
+
+
+
+GSA_STATIC_CUST_DEC(uloi_objdes_array, uloi_objdes_array_t, uloi_objdes_t, uloi_oid_t,
+       array, oid, uloi_oid_cmp_fnc)
+
+inline int
+uloi_oid_cmp_fnc(const uloi_oid_t *a, const uloi_oid_t *b)
+{
+  if (*a>*b) return 1;
+  if (*a<*b) return -1;
+  return 0;
+}
+
+GSA_STATIC_CUST_IMP(uloi_objdes_array, uloi_objdes_array_t, uloi_objdes_t, uloi_oid_t,
+       array, oid, uloi_oid_cmp_fnc, 0)
+
+#else
+
+int
+uloi_objdes_array_bsearch_indx (const uloi_objdes_array_t * array,
+                               const uloi_oid_t key)
+{
+  unsigned a, b, c;
+  int r;
+  if (!array->array.items || !array->array.count){
+    return -1;
+  }
+  a = 0;
+  b = array->array.count;
+  while (1){
+    c = (a + b) / 2;
+    r = array->array.items[c]->oid - key;
+    if (!r)
+      break;
+    if (r <= 0)
+      a = c + 1;
+    else
+      b = c;
+    if (a == b) {
+      return -a-1;
+    }
+  }
+  return c;
+}
+
+uloi_objdes_t *
+uloi_objdes_array_at (const uloi_objdes_array_t * array, unsigned indx)
+{
+  if (indx >= array->array.count)
+    return NULL;
+  return array->array.items[indx];
+}
+
+uloi_objdes_t *
+uloi_objdes_array_find (const uloi_objdes_array_t * array, uloi_oid_t * key)
+{
+  int indx;
+  indx=uloi_objdes_array_bsearch_indx (array, *key);
+  if (indx<0)
+    return NULL;
+  return array->array.items[indx];
+}
+
+unsigned
+uloi_objdes_array_find_indx (const uloi_objdes_array_t * array,
+                                  uloi_oid_t * key)
+{
+  int indx;
+  indx=uloi_objdes_array_bsearch_indx (array, *key);
+  if (indx<0)
+    return -1;
+  return indx;
+}
+
+unsigned
+uloi_objdes_array_find_after_indx (const uloi_objdes_array_t * array,
+                                  uloi_oid_t * key)
+{
+  int indx;
+  indx=uloi_objdes_array_bsearch_indx (array, *key);
+  if(indx>=0)
+    indx++;
+  else
+    indx=-(indx+1);
+  return indx;
+}
+
+#endif
+
+/*===========================================================*/
+
+#ifndef SDCC
+
+static inline
+int uloi_call_objdes_fnc(ULOI_PARAM_coninfo int (*fnc)(ULOI_PARAM_coninfo void *context), void *context)
+{
+  return fnc(ULOI_ARG_coninfo context);
+}
+
+#else /*SDCC*/
+
+/* This is catastrophic. SDCC should understand, that function which accept
+   parameters only over registers does not need to be reentrant for call over pointer */
+
+int uloi_call_objdes_fnc(int (*fnc)(ULOI_PARAM_coninfo void *context), void *context) _naked
+{
+  _asm
+       push dpl
+       push dph
+    #ifdef SDCC_MODEL_LARGE
+       mov     dptr,#_uloi_call_objdes_fnc_PARM_2
+       movx    a,@dptr
+       mov     r2,a
+       inc     dptr
+       movx    a,@dptr
+       mov     r3,a
+       inc     dptr
+       movx    a,@dptr
+       mov     dpl,r2
+       mov     dph,r3
+       mov     b,a
+    #else /*SDCC_MODEL_LARGE*/
+       mov     dpl,_uloi_call_objdes_fnc_PARM_2+0
+       mov     dph,_uloi_call_objdes_fnc_PARM_2+1
+       mov     b,_uloi_call_objdes_fnc_PARM_2+2
+    #endif /*SDCC_MODEL_LARGE*/
+       ret
+  _endasm;
+}
+
+
+#endif /*SDCC*/
+
+/*===========================================================*/
+
+int uloi_i_read_str(ULOI_PARAM_coninfo void UL_ARGPTRTYPE *str, uchar max_len)
+{
+  uchar len;
+  if(coninfo->error)
+    return -1;
+  if(uloi_i_read(ULOI_ARG_coninfo str, 1)!=1)
+    goto conerr;
+  if(coninfo->error)
+    goto conerr;
+  if(max_len<(len=*(uchar*)str))
+    goto conerr;
+  if(uloi_i_read(ULOI_ARG_coninfo str, len)!=len)
+    goto conerr;
+  if(coninfo->error)
+    goto conerr;
+  return len;
+  
+  conerr:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_o_reply_oid(ULOI_PARAM_coninfo uloi_oid_t oid)
+{
+  int ret;
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[2];
+ #endif
+
+  if(coninfo->error)
+    return -1;
+
+  if(!(coninfo->state&ULOI_CONINFO_OUTOPEN))
+    ret=uloi_o_open(ULOI_ARG1_coninfo);
+
+  if(coninfo->error)
+    return -1;
+
+  uloi_tmpbuf[0]=oid;
+  uloi_tmpbuf[1]=oid>>8;
+
+  if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 2)!=2){
+    uloi_o_close(ULOI_ARG1_coninfo);
+    coninfo->error=1;
+    return -1;
+  }
+  return 1;
+}
+
+int uloi_i_resolve_objdes(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array, uloi_objdes_t **pobjdes)
+{
+  int ret;
+  uloi_oid_t oid;
+  uloi_objdes_t *objdes;
+  unsigned indx;
+  uchar len;
+  const uchar *p;
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[ULOI_TMBUF_LEN];
+ #endif
+
+  if(coninfo->error)
+    return -1;
+
+  ret=uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2);
+  if(coninfo->error)
+    goto conerr;
+
+  if(!ret){
+    *pobjdes=NULL;
+    return 0;
+  }
+
+  if(ret!=2)
+    goto conerr;
+
+  oid=uloi_tmpbuf[0]+((unsigned)uloi_tmpbuf[1]<<8);
+
+  if(!oid){
+    *pobjdes=NULL;
+    return 0;
+  }
+
+  if(oid==ULOI_AOID){
+    /* read ascii specified OID */
+    len=uloi_i_read_str(ULOI_ARG_coninfo uloi_tmpbuf, ULOI_TMBUF_LEN);
+    if(coninfo->error)
+      goto conerr;
+
+    indx=0;
+    while((objdes=uloi_objdes_array_at(objdes_array,indx++))){
+      if(!(p=objdes->aoid))
+       continue;
+      if(p[0]<3)
+       continue;
+      if(p[1]!=len)
+       continue;
+      if(!memcmp(p+2,uloi_tmpbuf,len))
+       break;
+    }
+  }else{
+    objdes=uloi_objdes_array_find(objdes_array, &oid);
+  }
+
+  if(!objdes)
+    goto conerr;
+  
+  *pobjdes=objdes;
+  return 1;
+
+  conerr:
+    *pobjdes=NULL;
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_i_resolve_objdesindx(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array)
+{
+  int ret;
+  uloi_oid_t oid;
+  uloi_objdes_t *objdes;
+  unsigned indx;
+  uchar len;
+  const uchar *p;
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[ULOI_TMBUF_LEN];
+ #endif
+
+  if(coninfo->error)
+    return -1;
+
+  ret=uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2);
+  if(coninfo->error || (ret!=2))
+    goto conerr;
+
+  oid=uloi_tmpbuf[0]+((unsigned)uloi_tmpbuf[1]<<8);
+
+  if(!oid){
+    return 0;
+  }
+
+  if(oid==ULOI_AOID){
+    /* read ascii specified OID */
+    len=uloi_i_read_str(ULOI_ARG_coninfo uloi_tmpbuf, ULOI_TMBUF_LEN);
+    if(coninfo->error)
+      goto conerr;
+
+    indx=0;
+    while((objdes=uloi_objdes_array_at(objdes_array,indx++))){
+      if(!(p=objdes->aoid))
+       continue;
+      if(p[0]<3)
+       continue;
+      if(p[1]!=len)
+       continue;
+      if(!memcmp(p+2,uloi_tmpbuf,len))
+       break;
+    }
+  }else{
+    indx=uloi_objdes_array_find_indx(objdes_array, &oid);
+  }
+
+  return indx;
+
+  conerr:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_i_read_count(ULOI_PARAM1_coninfo)
+{
+  int ret;
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[2];
+ #endif
+
+  if(coninfo->error)
+    return -1;
+
+  ret=uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2);
+  if(coninfo->error)
+    goto conerr;
+
+  if(ret!=2)
+    goto conerr;
+
+  return uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8);
+
+  conerr:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+/*===========================================================*/
+
+int uloi_process_msg(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array, UL_ARGPTRTYPE ul_msginfo *imsginfo)
+{
+  int ret;
+  uloi_objdes_t *objdes;
+
+  coninfo->state=0;
+  coninfo->error=0;
+
+  ret=uloi_i_open(ULOI_ARG_coninfo imsginfo);
+  if(coninfo->error)
+    return -1;
+  
+  while(!coninfo->error){
+    ret=uloi_i_resolve_objdes(ULOI_ARG_coninfo objdes_array, &objdes);
+
+    if(ret<=0){
+      break;
+    }
+
+    if(!objdes->wrfnc){
+      coninfo->error=1;
+      break;
+    }
+
+    /*So simple, but SDCC cannot cope without reentrant there,
+      but overhead of reentrant function code is unacceptable there */
+    /*objdes->wrfnc(ULOI_ARG_coninfo objdes->wrcontext);*/
+    uloi_call_objdes_fnc(ULOI_ARG_coninfo objdes->wrfnc, objdes->wrcontext);
+  }
+
+  if(coninfo->state&ULOI_CONINFO_OUTOPEN)
+    uloi_o_close(ULOI_ARG1_coninfo);
+
+  uloi_i_close(ULOI_ARG1_coninfo);
+  
+  return 0;
+}
+
+int uloi_rdrq_fnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_objdes_array_t *objdes_array=(uloi_objdes_array_t *)context;
+  int ret;
+  uloi_objdes_t *objdes;
+
+  if(uloi_o_reply_oid(ULOI_ARG_coninfo ULOI_RDRQ+1)<0)
+    return -1;
+
+  while(!coninfo->error){
+    ret=uloi_i_resolve_objdes(ULOI_ARG_coninfo objdes_array, &objdes);
+
+    if(ret<=0){
+      break;
+    }
+
+    if(uloi_o_reply_oid(ULOI_ARG_coninfo objdes->oid)<0)
+      break;
+
+    if(!objdes->rdfnc){
+      coninfo->error=1;
+      break;
+    }
+
+    /*So simple, but SDCC cannot cope without reentrant there,
+      but overhead of reentrant function code is unacceptable there */
+    /*objdes->rdfnc(ULOI_ARG_coninfo objdes->rdcontext);*/
+    uloi_call_objdes_fnc(ULOI_ARG_coninfo objdes->rdfnc, objdes->rdcontext);
+  }
+
+  uloi_o_reply_oid(ULOI_ARG_coninfo 0);
+
+  if(coninfo->state&ULOI_CONINFO_OUTOPEN)
+    uloi_o_close(ULOI_ARG1_coninfo);
+
+  return 1;
+}
+
+
+int uloi_process_doix(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array, uloi_oid_t reply_oid, unsigned flags)
+{
+  int ret;
+  uloi_objdes_t *objdes;
+  int len;
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[1];
+ #endif
+
+  ret=uloi_i_resolve_objdes(ULOI_ARG_coninfo objdes_array, &objdes);
+  if(ret<=0)
+    goto conerr;
+
+  if((flags&1) && !objdes->rdfnc)
+    goto conerr;
+
+  if((flags&2) && !objdes->wrfnc)
+    goto conerr;
+
+  if(uloi_o_reply_oid(ULOI_ARG_coninfo reply_oid)<0)
+    goto conerr;
+
+  if(uloi_o_reply_oid(ULOI_ARG_coninfo objdes->oid)<0)
+    goto conerr;
+
+  if(!objdes->aoid){
+    uloi_tmpbuf[0]=0;
+    if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 1)!=1)
+      goto conerr;
+  }else{
+    len=*(uchar*)objdes->aoid+1;
+    if(uloi_o_write(ULOI_ARG_coninfo objdes->aoid, len)!=len)
+      goto conerr;
+  }
+
+  return 1;
+
+  conerr:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_doii_fnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_objdes_array_t *objdes_array=(uloi_objdes_array_t *)context;
+  return uloi_process_doix(ULOI_ARG_coninfo objdes_array, ULOI_DOII+1, 2);
+}
+
+int uloi_doio_fnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_objdes_array_t *objdes_array=(uloi_objdes_array_t *)context;
+  return uloi_process_doix(ULOI_ARG_coninfo objdes_array, ULOI_DOIO+1, 1);
+}
+
+
+int uloi_process_qoix(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array, uloi_oid_t reply_oid, unsigned flags)
+{
+  int indx;
+  int count;
+  uloi_objdes_t *objdes;
+
+  indx=uloi_i_resolve_objdesindx(ULOI_ARG_coninfo objdes_array);
+
+  if(indx<0){
+    goto conerr;
+  }
+
+  if(uloi_o_reply_oid(ULOI_ARG_coninfo reply_oid)<0)
+    goto conerr;
+
+  if((count=uloi_i_read_count(ULOI_ARG1_coninfo))<0)
+    goto conerr;
+
+  while(count&&(objdes=uloi_objdes_array_at(objdes_array,indx++))){
+    if((flags&1) && !objdes->rdfnc)
+      continue;
+
+    if((flags&2) && !objdes->wrfnc)
+      continue;
+
+    if(uloi_o_reply_oid(ULOI_ARG_coninfo objdes->oid)<0)
+      goto conerr;
+
+    count--;
+  }
+
+  if(uloi_o_reply_oid(ULOI_ARG_coninfo 0)<0)
+    goto conerr;
+
+  return 1;
+
+  conerr:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_qoii_fnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_objdes_array_t *objdes_array=(uloi_objdes_array_t *)context;
+  return uloi_process_qoix(ULOI_ARG_coninfo objdes_array, ULOI_QOII+1, 2);
+}
+
+int uloi_qoio_fnc(ULOI_PARAM_coninfo void *context)
+{
+  uloi_objdes_array_t *objdes_array=(uloi_objdes_array_t *)context;
+  return uloi_process_qoix(ULOI_ARG_coninfo objdes_array, ULOI_QOIO+1, 1);
+}
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.h b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_base.h
new file mode 100644 (file)
index 0000000..6d2b075
--- /dev/null
@@ -0,0 +1,159 @@
+#ifndef _ULOI_BASE_H
+#define _ULOI_BASE_H
+
+#include <stdlib.h>
+#include <ul_lib/ulan.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef UL_ARGPTRTYPE
+#define UL_ARGPTRTYPE
+#endif
+
+#ifndef NULL_FNC
+#ifndef SDCC
+  #define ULOI_CODE
+  #define NULL_CODE NULL
+#else /*SDCC*/
+  #define ULOI_CODE code
+  #define NULL_CODE (0)
+#endif /*SDCC*/
+#endif /*NULL_FNC*/
+
+#ifndef ULOI_GENOBJIDTAG
+  #ifdef CONFIG_ULOI_GENOBJIDTAG
+    #define ULOI_GENOBJIDTAG(_name,_oid) \
+      void uloid_objidtag_note_##_name () __attribute__ ((alias (#_oid)));
+      /*__NUM2ASM(uloid_objidtag_##_name,_oid)*/
+  #endif /*CONFIG_ULOI_GENOBJIDTAG*/
+#endif /*ULOI_GENOBJIDTAG*/
+
+#ifndef ULOI_GENOBJIDTAG
+  #define ULOI_GENOBJIDTAG(_name,_oid)
+#endif /*ULOI_GENOBJIDTAG*/
+
+
+#define ULOI_TMBUF_LEN 30
+
+#ifdef UL_WITHOUT_HANDLE
+  #define ULOI_ARG_coninfo
+  #define ULOI_ARG1_coninfo
+  #define ULOI_PARAM_coninfo
+  #define ULOI_PARAM1_coninfo
+  #define coninfo (&uloi_coninfo_global)
+  extern uloi_coninfo_t uloi_coninfo_global;
+  extern UL_ARGPTRTYPE uchar uloi_tmpbuf[ULOI_TMBUF_LEN];
+#else  /*UL_WITHOUT_HANDLE*/
+  #define ul_ssize_t ssize_t
+  #define ULOI_ARG_coninfo coninfo,
+  #define ULOI_ARG1_coninfo coninfo
+  #define ULOI_PARAM_coninfo uloi_coninfo_t *coninfo,
+  #define ULOI_PARAM1_coninfo uloi_coninfo_t *coninfo
+#endif /*UL_WITHOUT_HANDLE*/
+
+#define ULOI_CONINFO_OUTOPEN 1
+
+typedef unsigned uloi_oid_t;
+
+typedef struct uloi_objdes_t {
+  uloi_oid_t oid;
+  const ULOI_CODE void *aoid;
+  int (*rdfnc)(ULOI_PARAM_coninfo void *context);
+  void *rdcontext;
+  int (*wrfnc)(ULOI_PARAM_coninfo void *context);
+  void *wrcontext;
+} uloi_objdes_t;
+
+#define ULOI_GENAOID2(_name,_type) \
+  const ULOI_CODE struct {char len_all; \
+          char len_name; \
+         char val_name[sizeof(#_name)-1]; \
+          char len_type; \
+         char val_type[sizeof(_type)-1]; \
+  } uloi_aoid_##_name={ \
+    sizeof(#_name)+sizeof(_type), \
+    sizeof(#_name)-1, \
+    #_name, \
+    sizeof(_type)-1, \
+    _type \
+  };
+
+#define ULOI_GENOBJDES_RAW(_oid,_aoid,_rdfnc,_rdcontext,_wrfnc,_wrcontext) \
+{ \
+  _oid, \
+  _aoid, \
+  _rdfnc, \
+  _rdcontext, \
+  _wrfnc, \
+  _wrcontext \
+};
+
+#define ULOI_GENOBJDES(_name,_oid,_type,_rdfnc,_rdcontext,_wrfnc,_wrcontext) \
+ULOI_GENAOID2(_name,_type) \
+const ULOI_CODE uloi_objdes_t uloid_objdes_##_name = \
+ULOI_GENOBJDES_RAW(_oid,&uloi_aoid_##_name,_rdfnc,_rdcontext,_wrfnc,_wrcontext) \
+ULOI_GENOBJIDTAG(_name,_oid)
+
+#define ULOI_GENOBJDES_STD(_name,_oid,_type,_rdfnc,_rdcontext,_wrfnc,_wrcontext) \
+
+
+typedef struct uloi_objdes_array_t {
+  /*gsa_array_field_t;*/
+  struct {
+    uloi_objdes_t **items;
+    unsigned count;
+    unsigned alloc_count;
+  } array;
+} uloi_objdes_array_t;
+
+
+uloi_objdes_t *
+uloi_objdes_array_at (const uloi_objdes_array_t * array, unsigned indx);
+
+uloi_objdes_t *
+uloi_objdes_array_find (const uloi_objdes_array_t * array, uloi_oid_t * key);
+
+unsigned
+uloi_objdes_array_find_indx (const uloi_objdes_array_t * array,
+                                  uloi_oid_t * key);
+
+unsigned
+uloi_objdes_array_find_after_indx (const uloi_objdes_array_t * array,
+                                  uloi_oid_t * key);
+
+
+int uloi_i_open(ULOI_PARAM_coninfo UL_ARGPTRTYPE ul_msginfo *imsginfo);
+int uloi_o_open(ULOI_PARAM1_coninfo);
+int uloi_i_close(ULOI_PARAM1_coninfo);
+int uloi_o_close(ULOI_PARAM1_coninfo);
+ul_ssize_t uloi_i_read(ULOI_PARAM_coninfo void *buffer, size_t size);
+ul_ssize_t uloi_o_write(ULOI_PARAM_coninfo const void *buffer, size_t size);
+
+int uloi_process_msg(ULOI_PARAM_coninfo uloi_objdes_array_t *objdes_array, UL_ARGPTRTYPE ul_msginfo *imsginfo);
+
+int uloi_doii_fnc(ULOI_PARAM_coninfo void *context);
+int uloi_doio_fnc(ULOI_PARAM_coninfo void *context);
+int uloi_qoii_fnc(ULOI_PARAM_coninfo void *context);
+int uloi_qoio_fnc(ULOI_PARAM_coninfo void *context);
+int uloi_rdrq_fnc(ULOI_PARAM_coninfo void *context);
+
+int uloi_char_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_char_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_uchar_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_uchar_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_int_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_int_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_uint_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_uint_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_long_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_long_wrfnc(ULOI_PARAM_coninfo void *context);
+int uloi_ulong_rdfnc(ULOI_PARAM_coninfo void *context);
+int uloi_ulong_wrfnc(ULOI_PARAM_coninfo void *context);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_ULOI_BASE_H*/
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_fchar.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_fchar.c
new file mode 100644 (file)
index 0000000..1a02fe4
--- /dev/null
@@ -0,0 +1,38 @@
+#include <uloi_base.h>
+#include <limits.h>
+
+int uloi_char_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[1];
+ #endif
+  uloi_tmpbuf[0]=*(char*)context;
+  if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 1)!=1){
+    coninfo->error=1;
+    return -1;
+  }
+  return 0;
+}
+
+int uloi_char_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[1];
+ #endif
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 1)!=1){
+    coninfo->error=1;
+    return -1;
+  }
+  *(char*)context=uloi_tmpbuf[0];
+  return 0;
+}
+
+int uloi_uchar_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_char_rdfnc(ULOI_ARG_coninfo context);
+}
+
+int uloi_uchar_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_char_wrfnc(ULOI_ARG_coninfo context);
+}
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_fint.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_fint.c
new file mode 100644 (file)
index 0000000..528089b
--- /dev/null
@@ -0,0 +1,62 @@
+#include <uloi_base.h>
+#include <limits.h>
+
+int uloi_int_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[2];
+ #endif
+  uloi_tmpbuf[0]=*(int*)context;
+  uloi_tmpbuf[1]=*(int*)context>>8;
+  if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 2)!=2){
+    coninfo->error=1;
+    return -1;
+  }
+  return 0;
+}
+
+int uloi_int_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[2];
+ #endif
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2)!=2){
+    coninfo->error=1;
+    return -1;
+  }
+ #if INT_MAX>32767
+  *(int*)context=uloi_tmpbuf[0]+((int)(signed char)uloi_tmpbuf[1]<<8);
+ #else
+  *(int*)context=uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8);
+ #endif
+  return 0;
+}
+
+int uloi_uint_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_int_rdfnc(ULOI_ARG_coninfo context);
+}
+
+#if INT_MAX<=32767
+
+int uloi_uint_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_int_wrfnc(ULOI_ARG_coninfo context);
+}
+
+#else /*INT_MAX>32767*/
+
+int uloi_uint_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[2];
+ #endif
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2)!=2){
+    coninfo->error=1;
+    return -1;
+  }
+  *(unsigned int*)context=uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8);
+  return 0;
+}
+#endif /*INT_MAX>32767*/
+
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_flong.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_flong.c
new file mode 100644 (file)
index 0000000..b58734a
--- /dev/null
@@ -0,0 +1,71 @@
+#include <uloi_base.h>
+#include <limits.h>
+
+int uloi_long_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[4];
+ #endif
+  uloi_tmpbuf[0]=*(long*)context;
+  uloi_tmpbuf[1]=*(long*)context>>8;
+  uloi_tmpbuf[2]=*(long*)context>>16;
+  uloi_tmpbuf[3]=*(long*)context>>24;
+  if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 4)!=4){
+    coninfo->error=1;
+    return -1;
+  }
+  return 0;
+}
+
+int uloi_long_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[4];
+ #endif
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 4)!=4){
+    coninfo->error=1;
+    return -1;
+  }
+ #if LONG_MAX>2147483647
+  *(long*)context=uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8)+;
+                  ((long)uloi_tmpbuf[1]<<16)+((long)(signed char)uloi_tmpbuf[1]<<24);
+ #else
+  *(long*)context=uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8)+
+                  ((long)uloi_tmpbuf[1]<<16)+((long)uloi_tmpbuf[1]<<24);
+ #endif
+  return 0;
+}
+
+int uloi_ulong_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_long_rdfnc(ULOI_ARG_coninfo context);
+}
+
+#if LONG_MAX<=2147483647
+
+int uloi_ulong_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_long_wrfnc(ULOI_ARG_coninfo context);
+}
+
+#else /*LONG_MAX>2147483647*/
+
+int uloi_ulong_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[4];
+ #endif
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 2)!=2){
+    coninfo->error=1;
+    return -1;
+  }
+  *(unsigned long*)context=uloi_tmpbuf[0]+(uloi_tmpbuf[1]<<8)+
+                  ((unsigned long)uloi_tmpbuf[1]<<16)+((unsigned long)uloi_tmpbuf[1]<<24);
+  return 0;
+}
+#endif /*LONG_MAX>2147483647*/
+
+
+
+
+
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_ioulan.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_ioulan.c
new file mode 100644 (file)
index 0000000..f0f2798
--- /dev/null
@@ -0,0 +1,146 @@
+#include <uloi_base.h>
+
+int uloi_i_open(ULOI_PARAM_coninfo UL_ARGPTRTYPE ul_msginfo *imsginfo)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uchar uloi_tmpbuf[3];
+  ul_msginfo msginfo;
+ #endif
+  ul_ssize_t ret;
+
+  if(coninfo->error)
+    return -1;
+
+  if(!imsginfo){
+    ret=ul_acceptmsg(coninfo->ul_fd, &msginfo);
+    if(ret<0){
+      coninfo->error=1;
+      return -1;
+    }
+    if((msginfo.cmd!=coninfo->cmd)||
+       (msginfo.len<3)||
+       (msginfo.flg&UL_BFL_FAIL))
+      goto conerr;
+    coninfo->adr=msginfo.sadr;
+  }else{
+    if((imsginfo->cmd!=coninfo->cmd)||
+       (imsginfo->len<3)||
+       (imsginfo->flg&UL_BFL_FAIL))
+      goto conerr1;
+    coninfo->adr=imsginfo->sadr;
+    ret=1;
+  }
+
+  if(uloi_i_read(ULOI_ARG_coninfo uloi_tmpbuf, 3)!=3)
+    goto conerr;
+
+  coninfo->bcmd=uloi_tmpbuf[0];
+  coninfo->bsn=uloi_tmpbuf[1];
+  /* We could need our loop-back serial number for messages tracking */
+  coninfo->sn=uloi_tmpbuf[2];
+
+  return ret;
+
+  conerr:
+   #ifdef ul_i_close
+    ul_i_close(coninfo->ul_fd);
+   #else
+    ul_abortmsg(coninfo->ul_fd);
+   #endif
+  conerr1:
+    if(!coninfo->error)
+      coninfo->error=1;
+    return -1;
+}
+
+int uloi_o_open(ULOI_PARAM1_coninfo)
+{
+ #ifndef UL_WITHOUT_HANDLE
+  ul_msginfo msginfo;
+  uchar uloi_tmpbuf[3];
+ #endif
+  ul_ssize_t ret;
+
+  if(coninfo->state&ULOI_CONINFO_OUTOPEN)
+    return 0;
+
+  msginfo.dadr=coninfo->adr;
+  msginfo.sadr=0;
+  msginfo.cmd=coninfo->bcmd;
+  msginfo.flg=UL_BFL_SND|UL_BFL_ARQ;
+  msginfo.len=0;
+  ret=ul_newmsg(coninfo->ul_fd1, &msginfo);
+  if(ret<0){
+    coninfo->error=1;
+    uloi_i_close(ULOI_ARG1_coninfo);
+    return -1;
+  }
+
+  uloi_tmpbuf[0]=coninfo->cmd;
+  /* We do not run own sequence numbers in the device */
+  uloi_tmpbuf[1]=0; /*coninfo->sn;*/
+  uloi_tmpbuf[2]=coninfo->bsn;
+
+  if(uloi_o_write(ULOI_ARG_coninfo uloi_tmpbuf, 3)!=3){
+    coninfo->error=1;
+    uloi_o_close(ULOI_ARG1_coninfo);
+    return -1;
+  }
+
+  coninfo->state|=ULOI_CONINFO_OUTOPEN;
+
+  return 1;
+}
+
+int uloi_i_close(ULOI_PARAM1_coninfo)
+{
+#ifdef ul_i_close
+  return ul_i_close(coninfo->ul_fd);
+#else
+  if(coninfo->error){
+    return ul_abortmsg(coninfo->ul_fd);
+  }
+  return ul_freemsg(coninfo->ul_fd);
+#endif
+}
+
+int uloi_o_close(ULOI_PARAM1_coninfo)
+{
+  if(!(coninfo->state&ULOI_CONINFO_OUTOPEN))
+    return 0;
+
+  coninfo->state&=~ULOI_CONINFO_OUTOPEN;
+
+#ifdef ul_o_close
+  if(coninfo->error)
+    return -1;
+  return ul_o_close(coninfo->ul_fd1);
+#else
+  if(coninfo->error){
+    return ul_abortmsg(coninfo->ul_fd1);
+  }
+  return ul_freemsg(coninfo->ul_fd1);
+#endif
+}
+
+ul_ssize_t uloi_i_read(ULOI_PARAM_coninfo void *buffer, size_t size)
+{
+  ul_ssize_t ret;
+  if(coninfo->error)
+    return -1;
+  ret=ul_read(coninfo->ul_fd, buffer, size);
+  if(ret<0)
+    coninfo->error=1;
+  return ret;
+}
+
+ul_ssize_t uloi_o_write(ULOI_PARAM_coninfo const void *buffer, size_t size)
+{
+  ul_ssize_t ret;
+  if(coninfo->error)
+    return -1;
+  ret=ul_write(coninfo->ul_fd1, buffer, size);
+  if(ret<0)
+    coninfo->error=1;
+  return ret;
+}
diff --git a/ulan/embedded/libs4c/ulan/uloi_lt/uloi_testlt.c b/ulan/embedded/libs4c/ulan/uloi_lt/uloi_testlt.c
new file mode 100644 (file)
index 0000000..b936803
--- /dev/null
@@ -0,0 +1,108 @@
+#include <string.h>
+#include <uloi_base.h>
+#ifdef UL_WITHOUT_HANDLE
+#include <system_def.h>
+#endif  /*UL_WITHOUT_HANDLE*/
+
+extern const ULOI_CODE uloi_objdes_array_t uloi_objdes_main;
+
+#define I_TEST 230
+
+unsigned status_val=0x1234;
+int test_val;
+
+int status_rdfnc(ULOI_PARAM_coninfo void *context)
+{
+  return uloi_uint_rdfnc(ULOI_ARG_coninfo &status_val);
+}
+
+int errclr_wrfnc(ULOI_PARAM_coninfo void *context)
+{
+  if(status_val<0)
+    status_val=0;
+  else
+    status_val++;
+  return 1;
+}
+
+
+/* description of input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOII =
+ULOI_GENOBJDES_RAW(ULOI_DOII,NULL,NULL_CODE,NULL,uloi_doii_fnc,(void*)&uloi_objdes_main)
+/* description of output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_DOIO =
+ULOI_GENOBJDES_RAW(ULOI_DOIO,NULL,NULL_CODE,NULL,uloi_doio_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized input objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOII =
+ULOI_GENOBJDES_RAW(ULOI_QOII,NULL,NULL_CODE,NULL,uloi_qoii_fnc,(void*)&uloi_objdes_main)
+/* ID numbers of recognized output objects */
+const ULOI_CODE uloi_objdes_t uloid_objdes_QOIO =
+ULOI_GENOBJDES_RAW(ULOI_QOIO,NULL,NULL_CODE,NULL,uloi_qoio_fnc,(void*)&uloi_objdes_main)
+/* object values read request */
+const ULOI_CODE uloi_objdes_t uloid_objdes_RDRQ =
+ULOI_GENOBJDES_RAW(ULOI_RDRQ,NULL,NULL_CODE,NULL,uloi_rdrq_fnc,(void*)&uloi_objdes_main)
+
+ULOI_GENOBJDES(STATUS,ULOI_STATUS,"u2",status_rdfnc,&status_val,NULL_CODE,NULL)
+ULOI_GENOBJDES(ERRCLR,ULOI_ERRCLR,"e",NULL_CODE,NULL,errclr_wrfnc,&status_val)
+ULOI_GENOBJDES(TEST,I_TEST,"s2",uloi_uint_rdfnc,&test_val,uloi_uint_wrfnc,&test_val)
+
+const uloi_objdes_t * ULOI_CODE uloi_objdes_main_items[]={
+  &uloid_objdes_DOII,
+  &uloid_objdes_DOIO,
+  &uloid_objdes_QOII,
+  &uloid_objdes_QOIO,
+  &uloid_objdes_RDRQ,
+
+  &uloid_objdes_STATUS,
+  &uloid_objdes_ERRCLR,
+  &uloid_objdes_TEST
+};
+
+const ULOI_CODE uloi_objdes_array_t uloi_objdes_main={
+  {
+    uloi_objdes_main_items,
+    sizeof(uloi_objdes_main_items)/sizeof(uloi_objdes_main_items[0]),
+    -1
+  }
+};
+
+
+uloi_coninfo_t uloi_coninfo_global;
+
+int main()
+{
+ #ifndef UL_WITHOUT_HANDLE
+  uloi_coninfo_t *coninfo=&uloi_coninfo_global;
+  ul_msginfo msginfo;
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+ #ifdef UL_WITHOUT_HANDLE
+  ul_drv_set_adr(3);
+  ul_drv_set_bdiv(BAUD2BAUDDIV(19200));
+  ul_drv_init();
+  ul_fd=ul_open(0,0);
+ #else  /*UL_WITHOUT_HANDLE*/
+  coninfo->ul_fd=ul_open(NULL,NULL);
+  if(coninfo->ul_fd==UL_FD_INVALID)
+    return 1;
+  coninfo->ul_fd1=ul_open(NULL,NULL);
+  if(coninfo->ul_fd1==UL_FD_INVALID){
+    ul_close(coninfo->ul_fd1);
+    return 1;
+  }
+  memset(&msginfo, 0, sizeof(msginfo));
+  msginfo.cmd=UL_CMD_OISV;
+  ul_addfilt(coninfo->ul_fd, &msginfo);
+ #endif  /*UL_WITHOUT_HANDLE*/
+
+  coninfo->cmd=UL_CMD_OISV;
+  coninfo->sn=0;
+  coninfo->bsn=0;
+
+  while(1){
+  
+    if((ul_inepoll(coninfo->ul_fd)>0)||(ul_fd_wait(coninfo->ul_fd,100)>0)){
+      uloi_process_msg(ULOI_ARG_coninfo &uloi_objdes_main, NULL);
+    }
+  }
+}
diff --git a/ulan/embedded/libs4c/ulan/ulsup/CVS/Entries b/ulan/embedded/libs4c/ulan/ulsup/CVS/Entries
new file mode 100644 (file)
index 0000000..e450fd3
--- /dev/null
@@ -0,0 +1,3 @@
+/ul_util.c/1.1/Mon Oct  3 12:43:28 2005//
+/ul_util.h/1.1/Mon Oct  3 12:43:28 2005//
+D
diff --git a/ulan/embedded/libs4c/ulan/ulsup/CVS/Repository b/ulan/embedded/libs4c/ulan/ulsup/CVS/Repository
new file mode 100644 (file)
index 0000000..649170d
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/ulan/ulsup
diff --git a/ulan/embedded/libs4c/ulan/ulsup/CVS/Root b/ulan/embedded/libs4c/ulan/ulsup/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/ulan/ulsup/ul_util.c b/ulan/embedded/libs4c/ulan/ulsup/ul_util.c
new file mode 100644 (file)
index 0000000..f2af1be
--- /dev/null
@@ -0,0 +1,43 @@
+#include "stdio.h"
+#include "ulan.h"
+#include "ul_util.h"
+
+int print_msg(int with_data)
+{
+  int ret;
+  char *state;
+  unsigned i;
+  uchar xdata uc;
+
+  ret=ul_acceptmsg(ul_fd,&msginfo);
+  if(ret<0) 
+  { printf("spy_messages : problem to accept message\n");
+    return ret;
+  };
+  
+  if(msginfo.flg&UL_BFL_FAIL) state="FAIL";
+  else if(msginfo.flg&UL_BFL_PROC) {state="PROC"; with_data=0;}
+  else state="REC ";
+  printf("%s:(d:%d,s:%d,c:0x%X,",
+         state,(unsigned)msginfo.dadr,(unsigned)msginfo.sadr,(unsigned)msginfo.cmd);
+  printf("f:0x%X,l:%d)",(unsigned)msginfo.flg,(unsigned)msginfo.len);
+  if(with_data) for(i=0;i<msginfo.len;i++){ 
+    ret=ul_read(ul_fd,&uc,1); printf(" 0x%X",(unsigned)uc);
+    if(ret!=1) {printf("\nul_read returned %d\n",ret); break;}
+    /*printf("%d %d\n",i,msginfo.len);*/
+  };
+  while((msginfo.flg&UL_BFL_TAIL)&&(ret>=0))
+  { ret=ul_actailmsg(ul_fd,&msginfo);
+    if(msginfo.flg&UL_BFL_FAIL) state="fail";
+    else if(msginfo.flg&UL_BFL_PROC) state="proc";
+    else state="rec ";
+    printf(" %s:(d:%d,s:%d,c:0x%X,",
+           state,(unsigned)msginfo.dadr,(unsigned)msginfo.sadr,(unsigned)msginfo.cmd);
+    printf("f:0x%X,l:%d)",(unsigned)msginfo.flg,(unsigned)msginfo.len);
+    if(with_data) for(i=0;i<msginfo.len;i++)
+      { ul_read(ul_fd,&uc,1); printf(" 0x%X",(unsigned)uc); };
+  };
+  printf("\n");
+  ul_freemsg(ul_fd);
+  return 0;
+}
diff --git a/ulan/embedded/libs4c/ulan/ulsup/ul_util.h b/ulan/embedded/libs4c/ulan/ulsup/ul_util.h
new file mode 100644 (file)
index 0000000..080618e
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _UL_UTIL_H
+#define _UL_UTIL_H
+
+#include "ulan.h"
+
+#ifdef __cplusplus
+/*extern "C" {*/
+#endif
+
+int print_msg(int with_data);
+
+#ifdef __cplusplus
+/*}*/ /* extern "C"*/
+#endif
+
+#endif /* _UL_UTIL_H */
diff --git a/ulan/embedded/libs4c/usb/CVS/Entries b/ulan/embedded/libs4c/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..1d73c77
--- /dev/null
@@ -0,0 +1,6 @@
+/Makefile/1.1/Wed Feb 23 11:05:20 2005//
+/Makefile.omk/1.3/Sat Apr 28 19:37:38 2007//
+D/base////
+D/lpcusb////
+D/more////
+D/pdiusb////
diff --git a/ulan/embedded/libs4c/usb/CVS/Repository b/ulan/embedded/libs4c/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..51bbe92
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb
diff --git a/ulan/embedded/libs4c/usb/CVS/Root b/ulan/embedded/libs4c/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/Makefile b/ulan/embedded/libs4c/usb/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/usb/Makefile.omk b/ulan/embedded/libs4c/usb/Makefile.omk
new file mode 100644 (file)
index 0000000..71e412a
--- /dev/null
@@ -0,0 +1,3 @@
+# -*- makefile -*-
+
+SUBDIRS = base pdiusb more lpcusb
diff --git a/ulan/embedded/libs4c/usb/base/CVS/Entries b/ulan/embedded/libs4c/usb/base/CVS/Entries
new file mode 100644 (file)
index 0000000..44544b4
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Wed Feb 23 11:05:20 2005//
+/Makefile.omk/1.3/Mon Oct  3 12:43:28 2005//
+/usb.c/1.1/Wed Feb 23 11:05:20 2005//
+/usbdebug.c/1.2/Sun Aug  7 11:34:58 2005//
+D/usb////
diff --git a/ulan/embedded/libs4c/usb/base/CVS/Repository b/ulan/embedded/libs4c/usb/base/CVS/Repository
new file mode 100644 (file)
index 0000000..798e1c1
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/base
diff --git a/ulan/embedded/libs4c/usb/base/CVS/Root b/ulan/embedded/libs4c/usb/base/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/base/Makefile b/ulan/embedded/libs4c/usb/base/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/usb/base/Makefile.omk b/ulan/embedded/libs4c/usb/base/Makefile.omk
new file mode 100644 (file)
index 0000000..01d6e0b
--- /dev/null
@@ -0,0 +1,21 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_USB_BASE=n
+
+ifeq ($(CONFIG_USB_BASE),y) 
+lib_LIBRARIES = usbbase
+
+#shared_LIBRARIES = 
+
+#include_HEADERS  = 
+
+nobase_include_HEADERS = usb/usb.h usb/usb_spec.h usb/usb_srq.h usb/usbdebug.h
+
+usbbase_SOURCES = usb.c usbdebug.c 
+
+#lib_LOADLIBES = 
+#bin_PROGRAMS = 
+endif #CONFIG_USB_BASE
+
+
+
diff --git a/ulan/embedded/libs4c/usb/base/usb.c b/ulan/embedded/libs4c/usb/base/usb.c
new file mode 100644 (file)
index 0000000..2061c8c
--- /dev/null
@@ -0,0 +1,335 @@
+/*****************************************************/
+/***   Module : USB module                         ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+//#include "hal.h"
+#include <stdio.h>
+#include <string.h>
+#include <system_def.h>
+#include <endian.h>
+#if __BYTE_ORDER == __BIG_ENDIAN
+  #include <byteswap.h>
+#endif
+
+//#include <usb/pdiusb.h> /* to by tu pak nemelo bejt vubec ... */
+#include <usb/usb.h>
+#include <usb/usbdebug.h>
+
+#include <usb/usb_srq.h> /* temporary include - standard control request responses */
+
+/* ep0 buffer */
+  xdata unsigned char ep0_buffer[ MAX_CONTROL_XFER_DATA_SIZE];
+
+  
+/* usb initialize */
+  int usb_init( usb_device_t *udev) {
+    int ret = 0;
+    usb_debug_print( DEBUG_LEVEL_LOW, ("init_usb\r\n"));
+    /* create dynamic fields - endpoints */
+
+    udev->ep_events = 0;
+    udev->flags = 0;
+    udev->configuration = 0;
+    //udev->altinterface = 0;
+    udev->ep0.udev = udev;
+    udev->ep0.flags = USB_STATE_IDLE;
+    udev->ep0.epnum = 0;
+
+//    usb_init_stdreq_fnc( udev);
+
+    if ( usb_udev_is_fnc(udev,init)) {
+      ret = usb_udev_init( udev);
+    }
+    return ret;
+  }
+
+  
+// connecting to USB by SoftConnect
+  int usb_connect( usb_device_t *udev) {
+    int ret = 0;
+    usb_debug_print( DEBUG_LEVEL_LOW,("USB:ON\n"));
+
+    udev->ep_events = 0;
+    udev->flags = 0;
+    udev->configuration = 0;
+    //udev->altinterface = 0;
+    udev->ep0.flags &= ~USB_STATE_MASK; //state = USB_STATE_IDLE;
+
+    if ( usb_udev_is_fnc(udev,connect)) {
+      ret = usb_udev_connect( udev);
+    }
+    return ret;
+  }
+
+  
+  int usb_disconnect( usb_device_t *udev) {
+    int ret = 0;
+    usb_debug_print( DEBUG_LEVEL_LOW,("USB:OFF\n"));
+
+    udev->flags &= ~USB_FLAG_CONFIGURED;
+    udev->configuration = 0;
+    udev->ep_events = 0;
+    //udev->altinterface = 0;
+    udev->ep0.flags &= ~USB_STATE_MASK; //state = USB_STATE_IDLE;
+
+    if ( usb_udev_is_fnc(udev,disconnect)) {
+      ret = usb_udev_disconnect( udev);
+    }
+    return ret;
+  }
+
+  
+  void usb_stall( usb_ep_t *ep) {
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("USB:STALL %1d\n", ep->epnum));
+    if ( usb_udev_is_fnc(ep->udev,stall)) {
+      usb_udev_stall( ep);
+    }
+  }
+
+  
+  int usb_check_events( usb_device_t *udev)
+  {
+    int ret = 0;
+    if ( usb_udev_is_fnc( udev, check_events)) {
+      ret = usb_udev_check_events( udev);
+    }
+    return ret;
+  }
+
+
+// ************************************
+// ***  Control transfer functions  ***
+// ************************************
+
+  void usb_complete_control_transfer(usb_ep_t *ep0, int status) {
+    usb_debug_print( DEBUG_LEVEL_HIGH, ( "CCT:st=%d", status));
+   #ifdef USB_WITH_CB_FNC
+    if ( ep0->complete_fnc )
+      ep0->complete_fnc( ep0, status);
+    ep0->next_pkt_fnc = NULL;
+    ep0->complete_fnc = NULL;
+   #endif /*USB_WITH_CB_FNC*/
+    ep0->flags &= ~USB_STATE_MASK; //state = USB_STATE_IDLE;
+  }
+
+/* Send any data in the data phase of the control transfer */
+  void usb_send_control_data( usb_device_t *udev, unsigned char *pData, unsigned short len) {
+    usb_ep_t *ep0 = &(udev->ep0);
+    usb_debug_print( DEBUG_LEVEL_HIGH, ( "SCD:ptr=%p,s=%d\n", pData, len));
+    ep0->efnc = NULL;
+    ep0->ptr = pData;
+    ep0->actual = 0;
+    if ( ep0->size > len) ep0->size = len;
+    
+    /* Schedule TX processing for later execution */
+    ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_TRANSMIT;
+    udev->flags |= USB_FLAG_EVENT_TX0;
+  }
+
+  void usb_set_control_endfnc( usb_device_t *udev, endfnc_t *efnc) { //REENTRANT_SIGN {
+    udev->ep0.efnc = efnc;
+  }
+
+  void usb_ack_setup( usb_ep_t *ep) {
+    usb_udev_ack_setup(ep->udev);
+  }
+
+  
+/*************************************************************
+ *** Control endpoint0 responses
+ *************************************************************/
+  int usb_control_response( usb_device_t *udev) {
+    int ret = 0;
+    usb_ep_t *ep0 = &(udev->ep0);
+    
+/* response to interrupt BusReset */
+    if ( udev->flags & USB_FLAG_BUS_RESET) {
+      udev->flags &= ~(USB_FLAG_BUS_RESET | USB_FLAG_SUSPEND); // usb_flags.bus_reset = 0; usb_flags.configured = 0;
+      usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "USBreset\n"));
+      ret = 1;
+    }
+/* response to interrupt Suspend */
+    if ( udev->flags & USB_FLAG_SUSPEND) {
+      udev->flags &= ~(USB_FLAG_SUSPEND); //usb_flags.suspend = 0;
+      usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "USBsuspend\n"));
+      ret = 1;
+    }
+
+    
+/* response to interrupt SetupPacket execute response to standard device request or vendor request */
+    if ( udev->flags & USB_FLAG_SETUP) {
+      unsigned char type, req;
+      USB_DEVICE_REQUEST *preq = &(udev->request);
+
+      ep0->ptr = NULL;
+      ep0->size = 0;
+      ep0->actual = 0;
+      ep0->efnc = NULL;
+      ep0->flags &= ~USB_STATE_MASK; //state = USB_STATE_IDLE;
+      udev->flags &= ~USB_FLAG_SETUP;   // usb_flags.setup_packet = 0;
+     #ifdef USB_WITH_CB_FNC
+      ep0->next_pkt_fnc = NULL;
+      ep0->complete_fnc = NULL;
+     #endif /*USB_WITH_CB_FNC*/
+      
+      if ( usb_udev_read_endpoint(ep0, preq, sizeof( USB_DEVICE_REQUEST)) 
+                                   != sizeof( USB_DEVICE_REQUEST)) {
+        usb_udev_stall( ep0);
+        return -1;
+      }
+     #if __BYTE_ORDER == __BIG_ENDIAN
+      preq->wValue  = bswap_16( preq->wValue);
+      preq->wIndex  = bswap_16( preq->wIndex);
+      preq->wLength = bswap_16( preq->wLength);
+     #endif
+      usb_debug_print( DEBUG_LEVEL_MEDIUM,( "SePa:x%02X,x%02X,x%04X,x%04X,x%04X\n", preq->bmRequestType, preq->bRequest, preq->wValue, preq->wIndex, preq->wLength));
+      
+      // acknowledge setup here
+      if(usb_udev_is_fnc( udev, ack_control_setup)) {
+        usb_udev_ack_control_setup(udev);
+      }
+      
+      ep0->size = preq->wLength;
+      if ((( preq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST) && preq->wLength) {
+        ep0->ptr = ep0_buffer;
+        ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_RECEIVE;
+      }
+      
+      type = preq->bmRequestType & USB_REQUEST_TYPE_MASK;
+      req = preq->bRequest & USB_REQUEST_MASK;
+      if ( type == USB_STANDARD_REQUEST) {
+        int ret = -1;
+        usb_debug_print( DEBUG_LEVEL_HIGH, ( "StdReq-%d\n", req));
+/*        
+        if ( (udev->stdreq[ req]) != NULL) {
+          ret = udev->stdreq[ req]( udev);
+        }
+        if( ret < 0)
+          udev->ack_setup( udev);
+*/          
+        switch( req) {
+          case USB_REQUEST_GET_STATUS:        ret=usb_stdreq_get_status( udev); break;
+          case USB_REQUEST_CLEAR_FEATURE:     ret=usb_stdreq_clear_feature( udev); break;
+          case USB_REQUEST_SET_FEATURE:       ret=usb_stdreq_set_feature( udev); break;
+          case USB_REQUEST_SET_ADDRESS:       ret=usb_stdreq_set_address( udev); break;
+
+          case USB_REQUEST_GET_DESCRIPTOR:    ret=usb_stdreq_get_descriptor( udev); break;
+//          case USB_REQUEST_SET_DESCRIPTOR:    break;
+          case USB_REQUEST_GET_CONFIGURATION: ret=usb_stdreq_get_configuration( udev); break;
+          case USB_REQUEST_SET_CONFIGURATION: ret=usb_stdreq_set_configuration( udev); break;
+          case USB_REQUEST_GET_INTERFACE:     ret=usb_stdreq_get_interface( udev); break;
+          case USB_REQUEST_SET_INTERFACE:     ret=usb_stdreq_set_interface( udev); break;
+//          case USB_REQUEST_SYNC_FRAME:        break;
+//          default:                            ret=-1; break;
+        }
+        if (ret<0)
+          usb_udev_stall( ep0);
+      } else {
+        if ( type == USB_VENDOR_REQUEST) {
+//putchar('#');
+         #ifdef USB_WITH_CB_FNC
+          int ret = -1;
+//         if(USBVendorRequestCBFnc != NULL)
+//         ret = USBVendorRequestCBFnc(&usb_ep0, &dreq);
+          if ( udev->vendor_fnc != NULL)
+            ret = udev->vendor_fnc( udev);
+          if ( ret < 0)
+            usb_udev_stall( ep0);
+//         #else /*USB_WITH_CB_FNC*/
+//          if ( USBVendorRequest(&dreq) == -1)
+//          udev->ack_setup( udev);
+         #endif /*USB_WITH_CB_FNC*/
+        } else if ( type == USB_CLASS_REQUEST) {
+         #ifdef USB_WITH_CB_FNC
+          int ret = -1;
+//         if(USBClassRequestCBFnc != NULL)
+//         ret = USBClassRequestCBFnc(&usb_ep0, &dreq);
+          if( udev->class_fnc != NULL)
+            ret = udev->class_fnc( udev);
+          if( ret < 0)
+            usb_udev_stall( ep0);
+//         #else /*USB_WITH_CB_FNC*/
+//          if ( USBClassRequest(&dreq) == -1)
+//          udev->ack_setup( udev);
+         #endif /*USB_WITH_CB_FNC*/
+        } else
+            usb_udev_stall( ep0);
+      }
+      ret = 1;
+    }
+    
+/* response to interrupt Ep0RxInt  - receive data */
+    if ( udev->flags & USB_FLAG_EVENT_RX0) {
+      int i;
+      udev->flags &= ~USB_FLAG_EVENT_RX0;
+      usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "Ep0Rx\n"));
+      if (( ep0->flags & USB_STATE_MASK) == USB_STATE_RECEIVE) {
+        usb_debug_print( DEBUG_LEVEL_HIGH, ( "RCV:p=%04lX,s=%d\n", (unsigned long)ep0->ptr, ep0->size));
+
+        i = usb_udev_read_endpoint(ep0, ep0->ptr, ep0->max_packet_size);
+        ep0->actual += i;
+        ep0->ptr +=i;
+
+       #ifdef USB_WITH_CB_FNC
+       if ( ep0->next_pkt_fnc ) {
+          if( ep0->next_pkt_fnc( ep0, i, USB_NEXT_PKT_REC) < 0) {
+            usb_udev_stall( ep0);
+            return -1;
+          }
+        }
+       #endif /*USB_WITH_CB_FNC*/
+
+        if (( i != ep0->max_packet_size) || ( ep0->actual >= ep0->size)) {
+          usb_complete_control_transfer( ep0, USB_COMPLETE_OK );
+          if ( ep0->efnc) {
+            ep0->efnc(ep0);
+          }
+        }
+      } else {
+        ep0->flags &= ~USB_STATE_MASK; //state = USB_STATE_IDLE;
+      }
+    }
+
+/* response to interrupt Ep0TxInt */
+    if ( udev->flags & USB_FLAG_EVENT_TX0) { 
+      short i = ep0->size - ep0->actual;
+      udev->flags &= ~USB_FLAG_EVENT_TX0;
+//usb_debug_print( DEBUG_LEVEL_LOW, ("0S-%d(%d){%d}\n", ep0->state, ep0->size, ep0->max_packet_size));
+      usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "EP0Tx:i=%d\n", i));
+
+      if (( ep0->flags & USB_STATE_MASK) == USB_STATE_TRANSMIT) {
+      
+        if(i > ep0->max_packet_size) i = ep0->max_packet_size;
+
+        if ( i > 0 ) {
+         #ifdef USB_WITH_CB_FNC
+          if ( ep0->next_pkt_fnc) {
+            if( ep0->next_pkt_fnc( ep0, i, USB_NEXT_PKT_SEND) < 0) {
+              usb_udev_stall( ep0);
+              return -1;
+            }
+          }
+         #endif /*USB_WITH_CB_FNC*/
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("Wr(%d)\n",i));
+          usb_udev_write_endpoint( ep0, ep0->ptr, i);
+          ep0->actual += i;
+          ep0->ptr +=i;
+
+          if( i != ep0->max_packet_size) {
+            /* last packed without full size has been sent, state can change to idle */
+            usb_complete_control_transfer( ep0, USB_COMPLETE_OK );
+          }
+        } else {
+           usb_udev_ack_setup( udev);   // Send zero packet at the end ???
+          usb_complete_control_transfer( ep0, USB_COMPLETE_OK );
+        }
+      }
+      ret = 1;
+    }
+
+    return ret;
+  }
+
+
diff --git a/ulan/embedded/libs4c/usb/base/usb/CVS/Entries b/ulan/embedded/libs4c/usb/base/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..2d16b97
--- /dev/null
@@ -0,0 +1,5 @@
+/usb.h/1.1/Wed Feb 23 11:05:20 2005//
+/usb_spec.h/1.1/Wed Feb 23 11:05:20 2005//
+/usb_srq.h/1.1/Wed Feb 23 11:05:20 2005//
+/usbdebug.h/1.4/Mon Aug  8 06:48:53 2005//
+D
diff --git a/ulan/embedded/libs4c/usb/base/usb/CVS/Repository b/ulan/embedded/libs4c/usb/base/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..cfd19b2
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/base/usb
diff --git a/ulan/embedded/libs4c/usb/base/usb/CVS/Root b/ulan/embedded/libs4c/usb/base/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/base/usb/usb.h b/ulan/embedded/libs4c/usb/base/usb/usb.h
new file mode 100644 (file)
index 0000000..40338a6
--- /dev/null
@@ -0,0 +1,181 @@
+/**************************************************************/
+/***   Module : USB module - header file                    ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002            ***/
+/***   Modify : 08.08.2002                                  ***/
+/***   Rewrite: 05.09.2002                                  ***/
+/**************************************************************/
+
+#ifndef _USB_MODULE_
+  #define _USB_MODULE_
+
+  #include "usb_spec.h"
+  
+#if defined(SDCC) || defined(__KEIL__) || defined(__C51__)
+  /*8051 special handling*/
+  #define REENTRANT_SIGN reentrant
+#else
+  #define xdata           /*nothing*/
+  #define REENTRANT_SIGN  /*nothing*/
+#endif
+
+#define USB_WITH_CB_FNC
+//#define USB_WITH_UDEV_FNC
+
+#ifdef USB_WITH_UDEV_FNC
+  #define USB_UDEV_REENTRANT_SIGN REENTRANT_SIGN
+#else /*USB_WITH_UDEV_FNC*/
+  #define USB_UDEV_REENTRANT_SIGN /*nothing*/
+#endif /*USB_WITH_UDEV_FNC*/
+
+/* control endpoint */
+  #define MAX_CONTROL_XFER_DATA_SIZE 8
+
+  struct usb_ep_t;
+  
+  typedef void endfnc_t( struct  usb_ep_t *ep) REENTRANT_SIGN;
+  
+  #define USB_NEXT_PKT_SEND 0
+  #define USB_NEXT_PKT_REC  1
+
+  #define USB_COMPLETE_OK   0
+  #define USB_COMPLETE_FAIL -1
+
+  typedef struct usb_ep_t {
+    struct usb_device_t *udev;      /* pointer to parent device */
+    unsigned short max_packet_size; /* max. size of endpoint package, e.g. PDI_EP0_PACKET_SIZE */
+    unsigned char *ptr;             /* pointer to current transmitted data */
+    unsigned int  size;             /* full size of current transmitted data */
+    unsigned int  actual;           /* transmitted data size */
+    endfnc_t *efnc;                 /* ??? */
+    unsigned char flags;            /* endpoint flags & state - idle,receiving, transmitting  ??? HERE ??? */
+    unsigned char epnum;            /* endpoint number (index) - endpoint0 must be set to 0 */
+    unsigned short event_mask;      /* event(interrupt) mask for this endpoint, e.g. PDI_INT_EP1_IN for pdiusbd1x */
+   #ifdef USB_WITH_CB_FNC
+    int (*next_pkt_fnc)(struct usb_ep_t *ep, int len, int codeval) REENTRANT_SIGN;
+    int (*complete_fnc)(struct usb_ep_t *ep, int status) REENTRANT_SIGN;
+    long user_data;
+   #endif /*USB_WITH_CB_FNC*/
+  } usb_ep_t;
+
+
+/* Vendor & Class functions */
+/*
+ #ifdef USB_WITH_CB_FNC
+  typedef int usb_vendor_extension_fnc_t(usb_ep_t *ep, USB_DEVICE_REQUEST *dreq);
+  extern xdata usb_vendor_extension_fnc_t USBVendorRequestCBFnc;
+
+  typedef int usb_class_extension_fnc_t(usb_ep_t *ep, USB_DEVICE_REQUEST *dreq);
+  extern xdata usb_class_extension_fnc_t USBClassRequestCBFnc;
+ #else //USB_WITH_CB_FNC
+  char USBVendorRequest( USB_DEVICE_REQUEST *dr);
+  char USBClassRequest( USB_DEVICE_REQUEST *dr);
+ #endif //USB_WITH_CB_FNC
+*/
+
+/* USB device */  
+  typedef struct usb_device_t {
+    unsigned char id;               /* device ID ??? */
+    unsigned char flags;            /* usb device flags + endpoint0 events */
+    unsigned char ep_events;        /* one bit for each endpoint (without ep0) event,(bit0 for udev->ep[0], bit1 for udev->ep[1], ...)*/
+    unsigned char configuration;    /* current configuration */
+//    unsigned char interface;        /* current interface */
+//    unsigned char altinterface;     /* current alternative interface */
+
+    //int (stdreq[13])( struct usb_device_t *udev) REENTRANT_SIGN;    /* pointer to array of standard request processing functions */
+    int (*vendor_fnc)( struct usb_device_t *udev) REENTRANT_SIGN;     /* pointer to vendor request processing function */
+    int (*class_fnc)( struct usb_device_t *udev) REENTRANT_SIGN;      /* pointer to class request processing function */
+
+   #ifdef USB_WITH_UDEV_FNC
+    int (*init)( struct usb_device_t *udev) REENTRANT_SIGN;              /* function for hw specific part of initialize usb device */
+    int (*connect)( struct usb_device_t *udev) REENTRANT_SIGN;           /* function for hw specific part of connecting device to usb */
+    int (*disconnect)( struct usb_device_t *udev) REENTRANT_SIGN;        /* function for hw specific part of disconnecting device to usb */
+    void (*ack_setup)( struct usb_device_t *udev) REENTRANT_SIGN;        /* function for hw specific part of control response acknowledge */
+    void (*ack_control_setup)( struct usb_device_t *udev) REENTRANT_SIGN;        /* function for hw specific part of control response acknowledge */
+    int (*check_events)( struct usb_device_t *udev) REENTRANT_SIGN;      /* hw specific part of function for checking events */
+    void (*stall)( usb_ep_t *ep) REENTRANT_SIGN;                         /* hw specific function for stall endpoint */
+    int (*read_endpoint)( usb_ep_t *ep, void *ptr, int size) REENTRANT_SIGN;
+    int (*write_endpoint)( usb_ep_t *ep, const void *ptr, int size) REENTRANT_SIGN;
+   #endif /*USB_WITH_UDEV_FNC*/
+    
+//    USB_DEVICE_REQUEST *request;   /* current usb request - only if there is a valid usb request in processing */
+    USB_DEVICE_REQUEST request;    /* usb device request */
+    
+    unsigned char cntep;           /* number of device endpoints in ep array without EP0 */
+    usb_ep_t ep0;                  /* endpoint 0 */
+    usb_ep_t *ep;                 /* others endpoints in array */
+  } usb_device_t;
+
+
+/* endpoint flags */
+  /* endpoint state */
+  #define USB_STATE_IDLE       0x00
+  #define USB_STATE_TRANSMIT   0x01
+  #define USB_STATE_RECEIVE    0x02
+  #define USB_STATE_MASK       0x03
+
+/* usb_device flags */
+  #define USB_FLAG_CONFIGURED   0x01
+  #define USB_FLAG_BUS_RESET    0x02
+  #define USB_FLAG_SUSPEND      0x04
+  #define USB_FLAG_SETUP        0x08 // setup_packet
+  #define USB_FLAG_REMOTE_WAKE  0x10
+  
+  #define USB_FLAG_EVENT_RX0  0x40
+  #define USB_FLAG_EVENT_TX0  0x80
+  
+
+
+/* device functions - inline ??? */
+  int usb_init( usb_device_t *udev);
+  int usb_connect( usb_device_t *udev);
+  int usb_disconnect( usb_device_t *udev);
+  void usb_stall( usb_ep_t *ep);
+  
+  #define usb_stall_ep0( udev) \
+    do { \
+      usb_stall( &(udev->ep0)); \
+    } while(0)
+
+/* check usb events(interrupts) */
+  int usb_check_events( usb_device_t *udev);
+/* response to standard constrol requests */
+  int usb_control_response( usb_device_t *udev);  
+/* send control data */
+  void usb_send_control_data( usb_device_t *udev, unsigned char *pData, unsigned short len);
+  void usb_set_control_endfnc( usb_device_t *udev, endfnc_t *efnc);// REENTRANT_SIGN;
+  void usb_ack_setup( usb_ep_t *ep);
+
+  
+/* Standard requests functions */
+//  typedef int (*usb_stdreq_fnc_t)( usb_device_t *udev) REENTRANT_SIGN;
+//  extern xdata usb_stdreq_fnc_t usb_standard_requests[13];
+  
+
+#ifdef USB_WITH_UDEV_FNC
+
+  #define usb_udev_is_fnc(_M_udev, _M_fnc) (_M_udev->_M_fnc)
+  
+  #define usb_udev_init(_M_udev) (_M_udev->init(_M_udev))
+  #define usb_udev_connect(_M_udev) (_M_udev->connect(_M_udev))
+  #define usb_udev_disconnect(_M_udev) (_M_udev->disconnect(_M_udev))
+  #define usb_udev_ack_setup(_M_udev) (_M_udev->ack_setup(_M_udev))
+  #define usb_udev_ack_control_setup(_M_udev) (_M_udev->ack_control_setup(_M_udev))
+  #define usb_udev_check_events(_M_udev) (_M_udev->check_events(_M_udev))
+
+  #define usb_udev_stall(_M_ep) ((_M_ep)->udev->stall(_M_ep))
+
+  #define usb_udev_read_endpoint(_M_ep, _M_ptr, _M_size) \
+       ((_M_ep)->udev->read_endpoint(_M_ep, _M_ptr, _M_size))
+
+  #define usb_udev_write_endpoint(_M_ep, _M_ptr, _M_size) \
+       ((_M_ep)->udev->write_endpoint(_M_ep, _M_ptr, _M_size))
+
+#else /*USB_WITH_UDEV_FNC*/
+
+  #define USB_PDI_DIRECT_FNC
+  #include "pdi.h"
+
+#endif /*USB_WITH_UDEV_FNC*/
+#endif
diff --git a/ulan/embedded/libs4c/usb/base/usb/usb_spec.h b/ulan/embedded/libs4c/usb/base/usb/usb_spec.h
new file mode 100644 (file)
index 0000000..7d6f87b
--- /dev/null
@@ -0,0 +1,228 @@
+/*************************************************/
+/***   Module : USB specification              ***/
+/***   Author : Roman Bartosinski 29.07.2002   ***/
+/***   Modify : 08.08.2002, 14.01.2003         ***/
+/*************************************************/
+
+#ifndef _USB_SPECIFICATIONS_AND_DEFINITIONS_MODULE
+ #define _USB_SPECIFICATIONS_AND_DEFINITIONS_MODULE
+
+/*#include <inttypes.h>*/
+#include <types.h>
+
+#ifndef PACKED
+  #ifdef  __GNUC__
+    #define PACKED __attribute__((packed))
+  #else /*__GNUC__*/
+    #define PACKED /*nothing*/
+  #endif /*__GNUC__*/
+#endif
+
+/* this section is from __USB100.H__ and __CHAP9.H__ and define USB constants and structs */
+
+/* *** USB Device Request *** (spec. 9.3) */
+  typedef struct _tag_usb_device_request {
+    uint8_t  bmRequestType;
+    uint8_t  bRequest;
+    uint16_t wValue;
+    uint16_t wIndex;
+    uint16_t wLength;
+  } USB_DEVICE_REQUEST;
+
+/****************************************************************************************/ 
+/*** definitions for USB tranfer standard packets described in USB secif. - chapter 9 ***/
+/****************************************************************************************/
+  #define DEVICE_ADDRESS_MASK   0x7F
+
+/* bmRequestType D7 - Data transfer direction */
+  #define USB_DATA_DIR_MASK        (uint8_t)0x80
+  #define USB_DATA_DIR_FROM_HOST   (uint8_t)0x00
+  #define USB_DATA_DIR_TO_HOST     (uint8_t)0x80
+/* bmRequestType D4..D0 - Recipient */
+  #define USB_RECIPIENT            (uint8_t)0x1F
+  #define USB_RECIPIENT_DEVICE     (uint8_t)0x00
+  #define USB_RECIPIENT_INTERFACE  (uint8_t)0x01
+  #define USB_RECIPIENT_ENDPOINT   (uint8_t)0x02
+  #define USB_RECIPIENT_OTHER      (uint8_t)0x03
+/* bmRequestType D6..D5 - Type */
+  #define USB_REQUEST_TYPE_MASK    (uint8_t)0x60
+  #define USB_STANDARD_REQUEST     (uint8_t)0x00
+  #define USB_CLASS_REQUEST        (uint8_t)0x20
+  #define USB_VENDOR_REQUEST       (uint8_t)0x40
+/* Standard request codes (spec. 9.4) */
+  #define USB_REQUEST_MASK         (uint8_t)0x0F
+  #define USB_REQUEST_GET_STATUS                  0x00
+  #define USB_REQUEST_CLEAR_FEATURE               0x01
+  #define USB_REQUEST_SET_FEATURE                 0x03
+  #define USB_REQUEST_SET_ADDRESS                 0x05
+  #define USB_REQUEST_GET_DESCRIPTOR              0x06
+  #define USB_REQUEST_SET_DESCRIPTOR              0x07
+  #define USB_REQUEST_GET_CONFIGURATION           0x08
+  #define USB_REQUEST_SET_CONFIGURATION           0x09
+  #define USB_REQUEST_GET_INTERFACE               0x0A
+  #define USB_REQUEST_SET_INTERFACE               0x0B
+  #define USB_REQUEST_SYNC_FRAME                  0x0C
+/* Descriptor types (spec. 9.4) */
+  #define USB_DESCRIPTOR_TYPE_DEVICE                    0x01
+  #define USB_DESCRIPTOR_TYPE_CONFIGURATION             0x02
+  #define USB_DESCRIPTOR_TYPE_STRING                    0x03
+  #define USB_DESCRIPTOR_TYPE_INTERFACE                 0x04
+  #define USB_DESCRIPTOR_TYPE_ENDPOINT                  0x05
+  #define USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER          0x06
+  #define USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION 0x07
+  #define USB_DESCRIPTOR_TYPE_POWER                     0x08
+
+/* values for the bits returned by the USB GET_STATUS command (spec. 9.4.5) */
+  #define USB_GETSTATUS_SELF_POWERED                0x01
+  #define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED       0x02
+
+/* values for standard request Clear Feature */
+  #define USB_FEATURE_ENDPOINT_STALL          0x0000
+  #define USB_FEATURE_REMOTE_WAKEUP           0x0001
+
+
+/*******************************************************/
+/*** Standard USB Descriptor Definitions (spec. 9.6) ***/
+/*******************************************************/
+
+/* *** DEVICE *** (spec. 9.6.1) */
+  struct _tag_usb_device_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint16_t bcdUSB;
+    uint8_t  bDeviceClass;
+    uint8_t  bDeviceSubClass;
+    uint8_t  bDeviceProtocol;
+    uint8_t  bMaxPacketSize0;
+    uint16_t idVendor;
+    uint16_t idProduct;
+    uint16_t bcdDevice;
+    uint8_t  iManufacturer;
+    uint8_t  iProduct;
+    uint8_t  iSerialNumber;
+    uint8_t  bNumConfigurations;
+  } PACKED;
+  typedef struct _tag_usb_device_descriptor 
+    USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
+
+/* *** DEVICE_QUALIFIER *** (spec. 9.6.2) */
+  struct _tag_usb_device_qualifier_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint16_t bcdUSB;
+    uint8_t  bDeviceClass;
+    uint8_t  bDeviceSubClass;
+    uint8_t  bDeviceProtocol;
+    uint8_t  bMaxPacketSize0;
+    uint8_t  bNumConfigurations;
+    uint8_t  bReserved;
+  } PACKED;
+  typedef struct _tag_usb_device_qualifier_descriptor
+    USB_DEVICE_QUALIFIER_DESCRIPTOR, *PUSB_DEVICE_QUALIFIER_DESCRIPTOR;
+
+/* *** CONFIGURATION *** (spec. 9.6.3) */
+  struct _tag_usb_configuration_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint16_t wTotalLength;
+    uint8_t  bNumInterfaces;
+    uint8_t  bConfigurationValue;
+    uint8_t  iConfiguration;
+    uint8_t  bmAttributes;
+    uint8_t  MaxPower;
+  } PACKED;
+  typedef struct _tag_usb_configuration_descriptor
+    USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
+/* definitions for bits in the bmAttributes field of a configuration descriptor. (spec. 9.6.3) */
+  #define USB_CONFIG_POWERED_MASK  0xc0
+  #define USB_CONFIG_BUS_POWERED   0x80
+  #define USB_CONFIG_SELF_POWERED  0x40
+  #define USB_CONFIG_REMOTE_WAKEUP 0x20
+  #define BUS_POWERED              0x80
+  #define SELF_POWERED             0x40
+  #define REMOTE_WAKEUP            0x20
+
+/* *** OTHER_SPEED_CONFIGURATION *** (spec. 9.6.4) */
+  struct _tag_usb_other_speed_configuration {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint16_t wTotalLength;
+    uint8_t  bNumInterfaces;
+    uint8_t  bConfigurationValue;
+    uint8_t  iConfiguration;
+    uint8_t  bmAttributes;
+    uint8_t  bMaxPower;
+  } PACKED;
+  typedef struct _tag_usb_other_speed_configuration
+    USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR, *PUSB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR;
+
+/* *** INTERFACE *** (spec. 9.6.5) */
+  struct _tag_usb_interface_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint8_t  bInterfaceNumber;
+    uint8_t  bAlternateSetting;
+    uint8_t  bNumEndpoints;
+    uint8_t  bInterfaceClass;
+    uint8_t  bInterfaceSubClass;
+    uint8_t  bInterfaceProtocol;
+    uint8_t  iInterface;
+  } PACKED;
+  typedef struct _tag_usb_interface_descriptor
+    USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
+
+/* *** ENDPOINT *** (spec. 9.6.6) */
+  struct _tag_usb_endpoint_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint8_t  bEndpointAddress;
+    uint8_t  bmAttributes;
+    uint16_t wMaxPacketSize;
+    uint8_t  bInterval;
+  } PACKED;
+  typedef struct _tag_usb_endpoint_descriptor
+    USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
+
+/* Endpoint direction bit, stored in address (spec. 9.6.6) */
+  #define USB_ENDPOINT_DIRECTION_MASK               0x80
+/* test direction bit in the bEndpointAddress field of an endpoint descriptor. */
+  #define USB_ENDPOINT_DIRECTION_OUT(addr)          (!((addr) & USB_ENDPOINT_DIRECTION_MASK))
+  #define USB_ENDPOINT_DIRECTION_IN(addr)           ((addr) & USB_ENDPOINT_DIRECTION_MASK)
+/* Values for bmAttributes field of an endpoint descriptor (spec. 9.6.6) */
+  #define USB_ENDPOINT_TYPE_MASK                    0x03
+  #define USB_ENDPOINT_TYPE_CONTROL                 0x00
+  #define USB_ENDPOINT_TYPE_ISOCHRONOUS             0x01
+  #define USB_ENDPOINT_TYPE_BULK                    0x02
+  #define USB_ENDPOINT_TYPE_INTERRUPT               0x03
+
+/* *** STRING *** (spec. 9.6.7) */
+  struct _tag_usb_string_descriptor {
+    uint8_t  bLength;
+    uint8_t  bDescriptorType;
+    uint8_t  *bString;
+  } PACKED;
+  typedef struct _tag_usb_string_descriptor
+    USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
+  
+
+/*******************************************/
+/*** USB_IF - Defined USB device classes ***/
+/*******************************************/
+  #define USB_DEVICE_CLASS_RESERVED             0x00
+  #define USB_DEVICE_CLASS_AUDIO                0x01
+  #define USB_DEVICE_CLASS_COMMUNICATIONS       0x02
+  #define USB_DEVICE_CLASS_HUMAN_INTERFACE      0x03
+  #define USB_DEVICE_CLASS_MONITOR              0x04
+  #define USB_DEVICE_CLASS_PHYSICAL_INTERFACE   0x05
+  #define USB_DEVICE_CLASS_POWER                0x06
+  #define USB_DEVICE_CLASS_PRINTER              0x07
+  #define USB_DEVICE_CLASS_STORAGE              0x08
+  #define USB_DEVICE_CLASS_HUB                  0x09
+  #define USB_DEVICE_CLASS_APPLICATION_SPECIFIC 0xFE
+  #define USB_DEVICE_CLASS_VENDOR_SPECIFIC      0xFF
+
+  /* define application specific device class subclasses */
+  #define USB_APPL_SUBCLASS_FIRMWARE_UPDATE     0x01
+  #define USB_APPL_SUBCLASS_IRDA_USB_BRIDGE     0x02
+                                                           
+#endif
diff --git a/ulan/embedded/libs4c/usb/base/usb/usb_srq.h b/ulan/embedded/libs4c/usb/base/usb/usb_srq.h
new file mode 100644 (file)
index 0000000..1821ab4
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef _USB_STDREQ_MODULE_
+  #define _USB_STDREQ_MODULE_
+
+  int usb_stdreq_get_status( usb_device_t *udev);
+  
+  int usb_stdreq_clear_feature( usb_device_t *udev);
+
+  int usb_stdreq_set_feature( usb_device_t *udev);
+
+  int usb_stdreq_set_address( usb_device_t *udev);
+
+  int usb_stdreq_get_configuration( usb_device_t *udev);
+
+  int usb_stdreq_set_configuration( usb_device_t *udev);
+
+  int usb_stdreq_get_interface( usb_device_t *udev);
+
+  int usb_stdreq_set_interface( usb_device_t *udev);
+  int usb_stdreq_get_descriptor( usb_device_t *udev);
+  
+#endif /*_USB_STDREQ_MODULE_*/
+
diff --git a/ulan/embedded/libs4c/usb/base/usb/usbdebug.h b/ulan/embedded/libs4c/usb/base/usb/usbdebug.h
new file mode 100644 (file)
index 0000000..6a82e83
--- /dev/null
@@ -0,0 +1,81 @@
+/* Global debug macros, variables, functions - header file */
+/* R.B. - 23.4.2003 */
+
+#ifndef _USB_DEBUG_H_
+#define _USB_DEBUG_H_
+
+#if 1
+  #include <stdio.h>
+  #define usb_printf printf
+#else
+  int simple_printf(const char *f, ...);
+  #define usb_printf simple_printf
+#endif
+
+/* Debug levels */
+#define DEBUG_LEVEL_NONE    0
+#define DEBUG_LEVEL_LOW     1
+#define DEBUG_LEVEL_MEDIUM  2
+#define DEBUG_LEVEL_HIGH    3
+#define DEBUG_LEVEL_VERBOSE 4
+
+#ifndef DEBUG_STATIC_LEVEL
+/* Global static debug level */
+#define DEBUG_STATIC_LEVEL     DEBUG_LEVEL_NONE
+#endif
+
+/* If it is defined, current global debug level is
+   in 'global_debug_level' variable. Otherwise will
+   be used 'DEBUG_STATIC_LEVEL' as current global
+   debug level
+*/
+/*#define DEBUG_USE_DYNAMIC_LEVEL*/
+
+/* #define DEBUG */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#ifdef DEBUG
+
+/* use static or dynamic global debug level */
+#if defined(DEBUG_USE_DYNAMIC_LEVEL) /* use dynamic debug level */
+  extern unsigned char usb_debug_level;
+#else /* use only static debug level */
+  #define usb_debug_level DEBUG_STATIC_LEVEL
+#endif
+
+
+/* usb_debug_print( level, printargs) print debug info in printargs if
+   level is lower or equal to 'global_debug_level'/'DEBUG_STATIC_LEVEL'.
+   'printargs' is with parenthesis.
+   usage : usb_debug_print( DEBUG_LEVEL_MEDIUM,("i=%d",i));
+*/
+#define usb_debug_print( _lvl_, _prnargs_)      \
+  do {                                          \
+    if ( usb_debug_level >= _lvl_) {            \
+      usb_printf _prnargs_;                     \
+    }                                           \
+  } while(0)
+
+/* usb_debug_info( printargs) print debug info always
+   usage : usb_debug_info( "debug info");
+*/
+#define usb_debug_info usb_printf  /* FIXME: this is not correct */
+
+#else /* DEBUG */
+  #define usb_debug_print( _lvl_, _prnargs_)
+  #define usb_debug_info(...) 
+#endif /* DEBUG */
+
+
+  void usb_debug_set_level(int level);
+
+  char *usb_debug_get_req_recipient( char rqt);
+  char *usb_debug_get_req_type( char rqt);
+  char *usb_debug_get_std_request( char req);
+  char *usb_debug_get_std_descriptor( unsigned char desc);
+
+  
+#endif /* _GLOBAL_DEBUG_H_ */
diff --git a/ulan/embedded/libs4c/usb/base/usbdebug.c b/ulan/embedded/libs4c/usb/base/usbdebug.c
new file mode 100644 (file)
index 0000000..48bee80
--- /dev/null
@@ -0,0 +1,76 @@
+/* Global debug macros, variables, functions - header file */
+/* R.B. - 23.4.2003 */
+
+#include <usb/usbdebug.h>
+#include <usb/usb_spec.h>
+
+#ifdef DEBUG
+
+/* debug can be enabled in run-time */
+#if defined(DEBUG_USE_DYNAMIC_LEVEL) /* use dynamic debug level */
+  unsigned char usb_debug_level = DEBUG_LEVEL_NONE;
+#endif  
+
+/*************************************************************
+ *** Debug infos
+ *************************************************************/
+
+  void usb_debug_set_level(int level) {
+   #if defined(DEBUG_USE_DYNAMIC_LEVEL) /* use dynamic debug level */
+    usb_debug_level = level;
+   #endif  
+  }
+
+  
+  char *usb_debug_get_req_recipient( char rqt) {
+    switch ( rqt & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:    return "DEVICE";
+      case USB_RECIPIENT_INTERFACE: return "INTERFACE";
+      case USB_RECIPIENT_ENDPOINT:  return "ENDPOINT";
+    }
+    return "OTHER";
+  }
+  char *usb_debug_get_req_type( char rqt) {
+    switch ( rqt & USB_REQUEST_TYPE_MASK) {
+      case USB_STANDARD_REQUEST: return "STANDARD";
+      case USB_CLASS_REQUEST:    return "CLASS";
+      case USB_VENDOR_REQUEST:   return "VENDOR";
+    }
+    return "RESERVED";
+  }
+  char *usb_debug_get_std_request( char req) {
+    switch ( req & USB_REQUEST_MASK) {
+      case USB_REQUEST_GET_STATUS:        return "GET STATUS";
+      case USB_REQUEST_CLEAR_FEATURE:     return "CLEAR FEATURE";
+      case USB_REQUEST_SET_FEATURE:       return "SET FEATURE";
+      case USB_REQUEST_SET_ADDRESS:       return "SET ADDRESS";
+
+      case USB_REQUEST_GET_DESCRIPTOR:    return "GET DESCRIPTOR";
+      case USB_REQUEST_SET_DESCRIPTOR:    return "SET DESCRIPTOR";
+      case USB_REQUEST_GET_CONFIGURATION: return "GET CONFIGURATION";
+      case USB_REQUEST_SET_CONFIGURATION: return "SET CONFIGURATION";
+      case USB_REQUEST_GET_INTERFACE:     return "GET INTERFACE";
+      case USB_REQUEST_SET_INTERFACE:     return "SET INTERFACE";
+      case USB_REQUEST_SYNC_FRAME:        return "SYNC FRAME";
+    }
+    return "UNKNOWN";
+  }
+  char *usb_debug_get_std_descriptor( unsigned char desc) {
+
+    switch ( desc) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:                    return "DEVICE";
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:             return "CONFIGURATION";
+      case USB_DESCRIPTOR_TYPE_STRING:                    return "STRING";
+      case USB_DESCRIPTOR_TYPE_INTERFACE:                 return "INTERFACE";
+      case USB_DESCRIPTOR_TYPE_ENDPOINT:                  return "ENDPOINT";
+      case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER:          return "DEVICE_QUALIFIER";
+      case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: return "OTHER_SPEED_CONFIG";
+      case USB_DESCRIPTOR_TYPE_POWER:                     return "POWER";
+    }
+    return "UNKNOWN";
+  }
+
+#else /*DEBUG*/  
+  void usb_debug_set_level(int level) {
+  }
+#endif /* DEBUG */
diff --git a/ulan/embedded/libs4c/usb/lpcusb/CVS/Entries b/ulan/embedded/libs4c/usb/lpcusb/CVS/Entries
new file mode 100644 (file)
index 0000000..cc96543
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Sat Apr 28 19:37:38 2007//
+/Makefile.omk/1.1/Sat Apr 28 19:37:38 2007//
+/lpc.c/1.5/Tue Jun  5 11:55:54 2007//
+/lpcusb.c/1.4/Fri May 25 19:14:30 2007//
+D/usb////
diff --git a/ulan/embedded/libs4c/usb/lpcusb/CVS/Repository b/ulan/embedded/libs4c/usb/lpcusb/CVS/Repository
new file mode 100644 (file)
index 0000000..2e2b0ad
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/lpcusb
diff --git a/ulan/embedded/libs4c/usb/lpcusb/CVS/Root b/ulan/embedded/libs4c/usb/lpcusb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/lpcusb/Makefile b/ulan/embedded/libs4c/usb/lpcusb/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/usb/lpcusb/Makefile.omk b/ulan/embedded/libs4c/usb/lpcusb/Makefile.omk
new file mode 100644 (file)
index 0000000..00a4c72
--- /dev/null
@@ -0,0 +1,11 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_USB_LPCUSB=n
+
+ifeq ($(CONFIG_USB_LPCUSB),y) 
+lib_LIBRARIES = lpcusb
+
+nobase_include_HEADERS = usb/lpcusb.h usb/lpc.h
+
+lpcusb_SOURCES = lpcusb.c lpc.c
+endif #CONFIG_USB_LPCUSB
diff --git a/ulan/embedded/libs4c/usb/lpcusb/lpc.c b/ulan/embedded/libs4c/usb/lpcusb/lpc.c
new file mode 100644 (file)
index 0000000..7d9f20c
--- /dev/null
@@ -0,0 +1,162 @@
+/*****************************************************/
+/***   Module : USB PDI                            ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <system_def.h>
+#include <usb/usb.h>
+#include <usb/lpcusb.h>
+
+/* connect usb */
+int usb_lpc_connect( usb_device_t *udev) {
+  lpc_write_cmd_data(USB_CMD_SET_DEV_STAT,USB_DAT_WR_BYTE(USBC_DEV_CON));
+  return 0;
+}
+
+/* disconnect usb */
+int usb_lpc_disconnect( usb_device_t *udev) {
+  lpc_write_cmd_data(USB_CMD_SET_DEV_STAT,USB_DAT_WR_BYTE(0));
+  return 0;
+}
+
+/* acknowledge control transfer */
+void usb_lpc_ack_setup( usb_device_t *udev) {
+  lpc_usb_write_endpoint(0x80|0x00, NULL, 0);
+}
+
+/* stall endpoint X */
+void usb_lpc_stall( usb_ep_t *ep) {
+  if ( ep->epnum) {
+    lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
+  } else { // endpoint0
+    lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(0x80|ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
+    lpc_write_cmd_data(USB_CMD_SEL_EP_CLRI(lpc_ep2addr(ep->epnum)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
+  }
+}
+
+/**
+ * usb_lpc_check events
+ * function reads interrupt register and sets event flags
+ * function returns 1 if there is some new event.
+ * function returns 0 if there isn't new event but all is OK
+ * function returns -1 if there is any error
+*/
+int usb_lpc_check_events( usb_device_t *udev) 
+{
+  unsigned int disr,val,last_int;
+  int ret=0,n,m,i;
+
+  disr=USBDevIntSt;
+
+  /* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
+  if (disr & USBDevInt_DEV_STAT) {
+    USBDevIntClr = USBDevInt_DEV_STAT;
+    disr&=~USBDevInt_DEV_STAT;
+    lpc_write_cmd(USB_CMD_GET_DEV_STAT);
+    val=lpc_read_cmd_data(USB_DAT_GET_DEV_STAT);
+    if (val & USBC_DEV_RST) {               /* Reset */
+      lpc_usb_reset();
+      udev->flags |= USB_FLAG_BUS_RESET;
+      ret = 1;
+    }
+    if (val & USBC_DEV_SUS_CH) {            /* Suspend/Resume */
+      if (val & USBC_DEV_SUS) {             /* Suspend */
+        udev->flags |= USB_FLAG_SUSPEND;
+        ret = 1;
+      } else {                              /* Resume */
+        /* todo */
+      }
+    }
+  }
+
+  /* Endpoint's Slow Interrupt */
+  if (disr & USBDevInt_EP_SLOW) {
+    USBDevIntClr = USBDevInt_EP_SLOW;
+    disr&=~USBDevInt_EP_SLOW;
+
+    last_int = USBEpIntSt;
+
+    /* EP0_OUT */
+    if (last_int & (1 << 0)) {
+      last_int &= ~(1 << 0);
+      USBEpIntClr = 1 << 0;
+      lpc_wait4devint(USBDevInt_CDFULL);
+      val = USBCmdData;
+      /* Setup Packet */
+      if (val & USBC_EP_SEL_STP)   
+        udev->flags |= USB_FLAG_SETUP;
+      else
+        udev->flags |= USB_FLAG_EVENT_RX0;
+      ret = 1;
+    }
+
+    /* EP0_IN */
+    if (last_int & (1 << 1)) {
+      last_int &= ~(1 << 1);
+      USBEpIntClr = 1 << 1;
+      lpc_wait4devint(USBDevInt_CDFULL);
+      val = USBCmdData;
+      udev->flags |= USB_FLAG_EVENT_TX0;
+      ret = 1;
+    }    
+
+    /* user endpoints */
+    for( i=0; i<udev->cntep; i++) {
+      if ( last_int & (udev->ep+i)->event_mask) {
+        last_int &= ~((udev->ep+i)->event_mask);
+        USBEpIntClr = (udev->ep+i)->event_mask;
+        lpc_wait4devint(USBDevInt_CDFULL);
+        val = USBCmdData;
+        udev->ep_events |= 1<<i;
+        ret = 1;
+      }
+    }
+
+    while (last_int) {                    /* Endpoint Interrupt Status */
+      for (n = 0; n < USB_EP_NUM; n++) {    /* Check All Endpoints */
+        if (last_int & (1 << n)) {
+          last_int &= ~(1 << n);
+          USBEpIntClr = 1 << n;
+          m = n >> 1;
+          if (n&1) m|=0x80;
+          lpc_wait4devint(USBDevInt_CDFULL);
+          val = USBCmdData;
+          lpc_usb_setstallEP(m);
+        }
+      }
+    }
+  }
+  if (!disr)
+    USBDevIntClr = disr;
+  return ret;
+}
+
+int usb_lpc_read_endpoint( usb_ep_t *ep, void *ptr, int size)
+{
+  return lpc_usb_read_endpoint(ep->epnum, ptr, size);
+}
+
+int usb_lpc_write_endpoint( usb_ep_t *ep, const void *ptr, int size)
+{
+  return lpc_usb_write_endpoint(0x80|ep->epnum, ptr, size);
+}
+
+
+/* init usb structures and chip */
+int usb_lpc_init( usb_device_t *udev) {
+
+  udev->connect = usb_lpc_connect;
+  udev->disconnect = usb_lpc_disconnect;
+  udev->ack_setup = usb_lpc_ack_setup; 
+  udev->ack_control_setup = NULL;
+  udev->stall = usb_lpc_stall;
+  udev->check_events = usb_lpc_check_events;
+  udev->read_endpoint = usb_lpc_read_endpoint;
+  udev->write_endpoint = usb_lpc_write_endpoint;
+
+  udev->ep0.max_packet_size = USB_MAX_PACKET0;
+
+  lpc_usb_hw_init();  
+  return 0;
+}
diff --git a/ulan/embedded/libs4c/usb/lpcusb/lpcusb.c b/ulan/embedded/libs4c/usb/lpcusb/lpcusb.c
new file mode 100644 (file)
index 0000000..1cf130d
--- /dev/null
@@ -0,0 +1,195 @@
+/*****************************************************/
+/***   Module : USB PDI                            ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <system_def.h>
+#include <usb/usb.h>
+#include <usb/lpcusb.h>
+
+unsigned int lpc_ep2addr(unsigned int ep_num) 
+{
+  unsigned int val;
+  val = (ep_num & 0x0F) << 1;
+  if (ep_num & 0x80) 
+    val += 1;
+  return val;
+} 
+
+void lpc_wait4devint(unsigned int intrs) 
+{
+  while ((USBDevIntSt & intrs) != intrs);
+  USBDevIntClr = intrs;  
+}
+
+
+void lpc_write_cmd(unsigned int cmd) 
+{
+  USBDevIntClr = USBDevInt_CCEMTY | USBDevInt_CDFULL;
+  USBCmdCode = cmd;
+  lpc_wait4devint(USBDevInt_CCEMTY);
+}
+
+void lpc_write_cmd_data (unsigned int cmd, unsigned int val) 
+{
+  lpc_write_cmd(cmd);
+  USBCmdCode = val;
+  lpc_wait4devint(USBDevInt_CCEMTY);
+}
+
+unsigned int lpc_read_cmd_data (unsigned int cmd)
+{
+  lpc_write_cmd(cmd);
+  lpc_wait4devint(USBDevInt_CDFULL);
+  return USBCmdData;
+} 
+
+void lpc_usb_realizeEP(unsigned int idx,unsigned int wmaxpsize)
+{
+  USBReEp |= (1 << idx);
+  USBEpInd = idx;
+  USBMaxPSize = wmaxpsize;
+  lpc_wait4devint(USBDevInt_EP_RLZED);
+}
+
+void lpc_usb_configEP(unsigned int ep_num,unsigned int wmaxpsize)
+{
+  lpc_usb_realizeEP(lpc_ep2addr(ep_num),wmaxpsize);
+  lpc_usb_enableEP(ep_num);
+}
+
+void lpc_usb_setstallEP(unsigned int ep_num) 
+{
+  lpc_write_cmd_data(USB_CMD_SET_EP_STAT(lpc_ep2addr(ep_num)),USB_DAT_WR_BYTE(USBC_EP_STAT_ST));
+}
+
+void lpc_usb_clrstallEP(unsigned int ep_num) 
+{
+  lpc_write_cmd_data(USB_CMD_SET_EP_STAT(lpc_ep2addr(ep_num)),USB_DAT_WR_BYTE(0));
+}
+
+void lpc_usb_enableEP(unsigned int ep_num) 
+{
+  lpc_write_cmd_data(USB_CMD_SET_EP_STAT(lpc_ep2addr(ep_num)),USB_DAT_WR_BYTE(0));
+}
+
+void lpc_usb_disableEP(unsigned int ep_num) 
+{
+  lpc_write_cmd_data(USB_CMD_SET_EP_STAT(lpc_ep2addr(ep_num)),USB_DAT_WR_BYTE(USBC_EP_STAT_DA));
+}
+
+void lpc_usb_set_addr(unsigned int adr)
+{
+  lpc_write_cmd_data(USB_CMD_SET_ADDR,USB_DAT_WR_BYTE(USBC_DEV_EN | adr)); /*  Setup Status Phase */
+}
+
+void lpc_usb_config_device(int fConfigured)
+{
+  lpc_write_cmd_data(USB_CMD_CFG_DEV,USB_DAT_WR_BYTE(fConfigured ? USBC_CONF_DEVICE : 0)); /*  Setup Status Phase */
+}
+
+void lpc_usb_reset(void)
+{
+  USBEpIntClr  = 0xFFFFFFFF;
+  USBEpIntEn   = 0xFFFFFFFF ^ USB_DMA_EP;
+  USBDevIntClr = 0xFFFFFFFF;
+  USBDevIntEn  = USBDevInt_DEV_STAT | USBDevInt_EP_SLOW;
+
+  lpc_usb_configEP(0x00, USB_MAX_PACKET0);
+  lpc_usb_configEP(0x80, USB_MAX_PACKET0);
+}
+
+void lpc_usb_hw_init (void) 
+{
+
+  PINSEL1 &= ~0xC000C000;
+//  PINSEL1 |=  0x40004000;                   /* Select USB Link, VBUS */
+  PINSEL1 |=  0x80000000;                   /* Select USB Link, VBUS */
+
+  PCONP |= 0x80000000;                      /* Turn On USB PCLK */
+
+  /* Configure 48MHz USB Clock;  FOsc = 12MHz, M = 4, P = 2 */
+  PLLCFG48  = 0x23;                         /* M = 4, P = 2 */
+  PLLCON48  = PLLCON_PLLE;                  /* PLL Enable */
+  PLLFEED48 = 0xAA;                         /* Feed Sequence 1 */
+  PLLFEED48 = 0x55;                         /* Feed Sequence 2 */
+
+  while ((PLLSTAT48 & PLLSTAT_LOCK) == 0);  /* Wait for PLL Lock */
+
+  PLLCON48  = PLLCON_PLLE | PLLCON_PLLC;    /* PLL Enable & Connect */
+  PLLFEED48 = 0xAA;                         /* Feed Sequence 1 */
+  PLLFEED48 = 0x55;                         /* Feed Sequence 2 */
+
+  USBDevIntEn  = USBDevInt_DEV_STAT;        /* Enable Device Status Interrupt */
+
+  /* Partial Manual Reset since Automatic Bus Reset is not working */
+  lpc_usb_reset();
+  lpc_usb_set_addr(0);
+}
+
+/*
+ * lpc_usb_read_endpoint: Read USB Endpoint Data
+ * @EPNum: Endpoint Number - EPNum.0..3: Address, EPNum.7: Dir
+ * @ptr: Pointer to Data Buffer
+ * @size:
+ * Return Value: Number of bytes read
+ */
+int lpc_usb_read_endpoint( unsigned int ep_num, void *ptr, int size)
+{
+  unsigned int cnt,i,dwData;
+  unsigned char *p=ptr;
+
+  USBCtrl = ((ep_num & 0x0F) << 2) | USBCtrl_RD_EN;
+  do {
+    cnt = USBRxPLen;
+  } while ((cnt & USBRxPLen_PKT_RDY) == 0);
+  cnt &= USBRxPLen_PKT_LNGTH;
+
+  // get data
+  while (USBCtrl & USBCtrl_RD_EN) {
+    dwData = USBRxData;
+    if (p != NULL) {
+      for (i = 0; i < 4; i++) {
+       if (size-- != 0) {
+         *p = dwData & 0xFF;
+          p++;
+       }
+       dwData >>= 8;
+      }
+    }
+  }
+
+  lpc_write_cmd(USB_CMD_SEL_EP(lpc_ep2addr(ep_num)));
+  lpc_write_cmd(USB_CMD_CLR_BUF);
+
+  return cnt;
+}
+
+/*
+ * lpc_usb_write_endpoint: Write USB Endpoint Data
+ * @ep_num: Endpoint Number - ep_num.0..3: Address, ep_num.7: Dir
+ * @ptr: Pointer to Data Buffer
+ * @size:   Number of bytes to write
+ * Return Value:    Number of bytes written
+ */
+int lpc_usb_write_endpoint( unsigned int ep_num, const void *ptr, int size)
+{
+  unsigned int n;
+  const unsigned char *p=ptr;
+
+  USBCtrl = ((ep_num & 0x0F) << 2) | USBCtrl_WR_EN;
+  USBTxPLen = size;
+
+  for (n = 0; n < (size + 3) / 4; n++) {
+    USBTxData = (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
+    p += 4;
+  }
+
+  USBCtrl=0;
+
+  lpc_write_cmd(USB_CMD_SEL_EP(lpc_ep2addr(ep_num)));
+  lpc_write_cmd(USB_CMD_VALID_BUF);
+
+  return size;
+}
diff --git a/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Entries b/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..6ca4948
--- /dev/null
@@ -0,0 +1,3 @@
+/lpc.h/1.1/Sat Apr 28 19:37:38 2007//
+/lpcusb.h/1.3/Fri May 25 19:14:30 2007//
+D
diff --git a/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Repository b/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..41388ab
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/lpcusb/usb
diff --git a/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Root b/ulan/embedded/libs4c/usb/lpcusb/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/lpcusb/usb/lpc.h b/ulan/embedded/libs4c/usb/lpcusb/usb/lpc.h
new file mode 100644 (file)
index 0000000..c693182
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _USB_LPC_SUBMODULE_HEADER_FILE_
+#define _USB_LPC_SUBMODULE_HEADER_FILE_
+
+#include <usb/usb.h>
+int usb_lpc_init( usb_device_t *udev);
+
+#endif /* _USB_LPC_SUBMODULE_HEADER_FILE_ */
+
diff --git a/ulan/embedded/libs4c/usb/lpcusb/usb/lpcusb.h b/ulan/embedded/libs4c/usb/lpcusb/usb/lpcusb.h
new file mode 100644 (file)
index 0000000..0f111bb
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _LPCUSB_BASE_MODULE
+#define _PLCUSB_BASE_MODULE
+
+/*********************************************************/
+// Function prototypes
+//
+// LPCUSB common commands
+unsigned int lpc_ep2addr(unsigned int ep_num);
+void lpc_wait4devint(unsigned int intrs);
+void lpc_write_cmd(unsigned int cmd);
+void lpc_write_cmd_data (unsigned int cmd, unsigned int val);
+unsigned int lpc_read_cmd_data (unsigned int cmd);
+void lpc_usb_realizeEP(unsigned int idx,unsigned int wmaxpsize);
+void lpc_usb_configEP(unsigned int ep_num,unsigned int wmaxpsize);
+void lpc_usb_setstallEP (unsigned int ep_num);
+void lpc_usb_clrstallEP (unsigned int ep_num);
+void lpc_usb_enableEP(unsigned int ep_num); 
+void lpc_usb_disableEP(unsigned int ep_num);
+void lpc_usb_config_device(int fConfigured);
+void lpc_usb_reset(void);
+void lpc_usb_set_addr(unsigned int adr);
+void lpc_usb_hw_init (void);
+int lpc_usb_read_endpoint( unsigned int ep_num, void *ptr, int size);
+int lpc_usb_write_endpoint( unsigned int ep_num, const void *ptr, int size);
+
+#endif // from _LPC_BASE_MODULE
diff --git a/ulan/embedded/libs4c/usb/more/CVS/Entries b/ulan/embedded/libs4c/usb/more/CVS/Entries
new file mode 100644 (file)
index 0000000..9dc8c12
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Wed Feb 23 11:05:20 2005//
+/Makefile.omk/1.3/Mon Oct  3 12:43:29 2005//
+/usb_com.c/1.1/Wed Feb 23 11:05:20 2005//
+/usb_srq.c/1.4/Mon Aug  8 06:38:09 2005//
+D/usb////
diff --git a/ulan/embedded/libs4c/usb/more/CVS/Repository b/ulan/embedded/libs4c/usb/more/CVS/Repository
new file mode 100644 (file)
index 0000000..b4b5663
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/more
diff --git a/ulan/embedded/libs4c/usb/more/CVS/Root b/ulan/embedded/libs4c/usb/more/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/more/Makefile b/ulan/embedded/libs4c/usb/more/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/usb/more/Makefile.omk b/ulan/embedded/libs4c/usb/more/Makefile.omk
new file mode 100644 (file)
index 0000000..c28fbda
--- /dev/null
@@ -0,0 +1,18 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_USB_MORE=n
+
+ifeq ($(CONFIG_USB_MORE),y) 
+lib_LIBRARIES = usbmore
+
+#shared_LIBRARIES = 
+
+#include_HEADERS  = 
+
+usbmore_SOURCES = usb_srq.c
+
+#lib_LOADLIBES = 
+#bin_PROGRAMS = 
+
+endif #CONFIG_USB_MORE
+
diff --git a/ulan/embedded/libs4c/usb/more/usb/CVS/Entries b/ulan/embedded/libs4c/usb/more/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..eee47df
--- /dev/null
@@ -0,0 +1,4 @@
+/msc_loader.h/1.1/Wed Feb 23 11:05:20 2005//
+/usb_com.h/1.1/Wed Feb 23 11:05:20 2005//
+/usb_loader.h/1.1/Wed Feb 23 11:05:20 2005//
+D
diff --git a/ulan/embedded/libs4c/usb/more/usb/CVS/Repository b/ulan/embedded/libs4c/usb/more/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..84a3612
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/more/usb
diff --git a/ulan/embedded/libs4c/usb/more/usb/CVS/Root b/ulan/embedded/libs4c/usb/more/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/more/usb/msc_loader.h b/ulan/embedded/libs4c/usb/more/usb/msc_loader.h
new file mode 100644 (file)
index 0000000..f912d2b
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _MSC_LOADER_H
+#define _MSC_LOADER_H
+
+#include <usb/usb_loader.h>
+
+int usb_msc1210_loader(usb_device_t *udev);
+
+#endif /*_MSC_LOADER_H*/
diff --git a/ulan/embedded/libs4c/usb/more/usb/usb_com.h b/ulan/embedded/libs4c/usb/more/usb/usb_com.h
new file mode 100644 (file)
index 0000000..1f87b9b
--- /dev/null
@@ -0,0 +1,17 @@
+
+#ifndef _USB_COM_H
+  #define _USB_COM_H
+  
+/* Queued USB Module */
+  extern int usb_tm_snd;
+  extern int usb_tm_snded;
+  extern int usb_tm_rcv;
+  
+  int usb_com_init( void);
+  void usb_com_start_send( void);
+  
+  int usb_com_sendch(int c);
+  int usb_com_recch();
+  int usb_com_sendstr(const char *s);
+
+#endif /* _USB_COM_H */
diff --git a/ulan/embedded/libs4c/usb/more/usb/usb_loader.h b/ulan/embedded/libs4c/usb/more/usb/usb_loader.h
new file mode 100644 (file)
index 0000000..5c215e4
--- /dev/null
@@ -0,0 +1,31 @@
+#include <usb/usb.h>
+
+#ifndef _USB_LOADER_H
+#define _USB_LOADER_H
+
+#define USB_VENDOR_GET_CAPABILITIES  0x00 // get capabilities
+#define USB_VENDOR_RESET_DEVICE      0x08
+// #define USB_VENDOR_SET_BYTE          0x10
+// #define USB_VENDOR_SET_WORD          0x20
+#define USB_VENDOR_GET_SET_MEMORY    0x30
+#define USB_VENDOR_ERASE_MEMORY      0x40 // erase memory for 1 Byte
+#define USB_VENDOR_ERASE_1KB_MEMORY  0x48 // erase memory for 1 KB
+#define USB_VENDOR_MASS_ERASE        0x50 // erase all device memory
+#define USB_VENDOR_GOTO              0x60
+#define USB_VENDOR_CALL              0x70
+#define USB_VENDOR_GET_STATUS        0xF0
+#define USB_VENDOR_MASK              0xF8 // mask for vendor commands
+
+#define USB_VENDOR_MEMORY_BY_BULK    0x80
+
+#if 0 /* MSP430 */
+#define USB_VENDOR_TARGET_ADAPTER    0x01
+#define USB_VENDOR_TARGET_MSP430     0x02
+#else /* MSC1210 */
+#define USB_VENDOR_TARGET_DATA       0x01
+#define USB_VENDOR_TARGET_XDATA      0x02
+#endif
+
+#define USB_VENDOR_TARGET_MASK       0x07
+
+#endif /*_USB_LOADER_H*/
diff --git a/ulan/embedded/libs4c/usb/more/usb_com.c b/ulan/embedded/libs4c/usb/more/usb_com.c
new file mode 100644 (file)
index 0000000..71991ba
--- /dev/null
@@ -0,0 +1,1061 @@
+/*********************************************************/
+/***   Module : USB communication                      ***/
+/***   Author : Roman Bartosinski (bartosr@centrum.cz) ***/
+/***   Modify : 14.01.2003                             ***/
+/*********************************************************/
+
+#include <cpu_def.h>
+#include <system_def.h>
+#include <stdio.h>
+#include "pdiusb.h"
+#include <h8s2633h.h>
+/*#include <usb/usb_spec.h>*/
+#include "usb_defs.h"
+#include <usb/usb.h>
+#include <usb/usb_com.h>
+
+
+/* Queued USB Module */
+typedef volatile struct{
+  unsigned char *first;
+  unsigned char *last;
+  unsigned char *begin;
+  unsigned char *end;
+} usb_com_que_t;
+
+#define USB_COM_BUF_LEN    80 //(80*8)
+
+usb_com_que_t usb_com_que_in;  /* input queue */
+unsigned char usb_com_buf_in[USB_COM_BUF_LEN];
+usb_com_que_t usb_com_que_out; /* output queue */
+unsigned char usb_com_buf_out[USB_COM_BUF_LEN];
+
+int usb_com_init( void);
+int usb_com_put(usb_com_que_t *q, int c);
+int usb_com_get(usb_com_que_t *q);
+
+usb_vendor_extension_fnc_t *usb_vendor_extension=0;
+
+#ifdef PDIUSB_WITH_ADD_IRQ_HANDLER
+/* usb irq handler struct */
+irq_handler_t usb_irq_handler;
+#elif defined(PDIUSB_WITH_EXCPTVECT_SET)
+void usb_isr(void) __attribute__ ((interrupt_handler));
+#endif /*PDIUSB_WITH_EXCPTVECT_SET*/
+
+int usb_irq_cnt;
+
+/* common external function for pdiusb module */
+  void pdiSendCommand( unsigned char byCmd) {
+    writeb( byCmd, PDIUSB_COMMAND_ADDR);
+  }
+  unsigned char pdiReadData( unsigned char byCount, unsigned char *pbyData) {
+    unsigned char out = byCount;
+    
+    while (byCount--) {
+      *pbyData = readb( PDIUSB_READ_DATA_ADDR);
+      pbyData++;
+    }
+    
+    return out;
+  }
+  void pdiWriteData( unsigned char byCount, unsigned char *pbyData) {
+    while (byCount--) {
+      writeb( *pbyData++, PDIUSB_WRITE_DATA_ADDR);
+    }
+  }            
+  
+  
+/* usb communication module */
+  /* data */
+  usb_flags_t usb_flags;  
+  unsigned char usb_address;
+  unsigned char usb_interface;
+  usb_control_ep_t usb_rxtx_control;
+  usb_bulk_ep_t usb_rx_bulk, usb_tx_bulk;
+  
+  volatile unsigned int usb_last_irq;
+  // internal buffer for data from/to control req. - must be global
+  unsigned char ctrl_data[PDI_EP0_PACKET_SIZE];
+                   
+  typeof(msec_time) usb_start = 0, usb_stop = 0;
+  
+
+    
+/* functions */
+  int usb_run( void) {
+    int ret = 0;
+    if ( usb_flags.running) {
+#ifdef USE_USB_WITH_IRQ
+      if (!usb_flags.bits.was_int) return ret;
+      usb_flags.was_int = 0;
+#else
+      ret = usb_test_interrupt();
+      if ( usb_flags.request == 1) {
+        usb_answer_to_request();
+      }
+      if ( usb_flags.request == 2) { // request is set in  usb_answer_to_request()
+        if (( usb_rxtx_control.dreq.bmRequestType & USB_DATA_DIR_MASK)==USB_DATA_DIR_TO_HOST) {
+          unsigned int now = usb_rxtx_control.bytes;
+          if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+         if ( usb_rxtx_control.next_pkt_fnc )
+           if( usb_rxtx_control.next_pkt_fnc(&usb_rxtx_control, now, USB_NEXT_PKT_SEND) ) {
+              usb_stall_ep0();
+             return -1;
+           }
+          debugPrint( DBG_HIGH, ("CNTR send 1.data (%d)\n", now));
+          pdiWriteEndpoint( PDI_EP0_TX, now, usb_rxtx_control.data);
+          usb_rxtx_control.data += now;
+          if ( !(usb_rxtx_control.bytes -= now)) {
+            usb_flags.request = 3;
+          }
+        }
+      }
+      if ( usb_flags.request == 3) {
+        if ( !usb_rxtx_control.dreq.wLength ||
+             (usb_rxtx_control.dreq.bmRequestType & USB_DATA_DIR_MASK)==USB_DATA_DIR_FROM_HOST) {
+          pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+         if ( usb_rxtx_control.complete_fnc )
+           usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_OK);
+         usb_rxtx_control.next_pkt_fnc = NULL;
+         usb_rxtx_control.complete_fnc = NULL;
+        }
+      }
+#endif
+    }
+    return ret;
+  }  
+  
+  int usb_test_interrupt( void) { //_naked {
+    unsigned char usb_last_status;
+    int ret = 0;
+//    INTERRUPT_PRE(0);
+//    LEDr = 1;
+//    EA=0;
+    usb_last_irq = pdiGetInterrupt();
+    if ( usb_last_irq) {
+      ret = 1;
+      debugPrint( DBG_MEDIUM, ("USB Interrupt 0x%X\n",usb_last_irq));
+      if ( usb_last_irq & PDI_INT_BUSRESET) {                  // D12 - Bus reset reached
+        usb_flags.configured = 0;
+        if ( usb_flags.running && usb_flags.stop_request) {
+          usb_flags.running = 0;
+          usb_flags.stop_request = 0;
+        }
+        debugPrint( DBG_HIGH, ("Bus Reset\n"));
+      } else {
+        if ( usb_last_irq & PDI_INT_SUSPEND) {            // D12 - Suspend flag changed
+          debugPrint( DBG_HIGH, ("Suspend Changed\n"));
+        }
+        // it must be first b/c tx and rx can be sended all together
+        if ( usb_last_irq & PDI_INT_EP0_IN) {                 // D12 - Ep0TxDone - data in EP0 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP0_TX);
+          debugPrint( DBG_HIGH, ("Ep0-Tx LTS=0x%X\n", usb_last_status));    
+          if (( usb_last_status & PDI_LTSTAT_RXTX_OK) && usb_flags.request > 1) {
+            if ( usb_flags.request == 2) {
+              unsigned int now = usb_rxtx_control.bytes;
+              if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+
+             if ( usb_rxtx_control.next_pkt_fnc )
+               if( usb_rxtx_control.next_pkt_fnc(&usb_rxtx_control, now, USB_NEXT_PKT_SEND) ) {
+                 usb_stall_ep0();
+                 return -1;
+               }
+
+              debugPrint( DBG_HIGH, ("CNTR data\n"));
+              pdiWriteEndpoint( PDI_EP0_TX, now, usb_rxtx_control.data);
+              usb_rxtx_control.data += now;
+              if ( !(usb_rxtx_control.bytes -= now)) {
+                usb_flags.request = 3;
+              }
+            } else if ( usb_flags.request == 3) {
+              debugPrint( DBG_HIGH, ("CNTR ack\n"));
+              usb_flags.request = 0;
+             
+             if ( usb_rxtx_control.complete_fnc )
+               usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_OK);
+             usb_rxtx_control.next_pkt_fnc = NULL;
+             usb_rxtx_control.complete_fnc = NULL;
+             
+            } else {
+              debugPrint( DBG_LOW, ("tx ... ???\n"));
+            }
+          }
+        }
+        
+        if ( usb_last_irq & PDI_INT_EP0_OUT) {                // D12 - Ep0RxDone - some data was received in EP0
+          usb_last_status = pdiGetLastTransStatus( PDI_EP0_RX);
+          debugPrint( DBG_HIGH, ("Ep0-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            if ( usb_last_status & PDI_LTSTAT_SETUP) {
+              if ( usb_flags.request) {
+                debugPrint( DBG_HIGH, ("!!! New setup, but last not ack ...\n"));
+              }
+              usb_flags.request = 1; // Standard_requests();
+             if ( usb_rxtx_control.complete_fnc )
+               usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_FAIL);
+             usb_rxtx_control.next_pkt_fnc = NULL;
+             usb_rxtx_control.complete_fnc = NULL;
+            } else {
+              if ( usb_flags.request == 2) {
+                unsigned int now = usb_rxtx_control.bytes;
+                if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+                debugPrint( DBG_HIGH, ("CNTR data\n"));
+                ret = pdiReadEndpoint( PDI_EP0_RX, now, usb_rxtx_control.data);
+               
+               if(ret>usb_rxtx_control.bytes)
+                 ret = usb_rxtx_control.bytes;
+               
+               usb_rxtx_control.data += ret;
+               
+               if ( usb_rxtx_control.next_pkt_fnc ) {
+                 if( usb_rxtx_control.next_pkt_fnc(&usb_rxtx_control, ret, USB_NEXT_PKT_REC) ) {
+                    usb_stall_ep0();
+                   return -1;
+                 }
+               }
+               
+                if (!(usb_rxtx_control.bytes -= ret)) {
+                  usb_rxtx_control.data -= usb_rxtx_control.dreq.wLength;
+                  usb_flags.request = 3;
+                }
+              } else if ( usb_flags.request == 3) {
+                debugPrint( DBG_HIGH, ("CNTR ack\n"));
+                usb_flags.request = 0;
+                pdiReadEndpoint( PDI_EP0_RX, 0, 0);
+               if ( usb_rxtx_control.complete_fnc )
+                 usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_OK);
+               usb_rxtx_control.next_pkt_fnc = NULL;
+               usb_rxtx_control.complete_fnc = NULL;
+              } else {
+                pdiReadEndpoint( PDI_EP0_RX, 0, 0);
+              }
+            }
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP1_OUT) {                // D12 - Ep1RxDone - some data was received in EP1
+          usb_last_status = pdiGetLastTransStatus( PDI_EP1_RX);
+          debugPrint( DBG_HIGH, ("Ep1-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            pdiSetEpStatus( PDI_EP1_OUT, PDI_SET_EP_STALLED);
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP1_IN) {                 // D12 - Ep1TxDone - data in EP1 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP1_TX);
+          debugPrint( DBG_HIGH, ("Ep1-Tx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            pdiSetEpStatus( PDI_EP1_IN, PDI_SET_EP_STALLED);
+          }
+        }
+
+        if ( usb_last_irq & PDI_INT_EP2_OUT) {                // D12 - Ep2RxDone - some data was received in EP2
+          usb_last_status = pdiGetLastTransStatus( PDI_EP2_RX);
+          debugPrint( DBG_HIGH, ("Ep2-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {            
+            if ( usb_flags.terminal_mode) {
+              unsigned char hlpbfr[PDI_EP2_PACKET_SIZE], now = PDI_EP2_PACKET_SIZE, i;
+            MoreRead:
+              now = pdiReadEndpoint( PDI_EP2_RX, now, hlpbfr);
+              for(i=0;i<now;i++) {
+                usb_tm_rcv++;
+                if (usb_com_put( &usb_com_que_in, hlpbfr[i])<0) { /* nevkladat dalsi */
+                  break;
+                }
+              }
+              if(now==PDI_EP2_PACKET_SIZE) goto MoreRead;              
+            } else {
+              unsigned long now = usb_rx_bulk.remain;
+              if ( now > PDI_EP2_PACKET_SIZE) now = PDI_EP2_PACKET_SIZE;
+  
+              if ( !usb_flags.bits.bulk_rx_data) {
+                usb_flags.bulk_rx_data = 1;
+                usb_start = msec_time;
+              }
+  
+              ReadAgain:
+                ret = pdiReadEndpoint( PDI_EP2_RX, now, usb_rx_bulk.data);
+                usb_rx_bulk.data += now;
+                if ( !( usb_rx_bulk.remain -= now)) {
+                  //usb_rx_bulk.data -= usb_rx_bulk.bytes; /* read again */
+                  usb_stop = msec_time;              
+                  usb_flags.bulk_rx_data = 0;
+                // complete_func or set flag(event)
+                }
+              if ( usb_rx_bulk.remain > 0 && usb_rx_bulk.remain <= PDI_EP2_PACKET_SIZE) 
+                goto ReadAgain;
+            }
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP2_IN) {                 // D12 - Ep2TxDone - data in EP2 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP2_TX);
+          debugPrint( DBG_HIGH, ("Ep2-Tx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            if ( usb_flags.terminal_mode) {
+              int ch = usb_com_get( &usb_com_que_out);
+              usb_tm_snded++;
+              if ( ch < 0) {
+                usb_flags.bulk_tx_data = 0;                
+              } else {
+                unsigned char uchr = ch;
+                usb_flags.bulk_tx_data = 1;
+                pdiWriteEndpoint( PDI_EP2_TX, 1, &uchr);
+              }
+            } else {
+              if ( usb_tx_bulk.remain) {
+                unsigned int now = usb_tx_bulk.remain;
+                if ( now > PDI_EP2_PACKET_SIZE) now = PDI_EP2_PACKET_SIZE;
+                pdiWriteEndpoint( PDI_EP2_TX, now, usb_tx_bulk.data);
+                usb_tx_bulk.data += now;
+                if (!(usb_tx_bulk.remain -= now)) {
+                  // complete_func or set flag(event)
+                }
+              }
+            }
+          }
+        }
+        ret = 0;
+      }
+    }
+//    EA=1;
+//    LEDr = 0;
+//    INTERRUPT_POST();
+   return ret;
+  }
+
+
+// ************************************
+  void usb_init( void) {
+    usb_last_irq = 0; usb_address = 0; usb_interface = 0;
+    usb_flags.word = 0;
+    
+    usb_com_init();
+
+#ifdef USE_USB_WITH_IRQ
+    usb_irq_cnt=0;
+   #ifdef PDIUSB_WITH_ADD_IRQ_HANDLER
+    if( test_irq_handler( ISR_USB_INTV, &usb_irq_handler)==0)
+      add_irq_handler( ISR_USB_INTV, &usb_irq_handler);
+   #elif defined(PDIUSB_WITH_EXCPTVECT_SET)
+    excptvec_set(ISR_USB_INTV,&usb_isr);
+   #endif /*PDIUSB_WITH_ADD_IRQ_HANDLER*/
+    //*((char*)0xfffa1f) |= 0x04; /* It must be here for pull-up INT signal in usb_isr function */
+#endif    
+    debugPrint(DBG_MEDIUM,("# Usb Inited\n"));    
+  }
+
+  void usb_connect_bus( void) {
+    debugPrint(DBG_MEDIUM,("Usb connect to bus\n"));
+    usb_flags.running = 1;
+    usb_last_irq = 0;
+    pdiSetDMA( PDI_DMA_EP4_INT | PDI_DMA_EP5_INT); // ???
+    pdiSetMode( PDI_MODE_NO_LAZY_CLOCK | PDI_MODE_CLOCK_RUNNING | PDI_MODE_SOFT_CONNECT | PDI_CLOCK_SET_TO_ONE | PDI_CLOCK_4M);
+  }
+  void usb_disconnect_bus( void) {
+    debugPrint(DBG_MEDIUM,("Usb disconnect from bus\n"));
+    pdiSetMode( PDI_MODE_NO_LAZY_CLOCK | PDI_MODE_CLOCK_RUNNING | PDI_CLOCK_SET_TO_ONE | PDI_CLOCK_4M);
+    usb_flags.configured = 0;
+    usb_flags.stop_request = 1;
+  }
+
+  void usb_stall_ep0( void) {
+    pdiSetEpStatus( PDI_EP0_TX, PDI_SET_EP_STALLED); pdiSetEpStatus( PDI_EP0_RX, PDI_SET_EP_STALLED);
+  }
+  
+
+// ************************************
+// ***   Common send/receive fncs   ***
+// ************************************
+/*
+  void usb_send_to_usb( unsigned char idx, unsigned char maxb) {
+    debugPrint( DBG_HIGH,("USB Send EP#%d (max=%d) <- buff 0x%lX, cnt %d\n",usb_ep[idx].ep, maxb, (unsigned long)usb_ep[idx].buff,usb_ep[idx].bytes));
+    if ( !usb_ep[idx].bytes) pdiWriteEndpoint( usb_ep[idx].ep, 0, 0);
+    else {
+      if ( usb_ep[idx].bytes > maxb) {
+        pdiWriteEndpoint( usb_ep[idx].ep, maxb, usb_ep[idx].buff);
+        usb_ep[idx].bytes -= maxb;
+        usb_ep[idx].buff += maxb;
+      } else {
+        pdiWriteEndpoint( usb_ep[idx].ep, usb_ep[idx].bytes, usb_ep[idx].buff);
+        usb_ep[idx].buff += usb_ep[idx].bytes;
+        usb_ep[idx].bytes = 0;
+//        if ( usending) usending = 0;
+      }
+    }
+  }
+
+  unsigned char usb_receive_from_usb( unsigned char idx, unsigned char maxb) {
+    unsigned char ret = 0;
+
+    ret = (unsigned char)usb_ep[idx].bytes;
+    if ( !ret || ret > maxb) ret = maxb;
+    debugPrint( DBG_HIGH,("USB Receive EP#%d ->buff 0x%lX,cnt %d,(max %d)\n",usb_ep[idx].ep,(unsigned long)usb_ep[idx].buff,usb_ep[idx].bytes,ret));
+    if ( !usb_ep[idx].bytes) {
+//      ureceiving = 0;
+      pdiReadEndpoint( usb_ep[idx].ep, 0, 0);
+      return 0xff; // too_small_buffer error
+    }
+    do {
+      ret = pdiReadEndpoint( usb_ep[idx].ep, ret, usb_ep[idx].buff);
+      debugPrint( DBG_HIGH,(" - really readed %d\n", ret));
+      usb_ep[idx].buff += ret;
+      usb_ep[idx].bytes -= ret;
+    } while (( ret == maxb) && usb_ep[idx].bytes);
+    return ret;
+  }
+*/
+
+
+#ifdef DEBUG
+  char *ReqRecipient( char rqt) {
+    switch ( rqt & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:    return "DEVICE";
+      case USB_RECIPIENT_INTERFACE: return "INTERFACE";
+      case USB_RECIPIENT_ENDPOINT:  return "ENDPOINT";
+    }
+    return "OTHER";
+  }
+  char *ReqType( char rqt) {
+    switch ( rqt & USB_REQUEST_TYPE_MASK) {
+      case USB_STANDARD_REQUEST: return "STANDARD";
+      case USB_CLASS_REQUEST:    return "CLASS";
+      case USB_VENDOR_REQUEST:   return "VENDOR";
+    }
+    return "RESERVED";
+  }
+  char *ReqName( char req) {
+    switch ( req & USB_REQUEST_MASK) {
+      case USB_REQUEST_GET_STATUS:        return "GET STATUS";
+      case USB_REQUEST_CLEAR_FEATURE:     return "CLEAR FEATURE";
+      case USB_REQUEST_SET_FEATURE:       return "SET FEATURE";
+      case USB_REQUEST_SET_ADDRESS:       return "SET ADDRESS";
+      case USB_REQUEST_GET_DESCRIPTOR:    return "GET DESCRIPTOR";
+      case USB_REQUEST_SET_DESCRIPTOR:    return "SET DESCRIPTOR";
+      case USB_REQUEST_GET_CONFIGURATION: return "GET CONFIGURATION";
+      case USB_REQUEST_SET_CONFIGURATION: return "SET CONFIGURATION";
+      case USB_REQUEST_GET_INTERFACE:     return "GET INTERFACE";
+      case USB_REQUEST_SET_INTERFACE:     return "SET INTERFACE";
+      case USB_REQUEST_SYNC_FRAME:        return "SYNC FRAME";
+    }
+    return "UNKNOWN";
+  }
+#endif
+
+
+  void usb_set_control_data(usb_control_ep_t *ep, void *buff, int size)
+  {
+    ep->data = (unsigned char *) buff;
+    ep->bytes = size;
+    usb_flags.request = 2;
+    debugPrint( DBG_HIGH,("usb_set_control_data buff=0x%lx, len=%d\n", (long)buff, size));
+  }
+
+  void usb_set_control_ack(usb_control_ep_t *ep)
+  {
+    ep->data = NULL;
+    ep->bytes = 0;
+    usb_flags.request = 3;
+    debugPrint( DBG_HIGH,("usb_set_control_ack\n"));
+  }
+  
+
+ /*
+  ***********************************
+  ***   Execute device requests   ***
+  ***********************************
+  */
+  void usb_answer_to_request( void) {
+    USB_DEVICE_REQUEST *pdreq = &usb_rxtx_control.dreq;
+    
+    debugPrint( DBG_MEDIUM,("Process usb setup packet\n"));
+    usb_rxtx_control.req_size=pdiReadEndpoint( PDI_EP0_RX, 255, (unsigned char *)pdreq);
+    if ( usb_rxtx_control.req_size == 0xff) {
+      /*LEDr = 1; SetLeds( hlp[0]);*/
+      debugPrint( DBG_LOW,("! BIG Setup packet\n"));
+      usb_stall_ep0();
+      return;
+    }
+    pdiAckSetupControl();
+    /* !!! it must be here !!! */
+    pdreq->wValue = SWAP( pdreq->wValue);
+    pdreq->wIndex = SWAP( pdreq->wIndex);
+    pdreq->wLength = SWAP( pdreq->wLength);
+
+    usb_rxtx_control.next_pkt_fnc = NULL;
+    usb_rxtx_control.complete_fnc = NULL;
+
+    ctrl_data[0] = ctrl_data[1] = 0; // we need only 2 bytes
+
+    #ifdef DEBUG
+      debugPrint( DBG_HIGH, ("Receive (0x%X) %s req. for %s , data %s host\n", 
+                  pdreq->bmRequestType, ReqType( pdreq->bmRequestType), 
+                  ReqRecipient(pdreq->bmRequestType),
+                  ((pdreq->bmRequestType & USB_DATA_DIR_MASK) ? "TO":"FROM")));
+      debugPrint( DBG_HIGH, ("   Request (0x%X) %s\n", pdreq->bRequest, 
+                  ((!(pdreq->bmRequestType&USB_REQUEST_TYPE_MASK))? ReqName( pdreq->bRequest):"UNKNOWN")));
+    #endif
+    
+    switch( pdreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        switch( pdreq->bmRequestType & USB_REQUEST_TYPE_MASK) {
+          case USB_STANDARD_REQUEST:
+            switch( pdreq->bRequest) {
+              case USB_REQUEST_GET_STATUS:
+                #ifdef USB_MY_SELF_POWER 
+                  ctrl_data[0]=1;
+                #else 
+                  ctrl_data[0]=0;
+                #endif
+                USB_SET_CONTROL_DATA( &ctrl_data, 2);
+                //pdiWriteEndpoint( PDI_EP0_TX, 2, hlp);
+                break;
+              case USB_REQUEST_SET_ADDRESS:
+                usb_address = ( unsigned char)( pdreq->wValue & DEVICE_ADDRESS_MASK);
+                pdiSetAddressEnable( usb_address | PDI_ENAD_ENABLE);
+                USB_SET_CONTROL_ACK;
+                //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+                break;
+              case USB_REQUEST_GET_DESCRIPTOR:
+                usb_get_descriptor();
+                break;
+              case USB_REQUEST_GET_CONFIGURATION:
+                if ( usb_flags.configured) ctrl_data[0] = 1;
+                USB_SET_CONTROL_DATA( &ctrl_data, 1);
+                //pdiWriteEndpoint( PDI_EP0_TX, 1, hlp);
+                break;
+              case USB_REQUEST_SET_CONFIGURATION:
+                if (LSB( pdreq->wValue) < 2) {
+                  if ( LSB( pdreq->wValue)) {
+                    pdiSetEndpointEnable( usb_flags.configured=1);
+                  } else {
+                    pdiSetEndpointEnable( usb_flags.configured=0);
+                  }
+                  USB_SET_CONTROL_ACK;
+                  //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+                } else
+                  usb_stall_ep0();
+                break;                
+              default:
+                usb_stall_ep0();
+                break;
+            }
+
+            break;
+          case USB_VENDOR_REQUEST:
+           if(usb_vendor_extension) {
+             int ret;
+             ret = usb_vendor_extension(&usb_rxtx_control, pdreq);
+             if (ret<0) {
+               usb_stall_ep0();
+               break;
+             }
+             if (ret>0) {
+               break;
+             }
+           }
+         
+            switch ( pdreq->bRequest) {
+              case USB_VENDOR_START_TRANSFER:
+                {
+                  unsigned long max = ((long)pdreq->wIndex << 16)+pdreq->wValue;
+                  usb_rx_bulk.remain = ( usb_rx_bulk.bytes < max) ? usb_rx_bulk.bytes : max;
+                }
+                USB_SET_CONTROL_ACK;
+               break;
+              case USB_VENDOR_CONTROL_TERMINAL_MODE:
+                if ( pdreq->wValue == 1) usb_flags.terminal_mode = 1;
+                else usb_flags.terminal_mode = 0;
+                USB_SET_CONTROL_ACK;
+               break;
+              default:
+                USB_SET_CONTROL_ACK;
+                //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+                break;
+            }            
+            break;            
+          case USB_CLASS_REQUEST:
+            usb_stall_ep0();
+          default:
+            usb_stall_ep0();
+            break;
+        }
+        break;
+      case USB_RECIPIENT_INTERFACE:
+        if (( pdreq->bmRequestType & USB_REQUEST_TYPE_MASK) == USB_STANDARD_REQUEST) {
+          switch( pdreq->bRequest) {
+            case USB_REQUEST_GET_STATUS:
+              USB_SET_CONTROL_DATA( &ctrl_data, 2);
+              //pdiWriteEndpoint( PDI_EP0_TX, 2, hlp);
+              break;
+            case USB_REQUEST_GET_INTERFACE:
+              debugPrint( DBG_HIGH,("ReqIfc=%d Now ifc=%d\n", pdreq->wIndex, usb_interface));
+              USB_SET_CONTROL_DATA( &ctrl_data, 1); // alternate interface
+              //pdiWriteEndpoint( PDI_EP0_TX, 1, hlp);
+              break;
+            case USB_REQUEST_SET_INTERFACE:
+              //if (( dreq.wValue == 0) && ( dreq.wIndex == 0))
+              if ( pdreq->wIndex < 1) { // mame jen 2 pokusne interface
+                usb_interface = (unsigned char) pdreq->wIndex;
+                USB_SET_CONTROL_ACK;
+                //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+              } else
+                usb_stall_ep0();
+              break;
+            default:
+              usb_stall_ep0();                          
+          }
+        } else
+          usb_stall_ep0();
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if (( pdreq->bmRequestType & USB_REQUEST_TYPE_MASK) == USB_STANDARD_REQUEST) {
+          switch( pdreq->bRequest) {
+            case USB_REQUEST_GET_STATUS:
+            case USB_REQUEST_CLEAR_FEATURE:
+            case USB_REQUEST_SET_FEATURE:
+              {
+                ctrl_data[0] = ( unsigned char)(( pdreq->wIndex & PDI_CNT_EP)<<1);
+                if ( pdreq->wIndex & ( unsigned char) USB_ENDPOINT_DIRECTION_MASK)
+                  ctrl_data[0]++;
+                if ( pdreq->bRequest == USB_REQUEST_GET_STATUS) {
+                  ctrl_data[0] = pdiSelectEp( ctrl_data[0]); // endpoint in
+                  ctrl_data[0] = (( ctrl_data[0] & PDI_SELEP_STALL) == PDI_SELEP_STALL);
+                  USB_SET_CONTROL_DATA( &ctrl_data, 2);
+                  //pdiWriteEndpoint( PDI_EP0_TX, 2, hlp);
+                } else {
+                  if ( pdreq->bRequest == USB_REQUEST_CLEAR_FEATURE) {
+                    pdiSetEpStatus( ctrl_data[0], 0);
+                    //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+                  } else {
+                    pdiSetEpStatus( ctrl_data[0], 1);
+                    //pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+                  }
+                  USB_SET_CONTROL_ACK;
+                }
+              }
+              break;
+            default:
+              usb_stall_ep0();
+          }
+        } else 
+          usb_stall_ep0();
+        break;
+//      case USB_RECIPIENT_OTHER:
+      default:
+        usb_stall_ep0();
+        break;
+    }
+//    usb_flags.command = 0; // ??? data or ack stage ???
+
+#ifdef USE_USB_WITH_IRQ
+// send data if it is needed
+      if ( usb_flags.request == 2) { // request is set to data stage
+        if (( usb_rxtx_control.dreq.bmRequestType & USB_DATA_DIR_MASK)==USB_DATA_DIR_TO_HOST) {
+          unsigned int now = usb_rxtx_control.bytes;
+          if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+         if ( usb_rxtx_control.next_pkt_fnc )
+           if( usb_rxtx_control.next_pkt_fnc(&usb_rxtx_control, now, USB_NEXT_PKT_SEND) ) {
+              usb_stall_ep0();
+             return;
+           }
+          debugPrint( DBG_HIGH, ("CNTR send 1.data (%d)\n", now));
+          pdiWriteEndpoint( PDI_EP0_TX, now, usb_rxtx_control.data);
+          usb_rxtx_control.data += now;
+          if ( !(usb_rxtx_control.bytes -= now)) {
+            usb_flags.request = 3;
+          }
+        }
+      }
+      if ( usb_flags.request == 3) {
+        if ( !usb_rxtx_control.dreq.wLength ||
+             (usb_rxtx_control.dreq.bmRequestType & USB_DATA_DIR_MASK)==USB_DATA_DIR_FROM_HOST) {
+          pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+         if ( usb_rxtx_control.complete_fnc )
+           usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_OK);
+         usb_rxtx_control.next_pkt_fnc = NULL;
+         usb_rxtx_control.complete_fnc = NULL;
+        }
+      }
+#endif
+  }
+
+#ifdef DEBUG
+  char *DescType( unsigned char desc) {
+    switch ( desc) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:                    return"DEVICE";
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:             return"CONFIGURATION";
+      case USB_DESCRIPTOR_TYPE_STRING:                    return"STRING";
+      case USB_DESCRIPTOR_TYPE_INTERFACE:                 return"INTERFACE";
+      case USB_DESCRIPTOR_TYPE_ENDPOINT:                  return"ENDPOINT";
+      case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER:          return"DEVICE_QUALIFIER";
+      case USB_DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION: return"OTHER_SPEED_CONFIG";
+      case USB_DESCRIPTOR_TYPE_POWER:                     return"POWER";
+    }
+    return "UNKNOWN";
+  }
+#endif
+
+  void usb_get_descriptor( void) {
+    unsigned int size;
+    unsigned short wVal = usb_rxtx_control.dreq.wValue;
+    debugPrint( DBG_MEDIUM, (" - %s descriptor\n", DescType(MSB( wVal))));
+    switch ( MSB( wVal)) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:
+        usb_rxtx_control.data = (unsigned char *) &usb_device_descriptor;
+        size = sizeof( USB_DEVICE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:
+        usb_rxtx_control.data  = (unsigned char *) &usb_config_0;
+        size = CONFIG_0_DESCRIPTOR_LENGTH;
+        break;
+      case USB_DESCRIPTOR_TYPE_STRING:
+        if ( LSB( wVal) < USB_CNT_STRINGS) {
+          usb_rxtx_control.data  = (unsigned char *) StringDescriptors[ LSB( wVal)];
+          size = *usb_rxtx_control.data;
+        } else {
+          usb_stall_ep0();
+          return;
+        }
+        break;
+      default:
+        usb_stall_ep0();
+        return;
+    }    
+    usb_rxtx_control.bytes = ( usb_rxtx_control.dreq.wLength < size) ? usb_rxtx_control.dreq.wLength : size;
+    usb_flags.request = 2;
+    //usb_send_to_usb( SEND_EP0, PDI_EP0_PACKET_SIZE);
+  }
+
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/***                                                                       ***/
+/*** USB with IRQ                                                          ***/
+/***                                                                       ***/
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+ #ifdef PDIUSB_WITH_EXCPTVECT_SET
+  void usb_isr(void)
+ #else /*PDIUSB_WITH_EXCPTVECT_SET*/
+  void usb_isr(int intno, void *dev_id, struct pt_regs *regs)
+ #endif /*PDIUSB_WITH_EXCPTVECT_SET*/
+  {
+    unsigned char usb_last_status;
+    
+    usb_irq_cnt++;    
+    usb_last_irq = pdiGetInterrupt();
+    if ( usb_last_irq) {
+      usb_flags.was_int = 1;
+      
+      debugPrint( DBG_INT, ("USB Interrupt 0x%X\n",usb_last_irq));
+      if ( usb_last_irq & PDI_INT_BUSRESET) {                  // D12 - Bus reset reached
+        usb_flags.configured = 0;
+        if ( usb_flags.running && usb_flags.stop_request) {
+          usb_flags.running = 0;
+          usb_flags.stop_request = 0;
+        }
+        debugPrint( DBG_INT, ("Bus Reset\n"));
+      } else {
+        if ( usb_last_irq & PDI_INT_SUSPEND) {            // D12 - Suspend flag changed
+          debugPrint( DBG_INT, ("Suspend Changed\n"));
+        }
+        // it must be first b/c tx and rx can be sended all together
+        if ( usb_last_irq & PDI_INT_EP0_IN) {                 // D12 - Ep0TxDone - data in EP0 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP0_TX);
+          debugPrint( DBG_INT, ("Ep0-Tx LTS=0x%X\n", usb_last_status));    
+          if (( usb_last_status & PDI_LTSTAT_RXTX_OK) && usb_flags.request > 1) {
+            if ( usb_flags.request == 2) {
+              unsigned int now = usb_rxtx_control.bytes;
+              if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+              debugPrint( DBG_INT, ("CNTR data\n"));
+              pdiWriteEndpoint( PDI_EP0_TX, now, usb_rxtx_control.data);
+              usb_rxtx_control.data += now;
+              if ( !(usb_rxtx_control.bytes -= now)) {
+                usb_flags.request = 3;
+              }
+            } else if ( usb_flags.request == 3) {
+              debugPrint( DBG_INT, ("CNTR ack\n"));
+              usb_flags.request = 0;
+            } else {
+              debugPrint( DBG_INT, ("tx 0 ... ???\n"));
+            }
+          }
+        }
+        
+        if ( usb_last_irq & PDI_INT_EP0_OUT) {                // D12 - Ep0RxDone - some data was received in EP0
+          usb_last_status = pdiGetLastTransStatus( PDI_EP0_RX);
+          debugPrint( DBG_INT, ("Ep0-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            if ( usb_last_status & PDI_LTSTAT_SETUP) {
+              if ( usb_flags.request) {
+                debugPrint( DBG_INT, ("!!! New setup, but last not ack ...\n"));
+              }
+              usb_flags.request = 1; // Standard_requests();
+              usb_answer_to_request();
+            } else {
+              if ( usb_flags.request == 2) {
+                unsigned int now = usb_rxtx_control.bytes, ret;
+                if ( now > PDI_EP0_PACKET_SIZE) now = PDI_EP0_PACKET_SIZE;
+                debugPrint( DBG_INT, ("CNTR data\n"));
+                ret = pdiReadEndpoint( PDI_EP0_RX, now, usb_rxtx_control.data);
+
+               if(ret>usb_rxtx_control.bytes)
+                 ret = usb_rxtx_control.bytes;
+
+                usb_rxtx_control.data += ret;
+
+               if ( usb_rxtx_control.next_pkt_fnc ) {
+                 if( usb_rxtx_control.next_pkt_fnc(&usb_rxtx_control, ret, USB_NEXT_PKT_REC) ) {
+                    usb_stall_ep0();
+                 }
+               }
+
+                if (!(usb_rxtx_control.bytes -= ret)) {
+                  usb_rxtx_control.data -= usb_rxtx_control.dreq.wLength;
+                  usb_flags.request = 3;
+                }
+              } else if ( usb_flags.request == 3) {
+                debugPrint( DBG_INT, ("CNTR ack\n"));
+                usb_flags.request = 0;
+                pdiReadEndpoint( PDI_EP0_RX, 0, 0);
+               if ( usb_rxtx_control.complete_fnc )
+                 usb_rxtx_control.complete_fnc(&usb_rxtx_control, USB_COMPLETE_OK);
+               usb_rxtx_control.next_pkt_fnc = NULL;
+               usb_rxtx_control.complete_fnc = NULL;
+              } else {
+                pdiReadEndpoint( PDI_EP0_RX, 0, 0);
+              }
+            }
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP1_OUT) {                // D12 - Ep1RxDone - some data was received in EP1
+          usb_last_status = pdiGetLastTransStatus( PDI_EP1_RX);
+          debugPrint( DBG_INT, ("Ep1-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            pdiSetEpStatus( PDI_EP1_OUT, PDI_SET_EP_STALLED);
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP1_IN) {                 // D12 - Ep1TxDone - data in EP1 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP1_TX);
+          debugPrint( DBG_INT, ("Ep1-Tx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            pdiSetEpStatus( PDI_EP1_IN, PDI_SET_EP_STALLED);
+          }
+        }
+
+        if ( usb_last_irq & PDI_INT_EP2_OUT) {                // D12 - Ep2RxDone - some data was received in EP2
+          usb_last_status = pdiGetLastTransStatus( PDI_EP2_RX);
+          debugPrint( DBG_INT, ("Ep2-Rx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            if ( usb_flags.terminal_mode) {
+              unsigned char hlpbfr[PDI_EP2_PACKET_SIZE], now = PDI_EP2_PACKET_SIZE, i;
+            MoreRead:
+              now = pdiReadEndpoint( PDI_EP2_RX, now, hlpbfr);
+              for(i=0;i<now;i++) {
+                usb_tm_rcv++;
+                if (usb_com_put( &usb_com_que_in, hlpbfr[i])<0) { /* nevkladat dalsi */
+                  break;
+                }
+              }
+              if(now==PDI_EP2_PACKET_SIZE) goto MoreRead;              
+            } else {
+              unsigned char now = (usb_rx_bulk.remain > (unsigned long)PDI_EP2_PACKET_SIZE)?PDI_EP2_PACKET_SIZE:(unsigned char)usb_rx_bulk.remain;
+  //            unsigned char hlp[2];            
+                
+                if ( !usb_flags.bits.bulk_rx_data) {
+                  usb_flags.bulk_rx_data = 1;
+                  usb_start = msec_time;
+                }
+  //              if ( now > PDI_EP2_PACKET_SIZE) now = PDI_EP2_PACKET_SIZE;
+              ReadAgain:
+                now = pdiReadEndpoint( PDI_EP2_RX, now, usb_rx_bulk.data);
+                usb_rx_bulk.data += now;
+                if ( !( usb_rx_bulk.remain -= now)) {
+                  usb_stop = msec_time;
+                  usb_flags.bulk_rx_data = 0;
+                // complete_func or set flag(event)
+                }
+              if ( usb_rx_bulk.remain > 0 && usb_rx_bulk.remain <= PDI_EP2_PACKET_SIZE) 
+                goto ReadAgain;
+            }  
+          }
+        }
+        if ( usb_last_irq & PDI_INT_EP2_IN) {                 // D12 - Ep2TxDone - data in EP2 was sended
+          usb_last_status = pdiGetLastTransStatus( PDI_EP2_TX);
+          debugPrint( DBG_INT, ("Ep2-Tx LTS=0x%X\n", usb_last_status));
+          if ( usb_last_status & PDI_LTSTAT_RXTX_OK) {
+            if ( usb_flags.terminal_mode) {              
+              int ch;
+              usb_tm_snded++;
+              ch = usb_com_get( &usb_com_que_out);
+              if ( ch < 0) {
+                usb_flags.bulk_tx_data = 0;
+              } else {
+                unsigned char uchr = ch;                
+                usb_flags.bulk_tx_data = 1;
+                pdiWriteEndpoint( PDI_EP2_TX, 1, &uchr);
+              }
+            } else {
+              if ( usb_tx_bulk.remain) {
+                unsigned int now = usb_tx_bulk.remain;
+                if ( now > PDI_EP2_PACKET_SIZE) now = PDI_EP2_PACKET_SIZE;
+                pdiWriteEndpoint( PDI_EP2_TX, now, usb_tx_bulk.data);
+                usb_tx_bulk.data += now;
+                if (!(usb_tx_bulk.remain -= now)) {
+                  // complete_func or set flag(event)
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+#ifdef PDIUSB_WITH_ADD_IRQ_HANDLER
+  irq_handler_t usb_irq_handler = {
+    handler: usb_isr,
+    flags:   0,
+    dev_id:  0,
+    devname: "usb",
+    next:    0
+  };
+#endif /*PDIUSB_WITH_ADD_IRQ_HANDLER*/
+
+  
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/***                                                                       ***/
+/*** USB COM Emulator Module                                               ***/
+/***                                                                       ***/
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/ 
+  int usb_tm_snd;
+  int usb_tm_snded;
+  int usb_tm_rcv;
+
+  int usb_com_init( void) {        
+    usb_tm_snd = 0;
+    usb_tm_snded = 0;
+    usb_tm_rcv = 0;
+    
+    usb_com_que_in.begin=usb_com_buf_in;
+    usb_com_que_in.end=usb_com_que_in.begin+sizeof(usb_com_buf_in);
+    usb_com_que_in.first=usb_com_que_in.begin;
+    usb_com_que_in.last=usb_com_que_in.begin;
+  
+    usb_com_que_out.begin=usb_com_buf_out;
+    usb_com_que_out.end=usb_com_que_out.begin+sizeof(usb_com_buf_out);
+    usb_com_que_out.first=usb_com_que_out.begin;
+    usb_com_que_out.last=usb_com_que_out.begin;
+  
+    return 1;
+  }
+
+  /* put character c into queue, if full return -1 */
+  int usb_com_put(usb_com_que_t *q, int c)
+  {
+    unsigned char *p=q->last;
+    *(p++)=(unsigned char)c;
+    if (p==q->end) p=q->begin;
+    if (p==q->first) return -1;
+    q->last=p;
+    return c;
+  }
+  /* get character from queue, if empty return -1 */
+  int usb_com_get(usb_com_que_t *q)
+  {
+    unsigned char *p;
+    int c;
+    p=q->first;
+    if(p==q->last) return -1;
+    c=*(p++);
+    if(p==q->end) p=q->begin;
+    q->first=p;
+    return c;
+  }
+
+/*
+  int usb_com_sendch(int c) {
+    if ( usb_flags.terminal_mode) {
+      usb_tm_snd++;
+      if ( !usb_flags.bits.bulk_tx_data) { // hned poslat - atomicke nastaveni flagu ... 
+        unsigned char byte = c;
+        pdiWriteEndpoint( PDI_EP2_TX, 1, (unsigned char *)&byte);
+        usb_flags.bulk_tx_data = 1; 
+      } else {        
+        if( usb_com_put(&usb_com_que_out,c)<0){ // nevejde se 
+#ifdef USE_USB_WITH_IRQ 
+          while( usb_com_que_out.last == usb_com_que_out.first-1); // Wait if buffer is full !@#$%^&* 
+          if( usb_com_put(&usb_com_que_out,c)<0)                   // case (last==end and first==begin) not respected 
+#endif
+            c=-1;
+        }
+      }
+    }
+    return c;
+  }
+*/  
+  void usb_com_start_send( void) {
+    if ( !usb_flags.bits.bulk_tx_data &&
+         usb_com_que_out.first != usb_com_que_out.last) {
+      int ch;
+      ch = usb_com_get( &usb_com_que_out);
+      if ( ch >= 0) {
+        unsigned char byte = ch;
+        usb_flags.bulk_tx_data = 1;
+        pdiWriteEndpoint( PDI_EP2_TX, 1, &byte);
+      }
+    }
+  }
+  
+  int usb_com_sendch(int c) {
+    if ( usb_flags.terminal_mode) {
+      usb_tm_snd++;
+#ifndef USE_USB_WITH_IRQ
+      if( !usb_flags.bits.bulk_tx_data) {
+        unsigned char byte = c;
+        usb_flags.bulk_tx_data = 1;
+        pdiWriteEndpoint( PDI_EP2_TX, 1, &byte);        
+        return c;
+      }
+#endif
+      if( usb_com_put(&usb_com_que_out,c)<0){ /* nevejde se */
+      
+#ifdef USE_USB_WITH_IRQ 
+        if ( !usb_flags.bits.bulk_tx_data) {
+          usb_com_start_send();
+        } else {
+          while( usb_com_que_out.last == usb_com_que_out.first-1); /* Wait if buffer is full !@#$%^&* */
+        }
+        if( usb_com_put(&usb_com_que_out,c)<0)                   /* case (last==end and first==begin) isn't respected */
+#endif
+          c=-1;
+      }
+    }
+    return c;
+  }
+  
+  
+  
+  int usb_com_recch() {
+    int val;
+    if ( !usb_flags.bits.terminal_mode) return -1;
+    val=usb_com_get(&usb_com_que_in);
+    return val;
+  }
+  
+  int usb_com_sendstr(const char *s) {
+    int cnt=0;
+    while(*s)
+    {
+      if(usb_com_sendch((unsigned char)(*(s++)))<0) break;
+      cnt++;
+    }
+    return cnt;    
+  }
+  
diff --git a/ulan/embedded/libs4c/usb/more/usb_srq.c b/ulan/embedded/libs4c/usb/more/usb_srq.c
new file mode 100644 (file)
index 0000000..463f039
--- /dev/null
@@ -0,0 +1,224 @@
+/*****************************************************/
+/***   Module : USB module                         ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <string.h>
+
+#include <system_def.h>
+#include <usb/usb.h>
+#include <usb/usb_spec.h>
+#include <usb/pdiusb.h>
+#include <usb/usbdebug.h>
+#include <usb/usb_srq.h>
+#include <usb/usb_defs.h>
+
+  // ****************************
+  int usb_stdreq_get_status( usb_device_t *udev)
+  {
+    unsigned char c, buf[2] = { 0, 0};
+    unsigned char epid = (unsigned char) udev->request.wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
+    switch( udev->request.bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( udev->flags & USB_FLAG_REMOTE_WAKE) //.remote_wake_up == 1)
+          buf[0] = USB_GETSTATUS_REMOTE_WAKEUP_ENABLED | USB_GETSTATUS_SELF_POWERED;
+        else
+          buf[0] = USB_GETSTATUS_SELF_POWERED;
+        break;
+      case USB_RECIPIENT_INTERFACE:
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+          c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
+        else
+          c = pdiSelectEp(pdiEp2Idx(epid));     // endpoint Out
+          #ifdef PDIUSBD12
+          buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
+          #else
+          buf[0] = 0;
+          #endif
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    pdiWriteEndpoint( PDI_EP0_TX, 2, buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_clear_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("ClearFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags &= ~USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 0;
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear TX stall for IN on EPn
+          else
+            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear RX stall for OUT on EPn
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_feature( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char epid = (unsigned char) dreq->wIndex;
+
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetFeature\n"));
+    switch( dreq->bmRequestType & USB_RECIPIENT) {
+      case USB_RECIPIENT_DEVICE:
+        if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
+          udev->flags |= USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 1;
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+      case USB_RECIPIENT_ENDPOINT:
+        if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
+          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
+            pdiSetEpStatus( pdiEp2Idx(epid), 1); // set TX stall for IN on EPn
+          else
+            pdiSetEpStatus( pdiEp2Idx(epid), 1);     // set RX stall for OUT on EPn
+          usb_udev_ack_setup( udev);
+          return USB_COMPLETE_OK;
+        }
+        break;
+    }
+    return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_set_address( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr\n"));
+    usb_udev_ack_setup( udev);
+    pdiSetAddressEnable( (dreq->wValue & DEVICE_ADDRESS_MASK) + PDI_ENAD_ENABLE);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_get_configuration( usb_device_t *udev)
+  {
+    unsigned char buf = udev->configuration; //usb_flags.configured;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
+    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_configuration( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    unsigned char iCfg = dreq->wValue & 0xff;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
+    if ( iCfg < 2) {       // put device in unconfigured state or set configuration 1 ( no else)
+      usb_udev_ack_setup( udev);
+      pdiSetEndpointEnable( 0); // USBInitUnconfig();
+      if ( iCfg) {
+        pdiSetEndpointEnable( PDI_EPEN_ENABLE); //USBInitConfig();
+        udev->flags |= USB_FLAG_CONFIGURED;
+      } else {
+        udev->flags &= ~USB_FLAG_CONFIGURED;
+      }
+      udev->configuration = iCfg;  //usb_flags.configured = iCfg;
+      return USB_COMPLETE_OK;
+    } else
+      return USB_COMPLETE_FAIL;
+  }
+
+  int usb_stdreq_get_interface( usb_device_t *udev)
+  {
+    unsigned char buf = 0; /// udev->interface
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
+    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    return USB_COMPLETE_OK;
+  }
+
+  int usb_stdreq_set_interface( usb_device_t *udev)
+  {
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetIface\n"));
+    if (( dreq->wValue == 0) && ( dreq->wIndex == 0)) {
+      usb_udev_ack_setup( udev);
+      return USB_COMPLETE_OK;
+    } else {
+      return USB_COMPLETE_FAIL;
+    }
+  }
+
+  int usb_stdreq_get_descriptor( usb_device_t *udev)
+  {
+    unsigned char *pDesc;
+    unsigned short Len = 0;
+    USB_DEVICE_REQUEST *dreq = &(udev->request);
+    int i;
+
+    i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("GetDesc\n"));
+    usb_debug_print( DEBUG_LEVEL_VERBOSE, ( " - %s desc.\n", /*(unsigned int)*/ usb_debug_get_std_descriptor(i)));
+
+    switch (i) {
+      case USB_DESCRIPTOR_TYPE_DEVICE:
+        pDesc = (unsigned char *)&DeviceDescription;
+        Len = sizeof( USB_DEVICE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_CONFIGURATION:
+        pDesc = (unsigned char *)&ConfigDescription;
+        Len = CONFIG_DESCRIPTOR_LENGTH;
+        break;
+      case USB_DESCRIPTOR_TYPE_INTERFACE:
+        pDesc = (unsigned char *)&ConfigDescription.interface;
+        Len = sizeof( USB_INTERFACE_DESCRIPTOR);
+        break;
+      case USB_DESCRIPTOR_TYPE_STRING:
+        i = dreq->wValue & 0xff; /* LSB part of wValue */
+        /*printf("Get descriptor indx=0x%02x\n", i);*/
+        if ( i < CNT_STRINGS) {
+          pDesc = (unsigned char *) StringDescriptors[ i];
+          Len = *pDesc;
+          /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
+        } else {
+          return USB_COMPLETE_FAIL;
+        }
+        break;
+      default:
+        return USB_COMPLETE_FAIL;
+    }
+    if ( dreq->wLength < Len) Len = dreq->wLength;
+    usb_send_control_data( udev, pDesc, Len);
+    return USB_COMPLETE_OK;
+  }
+
+
+/*  
+  void usb_init_stdreq_fnc( usb_device_t *udev)
+  {
+    // memset( udev->stdreq, 0, sizeof(udev->stdreq));
+    
+    udev->stdreq[USB_REQUEST_GET_STATUS] = usb_stdreq_get_status;
+    udev->stdreq[USB_REQUEST_CLEAR_FEATURE] = usb_stdreq_clear_feature;
+    udev->stdreq[USB_REQUEST_SET_FEATURE] = usb_stdreq_set_feature;
+    udev->stdreq[USB_REQUEST_SET_ADDRESS] = usb_stdreq_set_address;
+    udev->stdreq[USB_REQUEST_GET_DESCRIPTOR] = usb_stdreq_get_descriptor;
+    udev->stdreq[USB_REQUEST_GET_CONFIGURATION] = usb_stdreq_get_configuration;
+    udev->stdreq[USB_REQUEST_SET_CONFIGURATION] = usb_stdreq_set_configuration;
+    udev->stdreq[USB_REQUEST_GET_INTERFACE] = usb_stdreq_get_interface;
+    udev->stdreq[USB_REQUEST_SET_INTERFACE] = usb_stdreq_set_interface;
+  }
+*/
diff --git a/ulan/embedded/libs4c/usb/pdiusb/CVS/Entries b/ulan/embedded/libs4c/usb/pdiusb/CVS/Entries
new file mode 100644 (file)
index 0000000..f006866
--- /dev/null
@@ -0,0 +1,5 @@
+/Makefile/1.1/Wed Feb 23 11:05:20 2005//
+/Makefile.omk/1.3/Mon Oct  3 12:43:29 2005//
+/pdi.c/1.1/Wed Feb 23 11:05:20 2005//
+/pdiusb.c/1.3/Sun Aug  7 14:29:47 2005//
+D/usb////
diff --git a/ulan/embedded/libs4c/usb/pdiusb/CVS/Repository b/ulan/embedded/libs4c/usb/pdiusb/CVS/Repository
new file mode 100644 (file)
index 0000000..8f1276f
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/pdiusb
diff --git a/ulan/embedded/libs4c/usb/pdiusb/CVS/Root b/ulan/embedded/libs4c/usb/pdiusb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/pdiusb/Makefile b/ulan/embedded/libs4c/usb/pdiusb/Makefile
new file mode 100644 (file)
index 0000000..f595272
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else   
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/embedded/libs4c/usb/pdiusb/Makefile.omk b/ulan/embedded/libs4c/usb/pdiusb/Makefile.omk
new file mode 100644 (file)
index 0000000..40b9dfd
--- /dev/null
@@ -0,0 +1,12 @@
+# -*- makefile -*-
+
+default_CONFIG = CONFIG_USB_PDIUSB=n
+
+ifeq ($(CONFIG_USB_PDIUSB),y) 
+lib_LIBRARIES = usbpdi
+
+nobase_include_HEADERS = usb/pdi.h usb/pdiusb.h
+
+usbpdi_SOURCES = pdi.c pdiusb.c
+#usbpdi_SOURCES +=  pdi4rtems.c
+endif #CONFIG_USB_PDIUSB
diff --git a/ulan/embedded/libs4c/usb/pdiusb/pdi.c b/ulan/embedded/libs4c/usb/pdiusb/pdi.c
new file mode 100644 (file)
index 0000000..3229d36
--- /dev/null
@@ -0,0 +1,201 @@
+/*****************************************************/
+/***   Module : USB PDI                            ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <system_def.h>
+
+#define USB_PDI_EXPORT_FNC
+
+#include <usb/pdiusb.h>
+#include <usb/pdi.h>
+#include <usb/usbdebug.h>
+
+
+/* init chip state */
+  void pdiInitChipState( void) {
+   #ifdef PDIUSBD11
+    pdiSetHUBAddressEnable( 0, 0);
+   #endif /*PDIUSBD11*/
+    pdiSetAddressEnable( PDI_ENAD_ENABLE);
+    pdiSetEndpointEnable( PDI_EPEN_ENABLE);
+  }
+#ifdef PDIUSBD11
+
+  #define PDI_MODE_BASE_VALUE (PDI_MODE_MUSTBEONE | \
+  PDI_MODE_REMOTE_WAKEUP | PDI_MODE_NO_LAZY_CLOCK | \
+  PDI_MODE_CLOCK_RUNNING | PDI_CLOCK_4M)
+
+#else /*PDIUSBD11*/
+
+  #define PDI_MODE_BASE_VALUE (PDI_CLOCK_SET_TO_ONE | \
+  PDI_MODE_NO_LAZY_CLOCK | PDI_MODE_CLOCK_RUNNING | \
+  PDI_CLOCK_4M)
+
+#endif /*PDIUSBD11*/
+
+
+/* connect usb */
+  int usb_pdi_connect( usb_device_t *udev) {
+    pdiSetMode( PDI_MODE_BASE_VALUE | PDI_MODE_SOFT_CONNECT );
+    return 0;
+  }
+
+/* disconnect usb */
+  int usb_pdi_disconnect( usb_device_t *udev) {
+    pdiSetMode( PDI_MODE_BASE_VALUE & ~PDI_MODE_SOFT_CONNECT );
+    return 0;
+  }
+
+/* acknowledge control transfer */
+  void usb_pdi_ack_setup( usb_device_t *udev) {
+    pdiWriteEndpoint( PDI_EP0_TX, 0, 0);
+  }
+
+
+/* acknowledge control transfer */
+  void usb_pdi_ack_control_setup( usb_device_t *udev) {
+    pdiAckSetupControl();
+  }
+
+  
+/**
+ * usb_pdi_check events
+ * function reads interrupt register and sets event flags
+ * function returns 1 if there is some new event.
+ * function returns 0 if there isn't new event but all is OK
+ * function returns -1 if there is any error
+*/
+  int usb_pdi_check_events( usb_device_t *udev) {
+    volatile unsigned char LastTrans = 0;
+    volatile unsigned int LastInt;
+    int ret = 0, i;
+
+    LastInt = pdiGetInterrupt();
+if ( LastInt) {
+  usb_debug_print( DEBUG_LEVEL_LOW, ("PI=0x%04X\n", LastInt));
+}
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("PDI Int=0x%04X\n", LastInt));
+    
+    if ( LastInt & PDI_INT_BUSRESET) {                 // D12 - Bus reset reached
+      pdiInitChipState();
+      udev->flags |= USB_FLAG_BUS_RESET;
+      ret = 1;
+    } else {
+      #ifdef PDIUSBD12
+      if ( LastInt & PDI_INT_SUSPEND) {                 // D12 - Suspend flag changed
+        udev->flags |= USB_FLAG_SUSPEND;
+        ret = 1;
+      }
+      #endif
+
+            
+      if ( LastInt & PDI_INT_EP0_OUT) {                // D12 - Ep0RxDone - some data was received in EP0
+        LastTrans = pdiGetLastTransStatus( PDI_EP0_RX);
+        if ( LastTrans & PDI_LTSTAT_SETUP) { // setup packet
+          udev->flags |= USB_FLAG_SETUP;
+        } else {
+          udev->flags |= USB_FLAG_EVENT_RX0;
+        }
+        ret = 1;
+      }      
+      if ( LastInt & PDI_INT_EP0_IN) {                 // D12 - Ep0TxDone - data in EP0 was sended
+        LastTrans = pdiGetLastTransStatus( PDI_EP0_TX);
+        udev->flags |= USB_FLAG_EVENT_TX0;
+        ret = 1;
+      }
+
+      
+      for( i=0; i<udev->cntep; i++) {
+        if ( LastInt & (udev->ep+i)->event_mask) {
+          LastTrans = pdiGetLastTransStatus( (udev->ep+i)->epnum);
+          udev->ep_events |= 1<<i;
+          LastInt &= ~((udev->ep+i)->event_mask);
+          ret = 1;
+        }
+      }
+
+      /* check unsupported endpoints */
+      if ( LastInt & PDI_INT_EP1_OUT) {                // D12 - Ep1RxDone - some data was received in EP1
+        LastTrans = pdiGetLastTransStatus( PDI_EP1_RX);
+        pdiSetEpStatus( PDI_EP1_RX, PDI_SET_EP_STALLED);
+      }
+      if ( LastInt & PDI_INT_EP1_IN) {                 // D12 - Ep1TxDone - data in EP1 was sended
+        LastTrans = pdiGetLastTransStatus( PDI_EP1_TX);
+        pdiSetEpStatus( PDI_EP1_TX, PDI_SET_EP_STALLED);
+      }
+      if ( LastInt & PDI_INT_EP2_OUT) {                // D12 - Ep2RxDone - some data was received in EP2
+        LastTrans = pdiGetLastTransStatus( PDI_EP2_RX);
+        pdiSetEpStatus( PDI_EP2_RX, PDI_SET_EP_STALLED);
+      }
+      if ( LastInt & PDI_INT_EP2_IN) {                 // D12 - Ep2TxDone - data in EP2 was sended
+        LastTrans = pdiGetLastTransStatus( PDI_EP2_TX);
+        pdiSetEpStatus( PDI_EP2_TX, PDI_SET_EP_STALLED);
+      }
+     #if defined(PDIUSBD11) || defined(PDIUSBH11A_SINGLE)  // D11,H11_S
+      if ( LastInt & PDI_INT_EP3_OUT) {                // D11 - Ep3RxDone - some data was received in EP3
+        LastTrans = pdiGetLastTransStatus( PDI_EP3_RX);
+        pdiSetEpStatus( PDI_EP3_RX, PDI_SET_EP_STALLED);
+      }    
+      if ( LastInt & PDI_INT_EP3_IN) {                 // D11 - Ep3TxDone - data in EP3 was sended
+        LastTrans = pdiGetLastTransStatus( PDI_EP3_TX);
+        pdiSetEpStatus( PDI_EP3_TX, PDI_SET_EP_STALLED);
+      }
+     #endif /* D11,H11_S */
+    }
+    return ret;
+  }
+
+
+/* stall endpoint X */
+  void usb_pdi_stall( usb_ep_t *ep) {
+    if ( ep->epnum) {
+      pdiSetEpStatus( ep->epnum, PDI_SET_EP_STALLED);
+    } else { // endpoint0
+      pdiSetEpStatus( PDI_EP0_TX, PDI_SET_EP_STALLED);
+      pdiSetEpStatus( PDI_EP0_RX, PDI_SET_EP_STALLED);    
+    }
+  }
+
+  int usb_pdi_read_endpoint( usb_ep_t *ep, void *ptr, int size) USB_UDEV_REENTRANT_SIGN
+  {
+    if(!ep->epnum)
+       return pdiReadEndpoint( PDI_EP0_RX, size, ptr);
+    else
+       return pdiReadEndpoint( ep->epnum, size, ptr);
+  }
+  int usb_pdi_write_endpoint( usb_ep_t *ep, const void *ptr, int size) USB_UDEV_REENTRANT_SIGN
+  {
+    if(!ep->epnum)
+       pdiWriteEndpoint( PDI_EP0_TX, size, ptr);
+    else
+       pdiWriteEndpoint( ep->epnum, size, ptr);
+    return size;
+  }
+
+    
+/* init usb structures and chip */
+  int usb_pdi_init( usb_device_t *udev) {
+
+   #ifndef USB_PDI_DIRECT_FNC
+    udev->connect = usb_pdi_connect;
+    udev->disconnect = usb_pdi_disconnect;
+    udev->ack_setup = usb_pdi_ack_setup;
+    udev->ack_control_setup = usb_pdi_ack_control_setup;
+    udev->stall = usb_pdi_stall;
+    udev->check_events = usb_pdi_check_events;
+    udev->read_endpoint = usb_pdi_read_endpoint;
+    udev->write_endpoint = usb_pdi_write_endpoint;
+   #endif /*USB_PDI_DIRECT_FNC*/
+
+    udev->ep0.max_packet_size = PDI_EP0_PACKET_SIZE;
+
+    pdiInitChipState();
+    pdiSetMode( PDI_MODE_BASE_VALUE);
+    return 0;
+  }
diff --git a/ulan/embedded/libs4c/usb/pdiusb/pdiusb.c b/ulan/embedded/libs4c/usb/pdiusb/pdiusb.c
new file mode 100644 (file)
index 0000000..280717c
--- /dev/null
@@ -0,0 +1,527 @@
+/*********************************************************/
+/***   Module : PDIUSB D11,H11,H11A,D12 - implement.   ***/
+/***   Author : Roman Bartosinski (C) 03.10.2002       ***/
+/***   Description : Integrate common functions for    ***/
+/***                PDIUSBD11,PDIUSBD12,PDIUSBH11(old) ***/
+/***                PDIUSBH11A in Single/Multiple mode ***/
+/***                 to one common file.               ***/
+/***   Modify : 10.10.2002 - add H11                   ***/
+/***            13.10.2002 - add spec.fnc for 'using'  ***/
+/*********************************************************/
+
+#include <system_def.h>
+#include <endian.h>
+#if __BYTE_ORDER == __BIG_ENDIAN
+  #include <byteswap.h>
+#endif
+#include <usb/pdiusb.h>
+#include <usb/usb_spec.h>
+
+  #ifdef PDI_CMD_RWD_INTERNAL
+   #ifndef PDIUSBD12
+     #include <periph/i2c.h>
+   #endif
+  #endif
+
+  #ifndef SDCC
+   #define xdata 
+  #endif
+
+
+/*********************************************************/
+// Function for read and write from/into chip
+
+ #if defined(PDI_CMD_RWD_INTERNAL)
+  #if defined(PDIUSBD12) // parallel interface
+
+   void pdiSendCommand( unsigned char byCmd) {
+     *((volatile xdata unsigned char *) PDIUSB_COMMAND_ADDR) = byCmd;
+   }
+   unsigned char pdiReadData( unsigned char byCount, void *pbyData) {
+     unsigned char out = byCount;
+     while (byCount) {
+       byCount--;
+       *(unsigned char*)pbyData++ = *((volatile xdata unsigned char *) PDIUSB_READ_DATA_ADDR);
+     }
+     return out;
+   }
+   void pdiWriteData( unsigned char byCount, const void *pbyData) {
+     while (byCount) {
+       byCount--;
+       *((volatile xdata unsigned char *) PDIUSB_WRITE_DATA_ADDR) = *(unsigned char*)pbyData++;
+     }
+   }
+
+   #if defined(PDI_USE_USING)
+     unsigned short pdiIntCmdReadData( unsigned char byCmd, unsigned char byShort) _PDI_USING {
+       unsigned char i[2];
+       *((volatile xdata unsigned char *) PDIUSB_COMMAND_ADDR) = byCmd;
+       i[0] = *((volatile xdata unsigned char *) PDIUSB_READ_DATA_ADDR);
+       if ( !byShort) {
+        i[1] = 0;
+        return i[0];
+       }
+       i[1] = *((volatile xdata unsigned char *) PDIUSB_READ_DATA_ADDR);
+       return (((unsigned short) i[1]) << 8) + i[0];
+     }
+   #endif
+
+  #else // serial interface iic
+   #ifndef D11_REG_CMD
+     #define D11_REG_CMD  PDIUSB_COMMAND_ADDR
+   #endif
+   #ifndef D11_REG_DATA_WRITE
+     #define D11_REG_DATA_WRITE PDIUSB_WRITE_DATA_ADDR
+   #endif
+   #ifndef D11_REG_DATA_READ
+     #define D11_REG_DATA_READ PDIUSB_READ_DATA_ADDR
+   #endif
+     
+   void pdiSendCommand( unsigned char byCmd) {
+     I2C_Write( D11_REG_CMD, &byCmd, 1);
+   }
+   unsigned char pdiReadData( unsigned char byCount, void *pbyData) {
+     I2C_Read( D11_REG_DATA_READ, pbyData, byCount);
+     return byCount;
+   }
+   void pdiWriteData( unsigned char byCount, const void *pbyData) {
+     I2C_Write( D11_REG_DATA_WRITE, pbyData, byCount);
+   }
+   #if defined(PDI_USE_USING)
+    unsigned short pdiIntCmdReadData( unsigned char byCmd, unsigned char byShort) _PDI_USING {
+    }
+   #endif
+
+  #endif
+ #endif
+
+
+/*********************************************************/
+/*********************************************************/
+// PDIUSB common commands
+
+#if defined(PDIUSBH11) || defined(PDIUSBH11A) || defined(PDIUSBD11)
+
+ /*********************************************************/
+ // pdiSetHUBAddressEnable
+ // enable HUB function and set address (byAddress is 0-0x7F, byEnable is 0 or 1)
+   void pdiSetHUBAddressEnable( unsigned char byAddress, unsigned char byEnable) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("H "));
+     byAddress = (byAddress & 0x7F) | (byEnable << 7);
+     pdiSendCommand( PDI_CMD_HUB_ENB_ADDR);
+     pdiWriteData( 1, &byAddress);
+   }
+
+#endif
+#if !defined(PDIUSBH11A_MULTPLE) // D11,D12,H11,H11A_S(emb.fnc)
+
+ /*********************************************************/
+ // pdiSetAddressEnable
+ // Enable function and set address (byAddress is 0-0x7F, byEnable is 0 or 1)
+   void pdiSetAddressEnable( unsigned char byAddr_Enb) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("A "));
+     pdiSendCommand( PDI_CMD_FNC_ENB_ADDR);
+     pdiWriteData( 1, &byAddr_Enb);
+   }
+
+#else
+
+ /*********************************************************/
+ // pdiSetEmbFncAddressEnable
+ // Enable Embedded function and set address (byAddress is 0-0x7F, byEnable is 0 or 1)
+ // byFnc - function index (zero based) 0-3
+   void pdiSetEmbFncAddressEnable( unsigned char byFnc, unsigned char byAddress, unsigned char byEnable) {
+     byAddress = (byAddress & 0x7F) | (byEnable << 7);
+     pdiSendCommand( PDI_CMD_FNC1_ENB_ADDR + byFnc);
+     pdiWriteData( 1, &byAddress);
+   }
+
+#endif
+
+
+
+ /*********************************************************/
+ // pdiSetEndpointEnable
+ // enable/disable endpoints (PDI_EPEN_xxx)
+   void pdiSetEndpointEnable( unsigned char byEnable) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("E "));
+     pdiSendCommand( PDI_CMD_EPEN);
+     pdiWriteData( 1, &byEnable);
+   }
+
+
+#if !defined(PDIUSBH11)  // H11 has not it
+
+ /*********************************************************/
+ // pdiSetMode
+ // set chip mode (PDI_MODE_xxx) and clock division factor (PDI_CLOCK_xxx)
+  void pdiSetMode( unsigned short wMode_Clock) {
+     unsigned char sm[2];
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("M%04X ",wMode_Clock));
+     sm[0] = (unsigned char) (wMode_Clock & 0xff);
+     sm[1] = (unsigned char) (wMode_Clock >> 8);
+     pdiSendCommand( PDI_CMD_SET_MODE);
+     pdiWriteData( 2, sm);
+   }
+
+#endif
+
+ #if defined(PDIUSBD12)
+
+ /*********************************************************/
+ // pdiSetDMA
+ // set DMA mode (PDI_DMA_xxx)
+  void pdiSetDMA( unsigned char byDma) {
+    pdiSendCommand( PDI_CMD_SET_DMA);
+    pdiWriteData( 1, &byDma);
+  }
+
+ /*********************************************************/
+ // pdiGetDMA
+ // get current DMA mode
+  unsigned char pdiGetDMA( void) {
+    unsigned char dma;
+    pdiSendCommand( PDI_CMD_GET_DMA);
+    pdiReadData( 1, &dma);
+    return dma;
+  }
+
+ #endif
+
+
+ #if defined(PDIUSBH11)
+
+ /*********************************************************/
+
+ // pdiGetInterrupt - H11 return only one byte
+ // get interrupt register (PDI_INT_xxx)
+  unsigned char pdiGetInterrupt( void) _PDI_USING {
+    unsigned char gin;
+#if defined(PDI_USE_USING)
+    return pdiIntCmdReadData( PDI_CMD_GET_INT_REG, 0);
+#else
+    pdiSendCommand( PDI_CMD_GET_INT_REG);
+    pdiReadData( 1, &gin);
+    return gin;
+#endif
+  }
+
+ #else
+
+ /*********************************************************/
+ // pdiGetInterrupt
+ // get interrupt register (PDI_INT_xxx)
+  unsigned short pdiGetInterrupt( void) _PDI_USING {
+    unsigned short gin;
+#if defined(PDI_USE_USING)
+    return pdiIntCmdReadData( PDI_CMD_GET_INT_REG, 1);
+#else
+    pdiSendCommand( PDI_CMD_GET_INT_REG);
+    pdiReadData( 2, &gin);
+   #if __BYTE_ORDER == __BIG_ENDIAN
+    gin=bswap_16(gin);
+   #endif
+    return gin; //pdiData[0] + (((unsigned short)pdiData[1])<<8);
+#endif
+  }
+
+ #endif
+
+ /*********************************************************/
+ // pdiSelectEp
+ // set internal buffer pointer to selected endpoint (zero based) (PDI_SELEP_xxx)
+  unsigned char pdiSelectEp( unsigned char byEpIdx) {
+    unsigned char sep;
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("e%1d ",byEpIdx));
+    pdiSendCommand( PDI_CMD_SELECT_EP + byEpIdx);
+    pdiReadData( 1, &sep);
+    return sep;
+  }
+
+ /*********************************************************/
+ // pdiGetLastTransStatus
+ // get Last transaction status (PDI_LTSTAT_xxx and PDI_ERR_xxx)
+  unsigned char pdiGetLastTransStatus( unsigned char byEpIdx) _PDI_USING {
+    unsigned char lts;
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("L "));
+#if defined(PDI_USE_USING)
+    return pdiIntCmdReadData( PDI_CMD_GET_LAST_STAT + byEpIdx, 0);
+#else
+    pdiSendCommand( PDI_CMD_GET_LAST_STAT + byEpIdx);
+    pdiReadData( 1, &lts);
+    return lts;
+#endif
+  }
+
+
+ #if defined(PDIUSBD11) || defined(PDIUSBH11) || defined(PDIUSBH11A)
+
+ /*********************************************************/
+ // pdiGetEpStatus
+ // get Endpoint Status (PDI_EPSTAT_xxx)
+  unsigned char pdiGetEpStatus( unsigned char byEpIdx) {
+    unsigned char ges;
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("G "));
+    pdiSendCommand( PDI_CMD_GET_EP_STAT + byEpIdx);
+    pdiReadData( 1, &ges);
+    return ges;
+  }
+
+ #endif
+
+ /*********************************************************/
+ // pdiReadFromEpBuffer - raw reading
+ // read data from selected internal chip buffer
+ // if byLength < length of buffer data, so we read only byLength data)
+  unsigned char pdiReadFromEpBuffer( unsigned char byLength, unsigned char *pToBuff) {
+    unsigned char rdep[2];
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("R "));
+    pdiSendCommand( PDI_CMD_READ_BUFFER);
+    pdiReadData( 2, rdep);
+    if ( rdep[1]) { // there is some data
+      if ( byLength < rdep[1]) // we need less data then is received
+        rdep[1] = byLength;
+      pdiReadData( rdep[1], pToBuff);
+    }
+    return rdep[1];
+  }
+
+ /*********************************************************/
+ // pdiWriteToEpBuffer - raw writing
+ // write data to selected internal chip buffer
+  void pdiWriteToEpBuffer( unsigned char byLength, const unsigned char *pFromBuff) {
+    unsigned char hd[2];
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("W "));
+    pdiSendCommand( PDI_CMD_WRITE_BUFFER);
+    hd[0] = 0; hd[1] = byLength;
+    pdiWriteData( 2, hd);
+    if ( byLength) {
+      pdiWriteData( byLength, pFromBuff);
+    }
+  }
+
+ /*********************************************************/
+ // pdiSetEpStatus
+ // set endpoint stall flag
+  void pdiSetEpStatus( unsigned char byEpIdx, unsigned char byStatus) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("T "));
+    pdiSendCommand( PDI_CMD_SET_EP_STAT + byEpIdx);
+    pdiWriteData( 1, &byStatus);
+  }
+
+ /*********************************************************/
+ // pdiAcknowledgeSetup
+ // chip disable fncs Validate and Clear after SETUP packet,
+ // this cmd re-enable these fncs
+  void pdiAcknowledgeSetup( void) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("C "));
+    pdiSendCommand( PDI_CMD_ACK_SETUP);
+  }
+
+ /*********************************************************/
+ // pdiClearBuffer
+ // set endpoint flag 'empty' and next data can be receive
+  void pdiClearBuffer( void) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("B "));
+    pdiSendCommand( PDI_CMD_CLEAR_BUFFER);
+  }
+
+
+ /*********************************************************/
+ // pdiValidateBuffer
+ // set endpoint flag 'full' and data can be send
+  void pdiValidateBuffer( void) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("V "));
+    pdiSendCommand( PDI_CMD_VALID_BUFFER);
+  }
+
+ /*********************************************************/
+ // pdiSendResume
+ // send an upstream resume signal for 10ms
+  void pdiSendResume( void) {
+// usb_debug_print( DEBUG_LEVEL_HIGH, ("M "));
+    pdiSendCommand( PDI_CMD_SEND_RESUME);
+  }
+
+ /*********************************************************/
+ // pdiGetFrameNumber
+ // return frame number of last successfully received SOF
+  unsigned short pdiGetFrameNumber( void) {
+    unsigned short gfn;
+    pdiSendCommand( PDI_CMD_GET_FRAME);
+    pdiReadData( 2, &gfn);
+   #if __BYTE_ORDER == __BIG_ENDIAN
+    gfn=bswap_16(gfn);
+   #endif
+    return gfn; //pdiData[0] + (((unsigned short)pdiData[1])<<8);
+  }
+  
+ /*********************************************************/
+ // pdiGetChipID  - this function is undocumented
+ // read chip ID (not documented function) ( LSB is maybe type of chip in hex (0x12,0x11))
+  unsigned short pdiGetChipID( void) {
+    unsigned short gid;
+    pdiSendCommand( PDI_CMD_GET_CHIP_ID);
+    pdiReadData( 2, &gid);
+   #if __BYTE_ORDER == __BIG_ENDIAN
+    gid=bswap_16(gid);
+   #endif
+    return gid; //pdiData[0] + (((unsigned short)pdiData[1])<<8);
+  }    
+
+
+ /*********************************************************/
+ /*********************************************************/
+ // HUB command
+#if defined(PDIUSBH11) || defined(PDIUSBH11A)
+ /*********************************************************/
+ // pdiClearPortFeature
+ // clear feature 'byFeature' in downstream port 2-5 'byEpIdx' (zero based)
+  void pdiClearPortFeature( unsigned char byEpIdx, unsigned char byFeature) {
+    pdiSendCommand( PDI_CMD_P2_CLR_FEATURE + byEpIdx);
+    pdiWriteData( 1, &byFeature);
+  }
+
+ /*********************************************************/
+ // pdiSetPortFeature
+ // set feature 'byFeature' in downstream port 2-5 'byEpIdx' (zero based)
+  void pdiSetPortFeature( unsigned char byEpIdx, unsigned char byFeature) {
+    pdiSendCommand( PDI_CMD_P2_SET_FEATURE + byEpIdx);
+    pdiWriteData( 1, &byFeature);
+  }
+  
+ /*********************************************************/
+ // pdiGetPortFeature
+ // get port status (port status byte and port status change byte)
+  unsigned short pdiGetPortFeature( unsigned char byEpIdx) {
+    unsigned short gpf;
+    pdiSendCommand( PDI_CMD_P2_GET_STATUS + byEpIdx);
+    pdiReadData( 2, &gpf);
+   #if __BYTE_ORDER == __BIG_ENDIAN
+    gpf=bswap_16(gpf);
+   #endif
+    return gpf; //pdiData[0] + (((unsigned short)pdiData[1])<<8);
+  }
+  
+ /*********************************************************/
+ // pdiSetStatusChangeBits
+ // set local power change bits status
+  void pdiSetStatusChangeBits( unsigned char byBits) {
+    pdiSendCommand( PDI_CMD_SET_CHNG_BITS);
+    pdiWriteData( 1, &byBits);
+  }
+  
+#endif
+
+
+
+/*********************************************************/
+/*********************************************************/
+// PDIUSB other commands
+
+ // complex function for select endpoint, write data and validate data in endpoint buffer
+ void pdiWriteEndpoint( unsigned char byEpIdx, unsigned char byLength, const unsigned char *pbyData) {
+   pdiSelectEp( byEpIdx);
+   pdiWriteToEpBuffer( byLength, pbyData);
+   pdiValidateBuffer();
+ }
+
+ // complex function for select endpoint, read data and clear endpoint buffer
+ // byMaxLength means how many bytes will be maximally read.
+ unsigned char pdiReadEndpoint( unsigned char byEpIdx, unsigned char byMaxLength, unsigned char *pbyData) {
+   unsigned char cnt = 0, sep;
+   sep = pdiSelectEp( byEpIdx);
+   if ( sep & PDI_SELEP_FULL) {
+    cnt = pdiReadFromEpBuffer( byMaxLength, pbyData);
+    pdiClearBuffer();
+   }
+   return cnt;
+ }
+
+ // complex universal function for select command and read/write data to/from PDIUSB
+ unsigned char pdiCmdData( unsigned char byCmd, unsigned char *pbyData,
+                           unsigned char byCount, unsigned char byRead) {
+   pdiSendCommand( byCmd);
+   if ( byCount) {
+     if( byRead) byCount = pdiReadData( byCount, pbyData);  // Read Data
+     else pdiWriteData( byCount, pbyData);                  // Write Data
+   }
+   return byCount;   
+ }
+
+#if !defined(PDIUSBH11A_MULTIPLE)
+ // complex function for acknowledge control endpoint
+ void pdiAckSetupControl( void) {
+   pdiSendCommand( PDI_CMD_SELECT_EP + PDI_EP0_RX);
+   pdiSendCommand( PDI_CMD_ACK_SETUP);
+   pdiSendCommand( PDI_CMD_CLEAR_BUFFER);
+   pdiSendCommand( PDI_CMD_SELECT_EP + PDI_EP0_TX);
+   pdiSendCommand( PDI_CMD_ACK_SETUP);
+ }
+#else
+ // complex function for acknowledge control endpoint ( for one emb.fnc. 1,6,7) (zero-based 0,1,2)
+ void pdiAckSetupFncControl( unsigned char Fnc) {
+   unsigned char FncTab[3] = { PDI_F1_EP0_RX, PDI_F6_EP0_RX, PDI_F7_EP0_RX};
+   pdiSendCommand( PDI_CMD_SELECT_EP + FncTab[Fnc]);
+   pdiSendCommand( PDI_CMD_ACK_SETUP);
+   pdiSendCommand( PDI_CMD_CLEAR_BUFFER);
+   pdiSendCommand( PDI_CMD_SELECT_EP + FncTab[Fnc] + 1);
+   pdiSendCommand( PDI_CMD_ACK_SETUP);
+ }
+#endif
+
+#if defined(PDIUSBD12) // parallel interface
+ void pdiInit( void) {
+   pdiSetAddressEnable( PDI_ENAD_ENABLE);
+   pdiSetEndpointEnable( PDI_EPEN_ENABLE);
+   pdiSetDMA( PDI_DMA_EP4_INT | PDI_DMA_EP5_INT);
+   pdiSetMode( PDI_MODE_NO_LAZY_CLOCK | PDI_MODE_CLOCK_RUNNING |
+               PDI_MODE_SOFT_CONNECT | PDI_CLOCK_12M);
+ }
+#endif
+
+#if defined(PDIUSBH11A_SINGLE) // serial interface
+ void pdiInit( void) {
+   pdiSetHUBAddressEnable( 0, 0); // disable HUB
+   pdiSetAddressEnable( PDI_ENAD_ENABLE);    // enable emb.function
+   pdiSetEndpointEnable( PDI_EPEN_FNC_ENB);
+   pdiSetMode( PDI_MODE_REMOTE_WAKEUP | PDI_MODE_NO_LAZY_CLOCK | PDI_MODE_CLOCK_RUNNING |
+               PDI_MODE_SOFT_CONNECT | PDI_MODE_SINGLE_FNC | PDI_CLOCK_12M);
+ }
+#endif
+
+/*********************************************************/
+
+ static const unsigned char epin2idx[]={
+   PDI_EP0_IN,
+   PDI_EP1_IN,
+  #if PDI_CNT_EP > 1
+   PDI_EP2_IN,
+  #if PDI_CNT_EP > 2
+   PDI_EP3_IN,
+  #endif
+  #endif
+ };
+
+ static const unsigned char epout2idx[]={
+   PDI_EP0_OUT,
+   PDI_EP1_OUT,
+  #if PDI_CNT_EP > 1
+   PDI_EP2_OUT,
+  #if PDI_CNT_EP > 2
+   PDI_EP3_OUT,
+  #endif
+  #endif
+ };
+
+ // pdiEp2Idx
+ // convert endpoint number to pdi index number
+ unsigned char pdiEp2Idx(unsigned char ep) {
+   if(ep & USB_ENDPOINT_DIRECTION_MASK)
+     return epin2idx[ep & 0xf];
+   else
+     return epout2idx[ep & 0xf];
+ }
+
+ /*********************************************************/
+ /*********************************************************/
diff --git a/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Entries b/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Entries
new file mode 100644 (file)
index 0000000..503b4ec
--- /dev/null
@@ -0,0 +1,3 @@
+/pdi.h/1.1/Wed Feb 23 11:05:20 2005//
+/pdiusb.h/1.2/Sun Aug  7 12:45:56 2005//
+D
diff --git a/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Repository b/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Repository
new file mode 100644 (file)
index 0000000..2caf042
--- /dev/null
@@ -0,0 +1 @@
+ulan/embedded/libs4c/usb/pdiusb/usb
diff --git a/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Root b/ulan/embedded/libs4c/usb/pdiusb/usb/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/embedded/libs4c/usb/pdiusb/usb/pdi.h b/ulan/embedded/libs4c/usb/pdiusb/usb/pdi.h
new file mode 100644 (file)
index 0000000..21bb5db
--- /dev/null
@@ -0,0 +1,49 @@
+/*****************************************************/
+/***   Module : USB PDI - header file              ***/
+/***   Author : Roman Bartosinski (C) 28.04.2002   ***/
+/***   Modify : 08.08.2002, 16.04.2003             ***/
+/*****************************************************/
+
+#ifndef _USB_PDI_SUBMODULE_HEADER_FILE_
+  #define _USB_PDI_SUBMODULE_HEADER_FILE_
+
+  #include <usb/usb.h>
+//  int usb_pdi_init( usb_device_t *udev) REENTRANT_SIGN;
+  int usb_pdi_init( usb_device_t *udev);
+  
+  #ifdef USB_PDI_DIRECT_FNC
+    #define USB_PDI_EXPORT_FNC
+
+    #define usb_udev_is_fnc(_M_udev, _M_fnc) (1)
+
+    #define usb_udev_init usb_pdi_init
+    #define usb_udev_connect usb_pdi_connect
+    #define usb_udev_disconnect usb_pdi_disconnect
+    #define usb_udev_ack_setup usb_pdi_ack_setup
+    #define usb_udev_ack_control_setup usb_pdi_ack_control_setup
+    #define usb_udev_check_events usb_pdi_check_events
+
+    #define usb_udev_stall usb_pdi_stall
+    #define usb_udev_read_endpoint usb_pdi_read_endpoint
+    #define usb_udev_write_endpoint usb_pdi_write_endpoint
+
+  #endif /*USB_PDI_DIRECT_FNC*/
+
+  #ifdef USB_PDI_EXPORT_FNC
+
+    int usb_pdi_init( usb_device_t *udev);
+    int usb_pdi_connect( usb_device_t *udev);
+    int usb_pdi_disconnect( usb_device_t *udev);
+    void usb_pdi_ack_setup( usb_device_t *udev);
+    void usb_pdi_ack_control_setup( usb_device_t *udev);
+    int usb_pdi_check_events( usb_device_t *udev);
+
+    void usb_pdi_stall( usb_ep_t *ep);
+    int usb_pdi_read_endpoint( usb_ep_t *ep, void *ptr, int size) USB_UDEV_REENTRANT_SIGN;
+    int usb_pdi_write_endpoint( usb_ep_t *ep, const void *ptr, int size) USB_UDEV_REENTRANT_SIGN;
+
+  #endif /*USB_PDI_EXPORT_FNC*/
+
+#endif /* _USB_PDI_SUBMODULE_HEADER_FILE_ */
+
diff --git a/ulan/embedded/libs4c/usb/pdiusb/usb/pdiusb.h b/ulan/embedded/libs4c/usb/pdiusb/usb/pdiusb.h
new file mode 100644 (file)
index 0000000..14ce3ab
--- /dev/null
@@ -0,0 +1,674 @@
+/*********************************************************/
+/***   Module : PDIUSB D11,H11,H11A,D12 - header file  ***/
+/***   Author : Roman Bartosinski (C) 03.10.2002       ***/
+/***   Description : Integrate common functions for    ***/
+/***                PDIUSBD11,PDIUSBD12,PDIUSBH11(old) ***/
+/***                PDIUSBH11A in Single/Multiple mode ***/
+/***                 to one common file.               ***/
+/***   Modify : 10.10.2002 - add H11                   ***/
+/***            13.10.2002 - add spec.fnc for 'using'  ***/
+/***            22.12.2002 - rebuild for smaller out   ***/
+/*********************************************************/
+
+#ifndef _PDIUSB_BASE_MODULE
+ #define _PDIUSB_BASE_MODULE
+
+/*********************************************************/
+// Comments - !!! Please, read this section !!!
+//
+//
+// If you can use included functions for read and write
+//  byte from/to PDIUSB, please uncomment defined PDI_CMD_RWD_INTERNAL
+//  and check defined addresses for communication with PDIUSB.
+// Else you must uncomment defined PDI_CMD_RWD_EXTERNAL and declare
+//  and implement next functions :
+//     void pdiSendCommand( unsigned char byCmd);
+//     unsigned char pdiReadData( unsigned char byCount, void *pbyData);
+//     void pdiWriteData( unsigned char byCount, const void *pbyData);
+//  - if you want use 'using' (see below), you must implement next function(on i51 is NEEDED).
+//     unsigned short pdiIntCmdReadData( unsigned char byCmd, unsigned char byShort) _PDI_USING;
+// -- all in section 'External functions'
+//
+//
+// Next you must select type of chip.(uncomment line with defined type)
+// -- in section 'Type of PDIUSB'
+//
+//
+// If you want use functions 'pdiGetInterrupt' and 'pdiGetLastTransStatus'
+// with keyword 'using' (for i51 it means using spec.reg.bank), uncomment
+// define 'USING'. Only these two functions need pdiIntCmdReadData.
+// -- in section 'Use using in interrupt functions'
+//
+// ***   External choice   ***
+// Or you can make all previous choises externally before including this file
+// by defining one of PDIUSBD11,PDIUSBD12,PDIUSBH11,PDIUSBH11A_SINGLE,PDIUSBH11A_MULTIPLE
+//
+// defining one of PDI_CMD_RWD_INTERNAL,PDI_CMD_RWD_EXTERNAL
+// (you can define externally PDIUSB_COMMAND_ADDR, PDIUSB_READ_DATA_ADDR, PDIUSB_WRITE_DATA_ADDR)
+//
+// and defining one of PDI_USE_USING,PDI_DONTUSE_USING
+// (you can define externally _PDI_USING_NUMBER)
+
+
+
+/*********************************************************/ 
+// Type of PDIUSB
+
+
+//
+//   PDIUSBD11           - USB device with serial interface
+//   PDIUSBH11           - USB hub with one embedded fnc and serial interface
+//   PDIUSBH11A_SINGLE   - USB hub with one embedded fnc, serial interface and additional functions
+//   PDIUSBH11A_MULTIPLE - USB hub with multiple(3) embedded fncs, serial interface and add.fncs
+//   - H11A_SINGLE and H11A_MULTIPLE is divided by pdiusb command SetMode (bit is set automatically)
+//   PDIUSBD12           - USB device with parallel interface
+//
+
+// uncomment right chip type below
+
+#define PDIUSBD11
+//#define PDIUSBH11
+//#define PDIUSBH11A_SINGLE
+//#define PDIUSBH11A_MULTIPLE
+//#define PDIUSBD12
+
+                                                              
+/*********************************************************/
+// Create common type PDIUSBH11A for SINGLE and MULTIPLE
+// for mux H11A_S & H11A_M
+#if defined(PDIUSBH11A_SINGLE) || defined(PDIUSBH11A_MULTIPLE)
+  #define PDIUSBH11A
+#else
+  #undef  PDIUSBH11A
+#endif
+
+
+
+/*********************************************************/
+//  Use using in interrupt functions
+
+  // If you want use keyword 'using' in function
+  // 'pdiGetInterrupt' and 'pdiGetLastTransStatus',
+  // uncomment next line.(and check and correct number in _PDI_USING_NUMBER)
+//#define PDI_USE_USING
+  // If you don't want use keyword 'using',
+  // uncomment next line.
+#define PDI_DONTUSE_USING
+
+ #if defined(PDI_USE_USING)
+  #if !defined(_PDI_USING_NUMBER)
+   #define _PDI_USING_NUMBER  2
+  #endif
+  #define _PDI_USING   using _PDI_USING_NUMBER
+ #else
+  #define _PDI_USING
+ #endif
+
+
+/*********************************************************/
+//  External functions
+
+  // If you want use internal functions, uncomment next line.
+//#define PDI_CMD_RWD_INTERNAL
+  // If you want use your own external functions, uncomment next line.
+//#define PDI_CMD_RWD_EXTERNAL
+
+// this is automatically selected by your choice
+
+ #if defined(PDI_CMD_RWD_INTERNAL)
+  #if !defined(PDIUSB_COMMAND_ADDR)       // if not defined address for select command
+   #if defined(PDIUSBD12)
+    #define PDIUSB_COMMAND_ADDR    0x7001 // sel.cmd address for D12 (this is address for my application)
+   #else
+    #define PDIUSB_COMMAND_ADDR    0x36   // sel.cmd address for all other
+   #endif
+  #endif
+  #if !defined(PDIUSB_READ_DATA_ADDR)     // if not defined address for read data from chip
+   #if defined(PDIUSBD12)
+    #define PDIUSB_READ_DATA_ADDR  0x7000 // read data address for D12
+   #else
+    #define PDIUSB_READ_DATA_ADDR  0x35   // read data address for all other
+   #endif
+  #endif
+  #if !defined(PDIUSB_WRITE_DATA_ADDR)    // if not defined address for write data to chip
+   #if defined(PDIUSBD12)
+    #define PDIUSB_WRITE_DATA_ADDR 0x7000 // write data address for D12
+   #else
+    #define PDIUSB_WRITE_DATA_ADDR 0x34   // write data address for all other
+   #endif
+  #endif
+
+ #endif  
+
+/* Build internal version of functions, but do not define addresses */
+#define PDI_CMD_RWD_INTERNAL
+
+  extern void pdiSendCommand( unsigned char byCmd);
+  extern unsigned char pdiReadData( unsigned char byCount, void *pbyData);
+  extern void pdiWriteData( unsigned char byCount, const void *pbyData);
+#if defined(PDI_USE_USING)
+  extern unsigned short pdiIntCmdReadData( unsigned char byCmd, unsigned char byShort) _PDI_USING;
+#endif
+
+
+/*********************************************************/
+// Check chip selection, int/ext rw functions, using
+
+#if !defined(PDIUSBD11) && !defined(PDIUSBH11) && !defined(PDIUSBH11A) && !defined(PDIUSBD12)
+  #define _PDI_ERROR_NO_CONTINUE
+  #error "!!! Any type of PDIUSB wasn't selected !!!"
+  #error "Please select one of PDIUSB in file pdiusb.h in section 'Type of PDIUSB'."  
+#endif
+#if !defined(PDI_CMD_RWD_INTERNAL) && !defined(PDI_CMD_RWD_EXTERNAL)
+  #define _PDI_ERROR_NO_CONTINUE
+  #error "!!! You must select if you want use internal or external basic fncs for PDIUSB !!!"
+  #error "Please select your choice in file pdiusb.h in section 'External functions'."
+#endif
+#if !defined(PDI_USE_USING) && !defined(PDI_DONTUSE_USING)
+  #define _PDI_ERROR_NO_CONTINUE
+  #error "!!! You must choose if you want keyword 'using' !!!"
+  #error "Please see into file pdiusb.h in section 'Use using in interrupt functions'."
+#endif
+
+#if defined(_PDI_ERROR_NO_CONTINUE)
+  #error " For help ... read in file pdiusb.h section 'Comments'."
+#endif
+
+
+/*********************************************************/
+/*********************************************************/
+#if !defined(_PDI_ERROR_NO_CONTINUE)
+
+/*********************************************************/    
+// Endpoints - size and index defines
+
+  //  PDI_CNT_EP - number of endpoints without control endpoints
+#if defined(PDIUSBD11) || defined(PDIUSBH11A_SINGLE)       // D11, H11A_S
+  #define PDI_CNT_EP    0x03
+#elif defined(PDIUSBH11) || defined(PDIUSBH11A_MULTIPLE)  // H11, H11A_M
+  #define PDI_CNT_EP    0x01
+#elif defined(PDIUSBD12)                                  // D12
+  #define PDI_CNT_EP    0x02
+#endif
+
+  //  PDI_EPx_yyyy_SIZE - max packet size for endpoint x  
+#if defined(PDIUSBH11) || defined(PDIUSBH11A)             // H11, H11A
+  #define PDI_HUB_TX_SIZE      8
+  #define PDI_HUB_RX_SIZE      8
+  #define PDI_HUB_PACKET_SIZE  8
+ #if defined(PDIUSBH11)
+  #define PDI_HUB_INT_SIZE     1
+ #endif
+#endif
+
+
+#if !defined(PDIUSBD12)                     // D11,H11,H11A
+  #define PDI_EP0_TX_SIZE      8
+  #define PDI_EP0_RX_SIZE      8
+  #define PDI_EP0_PACKET_SIZE  8
+  #define PDI_EP1_TX_SIZE      8
+  #define PDI_EP1_RX_SIZE      8
+  #define PDI_EP1_PACKET_SIZE  8
+ #if defined(PDIUSBD11) || defined(PDIUSBH11A_SINGLE)
+  #define PDI_EP2_TX_SIZE      8
+  #define PDI_EP2_RX_SIZE      8
+  #define PDI_EP2_PACKET_SIZE  8
+  #define PDI_EP3_TX_SIZE      8
+  #define PDI_EP3_RX_SIZE      8
+  #define PDI_EP3_PACKET_SIZE  8
+ #endif
+#else                                       // D12
+  #define PDI_EP0_TX_SIZE      16
+  #define PDI_EP0_RX_SIZE      16
+  #define PDI_EP0_PACKET_SIZE  16
+  #define PDI_EP1_TX_SIZE      16
+  #define PDI_EP1_RX_SIZE      16
+  #define PDI_EP1_PACKET_SIZE  16
+  #define PDI_EP2_TX_SIZE      64
+  #define PDI_EP2_RX_SIZE      64
+  #define PDI_EP2_PACKET_SIZE  64
+#endif
+
+  //  PDI_EPx_TX, PDI_EPx_RX - index for endpoint x (write/read)
+#if defined(PDIUSBH11) || defined(PDIUSBH11A)                                        // H11
+  #define PDI_HUB_EP0_RX  0
+  #define PDI_HUB_EP0_TX  1
+  // another index names
+  #define PDI_HUB_EP0_OUT  PDI_HUB_EP0_RX
+  #define PDI_HUB_EP0_IN   PDI_HUB_EP0_TX
+#endif
+
+#if defined(PDIUSBH11)
+  #define PDI_EP0_RX  2
+  #define PDI_EP0_TX  3
+  #define PDI_EP1_TX  4
+  // another index names
+  #define PDI_EP0_OUT  PDI_EP0_RX
+  #define PDI_EP0_IN   PDI_EP0_TX
+  #define PDI_EP1_IN   PDI_EP1_TX
+#elif defined(PDIUSBD11) || defined(PDIUSBH11A_SINGLE)          // D11,H11A_S
+  #define PDI_EP0_RX  2
+  #define PDI_EP0_TX  3
+  #define PDI_EP1_RX  5
+  #define PDI_EP1_TX  4
+  #define PDI_EP2_RX  6
+  #define PDI_EP2_TX  7
+  #define PDI_EP3_RX  8
+  #define PDI_EP3_TX  9
+  // another index names
+  #define PDI_EP0_OUT  PDI_EP0_RX
+  #define PDI_EP0_IN   PDI_EP0_TX
+  #define PDI_EP1_OUT  PDI_EP1_RX
+  #define PDI_EP1_IN   PDI_EP1_TX
+  #define PDI_EP2_OUT  PDI_EP2_RX
+  #define PDI_EP2_IN   PDI_EP2_TX
+  #define PDI_EP3_OUT  PDI_EP3_RX
+  #define PDI_EP3_IN   PDI_EP3_TX
+#elif defined(PDIUSBH11A_MULTIPLE)                            // H11_M
+  #define PDI_F1_EP0_RX   2
+  #define PDI_F1_EP0_TX   3
+  #define PDI_F1_EP1_RX   5
+  #define PDI_F1_EP1_TX   4
+  #define PDI_F6_EP0_RX  10
+  #define PDI_F6_EP0_TX  11
+  #define PDI_F6_EP1_RX   6
+  #define PDI_F6_EP1_TX   7
+  #define PDI_F7_EP0_RX  12
+  #define PDI_F7_EP0_TX  13
+  #define PDI_F7_EP1_RX   8
+  #define PDI_F7_EP1_TX   9
+  // another index names
+  #define PDI_F1_EP0_OUT  PDI_F1_EP0_RX
+  #define PDI_F1_EP0_IN   PDI_F1_EP0_TX
+  #define PDI_F1_EP1_OUT  PDI_F1_EP1_RX
+  #define PDI_F1_EP1_IN   PDI_F1_EP1_TX
+  #define PDI_F6_EP0_OUT  PDI_F6_EP0_RX
+  #define PDI_F6_EP0_IN   PDI_F6_EP0_TX
+  #define PDI_F6_EP1_OUT  PDI_F6_EP1_RX
+  #define PDI_F6_EP1_IN   PDI_F6_EP1_TX
+  #define PDI_F7_EP0_OUT  PDI_F7_EP0_RX
+  #define PDI_F7_EP0_IN   PDI_F7_EP0_TX
+  #define PDI_F7_EP1_OUT  PDI_F7_EP1_RX
+  #define PDI_F7_EP1_IN   PDI_F7_EP1_TX
+#elif defined(PDIUSBD12)                                     // D12
+  #define PDI_EP0_RX  0
+  #define PDI_EP0_TX  1
+  #define PDI_EP1_RX  2
+  #define PDI_EP1_TX  3
+  #define PDI_EP2_RX  4
+  #define PDI_EP2_TX  5
+  // another index names
+  #define PDI_EP0_OUT  PDI_EP0_RX
+  #define PDI_EP0_IN   PDI_EP0_TX
+  #define PDI_EP1_OUT  PDI_EP1_RX
+  #define PDI_EP1_IN   PDI_EP1_TX
+  #define PDI_EP2_OUT  PDI_EP2_RX
+  #define PDI_EP2_IN   PDI_EP2_TX
+#endif
+
+/*********************************************************/
+//  Commands - index and bits, description
+
+  // Set Address/Enable
+#if defined(PDIUSBH11) || defined(PDIUSBH11A) || defined(PDIUSBD11)         // only H11 or H11A
+  #define PDI_CMD_HUB_ENB_ADDR  0x00D0
+ #if defined(PDIUSBH11) || defined(PDIUSBH11A_SINGLE)  // for H11 and H11A_SINGLE
+  #define PDI_CMD_FNC_ENB_ADDR  0x00D1
+ #else                                                 // for H11A_MULTIPLE
+  #define PDI_CMD_FNC1_ENB_ADDR 0x00D1
+  #define PDI_CMD_FNC6_ENB_ADDR 0x00D2
+  #define PDI_CMD_FNC7_ENB_ADDR 0x00D3
+// for compatible with H11A_SINGLE and other
+  #define PDI_CMD_FNC_ENB_ADDR  PDI_CMD_FNC1_ENB_ADDR
+ #endif
+#elif defined(PDIUSBD11)             // for D11
+  #define PDI_CMD_FNC_ENB_ADDR  0x00D1
+#elif defined(PDIUSBD12)             // for D12
+  #define PDI_CMD_FNC_ENB_ADDR  0x00D0
+#endif
+    // set address/enable bits - for all
+    #define PDI_ENAD_ENABLE   0x0080
+    #define PDI_ENAD_ADDRMASK 0x007F
+
+  // Set Endpoint enable
+  #define PDI_CMD_EPEN          0x00D8
+    // set endpoint enable bits
+   #if defined(PDIUSBD12)             // D12 - generic ep
+    #define PDI_EPEN_ENABLE       0x0001
+   #elif defined(PDIUSBD11)           // D11 - generic ep
+    #define PDI_EPEN_ENABLE       0x0002
+   #elif defined(PDIUSBH11A) || defined(PDIUSBH11)   // H11,H11A
+    #define PDI_EPEN_HUB_ENB      0x0001
+     #if defined(PDIUSBH11A_MULTIPLE)  // H11A_M
+    #define PDI_EPEN_FNC1_ENB       0x0002     
+    #define PDI_EPEN_FNC6_ENB       0x0004
+    #define PDI_EPEN_FNC7_ENB       0x0008
+     #else                            // H11,H11A_S
+    #define PDI_EPEN_FNC_ENB      0x0002
+     #endif 
+   #endif
+
+ #if !defined(PDIUSBH11)
+  // Set Mode
+  #define PDI_CMD_SET_MODE      0x00F3
+    // set mode bits - configuration
+   #if !defined(PDIUSBD12)
+    #define PDI_MODE_REMOTE_WAKEUP   0x0001  // D11,H11A
+   #endif
+    #define PDI_MODE_NO_LAZY_CLOCK   0x0002  // all
+    #define PDI_MODE_CLOCK_RUNNING   0x0004  // all
+   #if defined(PDIUSBD12)
+    #define PDI_MODE_INTERRUPT_MODE  0x0008  // D12
+   #else
+    #define PDI_MODE_DEBUG_MODE      0x0008  // D11,H11A
+   #endif
+    #define PDI_MODE_SOFT_CONNECT    0x0010  // all
+   #if defined(PDIUSBH11A)
+    #define PDI_MODE_DWN_RESISTORS   0x0020  // H11A
+    #define PDI_MODE_NONBLINK_LED    0x0040  // H11A
+    #define PDI_MODE_SINGLE_FNC      0x0080  // H11A
+   #elif defined(PDIUSBD11)
+    #define PDI_MODE_MUSTBEONE       0x0080  // D11
+   #else
+    #define PDI_MODE_EP_NONISO       0x0000  // D12
+    #define PDI_MODE_EP_ISOOUT       0x0040
+    #define PDI_MODE_EP_ISOIN        0x0080
+    #define PDI_MODE_EP_ISOIO        0x00C0
+
+   #endif
+   // set mode bits - clock div factor  [48Mhz/(N+1)]
+   #if defined(PDIUSBH11A)
+    #define PDI_CLOCK_CRYSTAL_12M    0x3000  // for 12Mhz crystal
+    #define PDI_CLOCK_CRYSTAL_48M    0x0000  // for 48Mhz crystal
+   #endif
+   #if defined(PDIUSBD12)                  // D12
+    #define PDI_CLOCK_48M            0x0000    // 48 Mhz
+   #endif                                  // all
+    #define PDI_CLOCK_24M            0x0100    // 24 Mhz
+    #define PDI_CLOCK_16M            0x0200    // 16 Mhz
+    #define PDI_CLOCK_12M            0x0300    // 12 Mhz    
+    #define PDI_CLOCK_9M6            0x0400    //  9.6 Mhz
+    #define PDI_CLOCK_8M             0x0500    //  8 Mhz
+    #define PDI_CLOCK_6M8            0x0600    //  6.857142857 Mhz
+    #define PDI_CLOCK_6M             0x0700    //  6 Mhz
+    #define PDI_CLOCK_5M3            0x0800    //  5.333333333 Mhz
+    #define PDI_CLOCK_4M8            0x0900    //  4.8 Mhz
+    #define PDI_CLOCK_4M3            0x0A00    //  4.363636364 Mhz
+    #define PDI_CLOCK_4M             0x0B00    //  4 Mhz
+   #if defined(PDIUSBD12)                  // D12
+    #define PDI_CLOCK_SET_TO_ONE     0x4000
+    #define PDI_CLOCK_SOF_ONLY       0x8000
+   #endif
+ #endif
+   
+  // Set DMA
+ #if defined(PDIUSBD12)
+  #define PDI_CMD_SET_DMA       0x00FB
+  #define PDI_CMD_GET_DMA       0x00FB
+    // set dma bits
+    #define PDI_DMA_SINGLE_DMA    0x0000
+    #define PDI_DMA_BURST_4       0x0001
+    #define PDI_DMA_BURST_8       0x0002
+    #define PDI_DMA_BURST_16      0x0003
+    #define PDI_DMA_ENABLE        0x0004
+    #define PDI_DMA_DIRECTION     0x0008
+    #define PDI_DMA_AUTOLOAD      0x0010
+    #define PDI_DMA_INT_SOF       0x0020
+    #define PDI_DMA_EP4_INT       0x0040
+    #define PDI_DMA_EP5_INT       0x0080
+ #endif
+
+  // Read Interrupt Register
+  // be careful with PDIUSBH11 - you must read only 1 byte
+  #define PDI_CMD_GET_INT_REG   0x00F4
+    // read interrupt register bits
+   #if defined(PDIUSBD11) || defined(PDIUSBH11) || defined(PDIUSBH11A) // D11,H11,H11A
+     #if defined(PDIUSBH11) || defined(PDIUSBH11A)
+    #define PDI_INT_HUB_OUT       0x0001
+    #define PDI_INT_HUB_IN        0x0002
+     #endif
+     #if defined(PDIUSBH11)
+    #define PDI_INT_EP0_OUT       0x0004
+    #define PDI_INT_EP0_IN        0x0008
+    #define PDI_INT_EP1_IN        0x0010
+     #elif defined(PDIUSBD11) || defined(PDIUSBH11A_SINGLE)  // D11,H11_S
+    #define PDI_INT_EP0_OUT       0x0004
+    #define PDI_INT_EP0_IN        0x0008
+    #define PDI_INT_EP1_OUT       0x0020
+    #define PDI_INT_EP1_IN        0x0010
+    #define PDI_INT_EP2_OUT       0x0040
+    #define PDI_INT_EP2_IN        0x0080
+    #define PDI_INT_EP3_OUT       0x0100
+    #define PDI_INT_EP3_IN        0x0200
+     #else                                                // H11_M
+    #define PDI_INT_F1_EP0_OUT    0x0004
+    #define PDI_INT_F1_EP0_IN     0x0008
+    #define PDI_INT_F1_EP1_OUT    0x0020
+    #define PDI_INT_F1_EP1_IN     0x0010
+    #define PDI_INT_F6_EP0_OUT    0x0400
+    #define PDI_INT_F6_EP0_IN     0x0800
+
+    #define PDI_INT_F6_EP1_OUT    0x0040
+    #define PDI_INT_F6_EP1_IN     0x0080
+    #define PDI_INT_F7_EP0_OUT    0x1000
+    #define PDI_INT_F7_EP0_IN     0x2000
+    #define PDI_INT_F7_EP1_OUT    0x0100
+    #define PDI_INT_F7_EP1_IN     0x0200
+     #endif
+    #define PDI_INT_BUSRESET      0x4000
+   #elif defined(PDIUSBD12)
+    #define PDI_INT_EP0_OUT       0x0001
+    #define PDI_INT_EP0_IN        0x0002
+    #define PDI_INT_EP1_OUT       0x0004
+    #define PDI_INT_EP1_IN        0x0008
+    #define PDI_INT_EP2_OUT       0x0010
+    #define PDI_INT_EP2_IN        0x0020
+    #define PDI_INT_BUSRESET      0x0040
+    #define PDI_INT_SUSPEND       0x0080
+    #define PDI_INT_DMA_EOT       0x0100
+   #endif
+
+  // Select Endpoint
+  #define PDI_CMD_SELECT_EP     0x0000  // base index for select endpoint
+    // select endpoint bits
+    #define PDI_SELEP_FULL        0x0001
+   #if defined(PDIUSBD12)
+    #define PDI_SELEP_STALL       0x0002
+   #endif
+
+  // Read Last Transaction Status Register
+  #define PDI_CMD_GET_LAST_STAT 0x0040  // base index for read last transaction
+    // read last transaction bits and errors
+    #define PDI_LTSTAT_RXTX_OK    0x0001
+    #define PDI_LTSTAT_ERR_MASK   0x001E
+    #define PDI_LTSTAT_SETUP      0x0020
+    #define PDI_LTSTAT_DATA1      0x0040
+    #define PDI_LTSTAT_PREV_NRD   0x0080
+      // error codes
+      #define PDI_ERR_NO_ERROR      0x0000
+      #define PDI_ERR_PID_ENCODING  0x0001
+      #define PDI_ERR_PID_UNKNOWN   0x0002
+      #define PDI_ERR_UNEXPECT_PKT  0x0003
+
+      #define PDI_ERR_TOKEN_CRC     0x0004
+      #define PDI_ERR_DATA_CRC      0x0005
+      #define PDI_ERR_TIME_OUT      0x0006
+      #define PDI_ERR_NEVER_HAPPENS 0x0007
+      #define PDI_ERR_UNEXPECT_EOP  0x0008
+      #define PDI_ERR_NAK           0x0009
+      #define PDI_ERR_STALL         0x000A
+      #define PDI_ERR_OVERFLOW      0x000B
+      #define PDI_ERR_BITSTUFF      0x000D
+      #define PDI_ERR_DATA_PID      0x000F
+
+  // Read Endpoint Status
+ #if defined(PDIUSBD11) || defined(PDIUSBH11) || defined(PDIUSBH11A)
+   #define PDI_CMD_GET_EP_STAT   0x0080  // base index for read ep status
+    // read ep status bits
+     #define PDI_EPSTAT_SETUP      0x0004
+     #define PDI_EPSTAT_STALL      0x0008
+     #define PDI_EPSTAT_DATA1      0x0010
+     #define PDI_EPSTAT_FULL       0x0020
+ #endif
+
+  // Read Buffer
+  #define PDI_CMD_READ_BUFFER   0x00F0
+  
+  // Write Buffer
+  #define PDI_CMD_WRITE_BUFFER  0x00F0
+
+  // Clear Buffer
+  #define PDI_CMD_CLEAR_BUFFER  0x00F2
+
+  // Validate Buffer
+  #define PDI_CMD_VALID_BUFFER  0x00FA
+
+
+  // Set Endpoint Status
+  #define PDI_CMD_SET_EP_STAT   0x0040  // base index for endpoint status
+    // set endpoint status bits
+    #define PDI_SET_EP_STALLED    0x0001
+
+  // Acknowledge Setup
+  #define PDI_CMD_ACK_SETUP     0x00F1
+
+  // Send Resume
+  #define PDI_CMD_SEND_RESUME   0x00F6
+
+  // Read Current Frame Number
+  #define PDI_CMD_GET_FRAME     0x00F5
+
+  // Get Chip ID
+  #define PDI_CMD_GET_CHIP_ID   0x00FD
+
+// HUB commands
+#if defined(PDIUSBH11) || defined(PDIUSBH11A)
+  // Clear Port Feature
+  #define PDI_CMD_P2_CLR_FEATURE 0x00E0
+  #define PDI_CMD_P3_CLR_FEATURE 0x00E1
+  #define PDI_CMD_P4_CLR_FEATURE 0x00E2
+  #define PDI_CMD_P5_CLR_FEATURE 0x00E3
+  // Set Port Feature
+  #define PDI_CMD_P2_SET_FEATURE 0x00E8
+  #define PDI_CMD_P3_SET_FEATURE 0x00E9
+  #define PDI_CMD_P4_SET_FEATURE 0x00EA
+  #define PDI_CMD_P5_SET_FEATURE 0x00EB
+    // Feature code
+    #define PDI_F_PORT_ENABLE       0
+    #define PDI_F_PORT_SUSPEND      1
+    #define PDI_FC_PORT_RESET       2
+    #define PDI_F_PORT_POWER        3
+    #define PDI_C_PORT_CONNECTION   4
+    #define PDI_C_PORT_ENABLE       5
+    #define PDI_C_PORT_SUSPEND      6
+    #define PDI_C_PORT_OVERCURRENT  7
+   
+  // Get Port Status
+  #define PDI_CMD_P2_GET_STATUS  0x00E0
+  #define PDI_CMD_P3_GET_STATUS  0x00E1
+  #define PDI_CMD_P4_GET_STATUS  0x00E2
+  #define PDI_CMD_P5_GET_STATUS  0x00E3
+    // get port status bits - port status byte
+    #define PDI_PSTAT_CONNECT        0x0001
+    #define PDI_PSTAT_ENABLED        0x0002
+    #define PDI_PSTAT_SUSPEND        0x0004
+    #define PDI_PSTAT_OVERCUR        0x0008
+    #define PDI_PSTAT_RESET          0x0010
+    #define PDI_PSTAT_POWER          0x0020
+    #define PDI_PSTAT_LOWSPEED       0x0040
+    // get port status bits - port status change byte
+    #define PDI_PSTAT_CHANGE_CONNECT 0x0100
+    #define PDI_PSTAT_CHANGE_ENABLED 0x0200
+    #define PDI_PSTAT_CHANGE_SUSPEND 0x0400
+    #define PDI_PSTAT_CHANGE_OVERCUR 0x0800
+    #define PDI_PSTAT_CHANGE_RESET   0x1000
+  // Set Status Change Bits
+  #define PDI_CMD_SET_CHNG_BITS  0x00F7
+    // set status change bits - bits
+    #define PDI_SCHB_LOCAL_POWER    0x0001
+    #define PDI_SCHB_FNC1           0x0002
+   #if !defined(PDIUSBH11) && !defined(PDIUSBH11A_SINGLE)
+    #define PDI_SCHB_FNC6           0x0004
+    #define PDI_SCHB_FNC7           0x0008
+   #endif
+#endif
+
+
+/*********************************************************/
+//  Function prototypes
+//
+// PDIUSB common commands
+ #if defined(PDIUSBH11) || defined(PDIUSBH11A) || defined(PDIUSBD11)
+  void pdiSetHUBAddressEnable( unsigned char byAddress, unsigned char byEnable);
+ #endif
+ #if !defined(PDIUSBH11A_MULTIPLE) // D11,D12,H11,H11A_S(emb.fnc)
+  void pdiSetAddressEnable( unsigned char byAddr_Enb);
+//  void pdiSetAddressEnable( unsigned char byAddress, unsigned char byEnable);
+ #else
+  void pdiSetEmbFncAddressEnable( unsigned char byFnc, unsigned char byAddress, unsigned char byEnable);
+ #endif
+
+  void pdiSetEndpointEnable( unsigned char byEnable);
+  
+ #if !defined(PDIUSBH11)  // H11 has not it ( !!! is great - try give single quote mark into comments ;-)
+  void pdiSetMode( unsigned short wMode_Clock);
+ #endif
+ #if defined(PDIUSBD12)
+  void pdiSetDMA( unsigned char byDma);
+  unsigned char pdiGetDMA( void);
+ #endif
+
+ #if defined(PDIUSBH11)
+  unsigned char pdiGetInterrupt( void) _PDI_USING;
+ #else
+  unsigned short pdiGetInterrupt( void) _PDI_USING;
+ #endif
+  
+  unsigned char pdiSelectEp( unsigned char byEpIdx);
+  unsigned char pdiGetLastTransStatus( unsigned char byEpIdx) _PDI_USING;
+
+ #if defined(PDIUSBD11) || defined(PDIUSBH11) || defined(PDIUSBH11A)
+  unsigned char pdiGetEpStatus( unsigned char byEpIdx);
+ #endif
+
+  unsigned char pdiReadFromEpBuffer( unsigned char byLength, unsigned char *pToBuff);
+  void pdiWriteToEpBuffer( unsigned char byLength, const unsigned char *pFromBuff);
+  void pdiSetEpStatus( unsigned char byEpIdx, unsigned char byStatus);
+  void pdiAcknowledgeSetup( void);
+  void pdiClearBuffer( void);
+  void pdiValidateBuffer( void);
+
+  void pdiSendResume( void);
+  unsigned short pdiGetFrameNumber( void);
+  unsigned short pdiGetChipID( void); // this function is undocumented
+  
+ // HUB command
+ #if defined(PDIUSBH11) || defined(PDIUSBH11A)
+  void pdiClearPortFeature( unsigned char byEpIdx, unsigned char byFeature);
+  void pdiSetPortFeature( unsigned char byEpIdx, unsigned char byFeature);
+  unsigned short pdiGetPortFeature( unsigned char byEpIdx);
+  void pdiSetStatusChangeBits( unsigned char byBits);
+ #endif
+
+// PDIUSB other commands
+ void pdiWriteEndpoint( unsigned char byEpIdx, unsigned char byLength, const unsigned char *pbyData);
+ unsigned char pdiReadEndpoint( unsigned char byEpIdx, unsigned char byMaxLength, unsigned char *pbyData);
+ unsigned char pdiCmdData( unsigned char byCmd, unsigned char *pbyData,
+                           unsigned char byCount, unsigned char byRead);
+ void pdiInit( void);
+#if !defined(PDIUSBH11A_MULTIPLE)
+ void pdiAckSetupControl( void);
+#else
+ void pdiAckSetupFncControl( unsigned char Fnc);
+#endif
+
+unsigned char pdiEp2Idx(unsigned char ep);
+
+/*********************************************************/
+#endif // from _PDI_ERROR_NO_CONTINUE
+/*********************************************************/
+#endif // from _PDI_BASE_MODULE
diff --git a/ulan/host/.cvsignore b/ulan/host/.cvsignore
new file mode 100644 (file)
index 0000000..ee51eb5
--- /dev/null
@@ -0,0 +1,6 @@
+Makefile
+Makefile.in
+_build
+_compiled
+config.omk
+configure
diff --git a/ulan/host/CVS/Entries b/ulan/host/CVS/Entries
new file mode 100644 (file)
index 0000000..e14aa23
--- /dev/null
@@ -0,0 +1,14 @@
+/.cvsignore/1.2/Wed Sep 22 22:13:08 2004//
+/Makefile.omk/1.4/Sun Nov 11 18:35:38 2007//
+/Makefile.rules/1.30/Sat Mar  1 22:59:12 2008//
+/Makefile.std/1.1/Fri Sep 10 19:12:19 2004//
+/Makefile4omk/1.2/Wed Sep 19 10:58:59 2007//
+/README.makerules/1.1/Fri Sep 10 19:12:19 2004//
+/config.omk-default/1.9/Sun Nov 11 18:35:38 2007//
+/kernelcfg2mk/1.5/Sat Mar  1 22:55:02 2008//
+/switch2omk/1.1/Fri Sep 10 19:12:19 2004//
+/switch2std/1.1/Fri Sep 10 19:12:20 2004//
+D/apps////
+D/contrib////
+D/libs4c////
+D/ul_drv////
diff --git a/ulan/host/CVS/Repository b/ulan/host/CVS/Repository
new file mode 100644 (file)
index 0000000..201a817
--- /dev/null
@@ -0,0 +1 @@
+ulan/host
diff --git a/ulan/host/CVS/Root b/ulan/host/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/Makefile.omk b/ulan/host/Makefile.omk
new file mode 100644 (file)
index 0000000..35f82a0
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = libs4c ul_drv apps
diff --git a/ulan/host/Makefile.rules b/ulan/host/Makefile.rules
new file mode 100644 (file)
index 0000000..df2355c
--- /dev/null
@@ -0,0 +1,1209 @@
+#                   Version for Linux/RTLinux builds.        #OMK@linux
+#
+#  Makefile.rules - OCERA make framework common project rules -*- makefile -*- #OMK@base
+#
+#  (C) Copyright 2003 by Pavel Pisa - OCERA team member
+#  (C) Copyright 2006 by Michal Sojka - Czech Technical University, FEE, DCE
+#
+#  Homepage: http://rtime.felk.cvut.cz/omk/
+#
+# The OMK build system is distributed under the GNU General Public
+# License.  See file COPYING for details.
+#
+# input variables
+# V                .. if set to 1, full command text is shown else short form is used
+# W                .. whole tree - if set to 1, make is always called from the top-level directory
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+# LN_HEADERS       .. if "y", header files are symbolicaly linked instead of copied. #OMK@include
+#                                                            #OMK@linux
+# input variables
+# lib_LIBRARIES    .. list of the user-space libraries
+# shared_LIBRARIES .. list of the user-space shared libraries
+# kernel_LIBRARIES .. list of the kernel-space libraries
+# rtlinux_LIBRARIES.. list of the RT-Linux kernel-space libraries
+# include_HEADERS  .. list of the user-space public header files
+# nobase_include_HEADERS .. public headers copied even with directory part
+# renamed_include_HEADERS .. public headers copied to the different target name
+# kernel_HEADERS   .. list of the kernel-space public header files
+# rtlinux_HEADERS  .. list of the RT-Linux kernel-space public header files
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# test_PROGRAMS    .. list of the testing programs
+# kernel_MODULES   .. list of the kernel side modules/applications
+# rtlinux_MODULES  .. list of RT-Linux the kernel side modules/applications
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# kernel_INCLUDES  .. additional include directories and defines for kernel-space
+# rtlinux_INCLUDES .. additional include directories and defines for RT-Linux
+# OMIT_KERNEL_PASSES  if defined, all kernel passes are omited
+#
+# LINUX_DIR        .. location of Linux kernel sources
+# RTL_DIR          .. location of RT-Linux sources
+# CFLAGS           .. C compiler flags
+# CXXFLAGS         .. C++ compiler flags
+# LOCAL_CONFIG_H   .. name of local config.h file generated from values #OMK@config_h
+#                     of options defined in the current directory
+# config_include_HEADERS .. names of global config files (possibly
+#                     with subdirectories)
+# xxx_DEFINES      .. list of config directives to be included in
+#                     config header file of the name <somedir>/xxx.h
+# DOXYGEN          .. if non-empty, generated headers includes Doxygen's @file
+#                    command, so it is possible to document config
+#                    variables.
+# QT_SUBDIRS       .. subdirectories where to build QT applications using qmake #OMK@qt
+# QTDIR                   .. where QT resides
+                                                             #OMK@base
+# We need to ensure definition of sources directory first
+ifndef SOURCES_DIR
+# Only shell built-in pwd understands -L
+SOURCES_DIR := $(shell ( pwd -L ) )
+endif
+
+.PHONY: all default check-make-ver omkize
+
+ifdef W
+  ifeq ("$(origin W)", "command line")
+    OMK_WHOLE_TREE:=$(W)
+  endif
+endif
+ifndef OMK_WHOLE_TREE
+  OMK_WHOLE_TREE:=0
+endif
+
+ifneq ($(OMK_WHOLE_TREE),1)
+all: check-make-ver default
+       @echo "Compilation finished"
+else
+# Run make in the top-level directory
+all:
+       @$(MAKE) -C $(MAKERULES_DIR) OMK_SERIALIZE_INCLUDED=n SOURCES_DIR=$(MAKERULES_DIR) RELATIVE_DIR="" $(MAKECMDGOALS) W=0
+endif
+
+ifdef OMK_TESTSROOT
+# Usage: $(call canttest,<error message>)
+define canttest
+       ( echo "$(1)" > $(MAKERULES_DIR)/_canttest; echo "$(1)"; exit 1 )
+endef
+else
+define canttest
+       echo "$(1)"
+endef
+endif
+
+#=========================
+# Include the config file
+
+ifneq ($(CONFIG_FILE_OK),y)
+ifndef CONFIG_FILE
+CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
+endif
+ifneq ($(wildcard $(CONFIG_FILE)-default),)
+-include $(CONFIG_FILE)-default
+else
+ifneq ($(MAKECMDGOALS),default-config)
+$(warning Please, run "make default-config" first)
+endif
+endif
+
+-include $(MAKERULES_DIR)/config.target
+
+ifneq ($(wildcard $(CONFIG_FILE)),)
+include $(CONFIG_FILE)
+CONFIG_FILE_OK = y
+endif
+endif #$(CONFIG_FILE_OK)
+
+export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR
+export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
+# OMK_SERIALIZE_INCLUDED has to be exported to submakes because passes
+# must to be serialized only in the toplevel make.
+
+ifndef RELATIVE_DIR
+RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
+endif
+#$(warning  === RELATIVE_DIR = "$(RELATIVE_DIR)" ===)
+override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
+override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
+#$(warning  RELATIVE_DIR = "$(RELATIVE_DIR)")
+override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g'  -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__')
+#$(warning  BACK2TOP_DIR = "$(BACK2TOP_DIR)")
+
+#$(warning SOURCES_DIR = "$(SOURCES_DIR)")
+#$(warning MAKERULES_DIR = "$(MAKERULES_DIR)")
+#$(warning RELATIVE_DIR = "$(RELATIVE_DIR)")
+
+# We have to use RELATIVE_PREFIX because of mingw
+override RELATIVE_PREFIX := $(RELATIVE_DIR)/
+override RELATIVE_PREFIX := $(RELATIVE_PREFIX:/%=%)
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+#vpath %.cxx $(SOURCES_DIR)
+
+# Defines for quiet compilation
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    OMK_VERBOSE = $(V)
+  endif
+endif
+ifndef OMK_VERBOSE
+  OMK_VERBOSE = 0
+endif
+ifneq ($(OMK_VERBOSE),0)
+  Q =
+else
+  Q = @
+endif
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  QUIET_CMD_ECHO = true
+  OMK_SILENT = 1
+else
+  QUIET_CMD_ECHO = echo
+endif
+
+MAKEFILE_OMK=Makefile.omk
+# All subdirectories (even linked ones) containing Makefile.omk
+# Usage in Makefile.omk: SUBDIRS = $(ALL_OMK_SUBDIRS)
+ALL_OMK_SUBDIRS = $(patsubst %/$(MAKEFILE_OMK),%,$(patsubst $(SOURCES_DIR)/%,%,$(wildcard $(SOURCES_DIR)/*/$(MAKEFILE_OMK))))
+
+# ===================================================================
+# We have set up all important variables, so we can check and include
+# real OCERA style Makefile.omk now
+ifndef OMK_INCLUDED
+include $(SOURCES_DIR)/$(MAKEFILE_OMK)
+OMK_INCLUDED := 1
+endif
+
+check-make-ver:
+       @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
+       if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
+               echo "Your make program version is too old and does not support OMK system." ; \
+               echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
+       fi
+
+distclean dist-clean:
+       @$(QUIET_CMD_ECHO) "  RM      $(COMPILED_DIR_NAME) $(BUILD_DIR_NAME)"
+       @rm -fr $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)  $(MAKERULES_DIR)/$(BUILD_DIR_NAME)
+
+# Common OMK templates
+# ====================
+
+# Syntax: $(call mkdir,<dir name>)
+define mkdir_def
+       [ -d $(1) ] || mkdir -p $(1) || exit 1
+endef
+
+ifneq ($(V),2)
+NO_PRINT_DIRECTORY := --no-print-directory
+endif
+
+ifeq ($(USE_LEAF_MAKEFILES),n)
+export USE_LEAF_MAKEFILES
+SUBDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+SOURCESDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+else
+SUBDIR_MAKEFILE=$(SOURCES_DIR)/$(dir)/Makefile
+SOURCESDIR_MAKEFILE=$(SOURCES_DIR)/Makefile
+endif
+
+ifdef OMK_TESTSROOT
+check-target = $$(@:%=%-check)
+endif
+
+# Syntax: $(call omk_pass_template,<pass name(s)>,<build dir>,[<local make flags>],[<local condition>])
+define omk_pass_template
+.PHNOY: $(1) $(addsuffix -local,$(1)) $(addsuffix -check,$(1))
+$(1):
+       +@$(foreach dir,$(SUBDIRS),$(call mkdir_def,$(2)/$(dir)); \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) $(NO_PRINT_DIRECTORY) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(2)/$(dir) \
+               -f $(SUBDIR_MAKEFILE) $$@ || exit 1 ;) true
+ifneq ($(4),)
+       @echo "make[omk]: $$@ in $(RELATIVE_DIR)"; \
+       $(call mkdir_def,$(2)); \
+       $(MAKE) $(NO_PRINT_DIRECTORY) SOURCES_DIR=$(SOURCES_DIR) RELATIVE_DIR=$(RELATIVE_DIR) -C $(2) \
+               -f $(SOURCESDIR_MAKEFILE) $(3) $(check-target) $$(@:%=%-local)
+endif
+endef
+
+# =======================
+# DEFAULT CONFIG PASS
+
+default-config:
+       @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
+       @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
+       @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
+       @echo >> "$(CONFIG_FILE)-default"
+       @$(MAKE) $(NO_PRINT_DIRECTORY) -C $(MAKERULES_DIR) \
+               RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
+               -f $(MAKERULES_DIR)/Makefile default-config-pass
+
+$(eval $(call omk_pass_template,default-config-pass,$$(LOCAL_BUILD_DIR),,always))
+
+default-config-pass-local:
+#      @echo Default config for $(RELATIVE_DIR)
+       @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
+       @$(foreach x, $(default_CONFIG), echo '$(x)' | \
+               sed -e 's/^[^=]*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
+
+
+omkize:
+       $(Q)if ! grep -q MAKERULES_DIR Makefile; then \
+          echo "Makefile is not OMK leaf makefile!" >&2; exit 1; \
+       fi
+       $(Q)for i in `find -L . -name Makefile.omk` ; do \
+          i=`dirname $${i}`; \
+          if [ x"$$i" != x"." ]; then \
+             rm -f $${i}/Makefile; \
+             cp Makefile $${i}/Makefile; \
+          fi \
+       done
+ifeq ($(OMK_VERBOSE),1)                                      #OMK@include
+CPHEADER_FLAGS += -v
+LNHEADER_FLAGS += -v
+endif
+
+ifneq ($(LN_HEADERS),y)
+define cp_cmd
+( echo "  CP      $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; cp $(CPHEADER_FLAGS) $(1) $(2) )
+endef
+else
+define cp_cmd
+( echo "  LN      $(1:$(MAKERULES_DIR)/%=%) -> $(2:$(MAKERULES_DIR)/%=%)"; ln -sf $(LNHEADER_FLAGS) $(1) $(2) )
+endef
+endif
+
+# TODO: Check modification date of changed header files. If it is
+# newer that in source dir, show a warning.
+
+# Syntax: $(call include-pass-template,<include dir>,<keyword>)
+define include-pass-template
+       @$(foreach f, $($(2)_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(1)/$(notdir $(f)) \
+          || $(call cp_cmd,$(SOURCES_DIR)/$(f),$(1)/$(notdir $(f))) || exit 1 ; )
+       @$(foreach f, $(nobase_$(2)_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(1)/$(f) \
+          || ( mkdir -p $(1)/$(dir $(f)) && $(call cp_cmd,$(SOURCES_DIR)/$(f),$(1)/$(f)) ) || exit 1 ; )
+       @$(foreach f, $(renamed_$(2)_HEADERS), \
+          srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
+          cmp --quiet $(SOURCES_DIR)/$${srcfname} $(1)/$${destfname} \
+          || ( mkdir -p `dirname $(1)/$${destfname}` && $(call cp_cmd,$(SOURCES_DIR)/$${srcfname},$(1)/$${destfname}) ) || exit 1 ; )
+endef
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@linux
+# Hack to check RT-Linux rules
+#LINUX_DIR := /home/cvs/ocera/ocera-build/kernel/linux
+#RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
+#CONFIG_RTLINUX = y
+#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
+
+-include $(MAKERULES_DIR)/OCERA_TOP_DIR
+
+BUILD_DIR_NAME = _build
+COMPILED_DIR_NAME = _compiled
+ifndef GROUP_DIR_NAME
+GROUP_DIR_NAME = nogroup
+endif
+
+ifdef OCERA_DIR
+ifeq ($(wildcard $(OCERA_DIR)/ocera.mk),)
+$(warning "ocera.mk" file does not exist. Adapt Makefile.rules for standalone compilation)
+$(warning (comment out definition of OCERA_DIR line and optionally select RTL_DIR) )
+$(error or go to the ocera/ directory and do 'make' to generate the "ocera.mk" file first, please)
+endif
+include $(OCERA_DIR)/ocera.mk
+KERN_INCLUDE_DIR := $(OCERA_KERNEL_INCLUDES_DIR)
+KERN_LIB_DIR     := $(OCERA_KERNEL_LIBRARIES_DIR)
+KERN_MODULES_DIR := $(OCERA_MODULES_DIR)
+KERN_BUILD_DIR   := $(BUILD_DIR)/kern/$(GROUP_DIR_NAME)
+KERN_MODPOST_DIR := $(BUILD_DIR)/kern-modpost
+USER_INCLUDE_DIR := $(OCERA_USER_INCLUDES_DIR)
+USER_LIB_DIR     := $(OCERA_USER_LIBRARIES_DIR)
+USER_UTILS_DIR   := $(TARGET_DIR)/usr/bin
+USER_TESTS_DIR   := $(TARGET_DIR)/usr/bin
+USER_BIN_DIR     := $(TARGET_DIR)/usr/bin
+USER_BUILD_DIR   := $(BUILD_DIR)/user/$(GROUP_DIR_NAME)
+#LINUX_DIR        := $(OCERA_DIR)/kernel/linux
+#RTL_DIR          := $(OCERA_DIR)/kernel/rtlinux
+#CONFIG_FILE      := $(OCERA_DIR)/emdebsys/.config 
+ifneq ($(wildcard $(CONFIG_FILE)),)
+CONFIG_FILE_OK = y
+endif
+else # OCERA_DIR
+KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
+KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
+KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
+KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
+KERN_MODPOST_DIR := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern-modpost
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+USER_TESTS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-tests
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+
+ifndef LINUX_VERSION
+LINUX_VERSION=$(shell uname -r)
+endif
+ifndef LINUX_DIR
+LINUX_DIR=/lib/modules/$(LINUX_VERSION)/build
+endif
+endif # OCERA_DIR
+
+ifeq ($(BUILD_OS),)
+  # Check for target
+  ifeq ($(OS),Windows_NT)
+    BUILD_OS := win32
+  else
+    BUILD_OS := $(shell uname | tr '[A-Z]' '[a-z]' )
+    #$(warning BUILD_OS=$(BUILD_OS))
+  endif
+endif
+
+ifeq ($(TARGET_OS),)
+  TARGET_OS := $(BUILD_OS)
+endif
+
+LOCAL_BUILD_DIR  = $(USER_OBJS_DIR)
+
+# Assign default values to CFLAGS variable. If the variable is defined
+# earlier (i.g. in config.omk), it is not overriden here.
+CFLAGS ?= -O2 -Wall
+CXXFLAGS ?= -O2 -Wall
+
+
+CPPFLAGS  += -I $(USER_INCLUDE_DIR)
+
+LOADLIBES += -L$(USER_LIB_DIR) 
+
+LOADLIBES += $(lib_LOADLIBES:%=-l%)
+
+LIB_CPPFLAGS += $(CPPFLAGS)
+LIB_CFLAGS   += $(CFLAGS)
+
+ifeq ($(TARGET_OS),win32)
+  SOLIB_EXT = dll
+else
+  SOLIB_EXT = so
+  SOLIB_PICFLAGS += -fpic
+endif
+
+#vpath %.c $(SOURCES_DIR)
+#vpath %.cc $(SOURCES_DIR)
+#vpath %.cxx $(SOURCES_DIR)
+
+USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
+KERN_OBJS_DIR = $(KERN_BUILD_DIR)/$(RELATIVE_DIR)
+
+.PHONY: dep subdirs clean clean-custom cleandepend check-dir
+
+# Some support to serialize some targets for parallel make
+ifneq ($(OMK_SERIALIZE_INCLUDED),y)
+include-pass: check-dir
+library-pass: include-pass
+binary-pass: library-pass
+kernel-lib-pass: include-pass
+kernel-mod-pass: kernel-lib-pass
+kernel-modpost-pass: kernel-mod-pass
+kernel-pass: kernel-mod-pass kernel-modpost-pass
+
+override OMK_SERIALIZE_INCLUDED = y
+MAKEOVERRIDES := $(filter-out OMK_SERIALIZE_INCLUDED=n,$(MAKEOVERRIDES))
+endif
+
+# Checks for OMK tester
+ifdef OMK_TESTSROOT
+default-config-pass-check include-pass-check:
+library-pass-check binary-pass-check:
+       @[ -x "$(shell which $(CC))" ] || $(call canttest,Cannot file compiler: $(CC))
+endif
+
+#=====================================================================
+# User-space rules and templates to compile programs, libraries etc.
+
+ifdef USER_RULE_TEMPLATES
+
+USER_SOURCES2OBJS = .o/.c .o/.cc .o/.cxx .o/.S .o/.o
+
+USER_SOURCES2OBJSLO = .lo/.c .lo/.cc .lo/.cxx .o/.S .lo/.lo
+
+#%.lo: %.c
+#      $(CC) -o $@ $(LCFLAGS) -c $<
+
+c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
+
+cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
+
+idl_COMPILE = $(IDL_COMPILER)
+
+# Check GCC version for user build
+ifndef CC_MAJOR_VERSION
+CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
+endif
+# Prepare suitable define for dependency building
+ifeq ($(CC_MAJOR_VERSION),2)
+CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
+else
+CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+endif
+
+
+# Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_c_o_template
+$(2): $(1) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CC      $$@"
+       $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+# Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_cc_o_template
+$(2): $(1) $$(GEN_HEADERS)
+       @$(QUIET_CMD_ECHO) "  CXX     $$@"
+       $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+# Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
+define COMPILE_S_o_template
+$(2): $(1) $$(GEN_HEADERS)
+        @$(QUIET_CMD_ECHO) "  AS      $$@"
+        $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
+        then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
+        else rm -f "$$@.d.tmp" ; exit 1; \
+        fi
+endef
+
+
+# Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
+define CMETRIC_o_h_template
+$(2): $(1)
+       @$(QUIET_CMD_ECHO) "  CMETRIC $$@"
+       $(Q)if [ -n `dirname $$@` ] ; then \
+             if [ ! -e `dirname $$@` ] ; then \
+               mkdir -p `dirname $$@` ; fi ; fi
+       $(Q)echo >$$@ '/* Automatically generated from $$< */'
+       $(Q)echo >>$$@ '/* Conditionals to control compilation */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+       $(Q)echo >>$$@ '/* Defines from the values defined to symbols */'
+       $(Q)set -o pipefail ; $(NM) $$< \
+               | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
+               | sort >>$$@
+endef
+
+
+
+define COMPILE_idl_template
+$(2).c $(2)-stubs.c $(2)-skels.c $(2)-common.c $(2).h: $(1)
+       @$(QUIET_CMD_ECHO) "  IDL     $$@"
+       $(Q) $$(idl_COMPILE) $(1)
+endef
+
+
+# Syntax: $(call PROGRAM_template,<dir>,<executable-name>,<executable-suffix>,<linker-sript>)
+# FIXME: ???????? asi je tu blbej komentar
+define PROGRAM_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJS),
+$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+
+$(2)/$(1)$(3): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $$(if $$(filter %.cc,$$($(1)_SOURCES:%.cxx=%.cc)),$$(CXX),$$(CC)) \
+         $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@
+       @echo "$(2)/$(1)$(3): \\" >$(USER_OBJS_DIR)/$(1).exe.d
+       @sed -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(USER_OBJS_DIR)/$(1).exe.map|tr '&' '\134'  >>$(USER_OBJS_DIR)/$(1).exe.d
+       @echo >>$(USER_OBJS_DIR)/$(1).exe.d
+endef
+
+
+# Syntax: $(call LIBRARY_template,<library-name>)
+define LIBRARY_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+USER_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJS),
+$(1)_OBJS += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJS := $$(sort $$($(1)_OBJS:%/=%))
+
+USER_OBJS  += $$($(1)_OBJS)
+USER_SOURCES += $$($(1)_SOURCES)
+
+$(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR      $$@"
+       $(Q) $(AR) rcs $$@ $$^
+endef
+
+
+# Syntax: $(call SOLIB_template,<library-name>)
+define SOLIB_template
+
+USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-skels.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_SERVER_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-stubs.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_CLIENT_IDL:%.idl=%-common.c))
+$(1)_GEN_SOURCES += $$(filter %.c,$$($(1)_IDL:%.idl=%.c))
+SOLIB_GEN_SOURCES += $$($(1)_GEN_SOURCES)
+
+$(foreach x, $(USER_SOURCES2OBJSLO),
+$(1)_OBJSLO += $$(patsubst %$(notdir $(x)),%$(dir $(x)),$$(filter %$(notdir $(x)),\
+               $$($(1)_SOURCES) $$($(1)_GEN_SOURCES)))
+)
+$(1)_OBJSLO := $$(sort $$($(1)_OBJSLO:%/=%))
+
+SOLIB_OBJS  += $$($(1)_OBJSLO)
+SOLIB_SOURCES += $$($(1)_SOURCES)
+
+$(USER_LIB_DIR)/lib$(1).$(SOLIB_EXT): $$($(1)_OBJSLO)
+       @$(QUIET_CMD_ECHO) "  LINK    $$@"
+       $(Q) $(LD) --shared --soname=lib$(1).$(SOLIB_EXT) -o $$@ $$^ $$(LOADLIBES) $$($(1)_LIBS:%=-l%)
+endef
+
+
+
+library-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(cmetric_include_HEADERS)) \
+                   $(lib_LIBRARIES:%=$(USER_LIB_DIR)/lib%.a) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT))
+
+binary-pass-local: $(bin_PROGRAMS:%=$(USER_BIN_DIR)/%$(EXE_SUFFIX)) $(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%$(EXE_SUFFIX)) $(test_PROGRAMS:%=$(USER_TESTS_DIR)/%$(EXE_SUFFIX))
+
+# Special rules for CMETRIC generated headers
+
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call COMPILE_c_o_template,\
+               $(SOURCES_DIR)/$($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES),\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),)))
+$(foreach cmetrh,$(cmetric_include_HEADERS),$(eval $(call CMETRIC_o_h_template,\
+               $($(basename $(notdir $(cmetrh)))_CMETRIC_SOURCES:%.c=%.o),\
+               $(addprefix $(USER_INCLUDE_DIR)/,$(cmetrh)))))
+
+GEN_HEADERS+=$(cmetric_include_HEADERS:%=$(USER_INCLUDE_DIR)/%)
+
+GEN_HEADERS+=$(filter %.h,$(USER_IDLS:%.idl=%.h))
+
+# Generate rules for compilation of programs and libraries
+
+$(foreach prog,$(utils_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(EXE_SUFFIX))))
+
+$(foreach prog,$(test_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_TESTS_DIR),$(EXE_SUFFIX))))
+
+$(foreach prog,$(bin_PROGRAMS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(EXE_SUFFIX))))
+
+$(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
+
+$(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
+
+-include $(USER_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+# Kernel-space rules and templates to compile modules, libraries etc.
+
+ifdef KERN_RULE_TEMPLATES
+
+$(KERN_LIB_DIR)/kernel.mk: $(LINUX_DIR)/.config $(MAKERULES_DIR)/kernelcfg2mk
+       @$(QUIET_CMD_ECHO) "  KCFG2MK $$@"
+       $(Q) $(MAKERULES_DIR)/kernelcfg2mk $(LINUX_DIR) $(KERN_LIB_DIR)
+
+ifeq ($(CONFIG_RTLINUX),y)
+include $(RTL_DIR)/rtl.mk
+
+KERN_CC = $(CC)
+kern_GCCLIB_DIR=$(shell LANG=C LC_ALL=C LC_MESSAGES=C $(CC) -print-search-dirs | sed -n -e 's/^install: \(.*\)$$/\1/p' )
+INCLUDES := -I $(KERN_INCLUDE_DIR) $(INCLUDE) $(rtlinux_INCLUDES) $(kernel_INCLUDES)
+#-DEXPORT_NO_SYMBOLS
+c_o_kern_COMPILE = $(KERN_CC) -idirafter $(kern_GCCLIB_DIR)/include $(INCLUDES)  $(CFLAGS) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB -nostdinc
+cc_o_kern_COMPILE = $(CXX) $(INCLUDES) $(CXXFLAGS) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB
+KERN_EXE_SUFFIX := .o
+KERN_ARCH = $(ARCH)
+KERN_LD = $(LD)
+KERN_AR = $(AR)
+
+else # CONFIG_RTLINUX
+
+include $(KERN_LIB_DIR)/kernel.mk
+
+ifeq ($(LINUX_SRC),)
+LINUX_SRC = $(LINUX_DIR)
+endif
+kernel_INCLUDES += -I $(LINUX_DIR) -idirafter $(LINUX_SRC)/include/linux
+
+ifdef LINUX_CC
+KERN_CC = $(LINUX_CC)
+kern_GCCLIB_DIR=$(shell LANG=C LC_ALL=C LC_MESSAGES=C $(LINUX_CC) -print-search-dirs | sed -n -e 's/^install: \(.*\)$$/\1/p' )
+else
+KERN_CC = echo KERN_CC not defined - compilation skipped
+endif
+c_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB -nostdinc
+cc_o_kern_COMPILE = $(KERN_CC) $(kernel_INCLUDES) -idirafter $(kern_GCCLIB_DIR)/include $(LINUX_CPPFLAGS) $(LINUX_CFLAGS) $(LINUX_CFLAGS_MODULE) -DOMK_FOR_KERNEL -DEXPORT_SYMTAB
+KERN_EXE_SUFFIX := $(LINUX_MODULE_EXT)
+KERN_LDFLAGS = $(LINUX_LDFLAGS)
+ifdef LINUX_ARCH
+KERN_ARCH = $(LINUX_ARCH)
+else
+KERN_ARCH = echo KERN_ARCH not defined - skipped
+endif
+ifdef LINUX_LD
+KERN_LD = $(LINUX_LD)
+else
+KERN_LD = echo KERN_LD  not defined - skipped
+endif
+ifneq ($(LINUX_AR),)
+KERN_AR = $(LINUX_AR)
+else
+KERN_AR = $(AR)
+endif
+ifeq ($(LINUX_QUOTE_MODNAME),y)
+KERN_MQ=\"
+KERN_KBUILD_MODNAME=-D"KBUILD_MODNAME=((THIS_MODULE)?(THIS_MODULE)->name:NULL)"
+endif
+endif # CONFIG_RTLINUX
+
+KERN_LOADLIBES += -L$(KERN_LIB_DIR) 
+
+KERN_LOADLIBES += $(rtlinux_LOADLIBES:%=-l%)
+KERN_LOADLIBES += $(kernel_LOADLIBES:%=-l%)
+
+
+
+# Check GCC version for kernel part of build
+ifndef kern_CC_MAJOR_VERSION
+kern_CC_MAJOR_VERSION := $(shell $(KERN_CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
+endif
+# Prepare suitable define for dependency building
+ifeq ($(kern_CC_MAJOR_VERSION),2)
+kern_CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
+else
+kern_CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
+endif
+
+ifeq ($(KERN_EXE_SUFFIX),.ko)
+ifeq ($(wildcard $(LINUX_DIR)/scripts/mod/modpost),)
+KERN_MODPOST = $(LINUX_DIR)/scripts/modpost
+else
+KERN_MODPOST = $(LINUX_DIR)/scripts/mod/modpost
+endif
+KERN_MODULES_LINK_DIR = $(KERN_MODPOST_DIR)
+KERN_LINK_SUFFIX = .o
+else
+KERN_MODULES_LINK_DIR = $(KERN_MODULES_DIR)
+KERN_LINK_SUFFIX = $(KERN_EXE_SUFFIX)
+endif
+
+define COMPILE_c_o_kern_template
+
+$(2): $(1)
+       @$(QUIET_CMD_ECHO) "  CC [K]  $$@"
+       $(Q) if $$(c_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \
+       -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \
+       -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+
+define COMPILE_cc_o_kern_template
+
+$(2): $(1)
+       @$(QUIET_CMD_ECHO) "  CXX [K] $$@"
+       $(Q) if $$(cc_o_kern_COMPILE) $$(kern_CC_DEPFLAGS) $(3) $(KERN_KBUILD_MODNAME) \
+       -D"KBUILD_BASENAME=$(KERN_MQ)$(notdir $(basename $(1)))$(KERN_MQ)" \
+       -o $$@ -c $$< ; \
+       then mv -f "$$@.d.tmp" "$$@.d" ; \
+       else rm -f "$$@.d.tmp" ; exit 1; \
+       fi
+endef
+
+
+
+define MODULE_kern_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+KERN_OBJS  += $$($(1)_OBJS)
+KERN_SOURCES += $$($(1)_SOURCES)
+
+# this is hack to build "__this_module" structure for 2.6.x kernels
+# modpost is used for that purpose now
+
+#$(1).mod.c:
+#      echo  "\
+#      #include <linux/version.h>@\
+#      #include <linux/module.h>@\
+#      #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5))@\
+#      #include <linux/vermagic.h>@\
+#      #include <linux/compiler.h>@\
+#      @\
+#      MODULE_INFO(vermagic, VERMAGIC_STRING);@\
+#      @\
+#      #undef unix@\
+#      struct module __this_module@\
+#      __attribute__((section(\".gnu.linkonce.this_module\"))) = {@\
+#       .name = __stringify(KBUILD_MODNAME),@\
+#       .init = init_module,@\
+#      #ifdef CONFIG_MODULE_UNLOAD@\
+#       .exit = cleanup_module,@\
+#      #endif@\
+#      };@\
+#      #endif@\
+#      " | tr @ \\n >$$@ 
+
+
+#$(eval $(call COMPILE_c_o_kern_template,$(1).mod.c,$(1).mod.o,-DKBUILD_MODNAME=$(1)))
+
+$(2)/$(1)$(KERN_LINK_SUFFIX): $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  LD [K]  $$@"
+       $(Q) $$(KERN_LD) $$(KERN_LDFLAGS) -r $$($(1)_OBJS) -L$$(kern_GCCLIB_DIR) $$($(1)_LIBS:%=-l%) $$(KERN_LOADLIBES) -Map $(KERN_OBJS_DIR)/$(1).mod.map -o $$@
+       @echo "$(2)/$(1)$(KERN_LINK_SUFFIX): \\" >$(KERN_OBJS_DIR)/$(1).mod.d
+       @sed -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(KERN_OBJS_DIR)/$(1).mod.map  >>$(KERN_OBJS_DIR)/$(1).mod.d
+       @echo >>$(KERN_OBJS_DIR)/$(1).mod.d
+       @if [ "$(KERN_EXE_SUFFIX)" = ".ko" ] ; then \
+         echo $(1) >>$(KERN_MODPOST_DIR)/module-changes ; \
+         echo $(1) >>$(KERN_MODPOST_DIR)/$(1).mod.stamp ; \
+       fi
+
+endef
+
+
+
+define LIBRARY_kern_template
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
+$(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
+$(1)_OBJS := $$(sort $$($(1)_OBJS))
+
+KERN_OBJS  += $$($(1)_OBJS)
+KERN_SOURCES += $$($(1)_SOURCES)
+
+$(KERN_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
+       @$(QUIET_CMD_ECHO) "  AR [K]  $$@"
+       $(Q) $(KERN_AR) rcs $$@ $$^
+endef
+
+
+ifdef LINUX_DIR
+
+kernel-lib-pass-local: $(kernel_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.a)
+
+kernel-mod-pass-local: $(kernel_MODULES:%=$(KERN_MODULES_LINK_DIR)/%$(KERN_LINK_SUFFIX))
+
+$(foreach module,$(kernel_MODULES),$(eval $(call MODULE_kern_template,$(module),$(KERN_MODULES_LINK_DIR))))
+
+$(foreach lib,$(kernel_LIBRARIES),$(eval $(call LIBRARY_kern_template,$(lib))))
+
+endif
+
+
+ifeq ($(CONFIG_RTLINUX),y)
+
+kernel-mod-pass-local: $(rtlinux_MODULES:%=$(KERN_MODULES_LINK_DIR)/%$(KERN_LINK_SUFFIX))
+
+kernel-lib-pass-local: $(rtlinux_LIBRARIES:%=$(KERN_LIB_DIR)/lib%.a)
+
+$(foreach module,$(rtlinux_MODULES),$(eval $(call MODULE_kern_template,$(module),$(KERN_MODULES_LINK_DIR))))
+
+$(foreach lib,$(rtlinux_LIBRARIES),$(eval $(call LIBRARY_kern_template,$(lib))))
+
+endif
+
+ifeq ($(KERN_MODPOST_PASS),y)
+
+MODULES_LIST :=        $(wildcard *.mod.stamp)
+MODULES_LIST := $(MODULES_LIST:%.mod.stamp=%)
+
+define MODPOST_kern_template
+$(2) : $(1)$(KERN_LINK_SUFFIX) $(1).mod.c
+       @$(QUIET_CMD_ECHO) "  LD [M]  $$@"
+       $(Q) $$(cc_o_kern_COMPILE) -D"KBUILD_BASENAME=$(KERN_MQ)$(1)$(KERN_MQ)" \
+               -D"KBUILD_MODNAME=$(KERN_MQ)$(1)$(KERN_MQ)" \
+               -o $(1).mod.o -c $(1).mod.c
+       $(Q) $$(KERN_LD) $$(KERN_LDFLAGS) $(1)$(KERN_LINK_SUFFIX) $(1).mod.o -r -o $$@
+endef
+
+kernel-modpost-versions: $(wildcard $(LINUX_DIR)/Module.symvers)
+       @$(QUIET_CMD_ECHO) "  MODPOST    $(KERN_MODPOST_DIR)"
+       @echo  >$(KERN_MODPOST_DIR)/modpost-running
+       @rm -f $(KERN_MODPOST_DIR)/module-changes
+       $(Q) $(KERN_MODPOST) $(MODULES_LIST:%=%$(KERN_LINK_SUFFIX)) $(^:%=-i %)
+
+$(MODULES_LIST:%=%.mod.c) : kernel-modpost-versions
+
+kernel-modpost-pass-local: $(MODULES_LIST:%=$(KERN_MODULES_DIR)/%$(KERN_EXE_SUFFIX))
+       @rm -f $(KERN_MODPOST_DIR)/modpost-running
+
+$(foreach module,$(MODULES_LIST),$(eval $(call MODPOST_kern_template,$(module),$(module:%=$(KERN_MODULES_DIR)/%$(KERN_EXE_SUFFIX)))))
+
+endif
+
+-include $(KERN_OBJS_DIR)/*.d
+
+endif
+
+#=====================================================================
+
+# Kernel requires its own set of configuration header-files
+ifneq ($(kernel_LIBRARIES)$(rtlinux_LIBRARIES)$(kernel_MODULES)$(rtlinux_MODULES)$(kernel_HEADERS)$(rtlinux_HEADERS)$(kernel_HEADERS)$(rtlinux_HEADERS)$(nobase_kernel_HEADERS)$(nobase_rtlinux_HEADERS)$(renamed_kernel_HEADERS)$(renamed_rtlinux_HEADERS),)
+KERN_CONFIG_HEADERS_REQUIRED = y
+endif
+
+$(eval $(call omk_pass_template, kernel-lib-pass,$(KERN_OBJS_DIR),KERN_RULE_TEMPLATES=y,$(kernel_LIBRARIES)$(rtlinux_LIBRARIES)))
+$(eval $(call omk_pass_template, kernel-mod-pass,$(KERN_OBJS_DIR),KERN_RULE_TEMPLATES=y,$(kernel_MODULES)$(rtlinux_MODULES)))
+
+kernel-modpost-pass:
+       +@if [ -e "$(KERN_MODPOST_DIR)/module-changes" -o -e "$(KERN_MODPOST_DIR)/modpost-running" ] ; \
+       then \
+           $(MAKE) --no-print-directory -C $(KERN_MODPOST_DIR) \
+              -f $(SOURCES_DIR)/Makefile KERN_RULE_TEMPLATES=y KERN_MODPOST_PASS=y $(@:%=%-local) ; \
+       fi
+
+$(eval $(call omk_pass_template, library-pass,$(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(lib_LIBRARIES)$(shared_LIBRARIES)))
+$(eval $(call omk_pass_template, binary-pass, $(USER_OBJS_DIR),USER_RULE_TEMPLATES=y,$(bin_PROGRAMS)$(utils_PROGRAMS)$(test_PROGRAMS)))
+
+OTHER_PASSES = clean install include-pass
+$(eval $(call omk_pass_template,$(OTHER_PASSES),$(USER_OBJS_DIR),,always))
+
+check-dir:
+       @$(call mkdir_def,$(USER_BUILD_DIR))
+       @$(call mkdir_def,$(KERN_BUILD_DIR))
+       @$(call mkdir_def,$(USER_INCLUDE_DIR))
+       @$(call mkdir_def,$(KERN_INCLUDE_DIR))
+       @$(call mkdir_def,$(USER_LIB_DIR))
+       @$(call mkdir_def,$(KERN_LIB_DIR))
+       @$(call mkdir_def,$(USER_BIN_DIR))
+       @$(call mkdir_def,$(USER_UTILS_DIR))
+       @$(call mkdir_def,$(USER_TESTS_DIR))
+       @$(call mkdir_def,$(KERN_MODULES_DIR))
+       @$(call mkdir_def,$(KERN_MODPOST_DIR))
+
+install-local:                 # TODO
+
+include-pass-local:
+       $(call include-pass-template,$(USER_INCLUDE_DIR),include)
+       $(call include-pass-template,$(KERN_INCLUDE_DIR),kernel)
+ifeq ($(CONFIG_RTLINUX),y)
+       $(call include-pass-template,$(KERN_INCLUDE_DIR),rtlinux)
+endif
+
+ifdef USER_RULE_TEMPLATES
+
+# User-space static libraries and applications object files
+
+USER_SOURCES := $(sort $(USER_SOURCES))
+
+USER_GEN_SOURCES := $(sort $(USER_GEN_SOURCES))
+
+#$(warning USER_SOURCES = $(USER_SOURCES))
+
+$(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),)))
+
+$(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.o),)))
+
+$(foreach src,$(filter %.cxx,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),)))
+
+$(foreach src,$(filter %.c,$(USER_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.o),)))
+
+# User-space shared libraries object files
+
+SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
+
+SOLIB_GEN_SOURCES := $(sort $(SOLIB_GEN_SOURCES))
+
+#$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
+#$(warning SOLIB_GEN_SOURCES = $(SOLIB_GEN_SOURCES))
+
+$(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.cxx,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.lo),$(SOLIB_PICFLAGS))))
+
+$(foreach src,$(filter %.c,$(SOLIB_GEN_SOURCES)),$(eval $(call COMPILE_c_o_template,$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
+
+# IDL compilation
+
+USER_IDLS := $(sort $(USER_IDLS))
+
+$(foreach src,$(filter %.idl,$(USER_IDLS)),$(eval $(call COMPILE_idl_template,$(SOURCES_DIR)/$(src),$(src:%.idl=%))))
+
+endif
+
+ifdef KERN_RULE_TEMPLATES
+
+KERN_SOURCES := $(sort $(KERN_SOURCES))
+
+#$(warning KERN_SOURCES = $(KERN_SOURCES))
+
+$(foreach src,$(filter %.c,$(KERN_SOURCES)),$(eval $(call COMPILE_c_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.o),)))
+
+$(foreach src,$(filter %.cc,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.o),)))
+
+$(foreach src,$(filter %.cxx,$(KERN_SOURCES)),$(eval $(call COMPILE_cc_o_kern_template,$(SOURCES_DIR)/$(src),$(src:%.cxx=%.o),)))
+
+endif
+
+clean-local: clean-custom
+       @echo Cleaning in $(KERN_OBJS_DIR) and $(USER_OBJS_DIR)
+       @rm -f $(KERN_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.o $(USER_OBJS_DIR)/*.lo \
+              $(KERN_OBJS_DIR)/*.d $(USER_OBJS_DIR)/*.d \
+              $(KERN_OBJS_DIR)/*.map $(USER_OBJS_DIR)/*.map \
+              $(KERN_OBJS_DIR)/*.mod.c \
+              $(kernel_MODULES:%=$(KERN_MODPOST_DIR)/%.*) \
+              $(LOCAL_CONFIG_H:%=$(KERN_OBJS_DIR)/%) \
+              $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%)
+       @if [ -e $(KERN_LIB_DIR)/kernel.mk ] ; then \
+           touch -t 200001010101 $(KERN_LIB_DIR)/kernel.mk ; \
+       fi
+
+default: include-pass library-pass binary-pass
+ifndef OMIT_KERNEL_PASSES
+# Also make kernel passes if not disabled
+default: kernel-lib-pass kernel-pass
+endif
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@config_h
+# Syntax: $(call BUILD_CONFIG_H_template,<stamp_dir>,<header_file_path>,<list_of_options_to_export>,<header_barrier>)
+define BUILD_CONFIG_H_template
+
+$(addprefix $(1)/,$(notdir $(addsuffix .stamp,$(2)))) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
+       @$(QUIET_CMD_ECHO) "  CONFGEN $$(@:%.stamp=%)"
+       @if [ ! -d `dirname $(2).tmp` ] ; then \
+               mkdir -p `dirname $(2).tmp` ; fi
+       @echo "/* Automatically generated from */" > "$(2).tmp"
+       @echo "/* config file: $$< */" >> "$(2).tmp"
+       $(if $(DOXYGEN),@echo "/** @file */" >> "$(2).tmp")
+       @echo "#ifndef $(4)" >> "$(2).tmp"
+       @echo "#define $(4)" >> "$(2).tmp"
+       @( $(foreach x, $(shell echo '$($(3))' | tr 'x\t ' 'x\n\n' | sed -e 's/^\([^ =]*\)\(=[^ ]\+\|\)$$/\1/' ), \
+               echo '$(x).$($(x))' ; ) echo ; ) | \
+               sed -e '/^[^.]*\.n$$$$/d' -e '/^[^.]*\.$$$$/d' -e 's/^\([^.]*\)\.[ym]$$$$/\1.1/' | \
+               sed -n -e 's/^\([^.]*\)\.\(.*\)$$$$/#define \1 \2/p' \
+                 >> "$(2).tmp"
+       @echo "#endif /*$(4)*/" >> "$(2).tmp"
+       @touch "$$@"
+       @if cmp --quiet "$(2).tmp" "$(2)" ; then rm "$(2).tmp"; \
+       else mv "$(2).tmp" "$(2)" ; \
+       echo "Updated configuration $(2)" ; fi
+
+endef
+
+ifdef LOCAL_CONFIG_H
+
+# This must be declared after the default cflags are assigned!
+# Override is used to override command line assignemnt.
+override CFLAGS += -I.
+$(eval $(call BUILD_CONFIG_H_template,$(USER_OBJS_DIR),$(USER_OBJS_DIR)/$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+
+endif
+
+# Special rules for configuration exported headers
+
+#FIXME: The directory for headers should not be specified here.
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(USER_OBJS_DIR),$(addprefix $(USER_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+config_h_stamp_files = $(addprefix $(USER_OBJS_DIR)/,$(notdir $(addsuffix .stamp,$(config_include_HEADERS) $(LOCAL_CONFIG_H))))
+
+# Add some hooks to standard passes
+include-pass-local: $(config_h_stamp_files)
+
+ifneq ($(KERN_CONFIG_HEADERS_REQUIRED),)
+
+ifdef LOCAL_CONFIG_H
+$(eval $(call BUILD_CONFIG_H_template,$(KERN_OBJS_DIR),$(KERN_OBJS_DIR)/$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
+endif
+
+$(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(KERN_OBJS_DIR),$(addprefix $(KERN_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
+_$(basename $(notdir $(confh)))_H \
+)))
+
+kern_config_h_stamp_files = $(addprefix $(KERN_OBJS_DIR)/,$(notdir $(addsuffix .stamp,$(config_include_HEADERS) $(LOCAL_CONFIG_H))))
+
+# Add some hooks to standard passes
+include-pass-local: $(kern_config_h_stamp_files)
+
+endif
+
+clean-local: clean-local-config-h
+
+clean-local-config-h:
+       @$(foreach confh,$(config_h_stamp_files) $(kern_config_h_stamp_files),\
+           if [ -e $(confh) ] ; then rm $(confh) ; fi ; \
+       )
+
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@qt
+ifneq ($(QT_SUBDIRS),)
+
+.PHONY: qt-subpass clean-qt distclean-qt
+
+# Usage: $(call qt_makefile_template,<qt-subdir>)
+define qt_makefile_template
+$(SOURCES_DIR)/$(1)/Makefile: $(wildcard $(SOURCES_DIR)/$(1)/*.pro)
+       cd $(SOURCES_DIR)/$(1); $(QTDIR:%=%/bin/)qmake TOP_DIR=$(MAKERULES_DIR) \
+            RELATIVE_DIR=$(RELATIVE_PREFIX)$(1) $(QTDIR:%=QTDIR=%) CC=$(CC) \
+            CXX=$(CXX) LIBS+="-L$(USER_LIB_DIR)" INCLUDEPATH+="$(USER_INCLUDE_DIR)"
+endef
+$(foreach dir,$(QT_SUBDIRS), $(eval $(call qt_makefile_template,$(dir))))
+
+qt-subpass: $(foreach dir,$(QT_SUBDIRS), $(SOURCES_DIR)/$(dir)/Makefile)
+       $(foreach dir,$(QT_SUBDIRS),\
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(SOURCES_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile || exit 1 ;)
+
+# Hook to binary pass
+binary-pass: qt-subpass
+
+# Hook to clean pass
+clean-local: clean-qt
+clean-qt:
+       +@$(foreach dir, $(QT_SUBDIRS), \
+               $(if $(wildcard $(SOURCES_DIR)/$(dir)/Makefile), \
+               @$(QUIET_CMD_ECHO) "  CLEAN   $(dir)"; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(SOURCES_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile clean|| exit 1 ;))
+
+
+# Hook to distclean
+distclean: distclean-qt
+
+# TODO: Add distclean-qt-pass to handle QT_SUBDIRS in the whole
+# tree. This way we only distclean toplevel subdirs.
+distclean-qt:
+       +@$(foreach dir, $(QT_SUBDIRS), \
+               $(if $(wildcard $(SOURCES_DIR)/$(dir)/Makefile), \
+               @$(QUIET_CMD_ECHO) "  DISTCLEAN $(dir)"; \
+               $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
+               RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(SOURCES_DIR)/$(dir) \
+               -f $(SOURCES_DIR)/$(dir)/Makefile distclean|| exit 1 ;))
+endif
+
+# Local Variables:
+# mode:makefile
+# End:
+                                                             #OMK@sources-list
+# Rules that creates the list of files which are used during
+# compilation. The list reflects conditional compilation depending on
+# config.omk and other variables.
+
+SOURCES_LIST_FN=sources.txt
+ifndef SOURCES_LIST
+SOURCES_LIST_DIR:=$(RELATIVE_DIR)
+SOURCES_LIST:=$(MAKERULES_DIR)/$(SOURCES_LIST_DIR)/$(SOURCES_LIST_FN)
+export SOURCES_LIST SOURCES_LIST_DIR
+endif
+
+ifeq ($(MAKECMDGOALS),sources-list)
+NEED_SOURCES_LIST=y
+endif
+ifeq ($(MAKECMDGOALS),TAGS)
+NEED_SOURCES_LIST=y
+endif
+ifeq ($(MAKECMDGOALS),tags)
+NEED_SOURCES_LIST=y
+endif
+
+ifeq ($(NEED_SOURCES_LIST),y) # avoid execution of find command bellow if it is not useful
+.PHONY: sources-list
+sources-list: $(SOURCES_LIST)
+
+$(SOURCES_LIST): $(CONFIG_FILE) $(CONFIG_FILE)-default $(shell find -name $(MAKEFILE_OMK))
+       @echo -n "" > "$(SOURCES_LIST).tmp"
+       @$(MAKE) --no-print-directory sources-list-pass
+       @echo "# Automatically generated list of files in '$(RELATIVE_DIR)' that are used during OMK compilation" > "$(SOURCES_LIST).tmp2"
+       @cat "$(SOURCES_LIST).tmp"|sort|uniq >> "$(SOURCES_LIST).tmp2"
+       @rm "$(SOURCES_LIST).tmp"
+       @mv "$(SOURCES_LIST).tmp2" "$(SOURCES_LIST)"
+endif
+
+$(eval $(call omk_pass_template,sources-list-pass,$$(LOCAL_BUILD_DIR),,always))
+
+sources-list-pass-local:
+       @$(foreach h,$(include_HEADERS) $(nobase_include_HEADERS) $(kernel_HEADERS),\
+         echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(h)" >> "$(SOURCES_LIST).tmp";)
+       @$(foreach ch,$(config_include_HEADERS), \
+         echo "$(USER_INCLUDE_DIR:$(MAKERULES_DIR)/$(addsuffix /,$(SOURCES_LIST_DIR))%=%)/$(ch)" >> "$(SOURCES_LIST).tmp";)
+       @$(foreach h,$(renamed_include_HEADERS),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(h)"|sed -e 's/\(.*\)->.*/\1/' >> "$(SOURCES_LIST).tmp";)
+       @$(foreach bin,$(lib_LIBRARIES) $(shared_LIBRARIES) $(bin_PROGRAMS) $(test_PROGRAMS) $(utils_PROGRAMS) \
+         $(kernel_LIBRARIES) $(rtlinux_LIBRARIES) $(kernel_MODULES),\
+         $(foreach src,$(filter-out %.o,$($(bin)_SOURCES)),echo "$(RELATIVE_DIR:$(SOURCES_LIST_DIR)/%=%)/$(src)" >> "$(SOURCES_LIST).tmp";))
+
+############ TAGS ###########
+
+ifeq ($(MAKECMDGOALS),TAGS)
+ETAGS=etags
+TAGS_CMD = $(ETAGS)
+TAGS: $(SOURCES_LIST)
+       @$(MAKE) --no-print-directory do-tags
+endif
+ifeq ($(MAKECMDGOALS),tags) 
+CTAGS=ctags -N
+TAGS_CMD = $(CTAGS)
+tags: $(SOURCES_LIST)
+       @$(MAKE) --no-print-directory do-tags
+endif
+export TAGS_CMD
+
+ifeq ($(MAKECMDGOALS),do-tags)
+.PHONY: do-tags
+do-tags: $(shell sed -e '/^\#/d' $(SOURCES_LIST))
+       @$(QUIET_CMD_ECHO) "  TAGS    $(SOURCES_LIST_FN)"
+       $(Q)$(TAGS_CMD) $^
+endif
+
+############ CSCOPE ###########
+
+cscope: $(SOURCES_LIST)
+       @$(QUIET_CMD_ECHO) "  CSCOPE  < $(SOURCES_LIST_FN)"
+       $(Q)sed -e '/^#/d' $(SOURCES_LIST)|cscope -b -i-
+#FIXME: see doc to -i in cscope(1)
+
+# Local Variables:
+# mode:makefile
+# End:
diff --git a/ulan/host/Makefile.std b/ulan/host/Makefile.std
new file mode 100644 (file)
index 0000000..3fe82d1
--- /dev/null
@@ -0,0 +1,16 @@
+# enable next for WinNT target
+# export OS=Windows_NT
+
+# enable next for DJGPP target
+# export DJGPP = 1
+
+all: default
+
+.PHONY: default subdirs clean cleandepend
+
+dirs = ul_drv
+
+default clean install:
+       $(foreach dir, $(dirs), $(MAKE) -C $(dir) $@ ;)
+
+
diff --git a/ulan/host/Makefile4omk b/ulan/host/Makefile4omk
new file mode 100644 (file)
index 0000000..b22a357
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/host/README.makerules b/ulan/host/README.makerules
new file mode 100644 (file)
index 0000000..bb16443
--- /dev/null
@@ -0,0 +1,248 @@
+Description of OCERA Make System for CAN Components (OMK)
+=========================================================
+
+Important notice:
+This make system uses features found in recent versions of GNU Make
+program. If you encounter problems with package building,
+check, that you use correct version of Make program.
+The Make older than version 3.80, could not be used.
+Even Make version 3.80 has annoying bug which causes
+building fail with misleading message "virtual memory exhausted".
+Please, upgrade to last version of Make (3.81beta1).
+You can take it from GNU CVS or from our local copy
+
+http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz
+
+
+There is list of features which we want to solve with our makesystem:
+ - central Makefile.rules for most of subcomponents and components
+  (our CAN framework includes more libraries common with our other projects,
+   we need to separate some utility libraries etc.)
+ - the rules in more spread Makefiles are way to the hell,
+  (update for different kernel, RT-Linux etc would be nightmare in other case)
+ - make system should allow to freely move with cross-dependant components
+   without need to update users of moved component
+  (I hate somethink like -I../../sched/rtlshwq/include in CAN makefiles
+   for example. Component could be renamed to different name or version
+   could be added to name and all Makefiles in CAN would require to
+   be updated)
+ - make system should be able to compile mutually cross-dependant libraries
+   and should ensure, that change in one component sources or headers
+   would result in relink or rebuild in components linked against that library
+   or including modified header file
+ - make system has to enable compilation out of OCERA full source tree
+  (we would lost many users of particular components in other case)
+ - compile should be able to do all above work without need to install
+   any files before successful finish of build.
+ - because we use some libraries for RT-Linux build and userspace
+   build, we need to solve how to compile from same sources to both targets.
+ - the build system should allow to call make for particular source
+   subdirectory. Time of recursive make through all subdirectories is
+   unacceptable.
+ - make system should enable to build out of sources tree
+  (else clean or working with CVS sandbox gets fussy and simultaneous
+   multiple targets gets problematic)
+ - it would be good, if there would be possibility to make from read-only
+   media sources
+ - make system should store results of build in some separate directory
+   structure to simple install and testing
+ - Makefiles in sources directories should be simple
+
+There is probably only one alternative fully supporting above requirements
+and it is GNU Autoheader...Automake...Autoconf... system.
+But it is complicated and requires big amount of support files.
+It would be acceptable if it could be easily used for OCERA framework.
+But there are important show stopper for that system:
+ - it would require deep revision of all OCERA CVS contents and agreement
+   on this would be problematic
+ - this system is not well prepared for dual compilation for Linux
+   and RT-Linux sub-targets. It would mean many changes in default
+   autoconf setup to support this. Probably simplest way would be
+   to rebuild GCC tool chain for something like i586-elf-rtlinux.
+   This would require even more space for OCERA development.
+
+The problem calls for same solution, which would have minimal impact
+on other components and would be elegant and would be maintainable
+and small, because our main goal is components development and not
+make systems development.
+
+There is result of our trial. It is OMK make system.
+The Makefile and Makefile.omk files should be in all source
+directories. Common Makefile.rules file is required in the toplevel
+sources directory. Alternatively this file could be moved
+to link tree pointing into readonly media or can be anywhere
+else if MAKERULES_DIR and SOURCES_DIR are specified.
+
+Syntax of Makefile.omk files is for usual cases compatible
+to Automake's Makefile.am descriptions. There are specific targets
+for RT-Linux and Linux kernel related stuff
+
+Makefile.omk user defined variables
+# SUBDIRS          .. list of subdirectories intended for make from actual directory
+# lib_LIBRARIES    .. list of the user-space libraries
+# shared_LIBRARIES .. list of the user-space shared libraries
+# kernel_LIBRARIES .. list of the kernel-space libraries
+# rtlinux_LIBRARIES.. list of the RT-Linux kernel-space libraries
+# include_HEADERS  .. list of the user-space header files
+# nobase_include_HEADERS .. headers copied even with directory part
+# kernel_HEADERS   .. list of the kernel-space  header files
+# rtlinux_HEADERS  .. list of the RT-Linux kernel-space  header files
+# bin_PROGRAMS     .. list of the require binary programs
+# utils_PROGRAMS   .. list of the development utility programs
+# kernel_MODULES   .. list of the kernel side modules/applications
+# rtlinux_MODULES  .. list of RT-Linux the kernel side modules/applications
+# xxx_SOURCES      .. list of specific target sources
+# INCLUDES         .. additional include directories and defines for user-space
+# kernel_INCLUDES  .. additional include directories and defines for kernel-space
+# rtlinux_INCLUDES .. additional include directories and defines for RT-Linux
+# default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
+
+The Makefile is same for all sources directories and is only 14 lines long.
+It is there only for convenience reasons to enable call "make" from
+local directory. It contains code which locates Makefile.rules in actual
+or any parent directory. With standard BASH environment it works such way,
+that if you get into sources directory over symbolic links, it is able to
+unwind yours steps back => you can make links to readonly media component
+directories, copy Makefile.rules, Makefile and toplevel Makefile.omk,
+adjust Makefile.omk to contain only required components and then call
+make in top or even directories after crossing from your tree
+to readonly media.
+
+The system compiles all files out of source directories.
+The actual version of system is adapted even for OCERA tree mode
+if OCERA_DIR variable is defined in Makefile.rules
+
+There are next predefined directory name components,
+which can be adapted if required
+
+BUILD_DIR_NAME = _build
+       prefix of directory, where temporary build files are stored
+COMPILED_DIR_NAME = _compiled
+       prefix of directory, where final compilation results are stored
+GROUP_DIR_NAME = yyy
+       this is used for separation of build sub-trees in OCERA environment
+       where more Makefile.rules is spread in the tree
+
+Next directories are used:
+
+KERN_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/kern
+        directory to store intermediate files for kernel-space targets
+USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
+        directory to store intermediate files for user-space targets
+
+USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
+        directory to store exported include files which should be installed later
+        on user-space include path
+USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
+        same for user-pace libraries
+USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
+        utilities for testing, which would not probably be installed
+USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
+        binaries, which should go into directory on standard system PATH
+        (/usr/local/bin, /usr/bin or $(prefix)/bin)
+
+KERN_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include-kern
+        directory to store exported include files which should be installed later
+        on kernel-space include path
+KERN_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib-kern
+        same for kernel-pace libraries
+KERN_MODULES_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/modules
+        builded modules for Linux kernel or RT-Linux system
+
+There is more recursive passes through directories to enable
+mutual dependant libraries and binaries to compile.
+Next passes are defined
+
+default-config .. generates config.omk-default or xxx-default configuration file
+check-dir      .. checks and creates required build directories
+include-pass   .. copyes header files to USER_INCLUDE_DIR and KERN_INCLUDE_DIR
+library-pass   .. builds objects in USER_BUILD_DIR/<relative path> and creates
+                  libraries in USER_LIB_DIR
+binary-pass and utils-pass .. links respective binaries
+                in USER_{BIN,UTILS}_DIR directory. If some object file is missing
+                it compiles it in  USER_BUILD_DIR/<relative path>
+kernel-lib-pass .. builds libraries for kernel space targets
+kernel-pass    .. builds kernel modules
+
+The amount of passes is relatively high and consumes some time.
+But only other way to support all required features is to assemble
+one big toplevel Makefile, which would contain all components
+and targets cross-dependencies.
+
+Drawbacks of designed make system
+ - the system is not as fast as we would like
+ - it lacks Autoconf and configure extensive support for many systems
+   from UNIX to DOS and WINDOWS
+ - it does not contain support for checking existence of target libraries
+   and functionalities as GNU Autoconf
+ - it is heavily dependant on GNU MAKE program. But it would not be big
+   problem, because even many commercial applications distribute GNU
+   MAKE with them to be able to work in non-friendly systems
+ - the key drawback is dependence on recent MAKE version 3.80 and better
+   and even version 3.80 of MAKE has important bug, which has been
+   corrected in newer sources
+
+The last point is critical. I have not noticed it first, because
+I use Slackware-9.2 and it contains latest released version 
+of MAKE (version 3.80).
+The problem appears when I have tried to build bigger libraries.
+There is bug in version 3.80, which results in misleading
+error "Virtual memory exhausted". It is known bug with ID 1517
+
+    * long prerequisite inside eval(call()) => vm exhausted, Paul D. Smith
+
+I have optimized some rules to not push memory to the edge,
+but there could be still issues with 3.80 version.
+
+I have downloaded latest MAKE CVS sources. The compilation required
+separate lookup and download for .po files and full Autoheader... cycle.
+I have put together package similar to release. Only ./configure --prefix=...
+and make is required. CVS sources contains version 3.81beta1.
+You can download prepared sources archive from
+
+  http://cmp.felk.cvut.cz/~pisa/can/make-3.81beta1.tar.gz
+
+The archive contains even "make" binary build by me, which should work
+on other Linux distributions as well. 
+Older version of MAKE (3.79.x released about year 2000) found
+on Mandrake and RedHat are not sufficient and do not support eval feature.
+I do not expect, that Debian would be more up-to-date or contain fixes
+to MAKE vm exhausted bug.
+
+The local CTU archive with our CAN components prepared for inclusion
+into OCERA SF CVS could be found in my "can" directory
+
+  http://cmp.felk.cvut.cz/~pisa/can/ocera-can-031212.tar.gz
+
+The code should build for user-space with new make on most of Linux distros
+when make is updated.
+
+If you want to test compile for RT-Linux targets, line
+
+#RTL_DIR := /home/cvs/ocera/ocera-build/kernel/rtlinux
+
+in "Makefile.rules" has to be activated and updated
+to point RT-Linux directory containing "rtl.mk".
+There is only one library ("ulutrtl") and test utility compiled for RT-Linux
+("can/utils/ulut/ul_rtlchk.c").
+
+The next line ,if enabled, controls compilation in OCERA project tree
+
+#OCERA_DIR := $(shell ( cd -L $(MAKERULES_DIR)/../../.. ; pwd -L ) )
+
+The LinCAN driver has been updated to compile out of source directories.
+
+Please, check, if you could compile CAN package and help us with integration
+into OCERA SF CVS. Send your comments and objections. 
+
+The OMK system has been adapted to support actual OCERA configuration process.
+I am not happy with ocera.mk mix of defines and poor two or three rules,
+but OMK is able to overcome that.
+
+The OMK system has integrated rules (default-config) to build default configuration
+file. The file is named "config.omk-default" for the stand-alone compilation.
+The name corresponds to OCERA config + "-default" if OCERA_DIR is defined.
+This file contains statements from all default_CONFIG lines in all Makefile.omk.
+The file should be used for building of own "config.omk" file, or as list
+for all options if Kconfig is used.
+
diff --git a/ulan/host/apps/.cvsignore b/ulan/host/apps/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/apps/CVS/Entries b/ulan/host/apps/CVS/Entries
new file mode 100644 (file)
index 0000000..0f57f24
--- /dev/null
@@ -0,0 +1,5 @@
+/.cvsignore/1.1/Wed Sep 22 22:13:09 2004//
+/Makefile.omk/1.2/Sun Nov 11 18:35:39 2007//
+D/ul_asd////
+D/ul_ethd////
+D/uloi_browser////
diff --git a/ulan/host/apps/CVS/Repository b/ulan/host/apps/CVS/Repository
new file mode 100644 (file)
index 0000000..9cb775c
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/apps
diff --git a/ulan/host/apps/CVS/Root b/ulan/host/apps/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/apps/Makefile.omk b/ulan/host/apps/Makefile.omk
new file mode 100644 (file)
index 0000000..499ac0c
--- /dev/null
@@ -0,0 +1,10 @@
+SUBDIRS = ul_asd ul_ethd
+
+#lib_LIBRARIES =
+#shared_LIBRARIES =
+#include_HEADERS  = 
+#xxx_SOURCES =
+#lib_LOADLIBES =
+#bin_PROGRAMS = 
+#utils_PROGRAMS = 
+
diff --git a/ulan/host/apps/ul_asd/.cvsignore b/ulan/host/apps/ul_asd/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/apps/ul_asd/CVS/Entries b/ulan/host/apps/ul_asd/CVS/Entries
new file mode 100644 (file)
index 0000000..65a9588
--- /dev/null
@@ -0,0 +1,14 @@
+/.cvsignore/1.1/Wed Jan 12 14:08:34 2005//
+/Makefile.omk/1.9/Sun Nov 25 09:13:09 2007//
+/ul_asc.c/1.2/Wed Oct  5 20:43:32 2005//
+/ul_asd.c/1.7/Wed Oct  5 20:43:32 2005//
+/ul_asd.h/1.4/Wed Oct  5 20:43:32 2005//
+/ul_asd.xml/1.2/Wed Oct  5 20:43:32 2005//
+/ul_asd_conf.c/1.2/Wed Oct  5 20:43:32 2005//
+/ul_asd_net.c/1.5/Wed Oct  5 20:43:32 2005//
+/ul_asd_server.c/1.4/Wed Oct  5 20:43:32 2005//
+/ul_corba_toolkit.c/1.1/Tue Oct  4 18:45:22 2005//
+/ul_corba_toolkit.h/1.1/Tue Oct  4 18:45:22 2005//
+/ulci_as-skelimpl.c/1.2/Wed Oct  5 20:43:32 2005//
+/ulci_as.idl/1.2/Wed Oct  5 20:43:32 2005//
+D
diff --git a/ulan/host/apps/ul_asd/CVS/Repository b/ulan/host/apps/ul_asd/CVS/Repository
new file mode 100644 (file)
index 0000000..a8a570d
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/apps/ul_asd
diff --git a/ulan/host/apps/ul_asd/CVS/Root b/ulan/host/apps/ul_asd/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/apps/ul_asd/Makefile.omk b/ulan/host/apps/ul_asd/Makefile.omk
new file mode 100644 (file)
index 0000000..2597c2b
--- /dev/null
@@ -0,0 +1,38 @@
+default_CONFIG = CONFIG_OC_UL_ASD=n
+
+ifeq ($(CONFIG_OC_UL_ASD),y)
+
+#CFLAGS+=-DORBIT2=1 -pthread -I/usr/include/orbit-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
+#LDFLAGS+=-Wl,--export-dynamic -pthread -lORBitCosNaming-2 -lORBit-2 -lm -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0
+
+IDL_CFLAGS   := $(shell pkg-config --cflags ORBit-2.0)
+IDL_LDFLAGS  := $(shell pkg-config --libs ORBit-2.0)
+IDL_COMPILER := $(shell pkg-config --variable=orbit_idl ORBit-2.0)
+
+CFLAGS += $(IDL_CFLAGS) 
+LDFLAGS += $(IDL_LDFLAGS) -lxml2
+
+INCLUDES += -I .
+
+#LOCAL_CONFIG_H = test_local_config.h
+
+lib_LOADLIBES = ulcintf ulan ulut ORBitCosNaming-2
+
+bin_PROGRAMS = ul_asd ul_asc
+
+ul_asd_SOURCES = ul_asd.c ul_asd_server.c ul_asd_net.c ul_asd_conf.c ul_corba_toolkit.c 
+ul_asd_SERVER_IDL = ulci_as.idl
+
+ul_asc_SOURCES = ul_asc.c ul_corba_toolkit.c 
+ul_asc_CLIENT_IDL = ulci_as.idl
+
+#lib_LIBRARIES =
+#shared_LIBRARIES =
+#include_HEADERS  = 
+#include_nobase_HEADERS  = 
+#utils_PROGRAMS =
+
+skelimpl: $(ul_asd_SERVER_IDL)
+       orbit-idl-2 --skeleton-impl --nostubs --noskels --nocommon --noheaders --noidata $^
+
+endif #CONFIG_OC_UL_ASD
diff --git a/ulan/host/apps/ul_asd/ul_asc.c b/ulan/host/apps/ul_asd/ul_asc.c
new file mode 100644 (file)
index 0000000..4798b05
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * account-server program. Hacked from Frank Rehberger
+ * <F.Rehberger@xtradyne.de>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <signal.h>
+#include <getopt.h>
+#include <orbit/orbit.h>
+#include "ul_corba_toolkit.h"
+#include <ul_netbase.h>
+#include "ul_asd.h"
+
+#include "ulci_as.h"
+
+CORBA_Environment ev[1];
+CORBA_ORB orb = CORBA_OBJECT_NIL;
+CosNaming_NamingContext ns = CORBA_OBJECT_NIL;
+ulci_statistics serv_stat = CORBA_OBJECT_NIL;
+ulci_settings serv_set = CORBA_OBJECT_NIL;
+char *orbit_ns_addr=ORBIT_NS_ADDR_DEFAULT;
+
+int statistics_flg=0;
+int settings_flg=0;
+int units_flg=0;
+int add_flg=0;
+int del_flg=0;
+int save_flg=0;
+int status_period_flg=0;
+int cycle_start_flg=0;
+int first_dy_adr_flg=0;
+
+int module=0;
+unsigned long sn_add=0;
+unsigned long sn_remove=0;
+int status_period=0;
+int cycle_start=0;
+int first_dy_adr=0;
+
+int
+corba_client_init()
+{
+  gchar *id_stat[] = {"ulci", "statistics", NULL};
+  gchar *id_set[] = {"ulci", "settings", NULL};
+  char *argv[3];
+  int argc=2;
+
+  argv[0] = "dummy";
+  argv[1] = orbit_ns_addr;
+  argv[2] = NULL;
+
+  CORBA_exception_init(ev);
+  orb=CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);
+  etk_abort_if_exception(ev, "init failed");
+
+  ns=etk_get_name_service (orb, ev);
+  etk_abort_if_exception(ev,"failed resolving name-service");
+
+  serv_stat=(ulci_statistics) 
+       etk_name_service_resolve (ns, id_stat, ev);
+  etk_abort_if_exception(ev,"failed resolving service at name-service");
+
+  serv_set=(ulci_settings) 
+       etk_name_service_resolve (ns, id_set, ev);
+  etk_abort_if_exception(ev,"failed resolving service at name-service");
+
+  return 0;
+}
+
+int
+corba_client_cleanup()
+{
+  /* releasing managed object */
+  CORBA_Object_release(serv_stat, ev);
+  if (etk_raised_exception(ev)) return -1;
+  CORBA_Object_release(serv_set, ev);
+  if (etk_raised_exception(ev)) return -1;
+  /* tear down the ORB */
+  if (orb != CORBA_OBJECT_NIL) {
+    /* going to destroy orb.. */
+    CORBA_ORB_destroy(orb, ev);
+    if (etk_raised_exception(ev)) return -1;
+  }
+  return 0;
+}
+               
+void
+print_statistics()
+{
+  CORBA_long         i;
+  CORBA_string       s;
+
+  g_print ("statistics:\n");
+
+  if (etk_raised_exception (ev)) return;
+  s =  ulci_statistics__get_start_time (serv_stat, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  start_time     : %s\n", s);
+  CORBA_free (s);         
+  
+  i =  ulci_statistics__get_dy_adr_asg_cnt (serv_stat, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  dy_adr_asg_cnt : %d\n", i);
+  
+  s =  ulci_statistics__get_dy_adr_asg_last (serv_stat, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  dy_adr_asg_last: %s\n", s);
+  CORBA_free (s);         
+
+  i =  ulci_statistics__get_st_adr_req_cnt (serv_stat, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  st_adr_req_cnt : %d\n", i);
+
+  s =  ulci_statistics__get_st_adr_reg_last (serv_stat, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  st_adr_reg_last: %s\n", s);
+  CORBA_free (s);         
+}
+
+void
+print_settings()
+{
+  CORBA_long         i;
+
+  g_print ("settings:\n");
+  
+  i=ulci_settings__get_status_period (serv_set, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  status_period: %d\n", i);
+
+  i=ulci_settings__get_cycle_start (serv_set, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  cycle_start  : %d\n", i);
+
+  i=ulci_settings__get_first_dy_adr (serv_set, ev);
+  if (etk_raised_exception (ev)) return;
+  g_print ("  first_dy_adr : %d\n", i);
+}
+
+void
+print_units()
+{
+  ulci_units_t    *units;
+  ulci_unit_t     *unit;
+  CORBA_long         i;
+               
+  g_print ("units:\n");
+
+  units=ulci_settings_get_units(serv_set,ev);
+  if (etk_raised_exception(ev)) return;
+
+  g_print ("  unit(s) for static address assigment:\n");
+  for (i = 0; i < units->_length; ++i) {
+    unit=&ORBit_sequence_index (units, i);
+    if (unit->flags&ULMI_STATIC) 
+      printf("    adr:%2d, sn:0x%08x\n",unit->adr,unit->sn);
+    }
+  
+  g_print ("  active unit(s):\n");
+  for (i = 0; i < units->_length; ++i) {
+    unit=&ORBit_sequence_index (units, i);
+    if (unit->flags&ULMI_PRESENT)          
+      printf("    adr:%2d, sn:0x%08x, des:%s\n",unit->adr,unit->sn,unit->des);
+//      CORBA_free (unit->des);         
+    }
+    
+  CORBA_free (units);         
+}
+
+static void
+usage()
+{
+  printf("usage: ul_asc <parameters>\n");
+  printf("  -n, --ns  <name>       addr of name server\n");
+  printf("      [%s]\n", orbit_ns_addr);
+  printf("  -t, --stat             print statistics of ul_asd\n");
+  printf("  -e, --set              print settings of ul_asd\n");
+  printf("  -p, --print            print units\n");
+  printf("  -m, --module           module\n");
+  printf("  -a, --add <sn>         add static module spec. by -m and sn\n");
+  printf("  -d, --del <sn>         remove static module\n");
+  printf("  -P, --period <value>   status period in seconds\n");
+  printf("  -c, --cycle <value>    cycle_start\n");
+  printf("  -f, --first <value>    first dynamic address\n");
+  printf("  -S, --save                    save settings in ul_asd\n");
+  printf("  -V, --version          show version\n");
+  printf("  -h, --help             this usage screen\n");
+}
+
+int 
+main(int argc, char *argv[])
+{
+  static struct option long_opts[] = {
+    { "ns", 1, 0, 'n' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { 0, 0, 0, 0}
+  };
+  int  opt;
+
+ #ifndef HAS_GETOPT_LONG
+    while ((opt = getopt(argc, argv, "n:m:P:c:f:a:d:tepdSVh")) != EOF)
+ #else
+    while ((opt = getopt_long(argc, argv, "n:m:P:c:f:a:d:tepSVh",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'n':
+      orbit_ns_addr=optarg;
+      break;
+    case 't':
+      statistics_flg=1;
+      break;
+    case 'e':
+      settings_flg=1;
+      break;
+    case 'P':
+      status_period=strtol(optarg,NULL,0);;
+      status_period_flg=1;
+      break;
+    case 'c':
+      cycle_start=strtol(optarg,NULL,0);;
+      cycle_start_flg=1;
+      break;
+    case 'f':
+      first_dy_adr=strtol(optarg,NULL,0);;
+      first_dy_adr_flg=1;
+      break;
+    case 'p':
+      units_flg=1;
+      break;
+    case 'm':
+      module=strtol(optarg,NULL,0);
+      break;
+    case 'a':
+      sn_add=strtol(optarg,NULL,0);
+      add_flg=1;
+      break;
+    case 'd':
+      sn_remove=strtol(optarg,NULL,0);
+      del_flg=1;
+      break;
+    case 'S':
+      save_flg=1;
+      break;
+    case 'V':
+      printf("uLan address server, client - version 0.1\n");
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+  }
+  
+  printf("Binding to NS: %s\n",orbit_ns_addr);
+  corba_client_init();
+  printf("Binded\n");
+
+  if (add_flg) 
+    ulci_settings_add_static_unit(serv_set,module,sn_add,ev);
+
+  if (del_flg)
+    ulci_settings_remove_static_unit(serv_set,sn_remove,ev);
+
+  if (first_dy_adr_flg)
+    ulci_settings__set_first_dy_adr(serv_set,first_dy_adr,ev);
+
+  if (cycle_start_flg)
+    ulci_settings__set_cycle_start(serv_set,cycle_start,ev);
+
+  if (status_period_flg)
+    ulci_settings__set_status_period(serv_set,status_period,ev);
+
+  if (statistics_flg)
+    print_statistics();
+    
+  if (settings_flg)
+    print_settings();
+    
+  if (units_flg)
+    print_units();
+
+  if (save_flg)
+    ulci_settings_save(serv_set,ev);
+    
+  corba_client_cleanup();
+
+  return 0;
+}
diff --git a/ulan/host/apps/ul_asd/ul_asd.c b/ulan/host/apps/ul_asd/ul_asd.c
new file mode 100644 (file)
index 0000000..254c6cd
--- /dev/null
@@ -0,0 +1,215 @@
+/*******************************************************************
+  uLan Communication - addresss server 
+
+  ul_asd.c     - 
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <ul_netbase.h>
+#include <orbit/orbit.h>
+#include "ul_asd.h"
+#include <signal.h>
+
+#define GSA_OFFSET(_type,_member) \
+               ((int)&(((_type*)0)->_member))
+
+int daemon_flg=0;
+int short_flg  = 0;
+int log_all_flg = 0;
+int terminate_flg = 0;
+
+ul_asd_context_t ul_cont[1];
+
+void sig_usr(int signo) {
+  if ((signo==SIGTERM) || (signo==SIGINT)) {
+    terminate_flg=1;
+  }
+}
+
+static int daemon_init(void) {
+#ifndef _WIN32
+  pid_t pid;
+
+  if ((pid = fork()) < 0) {
+    return -1;
+  } else
+    if (pid != 0) {
+      exit(0); /* parent vanishes */
+    }
+  /* child process */
+  setsid();
+  umask(0);
+  close(0);
+  close(1);
+  close(2);
+#endif
+  return 0;
+}
+
+
+static void
+usage()
+{
+  printf("usage: ul_asd <parameters>\n");
+  printf("  -d, --uldev  <name>    name of uLan device [%s]\n", ul_cont->ul_dev_name);
+  printf("  -n, --ns  <name>       addr of name server\n");
+  printf("        [%s]\n", ul_cont->orbit_ns_addr);
+  printf("  -i, --ip  <name>       IP address for communication with client(s)\n");
+  printf("        [%s]\n", ul_cont->orbit_orb_iiop_ipname);
+  printf("  -c, --conf  <name>     name of configuration file [%s]\n", ul_cont->conf_filename);
+#ifndef _WIN32
+  printf("  -D, --daemon           starting like deamon\n");
+#endif  /* _WIN32 */
+  printf("  -V, --version          show version\n");
+  printf("  -h, --help             this usage screen\n");
+}
+
+static void
+main_options()
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "conf", 1, 0, 'c' },
+    { "ns", 1, 0, 'n' },
+    { "ip", 1, 0, 'i' },
+#ifndef _WIN32
+    { "daemon",  0, 0, 'D' },
+#endif /* _WIN32 */
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { 0, 0, 0, 0}
+  };
+  int  opt;
+
+ #ifndef HAS_GETOPT_LONG
+    while ((opt = getopt(ul_cont->argc, ul_cont->argv, "d:c:n:i:DVh")) != EOF)
+ #else
+    while ((opt = getopt_long(ul_cont->argc, ul_cont->argv, "d:c:n:i:DVh",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_cont->ul_dev_name=optarg;
+      break;
+    case 'c':
+      strcpy(ul_cont->conf_filename,optarg);
+      break;
+    case 'n':
+      ul_cont->orbit_ns_addr=optarg;
+      break;
+    case 'i':
+      ul_cont->orbit_orb_iiop_ipname=optarg;
+      break;
+    #ifndef _WIN32
+    case 'D':
+      daemon_flg=1;
+      break;  
+    #endif  /* _WIN32 */
+    case 'V':
+      printf("uLan address server - version 0.1\n");
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+  }
+}
+
+int main(int argc, char *argv[])
+{
+  GError  *err    = NULL;
+  char basename[128];
+  char *filename="ul_asd.xml";
+
+  /**********************************************************/
+  /* Initizalization */
+  ul_cont->argc = argc;
+  ul_cont->argv = argv;
+  ul_cont->ul_dev_name=UL_DEV_NAME;
+  ul_cont->orbit_ns_addr=ORBIT_NS_ADDR_DEFAULT;
+  ul_cont->orbit_orb_iiop_ipname=ORBIT_ORBIIOPIPName_DEFAULT;
+
+#ifdef _WIN32
+  GetWindowsDirectory(basename,sizeof(basename));
+#else
+  strcpy(basename,"/etc/ulan/");
+#endif
+  sprintf(ul_cont->conf_filename,"%s%s",basename,filename);
+
+  main_options();
+
+  //daemonize
+  if (daemon_flg) 
+    daemon_init();
+
+  if (ul_asd_server_init(ul_cont)<0) 
+    exit(1);
+
+  if (ul_asd_net_init(ul_cont)<0) 
+    exit(1);
+//  g_thread_init (NULL);
+  ul_cont->mutex = g_mutex_new (); 
+
+  ul_asd_conf_load(NULL,ul_cont); 
+
+  /**********************************************************/
+  /* Starting */
+  ul_cont->ul_server_thread = g_thread_create ((GThreadFunc) ul_asd_server_run, 
+                            ul_cont, 
+                            TRUE,   //joinable 
+                            &err);
+  ul_cont->ul_net_thread =   g_thread_create ((GThreadFunc) ul_asd_net_run, 
+                            ul_cont, 
+                            TRUE,   //joinable 
+                            &err);
+
+  /**********************************************************/
+  /* init signal handling */
+  signal(SIGINT,  sig_usr);
+  signal(SIGHUP,  sig_usr);
+
+  while(!terminate_flg) {
+    usleep(100*1000);
+  }
+  
+  //stop & cleanup server thread
+  ul_asd_server_stop(ul_cont);
+  g_thread_join (ul_cont->ul_server_thread);
+  ul_asd_server_cleanup(ul_cont);
+  
+  //stop & cleanup net thread
+  ul_asd_net_stop(ul_cont);
+  g_thread_join (ul_cont->ul_net_thread);
+  ul_asd_net_cleanup(ul_cont);
+
+  g_mutex_free (ul_cont->mutex);
+
+  return 0;
+}
diff --git a/ulan/host/apps/ul_asd/ul_asd.h b/ulan/host/apps/ul_asd/ul_asd.h
new file mode 100644 (file)
index 0000000..79ef3bf
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef _UL_ASD_MAIN_H
+#define _UL_ASD_MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <orbit/orbit.h>
+#include <ORBitservices/CosNaming.h>
+#include <ul_netbase.h>
+
+
+#define ORBIT_NS_ADDR_DEFAULT "-ORBNamingIOR=corbaloc:iiop:1.2@localhost:4444/NameService"
+#define ORBIT_ORBIIOPIPName_DEFAULT "-ORBIIOPIPName=localhost"
+/* 
+ * background task 
+ */
+typedef struct {
+  int argc;
+  char **argv;
+  GMutex *mutex;
+  char *orbit_ns_addr;
+  char *orbit_orb_iiop_ipname;
+  char conf_filename[128];
+
+  //uLan thread
+  char *ul_dev_name;
+  ul_net_info_t *ul_net;
+  GThread *ul_net_thread;
+  int ul_net_terminate;
+       
+  //CORBA server thread
+  CORBA_Environment ev[1];
+  CORBA_ORB orb;
+  PortableServer_POA root_poa; 
+  CosNaming_NamingContext ns;
+  CORBA_Object serv_set;
+  CORBA_Object serv_stat;
+  GThread *ul_server_thread;
+} ul_asd_context_t;
+
+int ul_asd_conf_load(const char *filename,ul_asd_context_t *ctx); 
+int ul_asd_conf_save(const char *filename,ul_asd_context_t *ctx); 
+
+int ul_asd_net_init(ul_asd_context_t *ctx);
+void ul_asd_net_run(ul_asd_context_t *ctx);
+int ul_asd_net_stop(ul_asd_context_t *ctx);
+int ul_asd_net_cleanup(ul_asd_context_t *ctx);
+
+int ul_asd_server_init(ul_asd_context_t *ctx);
+void ul_asd_server_run(ul_asd_context_t *ctx);
+int ul_asd_server_stop(ul_asd_context_t *ctx);
+int ul_asd_server_cleanup(ul_asd_context_t *ctx);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_ASD_MAIN_H */
diff --git a/ulan/host/apps/ul_asd/ul_asd.xml b/ulan/host/apps/ul_asd/ul_asd.xml
new file mode 100644 (file)
index 0000000..44f0ffe
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<xml>
+  <body>
+    <configuration>
+      <status_period value="3000"/>
+      <first_dynamic_address value="20"/>
+      <cycle_start value="0"/>
+    </configuration>
+    <static_addresses>
+      <module address="1" sn="0x12345678"/>
+      <module address="2" sn="0x12343408"/>
+      <module address="3" sn="0x12312678"/>
+      <module address="4" sn="0x67452301"/>
+      <module address="10" sn="0x1234"/>
+    </static_addresses>
+  </body>
+</xml>
diff --git a/ulan/host/apps/ul_asd/ul_asd_conf.c b/ulan/host/apps/ul_asd/ul_asd_conf.c
new file mode 100644 (file)
index 0000000..6481115
--- /dev/null
@@ -0,0 +1,133 @@
+#include <string.h>
+#include <stdlib.h>
+#include <libxml/parser.h>
+#include <ul_netbase.h>
+#include "ul_asd.h"
+
+
+/*******************************************************************/
+int 
+ul_asd_conf_load(const char *filename, ul_asd_context_t *ul_cont) 
+{
+    xmlDocPtr doc;
+    xmlNodePtr cur,cur1;
+
+    if (!filename) 
+      filename=ul_cont->conf_filename;
+    
+    xmlKeepBlanksDefault(1);
+    doc = xmlParseFile(filename);
+    if (doc == NULL) return(-1);
+    cur = xmlDocGetRootElement(doc);
+    if (cur == NULL) {
+        fprintf(stderr,"empty document\n");
+       xmlFreeDoc(doc);
+       return(-1);
+    }
+    cur = cur->children;
+    while(cur){
+      if (!xmlStrcmp(cur->name, (const xmlChar *)"body")) break;
+      cur = cur->next;
+    }
+    if (!cur) {
+        fprintf(stderr,"no body section!\n");
+       xmlFreeDoc(doc);
+       return(-1);
+    }
+    cur = cur->children;
+    while (cur) {
+      //configuration section
+      if (!xmlStrcmp(cur->name,(const xmlChar *)"configuration")) {
+        cur1 = cur->children;
+       while(cur1) {
+         xmlChar *value = xmlGetProp(cur1, (const xmlChar *)"value");
+          if (!xmlStrcmp(cur1->name,(const xmlChar *)"status_period")) {
+           ul_cont->ul_net->dy_state->period=strtol((char*)value,NULL,0);
+         } else if (!xmlStrcmp(cur1->name,(const xmlChar *)"first_dynamic_address")) {
+            ul_cont->ul_net->dy_state->first_dy_adr=strtol((char*)value,NULL,0);
+         } else if (!xmlStrcmp(cur1->name,(const xmlChar *)"cycle_start")) {
+           ul_dy_cycle_subfn=strtol((char*)value,NULL,0);
+         }
+         xmlFree(value);
+          cur1 = cur1->next;
+       }
+      }
+      //static_addresses section
+      if (!xmlStrcmp(cur->name,(const xmlChar *)"static_addresses")) {
+        cur1 = cur->children;
+       while(cur1) {
+          if (!xmlStrcmp(cur1->name,(const xmlChar *)"module")) {
+           xmlChar *adr,*sn;
+           adr= xmlGetProp(cur1, (const xmlChar *)"address");
+           sn= xmlGetProp(cur1, (const xmlChar *)"sn");
+           if (ul_mod_static_add(ul_cont->ul_net,
+               strtol((char*)adr,NULL,0),
+               strtol((char*)sn,NULL,0))<0) {
+             printf("fail adding static module:%s,%s\n",adr,sn);
+           }       
+           xmlFree(adr);
+           xmlFree(sn);
+         }
+          cur1 = cur1->next;
+       }
+        
+      }
+      cur = cur->next;
+    }
+    xmlFreeDoc(doc);
+    return 0;
+}
+
+/*******************************************************************/
+int 
+ul_asd_conf_save(const char *filename, ul_asd_context_t *ul_cont) 
+{
+  xmlNodePtr root, node_body, node_conf, node_statica, node;
+  xmlDocPtr doc;
+  ul_mod_info_t *mod;
+  xmlChar value[20];
+  int mindx;
+  
+
+  if (!filename) 
+    filename=ul_cont->conf_filename;
+    
+  doc = xmlNewDoc ((const xmlChar *)"1.0");
+  root = xmlNewDocNode (doc, NULL, (const xmlChar *)"xml", NULL);
+  xmlDocSetRootElement (doc, root);
+                       
+  node_body = xmlNewChild (root, NULL, (const xmlChar *)"body", NULL);
+  node_conf = xmlNewChild (node_body, NULL, (const xmlChar *)"configuration", NULL);
+  node_statica = xmlNewChild (node_body, NULL, (const xmlChar *)"static_addresses", NULL);
+  
+  //configuration
+  node = xmlNewChild (node_conf, NULL, (const xmlChar *)"status_period", NULL);
+  xmlStrPrintf(value,sizeof(value),(const xmlChar *)"%d",ul_cont->ul_net->dy_state->period);
+  xmlSetProp (node, (const xmlChar *)"value", value);
+
+  node = xmlNewChild (node_conf, NULL, (const xmlChar *)"first_dynamic_address", NULL);
+  xmlStrPrintf(value,sizeof(value),(const xmlChar *)"%d",ul_cont->ul_net->dy_state->first_dy_adr);
+  xmlSetProp (node, (const xmlChar *)"value", value);
+
+  node = xmlNewChild (node_conf, NULL, (const xmlChar *)"cycle_start", NULL);
+  xmlStrPrintf(value,sizeof(value),(const xmlChar *)"%d",ul_dy_cycle_subfn);
+  xmlSetProp (node, (const xmlChar *)"value", value);
+
+  //static addresses
+  for(mindx=0;mindx<ul_cont->ul_net->modules.count;mindx++){
+    mod=ul_cont->ul_net->modules.items[mindx];
+    if (mod->flg&ULMI_STATIC) {
+      node = xmlNewChild (node_statica, NULL, (const xmlChar *)"module", NULL);
+      xmlStrPrintf(value,sizeof(value),(const xmlChar *)"%d",mod->mod_adr);
+      xmlSetProp (node, (const xmlChar *)"address", value);
+      xmlStrPrintf(value,sizeof(value),(const xmlChar *)"0x%lx",mod->mod_sn);
+      xmlSetProp (node, (const xmlChar *)"sn", value);
+    }
+  }
+  
+  xmlKeepBlanksDefault(0);
+  xmlSaveFormatFile (filename, doc, 1);
+  xmlFreeDoc (doc);
+  return 0;
+}
+
diff --git a/ulan/host/apps/ul_asd/ul_asd_net.c b/ulan/host/apps/ul_asd/ul_asd_net.c
new file mode 100644 (file)
index 0000000..7154686
--- /dev/null
@@ -0,0 +1,140 @@
+/*******************************************************************
+  uLan Communication - addresss server 
+
+  ul_asd.c     - 
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include "ul_asd.h"
+
+#define GSA_OFFSET(_type,_member) \
+               ((int)&(((_type*)0)->_member))
+
+#define WITHOUT_SYS_SELECT
+#define UL_DRV_IN_LIB
+
+#ifndef WITHOUT_SYS_SELECT
+#include <errno.h>
+#endif /*WITHOUT_SYS_SELECT*/
+
+int
+ul_asd_net_init(ul_asd_context_t *ul_cont)
+{
+  ul_mstime_init();
+  ul_htimer_init_queue(&ul_root_htimer);
+  gsa_struct_init(ul_sn_array2gsa(),
+    GSA_OFFSET(ul_mod_info_t,mod_sn), gsa_cmp_ulong);
+  if(ul_net_new(&ul_cont->ul_net,ul_cont->ul_dev_name)<0) {
+    perror("ul_net_new failed");
+    return -1;  
+  }
+  if(ul_net_dy_init(ul_cont->ul_net)<0) {
+    perror("ul_net_dy_init failed");
+    return -1;  
+  }
+  ul_dy_cycle_subfn=0;
+  ul_cont->ul_net_terminate=0;
+  return 0;
+}
+
+
+void
+ul_asd_net_run(ul_asd_context_t *ul_cont)
+{
+  ul_msdiff_t ms_sleep;
+
+  while(!ul_cont->ul_net_terminate){
+    ul_mstime_update();
+    g_mutex_lock(ul_cont->mutex);
+    ul_htimer_run_expired(&ul_root_htimer,&ul_mstime_last);
+    g_mutex_unlock(ul_cont->mutex);
+    ul_mstime_update();
+    ul_compute_mstime_next();
+    ms_sleep=ul_mstime_next-ul_mstime_last;
+    if(ms_sleep<0) ms_sleep=0;
+    /* we do not want to overflow usec field of timeout.tv_usec */
+    if(ms_sleep>(~(ul_mstime_t)0/2001)) ms_sleep=~(ul_mstime_t)0/2001;
+
+    if(ul_inepoll(ul_cont->ul_net->ul_fd)>0){
+       int loopcnt=100;
+       do {
+          g_mutex_lock(ul_cont->mutex);
+          ul_net_do_rec_msg(ul_cont->ul_net);
+          g_mutex_unlock(ul_cont->mutex);
+       } while((ul_inepoll(ul_cont->ul_net->ul_fd)>0)&&loopcnt--);
+    }else {
+    #ifdef WITHOUT_SYS_SELECT
+     #ifdef _WIN32
+      if(ms_sleep>100) ms_sleep=100;
+      Sleep(ms_sleep);
+     #elif defined(UL_DRV_IN_LIB)
+      if(ms_sleep>100) ms_sleep=100;
+      usleep(ms_sleep*1000);
+     #endif /* UL_DRV_IN_LIB */
+    #else /* !WITHOUT_SYS_SELECT */
+      {
+       int ret;
+       struct timeval timeout;
+       fd_set set;
+
+       FD_ZERO (&set);
+       FD_SET (ul_fd2sys_fd(ul_cont->ul_net->ul_fd), &set);
+       FD_SET (0, &set);
+       timeout.tv_sec = 0;
+       timeout.tv_usec = ms_sleep*1000;
+       while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+               &&errno==-EINTR);
+       /* printf("select %d ",ret); */
+        if(FD_ISSET(0,&set))
+        { char ch;
+          read(0,&ch,1);
+          switch(ch) {
+            case 'q' : 
+              printf("\nUser requested quit\n");
+              return;
+          }
+        }
+      }
+    #endif /* !WITHOUT_SYS_SELECT */
+    }
+  }
+}
+
+int
+ul_asd_net_stop(ul_asd_context_t *ul_cont)
+{
+  ul_cont->ul_net_terminate=1;
+  return 0;
+}
+
+int
+ul_asd_net_cleanup(ul_asd_context_t *ul_cont)
+{
+  return 0;
+}
diff --git a/ulan/host/apps/ul_asd/ul_asd_server.c b/ulan/host/apps/ul_asd/ul_asd_server.c
new file mode 100644 (file)
index 0000000..8734c41
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * echo-server program. Hacked from Echo test suite by
+ * <birney@sanger.ac.uk>, ORBit2 udpate by Frank Rehberger
+ * <F.Rehberger@xtradyne.de>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <orbit/orbit.h>
+#include "ul_asd.h"
+
+#include "ulci_as-skelimpl.c"
+#include "ul_corba_toolkit.h" /* provides etk_abort_if_exception */ 
+
+       
+/* Inits ORB @orb using @argv arguments for configuration. For each
+ * ORBit options consumed from vector @argv the counter of @argc_ptr
+ * will be decremented. Signal handler is set to call
+ * echo_server_shutdown function in case of SIGINT and SIGTERM
+ * signals.  If error occures @ev points to exception object on
+ * return.
+ */static 
+void 
+server_init (int                 *argc_ptr, 
+            char                *argv[],
+            CORBA_ORB           *orb,
+            PortableServer_POA  *poa,
+            CORBA_Environment   *ev)
+{
+       PortableServer_POAManager  poa_manager = CORBA_OBJECT_NIL; 
+
+       CORBA_Environment  local_ev[1];
+       CORBA_exception_init(local_ev);
+       
+       /* create Object Request Broker (ORB) */
+       
+        (*orb) = CORBA_ORB_init(argc_ptr, argv, "orbit-local-mt-orb", ev);
+       if (etk_raised_exception(ev)) 
+               goto failed_orb;
+
+        (*poa) = (PortableServer_POA) 
+               CORBA_ORB_resolve_initial_references(*orb, "RootPOA", ev);
+       if (etk_raised_exception(ev)) 
+               goto failed_poa;
+
+        poa_manager = PortableServer_POA__get_the_POAManager(*poa, ev);
+       if (etk_raised_exception(ev)) 
+               goto failed_poamanager;
+
+       PortableServer_POAManager_activate(poa_manager, ev);
+       if (etk_raised_exception(ev)) 
+               goto failed_activation;
+
+        CORBA_Object_release ((CORBA_Object) poa_manager, ev);
+       return;
+
+ failed_activation:
+ failed_poamanager:
+        CORBA_Object_release ((CORBA_Object) poa_manager, local_ev);
+ failed_poa:
+       CORBA_ORB_destroy(*orb, local_ev);              
+ failed_orb:
+       return;
+}
+
+
+int 
+ul_asd_server_init(ul_asd_context_t *ctx)
+{
+        gchar *id_stat[] = {"ulci", "statistics", NULL};
+        gchar *id_set[] = {"ulci", "settings", NULL};
+        char *argv[7];
+        int argc=6;
+
+        //init corba services
+        ctx->orb=CORBA_OBJECT_NIL;
+        ctx->ns=CORBA_OBJECT_NIL;
+
+        argv[0] = "dummy";
+        argv[1] = ctx->orbit_ns_addr;
+        argv[2] = "-ORBIIOPIPv4=1";
+        argv[3] = "-ORBIIOPUNIX=0";
+        argv[4] = "-ORBCorbaloc=1";
+        argv[5] = ctx->orbit_orb_iiop_ipname;
+        argv[6] = NULL;
+
+       CORBA_exception_init(ctx->ev);
+       
+       server_init (&argc, argv, &ctx->orb, &ctx->root_poa, ctx->ev);
+       etk_abort_if_exception(ctx->ev, "failed ORB init");
+
+       g_print ("Binding to NS: %s\n",ctx->orbit_ns_addr);
+
+       ctx->ns = etk_get_name_service (ctx->orb, ctx->ev);
+       etk_abort_if_exception(ctx->ev, "failed resolving name-service");
+
+        ctx->serv_stat = impl_ulci_statistics__create(ctx->root_poa, ctx->ev, ctx);
+       etk_abort_if_exception(ctx->ev, "failed activating service");
+
+        ctx->serv_set = impl_ulci_settings__create(ctx->root_poa, ctx->ev, ctx);
+       etk_abort_if_exception(ctx->ev, "failed activating service");
+
+       g_print ("Binding service reference at name service against id: %s/%s\n", id_stat[0], id_stat[1]);
+       
+       etk_name_service_bind (ctx->ns, ctx->serv_stat, id_stat, ctx->ev);
+       etk_abort_if_exception(ctx->ev, "failed binding of service");
+
+       g_print ("Binding service reference at name service against id: %s/%s\n", id_set[0], id_set[1]);
+       
+       etk_name_service_bind (ctx->ns, ctx->serv_set, id_set, ctx->ev);
+       etk_abort_if_exception(ctx->ev, "failed binding of service");
+       
+       g_print ("Binded\n");
+       return 0;
+}
+       
+/* Entering main loop @orb handles incoming request and delegates to
+ * servants. If error occures @ev points to exception object on
+ * return.
+ */
+void 
+ul_asd_server_run(ul_asd_context_t *ctx) 
+{
+       
+        CORBA_ORB_run(ctx->orb, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return;
+}
+
+
+int 
+ul_asd_server_stop(ul_asd_context_t *ctx) 
+{
+       CORBA_Environment  local_ev[1];
+       CORBA_exception_init(local_ev);
+       
+        if (ctx->orb != CORBA_OBJECT_NIL)
+        {
+                CORBA_ORB_shutdown (ctx->orb, FALSE, local_ev);
+                etk_abort_if_exception (local_ev, "caught exception");
+        }
+       
+       return 0;
+}
+
+/* Releases @servant object and finally destroys @orb. If error
+ * occures @ev points to exception object on return.
+ */
+int 
+ul_asd_server_cleanup(ul_asd_context_t *ctx) 
+{
+       PortableServer_ObjectId   *objid       = NULL;
+
+       /* deaktive service statistics */
+       objid = PortableServer_POA_reference_to_id (ctx->root_poa, ctx->serv_stat, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+       /* Servant: deactivatoin - will invoke  __fini destructor */
+       PortableServer_POA_deactivate_object (ctx->root_poa, objid, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+
+       /* deaktive service settings */
+       objid = PortableServer_POA_reference_to_id (ctx->root_poa, ctx->serv_set, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+       /* Servant: deactivatoin - will invoke  __fini destructor */
+       PortableServer_POA_deactivate_object (ctx->root_poa, objid, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+
+       PortableServer_POA_destroy (ctx->root_poa, TRUE, FALSE, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+
+       CORBA_free (objid);
+
+        CORBA_Object_release ((CORBA_Object) ctx->root_poa, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+       
+        CORBA_Object_release (ctx->serv_stat, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+
+        CORBA_Object_release (ctx->serv_set, ctx->ev);
+       if (etk_raised_exception(ctx->ev)) return -1;
+
+        /* ORB: tear down the ORB */
+        if (ctx->orb != CORBA_OBJECT_NIL)
+        {
+                /* going to destroy orb.. */
+                CORBA_ORB_destroy(ctx->orb, ctx->ev);
+               if (etk_raised_exception(ctx->ev)) return -1;
+        }
+       
+       return 0;
+}
diff --git a/ulan/host/apps/ul_asd/ul_corba_toolkit.c b/ulan/host/apps/ul_asd/ul_corba_toolkit.c
new file mode 100644 (file)
index 0000000..9947d8c
--- /dev/null
@@ -0,0 +1,330 @@
+#include "ul_corba_toolkit.h"
+
+/** 
+ * test @ev for exception 
+ */
+gboolean 
+etk_raised_exception(CORBA_Environment *ev) 
+{
+       return ((ev)->_major != CORBA_NO_EXCEPTION);
+}
+
+/** 
+ * test @ev for exception 
+ */
+gboolean 
+etk_raised_exception_is_a (CORBA_Environment *ev, CORBA_char* id) 
+{
+       return ((ev)->_major != CORBA_NO_EXCEPTION)  &&                 
+               strcmp(id, CORBA_exception_id(ev)) == 0;
+}
+
+/**
+ *  
+ */
+void 
+etk_abort_if_exception (CORBA_Environment *ev, const char* mesg) 
+{
+       if (etk_raised_exception (ev)) {
+               g_error ("%s %s", mesg, CORBA_exception_id (ev));
+               CORBA_exception_free (ev); 
+               abort(); 
+       }
+}
+
+/**
+ *  
+ */
+void 
+etk_ignore_if_exception (CORBA_Environment *ev, const char* mesg) 
+{
+       if (etk_raised_exception (ev)) {
+               g_warning ("%s %s", mesg, CORBA_exception_id (ev));
+               CORBA_exception_free (ev); 
+       }
+}
+
+
+/**
+ *
+ */
+void
+etk_export_object_to_stream (CORBA_ORB          orb,
+                            CORBA_Object       servant,
+                            FILE              *stream,
+                            CORBA_Environment *ev)
+{
+        CORBA_char *objref = NULL;
+        /* write objref to file */
+         
+        objref = CORBA_ORB_object_to_string (orb, servant, ev);
+        if (etk_raised_exception(ev)) return;
+        /* print ior to terminal */
+        fprintf (stream, "%s\n", objref);
+        fflush (stream);
+        CORBA_free (objref);
+}
+
+
+/* Writes stringified object reference of @servant to file
+ * @filename. If error occures @ev points to exception object on
+ * return.
+ */
+void 
+etk_export_object_to_file (CORBA_ORB          orb,
+                          CORBA_Object       servant,
+                          char              *filename, 
+                          CORBA_Environment *ev)
+{
+//        CORBA_char *objref = NULL;
+       FILE       *file   = NULL;
+
+       /* write objref to file */
+       
+       if ((file=fopen(filename, "w"))==NULL) 
+               g_error ("could not open %s\n", filename);
+       
+        /* print ior to stream */
+       etk_export_object_to_stream (orb, servant, file, ev);
+
+       fclose (file);
+}
+
+
+/**
+ *
+ */
+static gchar*
+etk_read_string_from_stream (FILE *stream)
+{
+        gulong length = 4*1024; /* should suffice ordinary IOR string */
+        gchar *objref = g_malloc0 (length*sizeof(gchar)); /* empty string */
+        int c = 0;
+        int i = 0;
+
+        /* skip leading white space */
+        while((c=fgetc(stream))!=EOF && g_ascii_isspace(c));
+        /* POST: c==EOF or c=first character */
+
+        if (c!=EOF)
+          /* PRE: c=first character */
+          /* append c to string while more c exist and c not white space */
+          do {
+            /* check size */
+            if (i>=(length-1)) {
+              length*=2;
+              objref=g_realloc (objref, length);
+            }
+            objref[i++] = c;
+          } while ((c=fgetc(stream))!=EOF && !g_ascii_isspace(c));
+          /* POST: first string read */
+
+        /* terminate string with \0 */
+        objref[i] = '\0';
+
+        /* INV: objref valid string, #objref>=0 */
+
+        return objref;
+}
+
+/**
+ *
+ */
+CORBA_Object
+etk_import_object_from_stream (CORBA_ORB          orb,
+                              FILE              *stream,
+                              CORBA_Environment *ev)
+{
+       CORBA_Object obj = CORBA_OBJECT_NIL;
+       gchar *objref=etk_read_string_from_stream (stream);
+
+       if (!objref || strlen (objref)==0) {
+               g_warning ("empty object reference");
+               if (objref) 
+                       g_free (objref);
+               return CORBA_OBJECT_NIL;                
+       }
+
+       obj = (CORBA_Object) CORBA_ORB_string_to_object (orb,
+                                                        objref, 
+                                                        ev);
+       free (objref);
+       
+       return obj;
+}
+
+/**
+ *
+ */
+CORBA_Object
+etk_import_object_from_file (CORBA_ORB          orb,
+                             CORBA_char        *filename,
+                             CORBA_Environment *ev)
+{
+        CORBA_Object  obj    = NULL;
+        FILE         *file   = NULL;
+  
+        /* write objref to file */
+          
+        if ((file=fopen(filename, "r"))==NULL)
+                g_error ("could not open %s\n", filename);
+     
+        obj= etk_import_object_from_stream (orb, file, ev);
+         
+       if (obj==CORBA_OBJECT_NIL) 
+               g_warning ("object is NIL");
+
+        fclose (file);
+        return obj;
+}
+/**
+ */
+CosNaming_NamingContext 
+etk_get_name_service (CORBA_ORB         orb,
+                     CORBA_Environment *ev)
+{
+//        CORBA_char   *str=NULL;
+        CORBA_Object  ref
+                = (CORBA_Object) CORBA_ORB_resolve_initial_references(orb,
+                                                                     "NameService",
+                                                                      ev);
+        if (etk_raised_exception(ev)) return CORBA_OBJECT_NIL;
+       
+        return (CosNaming_NamingContext) ref;
+}
+
+/** calculate length of NULL terminated string vector */
+static
+guint 
+id_vec_len (char *id_vec[]) 
+{ 
+       gint i=0; 
+       for (i = 0; id_vec[i]; ++i); 
+       return i;
+} 
+
+/* binds @servant object reference to unique @name at
+ * @name_service. If error occures @ev points to exception object on
+ * return.
+ */
+void 
+etk_name_service_bind (CosNaming_NamingContext  name_service,
+                      CORBA_Object             servant,
+                      gchar                   *id_vec[], 
+                      CORBA_Environment       *ev)
+{
+       gint i = 0;
+       gint len = id_vec_len (id_vec);
+
+       /* Allocate a CosNaming::Name (sequence of CosNaming::NameComponent) */
+       CosNaming_Name *name = CosNaming_Name__alloc();
+
+       name->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf(len);
+       name->_maximum = len;
+       name->_length  = 0;
+       
+       /* Relinquish ownership of the NameComponent to the
+         * sequence. When CORBA_free is called on it later, the
+         * NameComponent will be freed */      
+       CORBA_sequence_set_release (name, TRUE);
+
+       /* iterate components of name and create sub-context
+        * (directory) if needed */ 
+       for (i = 0; i < len; ++i) {
+               name->_length = i+1;
+               name->_buffer[i].id   = CORBA_string_dup(id_vec[i]);
+               name->_buffer[i].kind = CORBA_string_dup(""); 
+               /* don't know what 'kind' shall be good for */ 
+
+               if (name->_length < len) 
+               {
+                       /* create a sub-context */ 
+//                     CosNaming_NamingContext nc = 
+                               CosNaming_NamingContext_bind_new_context (name_service, 
+                                                                         name, 
+                                                                         ev);  
+                       if (etk_raised_exception_is_a (ev, 
+                                                      ex_CosNaming_NamingContext_AlreadyBound))
+                       {
+                               /* ignore - ctx allread exists, this
+                                * is not dramatic */
+                               CORBA_exception_free (ev);
+                       }
+                       else if (etk_raised_exception (ev)) 
+                       {
+                               /* critical - unexpected exception  */ 
+                               CORBA_free (name); 
+                               return;
+                       }
+               }
+               else
+               {
+                       /* Bind object to last context - use 'rebind'
+                        * operation in case the name has been
+                        * registered allready in context - note, this
+                        * might interfere with other service choosing
+                        * same name */ 
+                       CosNaming_NamingContext_rebind (name_service, 
+                                                       name, 
+                                                       servant,
+                                                       ev);
+                       if (etk_raised_exception(ev)) {
+                               /* critical - can not bind object */ 
+                               CORBA_free (name);
+                               return;
+                       }
+               }
+       }
+
+       CORBA_free (name);
+       return;
+}
+
+CORBA_Object 
+etk_name_service_resolve (CosNaming_NamingContext  name_service,
+                         gchar                   *id_vec[], 
+                         CORBA_Environment       *ev)
+{
+       CORBA_Object retval = CORBA_OBJECT_NIL;
+       gint i = 0;
+       gint len = id_vec_len (id_vec);
+
+       /* Allocate a CosNaming::Name (sequence of CosNaming::NameComponent) */
+       CosNaming_Name *name = CosNaming_Name__alloc();
+
+       g_assert (id_vec_len (id_vec) > 0);
+
+       name->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf(len);
+       name->_maximum = len;
+       name->_length  = 0;
+       
+       /* Relinquish ownership of the NameComponent to the
+         * sequence. When CORBA_free is called on it later, the
+         * NameComponent will be freed */      
+       CORBA_sequence_set_release (name, TRUE);
+
+       /* iterate components of name and create sub-context
+        * (directory) if needed */ 
+       for (i = 0; i < len; ++i) {
+               name->_length = i+1;
+               name->_buffer[i].id   = CORBA_string_dup(id_vec[i]);
+               name->_buffer[i].kind = CORBA_string_dup(""); 
+               /* don't know what 'kind' shall be good for */ 
+       }
+       
+       retval = CosNaming_NamingContext_resolve (name_service, 
+                                                 name, 
+                                                 ev);
+       
+       if (etk_raised_exception (ev)) { 
+               CORBA_free (name);
+               return CORBA_OBJECT_NIL;
+       }
+       
+       return retval;
+}
diff --git a/ulan/host/apps/ul_asd/ul_corba_toolkit.h b/ulan/host/apps/ul_asd/ul_corba_toolkit.h
new file mode 100644 (file)
index 0000000..9612a95
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef _UL_CORBA_TOOLKIT_
+#define _UL_CORBA_TOOLKIT_
+
+#include <stdio.h>
+#include <string.h>
+#include <orbit/orbit.h>
+#include <ORBitservices/CosNaming.h>
+
+/* extracts type of exception: Three return Values are possible:
+ * CORBA_NO_EXCEPTION, CORBA_USER_EXCEPTION, CORBA_SYSTEM_EXCEPTION:/
+*/
+#define etk_exception_type(ev) (ev->_major)
+
+/** 
+ * test @ev for any exception 
+ */
+gboolean 
+etk_raised_exception (CORBA_Environment *ev);
+
+/** 
+ * test @ev for specific exception  @ex
+ */
+gboolean 
+etk_raised_exception_is_a (CORBA_Environment *ev, CORBA_char* ex);
+
+/**
+ * in case of any exception this operation will abort the process  
+ */
+void 
+etk_abort_if_exception(CORBA_Environment *ev, const char* mesg); 
+
+/**
+ * in case of any exception this operation will only free allocated resources
+ */
+void 
+etk_ignore_if_exception(CORBA_Environment *ev, const char* mesg); 
+
+/**
+ *
+ */
+void
+etk_export_object_to_stream (CORBA_ORB          orb,
+                            CORBA_Object       servant,
+                            FILE              *stream,
+                            CORBA_Environment *ev);
+
+
+/* Writes stringified object reference of @servant to file
+ * @filename. If error occures @ev points to exception object on
+ * return.
+ */
+void 
+etk_export_object_to_file (CORBA_ORB          orb,
+                          CORBA_Object       servant,
+                          char              *filename, 
+                          CORBA_Environment *ev);
+
+/**
+ *
+ */
+CORBA_Object
+etk_import_object_from_stream (CORBA_ORB          orb,
+                              FILE              *stream,
+                              CORBA_Environment *ev);
+
+/**
+ *
+ */
+CORBA_Object
+etk_import_object_from_file (CORBA_ORB          orb,
+                            CORBA_char        *filename,
+                            CORBA_Environment *ev);
+
+
+/** resolves default name-service, usually given to application as
+ * command line argument "-ORBInitRef NameService=IOR:0100000028..",
+ * or since release 2.8.0 corbalocs in form of URL can be used, eg:
+ * "-ORBInitRef NameService=corbaloc:iiop:HOSTNAME:PORT/NameService%00"
+ */
+CosNaming_NamingContext 
+etk_get_name_service (CORBA_ORB         orb,
+                     CORBA_Environment *ev);
+
+
+/* binds @servant object reference to unique @name at
+ * @name_service. @name is a NULL terminated list of strings
+ * (CORBA_char*). If error occures @ev points to exception object on
+ * return.
+ */
+void 
+etk_name_service_bind (CosNaming_NamingContext  name_service,
+                      CORBA_Object             servant,
+                      gchar                   *id_vec[], 
+                      CORBA_Environment       *ev);
+
+/* resolves object reference @return with unique @name at
+ *  @name_service. @name is a NULL terminated list of strings
+ *  (CORBA_char*).  If error occures @ev points to * exception object
+ *  on return.
+ */
+CORBA_Object 
+etk_name_service_resolve (CosNaming_NamingContext  name_service,
+                         gchar                   *id_vec[], 
+                         CORBA_Environment       *ev);
+
+#endif
diff --git a/ulan/host/apps/ul_asd/ulci_as-skelimpl.c b/ulan/host/apps/ul_asd/ulci_as-skelimpl.c
new file mode 100644 (file)
index 0000000..a534f25
--- /dev/null
@@ -0,0 +1,593 @@
+/* This is a template file generated by command */
+/* orbit-idl-2 --skeleton-impl ulci_as.idl */
+/* User must edit this file, inserting servant  */
+/* specific code between markers. */
+
+#include "ulci_as.h"
+
+/*** App-specific servant structures ***/
+
+#if !defined(_typedef_impl_POA_ulci_statistics_)
+#define _typedef_impl_POA_ulci_statistics_ 1
+typedef struct {
+POA_ulci_statistics servant;
+PortableServer_POA poa;
+CORBA_string attr_start_time;
+CORBA_unsigned_long attr_dy_adr_asg_cnt;
+CORBA_string attr_dy_adr_asg_last;
+CORBA_unsigned_long attr_st_adr_req_cnt;
+CORBA_string attr_st_adr_reg_last;
+   /* ------ add private attributes here ------ */
+ul_asd_context_t *ul_cont;
+   /* ------ ---------- end ------------ ------ */
+} impl_POA_ulci_statistics;
+#endif
+
+#if !defined(_typedef_impl_POA_ulci_settings_)
+#define _typedef_impl_POA_ulci_settings_ 1
+typedef struct {
+POA_ulci_settings servant;
+PortableServer_POA poa;
+CORBA_unsigned_short attr_status_period;
+CORBA_unsigned_short attr_first_dy_adr;
+CORBA_unsigned_short attr_cycle_start;
+   /* ------ add private attributes here ------ */
+ul_asd_context_t *ul_cont;
+   /* ------ ---------- end ------------ ------ */
+} impl_POA_ulci_settings;
+#endif
+
+
+/*** Implementation stub prototypes ***/
+
+#if !defined(_decl_impl_ulci_statistics__destroy_)
+#define _decl_impl_ulci_statistics__destroy_ 1
+static void impl_ulci_statistics__destroy(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_statistics__get_start_time_)
+#define _decl_impl_ulci_statistics__get_start_time_ 1
+static CORBA_string
+impl_ulci_statistics__get_start_time(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_statistics__get_dy_adr_asg_cnt_)
+#define _decl_impl_ulci_statistics__get_dy_adr_asg_cnt_ 1
+static CORBA_unsigned_long
+impl_ulci_statistics__get_dy_adr_asg_cnt(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_statistics__get_dy_adr_asg_last_)
+#define _decl_impl_ulci_statistics__get_dy_adr_asg_last_ 1
+static CORBA_string
+impl_ulci_statistics__get_dy_adr_asg_last(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_statistics__get_st_adr_req_cnt_)
+#define _decl_impl_ulci_statistics__get_st_adr_req_cnt_ 1
+static CORBA_unsigned_long
+impl_ulci_statistics__get_st_adr_req_cnt(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_statistics__get_st_adr_reg_last_)
+#define _decl_impl_ulci_statistics__get_st_adr_reg_last_ 1
+static CORBA_string
+impl_ulci_statistics__get_st_adr_reg_last(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__destroy_)
+#define _decl_impl_ulci_settings__destroy_ 1
+static void impl_ulci_settings__destroy(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__get_status_period_)
+#define _decl_impl_ulci_settings__get_status_period_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_status_period(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__set_status_period_)
+#define _decl_impl_ulci_settings__set_status_period_ 1
+static void
+impl_ulci_settings__set_status_period(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__get_first_dy_adr_)
+#define _decl_impl_ulci_settings__get_first_dy_adr_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_first_dy_adr(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__set_first_dy_adr_)
+#define _decl_impl_ulci_settings__set_first_dy_adr_ 1
+static void
+impl_ulci_settings__set_first_dy_adr(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__get_cycle_start_)
+#define _decl_impl_ulci_settings__get_cycle_start_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_cycle_start(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings__set_cycle_start_)
+#define _decl_impl_ulci_settings__set_cycle_start_ 1
+static void
+impl_ulci_settings__set_cycle_start(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings_add_static_unit_)
+#define _decl_impl_ulci_settings_add_static_unit_ 1
+static void
+impl_ulci_settings_add_static_unit(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short adr,
+const CORBA_unsigned_short sn,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings_remove_static_unit_)
+#define _decl_impl_ulci_settings_remove_static_unit_ 1
+static void
+impl_ulci_settings_remove_static_unit(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short sn,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings_get_units_)
+#define _decl_impl_ulci_settings_get_units_ 1
+static ulci_units_t*
+impl_ulci_settings_get_units(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+#if !defined(_decl_impl_ulci_settings_save_)
+#define _decl_impl_ulci_settings_save_ 1
+static void
+impl_ulci_settings_save(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev);
+#endif
+
+
+/*** epv structures ***/
+
+#if !defined(_impl_ulci_statistics_base_epv_)
+#define _impl_ulci_statistics_base_epv_ 1
+static PortableServer_ServantBase__epv impl_ulci_statistics_base_epv = {
+NULL,             /* _private data */
+(gpointer) & impl_ulci_statistics__destroy, /* finalize routine */
+NULL,             /* default_POA routine */
+};
+#endif
+
+#if !defined(_impl_ulci_statistics_epv_)
+#define _impl_ulci_statistics_epv_ 1
+static POA_ulci_statistics__epv impl_ulci_statistics_epv = {
+NULL, /* _private */
+(gpointer)&impl_ulci_statistics__get_start_time,
+(gpointer)&impl_ulci_statistics__get_dy_adr_asg_cnt,
+(gpointer)&impl_ulci_statistics__get_dy_adr_asg_last,
+(gpointer)&impl_ulci_statistics__get_st_adr_req_cnt,
+(gpointer)&impl_ulci_statistics__get_st_adr_reg_last,
+};
+#endif
+
+#if !defined(_impl_ulci_settings_base_epv_)
+#define _impl_ulci_settings_base_epv_ 1
+static PortableServer_ServantBase__epv impl_ulci_settings_base_epv = {
+NULL,             /* _private data */
+(gpointer) & impl_ulci_settings__destroy, /* finalize routine */
+NULL,             /* default_POA routine */
+};
+#endif
+
+#if !defined(_impl_ulci_settings_epv_)
+#define _impl_ulci_settings_epv_ 1
+static POA_ulci_settings__epv impl_ulci_settings_epv = {
+NULL, /* _private */
+(gpointer)&impl_ulci_settings__get_status_period,
+(gpointer)&impl_ulci_settings__set_status_period,
+(gpointer)&impl_ulci_settings__get_first_dy_adr,
+(gpointer)&impl_ulci_settings__set_first_dy_adr,
+(gpointer)&impl_ulci_settings__get_cycle_start,
+(gpointer)&impl_ulci_settings__set_cycle_start,
+(gpointer)&impl_ulci_settings_add_static_unit,
+(gpointer)&impl_ulci_settings_remove_static_unit,
+(gpointer)&impl_ulci_settings_get_units,
+(gpointer)&impl_ulci_settings_save,
+};
+#endif
+
+
+/*** vepv structures ***/
+
+#if !defined(_impl_ulci_statistics_vepv_)
+#define _impl_ulci_statistics_vepv_ 1
+static POA_ulci_statistics__vepv impl_ulci_statistics_vepv = {
+&impl_ulci_statistics_base_epv,
+&impl_ulci_statistics_epv,
+};
+#endif
+
+#if !defined(_impl_ulci_settings_vepv_)
+#define _impl_ulci_settings_vepv_ 1
+static POA_ulci_settings__vepv impl_ulci_settings_vepv = {
+&impl_ulci_settings_base_epv,
+&impl_ulci_settings_epv,
+};
+#endif
+
+
+/*** Stub implementations ***/
+
+#if !defined(_impl_ulci_statistics__create_)
+#define _impl_ulci_statistics__create_ 1
+static ulci_statistics impl_ulci_statistics__create(PortableServer_POA poa, CORBA_Environment *ev, ul_asd_context_t *ul_cont)
+{
+ulci_statistics retval;
+impl_POA_ulci_statistics *newservant;
+PortableServer_ObjectId *objid;
+
+newservant = g_new0(impl_POA_ulci_statistics, 1);
+newservant->servant.vepv = &impl_ulci_statistics_vepv;
+newservant->poa = (PortableServer_POA) CORBA_Object_duplicate((CORBA_Object)poa, ev);
+POA_ulci_statistics__init((PortableServer_Servant)newservant, ev);
+   /* Before servant is going to be activated all
+    * private attributes must be initialized.  */
+newservant->ul_cont=ul_cont;
+   /* ------ init private attributes here ------ */
+   /* ------ ---------- end ------------- ------ */
+
+objid = PortableServer_POA_activate_object(poa, newservant, ev);
+CORBA_free(objid);
+retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__destroy_)
+#define _impl_ulci_statistics__destroy_ 1
+static void
+impl_ulci_statistics__destroy(impl_POA_ulci_statistics *servant, CORBA_Environment *ev)
+{
+    CORBA_Object_release ((CORBA_Object) servant->poa, ev);
+
+    /* No further remote method calls are delegated to 
+    * servant and you may free your private attributes. */
+   /* ------ free private attributes here ------ */
+   /* ------ ---------- end ------------- ------ */
+
+POA_ulci_statistics__fini((PortableServer_Servant)servant, ev);
+
+g_free (servant);
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__get_start_time_)
+#define _impl_ulci_statistics__get_start_time_ 1
+static CORBA_string
+impl_ulci_statistics__get_start_time(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev)
+{
+CORBA_string retval;
+ /* ------   insert method code here   ------ */
+   struct tm *t;
+   char buff[64];
+   
+   g_mutex_lock(servant->ul_cont->mutex);
+   t=localtime(&servant->ul_cont->ul_net->statistics->start_time);
+   strftime(buff,sizeof(buff),"%d.%m.%Y %H:%M:%S",t);
+   retval=CORBA_string_dup(buff);   
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__get_dy_adr_asg_cnt_)
+#define _impl_ulci_statistics__get_dy_adr_asg_cnt_ 1
+static CORBA_unsigned_long
+impl_ulci_statistics__get_dy_adr_asg_cnt(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev)
+{
+CORBA_unsigned_long retval;
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval=servant->ul_cont->ul_net->statistics->dy_adr_asg_cnt;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__get_dy_adr_asg_last_)
+#define _impl_ulci_statistics__get_dy_adr_asg_last_ 1
+static CORBA_string
+impl_ulci_statistics__get_dy_adr_asg_last(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev)
+{
+CORBA_string retval;
+ /* ------   insert method code here   ------ */
+   struct tm *t;
+   char buff[64];
+   
+   g_mutex_lock(servant->ul_cont->mutex);
+   t=localtime(&servant->ul_cont->ul_net->statistics->dy_adr_asg_last);
+   strftime(buff,sizeof(buff),"%d.%m.%Y %H:%M:%S",t);
+   retval=CORBA_string_dup(buff);   
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__get_st_adr_req_cnt_)
+#define _impl_ulci_statistics__get_st_adr_req_cnt_ 1
+static CORBA_unsigned_long
+impl_ulci_statistics__get_st_adr_req_cnt(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev)
+{
+CORBA_unsigned_long retval;
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval=servant->ul_cont->ul_net->statistics->st_adr_req_cnt;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_statistics__get_st_adr_reg_last_)
+#define _impl_ulci_statistics__get_st_adr_reg_last_ 1
+static CORBA_string
+impl_ulci_statistics__get_st_adr_reg_last(impl_POA_ulci_statistics *servant,
+CORBA_Environment *ev)
+{
+CORBA_string retval;
+ /* ------   insert method code here   ------ */
+   struct tm *t;
+   char buff[64];
+   
+   g_mutex_lock(servant->ul_cont->mutex);
+   t=localtime(&servant->ul_cont->ul_net->statistics->st_adr_req_last);
+   strftime(buff,sizeof(buff),"%d.%m.%Y %H:%M:%S",t);
+   retval=CORBA_string_dup(buff);   
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_settings__create_)
+#define _impl_ulci_settings__create_ 1
+static ulci_settings impl_ulci_settings__create(PortableServer_POA poa, CORBA_Environment *ev, ul_asd_context_t *ul_cont)
+{
+ulci_settings retval;
+impl_POA_ulci_settings *newservant;
+PortableServer_ObjectId *objid;
+
+newservant = g_new0(impl_POA_ulci_settings, 1);
+newservant->servant.vepv = &impl_ulci_settings_vepv;
+newservant->poa = (PortableServer_POA) CORBA_Object_duplicate((CORBA_Object)poa, ev);
+POA_ulci_settings__init((PortableServer_Servant)newservant, ev);
+   /* Before servant is going to be activated all
+    * private attributes must be initialized.  */
+newservant->ul_cont=ul_cont;
+   /* ------ init private attributes here ------ */
+   /* ------ ---------- end ------------- ------ */
+
+objid = PortableServer_POA_activate_object(poa, newservant, ev);
+CORBA_free(objid);
+retval = PortableServer_POA_servant_to_reference(poa, newservant, ev);
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_settings__destroy_)
+#define _impl_ulci_settings__destroy_ 1
+static void
+impl_ulci_settings__destroy(impl_POA_ulci_settings *servant, CORBA_Environment *ev)
+{
+    CORBA_Object_release ((CORBA_Object) servant->poa, ev);
+
+    /* No further remote method calls are delegated to 
+    * servant and you may free your private attributes. */
+   /* ------ free private attributes here ------ */
+   /* ------ ---------- end ------------- ------ */
+
+POA_ulci_settings__fini((PortableServer_Servant)servant, ev);
+
+g_free (servant);
+}
+#endif
+
+#if !defined(_impl_ulci_settings__get_status_period_)
+#define _impl_ulci_settings__get_status_period_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_status_period(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev)
+{
+CORBA_unsigned_short retval;
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval=servant->ul_cont->ul_net->dy_state->period;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_settings__set_status_period_)
+#define _impl_ulci_settings__set_status_period_ 1
+static void
+impl_ulci_settings__set_status_period(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   servant->ul_cont->ul_net->dy_state->period=value;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
+#if !defined(_impl_ulci_settings__get_first_dy_adr_)
+#define _impl_ulci_settings__get_first_dy_adr_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_first_dy_adr(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev)
+{
+CORBA_unsigned_short retval;
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval=servant->ul_cont->ul_net->dy_state->first_dy_adr;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_settings__set_first_dy_adr_)
+#define _impl_ulci_settings__set_first_dy_adr_ 1
+static void
+impl_ulci_settings__set_first_dy_adr(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   servant->ul_cont->ul_net->dy_state->first_dy_adr=value;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
+#if !defined(_impl_ulci_settings__get_cycle_start_)
+#define _impl_ulci_settings__get_cycle_start_ 1
+static CORBA_unsigned_short
+impl_ulci_settings__get_cycle_start(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev)
+{
+CORBA_unsigned_short retval;
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval=ul_dy_cycle_subfn;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+
+return retval;
+}
+#endif
+
+#if !defined(_impl_ulci_settings__set_cycle_start_)
+#define _impl_ulci_settings__set_cycle_start_ 1
+static void
+impl_ulci_settings__set_cycle_start(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short value,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   ul_dy_cycle_subfn=value;
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
+#if !defined(_impl_ulci_settings_add_static_unit_)
+#define _impl_ulci_settings_add_static_unit_ 1
+static void
+impl_ulci_settings_add_static_unit(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short adr,
+const CORBA_unsigned_short sn,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   ul_mod_static_add(servant->ul_cont->ul_net,adr,sn);
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
+#if !defined(_impl_ulci_settings_remove_static_unit_)
+#define _impl_ulci_settings_remove_static_unit_ 1
+static void
+impl_ulci_settings_remove_static_unit(impl_POA_ulci_settings *servant,
+const CORBA_unsigned_short sn,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   ul_mod_static_remove(servant->ul_cont->ul_net,sn);
+   g_mutex_unlock(servant->ul_cont->mutex);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
+#if !defined(_impl_ulci_settings_get_units_)
+#define _impl_ulci_settings_get_units_ 1
+static ulci_units_t*
+impl_ulci_settings_get_units(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev)
+{
+   ulci_units_t* retval;
+   CORBA_long mindx=0;
+   ulci_unit_t unit;
+
+   /* ------   insert method code here   ------ */
+   g_mutex_lock(servant->ul_cont->mutex);
+   retval = ORBit_sequence_alloc (TC_CORBA_sequence_ulci_unit, 
+                                  0);
+   for(mindx=0;mindx<servant->ul_cont->ul_net->modules.count;mindx++) {
+      ul_mod_info_t *mod=servant->ul_cont->ul_net->modules.items[mindx];
+      unit.sn=mod->mod_sn;
+      unit.adr=mod->mod_adr;
+      unit.des=CORBA_string_dup(mod->mod_des?mod->mod_des:"");
+      unit.flags=mod->flg;
+      ORBit_sequence_append (retval, &unit); /* realloc */
+   }
+   retval->_release = TRUE;
+   g_mutex_unlock(servant->ul_cont->mutex);
+   /* ------ ---------- end ------------ ------ */
+   return retval;   
+}
+#endif
+
+#if !defined(_impl_ulci_settings_save_)
+#define _impl_ulci_settings_save_ 1
+static void
+impl_ulci_settings_save(impl_POA_ulci_settings *servant,
+CORBA_Environment *ev)
+{
+ /* ------   insert method code here   ------ */
+    ul_asd_conf_save(NULL, servant->ul_cont);
+ /* ------ ---------- end ------------ ------ */
+}
+#endif
+
diff --git a/ulan/host/apps/ul_asd/ulci_as.idl b/ulan/host/apps/ul_asd/ulci_as.idl
new file mode 100644 (file)
index 0000000..96d2c42
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * uLan address server corba interface
+ *
+ * Author:
+ *    Petr Smolik (petr.smolik@wo.cz)
+ *
+ */
+
+#ifndef UL_CI_IDL
+#define UL_CI_IDL
+
+module ulci {
+       /* Types */
+       typedef struct unit {
+               unsigned short adr;
+               unsigned long sn;
+               unsigned short flags;
+               string des;
+       } unit_t;
+       typedef sequence<unit_t> units_t;        
+
+       /* Statistics */
+       interface statistics {
+               readonly attribute string start_time;
+               readonly attribute unsigned long dy_adr_asg_cnt;
+               readonly attribute string dy_adr_asg_last;
+               readonly attribute unsigned long st_adr_req_cnt;
+               readonly attribute string st_adr_reg_last;
+       };
+    
+        /* uLan server settings */
+       interface settings {
+               attribute unsigned short status_period;
+               attribute unsigned short first_dy_adr;
+               attribute unsigned short cycle_start;
+               
+               void add_static_unit(in unsigned short adr, in unsigned short sn);
+               void remove_static_unit(in unsigned short sn);
+               units_t get_units();
+
+               void save();
+       };
+};
+
+#endif /* ULCI_IDL */
+
diff --git a/ulan/host/apps/ul_ethd/CVS/Entries b/ulan/host/apps/ul_ethd/CVS/Entries
new file mode 100644 (file)
index 0000000..c1c9609
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Sun Nov 11 18:35:39 2007//
+/Makefile.omk/1.2/Wed Nov 14 13:31:04 2007//
+/log_domains.inc/1.2/Wed Nov 14 13:31:04 2007//
+/service.c/1.1/Wed Nov 14 13:31:07 2007//
+/ul_eth_server_commands.c/1.3/Sun Nov 18 20:56:18 2007//
+/ul_ethd.c/1.5/Wed Dec 26 21:22:39 2007//
+/ul_ethd.h/1.3/Tue Nov 20 16:08:56 2007//
+D
diff --git a/ulan/host/apps/ul_ethd/CVS/Repository b/ulan/host/apps/ul_ethd/CVS/Repository
new file mode 100644 (file)
index 0000000..90b1758
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/apps/ul_ethd
diff --git a/ulan/host/apps/ul_ethd/CVS/Root b/ulan/host/apps/ul_ethd/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/apps/ul_ethd/Makefile b/ulan/host/apps/ul_ethd/Makefile
new file mode 100644 (file)
index 0000000..b22a357
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" = `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/host/apps/ul_ethd/Makefile.omk b/ulan/host/apps/ul_ethd/Makefile.omk
new file mode 100644 (file)
index 0000000..2c6d239
--- /dev/null
@@ -0,0 +1,20 @@
+default_CONFIG = CONFIG_OC_UL_ETHD=n
+
+ifeq ($(CONFIG_OC_UL_ETHD),y)
+
+INCLUDES += -I .
+
+LOCAL_CONFIG_H = local_config.h
+
+bin_PROGRAMS = ul_ethd
+
+ul_ethd_SOURCES = ul_ethd.c ul_eth_server_commands.c
+
+lib_LOADLIBES = pthread ulcintf ulan ulut
+ifeq ($(TARGET_OS),win32) 
+  ul_ethd_SOURCES += service.c
+  lib_LOADLIBES+=ws2_32
+endif
+
+
+endif #CONFIG_OC_UL_ETHD
diff --git a/ulan/host/apps/ul_ethd/log_domains.inc b/ulan/host/apps/ul_ethd/log_domains.inc
new file mode 100644 (file)
index 0000000..6c6ff69
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * This is generated file, do not edit it directly.
+ * Take it from standard output of "ul_log_domains"
+ * script called in the top level project directory
+ */
+
+#define UL_LOGL_DEF 1
+
+ul_log_domain_t ulogd_ethd     = {UL_LOGL_DEF, "ethd"};
+ul_log_domain_t ulogd_commands  = {UL_LOGL_DEF, "commands"};
+extern ul_log_domain_t ulogd_drv_eth; 
+
+ul_log_domain_t *ul_log_domains_array[] = {
+   &ulogd_ethd,
+   &ulogd_commands,
+   &ulogd_drv_eth,
+};
diff --git a/ulan/host/apps/ul_ethd/service.c b/ulan/host/apps/ul_ethd/service.c
new file mode 100644 (file)
index 0000000..5346c07
--- /dev/null
@@ -0,0 +1,217 @@
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <process.h>
+#include <tchar.h>
+
+HANDLE                         killServiceEvent = NULL;
+static SERVICE_STATUS          ssStatus;       // current status of the service
+static SERVICE_STATUS_HANDLE   sshStatusHandle;
+static DWORD                   dwErr = 0;
+static char                    szErr[1024] = "";
+
+char                           *name_service="ul_ethd";
+char                           *name_service_disp="ulan Ethernet daemon";
+
+int server_init(void);         //forward declaration
+int server_start(void);        //forward declaration
+int server_stop(void);         //forward declaration
+
+static void AddToMessageLog(char *lpszMsg) {
+  char    szMsg[2048];
+  HANDLE  hEventSource;
+  char *  lpszStrings[2];
+
+  dwErr = GetLastError();
+  hEventSource = RegisterEventSource(NULL, name_service);
+  sprintf(szMsg, "%s error: %li", name_service, dwErr);
+  lpszStrings[0] = szMsg;
+  lpszStrings[1] = lpszMsg;
+  if(hEventSource != NULL) {
+    ReportEvent(hEventSource, // handle of event source
+                EVENTLOG_ERROR_TYPE,  // event type
+                0,                    // event category
+                0,                    // event ID
+                NULL,                 // current user's SID
+                2,                    // strings in lpszStrings
+                0,                    // no bytes of raw data
+                (LPCSTR*)lpszStrings, // array of error strings
+                NULL);                // no raw data
+    DeregisterEventSource(hEventSource);
+  }
+}
+
+BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,
+                         DWORD dwWaitHint) {
+  static DWORD dwCheckPoint = 1;
+  BOOL fResult = TRUE;
+
+  if(dwCurrentState == SERVICE_START_PENDING) ssStatus.dwControlsAccepted = 0;
+  else ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+  ssStatus.dwCurrentState = dwCurrentState;
+  ssStatus.dwWin32ExitCode = dwWin32ExitCode;
+  ssStatus.dwWaitHint = dwWaitHint;
+  if((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED)) ssStatus.dwCheckPoint = 0;
+  else ssStatus.dwCheckPoint = dwCheckPoint++;
+  if(!(fResult = SetServiceStatus(sshStatusHandle, &ssStatus))) {
+    AddToMessageLog("SetServiceStatus");
+  }
+  return fResult;
+}
+
+void WINAPI service_ctrl(DWORD dwCtrlCode) {
+  switch(dwCtrlCode) {
+    case SERVICE_CONTROL_STOP:
+      ssStatus.dwCurrentState = SERVICE_STOP_PENDING;
+      server_stop();
+      SetEvent(killServiceEvent);
+      break;
+    case SERVICE_CONTROL_INTERROGATE:
+      break;
+    default:
+      break;
+  }
+  ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
+}
+
+void WINAPI service_main(DWORD dwArgc, char **lpszArgv) {
+  int       err;
+  sshStatusHandle = RegisterServiceCtrlHandler(name_service, service_ctrl);
+  if(sshStatusHandle) {
+    ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+    ssStatus.dwServiceSpecificExitCode = 0;
+    killServiceEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
+    if (!killServiceEvent) goto cleanup;
+    if(!ReportStatusToSCMgr(SERVICE_START_PENDING,NO_ERROR,3000)) goto cleanup;
+    err=server_init();
+    if (err<0) {
+      AddToMessageLog("Starting ul_ethd");
+      dwErr=NO_ERROR;
+      goto cleanup;
+    }
+    server_start();
+    if(!ReportStatusToSCMgr(SERVICE_RUNNING,NO_ERROR, 0 )) goto cleanup;
+    WaitForSingleObject(killServiceEvent,INFINITE);
+    CloseHandle(killServiceEvent);
+  }
+cleanup:
+  if(sshStatusHandle) {
+    ReportStatusToSCMgr(SERVICE_STOP_PENDING,dwErr,0);
+    ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);
+  }
+}
+
+void serviceDispatchTable(void) {
+  SERVICE_TABLE_ENTRY dispatchTable[] = {
+      { name_service, (LPSERVICE_MAIN_FUNCTION)service_main },
+      { NULL, NULL }
+  };
+  if(!StartServiceCtrlDispatcher(dispatchTable)) {
+    AddToMessageLog("StartServiceCtrlDispatcher failed.");
+  }
+}
+
+char *GetLastErrorText( char *lpszBuf, DWORD dwSize ) {
+  DWORD dwRet;
+  char *lpszTemp = NULL;
+
+  dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+                        NULL,
+                        GetLastError(),
+                        LANG_NEUTRAL,
+                        (char *)&lpszTemp,
+                        0,
+                        NULL);
+  // supplied buffer is not long enough
+  if(!dwRet || ((long)dwSize < (long)dwRet+14)) {
+    lpszBuf[0] = '\0';
+  } else {
+    lpszTemp[lstrlen(lpszTemp)-2] = '\0';  //remove cr and newline character
+    sprintf(lpszBuf, "%s (%li)", lpszTemp, GetLastError());
+  }
+  if(lpszTemp) LocalFree((HLOCAL) lpszTemp );
+  return lpszBuf;
+}
+
+void installService(void) {
+  SC_HANDLE   schService;
+  SC_HANDLE   schSCManager;
+  TCHAR       szPath[512];
+
+  if(GetModuleFileName( NULL, szPath, sizeof(szPath) - 1) == 0) {
+     printf("Unable to install %s - %s\n",
+             name_service,
+             GetLastErrorText(szErr, sizeof(szErr)));
+     return;
+  }
+  strcat(szPath," -s");
+  schSCManager = OpenSCManager(NULL,  // machine (NULL == local)
+                               NULL,  // database (NULL == default)
+                               SC_MANAGER_ALL_ACCESS);   // access required
+  if(schSCManager) {
+    schService = CreateService(schSCManager,               // SCManager database
+                               name_service,               // name of service
+                               name_service_disp,          // name to display
+                               SERVICE_ALL_ACCESS,         // desired access
+                               SERVICE_WIN32_OWN_PROCESS,  // service type
+                               SERVICE_AUTO_START,         // start type
+                               SERVICE_ERROR_NORMAL,       // error control type
+                               szPath,                     // service's binary
+                               NULL,                       // no load ordering group
+                               NULL,                       // no tag identifier
+                               NULL,                       // dependencies
+                               NULL,                       // LocalSystem account
+                               NULL);                      // no password
+    if(schService) {
+      CloseServiceHandle(schSCManager);
+      printf("Service name (%s) instaled!\n",name_service);
+    } else {
+       printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+    }
+  }
+}
+
+void removeService(void) {
+  SC_HANDLE   schService;
+  SC_HANDLE   schSCManager;
+
+  schSCManager = OpenSCManager(NULL,          // machine (NULL == local)
+                               NULL,          // database (NULL == default)
+                               SC_MANAGER_ALL_ACCESS );  // access required
+  if(schSCManager) {
+    schService = OpenService(schSCManager, name_service, SERVICE_ALL_ACCESS);
+    if(schService) {
+      // try to stop the service
+      if(ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus )) {
+        printf("Stopping %s.", name_service);
+        Sleep(100);
+        while(QueryServiceStatus(schService, &ssStatus )) {
+          if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING) {
+            printf(".");
+            Sleep(100);
+          } else {
+             break;
+          }
+        }
+        if(ssStatus.dwCurrentState == SERVICE_STOPPED) {
+          printf("\n%s stopped.\n", name_service);
+        } else {
+          printf("\n%s failed to stop.\n", name_service);
+        }
+      }
+      // now remove the service
+      if(DeleteService(schService)) {
+        printf("%s removed.\n", name_service);
+      } else {
+        printf("DeleteService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+      }
+      CloseServiceHandle(schService);
+    } else {
+      printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+    }
+    CloseServiceHandle(schSCManager);
+  } else {
+    printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+  }
+}
+
diff --git a/ulan/host/apps/ul_ethd/ul_eth_server_commands.c b/ulan/host/apps/ul_ethd/ul_eth_server_commands.c
new file mode 100644 (file)
index 0000000..bcb1230
--- /dev/null
@@ -0,0 +1,180 @@
+#include <stdio.h>
+#ifdef _WIN32
+ #include <winsock.h>
+#else
+ #include <sys/socket.h>
+#endif /* _WIN32 */
+#include <string.h>
+#include <stdlib.h>
+
+#include <ul_log.h>
+#include <ul_l_drv_eth.h>
+#include "ul_ethd.h"
+
+UL_LOG_CUST(ulogd_commands)
+
+void 
+ul_eth_server_command_open(client_context_t *client)
+{
+  char *ul_dev_name = UL_DEV_NAME;
+  
+  if (client->msg_data!=NULL)
+    ul_dev_name=client->msg_data;
+
+  ul_loginf("ul_open dev_name='%s'\n", ul_dev_name);
+  client->ul_fd=ul_open(ul_dev_name, NULL);
+  fprintf(client->sock_wfile,"usr %s open %d\n",client->msg_sn,client->ul_fd!=UL_FD_INVALID?1:0);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s open %d'\n", client->sock_wfile,client->msg_sn,client->ul_fd!=UL_FD_INVALID?1:0);
+}
+
+void 
+ul_eth_server_command_close(client_context_t *client)
+{
+  int r;
+  ul_loginf("ul_close\n");
+  r=ul_close(client->ul_fd);
+  ul_loginf("ul_close ret=0x%x\n",r);
+  fprintf(client->sock_wfile,"usr %s close %d\n",client->msg_sn,r);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s close %d'\n", client->sock_wfile,client->msg_sn,r);
+  client->ul_fd=UL_FD_INVALID;
+}
+
+void 
+ul_eth_server_command_drv_version(client_context_t *client)
+{
+  int r;
+  ul_loginf("ul_drv_version\n");
+  r=ul_drv_version(client->ul_fd);
+  ul_loginf("ul_drv_version ret=0x%x\n",r);
+  fprintf(client->sock_wfile,"usr %s drv_version %d\n",client->msg_sn,r);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s drv_version %d'\n", client->sock_wfile,client->msg_sn,r);
+}
+
+void 
+ul_eth_server_command_fd_wait(client_context_t *client)
+{
+  int r,s=1;
+
+  if (client->msg_data!=NULL)
+    s=strtol(client->msg_data,NULL,0);
+
+  ul_loginf("ul_fd_wait %d\n",s);
+  r=ul_fd_wait(client->ul_fd,s);
+  ul_loginf("ul_fd_wait ret=0x%x\n",r);
+  fprintf(client->sock_wfile,"usr %s fd_wait %d\n",client->msg_sn,r);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s fd_wait %d'\n", client->sock_wfile,client->msg_sn,r);
+}
+
+void 
+ul_eth_server_command_fd_wait_recv(client_context_t *client)
+{
+  int r,s=1;
+
+  if (client->msg_data!=NULL)
+    s=strtol(client->msg_data,NULL,0);
+
+  ul_loginf("ul_fd_wait_recv %d\n",s);
+  r=ul_fd_wait(client->ul_fd,s);
+  ul_loginf("ul_fd_wait_recv ret=0x%x\n",r);
+  if (r<0) {
+    fprintf(client->sock_wfile,"usr %s fd_wait_recv %d\n",client->msg_sn,r);
+    fflush(client->sock_wfile);
+    ul_logdeb("server on file %p says 'usr %s fd_wait_recv %d'\n", client->sock_wfile,client->msg_sn,r);
+  } else {
+    ul_eth_server_command_recv(client,"fd_wait_recv");
+  }
+}
+
+void 
+ul_eth_server_command_addfilt(client_context_t *client)
+{
+  int r;
+  ul_msginfo msginfo;
+
+  r=sscanf(client->msg_data,"%02x%02x%02x",&msginfo.sadr,&msginfo.dadr,&msginfo.cmd);
+  if (r!=3) {
+    fprintf(client->sock_wfile,"usr %s addfilt -1\n",client->msg_sn);
+    fflush(client->sock_wfile);
+    return;
+  }
+
+  ul_loginf("ul_addfilt sadr:%d dadr:%d cmd:%d\n",msginfo.sadr,msginfo.dadr,msginfo.cmd);
+  r=ul_addfilt(client->ul_fd,&msginfo);
+  ul_loginf("ul_addfilt ret=0x%x\n",r);
+  fprintf(client->sock_wfile,"usr %s addfilt %d\n",client->msg_sn,r);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s addfilt %d'\n", client->sock_wfile,client->msg_sn,r);
+}
+
+void 
+ul_eth_server_command_send(client_context_t *client)
+{
+  int r;
+
+  ul_loginf("ul_send\n");
+  if (ul_eth_demarshal_stream(&client->msg_buf,client->msg_data,client->msg_data_len)<0) {
+    fprintf(client->sock_wfile,"usr %s send -1\n",client->msg_sn);
+    fflush(client->sock_wfile);
+    return;
+  }
+  r=ul_msg_buf_wr(&client->msg_buf,client->ul_fd);
+  ul_loginf("ul_send stamp:%d\n",r);
+  fprintf(client->sock_wfile,"usr %s send %d\n",client->msg_sn,r);
+  fflush(client->sock_wfile);
+  ul_logdeb("server on file %p says 'usr %s send %d'\n", client->sock_wfile,client->msg_sn,r);
+}
+
+void
+ul_eth_server_command_recv(client_context_t *client,const char *service)
+{
+  ul_loginf("ul_%s\n",service);
+  ul_msg_buf_destroy(&client->msg_buf);
+  if( (ul_acceptmsg(client->ul_fd,&client->msg_buf.msginfo)<0) ||
+      (ul_msg_buf_rd_rest(&client->msg_buf, client->ul_fd)<0) ) {
+    fprintf(client->sock_wfile,"usr %s %s -1\n",client->msg_sn,service);
+    fflush(client->sock_wfile);
+    return;
+  }
+  fprintf(client->sock_wfile,"usr %s %s ",client->msg_sn,service);
+  ul_logdeb("server on file %p says 'usr %s %s ", client->sock_wfile,client->msg_sn,service);
+  ul_eth_send_msg(client->sock_wfile,&client->msg_buf);
+  fprintf(client->sock_wfile,"\n");
+  ul_log(&ulogd_commands,UL_LOGL_DEB|UL_LOGL_CONT,"'\n");
+  fflush(client->sock_wfile);
+}
+
+void 
+ul_eth_server_command_help(client_context_t *client)
+{
+  static char help_msg[] =
+  "ul_ethd - server\n\n"
+  "commnads\n"
+  "  usc [SN] open [device_name] - open device\n"
+  "  usc [SN] close - close device\n"
+  "  usc [SN] drv_version - driver version\n"
+  "  usc [SN] send [SSDDCCFFFFTTTTTTTTLLLL[DD..]..] - send data defined by HEX\n"
+  "               SS   - source address\n"
+  "               DD   - destination address\n"
+  "               CC   - destination address\n"
+  "               FFFF - flags\n"
+  "               TTTTTTTT - stamp\n"
+  "               LLLL - length\n"
+  "               DD   - data\n"
+  "            Next tail continue after previous tail or first message\n"
+  "  usc [SN] recv - request for receive data\n"
+  "  usc [SN] fd_wait [sec] - wait for fd makes active\n"
+  "  usc [SN] fd_wait_recv [sec] - wait for fd makes active and receive data\n"
+  "  usc [SN] addfilt [SSDDCC] - add message filter defined by SSDDCC\n"
+  "responses\n"
+  "  usr [SN] [command] [value] - returning value from the synchronic [command]\n"
+  "  usr [SN] recv [SSDDCCFFFFTTTTTTTTLLLL[DD..]..] - send received data defined by HEX\n";
+
+  ul_loginf("ul_help\n");
+  fprintf(client->sock_wfile,help_msg);
+  fflush(client->sock_wfile);
+}
+
diff --git a/ulan/host/apps/ul_ethd/ul_ethd.c b/ulan/host/apps/ul_ethd/ul_ethd.c
new file mode 100644 (file)
index 0000000..62194cc
--- /dev/null
@@ -0,0 +1,495 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <sys/types.h>
+#ifdef _WIN32
+ #include <winsock.h>
+ #include <fcntl.h>
+ typedef int socklen_t;
+#else
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ #define closesocket(s)  close(s)
+#endif /* _WIN32 */
+#include <sys/stat.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <ctype.h>
+
+#include <ul_log.h>
+#include <ul_logreg.h>
+#include <ul_l_drv_eth.h>
+#include "ul_ethd.h"
+#include "log_domains.inc"
+
+#define DEBUG_LEVEL "all.1"
+
+UL_LOG_CUST(ulogd_ethd)
+
+// tree of clients connected to the server
+client_root_t client_root;
+pthread_mutex_t client_mutex;
+//global variables
+int server_socket;
+int server_terminated;
+pthread_t server_threadid;
+
+/*******************************************************************/
+void client_process_request(client_context_t *client)
+{
+  char *command=client->msg_cmd;
+
+  if (strcmp(command,"open")==0) {
+    ul_eth_server_command_open(client);
+    return;
+  } 
+  else if (strcmp(command,"close")==0)
+  {
+    ul_eth_server_command_close(client);
+    return;
+  }
+  else if (strcmp(command,"drv_version")==0)
+  {
+    ul_eth_server_command_drv_version(client);
+    return;
+  }
+  else if (strcmp(command,"fd_wait")==0)
+  {
+    ul_eth_server_command_fd_wait(client);
+    return;
+  }
+  else if (strcmp(command,"fd_wait_recv")==0)
+  {
+    ul_eth_server_command_fd_wait_recv(client);
+    return;
+  }
+  else if (strcmp(command,"addfilt")==0)
+  {
+    ul_eth_server_command_addfilt(client);
+    return;
+  }
+  else if (strcmp(command,"send")==0)
+  {
+    ul_eth_server_command_send(client);
+    return;
+  }
+  else if (strcmp(command,"recv")==0)
+  {
+    ul_eth_server_command_recv(client,"recv");
+    return;
+  }
+}
+
+/*******************************************************************/
+void* client_run(void *vcontext)
+{
+  client_context_t *client=(client_context_t*)vcontext;
+  ul_dbuff_t rcvbuff;
+  int fd = client->sock,r;
+
+  ul_dbuff_init(&rcvbuff, 0);
+  ul_logdeb("Thread for client fd:%d is running\n",fd);
+
+  while (1) {
+
+    if (client->terminated) {
+      r=0;
+      break;
+    }
+        
+    r=ul_eth_recv_msg(fd,&rcvbuff,0,&client->terminated);
+
+    if(r<0) 
+      break;
+
+    ul_logdeb("client on file %p says '%s'\n", client->sock_wfile,(char*)rcvbuff.data);
+
+    client->msg_header = strtok ((char*)rcvbuff.data," ");
+
+    if (client->msg_header!=NULL) {
+      client->msg_sn = strtok (NULL," ");
+      if (client->msg_sn!=NULL) {
+        client->msg_cmd = strtok (NULL," ");
+        if (client->msg_cmd!=NULL) {
+          client->msg_data = strtok (NULL," ");
+          client->msg_data_len=0;
+          if (client->msg_data!=NULL) 
+            client->msg_data_len=rcvbuff.len-(client->msg_data-(char*)rcvbuff.data)-1;
+
+          client_process_request(client);
+        }
+      }    
+      if (strcmp(client->msg_header,"help")==0) {
+        ul_eth_server_command_help(client);
+      }
+      if (strcmp(client->msg_header,"quit")==0) {
+        r=-1; 
+        break;
+      }
+    }
+  }
+  ul_logdeb("Thread for client fd:%d terminated by rcode:%d\n",fd,r);
+
+  ul_dbuff_destroy(&rcvbuff);
+
+  fflush(client->sock_wfile);
+  fclose(client->sock_wfile);
+
+  if (client->ul_fd!=UL_FD_INVALID)
+    ul_close(client->ul_fd);
+  if (r==-1) {
+    ul_logdeb("Closing socket in thread\n");
+    closesocket(client->sock);
+    /* terminated by client side request */
+    pthread_mutex_lock (&client_mutex);
+    client_delete(&client_root,client);  
+    pthread_mutex_unlock (&client_mutex);
+
+    free(client);
+  }
+
+  ul_logdeb("Thread for client fd:%d was terminated\n",fd);
+  pthread_exit(NULL);
+  return NULL;
+}
+
+
+void destroy_all_clients() 
+{
+  client_context_t *client;
+
+  pthread_mutex_lock (&client_mutex);
+  /* terminate all clients */
+  ul_list_for_each(client,&client_root,client) {
+    client->terminated=1;
+    closesocket(client->sock);
+  }
+  /* wait for terminated */
+  ul_list_for_each_cut(client,&client_root,client) {
+    pthread_t threadid=client->threadid;
+    pthread_join(threadid,0);
+    free(client);
+  }
+  pthread_mutex_unlock (&client_mutex);
+}
+
+char *ul_dev_name = UL_DEV_NAME;
+int server_port=15000;
+int server_running_as_thread;
+
+int server_init(void)
+{
+  struct sockaddr_in address;
+  int yes=1;
+ #ifdef _WIN32
+  WORD wVersionRequested;
+  WSADATA wsaData;
+  int sockopt = SO_SYNCHRONOUS_NONALERT;
+ #endif
+
+  ul_logdeb("Server init\n");
+
+  client_init_head(&client_root);
+  pthread_mutex_init(&client_mutex, NULL);
+  server_running_as_thread=0;
+  server_terminated=0;
+
+ #ifdef _WIN32
+  wVersionRequested = MAKEWORD(2, 0);
+  WSAStartup(wVersionRequested, &wsaData);
+  setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&sockopt, sizeof(sockopt));   
+ #endif
+
+  if ((server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) {
+    ul_loginf("The socket created error\n");
+    exit(1);
+  }
+  ul_loginf("The Socket was created\n");
+
+  /* Make listening socket's port reusable - must appear before bind */
+  if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&yes,sizeof(yes)) < 0) {
+    ul_logfatal("setsockopt failure\n");
+    exit(1);
+  }
+
+  address.sin_family = AF_INET;
+  address.sin_addr.s_addr = INADDR_ANY;
+  address.sin_port = htons(server_port);
+  if (bind(server_socket,(struct sockaddr *)&address,sizeof(address)) < 0) {
+    ul_loginf("Bind error\n");
+    exit(1);    
+  }
+  ul_loginf("Binded on socket\n");
+
+  /*  Create a connection queue and initialize readfds to handle input from server_socket. */
+  if(listen(server_socket, 5) < 0) {
+    perror("listen");
+    exit(1);
+  }
+
+  return 0;
+}
+
+void* server_run(void *c)
+{
+  int csock;
+  fd_set readfds, testfds;
+  int result,f;
+  socklen_t addrlen;
+  struct sockaddr_in address;
+
+  ul_logdeb("Server run\n");
+
+  FD_ZERO(&readfds);
+  FD_SET(server_socket, &readfds);
+
+  while(!server_terminated) {
+    struct timeval timeout = {.tv_sec = 1, .tv_usec = 0};
+
+    testfds=readfds;
+    result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, &timeout);
+    
+    if(result < 0) 
+      break;
+   
+    if (result == 0)
+      continue;
+
+    if(FD_ISSET(server_socket, &testfds)) { /*  request for a new connection */
+      addrlen = sizeof(struct sockaddr_in);
+      csock = accept(server_socket,(struct sockaddr *)&address,&addrlen);
+      if (csock > 0){
+        client_context_t *client;
+        ul_logdeb("The Client %s is connected...\n",inet_ntoa(address.sin_addr));
+
+        client=(client_context_t *)malloc(sizeof(client_context_t));
+        if (client==NULL) {
+         ul_logfatal("Could not get memory\n");
+          exit(1);
+        }
+        memset(client,sizeof(client_context_t),0);
+        client->sock=csock;
+        client->ul_fd=UL_FD_INVALID;
+        client->terminated=0;
+        ul_msg_buf_init(&client->msg_buf);
+
+       #ifndef _WIN32
+        f=client->sock;
+       #else
+        f=_open_osfhandle(client->sock,_O_WRONLY);
+        if (f<0) {
+         ul_logfatal("Error _open_osfhandle\n");
+          exit(1);
+        }
+       #endif /* _WIN32 */ 
+
+        client->sock_wfile=fdopen(f,"w");
+        if (!client->sock_wfile) {
+         ul_logfatal("Error fdopen\n");
+          exit(1);
+        }
+                
+        pthread_mutex_lock (&client_mutex);
+        client_insert(&client_root,client);
+        pthread_mutex_unlock (&client_mutex);
+
+        if( pthread_create(&client->threadid, NULL, client_run, (void*)client)!= 0){
+         ul_logfatal("Could not create client thread\n");
+          exit(1);
+        }
+      }      
+    } else {
+      // this should never happen if the program work well
+      ul_logfatal("ERROR: read from unregistered fd\n");
+      exit(1);
+    }    
+  }
+  if (server_running_as_thread)
+    pthread_exit(NULL);
+  return NULL;
+}
+
+int server_start(void)
+{
+  ul_logdeb("Server start\n");
+  server_terminated=0;
+  server_running_as_thread=1;
+  if (pthread_create(&server_threadid, NULL, server_run, NULL)!= 0){
+    ul_logfatal("Could not create server thread\n");
+    exit(1);
+  }      
+  return 0;
+}
+
+int server_stop(void)
+{
+  ul_logdeb("Server stop\n");
+  server_terminated=1;
+  closesocket(server_socket);  
+  if (server_running_as_thread)
+    pthread_join(server_threadid,0);
+  destroy_all_clients();
+  ul_logdeb("Server terminated\n");
+  server_running_as_thread=0;
+  return 0;
+}
+
+void
+sigexit(int sig)
+{
+  server_stop();
+  exit(0);
+}
+
+#ifndef _WIN32
+/*******************************************************************/
+
+#define EXIT_SUCCESS 0
+#define EXIT_FAILURE 1
+
+static void daemonize(void)
+{
+  pid_t pid, sid;
+
+  /* already a daemon */
+  if ( getppid() == 1 ) return;
+
+  /* Fork off the parent process */
+  pid = fork();
+  if (pid < 0) {
+    exit(EXIT_FAILURE);
+  }
+  /* If we got a good PID, then we can exit the parent process. */
+  if (pid > 0) {
+   exit(EXIT_SUCCESS);
+  }
+
+  /* At this point we are executing as the child process */
+
+  /* Change the file mode mask */
+  umask(0);
+
+  /* Create a new SID for the child process */
+  sid = setsid();
+  if (sid < 0) {
+    exit(EXIT_FAILURE);
+  }
+
+  /* Change the current working directory.  This prevents the current
+     directory from being locked; hence not being able to remove it. */
+  if ((chdir("/")) < 0) {
+    exit(EXIT_FAILURE);
+  }
+
+  /* Redirect standard files to /dev/null */
+  freopen( "/dev/null", "r", stdin);
+  freopen( "/dev/null", "w", stdout);
+  freopen( "/dev/null", "w", stderr);
+}
+#endif /* _WIN32 */
+
+#ifdef _WIN32
+//Windows service support
+void serviceDispatchTable(void);  //forward declaration
+void removeService(void);         //forward declaration
+void installService(void);        //forward declaration
+#endif
+
+int server_daemonize=0;
+
+static void
+usage(void)
+{
+  printf("usage: ul_ethd <parameters>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -p, --port   <value>     server port [%d]\n",server_port);
+  printf("  -D, --daemonize          run ul_ethd like daemon\n");
+  printf("  -v, --verbosity <sec.lev:...> set verbosity for SECTION. LEVEL:..., [%s]\n",DEBUG_LEVEL);
+#ifdef _WIN32
+  printf("  -i, --install_service         install service into service manager on Windows\n");
+  printf("  -r, --remove_service          remove service from service manager on Windows\n");
+#endif
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "port", 1, 0, 'p' },
+    { "daemonize", 0, 0, 'D' },
+    { "verbosity", 1, 0, 'v' },
+#ifdef _WIN32
+    { "install_service",0,0, 'i' },
+    { "remove_service",0,0, 'r' },
+#endif
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { 0, 0, 0, 0}
+  };
+  int opt;
+
+ ul_logreg_domain(&ulogd_ethd);
+ ul_logreg_domain(&ulogd_commands);
+ ul_logreg_domain(&ulogd_drv_eth);
+
+ ul_log_domain_arg2levels(DEBUG_LEVEL);
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:p:v:DsirVh")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:p:v:DsirVh",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'D':
+      server_daemonize=1;
+      break;
+    case 'p':
+      server_port = strtol(optarg,NULL,0);
+      break;
+    case 'v':
+      if (ul_log_domain_arg2levels(optarg)<0) {
+        exit(1);
+      }
+      break;
+   #ifdef _WIN32
+    case 's':
+      serviceDispatchTable();
+      exit(0);
+      break;
+    case 'i':
+      installService();
+      exit(0);
+    case 'r':
+      removeService();
+      exit(0);
+      break;
+   #endif
+    case 'V':
+      fputs("ul_ethd v.:0.1\n", stdout);
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+ #ifndef _WIN32
+  if (server_daemonize)
+    daemonize();
+ #endif
+
+  server_init();
+  signal(SIGINT,  sigexit);
+  signal(SIGTERM,  sigexit);
+  server_run(NULL);
+  return 0;
+}
diff --git a/ulan/host/apps/ul_ethd/ul_ethd.h b/ulan/host/apps/ul_ethd/ul_ethd.h
new file mode 100644 (file)
index 0000000..d575af7
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef UL_ETHD
+#define UL_ETHD
+
+#include <pthread.h>
+#include <ul_list.h>
+#include <ul_netbase.h>
+#include <ul_lib/ulan.h>
+
+typedef struct client_context_t {
+  ul_list_node_t         node;
+  int                   sock;
+  FILE                          *sock_wfile;
+  pthread_t             threadid;
+  int                    terminated;
+  char                          *msg_header;
+  char                          *msg_sn;
+  char                          *msg_cmd;
+  char                          *msg_data;
+  int                   msg_data_len;
+  ul_msg_buf_t          msg_buf;
+  ul_fd_t               ul_fd;
+} client_context_t;
+
+typedef struct client_root_t {
+  ul_list_head_t         root;
+} client_root_t; 
+
+
+UL_LIST_CUST_DEC(client,
+                 client_root_t,client_context_t,
+                 root,node);
+
+/* forward declarations */
+void ul_eth_server_command_open(client_context_t *client);
+void ul_eth_server_command_close(client_context_t *client);
+void ul_eth_server_command_drv_version(client_context_t *client);
+void ul_eth_server_command_fd_wait(client_context_t *client);
+void ul_eth_server_command_fd_wait_recv(client_context_t *client);
+void ul_eth_server_command_addfilt(client_context_t *client);
+void ul_eth_server_command_send(client_context_t *client);
+void ul_eth_server_command_recv(client_context_t *client,const char *service);
+void ul_eth_server_command_help(client_context_t *client);
+
+
+#endif /* UL_ETHD */
+
diff --git a/ulan/host/apps/uloi_browser/CVS/Entries b/ulan/host/apps/uloi_browser/CVS/Entries
new file mode 100644 (file)
index 0000000..7ccda2f
--- /dev/null
@@ -0,0 +1,37 @@
+/SortList.pas/1.1/Mon Jan 28 09:37:16 2008//
+/autodetection.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/autodetection.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/autodetection.pas/1.1/Mon Jan 28 09:37:16 2008//
+/fAbout.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/fAbout.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/fAbout.pas/1.1/Mon Jan 28 09:37:16 2008//
+/mainform.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/mainform.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/mainform.pas/1.2/Mon Jan 28 09:43:37 2008//
+/manifest.rc/1.1/Mon Jan 28 09:37:16 2008//
+/manifest.res/1.1/Mon Jan 28 09:37:16 2008//
+/preferences.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/preferences.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/preferences.pas/1.1/Mon Jan 28 09:37:16 2008//
+/prop_set_new_address.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/prop_set_new_address.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/prop_set_new_address.pas/1.1/Mon Jan 28 09:37:16 2008//
+/prop_settings.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/prop_settings.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/prop_settings.pas/1.1/Mon Jan 28 09:37:16 2008//
+/sd_confirm.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/sd_confirm.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/sd_confirm.pas/1.1/Mon Jan 28 09:37:16 2008//
+/sd_confirm.rc/1.1/Mon Jan 28 09:37:16 2008//
+/sd_error.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/sd_error.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/sd_error.pas/1.1/Mon Jan 28 09:37:16 2008//
+/sd_info_process.lfm/1.1/Mon Jan 28 09:37:16 2008//
+/sd_info_process.lrs/1.1/Mon Jan 28 09:37:16 2008//
+/sd_info_process.pas/1.1/Mon Jan 28 09:37:16 2008//
+/uloi_browser.lpi/1.1/Mon Jan 28 09:37:16 2008//
+/uloi_browser.lpr/1.1/Mon Jan 28 09:37:16 2008//
+/uloi_browser.rc/1.1/Mon Jan 28 09:37:16 2008//
+/uloi_browser.res/1.1/Mon Jan 28 09:37:17 2008//
+/uloi_browser_ico.res/1.1/Mon Jan 28 09:37:17 2008//
+D
diff --git a/ulan/host/apps/uloi_browser/CVS/Repository b/ulan/host/apps/uloi_browser/CVS/Repository
new file mode 100644 (file)
index 0000000..dfd0238
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/apps/uloi_browser
diff --git a/ulan/host/apps/uloi_browser/CVS/Root b/ulan/host/apps/uloi_browser/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/apps/uloi_browser/SortList.pas b/ulan/host/apps/uloi_browser/SortList.pas
new file mode 100644 (file)
index 0000000..9c306d1
--- /dev/null
@@ -0,0 +1,318 @@
+{*******************************************************************************\r
+* TSortList                                                                    *\r
+* ---------                                                                    *\r
+* Class for operation with the sorted list. Uses the base TList class.         *\r
+* Allows to add items in the sorted out order and to make fast search of items.*\r
+* Are added 1 property and 8 new methods:                                      *\r
+*------------------------------------------------------------------------------*\r
+* Property: Compare - name of the function of comparing of a type              *\r
+* TListSortCompare. (Look the description of a method Sort in TList).          *\r
+* The name of the function should be assigned before execution AddSort and     *\r
+* Search. If it is not made, is generated Error.                               *\r
+*------------------------------------------------------------------------------*\r
+* Methods:                                                                     *\r
+* AddSort -      allows to add elements in List the sorted order.              *\r
+* Search -       carries out fast search of an element in the sorted list.     *\r
+*                Item - the index on a required element. Can contain only the  *\r
+*                "key" values used in function of comparison.                  *\r
+*                Return - number of an element in the list, since 0.           *\r
+*                If the element is not found, negative value (-1) comes back.  *\r
+* SearchFirst -  it is similar Search, but returns the index on the first      *\r
+*                element with set key.                                         *\r
+* GetItem -      returns the index on the found element. If the element is     *\r
+*                absent,comes back nil.                                        *\r
+* GetFirstItem - returns the index on the first element satisfying set keys.   *\r
+* GetItemCount - returns quantity of elements of the list which satisfy to set *\r
+*                key.                                                          *\r
+* GetItemList -  returns the list (TList) the elements found on a key.         *\r
+* ClearAll -     clears memory of indexes and the memory distributed under     *\r
+*                storage of elements Item.                                     *\r
+*                                                                              *\r
+* -----------------------------------------------------------------------------*\r
+* Attention! In order to prevent of violation about sorting, do not use        *\r
+* together with new AddSort by methods Add and Insert, stayed from TList.      *\r
+*************************************** ****************************************\r
+* Can be used without limitations.                                             *\r
+*************************************** ****************************************\r
+* Developer: Ivanov Yuri. E-mail: i7@mail.ru                                   *\r
+* The information on other developments of the author can be looked on page    *\r
+*  http: // i7.da.ru (Russian)                                                 *\r
+*                                                                              *\r
+* December, 2000 - July, 2006                                                  *\r
+********************************************************************************\r
+Example of use:\r
+---------------\r
+interface\r
+...\r
+type Tdat = record\r
+     code: integer;\r
+     txt: string[50];\r
+     num: double;\r
+end;\r
+...\r
+var\r
+    ldat: TSortList;\r
+    dat: ^Tdat;\r
+...\r
+implementation\r
+//*********************************************\r
+function Sort_dat(i1,i2: Pointer): integer;\r
+var\r
+d1,d2: ^Tdat;\r
+begin\r
+    d1:=i1; d2:=i2;\r
+    if d1^.code < d2^.code then Result:=-1\r
+    else\r
+      if d1^.code > d2^.code then Result:=1\r
+      else\r
+        Result:=0;\r
+end;\r
+//*********************************************\r
+procedure ....\r
+var\r
+ d: Tdat;\r
+ pos: integer;\r
+begin\r
+...\r
+   // Addition of a item\r
+        New(dat);\r
+        dat^.code:=codd;\r
+        dat^.txt:=st;\r
+        dat^.num:=dob;\r
+        ldat.AddSort(dat);\r
+    end;\r
+...\r
+  // Search of a item\r
+        d.code:=8613;\r
+        pos:=ldat.Search(@d);\r
+        if pos < 0 then\r
+          ShowMessage('The item '+ IntToStr(d.code) + ' is not found')\r
+        else\r
+        dat:=ldat.Items[pos];\r
+...\r
+  // Clearing of the list and Items memory\r
+        ldat.ClearAll;\r
+...\r
+end;\r
+...\r
+initialization\r
+  ldat:=TSortList.Create;\r
+  ldat.Compare:=Sort_dat;\r
+finalization\r
+  ldat.Free;\r
+end.\r
+*********************************************************************}\r
+unit Sortlist;\r
+\r
+interface\r
+uses Classes, SysUtils;\r
+\r
+type\r
+     TSortList = class(TList)\r
+     private\r
+       Ret: integer;\r
+       ERR: byte;\r
+       pcl,pcr: Pointer;\r
+       FCompare: TListSortCompare;\r
+       procedure SetCompare(Value: TListSortCompare);\r
+       function SearchItem(Item: Pointer): integer;\r
+       procedure QuickSearch(Item: Pointer; L,R: integer);\r
+     public\r
+       procedure AddSort(item: Pointer);\r
+       function  Search(Item: Pointer):integer;\r
+       function  SearchFirst(Item: Pointer):integer;\r
+       procedure ClearAll;\r
+       function GetItem(Item: Pointer): Pointer;\r
+       function GetFirstItem(Item: Pointer): Pointer;\r
+       function GetItemCount(Item: Pointer): integer;\r
+       function GetItemList(Item: Pointer) : TList;\r
+       property Compare: TListSortCompare read FCompare write SetCompare;\r
+end;\r
+implementation\r
+//*******************************************\r
+procedure TSortList.ClearAll;\r
+var\r
+i: integer;\r
+Item: Pointer;\r
+begin\r
+  if Count <> 0 then\r
+    for i:=0 to Count-1 do\r
+    begin\r
+      item:=Items[i];\r
+      try\r
+//        if Item <> nil then Dispose(Item);\r
+        item:=nil;\r
+      except end;\r
+    end;\r
+  Clear;\r
+end;\r
+//------------------------------------------------------\r
+procedure TSortList.SetCompare(Value: TListSortCompare);\r
+begin\r
+   FCompare:=Value;\r
+end;\r
+//-----------------------------------------------------------\r
+procedure TSortList.QuickSearch(Item: Pointer; L,R: integer);\r
+var\r
+  K: Integer;\r
+  P: Pointer;\r
+begin\r
+   ERR:=0;\r
+   Ret:=-1;\r
+   pcl:=Items[L];\r
+   if Compare(Item,pcl) < 0 then\r
+   begin\r
+     Ret:=L;\r
+     ERR:=1;\r
+     exit;\r
+   end\r
+   else\r
+   if Compare(Item,pcl) = 0 then\r
+   begin\r
+     Ret:=L;\r
+     exit;\r
+   end;\r
+   pcr:=Items[R];\r
+   if Compare(Item,pcr) > 0 then\r
+   begin\r
+     Ret:=R;\r
+     ERR:=2;\r
+     exit;\r
+   end\r
+   else\r
+   if Compare(Item,pcr) = 0 then\r
+   begin\r
+     Ret:=R;\r
+     exit;\r
+   end;\r
+//-----------------\r
+   if R-L > 1 then\r
+   begin\r
+     K:=(R-L) div 2;\r
+     P:=items[L+K];\r
+     if Compare(Item,P) < 0 then\r
+       QuickSearch(Item,L,L+K)\r
+     else\r
+     begin\r
+      if Compare(Item,P) > 0 then\r
+       QuickSearch(Item,L+K,R)\r
+      else\r
+       if Compare(Item,P) = 0 then\r
+       begin\r
+          Ret:=L+K;\r
+          exit;\r
+       end;\r
+     end;\r
+   end\r
+   else\r
+   begin\r
+     ERR:=1;\r
+     ret:=R;\r
+   end;\r
+end;\r
+//----------------------------------------------------\r
+function TSortList.SearchItem(Item: Pointer): integer;\r
+begin\r
+    if Count > 0 then\r
+    begin\r
+      QuickSearch(Item, 0, Count - 1);\r
+      Result:=Ret;\r
+    end\r
+    else\r
+    begin\r
+       Result:=0;\r
+       ERR:=2;\r
+    end;\r
+end;\r
+//------------------------------------------------\r
+function TSortList.Search(Item: Pointer): integer;\r
+begin\r
+    if Addr(Compare)=nil then\r
+    begin\r
+      Error('Ôóíêöèÿ ñðàâíåíèÿ íå íàçíà÷åíà',-1);\r
+      Result:=-1;\r
+      exit;\r
+    end;\r
+    Result:=SearchItem(item);\r
+    if ERR <> 0 then Result:=-1;\r
+end;\r
+//-----------------------------------------\r
+procedure TSortList.AddSort(item: Pointer);\r
+var\r
+i: integer;\r
+begin\r
+    if Addr(Compare)=nil then\r
+    begin\r
+      Error('Ôóíêöèÿ ñðàâíåíèÿ íå íàçíà÷åíà',-1);\r
+      exit;\r
+    end;\r
+    i:=SearchItem(item);\r
+    if (ERR=0) or (ERR=1) then  Insert(i,item)\r
+    else if ERR=2 then Add(item);\r
+end;\r
+//-------------------------------------------------\r
+function TSortList.GetItem(Item: Pointer): Pointer;\r
+var i: integer;\r
+begin\r
+  i:=Search(Item);\r
+  if i = -1 then Result:=nil\r
+  else Result:=Items[i];\r
+end;\r
+//-----------------------------------------------------\r
+function TSortList.SearchFirst(Item: Pointer): integer;\r
+var\r
+i: integer;\r
+begin\r
+  i:=Search(Item);\r
+  while i > 0 do\r
+  begin\r
+    if Compare(Item,Items[i-1])=0 then\r
+    Dec(i)\r
+    else break;\r
+  end;\r
+  Result:=i;\r
+end;\r
+//-----------------------------------------------------\r
+function TSortList.GetFirstItem(Item: Pointer): Pointer;\r
+var i: integer;\r
+begin\r
+  i:=SearchFirst(Item);\r
+  if i >=0 then Result:=Items[i]\r
+  else Result:=nil;\r
+end;\r
+//-----------------------------------------------------\r
+function TSortList.GetItemCount(Item: Pointer): integer;\r
+var\r
+i:integer;\r
+begin\r
+  Result:=0;\r
+  i:=SearchFirst(Item);\r
+  if i >=0 then\r
+  begin\r
+    Result:=1;\r
+    while (i+1 <= Count-1) and (Compare(Items[i],Items[i+1]) = 0) do\r
+    begin\r
+      Inc(Result);\r
+      Inc(i);\r
+    end;\r
+  end;\r
+end;\r
+//-----------------------------------------------------\r
+function TSortList.GetItemList(Item: Pointer): TList;\r
+var\r
+i:integer;\r
+begin\r
+  Result:=nil;\r
+  i:=SearchFirst(Item);\r
+  if i >=0 then\r
+  begin\r
+    Result:=TList.Create;\r
+    Result.Add(Items[i]);\r
+    while (i+1 <= Count-1) and (Compare(Items[i],Items[i+1]) = 0) do\r
+    begin\r
+      Inc(i);\r
+      Result.Add(Items[i]);\r
+    end;\r
+  end;\r
+end;\r
+end.\r
diff --git a/ulan/host/apps/uloi_browser/autodetection.lfm b/ulan/host/apps/uloi_browser/autodetection.lfm
new file mode 100644 (file)
index 0000000..6ad8f00
--- /dev/null
@@ -0,0 +1,30 @@
+object fautodetection: Tfautodetection\r
+  Left = 468\r
+  Height = 62\r
+  Top = 400\r
+  Width = 399\r
+  HorzScrollBar.Page = 398\r
+  VertScrollBar.Page = 61\r
+  BorderIcons = [biSystemMenu, biMinimize]\r
+  BorderStyle = bsSingle\r
+  Caption = 'Information'\r
+  Position = poDesktopCenter\r
+  object Label1: TLabel\r
+    Left = 8\r
+    Height = 14\r
+    Top = 8\r
+    Width = 384\r
+    Alignment = taCenter\r
+    AutoSize = False\r
+    Caption = 'Autodetection ...'\r
+    Color = clNone\r
+    ParentColor = False\r
+  end\r
+  object ProgressBar1: TProgressBar\r
+    Left = 8\r
+    Height = 20\r
+    Top = 32\r
+    Width = 384\r
+    Max = 100\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/autodetection.lrs b/ulan/host/apps/uloi_browser/autodetection.lrs
new file mode 100644 (file)
index 0000000..86709fc
--- /dev/null
@@ -0,0 +1,13 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfautodetection','FORMDATA',[\r
+  'TPF0'#15'Tfautodetection'#14'fautodetection'#4'Left'#3#212#1#6'Height'#2'>'#3\r
+  +'Top'#3#144#1#5'Width'#3#143#1#18'HorzScrollBar.Page'#3#142#1#18'VertScrollB'\r
+  +'ar.Page'#2'='#11'BorderIcons'#11#12'biSystemMenu'#10'biMinimize'#0#11'Borde'\r
+  +'rStyle'#7#8'bsSingle'#7'Caption'#6#11'Information'#8'Position'#7#15'poDeskt'\r
+  +'opCenter'#0#6'TLabel'#6'Label1'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'Wid'\r
+  +'th'#3#128#1#9'Alignment'#7#8'taCenter'#8'AutoSize'#8#7'Caption'#6#17'Autode'\r
+  +'tection ...'#5'Color'#7#6'clNone'#11'ParentColor'#8#0#0#12'TProgressBar'#12\r
+  +'ProgressBar1'#4'Left'#2#8#6'Height'#2#20#3'Top'#2' '#5'Width'#3#128#1#3'Max'\r
+  +#2'd'#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/autodetection.pas b/ulan/host/apps/uloi_browser/autodetection.pas
new file mode 100644 (file)
index 0000000..f2f1437
--- /dev/null
@@ -0,0 +1,33 @@
+unit autodetection;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,\r
+  ComCtrls;\r
+\r
+type\r
+\r
+  { Tfautodetection }\r
+\r
+  Tfautodetection = class(TForm)\r
+    Label1: TLabel;\r
+    ProgressBar1: TProgressBar;\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fautodetection: Tfautodetection;\r
+\r
+implementation\r
+\r
+initialization\r
+  {$I autodetection.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/fAbout.lfm b/ulan/host/apps/uloi_browser/fAbout.lfm
new file mode 100644 (file)
index 0000000..1a485fb
--- /dev/null
@@ -0,0 +1,803 @@
+object frmAbout: TfrmAbout\r
+  Left = 289\r
+  Height = 323\r
+  Top = 133\r
+  Width = 531\r
+  HorzScrollBar.Page = 530\r
+  HorzScrollBar.Range = 521\r
+  VertScrollBar.Page = 322\r
+  VertScrollBar.Range = 281\r
+  ActiveControl = OKButton\r
+  BorderIcons = [biSystemMenu, biMinimize]\r
+  BorderStyle = bsSingle\r
+  Caption = 'About'\r
+  ClientHeight = 323\r
+  ClientWidth = 531\r
+  KeyPreview = True\r
+  OnKeyDown = FormKeyDown\r
+  OnShow = frmAboutShow\r
+  Position = poScreenCenter\r
+  object imgLogo: TImage\r
+    Left = 8\r
+    Height = 131\r
+    Top = 8\r
+    Width = 134\r
+    Center = True\r
+    Picture.Data = {\r
+      1754506F727461626C654E6574776F726B477261706869635259000089504E47\r
+      0D0A1A0A0000000D494844520000006A0000004D0802000000C1EA664E000059\r
+      194944415478DA64BB05901C87B5F7DB922C73CCB66C4B962C5C699999997787\r
+      99999999997976676699572B66CB962C63EC588E638C13FBDA811BB4939B9BC4\r
+      496EF6F526F5BEEFBE7A55FFEAEA99EAE9EEF9F539E77F4E4F0F00000F3FF1EC\r
+      3100780CD8BB0FD8FD3400EC03761D00F61C02801777B4EB08B0E7D88E761F05\r
+      76BF08EC3E08EC3A08ECDE0FEC01B50FB8E749E0BE27FEA5C7807B1E03F63C01\r
+      EC7E12D8F52C00BC0000FFDEC341E09E7DC0DE27FE3F023F056ACFBFF5F48E76\r
+      FF1F3D07004700E0E8BFF4AF8FEFDA0FEC7A0ED8FD2CB06B1F70EF01E0C123C0\r
+      FDE0FB07FEA517817B8E027B8E007BC195FD3BE77FCFBF4EE6DEA7807B9E02EE\r
+      058FFBECCE9BF73D0D3CF038F0D0F78087EF031E7A08B8F71960EF0BC0DE43FF\r
+      12787A2F00F71CF8BFDAFB6F1DDCD1BDFFD27DC777747F09F05025F048FD8E1E\r
+      AE041E2802F65501F73C073CFACC093C4D06C1F2B054058C2847537518BA791C\r
+      AF1940AA86D09A218C6E046718261887098621BC7E08AF1DC22A07D0F21E94B8\r
+      172DEEC7090788C241227F80C09BA02BE04C2D8E67A58BBD5C5954204B082429\r
+      B6384E96071042EB1055D98911B421B96D487E2752D0851282EA468212752184\r
+      3DF01D75C304DD30490F54D30BD30F20F4C368C324D18264D8F17C2749E40645\r
+      93F9D9EA2828AA248C61BBA024CB28DED88ED43621D54D7069335CD40AE77720\r
+      F89D7041074CD805074F523D40344E301D30811D26B68E0B35A31CD530593582\r
+      570F6214BD0849275CD40E15B44284A00648BA61AA71946901354835F410D41D\r
+      58553B46593729AC1C139D1A911C1F551C1DD71C9BD09E18539E1A111E6BC700\r
+      0F1C06C06B8EE7E8497C139AAE1DC1C8E054138C6AE98248BB60AA6EB8BA07A5\r
+      ED45EB7A71865E9CAE07AFDB59A2559D08792B4CDA0A17B72225AD6870296A41\r
+      083B3072F090A3342B861FA04A930C5996264A1105C9019ABB8D68A981ABCAC6\r
+      25A563E2F27179F5A4B216AAAE81A86A27553513CAEA7145ED98B26654513D22\r
+      AF1E56364E9A1B272CCD93965698A90B6DED27DAC7E8CE49960B23081224519A\r
+      2ACDD6E758BA198224394E767720CDD51073E9B8F1D490FAD4A0B27448513EA4\r
+      AE1AD4560EE8AAFA4D7543F6D6096F3F2606A1A691EC2C921347B0C304510CC7\r
+      0BC0E9CE3182A90FADE941AABA106A509D284D1FDE384CB58FD29D83545B37DE\r
+      D08AD4D4C3146D18733DD2540A31164D988F43AC45307B31CC5209D1B7C014C0\r
+      F78A01E0C1C3526B46669B662842688E83240A13C41128D33341738FD1DCE374\r
+      DF18C333CEF48EB1DCFFD608CD3144B1F591CCDD240BA82E92AD9368ED2058DA\r
+      70960E82AD97EC1A6306E1BC048217873123C3D4600DC25A0EB781AA84DB6B50\r
+      AE5AB4BB0EE9A9453A1BD0BE068CA711FD6FF91A91DE7FAB1D176BC7473B0891\r
+      2E52A48F1219A0878799C111961FC20B43F921A4308A97A7C9CA1C569C19A178\r
+      5BE1E65642B80617AA4478CBA0AE0AA8B71A11AA4344EBE1F136C4542B2CD301\r
+      4DF522B293C41C9EBDC010AFB0E54B4C59812A49E3795124233849F58E129DC3\r
+      04C730C1354070F6139C4364EF24278A14A5E182E4083DD08577958FE94E8DE8\r
+      5E1CD41F1830EE1FB41C18B21E1A341E1F50D54FA8807B4E00600960A9A37475\r
+      8CAA885194098A228D97A688CAE971A67F8CE51F650406E91E3082FA688E5EAA\r
+      1D543FCDD143B6B6E3CD2D386B0BD6D98C7337605C7528570B3ED484F33562BD\r
+      AD785F1739D84B0974E29C8D284739D25B8CF09F82FB8A61BE12B81F5C9E9CF0\r
+      9E187396C28265F040052C50090F56214235C8702D2A52878E82CB7A4CA49910\r
+      6BA7C67B18897E56BC9F19EA6706C6F9D1314E7082E38709C268711C298C4F32\r
+      037D144F1B25524B0C97A17D2761EE22A8A708123839193C35116CC0641A91C9\r
+      6668B80B1E9CC047B0F404839FE54A7202F5225FB3C4D32CF1B5AB5CDD2A47BB\r
+      C2D6AEB034ABE3B4682FD6D38170F61102104E06C29FEA23876AA1F62AA8AB0C\r
+      E23B090D9E80474F209345A854313C5C0A71D68CEB80BDE520BEC3FF66C735E5\r
+      E5EE558E790E274952B53318490A294EC085B1095E183CEF118E6F98ED1DE6B8\r
+      47399E212648D3D345F17692431DE4581B31DE848FB75332E0776EC2865A89C1\r
+      6E5AB88F11EC26B99AB0B6566AAC061F2D47F88B21EE12A8A702EEAB46056BD0\r
+      819D25D25F8B0AD46383CDB8480B3E02EEA78D186B27C54170DDF4681F33D6CF\r
+      0A83E0FAE9EE7E9AAD976418A49846E96628CB8AE239B1420F591220C86363C2\r
+      542F37D5BC73947039267C0A1939010B9E98F4572023B5A8502BD63F4C0E21D9\r
+      61B220CC10861882088E19C3B3D324419E2E9D672A97D9EA55B67683A5DBA4A8\r
+      56A19CA9016278901A83F20B1041A19B18AE18B79F1A751E1FF31E190F1D81C6\r
+      8FC03347E1A963D0F0C9317B03CC0A3C540700F71CE4EBD24C459CA3C92A9D2B\r
+      7CE31C5E18A72AA708B2344E9602AF335C1882098293021F28A8C007E17B2738\r
+      DE11867790161CA0C5FA68996E4AB683946DC1251B3121300DDB09BE01BA7F90\r
+      E9ED26195AD0EA3682AD0163AA8169AB20EA6AA8A611616846995AB1E626A4B1\r
+      19696841195BD1860EB4B90B67EEC25A3BF11630B4BB49A61EA2BE9BA0EDC62B\r
+      7AF1F201827490201CC470201421962DC3B2C44832178667A0886C345D8E1605\r
+      27F8F10166B4931A6D26C56B09890A6CA414E52F86DB2B909646ACA997629A60\r
+      99303C1381ABC3B3CD0C49862E01D9CD82A2C9E7188A25866A95AE5EC34B1740\r
+      7CC394C4303D35C12D8C72F35DA4582DCC530CF11F9B0C1C9A88BC30197D019A\r
+      7C1196380A099D18B3D74C1881076B01B0339099325C45842A0E484D05A5038C\r
+      EA82CCB64C5364C8F214519AC04A221871182D0961A461AC3C8412F9107C1F84\r
+      E59F6086C699C9516666843E3D489DEA27A57A8991015260821540090368A173\r
+      82A9EEC7F147C89261927890004A388417F463B85D7046DB24A91FC502358062\r
+      0DA2FFAF8630EC3E14AD0741EA81137B1184510C0941A613D91C1A9F174BC7F3\r
+      B3D985C55C2613B29B15623E99CF4473D874BA408FE7B9916CFF242B32C24A0D\r
+      30A7BB1899365ABC99E26F22D99B09864E926E88A687B2CD189E0DDC92A5C8D2\r
+      2539023F85624421D4E038C53F460A80113A42890E81A59612057732CECF831A\r
+      60A43AC8896A4CB418193B0C8B1E80460F406207E1F163D0E0298803B429E0FE\r
+      2A30FA9E172B83324D4CAE4B493549A92E2BD5E615A639957D596C9AE1A83354\r
+      5984220D93E521AA3242534569F2209835446188204A5065799A629E2C050336\r
+      8FE36711F400451CC1B2AD229D8FCA5750F94238018B2222F154249581677149\r
+      143A86CD23E38930B9924322C1B83C82584203150E9A0AB9A0D3AE3099C516BB\r
+      2C9176CDCE456D76A94649D329A97CE6B8528428C4D51B05D3EDF3D12B2BF6AD\r
+      29E54284F3CA9A25E3E64AB92C048C8C40F151040396191E278787C951946CBE\r
+      9B121A64472644C9315E649C19252916D8FA2D3C3F47956409BC3092EE8152DC\r
+      109A6702740F92A70FEF18247946981188300B95E42684D3839C643735D24A0E\r
+      D711A325E8D08BD0C00168F0102276149338890A15436D0D081D70EF4900009E\r
+      12499C726540A98DA9F5199D39AF3515749679916A4AA2FB37C705B563516E9B\r
+      131AB25C4D526299121B33026D56A09D16680A3C558E2DCF32C571A56986CEB5\r
+      CB555E85C244A150F253719D8AB7B5963CB3ECBD7626908B890B09E98D7341BF\r
+      957869D5E9D4C2CF2D987221F6D979FDF5D3F6EB1BB65BE75CB7CE793EB83375\r
+      63CB71E75208D4EB97C39B53323EA602D1F9A49258696337BD7D5A7FF79C3E26\r
+      6FF9DDBBD11B59DC6757D47796C45717ED71BB5CCEA2909038125E44A69B1044\r
+      C30856479445216C37521826AB66709239B460092F3A4F126D120569B2284C95\r
+      44E9F204439122C992487E04CC98717660941D1A61870739D1216E6C889F1C16\r
+      A406F8994672A40C17380CF5EE9F70EF87FA0E427D8727EDC7C6340D08CD4E3B\r
+      0D004F48652EB526A833C40DC6ACD93E6BB62D986C4B4EEF96D9B1AE36CC8BD5\r
+      39502047A37BDD1ADA32F8560CEE05AD635E6D99511873326D4AA28A48E51E99\r
+      D4AA94E9D56261C267393B179A8DA89662B298199D772217BCA8F3593AA88273\r
+      FC4C8AB411C59C4D116F14585FDC76BF32CFFAE125D56F7F107E738DFBE61AFF\r
+      B39BA68FAF19C13797BD93B7E7B9DFDF9458A9C727CB014607406F0316F40D2F\r
+      C727AE05FB5E9F1A7B2333F2873BB297930377960877AFA8EF5EF3BC7636B839\r
+      ED4DFA6D121E6F12822031F970228BC8D38B8C5302DD0A437186A5B8C9565C65\r
+      2B6605BAB4C45C50381794CE65B163816D2A50B5D338457A4210E9A1793A28AE\r
+      2EBA7740101F9365279405D0979A68B1128CEF30CC7D10E63904751D86588AC6\r
+      417C2AE0FEA33BD1A7D6044CE684C194D6E9D326EBACCDB96A779FB63A4EDB3D\r
+      E79D81ABAEE0359BFFB2D1754665DB949B97F49E75AD7B51639F539AA7E46028\r
+      68022A8D53AB31B12894B8D792B04BE702D2451F5B0829BA3D2B7FA5C00FF2AA\r
+      FCDCB2794BF794A6F96C68222EA9FAE4A2EC8333FC2D6FFFA5C8C8AABDED7264\r
+      70CDDEB26A6BBE9E18B5119ED2211ECEC84AEFE4D09F9CE17D754D7EDEDD23EC\r
+      022C8847C855C0ACE4F80D5FFBDDDCE8C78B931FCE0DBD9D6ABF3BDBF7F274FB\r
+      B5E9EEF540EFDB1BE2CF5E8A7CF1C6E2CDB550DA2B7618E92A3945A6E0CAD43A\r
+      A13220D32FAACD37A5FACB3AD7A6DEBB6CF0AF1A821BFAC0BACABF2EF3AE89BD\r
+      EB54D32C4C92E8A2B81A7196168ABB97171D914E81F88684D94E66A29A182A42\r
+      7A8FC03DA04E406DC5107D2388EF5FD1F7A44A1F35D9A6B5E6AC523765B02DDB\r
+      DC67ECBECB7ADB5983E392DE7955E7B8A2B25D545A2FA8ED57B4CE4B12F3AAC8\r
+      342BD04F093431B1DA2755DB556ABD4E2D31C8693A1E54416C8D294733AA8177\r
+      97446F15185F9E575F8F214DA8E761258078F021461BB06CECF4520E9FF30C5C\r
+      F20D7CB042DBB4B6856807362DCD5BB6E634FF685E5AF4761EB66AA8BEE4ED9A\r
+      9797BE969CFCE12C5E33B8C730B6D70E7D007514D8D494BD19EBF9F606FBA72B\r
+      93BF3883FEE9164C0501E2B2A7B28A6357A363614EA5195754D00DBDBDAE588B\r
+      A0DD8A3625B759239BD0AAD84683CDED9EF385CED9435BB6F0195BF4AC3576D6\r
+      143AA3F26D889C2B6CEB224E951FE5834D98AB016B6D2679BA39D161C9F4A82C\r
+      DFCF4E7452C3D5D8C029B8E718C47B74D25534692F9B3034C335C0BD60DB0CEC\r
+      93AAA36AD394D29095EB670C8E0DBDE38CDA7C96295E24F36651F4A9095C620C\r
+      9FC2B0E779DA8B1AF7CB6087495715C0AAC15285F96AB740AEE509D85C16B2B5\r
+      EA69FA648993DB326B1CDCB40DBC96407C3043FC7489F1A737FC6FCF72460F03\r
+      9013800579087A1C9857B638B12F7CBCCE4F714F7D73DB722D30BCA8A8F97089\r
+      1AA11EBC151D3D676D9E979DFA6C8D0A827B2B0DBBE4E866D600D24EE0AFAF5B\r
+      E8D5408177E427AB845BFED6D722ED6FC43A2C10005F074847F7F2BBEF9D9777\r
+      4ADA1F1F780A401D07ACF0673F58A72D3B9B669CAD57179957D74C85B831ECB4\r
+      BB9D31837D46EB5A35064E5BA3E72D918B32D71A38C340B8D12146A093EC69C4\r
+      D86B318E2692BF831DEF17E54624337D8C780F25D6448854A2822588C82958A0\r
+      14E6AD81D95BA07A606FF14EE3C25346859A9448332D37AFE85D17F8EA151435\r
+      DDD4671A4044B1DC1586FC22557E09CDDD18232F0CE0B264C51A413E4392A541\r
+      1766A99CA0BDC29023437DA5C36DCF0BD0A7B484E32AC8930BAADA05D1A92F97\r
+      08B7BC037FBC13FE604DBFA019C756ECA6373F48A802680DF7C639F5016AD94F\r
+      CF6AF392C67767181FAF0A03A4A3973D6309D6A9757DA307FB548CFEE2A6A1E5\r
+      BA6FE4E510E4B4BE23CFAFB81582868987A855C02547E79DF8E8272BF8CBEEE6\r
+      00F985AEA7015CF97363071EB18FF70E3F720F3807401F076288633F5920BD91\r
+      EA7B75AAF7079BC4BB9755AF6D99E7A34AA5802D550578EA29A17E56E15855BB\r
+      CEF08C4B704EBC0BE36845D91B90F65AB8AD1AE9ACC7075A68C96E6E7E50303B\r
+      C4480D51D35DE454132155854955A0E2E08C5407F7B640CCC01EF068F73FC7D5\r
+      F8D9CA304F9D56DAC1BA7619CFC9D7F75A46B15344C139A5FDFBD6F0A71AEF0F\r
+      99AA9760F4B53EEC1456BE8992CD81831D53E5E349D5241262A0F344CD7100DA\r
+      F6988E5C723A08F3D08ED19B804579C5A6AAEAAB2DE1CFAFB95ECF49B63FDB84\r
+      97EFB2E04A595D4F404B8194A8FD8C1B712D4A7C6F497C2580BC1EC6DC9DE79E\r
+      360DE4F8D5797E558C5AA41C78D4813AAA1A795E0739B46E1AF7E28B13CC72FD\r
+      C863F42A20C33CBEAAAECBB08FBE1C1E06831A56FCD4C4B1834500C02D2D833D\r
+      FA582700F4EC06E0CF01BC2A40DB0DE87A00511B1066BCF8DE69F55B97632E8B\r
+      822773938531223F46976678DA79BA62069CCDBBD0D64684A50E69AB46D92B91\r
+      AE4AB4AF961069A6653AD9D3DDB4743725D546CED6E3B395A874293C5A060954\r
+      4D3A77F0ED5CAC071E20092502A39BA30E888DB34AFBF97E48A8BCC502C1AF73\r
+      E477562F6CDF7863DB9FF84A697A5BA0BAD9054F7650A7C7A40514DF23549808\r
+      903ED67825ABF7F98143808F5E9290D46D05262F441137B2843963F79D69D207\r
+      EBE2EF2F087EFD5AE4DD55C5D9300EDB728F0C79500CDB4F1F78D4CEAA787B5D\r
+      3A6F1EBC9925BF9AA5AE1BFB2E39C6EE44F0D71D48D3F08B5D4F024347767107\r
+      4B474A1F65F41EC5D73F2AED795ADDF7C87573EF6DF7E0797DCBC70BB4554D4B\r
+      DF0160B4E4FEFE171F187D02807C0F403E02409E007A9E045A9E04602781CE07\r
+      8065D293D745C7CE49ABFF7677E6CED529A6982D34C5C0C98AA72B80D381D2BA\r
+      A6736D3154850192A31D07CE979E46AABF92E02AC5792A08C15A52B49614AF20\r
+      44CA71D10A42BA04953C0E895663B2CDC42C88AF196A04769F02F1ED46316964\r
+      9192283033E529B672B965C85DDA6847512FD085AF8532DF2E6E6E87D3BFB27A\r
+      3E96A86EF520529DB4DC303FC3D1C5A05038B2AB1C5EF908BDF121E409204AAF\r
+      5CB38CF8D8950B8E510DF66852D5EE6196E7D45D5B5ED8F64F963EB968B87B56\r
+      2D863DC718790CDE0AD0461E55118E64F4DDEB3E684ED3713D8A3D631B7E3988\r
+      BC9B63DFB0A1959D0770E58F8F9E7CA4FBC463C315CF436A9E0BF387B5E3873D\r
+      F083AF3886BE98A7BF93449E357583898FADBF67A0E2015CFB8B9ABE327D4729\r
+      BB78FFE8B30FD63FB3AB7A1F50F71440AB05FCFD0F7E1E41CD51ABFFFEC1D6AD\r
+      1B4B4AA743E49896B8D714AE4D8D6BC31ABCE48A5D573A36B0D27427D9D948B6\r
+      57129CA53847253958C748D410634508CF496CE0242E5C459DAEA1E4408295E8\r
+      641D3A5A31666986E9817BC1DA77FF0318269FC8D750441E96629A2C98ADEDB6\r
+      BD58AE1946AE21C857F9AABBF6E02F2399DFBB425FB1452F774FA6DA5051AC32\r
+      0F25CA6110685BF17E7267D1D091BDE347F7B03B5F90434E2DD8113646859556\r
+      3A5C045871C72E0550AFCFB1571C23DB5FAFFCE0B46CD93DE1E157A39A77E33B\r
+      EE630D3EBE15420A061FBF16C34BFA1FBFE4812E283ACE9A465FF260F58387A1\r
+      45F70C17DD57F3343058F6D870E983115E6F8456ADEA7DE8A67B7855563323AE\r
+      74E00E919AF710BB9FECAB7E7CB0E620A4B2085652327AB4A8EBD08BF52F3E5D\r
+      77F80178F33E74DDF7846D4F0F3F0B04E8834606E4FA8DD313140A4EE1C7A9B3\r
+      A05D30D5798575C31CB8ACF29CA51B1607B9E1569A170CBD2A6AA043541854AF\r
+      76F266CA70A12284136CF44E22BD1598580924548B8C0DB2F25061AE15AE051E\r
+      2E0580DD8F3024268EC2C75527F89A79B27801C4F7E80BCCA6BED418660BCBB8\r
+      C953BE67F27C25D5BC3F86586BED0B4F5232385E08451436D6D6E83804526F0D\r
+      6FA4B3F9D947704D6576C624A5EFE0993815D304B868459347819CB84905DBF7\r
+      CE86E807A7259FDFB0FCE5E3FC4809A0801FB4914A667403C3478020B35A0F3B\r
+      9415B5725A1EE0B6DE1FA557FB702566C8F1C91300B5FDF9C9EA47BA8E02F0EA\r
+      87898D0F0DED07F82DBB6294630549CDCD24CE4A015DBE11377850C98770A928\r
+      0A14831BC41146280C145BC460AA85540975C4C081603B2B5EBC1F18ACAFEE6F\r
+      6F0DC6C35881AC87A26B27DA3BF1B6319A1F2C7C4AD739B9E702CBB63EC48F37\r
+      D383E5044F2D3DDAAF5C865B2F8D6BCEB473F28DF4480DD1D3CA4CF60966DB89\r
+      A9565C749C3D059A67275C013C0C96DC5DFBC4DA98489B64CA923BB712A54B3D\r
+      90F0534738476BCC1DE3B3FD88B511E4169272AD6F62A5AA39D1D11F67F267C0\r
+      D9AEBB6B60B0ABC5A6E08A0948BF4C836C1D2A7BF240D7A9E3C4FE62E6F84113\r
+      E98811F50CD87018469FF2304F08218F7E7041BEFDE5FC972FD9CEFA511DFB00\r
+      F5F8417AD3C30E4CA9A4EF5969FF73B80A400F3DE22294F41F00268E0282EEA7\r
+      25C387C4634759FD2F741C04A0957BFA5E00709500AF7DEFAB194294571D16B7\r
+      091045F0BE036A295422A729743A8536CCE28511680B14A1A6B3946A8D2E18F2\r
+      A8D4B2FDFB8F9694B721F0A2A9E5CB5CB5A57614DD46363610EC607F0715A445\r
+      CE73C6D82BCAE035BA65B3831EAEA7F8C1AA57460834737203F2CD21D9560F7F\r
+      0E6D5A23D8D6E499D72CF3EF0B3CD76182FC2825388CB70E6394C09EE7C1BEEF\r
+      80CA5C106A327471922EC9B1546B44C152F390F7B1C3ACE375E6A27AD7893A77\r
+      555BACBC295ADF9941135704DC44C89D3E76E0392E1531D2556751CA9D2AAF5D\r
+      1EEAA91A39B9EF1013DEAA2457BC7F4EBA6A6C3EA7EBFEC579EDD7B72C57F3B8\r
+      B8B27ED6D2FBDB37C2DF9F178FBE089861A7344387F1A5F752EB1E71616B88B5\r
+      0F6BA04523C70074F55E56FB13D8DAFBD49013A345C078C9AEA122A0F7203074\r
+      18508D3F4F6AD8335604A09B1E724906A5F42EBF8BEB0BEA4C7E87DA0B4EE273\r
+      34C90C929A84117D38968526314248EC31126F926EAA19E6C3F9519C34DA8713\r
+      7711A4F5444B2DC9D3C38EE30D6B8AF0CBDAE86DA6E5CCA428D74209365043A0\r
+      6314630265F87803BDD0CE5A6C674C531D9B82D039F7CA7BA90B3FF5CDBF6F8C\r
+      DDD4072FA95D2B4CA917D8F52498BC87C1699F234B0A75798176810E8E848633\r
+      04E1427997BEB2DB5ADA66ABE874B70EA57A260B93B84DA1F49C5614622231B0\r
+      8126F868038B0213B2B91E5BCE655A721B676A4FD6D71CFBDE68FDDE571728D7\r
+      23432BE29AF77394B7D7B93FBCAE7A7599FDC6B270FB57172FF80886C9A2BEA7\r
+      01CCC9FBB5236598D247B5131584FAA7A1E50FE25B9F697C06D0A22A70F50F93\r
+      9A1F1B3E0E80049115F70C1E013035F7F2C0389D38BE1E60853518397394CF82\r
+      F104E4C46CCE995B14FB6648920C8A9640535338661CC3F1C139F6318E6590B5\r
+      13656D8460072134CC8A958FF0BAE8D6528CB98CE06B6327208A45B2E93449B7\r
+      3E299CE961241A48E1065ABC8A1C2FC6474A30F12A42B69134D342CA40E559B2\r
+      29AF8A5F72155EF3CDBE9D3FF3C9F95B3FBB7CFBA7A9C23960D72360F41DE229\r
+      E314BE5FED58965B97F1BC285335C7542FC91C97A9B255247316C75B66C82E30\r
+      A49718A24B42D1A243EA9868AC94D146B9E4019B59E47279F4FAB44E33E373AD\r
+      8858F2918EA2238F004AD45337E3A36BF2DA2BCEA19FDC347C76DBFAC32B86B4\r
+      A6E7EB9B91FF7A6B9E50F928A6E4F1CE2700517719ADF138B1F1E878C9D3FD27\r
+      1F81361CA8780A183AB997D4FA0CAAF6111FA353367A1C55791FB9E909D1D031\r
+      1BA53DA3232D8535418B44AF1685A32177146C41DC96990BD6DC3547E4B2C5BC\r
+      A114E779DC38551C2369B223A2583B2358017334E3229DA4443DD2550ED1B432\r
+      FD20BB3272A88191ECE14D0FF3F2233C70562B8C88E6CBD1DE0A42A89C103B89\r
+      8914A3E395F8A93A7CA10197E863F851F2A8C477DA9CBCEE9DBE3377EEA32BAF\r
+      7E7DE9954F6FBDF131B0F751B0F6BD4017F958D220681D3C6D86A79B666AB26C\r
+      6D1E34A69DDB79F219AE6E95AF5D674897A88279812026C6124EC78C7C5C0766\r
+      B2C6EB5129D5AA7074D9609C365B92615F28E59328A915ABFEC15FBDAADD32B6\r
+      FEF94DEF0F2F28DF3EA7FCEC65F75F3F5DFBF1D5D8DD0DFFF0E1875A9FDC55FF\r
+      C8EEC9E243358FDF77742FD071ECB9E2A7EE05CFE5C8F70011A48EDAF522B2FA\r
+      314CF5E3A486A7BA9E0770B54F93DB8FDA39708794EED12B1D16ABC1EC911BBD\r
+      6243906B4E89A3A72DD9ABE736DF7509FD69557CDA31A7D24E99D337B1968D76\r
+      76BA09E31FA4A4C6E8E9368CA706E3ACA3874F1203C5A4483525D1424F7733A6\r
+      FA59D3BD8C6C27284E0E0CBD224C10C457864B81F8EA09336D94A9C19DBB584E\r
+      B43421B4AFEB83175C896B859537AEBCF2F1F59BEFEEB9EF3100D8B39F2A7153\r
+      C42EBA3CC05086D99A04289E3E0B4A6E5F945AE6404B61C9536AEB92DEB966D4\r
+      47F44CDC68D533B74E8729A8F668D862B499240AB3D1124EA70A2E9B36EB177D\r
+      7033B411826555752BA68EFFBC6D37514FDEBD6C7973D398504FFEEE0767BB0E\r
+      3F3C7872BF183A3C595D49E9EB1DAB6DE82EAFC00E0E4E74753657944C7637F4\r
+      163F797C0F80A97F36C41B390400F58F03558F0072F4B04DC436C91406ADC360\r
+      8E681D530A5B5E6CCA730C79BA7541EF5B9BB6650CC3B85581E6AA279374CF06\r
+      A75E2299D787C585014A749C1C1D2304BBD19E7A62A8913B75921C2B21C7AB29\r
+      A9464AAA9D92E9A2A63B69990E7AA6835BA8A5654A09891262AA9490AEC0656B\r
+      71F956F2F4083F35C0F08CB24344455E685A53DA576DFECD58E6ECDAE60DB067\r
+      06807B9EA3881D4481952C765164BE7F118C098D699129A3B417F4EE39B5754A\r
+      A2090B156E89D26BD29A2D5C7454857DE7CA4CC2A331E9656EAFC313F41666B2\r
+      72317D29EF7AF57CF4FD6BE1252FF6B565C9BC7D24ADE9FEF3672BD316F847D7\r
+      6297A60C5913F7E0BD00AABBCD295358C46ABBCAA2171B5522BD55EF361BDC5A\r
+      8DC56D3646B4ECCE837B34C86662D34148E9E3FCA19AF6C34F3A257CABCAA0D3\r
+      B894FAB8DA36ABF36CE87C5BE037111AE730E2A8C19072A168B2E3C7CFA3616F\r
+      A894E7BC89C5DC05B5F734DF756EE74E9F600A43090D62DD7538EF295CB0849C\r
+      0455494AD580FE808D3663632DC4641B35D348CB56919365C464191984982EC5\r
+      A6AB71B966727E5898EFA2FBBB2901B8689A6D5893593735B625B36B36965C06\r
+      8087C0E87B8624B61284FFC227F53394518E3A21326405EAB8C294363AA79CBE\r
+      7C383E134BE65C6EBF5E210AEBE96F9F4B13473B636E7B2A12B1590DA1B07171\r
+      C19D0EF3E7136236A4E24C5A896EDF8FEADCB71C65405A1E660E1F610D15F59C\r
+      7CA8E5C8C365CF3FDC5159E2D09A750A8BD910D668435A7D4C63482A74319521\r
+      A631258C3AFB70DD31C148858DDCADC7B4B17B8B536ABA0833EE3359F43A8FD2\r
+      9092591614EE335ADF25501AE7193027882CB7456C3336B52A1FBFEF7A7FEDCB\r
+      F0DECB72E1D9704629F7CB2DF36AF3B24839C7114F53A4F9215EA692182A21C6\r
+      C0F82AC3C62A90916A44A81E19020936939295B868193E0A461F88AF049F2A46\r
+      27ABB0D3CDD44237AFD04C8BB49022A3DC69927285A35D11680A326DCAEACA02\r
+      C0C320BEA709221B41E4D861278FB15569AE2A2BD24C6B6D0B2EFFAAD59E5129\r
+      ED568B33150B3B2C6A0A7A88385AFBF3BB2F7DFECEBB3A8136EC8EA5A2C177DF\r
+      5CBB7AD69AF6407FFDA3B9F72FC45F9E0FA808E3D4C95616BEDD22870C973D0A\r
+      FAE9D17B81E7F600139D6D8DD5F55038C5199C67CB42246180A5CA700D799A6C\r
+      E7BE394F33CD1799AB5F785838568C6B7A86D0FC7CF593C070C5818B4B053E57\r
+      24507839FA69AE6D1D8C2991FDACC4BAA9B4AE182D730A81438FA64B5ED86FB8\r
+      0F78B3FDD8AB9D47AE223BB624CC88D2E0B64F992CCB42E50247B1C8D22C8F09\r
+      92653073193E0C1A6B29325C090FD72323CDE8782B3ED1444CD4911360F45550\r
+      3315B4E95262E624265E8ECDD49273F58C5C0D3955474C82993ECC988630D268\r
+      4684C074692D7100009D77CF3EBCD08E17B8A8B20838F3725479AE7246A49E95\r
+      28A614CA84DD9A8E043341B7DB67D52CE5FC3F7875EBB58BF9B4CBB09C5C0A59\r
+      A6AE6CDCF65B2DE7D76C5BB3D4FFFE8FEC1B6B42D168F98DE9C84A282AA652F2\r
+      399FD3CC6C7AE1BE0300305E79A2FEF081AEFA66B5D6C910DB71222F4995C1AB\r
+      0B4C1087E73CC7BE25749C957B2EE9AD593D17D97F02B8969622EB1F0B4A6057\r
+      E60211B785CD57E0040E9C228D37AC104D1B54ED0A533D2356E70C9AB85D6012\r
+      3675701FBACF0800EF353EF759FF8BAF8D1C5B83D49C3628739E84D3B926D26D\r
+      F2F46784F68B4455A183E2AA04F3171D2B8587EAD1896EF2F420A3D047CFB591\r
+      D39D9C42137BBA96355DCDCA9553B2C5B86409265541982A254E959373B5E442\r
+      0BA5D0472B4CB272387E96218AC9F53160D7533BB50F2370A0B86E82204411A6\r
+      59D219BE7C51AA5E315B36D5CA29AB3115F1A54C0A39053124A24E647DF25F7C\r
+      FAFACD339BB9E0FAA5E5BBCBE9CB295F60754AF8E625EEE978E7ED59E2DB73EE\r
+      25AB75253CB35ED80CC5831A2DB7F985475B9E7EF059009012491AB98E40978F\r
+      51B4236CF7B020362ACB4F2A1721AA15B86205295FC22956788AF048D35135AA\r
+      98D0FA28A3EF809D3BB09636E7D251AD3D00E55AC7C58909F90C54B58053CED2\r
+      14537C69542772185054FA91A3FA671E3703C0EDE3F7FC7AF4D0A7A3FBCEF7EE\r
+      CB223BFC7C895E5B10DBAF2A436F9AA77F604C5CE639566AF1A13254AC1215ED\r
+      24E720C235AC7C6B52B4D2C39CEEE2CE34303215D454392D03E22BC1274BB1C9\r
+      32C2D44962BE98345B455E68A62D0EB256D0E20D96665DAC5FE0CB42FF7A206D\r
+      CF0134DF0567B9D06C3F9E13A38BA6F9B25985764122CB9A4D79B32E62D339CF\r
+      2C2D7E7EF7CECDB3799D9070E7DAD9B38B5BF9F0F994FBEC6CF4EC667E56C16E\r
+      FFC14BEA6F3F09DE98A1DC59F49C894637522B4BD9D3C9CCCCD8E8C0B10780F6\r
+      038F759F3A429E9C140BE42CB1052370A214A9369AB793936861246A89E14642\r
+      A416EDAD45B847700A36AA075AB3372CED54624B42EA89BBB7575696E7F11C0D\r
+      4C101C12A6FB25D3A38A598C6686A1C9F364290DD7226CEB613DFB78B6F2A87D\r
+      37B0F604F0B3A1E77E0AD97F63E84066AC2ECCE1BB6C0BFAF0ABCAD8F7A5E13B\r
+      6CF3025C186A22FA2A31815A4CB09F95C36BCFD02C97D1AACD41DE6C3335598E\r
+      0F9F40EFDC5F2921EEF86F193103C65D2969E61471A6049FAFC04D37930B23DC\r
+      79947066E7475A8107D805E2DB7504CDF68022F00344B68F2E0872C561AED82B\r
+      95FB1472BBD9E462D35855A527CFADCF5ED8287CF38BFF988ACD247C0B85F8B9\r
+      99D8662E3C7B6E79311B548E74ECFBE4EDA92FDF5FDA9AB16D15A21797D66793\r
+      4B0147F6D0D3078F3FB5BBB3F4712169D867537BDC4E8B3B2A32C6C669568820\r
+      DACB0836E0DDE5281BA84A9CA39AE0EAC24B08901E7AFF8B36569D865C4C1B3F\r
+      FCE68D39BF2F42E27A47D9E90A94AF8E1E1D51CF4ECAD318599A2A9A62A2D4AC\r
+      D24AD389672C4F01D6BDC0FCF3C03BBD4FDD85159D1D2E29E0C6B30A43C4BB6A\r
+      095E13B8AEE0756B63DC781BC1D6467337929C1DF42054512018D7D1EAE571F1\r
+      CC002F57830B55E12360DB5CBAE32D896252A2989802554399AE24662A08996A\r
+      F254336BA65F340F55CD13B4D31C4312B86F3F187D27488230491822F1FD0CA1\r
+      4F654C830EC8159B0522BD4663B978E1EA4C2117F17B7EF9D5E7B964D0663025\r
+      834B61E7CA7474331F5D9A0A6536660B53210B0ED2381595FCE7173737175C67\r
+      5612B72F9F5F2FAC427B712F3E71A8F2F02343AD0770130D4226C66A3198AC3E\r
+      B13A20D04F495C1B0CF33A5C36D7CB4CD6E37DA528FB29B8A56E822BE3902DF4\r
+      EE846660A41A683802AC4CDBEDD6106876A3CC4215265E4B8F7749329D6CDF10\r
+      2B8062A5A9280BFA4495BCE890FA8507D58F01E143C056D7817313D5E9FEC605\r
+      B174CA1CF3793764F63344EDDA8464B697196F21BA3B993EF0E3C3E204C6B444\r
+      B09E86A9177BD9D9564AA2061BA9C6C52AF0897FB77E2749A0D220BE4A42B212\r
+      1B079D1AEC75EA58D31DA2C2902C075524289A18B0F73970683BCA5367B12C17\r
+      866EE5C88268B262609CCC11E94452DDE123456C167F6569F98D5BB73EBA7B37\r
+      19F4A723E9747839EA592A244E2F4F6DCDA766CF2C2C6CCCC4DD7AA65E02FBE5\r
+      E7373EFAFED699C5D0CBE7D6AE9D3E831C441D7E7C7FC3F17DF0DE12F264A75A\r
+      C82864A6E2B159BD39E38D5FB6455FD2065F11396EE295678759F3ADF84C233A\r
+      D18B34F2893872CFE17917C2C2AEB6F03B7EF9C9AD58243F82328CB1661A4859\r
+      105F3D2B5C8DB7B6E26DA3E42816E721F452785D13CCB21AECBEC759FB1F7136\r
+      97A6A0237E343E24751AD559B6727E4230DB4ECB824D720B39DE4C0EF5F0D37D\r
+      A2CCB87C16AE5D85AA57FB798516D058F1895A5CB21A9FAEC467CA76EC22778A\r
+      04AA50429AAAC0A7407CE0128CBE7A56A14D90EF13664785118C2400EC01F1ED\r
+      3ACE1045891C179E69A170CC0CBE91C651B078F25FFDF60F1AAD716579E3AB2F\r
+      BF8E06225AB93A60F35934F64C7831E95F5C489FD99ABBB459D8B8BCB27E736B\r
+      E5E262824FECD92898B6FFF0A39B5BE98D42E895B31BE7E657A850D870C34968\r
+      DB49C268AB56408FF93C1E6748A70F5B9CF336FF7973E09ACA759DA9390F632D\r
+      F461A7BA51D9718C938E8092FA8EF825DD0ADC493DABF5CEC519329123D0E626\r
+      7933EDCCD91A46B2921606D31C8CA32172144A8A91694116D94A1E654D56F540\r
+      8BEB98ED032A04434DD19189360825DA414A5761D32598440521DD048E169CA9\r
+      1E41A15B58E8E1CF80535A0B35534F48D613D20DA4E91AEC54356EAA129F2B23\r
+      144A09332544B0E4CD95100BD5C4A95A6216EC601A18B3CDBCC50EE15CAF606A\r
+      88178172DCC06EB0A7B8E71496EA941BA695E60C8622571A7D729DEDE8C95212\r
+      8DFE97BFFEEDDD77DE5F985B4E84320157CC650ACE67D753C1F95460713EB5B9\r
+      39736EB370FADCFCDACD8DB53BE796C2668E9637FED507177EF5D94B373733D7\r
+      57A7DEB8B4B592F49347EA3B4E3D3ED4709889EC67E0207AB9249BCA67A65662\r
+      A93391D46567E88A44BF86A56587E1A1FEC9E0245487E8E910C26B58A3879823\r
+      070A1EEAA76F5F1CE81DD33A1627F9D33DFC853A56B682166B62C7BBD989417A\r
+      72889AED246786D97918233189B14E4CC82093D249B87608696B4387AA4170F8\r
+      C249E2420979AE8A31DBCA99EB11CE37D0A79A98B91646A18E345585495661C0\r
+      D0CB3552666B703355F8994AC26C3961BE8CB0584A5C2C262D961167C196A59E\r
+      3CDD409B69662FB4F097DB05F35D9C2C58B54769B69D27BD773F58C157243154\r
+      1392A800BB0A0253A436DB2E5CBB8621E02F5CBCECF387C3A1944C647498E373\r
+      D9B3365D6C2AB6329B5E5FCA9D01F16DCD9E3B3BB3766571F9F6D6CAEDAD3C15\r
+      D2C0C5B4FCFAD3EBDF7E7EEB3FDEBB3A1732BE7E36FFCA7A38A8428774E4A895\r
+      23A08C68C4A454CC65B5E863D154303C6D776545B2208E6899806827268D18B8\r
+      948D1887343E47EE3DA027374ED9A95F7DF00AE8D79DA3CC714E7240BC50C7CE\r
+      95D3126D825C0F285AB28B0EB6B8B932DAFCCEED394AAA131F6C477B9AD1C13A\r
+      4CA292305344583C4E592B669E2E63AE5750676B293B01588A898269D8489FAD\r
+      A716EA88D3A0EA49855A42E1FF8F0F541971BE8694DFD98C32534F9F6B602D36\r
+      B20AA047B7113DC364C7CEB3F2007044288F33F86EAED4C510681F7DF60560F7\r
+      3D6426FDE2F5AB814894C516783C897462CDEB2CA423E7A6131772E9D32BB3E7\r
+      37E62F6DCD5FBEBC72FDEAF2C56BCB9BAF6CAE5E594C7191EDC79F00324EC66B\r
+      6722BFF9E4DA944BB8993644B45833B72F66C2CE4704513B2917136D2E3BD271\r
+      D54CDE353DE549443D2EA7DDA8B718B40EBB39147185DC2A16A1BF484FED20F7\r
+      1F6D3CB48B34DE6ED69924FAE820C53B245968E416C089B59E3DD5C24A37E283\r
+      CDB44C0573E91865EE181E9CB49235C4442D2909265A0D7DE91475F50871F930\r
+      69ED247DA394B65042489763FCD5F820680255D4E93A5A1E84584DCAD65173F5\r
+      A45C352E53839FAE224C5712F2E5C41930E84A89F3A0C0956A62AE9630052E6B\r
+      C8B335B4F95A6AAE0E1F6BC4384728EE9DBF1D3CF858358E6A122A422295B7B5\r
+      77A2B56F1843A18D2111C15452AED1BB7D7199C2EEF72FF8BCAB91C0B944E45C\r
+      2ABEBA307B6E6DEEF2C6FC956B9BB75E3EFDCAF5B50B2FAF6F5C59C86CA4AC94\r
+      D18AD1C67D83B58F272C44236718DEF122C88235592925B628E9ED525AB398DE\r
+      CCA1D613D0E52858196CA27474A0B8AFA3A8BBE5D470673D72B4878A1C268CD4\r
+      19D82379074B47EE59F4C9A52448D0EDFDF8A7DFF6E00C23927C136FA6081F2D\r
+      2783B52C5481B03752A3E58CA9E3E434C8B48193070B5333A75049992E264C17\r
+      D3968E12E78E10664BA8F395D45C25310AFA3B681D0DD4443D0304972C46FB4B\r
+      90BE1A62AC819CAC2524C0B1AC96980681568176412A94936641812B205C30CD\r
+      C11804F1555166ABC9D3B5B86803CA394A05FBBE9D47840E0A15112C55C397BB\r
+      700C49715D8BC517D0DA1D228D4EAA3129742E953EAC334D9B6D4B0ED7199F6F\r
+      2B91D89C5FB8949F3AB3B678FDE2FAAB1B85F3E7E74F83F97B7DB560E4A31594\r
+      FEA00ECB47D77110D54C68958ADAA7A78D999850231B62E08C9B44E34E2DDC65\r
+      44388C508372984EA819EA7A7E62E02866BCBCABE6D9B68AA71988562AB45142\r
+      E845751CE7419A45F02E8B801AB05953B9D57E9CBA95E4AA22C50E413D65A478\r
+      1D2D717C54558536757022C570FD983CD7CB8B837D35277C7D503C5B4B8AD650\r
+      B32750916330DF31A8139C345A29817AA4A19F1DACC23A1B68D1066AA81CE304\r
+      3DB4046E6E65441A29812AACBB0CE56AA42541D065F83818CBA770C97AD65C35\r
+      18D484146820D5E43C88AF86926B20A6DA08C161B207D8BDF38CCB01813C4C66\r
+      9BE87C9340E9D0DA839FFDEC779F7EFD5BAEDC2050D9A43ABFCA94D45BE72CCE\r
+      0D87F7823B70DEE95F0A27567D81855462736EFAD2EACCC54B6B5756B3393E0E\r
+      C646F571D0ED76394C426C53D2BA15D46E39714082993031A901B928AA97442D\r
+      92B84318717243767ACCC304E5B310FD5692CF48E4E25AA15DC7F1A3D54E255E\r
+      CF87F1915D61053DA5133844F4B0C3B2B1756192AA6E235A1A28B17EC5E64954\r
+      A08D935D7CE7BFD8BED58A315633525833CEE9C0AAAA46B9635C7F3BD15E09D1\r
+      968EEB14D937FCA77F0C8EC9FDCC402BDAD08ED6D442244D786B073370725CD1\r
+      4A750DF2C33D2C5F2D5A5F025128A65E411A96CA31F66A62A086126B60662BC8\r
+      E90A302449C93A720A2C08B5D4996AEA4C2D35DF484AB71343FF07DF7E8ECC4F\r
+      1739B00C0D9EA561CBEDA9F9F3D1FC69AECA2DD006248684D29253DA1655B655\r
+      A5754D6E5E929BA68CDE396760399A3C1B8F9F9E4A6F2683536404A6F2E87E01\r
+      79424C1DB42B906AD6909633A2628E5247DB9963303E84CA8592199318360CAD\r
+      6632BD3A65D26336C958562553C5C58A6950250BCEC70DA1FB6A219DA542EAA8\r
+      920515A08604907E2D1126468FDBE402A7D38964CAE0929D842D41061A6959F3\r
+      EAC75F6E6FB39C538573B7E2735B5A57EAD6DDAF4962BBD89ABDF5C3DFF38CD3\r
+      BD68CDF937FEF3CD2FB63FFEFD364E1C3227CED93317688674E6D28F98AE2575\r
+      E64AEAEA87C2C09A2A792E7BF543B235FFD66FB7A3973E29476A1B28BE0A9CBB\r
+      9E0EE678A69A9268A0A61A69E97A5ABE9E3E53439BADA3159AC899FF856FEF41\r
+      1C534F15D86822078967415034108202C530B114618E3A21344CCBACF30AC7B2\r
+      CCB62C322EF27405A129A770CE19FDABEEC869B07D737BF20A99F9F8A1C39545\r
+      07834E995D4B09DA584E35D128421BF858167C4C8261AA490A2D4DA5A4C82524\r
+      91942C945205222A8F8523A146C6BA6AAA9B4B4F0D34D640BB9A479BAABBAB8F\r
+      F368935615C329E518288479BBE97C3AF293776E7FF6F15D1899394CD50E7092\r
+      4DE45431D419BCF8E56BBFDA663B62BFFBE7F6DDCF7EF6FE8F7FF9F537FF73FD\r
+      F54F5EBBFBB3F73EFBF6D39FFDED44E5D07FFE69FBF51FFEFAFCED4F739B777E\r
+      F2CDF6ED8F7EBF7EEBD3F77EB9BDF9C697AF7FF9DDD65B5FAEDDFECCB778E3EE\r
+      AFB75FFAF40F0BB73F37CDBC7CB09B3E204C34D342CDCC44032355418880E90C\r
+      0A6C77EAE9851A7A01B48E4652F27F25EFFD07895C33996F25091D24819B260D\r
+      C16976A6324D104448A218559EE580C8AC8BA058C6199A769AAA992229D32449\r
+      82214F90792E892A2090E84F9E3CD9D95E9D895BEC4666C825F65B045605C3A5\r
+      11DA1552158DAF654AD54CB99AA5D2098C26B14D2734CB591A2E494C45B1E868\r
+      BA8826D009156E8D3E62B1461D26210B2564C01554BC93CBD908F8E69DE6B72E\r
+      AFFEF8C3B7C2D9A9A6715203DC48B55D3939A48F9EFFFCA59FFE0121D17FF9C7\r
+      ED7E18EDC3AFFE6BEDEA3BDECCE9B73EFC4D7AE6E2879F7F73A4A8F9AD1FFCC7\r
+      7B1FFEBCA51761F44D5F78FDB31FFDEA9FED70DEFB5FFFDD1EDF7CE9DD5FBCF4\r
+      EECF549E82CC91F9E24FDBEBB73E39F7CECF5D8BB70E76507B98C17ABCA705EC\r
+      8AF8B33B3F9353E30DB4783D3D5D479FAEA6E5C111B8819868C507FE5F7CBB9F\r
+      9659131C7508C1308E13F454697C14671FC63971FC349A974471E328411C2D8C\r
+      2104A1719673806AEE26DA7AF0F64EB4718C621F276861641914473F515A3C38\r
+      DCE674481462AC4943332A981A114323E43AD52ABD802BA353680804761C4A82\r
+      11F814898CAD11B3F402BA46C4D4692556B5C04043D108502C1B4FE692892A39\r
+      C36516DB24222B9B1795CA5C5C7A50C7B5E9B99BE7B70285CD16B8BE93186E40\r
+      B8A6AE7E71FAFB9F9EEA1FFFDDF6767127EAFBFFF1DD07BFDA364436B65EFEE4\r
+      ABDF6D5FBEF9FEC992D61FFEE8EB976EBD5B51D773F5F58F3EFEF5DFDFFDC53F\r
+      2CA9D377BFF8F3CB6F7F79F9E58F3EFEEACFAB17DEBC78FBC3777EFCED1B9F7E\r
+      73FDFD5FB9666E960CF05BF08E2642A0973F33285EEF112E365022F5D408E854\r
+      B5B44C352D073A1288EF7F45DF9E2775FE3C4F17652842388E9FA39E85336293\r
+      D43845B688111420ACE42823384C77F5524CAD58651D5C5203D3D6234D7510CD\r
+      10C53142D4370E116ABB868E97978C417A644A8A488851CAC80A114D2F13F2C8\r
+      74199BE9D2B31D3AB24141960B08122E5DC0E230C82C1C828647B03854B959E3\r
+      B11BBD16AD351D8A2FE5F2F19087CD4445FD46B75269610ADC6CDEB4411D37F1\r
+      A52C845C257CEF27FF3977E527B5E3E0D12D0CEB02CDE42D1B862295A19343FC\r
+      26AC618C176AC3EA2BFA997C7D720C2DEC1FC2832D1781C4EFEC874E12042C7D\r
+      A89FAC2AEA4031C59E3108777894E18F2CF78D50482C3D58F70751C2418CA269\r
+      4C58DA27E8A58526250B93F2D3ADD4D94A740CC4D7400BD7D39375F46C2D38AB\r
+      D0A79B29E90E1288CF05EC3E06D6BE472CA16986C42331CE30A4798A6806C3CB\r
+      F1CDE7488A05B4243BC18B82A73521D8D1302FD8CBF477D3E35D9468C3A47A90\r
+      A01E23701BBA7ADA7BDA46473B11F04EA918A3D312CD468651C70EFBCD123E47\r
+      CCA118242883785CCE19133326D42272D0615C98CE6E2EAF5FDABAFCCAD55B77\r
+      DFBAFBC1DBEF7DF283F7BEF9F9D79FBDFF4E3A020E24A268C8AC13F3A366735C\r
+      A7CCDB1571133D68664845C4CCECC217DF6EE3A4D30324DF20C55CD137593584\r
+      68C4E84F8E69DB48FEE2214549BF648060EF8329A138358EA4C5E26530047768\r
+      824112B844D619383F3844B60E2265835041EF3887A7084308AA0184A8072E6E\r
+      9D10D48EF0AA46841D787B13CEDD800B80CD5D3536D1C69C6EA2069B68BE6646\r
+      14AC8660AFDEC64877D0627D54FF28191CDA0E03BBF6DEAFD6BBB4C629857641\r
+      A63DABB05CE799CE51B4F330690822F742555E982638218B0D70E3FDACE921CE\r
+      521F73132ED904BDAC1F8661F3D04454337EAC1CDD5724247438D4E8A897E171\r
+      91CD0E82DDCB36BBC53A2D43461971F2904606448C199091212601C521E7BB35\r
+      D298DDB03615BFB0985FCFC5CFCEC65FBFB4FCDECDD3AF5E5A9CCFFBA211533C\r
+      B1C331E416C61CD4B504376946D914588755F3C68F7E3680D70D53ED86E85624\r
+      B7EE4DAD8DD04258F5E9EA31EB1039CA502D7B527774F62DB122271067F4E625\r
+      9D7985CC8993F9D30CC58A2E748767394737CE43F9815EA289ED58442932831C\r
+      FFA438D5C3F09D1C53C1B4F3DD7CB053F1B67262C5184705D95747F57530BCED\r
+      547B37DDD3C3F00EF1C2DD64E718CB3B4436A359F69DFF1A03BB0099C22253A6\r
+      B8C23C99BD4412ACA1858549619468CD8E486D2D14652B45DFC70E0FF1A60659\r
+      B93EC61C547C05C25B9AA41B5852BE540821428AB0BD2F9818DD66D66040830C\r
+      591116E390D1386876C10D769C4A0E738A268322989737A1A7F4AB08BD1ADA88\r
+      923CC441B4B1106D22429F8C322426F58988BD46EE44D2CA5A4D687D5AB24B43\r
+      0A78C4761B4B219D08BBC8053F65CA450DD978AB6B8BCED42A587FEBA0F23B3F\r
+      FEDB9FFEB1FDEBFFDE1E63F85AD076866195AC2CD095D362C3CCE9CB9FA88DF9\r
+      58FA8A5C3BED089CE3ABF3046E92A95A84D2E363D4C008D53AC1B1527449B424\r
+      D485D7D64C8ABB08D656ACB197EEAD47EB4035E2F56D14CBB82C0CD7A5BB59D6\r
+      618EB309256B44C84698B621AA1929F04359768AD42F356777FE2C0DECB987A7\r
+      B070A519023B3F49CC8D52B203747F2FCBD1C3B676B3EC9DB4403B31D288F4D7\r
+      43ED1D38EB303BD8868FC244F9719A12CBA476F7968F741F9FEC386E648E3B04\r
+      10BF1AE6D70FDA352D4E635BC8331274229CEA1133BD560239C8E87B0A52B7B7\r
+      ED08D05D0A0C54DE53FD02D059B6A7743F50FC1CD055B977B2E3A9A1FA87BACA\r
+      F70C54ECB91265CCEB6111155CC319840D163BB4448B0C6D5633CE9C397DE39D\r
+      CFFB595E70F07AB69D77F5E3FFF9E3F6F6577FDCEEC00B4F8D113AC922FBCCC6\r
+      C28DD72FBD75F7F2EBDF77C6537A97EFE65BEFDEFCFE0773E75F5ABBF1B6D891\r
+      84727491858B2FBDF6C38DD3D796D72F73855AA5C63DBF7A757EE5862B385B58\r
+      BACA953AE6D76F9E7FF93D4764F6CCCDEFBFFAFEE7B9CD1B13748D6DEAFCE9D7\r
+      BF9CB97877E9FA476314BDCEBFA476CF3AA36B7B1FDBE9FBEE234B2C386E0242\r
+      991E224CF753D23D344F27C3DC413735E22CF5B0501B3CDD8D8C75C02DAD106A\r
+      13045735CA1AA01AC628DC2134ACB2F64475E981865307C75BCA348C31976C3C\r
+      6CE80EE86BC3C6EAB4B33D631B886BBB84138F92DA0176FFBDECE107F11D7BC4\r
+      E8034E718392523CDEBCB70D4459B74742298F9AC7BDEA7E29A54C30B15FDEF5\r
+      601877EA725C38EF1349E810B759A655880C466B6EED25C7DC9D0AB4BF893BD7\r
+      444FADBDFD876FB7B7BFF8CD77451D4395E348912FF4CBEDED3F6C6FFFE6EF7F\r
+      FDDD5FFFF8DB3FFF5E67D57DB7FDDDEFFFF2C76FFFF6DD7F6F6F9B43D12B6FDD\r
+      FDCBF6F6F63FB7B7FFF6CFFFFEF6CF997836E8096F7FB7FD973FFCCFE79FFEEC\r
+      BFBEFDFB7466E1EF7FDBD9606E7EE517BFFC0DB8E1DBEF7DA8F764BEFED3CE9E\r
+      7FF5DDF637DBDB1F7CFDB760EE4262F6AAD153001E3A0400F73E0CE3EA0709FE\r
+      3E5CAA8F3833C8CA7733DD1D74632341DB827577C0D26D23C9A61E73D72897C8\r
+      25AB9C22964ED389C6F6A2201022028641801DDF8BFB0E1C7DFA69784F8D105F\r
+      EF945504544702D2E74292FD71D1A9B8A0D849DE67C63F929617E7F47516FA8B\r
+      06FA112BB79483789E057F9E8F3BAE61D7BA94DD7EFD90573BE09477FB85CDCC\r
+      0AC036F2EC86831E357013016F225DD05BA3049E1327CFB53132A5C45C0377B5\r
+      4F3C7FE547DFFDF73FB6FFF8C77FD4774F16B70EBFFCEE277FDEDE7EE7FD8F33\r
+      D93CF8FDBFFDED6FA47CBE51AD7EE9F25510D6FFFC7D5BA534FEF39FDBA01C56\r
+      CFA71F7FBEFD3FDB37AEDEA610397F0789FE631B7CF9DD5FB693F1C2777FDDFE\r
+      E7FF6CDB1DDE7FE33B73FECAE6C5573EFAE2F7BFFEF336388F7DF3B76DF04AA8\r
+      6D29A921C216DB00E0490078E08909AEA913E7EDC66706994B63C285015E08CC\r
+      F9669CB609AA6B1AB077F65BE170AD56633C7FD6FBD94F566EBC3EAF7389081C\r
+      58EF44171C83EFE81A6F6E187DE1E923279E7B7CA4659F94FCAC95F33D3B6DB7\r
+      9B724F9CF95C4E7832C4782EC23FB8E66C3D1F1D9973F4CCBA0757A2E88217B6\r
+      1821AEA6584B09D6949718B3632256945B396E64364799752B0658444DC54126\r
+      143A0F4715C57283F5639A266CA8129FA9642C57D2670E0F28DFFCC9DFBEF9FD\r
+      9FBFF9D56FEADA866154C55B1FFEFCBD8F7E114BCD9B4C9EBFFF7507874C20E9\r
+      6BED7AF7F577413ABFF9F937780CFD8D57DFFFF2A7BFD1686CEFFDF05390D89B\r
+      6F7F343E49F8C73FB7BFFBFBF64FBEF87D309C932BAD7FF96E07A6D660FDEA97\r
+      BF065736CE5EB4BBC27FDFDEFEE957BFF747F3A1E45224BD52DD3482228A7154\r
+      39003C01000FEF9BE45B7A49DE5E0A886F61983BDFC30CF7D01D10BEA71322EA\r
+      1AE08878D60B6B2B3FFFE8E29FBECEFDE68BFFA787EF8072A250DB0EE58215CB\r
+      55EFEF55EFFDBCC2E72D202A45508465D9CAD6F46C7A9D2493DEDBA6D7499F24\r
+      93BA49B65776E95DA458A88214414010F5AA9F8A051114949B6F82FFFF9FF39C\r
+      9C3767DF39499E79DE363BF346BEFEAC7CF4486A60B05B04129B5A3A8964398D\r
+      665DB10CBF60EEBCCEFA7906E02F7EC5437E0013E6620AE033A3869727DC2B47\r
+      3CB523DE865E5743C6B42661AC4F3BB0391FBD18126603C2941740FCD2326CE8\r
+      4B9AE24ED022C1760B9B8EEF1D2DF51619326BA7105AB8D6B40CE75DCD429674\r
+      2597B27B1603032BC4BD73EBC00F3FFFA572E797CA2F3FBED64C9AB792F04A2B\r
+      C79D1E79EBF4675F5EAFA07AFAF2BB5F885D5C9154F7EDB5DB376E55A248F9D1\r
+      3FCF936A9DFDE3DB3FF9E606EA80E2E0C94B44A60C35BEBE5EF1444A7317AC10\r
+      282C28F3287436EFB94FBFB8F19FCAA65D7BF084AEDBB7AAE70355FAC1C36705\r
+      62DDAA7A3C992163F034D5F52398D97F6C17DBEA599E35ACD86A66762523FD2A\r
+      25B88AE25CDCC4E3292C23A303174FEEF8E1A3F16B1F84AF9F52DD3CABF8E19C\r
+      E587CB892FCEF71F3C302806E5389206477430585E3A8D67529392BE9A8C7B6E\r
+      5C796F44F087BCF8E921DDA23ECB8A3E6743C9D95874B5F40628390F19B67765\r
+      FC82944F9CF0C9137E15ECD3469C2AC8AA401170AA8E1ED971AB72DB9AECADE5\r
+      D8D6089015ACCC0A5AAA86955DC5CD2FA4C45F62676BA4852524C31B87CFA309\r
+      ECFAD79F2D6BC03EB7A27378CF09944F3449152777DDB8CB4E7D3B194AE47EBA\r
+      53B57174C1E2958DDFFE5CF9E14E65EFE15317BFB88AFAA0461B99F3FDADAA83\r
+      375698BFB4D61BCBA1F6573FDD56982C17BEF802F5D9B063D7D225AFB6B7E076\r
+      6EDB8B3288C63EAAD6BA46520791C7111AEED237F3F14EC052CF30D5D2DCABA9\r
+      F15A6ABA8698AA23055A294A02B5F38D1D812FCF413F9D57DF3AC9AA7CC0AA9C\r
+      E1FC728C55B964BF7E1179730364D2E9DBB0F2A6761B9EEA6372945A0D3307E3\r
+      4AB1C579E73369CD9FFA0C0BD6FB9BFB3D4D195BFD709C5C0E121137B114E3A7\r
+      2120EE15C041793A6EF43B6470C812F21A227E131CB2EFDFBFF5DB3B3F7E8366\r
+      FAA11DF3C9E6651C6425B7673939B28A1A6B00320B899E1798D1654278214977\r
+      E0FC37BFDCBAF3DDD56F5F7AADEEC59AB69D07CFA0BF7662EB5EB5C585CA0795\r
+      4B3B9E7CFEF22768DC4D6DDEF6F4B3F3C42AEDB55BBFFDF0CB6D95C170F6C2F9\r
+      AFBEFDEEE40767DB71443442BFFFF16728125FF0F292642E77F3B7DFD043185C\r
+      E6F92B6880DF1E1A1F0C87E257BFFA716C7823E44FA169F1871F2B80D848A449\r
+      3880E96EF0CEF81349D4DDCAD1AFE5385A3889566EA985DEDF494FF341078BD5\r
+      38D68F3BB27DF577476A2A1F75542EB12A6FB7562E83D70FD0B7214D56701595\r
+      88EB20A8DA2950270D22313512193B9BA4F5A76BD3CEB979FB7FF7D9970DBAD6\r
+      F441CD887BCD608A528A91520142292940A2FC444418868074529B4CE8E35103\r
+      1C336FDFDA7BE89D4D68F1FCB672ED7F2A15EBC0B68564CB0A6EB24E90AFA345\r
+      9A989145EDA695BC48A37160A90479B643B3F9836B3F552A377EAD5CFCFCDAC6\r
+      3D87771C387EFD4EE5CD83EFC3D9FE2FBFBB893268F785BFBBF1EB4FB7EEBCF9\r
+      EEE16E37E40EC67FA735108E5CB87CE9E6ED5B478E9F68E9C0FD76B77228B4C6\r
+      052F2F0D2591AB3FDD447D2C1EE7479F7FFAD39D5F06C646A0701215DDBBEF9C\r
+      369AA15BBF55AEDDAC1068B2058B1BD84213661A4ADFB427BB44562C5FD709D8\r
+      B0004C10F611B813146E194B02C540E396F1A6BDA34F9F18B9F7E7BD732BE729\r
+      9523A42F7A5FDC667FAA9B780FB5FE0932A18D2EB412B8701DC14B609AB8424E\r
+      21271E29E1A3B6E7CBD0E281407DDEB9BA1C6D48F856F4653A8AA90E24D29A4F\r
+      77A5606A3AC589C7589118BBDCABEFEB37EFDE99FCF9C6892B9777DCBAFDE14F\r
+      773E45D317BC6E6B2BE8236B0A74751F4998C0F1836B188ED5C2D01230F53C3F\r
+      3E8F195A77BEF215DAA6DCAEA0245EFCEC667168071A77D77FAB9CFDF8876F6F\r
+      56E3D1E482AFDF8D6254959F7CFBAB2BDA73F2D237A87DF97FAEFDF86B35C1ED\r
+      3D78AAA34B70F566D5C112C83EF9DF4B9972EB7777BB9F0FAFDEB8F2D31DB431\r
+      DA78E0D88BCB9B2E7C721DF5FFE66E569DD87664490DE1D5FA2E86A8FBEEADE1\r
+      98A768423B8EA7C10216AC304C1015F1DC1132A78727B289054D7DA9C53B4A8F\r
+      9F9F7AF4CEBE7F540ED47F9E9C57246042388C017B1FD8F52FA188CD55F9F022\r
+      A49E0A91F84E2E202C1774A3459A55FA748F7F69395097F3AC2EC6EAC2EEC5C5\r
+      54634FAA198ED421890E38DE99CBD091140D0A744E4D1A366DB0EE7F33F4FDD5\r
+      9DDB3638F6EE8E7E7C71DB175F9D298E8E8BCC718D7742E3592F369418B2185E\r
+      1A5A29F0CDE740CB34E545A23C37FC06DF3242E206B0343D856778767E8DCC18\r
+      166B839D7475075383E3E897AF650A4DB13A92B495A9A529BDCFBCDCD84857C9\r
+      1DA90EBAAC01C7E5481D649EE9BFE6D781C684DC969DB714B7B0968D05DC0AFF\r
+      802E36BA1407B608AD4D7CF3C226E6FC15C4BA4E10D046F59E128EDBFDEC4B6B\r
+      9F7BA9A58128A58B6CD5BD5018CC5F1862371E30E0500D8210569C69E394B01C\r
+      44AC0C4A404A39D97C70E2F5AF772FBFBEE9C59F8717ED00A6A7DA3171EA633E\r
+      E05F1A700D1BE410A5DD9DD254A728451305387C713163E84B9045C47B63E67F\r
+      C096977B02ABCBB13AC8B6301FADCDC30DF1404D2C501B851A7BD21424860F79\r
+      9B776FB56C9FD29553F41D539A84B77DF784E1C07ACF7B7B07E17854ACF02AAC\r
+      FD4ADB84D434C054A65A017F9322FA9A34D5DC3D522FEFE91022788283D0AEC6\r
+      51D444AEEED566663D41FCD26ACABC573A96B5F2FFF62A6EDE2AD2A20EE173AB\r
+      C80BDB042FE32428FEDEC479050BFE733969EEC296A5AB392B9A25AFD48BEAF0\r
+      E6C50DF205B5B257B1D6C5ADC67A6E786E9DECF926D59F96715E265A17B46956\r
+      775917ACE62E6F93AFC26BFFB192F15283A09E829E1BA04BECBABB716BDA3CA6\r
+      1422896C3889B3531EEC9025D7F2336D5CB883AAE770193D51CEA109C6679B3B\r
+      FE3DB8ECC6F0AA3DD24710ECC361C63F1C826512513309E47448CDADD244BB38\r
+      C59286793C4926ACEC81B0BC961941D5B336E15365A8A62FD608591667A1BA9E\r
+      584BD4BD3AE4A809BBEACB083513C1451CCDDBC6D4FB361A4733AC7D939AF114\r
+      EDE8A6EEA3EB1D27771693C1102A7FAA304912E5A960A11388B58A436CCF608B\r
+      3ED7A24A7729D26271CCCEF13AE846100BD09BE96A8E464C9509285216492215\r
+      5A2904099DAE15081D6CBE9540D12C5D4122338D588A9A2FF68112482E0B7339\r
+      CED65625B9CBDEC5F435B69B99E24C2B25C094979B6921B17DC32AB29FACEE7B\r
+      0567AFE3846A99680EA95E795A4E34AF20596AE9F6B53C17430D53C4EEEA1E34\r
+      943EBA248C17B9B1326F9B22D8AA883488A2CD827017182050F820A30DD1B59F\r
+      EC65DED8C2ADECA04F711E825AFE6C272FD6F36A01298EAC9674E81C6DAA641B\r
+      9810A813005F91F248CA0182863C276D7E5E47BD77005A399A24444D353DFECE\r
+      BE0825E16C0B9B9BA2DD6B8753FC9C9F9C76E236F5C88E6E761F5C67FDE248FE\r
+      CC16F7B175D64FF6653E3DB471B038A8D0212461A19953EC10F5360B90265154\r
+      1C1EA798B21409C46118712F3609E72E353DBF24BCAC9E7EDF13DAB92F299E5D\r
+      685EB04A36F715E693F3DDB524E0EFAFAB5F69035F6C52BCD2D9DDC0B436B2C4\r
+      4B5AE90B1BD003A9ABC99C660EB391076095B2AE6EEC6A80D6A163911D74B283\r
+      4A7675B41BC9543799EEE188E36C45B6911B6995E5D7F0E1465192691BC1AB32\r
+      350C7BBBD04704BD98194F576F11A288A04E81AB13F4B6CBA05659B851146A12\r
+      F82992305B641772C5321A36A526ED4780ABDB8C6570A9A7ABC121601A147C81\r
+      52445469B15A3FD958601ACA32631A14AB121E7038CEF482CF0D42CBD4E4FB86\r
+      430DEBD28C78F7DA12441D8079888B1C327744ADB8D1B43C6E23F546785B4ABA\r
+      B727DD5B8BAA8BFB9257F6278FAF775FD895BC7270E386A149A76780AF1D2249\r
+      8768BA51A2B250C3B072BA7304B18FCAEAE6B789190BD61CD0BB2B1F7C5CE91D\r
+      19AE5D1B7F69B9FD6FF3432FBDE67D79857DE18AFF6CDAAB7F6145B2956A5854\r
+      2BF9FBF260234531FFF55181E183F498A581225ADE265D45D03473C4AB699A0E\r
+      89B041A024EAB96BE5228249DC6503A80E1ECD21E078D84C3789E9264AD3CD20\r
+      82D796DB94F9D7E8FE062042D4645A051E5295BEAAFAFE42045C6B99A62686B9\r
+      91696BE1795B81100E8C37D26C78AE9326B0D1B96A0E1B5049C59E6E55CCEB56\r
+      001699C82751FA24C690D49A91D87B41CB88C4D82FD5448422B027632AC4A93E\r
+      DD8BC389668FE45F256FEB489A1BB17716A29C521280BD8C8887918404E3FD56\r
+      2422CA44C4937D96FD9BC33BC7ED67DECD9DD8133BFF76E6E281FC95239B778D\r
+      4F429EBCD539AC738E81D6A2DCD3C3318425960493E716737C729CB1FDB9D55B\r
+      2D7065DFB19B9B777DD63750F9E6BBD3D97CE5CC5974FEF23199FFB970A160E9\r
+      AE7CFEF9D747DECB9BAD957F7FF5FDB1531F6DDF5BB97AD3D5D8E5A9A73AD750\r
+      AD6B68A635345D3D4BD5C095350BE41D72094E2D22EA046433876A61D3AD2CA6\r
+      83C6711385A14E3052BD6C2C4BB5C933ED7204274F926461B612AAAE2644F31F\r
+      51606B631A5B19A636B6032F8088E228559E64A93234798C0C78097C5B757791\r
+      DA0DA81D1CA98B2749F0A419AE02E629ABDB5078AAB4505114ABB262998F0F08\r
+      90942E93A079CDAF8E674911ED8AA1086334238EB988C584A0844861881FF3F3\r
+      9211C9F890B727632866741BC7BC0776213BD6FB4E1F2A1C7D133EFD76EEE2A1\r
+      DE4F8F6FDB333905070A5060C41B9A3043BD0EB8CF95E8F384CB661D6203636E\r
+      8E8FF2AFB56FF80B95131FBE97C8EE70B87F3D78B828937DB273E78FEF1F1F0C\r
+      786F5C3A7F68EBC6AFCE9DFEE6DCD9FD93EB2EBF73286D75F47A83D78E9E552E\r
+      69342C5AAB5FDA6E788D60ACE93236B08CAD426DA754819549F12A2149CFEF32\r
+      71E93636CBCE66BB183C2F5918C083D5FD6D68556857643B9519BC2245514439\r
+      4A7F7571235A7D69422B9E6B22F26C28594C5994AD4C08741999A524326479F2\r
+      3013740172B754E793681C5CD04A17FAE9E21053EAA74BBD54D04303435C494A\r
+      A4444085572412A560753EC1095B6BD717D8194BCB3A1818CFC9610FB59C94F4\r
+      6534A9B0280181E9987A6A24D45FB0F7176CDB26A307F716F66C8E9D3B3AF0DE\r
+      BEF49983C54B27463F3DB3EB8D0D1B12A162283C118037B9632381EC6800EEB5\r
+      3B12DD8A90896985D836DAF32B77DBFD95FD6F81CF3DBF4365F87E72639A4AAF\r
+      7CF2EFCAE9B3EBBDFECAF90BC7C627BE397AECD29E7D3B73A59F4F5D38B769D7\r
+      C9B12DB78F5FD2BC4ED0AF206A5792D4355DAA350C547AF2B500D82611752AF9\r
+      781D87646475599874279DE562707C5D3C3FAA3E1C18ED9426DBE5990E65A153\r
+      9527A8D354559CA38030D39F40D5F727B40942BB5F9426AE0C422B80509B9618\r
+      F332435E6B2FEA1DD56762409547A272CA550EA9C6CB950704BA1868411111E8\r
+      C25C650450A6649A8CC114D56834E984AE88007167D3FA3C2F6FC58F47851339\r
+      342132FA92CAC18C2E1D922583B27CDCB0612C5648769732D66D93F163FB07DE\r
+      DE8E7C7462DDFB070A670FF55DFE60EAF2B9DD5B374C42BE9CDB37E20A4E59A1\r
+      016FBC3FDFB73111EB1D8027863CE59DE101FDEBAD6362F199A09F79EFC36F49\r
+      75EF757B9D4B567DD53F7E06294EAA4C9513E7B4B52D95F73F3C9C1BD2D563BF\r
+      DD75F8FDE2BA0260BCB6E7B4B189AD6DE2A91B79B2068EB8910B34F1B9CD42D6\r
+      5A09AB5345C7E9BA88660AC546A639290C3789E52370ABB1884AAF53966957E4\r
+      3B5425ACBA48D4E4A89A045B0E555782A2010CC81C5C918D2771013248A48A8A\r
+      5471B13621D1264D8EA22738E8F6F75AED298DDE2F9698193C8DD41855B93396\r
+      688F2D5134870A3A4F416BEB33DA4A4E4FC66EEBCE2474FD1971D2DD3195054A\r
+      0EEA48503491D1C26E762FAC1C48EBD321451252E6A2C64D23703A6428C4CD5B\r
+      C7E0F70E0CBFBB3377E9F8E4FBFB4AA7DEEDBD7876EADCD91D13E3C3565BDC64\r
+      2B59DCA30657C91EECB5BB92565330EF2B0F7B8ADB7D39F085A582BF3D29FBEB\r
+      E3CA87FE8FEBA9F9F6A75F903CF417C183CFC89F99EF58B426D3C9069E5BCC78\r
+      E605CDE266F5A226C93F6BB9FFF59AEEC536C13F1BA46B38FC461EB74980B2C6\r
+      6E0159ED721656CB2418A80423996C2176D909743781E1C3B383044E04C78BE2\r
+      C589AAF464B976454FBBB2D4A92E13D5F92E55B24ADFB4EAF3BC8FF1253636D0\r
+      CD113B78A08F2F0B722541BE2C0C28A24A43CAEA2E8662A399DC063831AC3740\r
+      54961A9DF0381ABFDC153145D2B678C9050FFBE0F56178BD3F90F77A1C485C3D\r
+      9893A4FD9DEBF382012F0BA56F3CAD819DAC725C3180183390221550E663A64D\r
+      23C94CD8D8035B50FA8EEE1D7A675BEEA3F7D6FD4EDFF9B313A74E6FEE1F2C6B\r
+      0D019521A7B70DA14160F5F7BA033D6E5B2AE5EA197497B6074B39AE28866FCA\r
+      E11BC789F4A13646A191BC85A74607A65EBA2449E47B9A69099A5CBEAC435B43\r
+      0E935549A6394CD604891A4D8300C42A78040D97A8611375ECBBA1CAA6DB994C\r
+      1795E921B37C643644E48689FC184180CEAF09BC288907935819F23B7D6D8A72\r
+      BBB28857E6290A98250B6230D57B9B1F4789630AEC2CB1872B0970652136DA58\r
+      49C3287E67D0EEE98B25A752E9498FAF20D706B12C133ADE51E416BED1AD74C5\r
+      BB43BD0178431CD9148E16C2902719930EE68559A87D2AC71E0AB20620FE785A\r
+      85D2F7BBFAB2410502A950D16D1E4DA0AFC544F7A6E1E8C1377ADFDA825C3E31\r
+      75EEE0D0E553E317CE8FBD7F667DB93FA7503B25AAA4D25846D388CED163F394\r
+      DCEEA2D790456C85616FFE8D64611F0C9D1DCC1DCE168E958737F8639B22C8FE\r
+      DEB19DA591C1587630558E39A3297F7630379E8B0F18151EBDD4E332C2665558\r
+      2EF68B450121E0E3F37D6C9E87C1F1D0B93E0AD7D725885080081988A1233651\r
+      942488D37810458A2049E1A548A72CD7262FB4CA4BE82B569A214AA3FF9FBE27\r
+      D9A01B9DDB38D2009AC8F82A98A38C715571B4B6029A24A849089511A92AAA35\r
+      A52DF6BCD95914EA932C4DB44B6EA7C9AD5C8D5BD60D77BB7B3D818164B20C47\r
+      BDA93838D423C8065BC6B3D43EA8ABE4678C6795B09BF97BEE43671224A4EC49\r
+      98B68CC3A8F45063FD00F4D68EFCFE2DA9CF3ED8F4E9A9A9AB57B65DB93C71E6\r
+      EC54B92F2D51580030225256ABBCD89042B38AD5D5EBB4F6277CE3497B7E5366\r
+      78C0EBDE82C47796FBC793855D435313F9FE623C9F08227DA5318F2F118A1673\r
+      E5F59E50C9E840ECFE92D29C64081D4A33C293A2B52EC8160719A20055087501\r
+      010A0091852192284A14C551A0D18A1327516051DD89124449026510A5AC4D9A\r
+      45FBE736293A812489E2304B16B83BF3FEE1AF5D4217516027036EA1314D02FC\r
+      5C1DC2D624D1E2CBD7223C6582AB88A1B12C9047C4CA48352D1A7A84869CD004\r
+      8B4C11A925AEB6A5CDF6B2DDD1E374464290154DE583256ECC5BB3B19F85385B\r
+      0763ECB1BC221DE0243CAC7242514C68E37E301351AF1B8290A8160ECA2707FD\r
+      87F614B78F07AE5ED9757877EAE33323470F254F9F1C2D16610050039210A8CE\r
+      550BBD2CCC53A3A71391EBCA26CBA0CF359408F617E0FC402AB7BD6F6A4BCFBA\r
+      75C8C850BCAF14E9CD47FAB2B1C14C62349D984824D645A2E3FED0A8CB3B6873\r
+      F69BAD2583B50CA860541C2C7984813615F2184795E0EAD20243012B08740221\r
+      145861142B8EA19D2F4E9C2080305E182488AA8D303ADA63E5593472C9AA345D\r
+      11E3A195F79E67D0CAFB7407CBD4DCA569A46859EA38431965EB52AD1C075516\r
+      61C8A22CF403E451BE220628E2227914902738328425ABD61DAECA27D484E43A\r
+      5867CC99CD69A3DEE9B4AB5D76520EA1F8ECCB870B5D616B4321481FEB5167C3\r
+      7C24202823EA12A28783B22C6C58371C4E4634F1907CACDF7760677E6AD079F1\r
+      D4C4CE49FF91375347DF499E3E3136DC9F512BAD4A555CA2C952045E82C04906\r
+      03E85742A72891AE4F63E9B77AFA3CA1422492CB040B597F1EF11552FE020295\r
+      D3D1A16C723C9B9E0A04FAFD81415F70C4171AF387D70522935064832FB6A13B\r
+      3862080C6A3CBD325B5E6CCE020684A74FF1F4699E31C335A4D95A84A94E5255\r
+      30591E25C962644998064228D0198C2889E365091468E452257E86C876F75F45\r
+      D39E6A63E8D1CEB98E246FA46951E085AE26BA01CF77A0D30855EC43831CEDFE\r
+      AA0294A0B20F734098258D55DB17A50754430A5D4C6F489BCD29B3D1EDB46B3C\r
+      2E5A06A1FBDD6B868AAC88B3A310E59710793CC08B7AF9E9B812896B427E291C\r
+      D6F717FD91803A1C500CF706DEDCD9B3613C78FEE4E49B5BE0A3070AEF1FCA1F\r
+      3F345CCAC0628196CF73A1F14B137B984A1F5668EB14B948608C26CF72B53DA0\r
+      B9A074227A0FECF167FDBEB4C79BF178D1462757AD30C1A23BD4ABB62635F68C\r
+      DE9537F9FB6CE161273CE14D6DF467363AE1715B74C404F56BDC3DD26E44A08B\r
+      725441A63C203225C5E6140AD082A0D394CC9695DB730A7B56A20F4BB521401B\r
+      E36A60861AA6ABE2D5E719E55E953138EB813F63E63CB980015A855A3F9EAB6B\r
+      A12BD710441D6C2D8E6B2201568AD04613BB59122F5FE20724011402302092C7\r
+      014558ACF2811A974CEB53E9C3063D623624AC26BFC3AAF7BA38F128C3EB6AC9\r
+      A5397E3B351994F4668C689F9C8AA8F2297336698D47CC48C2D9D71B85638E78\r
+      A47BB02FBA7B5BEFA675895347D71FD85D3AF656FF971FEF42FBBE8D23C37663\r
+      5021858492005D68A14ACD5D5233596EA3C8825439CC54A6B8BAA4D014915882\r
+      5677D2EE8CDBECB0C516337547F4A6B0DA1054E921B92EA0D0432A43446389EB\r
+      6D49832B6B71E7CDDE422039E64FA0DDC2903BDA6F0F96CCDE9CDE89A8ED09BE\r
+      CA03687C623D24358595D6B8DA99327832264FDA68091BCC21B5392233C14243\r
+      1CA55BA00D09D53E0A53FAC09C6AE3320733FB31CCB40730D31FC0DCFB3866FA\r
+      9CBB78B88A690FDFBD9CFFC7BB78FC2E9EA8E6CB198F61663E8899712F66FAFD\r
+      A8CF74CC9F67629E9A8199330383B9773666CE03985933318F3D8299350DF3E0\r
+      2CCC3DD330B3A755ED9928309819D330D3A661EEB907330D5335D0B7F7CFAEFE\r
+      E9910730F7CDC4CCF9DD1F839985993903F3E874CC533367FD1533EB8F987BEE\r
+      AF1E33FB7ECC1F1EAF6E4F99FE74755FFC2CF4331E9A8979F05ECC9CFB3073EE\r
+      C73C84E23ECC43E8DB7B300F3E8879E477DC8F7918C57D9847EFC73C3ABBFA73\r
+      1EFEBF98F64815557B4E7527C68C87AB98FEE0FFC303554EA6DD3F7BD69CD933\r
+      1F9C3EF391EA1EFC994F54E7DCE9285D8F3CF8D05318CCECFF05F488AA94F304\r
+      9C140000000049454E44AE426082\r
+    }\r
+    Transparent = False\r
+  end\r
+  object lblVersion: TLabel\r
+    Left = 24\r
+    Height = 14\r
+    Top = 200\r
+    Width = 36\r
+    Caption = 'version'\r
+    ParentColor = False\r
+  end\r
+  object LVersion: TLabel\r
+    Left = 71\r
+    Height = 18\r
+    Top = 200\r
+    Width = 45\r
+    ParentColor = False\r
+  end\r
+  object OKButton: TButton\r
+    Left = 32\r
+    Height = 23\r
+    Top = 288\r
+    Width = 100\r
+    BorderSpacing.InnerBorder = 4\r
+    Caption = 'Hmm...'\r
+    OnClick = OKButtonClick\r
+    TabOrder = 0\r
+  end\r
+  object Panel1: TPanel\r
+    Left = 152\r
+    Height = 305\r
+    Top = 8\r
+    Width = 369\r
+    BevelInner = bvRaised\r
+    BevelOuter = bvLowered\r
+    ClientHeight = 305\r
+    ClientWidth = 369\r
+    FullRepaint = False\r
+    TabOrder = 1\r
+    object memInfo: TMemo\r
+      Left = 8\r
+      Height = 289\r
+      Top = 8\r
+      Width = 353\r
+      ReadOnly = True\r
+      TabOrder = 0\r
+    end\r
+  end\r
+  object lblTitle: TStaticText\r
+    Left = 24\r
+    Height = 16\r
+    Top = 176\r
+    Width = 100\r
+    AutoSize = True\r
+    Caption = 'ULOI Browser'\r
+    Color = clBtnFace\r
+    Font.Color = 3485410\r
+    ParentColor = False\r
+    TabOrder = 2\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/fAbout.lrs b/ulan/host/apps/uloi_browser/fAbout.lrs
new file mode 100644 (file)
index 0000000..229000c
--- /dev/null
@@ -0,0 +1,985 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('TfrmAbout','FORMDATA',[\r
+  'TPF0'#9'TfrmAbout'#8'frmAbout'#4'Left'#3'!'#1#6'Height'#3'C'#1#3'Top'#3#133#0\r
+  +#5'Width'#3#19#2#18'HorzScrollBar.Page'#3#18#2#19'HorzScrollBar.Range'#3#9#2\r
+  +#18'VertScrollBar.Page'#3'B'#1#19'VertScrollBar.Range'#3#25#1#13'ActiveContr'\r
+  +'ol'#7#8'OKButton'#11'BorderIcons'#11#12'biSystemMenu'#10'biMinimize'#0#11'B'\r
+  +'orderStyle'#7#8'bsSingle'#7'Caption'#6#5'About'#12'ClientHeight'#3'C'#1#11\r
+  +'ClientWidth'#3#19#2#10'KeyPreview'#9#9'OnKeyDown'#7#11'FormKeyDown'#6'OnSho'\r
+  +'w'#7#12'frmAboutShow'#8'Position'#7#14'poScreenCenter'#0#6'TImage'#7'imgLog'\r
+  +'o'#4'Left'#2#8#6'Height'#3#131#0#3'Top'#2#8#5'Width'#3#134#0#6'Center'#9#12\r
+  +'Picture.Data'#10'nY'#0#0#23'TPortableNetworkGraphicRY'#0#0#137'PNG'#13#10#26\r
+  +#10#0#0#0#13'IHDR'#0#0#0'j'#0#0#0'M'#8#2#0#0#0#193#234'fN'#0#0'Y'#25'IDATx'\r
+  +#218'd'#187#5#144#28#135#181#247#219#146',s'#204#182'lK'#150',\i'#153#153#153\r
+  +'w'#135#153#153#153#153#153'yvgf'#153'W+f'#203#150',c'#236'X'#142'c'#140#19\r
+  +#251#218#129#27#180#147#155#155#196'In'#246#245'&'#245#190#239#190'zU'#255\r
+  +#234#234#153#234#233#238#249#245'9'#231'\7fNO'#15#0#0#15'?'#241#236'1'#0'x'#12\r
+  +#216#187#15#216#253'4'#0#236#3'v'#29#0#246#28#2#128#23'w'#180#235#8#176#231\r
+  +#216#142'v'#31#5'v'#191#8#236'>'#8#236':'#8#236#222#15#236#1#181#15#184#231\r
+  +'I'#224#190''''#254#165#199#128'{'#30#3#246'<'#1#236'~'#18#216#245','#0#188#0\r
+  +#0#255#222#195'A'#224#158'}'#192#222''''#254'?'#2'?'#5'j'#207#191#245#244#142\r
+  +'v'#255#31'='#7#0'G'#0#224#232#191#244#175#143#239#218#15#236'z'#14#216#253\r
+  +','#176'k'#31'p'#239#1#224#193'#'#192#253#224#251#7#254#165#23#129'{'#142#2\r
+  +'{'#142#0'{'#193#149#253';'#231'\7f'#207#191'N'#230#222#167#128'{'#158#2#238#5\r
+  +#143#251#236#206#155#247'='#13'<'#240'8'#240#208#247#128#135#239#3#30'z'#8\r
+  +#184#247#25'`'#239#11#192#222'C'#255#18'xz/'#0#247#28#248#191#218#251'o'#29\r
+  +#220#209#189#255#210'}'#199'wt\7f'#9#240'P%'#240'H'#253#142#30#174#4#30'('#2\r
+  +#246'U'#1#247'<'#7'<'#250#204#9'<M'#6#193#242#176'T'#5#140'(GSu'#24#186'y'#28\r
+  +#175#25'@'#170#134#208#154'!'#140'n'#4'g'#24'&'#24#135#9#134'!'#188'~'#8#175\r
+  +#29#194'*'#7#208#242#30#148#184#23'-'#238#199#9#7#136#194'A"\7f'#128#192#155\r
+  +#160'+'#224'L-'#142'g'#165#139#189'\YT K'#8'$)'#182'8N'#150#7#16'B'#235#16'U'\r
+  +#217#137#17#180'!'#185'mH~''R'#208#133#18#130#234'F'#130#18'u!'#132'='#240#29\r
+  +'u'#195#4#221'0I'#15'T'#211#11#211#15' '#244#195'h'#195'$'#209#130'd'#216#241\r
+  +'|''I'#228#6'E'#147#249#217#234'(('#170'$'#140'a'#187#160'$'#203'('#222#216\r
+  +#142#212'6!'#213'Mpi3\'#212#10#231'w '#248#157'pA'#7'L'#216#5#7'OR=@4N0'#29\r
+  +'0'#129#29'&'#182#142#11'5'#163#28#213'0Y5'#130'W'#15'b'#20#189#8'I''\'#212\r
+  +#14#21#180'B'#132#160#6'H'#186'a'#170'q'#148'i'#1'5H5'#244#16#212#29'XU;FY7)'\r
+  +#172#28#19#157#26#145#28#31'U'#28#29#215#28#155#208#158#24'S'#158#26#17#30'k'\r
+  +#199#0#15#28#6#192'k'#142#231#232'I|'#19#154#174#29#193#200#224'T'#19#140'j'\r
+  +#233#130'H'#187'`'#170'n'#184#186#7#165#237'E'#235'zq'#134'^'#156#174#7#175\r
+  +#219'Y'#162'U'#157#8'y+L'#218#10#23#183'"%'#173'hp)jA'#8';0r'#240#144#163'4+'\r
+  +#134#31#160'J'#147#12'Y'#150'&J'#17#5#201#1#154#187#141'h'#169#129#171#202\r
+  +#198'%'#165'c'#226#242'qy'#245#164#178#22#170#174#129#168'j''U5'#19#202#234\r
+  +'qE'#237#152#178'fTQ="'#175#30'V6N'#154#27''','#205#147#150'V'#152#169#11'm'\r
+  +#237''''#218#199#232#206'I'#150#11'#'#8#18'$Q'#154'*'#205#214#231'X'#186#25\r
+  +#130'$9Nvw '#205#213#16's'#233#184#241#212#144#250#212#160#178'tHQ>'#164#174\r
+  +#26#212'V'#14#232#170#250'MuC'#246#214#9'o?&'#6#161#166#145#236','#146#19'G'\r
+  +#176#195#4'Q'#12#199#11#192#233#206'1'#130#169#15#173#233'A'#170#186#16'jP'\r
+  +#157'(M'#31#222'8L'#181#143#210#157#131'T[7'#222#208#138#212#212#195#20'm'#24\r
+  +'s='#210'T'#10'1'#22'M'#152#143'C'#172'E0{1'#204'R'#9#209#183#192#20#192#247\r
+  +#138#1#224#193#195'RkFf'#155'f(Bh'#142#131'$'#10#19#196#17'('#211'3As'#143\r
+  +#209#220#227't'#223#24#195'3'#206#244#142#177#220#255#214#8#205'1D'#177#245\r
+  +#145#204#221'$'#11#168'.'#146#173#147'h'#237' X'#218'p'#150#14#130#173#151\r
+  +#236#26'c'#6#225#188#4#130#23#135'1#'#195#212'`'#13#194'Z'#14#183#129#170#132\r
+  +#219'kP'#174'Z'#180#187#14#233#169'E:'#27#208#190#6#140#167#17#253'o'#249#26\r
+  +#145#222'\7f'#171#29#23'k'#199'G;'#8#145'.R'#164#143#18#25#160#135#135#153#193\r
+  +#17#150#31#194#11'C'#249'!'#164'0'#138#151#167#201#202#28'V'#156#25#161'x['\r
+  +#225#230'VB'#184#6#23#170'Dx'#203#160#174#10#168#183#26#17#170'CD'#235#225\r
+  +#241'6'#196'T+,'#211#1'M'#245'"'#178#147#196#28#158#189#192#16#175#176#229'K'\r
+  +'LY'#129'*I'#227'yQ$#8I'#245#142#18#157#195#4#199'0'#193'5@p'#246#19#156'Cd'\r
+  +#239'$'''#138#20#165#225#130#228#8'='#208#133'w'#149#143#233'N'#141#232'^'#28\r
+  +#212#31#24'0'#238#31#180#28#24#178#30#26'4'#30#31'P'#213'O'#168#128'{N'#0'`'\r
+  +#9'`'#169#163'tu'#140#170#136'Q'#148#9#138'"'#141#151#166#136#202#233'q'#166\r
+  +'\7f'#140#229#31'e'#4#6#233#30'0'#130#250'h'#142'^'#170#29'T?'#205#209'C'#182\r
+  +#182#227#205'-8k'#11#214#217#140's7`\u(W'#11'>'#212#132#243'5b'#189#173'x_'\r
+  +#23'9'#216'K'#9't'#226#156#141'(G9'#210'['#140#240#159#130#251#138'a'#190#18\r
+  +#184#31'\'#158#156#240#158#24's'#150#194#130'e'#240'@'#5',P'#9#15'V!B5'#200\r
+  ,'p-*R'#135#142#130#203'zL'#164#153#16'k'#167#198'{'#24#137'~V'#188#159#25#234\r
+  +'g'#6#198#249#209'1Np'#130#227#135#9#194'hq'#28')'#140'O2'#3'}'#20'O'#27'%RK'\r
+  +#12#151#161'}''a'#238'"'#168#167#8#18'89'#25'<5'#17'l'#192'd'#26#145#201'fh'\r
+  +#184#11#30#156#192'G'#176#244#4#131#159#229'Jr'#2#245'"_'#179#196#211','#241\r
+  +#181#171'\'#221'*G'#187#194#214#174#176'4'#171#227#180'h/'#214#211#129'p'#246\r
+  +#17#2#16'N'#6#194#159#234'#'#135'j'#161#246'*'#168#171#12#226';'#9#13#158#128\r
+  +'GO '#147'E'#168'T1<\'#10'q'#214#140#235#128#189#229' '#190#195#255'f'#199'5'\r
+  +#229#229#238'U'#142'y'#14'''IR'#181'3'#24'I'#10')N'#192#133#177#9'^'#24'<'\r
+  +#239#17#142'o'#152#237#29#230#184'G9'#158'!&H'#211#211'E'#241'v'#146'C'#29\r
+  +#228'X'#27'1'#222#132#143#183'S2'#224'wn'#194#134'Z'#137#193'nZ'#184#143#17\r
+  +#236'&'#185#154#176#182'Vj'#172#6#31'-G'#248#139'!'#238#18#168#167#2#238#171\r
+  +'F'#5'k'#208#129#157'%'#210'_'#139#10#212'c'#131#205#184'H'#11'>'#2#238#167\r
+  +#141#24'k'''#197'Ap'#221#244'h'#31'3'#214#207#10#131#224#250#233#238'~'#154\r
+  +#173#151'd'#24#164#152'F'#233'f('#203#138#226'9'#177'B'#15'Y'#18' '#200'cc'\r
+  +#194'T/7'#213#188's'#148'p9&|'#10#25'9'#1#11#158#152#244'W #'#181#168'P+'#214\r
+  +'?L'#14'!'#217'a'#178' '#204#16#134#24#130#8#142#25#195#179#211'$A'#158'.'\r
+  +#157'g*'#151#217#234'U'#182'v'#131#165#219#164#168'V'#161#156#169#1'bx'#144\r
+  +#26#131#242#11#16'A'#161#155#24#174#24#183#159#26'u'#30#31#243#30#25#15#29\r
+  +#129#198#143#192'3G'#225#169'c'#208#240#201'1{'#3#204#10'<T'#7#0#247#28#228\r
+  +#235#210'LE'#156#163#201'*'#157'+|'#227#28'^'#24#167'*'#167#8#178'4N'#150#2\r
+  +#175'3\'#24#130#9#130#147#2#31'('#168#192#7#225'{''8'#222#17#134'w'#144#22#28\r
+  +#160#197#250'h'#153'nJ'#182#131#148'm'#193'%'#27'1!0'#13#219#9#190#1#186'\7f'\r
+  +#144#233#237'&'#25'Z'#208#234'6'#130#173#1'c'#170#129'i'#171' '#234'j'#168\r
+  +#166#17'ahF'#153'Z'#177#230'&'#164#177#25'ihA'#25'['#209#134#14#180#185#11'g'\r
+  +#238#194'Z;'#241#22'0'#180#187'I'#166#30#162#190#155#160#237#198'+z'#241#242\r
+  +#1#130't'#144' '#28#196'p '#20'!'#150'-'#195#178#196'H2'#23#134'g'#160#136'l'\r
+  +'4]'#142#22#5''''#248#241#1'f'#180#147#26'm&'#197'k'#9#137#10'l'#164#20#229\r
+  +'/'#134#219'+'#144#150'F'#172#169#151'b'#154'`'#153'0<'#19#129#171#195#179\r
+  +#205#12'I'#134'.'#1#217#205#130#162#201#231#24#138'%'#134'j'#149#174'^'#195\r
+  +'K'#23'@|'#195#148#196'0=5'#193'-'#140'r'#243']'#164'X-'#204'S'#12#241#31#155\r
+  +#12#28#154#136#188'0'#25'}'#1#154'|'#17#150'8'#10#9#157#24#179#215'L'#24#129\r
+  +#7'k'#1#176'3'#144#153'2\E'#132'*'#14'HM'#5#165#3#140#234#130#204#182'LSd'\r
+  +#200#242#20'Q'#154#192'J"'#24'q'#24'-'#9'a'#164'a'#172'<'#132#18#249#16'|'#31\r
+  +#132#229#159'`'#134#198#153#201'Qff'#132'>=H'#157#234''''#165'z'#137#145#1'R'\r
+  +'`'#130#21'@'#9#3'h'#161's'#130#169#238#199#241'G'#200#146'a'#146'x'#144#0'J'\r
+  +'8'#132#23#244'c'#184']pF'#219'$'#169#31#197#2'5'#128'b'#13#162#255#175#134\r
+  +'0'#236'>'#20#173#7'A'#234#129#19'{'#17#132'Q'#12#9'A'#166#19#217#28#26#159\r
+  +#23'K'#199#243#179#217#133#197'\&'#19#178#155#21'b>'#153#207'Ds'#216't'#186\r
+  +'@'#143#231#185#145'l'#255'$+2'#194'J'#13'0'#167#187#24#153'6Z'#188#153#226\r
+  +'o"'#217#155#9#134'N'#146'n'#136#166#135#178#205#24#158#13#220#146#165#200\r
+  +#210'%9'#2'?'#133'bD!'#212#224'8'#197'?F'#10#128#17':B'#137#14#129#165#150#18\r
+  +#5'w2'#206#207#131#26'`'#164':'#200#137'jL'#180#24#25';'#12#139#30#128'F'#15\r
+  +'@b'#7#225#241'c'#208#224')'#136#3#180')'#224#254'*0'#250#158#23'+'#131'2ML'\r
+  +#174'KI5I'#169'.+'#213#230#21#166'9'#149'}Yl'#154#225#168'3TY'#132'"'#13#147\r
+  +#229'!'#170'2BSEi'#242' '#152'5Da'#136' JPey'#154'b'#158','#5#3'6'#143#227'g'\r
+  +#17#244#0'E'#28#193#178#173'"'#157#143#202'WP'#249'B8'#1#139'""'#241'T$'#149\r
+  +#129'gqI'#20':'#134#205'#'#227#137'0'#185#146'C"'#193#184'<'#130'XB'#3#21#14\r
+  +#154#10#185#160#211#174'0'#153#197#22#187','#145'v'#205#206'Emv'#169'FI'#211\r
+  +')'#169'|'#230#184'R'#132'('#196#213#27#5#211#237#243#209'++'#246#173')'#229\r
+  +'B'#132#243#202#154'%'#227#230'J'#185','#4#140#140'@'#241'Q'#4#3#150#25#30\r
+  +''''#135#135#201'Q'#148'l'#190#155#18#26'dG&D'#201'1^d'#156#25'%)'#22#216#250\r
+  +'-<?G'#149'd'#9#188'0'#146#238#129'R'#220#16#154'g'#2't'#15#146#167#15#239#24\r
+  +'$yF'#152#17#136'0'#11#149#228'&'#132#211#131#156'd75'#210'J'#14#215#17#163\r
+  +'%'#232#208#139#208#192#1'h'#240#16'"v'#20#147'8'#137#10#21'Cm'#13#8#29'p'\r
+  +#239'I'#0#0#158#18'I'#156're@'#169#141#169#245#25#157'9'#175'5'#21't'#150'y'\r
+  +#145'jJ'#162#251'7'#199#5#181'cQn'#155#19#26#178'\MRb'#153#18#27'3'#2'mV'#160\r
+  +#157#22'h'#10'<U'#142'-'#207'2'#197'q'#165'i'#134#206#181#203'U^'#133#194'D'\r
+  +#161'P'#242'Sq'#157#138#183#181#150'<'#179#236#189'v&'#144#139#137#11#9#233\r
+  +#141'sA'#191#149'xi'#213#233#212#194#207'-'#152'r!'#246#217'y'#253#245#211\r
+  +#246#235#27#182'['#231'\'#183#206'y>'#184'3uc'#203'q'#231'R'#8#212#235#151\r
+  +#195#155'S2>'#166#2#209#249#164#146'Xic7'#189'}Z\7f'#247#156'>&o'#249#221#187\r
+  +#209#27'Y'#220'gW'#212'w'#150#196'W'#23#237'q'#187'\'#206#162#144#144'8'#18\r
+  +'^D'#166#155#16'D'#195#8'VG'#148'E!l7R'#24'&'#171'fp'#146'9'#180'`'#9'/:O'#18\r
+  +'m'#18#5'i'#178'(L'#149'D'#233#242#4'C'#145'"'#201#146'H~'#4#204#152'qv`'#148\r
+  ,#29#26'a'#135#7'9'#209'!nl'#136#159#28#22#164#6#248#153'Fr'#164#12#23'8'#12\r
+  +#245#238#159'p'#239#135#250#14'B}'#135''''#237#199#198'4'#13#8#205'N;'#13#0\r
+  +'OHe.'#181'&'#168'3'#196#13#198#172#217'>k'#182'-'#152'lKN'#239#150#217#177\r
+  +#174'6'#204#139#213'9P G'#163'{'#221#26#218'2'#248'V'#12#238#5#173'c^m'#153\r
+  +'Q'#24's2mJ'#162#138'H'#229#30#153#212#170#148#233#213'ba'#194'g9;'#23#154\r
+  +#141#168#150'b'#178#152#25#157'w"'#23#188#168#243'Y:'#168#130's'#252'L'#138\r
+  +#180#17#197#156'M'#17'o'#20'X_'#220'v'#191'2'#207#250#225'%'#213'o\7f'#16'~s'\r
+  +#141#251#230#26#255#179#155#166#143#175#25#193'7'#151#189#147#183#231#185#223\r
+  +#223#148'X'#169#199''''#203#1'F'#7'@o'#3#22#244#13'/'#199''''#174#5#251'^'\r
+  +#159#26'{#3'#242#135';'#178#151#147#3'w'#150#8'w'#175#168#239'^'#243#188'v6'\r
+  +#184'9'#237'M'#250'm'#18#30'o'#18#130' 1'#249'p"'#139#200#211#139#140'S'#2\r
+  +#221#10'Cq'#134#165#184#201'V\e+f'#5#186#180#196'\P8'#23#148#206'e'#177'c'\r
+  +#129'm*P'#181#211'8EzB'#16#233#161'y:('#174'.'#186'w@'#16#31#147'e'''#148#5\r
+  +#208#151#154'h'#177#18#140#239'0'#204'}'#16#230'9'#4'u'#29#134'X'#138#198'A|'\r
+  +'*'#224#254#163';'#209#167#214#4'L'#230#132#193#148#214#233#211'&'#235#172\r
+  +#205#185'jw'#159#182':N'#219'='#231#157#129#171#174#224'5'#155#255#178#209'u'\r
+  +'Fe'#219#148#155#151#244#158'u'#173'{Qc'#159'S'#154#167#228'`(h'#2'*'#141'S'\r
+  +#171'1'#177'('#148#184#215#146#176'K'#231#2#210'E'#31'['#8')'#186'=+\7f'#165\r
+  +#192#15#242#170#252#220#178'yK'#247#148#166#249'lh".'#169#250#228#162#236#131\r
+  +'3'#252'-o'#255#165#200#200#170#189#237'rdp'#205#222#178'jk'#190#158#24#181\r
+  +#17#158#210'!'#30#206#200'J'#239#228#208#159#156#225'}uM~'#222#221'#'#236#2\r
+  +','#136'G'#200'U'#192#172#228#248#13'_'#251#221#220#232#199#139#147#31#206#13\r
+  +#189#157'j'#191';'#219#247#242't'#251#181#233#238#245'@'#239#219#27#226#207\r
+  +'^'#138'|'#241#198#226#205#181'P'#218'+v'#24#233'*9E'#166#224#202#212':'#161\r
+  +'2 '#211'/'#170#205'7'#165#250#203':'#215#166#222#187'l'#240#175#26#130#27\r
+  +#250#192#186#202#191'.'#243#174#137#189#235'T'#211',L'#146#232#162#184#26'q'\r
+  +#150#22#138#187#151#23#29#145'N'#129#248#134#132#217'Nf'#162#154#24'*Bz'#143\r
+  +#192'='#160'N@m'#197#16'}#'#136#239'_'#209#247#164'J'#31'5'#217#166#181#230\r
+  +#172'R7e'#176'-'#219#220'g'#236#190#203'z'#219'Y'#131#227#146#222'yU'#231#184\r
+  +#162#178']TZ/'#168#237'W'#180#206'K'#18#243#170#200'4+'#208'O'#9'41'#177#218\r
+  +'''U'#219'Uj'#189'N-1'#200'i:'#30'TAl'#141')G3'#170#129'w'#151'Do'#21#24'_'\r
+  +#158'W_'#143'!M'#168#231'a%'#128'x'#240'!F'#27#176'l'#236#244'R'#14#159#243\r
+  +#12'\'#242#13'|'#176'B'#219#180#182#133'h'#7'6-'#205'['#182#230'4'#255'h^Z'\r
+  +#244'v'#30#182'j'#168#190#228#237#154#151#151#190#150#156#252#225',^3'#184\r
+  +#199'0'#182#215#14'}'#0'u'#20#216#212#148#189#25#235#249#246#6#251#167'+'#147\r
+  +#191'8'#131#254#233#22'L'#5#1#226#178#167#178#138'cW'#163'caN'#165#25'WT'#208\r
+  +#13#189#189#174'X'#139#160#221#138'6%'#183'Y#'#155#208#170#216'F'#131#205#237\r
+  +#158#243#133#206#217'C['#182#240#25'['#244#172'5v'#214#20':'#163#242'm'#136\r
+  +#156'+l'#235'"N'#149#31#229#131'M'#152#171#1'km&y'#186'9'#209'a'#201#244#168\r
+  +','#223#207'NtR'#195#213#216#192')'#184#231#24#196'{t'#210'U4i/'#155'04'#195\r
+  +'5'#192#189'`'#219#12#236#147#170#163'j'#211#148#210#144#149#235'g'#12#142#13\r
+  +#189#227#140#218'|'#150')^$'#243'fQ'#244#169#9'\b'#12#159#194#176#231'y'#218\r
+  +#139#26#247#203'`'#135'IW'#21#192#170#193'R'#133#249'j'#183'@'#174#229#9#216\r
+  +'\'#22#178#181#234'i'#250'd'#137#147#219'2k'#28#220#180#13#188#150'@|0C'#252\r
+  +'t'#137#241#167'7'#252'o'#207'rF'#15#3#144#19#128#5'y'#8'z'#28#152'W'#182'8'\r
+  +#177'/|'#188#206'OqO}s'#219'r-0'#188#168#168#249'p'#137#26#161#30#188#21#29\r
+  +'=gm'#158#151#157#250'l'#141#10#130'{+'#13#187#228#232'f'#214#0#210'N'#224\r
+  +#175#175'['#232#213'@'#129'w'#228''''#171#132'['#254#214#215'"'#237'o'#196':'\r
+  +','#16#0'_'#7'HG'#247#242#187#239#157#151'wJ'#218#31#31'x'#10'@'#29#7#172#240\r
+  +'g?X'#167'-;'#155'f'#156#173'W'#23#153'W'#215'L'#133#184'1'#236#180#187#157\r
+  +'1'#131'}F'#235'Z5'#6'N['#163#231'-'#145#139'2'#215#26'8'#195'@'#184#209'!F'\r
+  +#160#147#236'i'#196#216'k1'#142'&'#146#191#131#29#239#23#229'F$3}'#140'x'#15\r
+  +'%'#214'D'#136'T'#162#130'%'#136#200')X'#160#20#230#173#129#217'['#160'z`o'\r
+  +#241'N'#227#194'SF'#133#154#148'H3-7'#175#232']'#23#248#234#21#20'5'#221#212\r
+  +'g'#26'@D'#177#220#21#134#252'"U~'#9#205#221#24'#/'#12#224#178'd'#197#26'A>C'\r
+  +#146#165'A'#23'f'#169#156#160#189#194#144'#C}'#165#195'm'#207#11#208#167#180\r
+  +#132#227'*'#200#147#11#170#218#5#209#169'/'#151#8#183#188#3'\7f'#188#19#254'`M'\r
+  +#191#160#25#199'V'#236#166'7?H'#168#2'h'#13#247#198'9'#245#1'j'#217'O'#207'j'\r
+  +#243#146#198'wg'#24#31#175#10#3#164#163#151'=c'#9#214#169'u}'#163#7#251'T'\r
+  +#140#254#226#166#161#229#186'o'#228#229#16#228#180#190'#'#207#175#184#21#130\r
+  +#134#137#135#168'U'#192'%G'#231#157#248#232'''+'#248#203#238#230#0#249#133\r
+  +#174#167#1'\'#249'sc'#7#30#177#143#247#14'?r'#15'8'#7'@'#31#7'b'#136'c?Y '\r
+  +#189#145#234'{u'#170#247#7#155#196#187#151'U'#175'm'#153#231#163'J'#165#128\r
+  +'-U'#5'x'#234')'#161'~V'#225'XU'#187#206#240#140'KpN'#188#11#227'hE'#217#27\r
+  ,#144#246'Z'#184#173#26#233#172#199#7'Zh'#201'nn~P0;'#196'H'#13'Q'#211']'#228\r
+  +'T'#19'!U'#133'IU'#160#226#224#140'T'#7#247#182'@'#204#192#30#240'h'#247'?'\r
+  +#199#213#248#217#202'0O'#157'V'#218#193#186'v'#25#207#201#215#247'ZF'#177'SD'\r
+  +#193'9'#165#253#251#214#240#167#26#239#15#153#170#151'`'#244#181'>'#236#20'V'\r
+  +#190#137#146#205#129#131#29'S'#229#227'I'#213'$'#18'b'#160#243'D'#205'q'#0\r
+  +#218#246#152#142'\r:'#8#243#208#142#209#155#128'Ey'#197#166#170#234#171'-'\r
+  +#225#207#175#185'^'#207'I'#182'?'#219#132#151#239#178#224'JY]O@K'#129#148#168\r
+  +#253#140#27'q-J|oI|%'#128#188#30#198#220#157#231#158'6'#13#228#248#213'y~U'\r
+  +#140'Z'#164#28'x'#212#129':'#170#26'y^'#7'9'#180'n'#26#247#226#139#19#204'r'\r
+  +#253#200'c'#244'* '#195'<'#190#170#174#203#176#143#190#28#30#6#131#26'V'#252\r
+  +#212#196#177#131'E'#0#192'--'#131'='#250'X'''#0#244#236#6#224#207#1#188'*@'\r
+  +#219#13#232'z'#0'Q'#27#16'f'#188#248#222'i'#245'['#151'c.'#139#130'''s'#147\r
+  +#133'1"?F'#151'fx'#218'y'#186'b'#6#156#205#187#208#214'F'#132#165#14'i'#171\r
+  +'F'#217'+'#145#174'J'#180#175#150#16'i'#166'e:'#217#211#221#180't7%'#213'F'\r
+  +#206#214#227#179#149#168't)<Z'#6#9'TM:w'#240#237'\'#172#7#30' '#9'%'#2#163\r
+  +#155#163#14#136#141#179'J'#251#249'~H'#168#188#197#2#193#175's'#228'wV/l'#223\r
+  +'xc'#219#159#248'Jiz['#160#186#217#5'OvP'#167#199#164#5#20#223'#T'#152#8#144\r
+  +'>'#214'x%'#171#247#249#129'C'#128#143'^'#146#144#212'm'#5'&/D'#17'7'#178#132\r
+  +'9c'#247#157'i'#210#7#235#226#239'/'#8'~'#253'Z'#228#221'U'#197#217'0'#14#219\r
+  +'r'#143#12'yP'#12#219'O'#31'x'#212#206#170'x{]:o'#30#188#153'%'#191#154#165\r
+  +#174#27#251'.9'#198#238'D'#240#215#29'H'#211#240#139']O'#2'CGvq'#7'KGJ'#31'e'\r
+  +#244#30#197#215'?*'#237'yZ'#221#247#200'us'#239'm'#247#224'y}'#203#199#11#180\r
+  +'UMK'#223#1'`'#180#228#254#254#23#31#24'}'#2#128'|'#15'@>'#2'@'#158#0'z'#158\r
+  +#4'Z'#158#4'`'''#129#206#7#128'e'#210#147#215'E'#199#206'I'#171#255'vw'#230\r
+  +#206#213')'#166#152'-4'#197#192#201#138#167'+'#128#211#129#210#186#166'sm1T'\r
+  +#133#1#146#163#29#7#206#151#158'F'#170#191#146#224'*'#197'y*'#8#193'ZR'#180\r
+  +#150#20#175' D'#202'q'#209#10'B'#186#4#149'<'#14#137'Vc'#178#205#196','#136\r
+  +#175#25'j'#4'v'#159#2#241#237'F1id'#145#146'(03'#229')'#182'r'#185'e'#200']'\r
+  +#218'hGQ/'#208#133#175#133'2'#223'.nn'#135#211#191#178'z>'#150#168'n'#245' R'\r
+  +#157#180#220'0?'#195#209#197#160'P8'#178#171#28'^'#249#8#189#241'!'#228#9' J'\r
+  +#175'\'#179#140#248#216#149#11#142'Q'#13#246'hR'#213#238'a'#150#231#212'][^'\r
+  +#216#246'O'#150'>'#185'h'#184'{V-'#134'='#199#24'y'#12#222#10#208'F'#30'U'#17\r
+  +#142'd'#244#221#235'>hN'#211'q='#138'=c'#27'~9'#136#188#155'c'#223#176#161\r
+  +#149#157#7'p'#229#143#143#158'|'#164#251#196'c'#195#21#207'Cj'#158#11#243#135\r
+  +#181#227#135'='#240#131#175'8'#134#190#152#167#191#147'D'#158'5u'#131#137#143\r
+  +#173#191'g'#160#226#1'\'#251#139#154#190'2}G)'#187'x'#255#232#179#15#214'?'\r
+  +#179#171'z'#31'P'#247#20'@'#171#5#252#253#15'~'#30'A'#205'Q'#171#255#254#193\r
+  +#214#173#27'KJ'#167'C'#228#152#150#184#215#20#174'M'#141'k'#195#26#188#228\r
+  +#138']W:6'#176#210't'''#217#217'H'#182'W'#18#156#165'8G%9X'#199'H'#212#16'cE'\r
+  +#8#207'Il'#224'$.\E'#157#174#161#228'@'#130#149#232'd'#29':Z1fi'#134#233#129\r
+  +'{'#193#218'w'#255#3#24'&'#159#200#215'PD'#30#150'b'#154','#152#173#237#182\r
+  +#189'X'#174#25'F'#174'!'#200'W'#249#170#187#246#224'/#'#153#223#187'B_'#177\r
+  +'E/wO'#166#218'PQ'#172'2'#15'%'#202'a'#16'h['#241'~rg'#209#208#145#189#227'G'\r
+  +#247#176';_'#144'CN-'#216#17'6F'#133#149'V:\'#4'Xq'#199'.'#5'P'#175#207#177\r
+  +'W'#28'#'#219'_'#175#252#224#180'l'#217'='#225#225'W'#163#154'w'#227';'#238\r
+  +'c'#13'>'#190#21'B'#10#6#31#191#22#195'K'#250#31#191#228#129'.(:'#206#154'F_'\r
+  +#242'`'#245#131#135#161'E'#247#12#23#221'W'#243'40X'#246#216'p'#233#131#17'^'\r
+  +'o'#132'V'#173#234'}'#232#166'{xUV3#'#174't'#224#14#145#154#247#16#187#159\r
+  +#236#171'~|'#176#230' '#164#178#8'VR2z'#180#168#235#208#139#245'/>]w'#248#1\r
+  +'x'#243'>t'#221#247#132'mO'#15'?'#11#4#232#131'F'#6#228#250#141#211#19#20#10\r
+  +'N'#225#199#169#179#160']0'#213'y'#133'u'#195#28#184#172#242#156#165#27#22#7\r
+  +#185#225'V'#154#23#12#189'*j'#160'CT'#24'T'#175'v'#242'f'#202'p'#161'"'#132\r
+  +#19'l'#244'N"'#189#21#152'X'#9'$T'#139#140#13#178#242'Pa'#174#21#174#5#30'.'\r
+  +#5#128#221#143'0$&'#142#194#199'U'''#248#154'y'#178'x'#1#196#247#232#11#204\r
+  +#166#190#212#24'f'#11#203#184#201'S'#190'g'#242'|%'#213#188'?'#134'Xk'#237#11\r
+  +'OR28^'#8'E'#20'6'#214#214#232'8'#4'Ro'#13'o'#164#179#249#217'GpMev'#198'$'\r
+  +#165#239#224#153'8'#21#211#4#184'hE'#147'G'#129#156#184'I'#5#219#247#206#134\r
+  +#232#7#167'%'#159#223#176#252#229#227#252'H'#9#160#128#31#180#145'Jft'#3#195\r
+  +'G'#128' '#179'Z'#15';'#148#21#181'rZ'#30#224#182#222#31#165'W'#251'p%f'#200\r
+  +#241#201#19#0#181#253#249#201#234'G'#186#142#2#240#234#135#137#141#15#13#237\r
+  +#7#248'-'#187'b'#148'c'#5'I'#205#205'$'#206'J'#1']'#190#17'7xP'#201#135'p'\r
+  +#169'('#10#20#131#27#196#17'F('#12#20'['#196'`'#170#133'T'#9'u'#196#192#129\r
+  +'`;+^'#188#31#24#172#175#238'oo'#13#198#195'X'#129#172#135#162'k'''#218';'\r
+  +#241#182'1'#154#31',|J'#215'9'#185#231#2#203#182'>'#196#143'7'#211#131#229#4\r
+  ,'O-='#218#175'\'#134'[/'#141'k'#206#180's'#242#141#244'H'#13#209#211#202'L'\r
+  +#246#9'f'#219#137#169'V\t'#156'='#5#154'g''\'#1'<'#12#150#220']'#251#196#218\r
+  +#152'H'#155'd'#202#146';'#183#18#165'K='#144#240'SG8Gk'#204#29#227#179#253\r
+  +#136#181#17#228#22#146'r'#173'ob'#165#170'9'#209#209#31'g'#242'g'#192#217#174\r
+  +#187'k`'#176#171#197#166#224#138#9'H'#191'L'#131'l'#29'*{'#242'@'#215#169#227\r
+  +#196#254'b'#230#248'A'#19#233#136#17#245#12#216'p'#24'F'#159#242'0O'#8'!'#143\r
+  +'~pA'#190#253#229#252#151'/'#217#206#250'Q'#29#251#0#245#248'Az'#211#195#14\r
+  +'L'#169#164#239'Yi'#255's'#184#10'@'#15'='#226'"'#148#244#31#0'&'#142#2#130\r
+  +#238#167'%'#195#135#196'cGY'#253'/t'#28#4#160#149'{'#250'^'#0'p'#149#0#175'}'\r
+  +#239#171#25'B'#148'W'#29#22#183#9#16'E'#240#190#3'j)T"'#167')t:'#133'6'#204\r
+  +#226#133#17'h'#11#20#161#166#179#148'j'#141'.'#24#242#168#212#178#253#251#143\r
+  +#150#148#183'!'#240#162#169#229#203'\'#181#165'v'#20#221'F66'#16#236'`\7f'#7#21\r
+  +#164'E'#206's'#198#216'+'#202#224'5'#186'e'#179#131#30#174#167#248#193#170'W'\r
+  +'F'#8'4sr'#3#242#205'!'#217'V'#15'\7f'#14'mZ#'#216#214#228#153#215','#243#239\r
+  +#11'<'#215'a'#130#252'(%8'#140#183#14'c'#148#192#158#231#193#190#239#128#202\r
+  +'\'#16'j2tq'#146'.'#201#177'TkD'#193'R'#243#144#247#177#195#172#227'u'#230\r
+  +#162'z'#215#137':wU['#172#188')Z'#223#153'A'#19'W'#4#220'D'#200#157'>v'#224\r
+  +'9.'#21'1'#210'UgQ'#202#157'*'#175']'#30#234#169#26'9'#185#239#16#19#222#170\r
+  +'$W'#188'\7fN'#186'jl>'#167#235#254#197'y'#237#215#183',W'#243#184#184#178'~'\r
+  +#214#210#251#219'7'#194#223#159#23#143#190#8#152'a'#167'4C'#135#241#165#247\r
+  +'R'#235#30'qak'#136#181#15'k'#160'E#'#199#0't'#245'^V'#251#19#216#218#251#212\r
+  +#144#19#163'E'#192'x'#201#174#161'"'#160#247' 0t'#24'P'#141'?Oj'#216'3V'#4\r
+  +#160#155#30'rI'#6#165#244'.'#191#139#235#11#234'L~'#135#218#11'N'#226's4'#201\r
+  +#12#146#154#132#17'}8'#150#133'&1BH'#236'1'#18'o'#146'n'#170#25#230#195#249\r
+  +'Q'#156'4'#218#135#19'w'#17#164#245'DK-'#201#211#195#142#227#13'k'#138#240\r
+  +#203#218#232'm'#166#229#204#164'('#215'B'#9'6PC'#160'c'#20'c'#2'e'#248'x'#3\r
+  +#189#208#206'ZlgLS'#29#155#130#208'9'#247#202'{'#169#11'?'#245#205#191'o'#140\r
+  +#221#212#7'/'#169']+L'#169#23#216#245'$'#152#188#135#193'i'#159'#K'#10'uy'\r
+  +#129'v'#129#14#142#132#134'3'#4#225'By'#151#190#178#219'Z'#218'f'#171#232't'\r
+  +#183#14#165'z&'#11#147#184'M'#161#244#156'V'#20'b"1'#176#129'&'#248'h'#3#139\r
+  +#2#19#178#185#30'['#206'eZr'#27'gjO'#214#215#28#251#222'h'#253#222'W'#23'('\r
+  +#215'#C+'#226#154#247's'#148#183#215#185'?'#188#174'zu'#153#253#198#178'p'\r
+  +#251'W'#23'/'#248#8#134#201#162#190#167#1#204#201#251#181'#e'#152#210'G'#181\r
+  +#19#21#132#250#167#161#229#15#226'['#159'i|'#6#208#162'*p'#245#15#147#154#31\r
+  +#27'>'#14#128#4#145#21#247#12#30#1'05'#247#242#192'8'#157'8'#190#30'`'#133'5'\r
+  +#24'9s'#148#207#130#241#4#228#196'l'#206#153'['#20#251'fH'#146#12#138#150'@S'\r
+  +'S8f'#28#195#241#193'9'#246'1'#142'e'#144#181#19'em'#132'`'#7'!4'#204#138#149\r
+  +#143#240#186#232#214'R'#140#185#140#224'kc'' '#138'E'#178#233'4I'#183'>)'#156\r
+  +#233'a$'#26'H'#225#6'Z'#188#138#28'/'#198'GJ0'#241'*B'#182#145'4'#211'B'#202\r
+  +'@'#229'Y'#178')'#175#138'_r'#21'^'#243#205#190#157'?'#243#201#249'[?'#187'|'\r
+  +#251#167#169#194'9`'#215'#`'#244#29#226')'#227#20#190'_'#237'X'#150'['#151\r
+  +#241#188'(S5'#199'T/'#201#28#151#169#178'U$s'#22#199'[f'#200'.0'#164#151#24\r
+  +#162'KB'#209#162'C'#234#152'h'#172#148#209'F'#185#228#1#155'Y'#228'ry'#244\r
+  +#250#180'N3'#227's'#173#136'X'#242#145#142#162'#'#143#0'J'#212'S7'#227#163'k'\r
+  +#242#218'+'#206#161#159#220'4|v'#219#250#195'+'#134#180#166#231#235#155#145\r
+  +#255'zk'#158'P'#249'('#166#228#241#206''''#0'Qw'#25#173#241'8'#177#241#232'x'\r
+  +#201#211#253''''#31#129'6'#28#168'x'#10#24':'#185#151#212#250#12#170#246#17\r
+  +#31#163'S6z'#28'Uy'#31#185#233#9#209#208'1'#27#165'='#163'#-'#133'5A'#139'D'\r
+  +#175#22#133#163'!w'#20'lA'#220#150#153#11#214#220'5G'#228#178#197#188#161#20\r
+  +#231'y'#220'8U'#28'#i'#178'#'#162'X;#X'#1's4'#227'"'#157#164'D='#210'U'#14\r
+  +#209#180'2'#253' '#187'2r'#168#129#145#236#225'M'#15#243#242'#<pV+'#140#136\r
+  +#230#203#209#222#10'B'#168#156#16';'#137#137#20#163#227#149#248#169':|'#161#1\r
+  +#151#232'c'#248'Q'#242#168#196'w'#218#156#188#238#157#190'3w'#238#163'+'#175\r
+  +'~}'#233#149'Oo'#189#241'1'#176#247'Q'#176#246#189'@'#23#249'X'#210' h'#29'<'\r
+  +'m'#134#167#155'fj'#178'lm'#30'4'#166#157#219'y'#242#25#174'n'#149#175']gH'\r
+  +#151#168#130'y'#129' &'#198#18'N'#199#140'|\'#7'f'#178#198#235'Q)'#213#170'p'\r
+  +'t'#217'`'#156'6['#146'a_('#229#147'('#169#21#171#254#193'_'#189#170#221'2'\r
+  +#182#254#249'M'#239#15'/('#223'>'#167#252#236'e'#247'_?]'#251#241#213#216#221\r
+  +#13#255#240#225#135'Z'#159#220'U'#255#200#238#201#226'C5'#143#223'wt/'#208'q'\r
+  +#236#185#226#167#238#5#207#229#200#247#0#17#164#142#218#245'"'#178#250'1L'\r
+  +#245#227#164#134#167#186#158#7'p'#181'O'#147#219#143#218'9p'#135#148#238#209\r
+  +'+'#29#22#171#193#236#145#27#189'bC'#144'kN'#137#163#167'-'#217#171#231'6'\r
+  +#223'u'#9#253'iU|'#218'1'#167#210'N'#153#211'7'#177#150#141'vv'#186#9#227#31\r
+  +#164#164#198#232#233'6'#140#167#6#227#172#163#135'O'#18#3#197#164'H5%'#209'B'\r
+  ,'Ow3'#166#250'Y'#211#189#140'l''(N'#14#12#189'"L'#16#196'W'#134'K'#129#248\r
+  +#234#9'3m'#148#169#193#157#187'XN'#180'4!'#180#175#235#131#23'\'#137'k'#133\r
+  +#149'7'#174#188#242#241#245#155#239#238#185#239'1'#0#216#179#159'*qS'#196'.'\r
+  +#186'<'#192'P'#134#217#154#4'('#158'>'#11'Jn_'#148'Z'#230'@Ka'#201'Sj'#235\r
+  +#146#222#185'f'#212'G'#244'L'#220'h'#213'3'#183'N'#135')'#168#246'h'#216'b'\r
+  +#180#153'$'#10#179#209#18'N'#167#10'.'#155'6'#235#23'}p3'#180#17#130'eUu+'\r
+  +#166#142#255#188'm7QO'#222#189'lys'#211#152'PO'#254#238#7'g'#187#14'?<xr'#191\r
+  +#24':<Y]I'#233#235#29#171'm'#232'.'#175#192#14#14'Ntu6W'#148'Lv7'#244#22'?y|'\r
+  +#15#128#169'\7f6'#196#27'9'#4#0#245#143#3'U'#143#0'r'#244#176'M'#196'6'#201#20\r
+  +#6#173#195'`'#142'h'#29'S'#10'[^l'#202's'#12'y'#186'uA'#239'['#155#182'e'#12\r
+  +#195#184'U'#129#230#170''''#147't'#207#6#167'^"'#153#215#135#197#133#1'Jt'\r
+  +#156#28#29'#'#4#187#209#158'zb'#168#145';u'#146#28'+!'#199#171')'#169'FJ'#170\r
+  +#157#146#233#162#166';i'#153#14'z'#166#131'['#168#165'eJ'#9#137#18'b'#170#148\r
+  +#144#174#192'ekq'#249'V'#242#244#8'?5'#192#240#140#178'CDE^hZS'#218'Wm'#254\r
+  +#205'X'#230#236#218#230#13#176'g'#6#128'{'#158#163#136#29'D'#129#149',vQd'\r
+  +#190'\7f'#17#140#9#141'i'#145')'#163#180#23#244#238'9'#181'uJ'#162#9#11#21'n'\r
+  +#137#210'k'#210#154'-\tT'#133'}'#231#202'L'#194#163'1'#233'en'#175#195#19#244\r
+  +#22'f'#178'r1})'#239'z'#245'|'#244#253'k'#225'%/'#246#181'e'#201#188'}$'#173\r
+  +#233#254#243'g+'#211#22#248'G'#215'b'#151#166#12'Y'#19#247#224#189#0#170#187\r
+  +#205')SX'#196'j'#187#202#162#23#27'U"'#189'U'#239'6'#27#220'Z'#141#197'm6F'\r
+  +#180#236#206#131'{4'#200'fb'#211'AH'#233#227#252#161#154#246#195'O:%|'#171\r
+  +#202#160#211#184#148#250#184#218'6'#171#243'l'#232'|['#224'7'#17#26#231'0'\r
+  +#226#168#193#144'r'#161'h'#178#227#199#207#163'ao'#168#148#231#188#137#197\r
+  +#220#5#181#247'4'#223'un'#231'N'#159'`'#10'C'#9#13'b'#221'u8'#239')\'#176#132\r
+  +#156#4'UIJ'#213#128#254#128#141'6cc-'#196'd'#27'5'#211'H'#203'V'#145#147'e'\r
+  +#196'd'#25#25#132#152'.'#197#166#171'q'#185'fr~X'#152#239#162#251#187')'#1\r
+  +#184'h'#154'mX'#147'Y75'#182'%'#179'k6'#150'\'#6#128#135#192#232'{'#134'$'\r
+  +#182#18#132#255#194''''#245'3'#148'Q'#142':!2d'#5#234#184#194#148'6:'#167#156\r
+  +#190'|8>'#19'K'#230'\n'#191'^!'#10#235#233'o'#159'K'#19'G;cn{*'#18#177'Y'#13\r
+  +#161#176'qq'#193#157#14#243#231#19'b6'#164#226'LZ'#137'n'#223#143#234#220#183\r
+  +#28'e@Z'#30'f'#14#31'a'#13#21#245#156'|'#168#229#200#195'e'#207'?'#220'QY'\r
+  +#226#208#154'u'#10#139#217#16#214'hCZ}LcH*t1'#149'!'#166'1%'#140':'#251'p'\r
+  +#221'1'#193'H'#133#141#220#173#199#180#177'{'#139'Sj'#186#8'3'#238'3Y'#244':'\r
+  +#143#210#144#146'Y'#22#20#238'3Z'#223'%P'#26#231#25'0'''#136','#183'El36'#181\r
+  +'*'#31#191#239'z\7f'#237#203#240#222#203'r'#225#217'pF)'#247#203'-'#243'j'#243\r
+  +#178'H9'#199#17'OS'#164#249'!^'#166#146#24'*!'#198#192#248'*'#195#198'*'#144\r
+  +#145'jD'#168#30#25#2#9'6'#147#146#149#184'h'#25'>'#10'F'#31#136#175#4#159'*F'\r
+  +''''#171#176#211#205#212'B7'#175#208'L'#139#180#144'"'#163#220'i'#146'r'#133\r
+  +#163']'#17'h'#10'2m'#202#234#202#2#192#195' '#190#167#9'"'#27'A'#228#216'a'''\r
+  +#143#177'Ui'#174'*+'#210'Lkm'#11'.'#255#170#213#158'Q)'#237'V'#139'3'#21#11\r
+  +';,j'#10'z'#136'8Z'#251#243#187'/}'#254#206#187':'#129'6'#236#142#165#162#193\r
+  +'w'#223'\'#187'z'#214#154#246'@\7f'#253#163#185#247'/'#196'_'#158#15#168#8#227\r
+  +#212#201'V'#22#190#221'"'#135#12#151'='#10#250#233#209'{'#129#231#246#0#19\r
+  +#157'm'#141#213#245'P8'#197#25#156'g'#203'B$a'#128#165#202'p'#13'y'#154'l'\r
+  +#231#190'9O3'#205#23#153#171'_xX8V'#140'kz'#134#208#252'|'#245#147#192'p'#197\r
+  +#129#139'K'#5'>W$Px9'#250'i'#174'm'#29#140')'#145#253#172#196#186#169#180#174\r
+  +#24'-s'#10#129'C'#143#166'K^'#216'o'#184#15'x'#179#253#216#171#157'G'#174'";'\r
+  +#182'$'#204#136#210#224#182'O'#153','#203'B'#229#2'G'#177#200#210','#143#9\r
+  +#146'e0s'#25'>'#12#26'k)2\'#9#15#215'##'#205#232'x+>'#209'DL'#212#145#19'`'\r
+  +#244'UP3'#21#180#233'Rb'#230'$&^'#142#205#212#146's'#245#140'\'#13'9UGL'#130\r
+  +#153'>'#204#152#134'0'#210'hF'#132#192'ti-q'#0#0#157'w'#207'>'#188#208#142#23\r
+  +#184#168#178#8'8'#243'rTy'#174'rF'#164#158#149'('#166#20#202#132#221#154#142\r
+  +#4'3A'#183#219'g'#213','#229#252'?xu'#235#181#139#249#180#203#176#156'\'#10\r
+  +'Y'#166#174'l'#220#246'[-'#231#215'l['#179#212#255#254#143#236#27'kB'#209'h'\r
+  +#249#141#233#200'J(*'#166'R'#242'9'#159#211#204'lz'#225#190#3#0'0^y'#162#254\r
+  +#240#129#174#250'f'#181#214#201#16#219'q"/I'#149#193#171#11'L'#16#135#231'<'\r
+  +#199#190'%t'#156#149'{.'#233#173'Y='#23#217'\7f'#2#184#150#150'"'#235#31#11'J`'\r
+  +'W'#230#2#17#183#133#205'W'#224#4#14#156'"'#141'7'#172#16'M'#27'T'#237#10'S='\r
+  +'#V'#231#12#154#184']`'#18'6up'#31#186#207#8#0#239'5>'#247'Y'#255#139#175#141\r
+  +#28'['#131#212#156'6(s'#158#132#211#185'&'#210'm'#242#244'g'#132#246#139'DU'\r
+  +#161#131#226#170#4#243#23#29'+'#133#135#234#209#137'n'#242#244' '#163#208'G'\r
+  +#207#181#145#211#157#156'B'#19'{'#186#150'5]'#205#202#149'S'#178#197#184'd'#9\r
+  +'&UA'#152'*%N'#149#147's'#181#228'B'#11#165#208'G+L'#178'r8~'#150'!'#138#201\r
+  +#245'1`'#215'S;'#181#15'#p'#160#184'n'#130' D'#17#166'Y'#210#25#190'|Q'#170\r
+  ,'^1[6'#213#202')'#171'1'#21#241#165'L'#10'9'#5'1$'#162'Nd}'#242'_|'#250#250\r
+  +#205'3'#155#185#224#250#165#229#187#203#233#203')_`uJ'#248#230'%'#238#233'x'\r
+  +#231#237'Y'#226#219's'#238'%'#171'u%<'#179'^'#216#12#197#131#26'-'#183#249\r
+  +#133'G['#158'~'#240'Y'#0#144#18'I'#26#185#142'@'#151#143'Q'#180'#l'#247#176\r
+  +' 6*'#203'O*'#23'!'#170#21#184'b'#5')_'#194')Vx'#138#240'H'#211'Q5'#170#152\r
+  +#208#250'('#163#239#128#157';'#176#150'6'#231#210'Q'#173'='#0#229'Z'#199#197\r
+  +#137#9#249#12'T'#181#128'S'#206#210#20'S|iT''r'#24'PT'#250#145#163#250'g'#30\r
+  +'7'#3#192#237#227#247#252'z'#244#208#167#163#251#206#247#238#203'";'#252'|'\r
+  +#137'^['#16#219#175'*Co'#154#167'\7f`L\'#230'9Vj'#241#161'2T'#172#18#21#237'$'\r
+  +#231' '#194'5'#172'|kR'#180#210#195#156#238#226#206'402'#21#212'T9-'#3#226'+'\r
+  +#193'''K'#177#201'2'#194#212'Ib'#190#152'4[E^h'#166'-'#14#178'V'#208#226#13\r
+  +#150'f]'#172'_'#224#203'B'#255'z m'#207#1'4'#223#5'g'#185#208'l?'#158#19#163\r
+  +#139#166#249#178'Y'#133'vA"'#203#154'My'#179'.b'#211'9'#207',-~~'#247#206#205\r
+  +#179'y'#157#144'p'#231#218#217#179#139'['#249#240#249#148#251#236'l'#244#236\r
+  +'f~V'#193'n'#255#193'K'#234'o?'#9#222#152#161#220'Y'#244#156#137'F7R+K'#217\r
+  +#211#201#204#204#216#232#192#177#7#128#246#3#143'u'#159':B'#158#156#20#11#228\r
+  +','#177#5'#p'#162#20#169'6'#154#183#147#147'ha$j'#137#225'FB'#164#22#237#173\r
+  +'E'#184'Gp'#10'6'#170#7'Z'#179'7,'#237'TbKB'#234#137#187#183'WV'#150#231#241\r
+  +#28#13'L'#16#28#18#166#251'%'#211#163#138'Y'#140'f'#134#161#201#243'd)'#13\r
+  +#215'"l'#235'a='#251'x'#182#242#168'}7'#176#246#4#240#179#161#231'~'#10#217\r
+  +'\7fc'#232'@f'#172'.'#204#225#187'l'#11#250#240#171#202#216#247#165#225';l'#243\r
+  +#2'\'#24'j"'#250'*1'#129'ZL'#176#159#149#195'k'#207#208','#151#209#170#205'A'\r
+  +#222'l35Y'#142#15#159'@'#239#220'_)!'#238#248'o'#25'1'#3#198'])i'#230#20'q'\r
+  +#166#4#159#175#192'M7'#147#11'#'#220'y'#148'pf'#231'GZ'#129#7#216#5#226#219\r
+  +'u'#4#205#246#128'"'#240#3'D'#182#143'.'#8'r'#197'a'#174#216'+'#149#251#20'r'\r
+  +#187#217#228'b'#211'XU'#165''''#207#173#207'^'#216'(|'#243#139#255#152#138\r
+  +#205'$|'#11#133#248#185#153#216'f.<{ny1'#27'T'#142't'#236#251#228#237#169'/'\r
+  +#223'_'#218#154#177'm'#21#162#23#151#214'g'#147'K'#1'G'#246#208#211#7#143'?'\r
+  +#181#187#179#244'q!i'#216'gS{'#220'N'#139';*2'#198#198'iV'#136' '#218#203#8\r
+  +'6'#224#221#229'('#27#168'J'#156#163#154#224#234#194'K'#8#144#30'z'#255#139\r
+  +'6V'#157#134'\L'#27'?'#252#230#141'9'#191'/B'#226'zG'#217#233#10#148#175#142\r
+  +#30#29'Q'#207'N'#202#211#24'Y'#154'*'#154'b'#162#212#172#210'J'#211#137'g,O'\r
+  +#1#214#189#192#252#243#192';'#189'O'#221#133#21#157#29'.)'#224#198#179#10'C'\r
+  +#196#187'j'#9'^'#19#184#174#224'ukc'#220'x'#27#193#214'Fs7'#146#156#29#244' '\r
+  +'TQ '#24#215#209#234#229'q'#241#204#0'/W'#131#11'U'#225'#`'#219'\'#186#227'-'\r
+  +#137'bR'#162#152#152#2'UC'#153#174'$f*'#8#153'j'#242'T3k'#166'_4'#15'U'#205\r
+  +#19#180#211#28'C'#18#184'o?'#24'}''H'#130'0I'#24'"'#241#253#12#161'OeL'#131\r
+  +#14#200#21#155#5'"'#189'Fc'#185'x'#225#234'L!'#23#241'{~'#249#213#231#185'd'\r
+  +#208'f0%'#131'Ka'#231#202'tt3'#31']'#154#10'e6f'#11'S!'#11#14#210'8'#21#149\r
+  +#252#231#23'77'#23'\gV'#18#183'/'#159'_/'#172'B{q/>q'#168#242#240'#C'#173#7\r
+  +'p'#19#13'B&'#198'j1'#152#172'>'#177': '#208'OI\'#27#12#243':\6'#215#203'L'\r
+  +#214#227'}'#165'('#251')'#184#165'n'#130'+'#227#144'-'#244#238#132'f`'#164#26\r
+  +'h8'#2#172'L'#219#237#214#16'hv'#163#204'B'#21'&^K'#143'wI2'#157'l'#223#16'+'\r
+  +#128'b'#165#169'('#11#250'D'#149#188#232#144#250#133#7#213#143#1#225'C'#192\r
+  +'V'#215#129's'#19#213#233#254#198#5#177't'#202#28#243'y7d'#246'3D'#237#218\r
+  +#132'd'#182#151#25'o!'#186';'#153'>'#240#227#195#226#4#198#180'D'#176#158#134\r
+  +#169#23'{'#217#217'VJ'#162#6#27#169#198#197'*'#240#137'\7f'#183'~''I'#160#210\r
+  +' '#190'JB'#178#18#27#7#157#26#236'u'#234'X'#211#29#162#194#144','#7'U$('#154\r
+  +#24#176#247'9ph;'#202'Sg'#177','#23#134'n'#229#200#130'h'#178'b`'#156#204#17\r
+  +#233'DR'#221#225'#El'#22'\7fei'#249#141'['#183'>'#186'{7'#25#244#167'#'#233'tx'\r
+  +'9'#234'Y*$N/Om'#205#167'f'#207',,l'#204#196#221'z'#166'^'#2#251#229#231'7>'\r
+  +#250#254#214#153#197#208#203#231#214#174#157'>'#131#28'D'#29'~|\7f'#195#241'}'\r
+  +#240#222#18#242'd'#167'Z'#200'(d'#166#226#177'Y'#189'9'#227#141'_'#182'E_'\r
+  +#210#6'_'#17'9n'#226#149'g'#135'Y'#243#173#248'L#:'#209#139'4'#242#137'8r'\r
+  +#207#225'y'#23#194#194#174#182#240';~'#249#201#173'X$?'#130'2'#140#177'f'#26\r
+  +'HY'#16'_=+\'#141#183#182#226'm'#163#228'('#22#231'!'#244'Rx]'#19#204#178#26\r
+  +#236#190#199'Y'#251#31'q6'#151#166#160'#~4>$u'#26#213'Y'#182'r~B0'#219'N'#203\r
+  +#130'Mr'#11'9'#222'L'#14#245#240#211'}'#162#204#184'|'#22#174']'#133#170'W'\r
+  +#251'y'#133#22#208'X'#241#137'Z\'#178#26#159#174#196'g'#202'v'#236'"w'#138#4\r
+  +#170'PB'#154#170#192#167'@|'#224#18#140#190'zV'#161'M'#144#239#19'fG'#133#17\r
+  +#140'$'#0#236#1#241#237':'#206#16'E'#137#28#23#158'i'#161'p'#204#12#190#145\r
+  +#198'Q'#176'x'#242'_'#253#246#15#26#173'qey'#227#171'/'#191#142#6'"Z'#185':`'\r
+  +#243'Y4'#246'Lx1'#233'_\H'#159#217#154#187#180'Y'#216#184#188#178'~sk'#229\r
+  +#226'b'#130'O'#236#217'('#152#182#255#240#163#155'['#233#141'B'#232#149#179\r
+  ,#27#231#230'W'#168'P'#216'p'#195'Ih'#219'I'#194'h'#171'V@'#143#249'<'#30'gH'\r
+  +#167#15'['#156#243'6'#255'ys'#224#154#202'u'#157#169'9'#15'c-'#244'a'#167#186\r
+  +'Q'#217'q'#140#147#142#128#146#250#142#248'%'#221#10#220'I='#171#245#206#197\r
+  +#25'2'#145'#'#208#230'&y3'#237#204#217#26'F'#178#146#22#6#211#28#140#163'!r'\r
+  +#20'J'#138#145'iA'#22#217'J'#30'eMV'#245'@'#139#235#152#237#3'*'#4'CM'#209\r
+  +#145#137'6'#8'%'#218'AJWa'#211'%'#152'D'#5'!'#221#4#142#22#156#169#30'A'#161\r
+  +'[X'#232#225#207#128'SZ'#11'5SOH'#214#19#210#13#164#233#26#236'T5n'#170#18\r
+  +#159'+#'#20'J'#9'3%D'#176#228#205#149#16#11#213#196#169'Zb'#22#236'`'#26#24\r
+  +#179#205#188#197#14#225'\'#175'`j'#136#23#129'r'#220#192'n'#176#167#184#231\r
+  +#20#150#234#148#27#166#149#230#12#134'"W'#26'}r'#157#237#232#201'R'#18#141\r
+  +#254#151#191#254#237#221'w'#222'_'#152'[N'#132'2'#1'W'#204'e'#10#206'g'#215\r
+  +'S'#193#249'T`q>'#181#185'9sn'#179'p'#250#220#252#218#205#141#181';'#231#150\r
+  +#194'f'#142#150'7'#254#213#7#23'~'#245#217'K773'#215'W'#167#222#184#180#181\r
+  +#146#244#147'G'#234';N=>'#212'p'#152#137#236'g'#224' z'#185'$'#155#202'g'#166\r
+  +'Vb'#169'3'#145#212'eg'#232#138'D'#191#134#165'e'#135#225#161#254#201#224'$T'\r
+  +#135#232#233#16#194'kX'#163#135#152'#'#7#10#30#234#167'o_'#28#232#29#211':'\r
+  +#22''''#249#211'='#252#133':V'#182#130#22'kb'#199#187#217#137'Azr'#136#154\r
+  +#237'$g'#134#217'y'#24'#1'#137#177'NL'#200' '#147#210'I'#184'v'#8'ikC'#135\r
+  +#170'Ap'#248#194'I'#226'B'#9'y'#174#138'1'#219#202#153#235#17#206'7'#208#167\r
+  +#154#152#185#22'F'#161#142'4U'#133'IVa'#192#208#203'5Rfkp3U'#248#153'J'#194\r
+  +'l9a'#190#140#176'XJ\,&-'#150#17'g'#193#150#165#158'<'#221'@'#155'if/'#180\r
+  +#240#151#219#5#243']'#156',X'#181'Gi'#182#157''''#189'w?X'#193'W$1T'#19#146\r
+  +#168#0#187#10#2'S'#164'6'#219'.\'#187#134'!'#224'/\'#188#236#243#135#195#161\r
+  +#148'Ldt'#152#227's'#217#179'6]l*'#182'2'#155'^_'#202#157#1#241'm'#205#158';'\r
+  +';'#179'veq'#249#246#214#202#237#173'<'#21#210#192#197#180#252#250#211#235\r
+  +#223'~~'#235'?'#222#187':'#23'2'#190'~6'#255#202'z8'#168'B'#135't'#228#168\r
+  +#149'#'#160#140'h'#196#164'T'#204'e'#181#232'c'#209'T0<mweE'#178' '#142'h'\r
+  +#153#128'h''&'#141#24#184#148#141#24#135'4>G'#238'='#160'''7N'#217#169'_}'\r
+  +#240#10#232#215#157#163#204'qNr@'#188'P'#199#206#149#211#18'm'#130'\'#15'(Z'\r
+  +#178#139#14#182#184#185'2'#218#252#206#237'9J'#170#19#31'lG{'#154#209#193':L'\r
+  +#162#146'0SDX<NY+f'#158'.c'#174'WPgk);'#1'X'#138#137#130'i'#216'H'#159#173\r
+  +#167#22#234#136#211#160#234'I'#133'ZB'#225#255#143#15'T'#25'q'#190#134#148\r
+  +#223#217#140'2SO'#159'k`-6'#178#10#160'G'#183#17'='#195'd'#199#206#179#242#0\r
+  +'pD('#143'3'#248'n'#174#212#197#16'h'#31'}'#246#5'`'#247'=d&'#253#226#245#171\r
+  +#129'H'#148#197#22'x<'#137'tb'#205#235','#164'#'#231#166#19#23'r'#233#211'+'\r
+  +#179#231'7'#230'/m'#205'_'#190#188'r'#253#234#242#197'k'#203#155#175'l'#174\r
+  +'^YLq'#145#237#199#159#0'2N'#198'kg"'#191#249#228#218#148'K'#184#153'6D'#180\r
+  +'X3'#183'/f'#194#206'G'#4'Q;)'#23#19'm.;'#210'q'#213'L'#222'5='#229'ID=.'#167\r
+  +#221#168#183#24#180#14#187'9'#20'q'#133#220'*'#22#161#191'HO'#237' '#247#31\r
+  +'m<'#180#139'4'#222'n'#214#153'$'#250#232' '#197';$Yh'#228#22#192#137#181#158\r
+  +'='#213#194'J7'#226#131#205#180'L'#5's'#233#24'e'#238#24#30#156#180#146'5'\r
+  +#196'D-)'#9'&Z'#13'}'#233#20'u'#245#8'q'#249'0i'#237'$}'#163#148#182'PBH'#151\r
+  +'c'#252#213#248' h'#2'U'#212#233':Z'#30#132'XM'#202#214'Qs'#245#164'\5.S'#131\r
+  +#159#174'"LW'#18#242#229#196#25'0'#232'J'#137#243#160#192#149'jb'#174#150'0'\r
+  +#5'.k'#200#179'5'#180#249'Zj'#174#14#31'k'#196'8G('#238#157#191#29'<'#248'X5'\r
+  +#142'j'#18'*B"'#149#183#181'w'#162#181'o'#24'C'#161#141'!'#17#193'TR'#174#209\r
+  +#187'}q'#153#194#238#247'/'#248#188#171#145#192#185'D'#228'\*'#190#186'0{nm'\r
+  +#238#242#198#252#149'k'#155#183'^>'#253#202#245#181#11'/'#175'o\Y'#200'l'#164\r
+  +#172#148#209#138#209#198'}'#131#181#143''',D#g'#24#222#241'"'#200#130'5Y)%'\r
+  +#182'('#233#237'RZ'#179#152#222#204#161#214#19#208#229'(X'#25'l'#162'tt'#160\r
+  +#184#175#163#168#187#229#212'pg=r'#180#135#138#28'&'#140#212#25#216'#y'#7'KG'\r
+  +#238'Y'#244#201#165'$H'#208#237#253#248#167#223#246#224#12'#'#146'|'#19'o'\r
+  +#166#8#31'-'''#131#181',T'#129#176'7R'#163#229#140#169#227#228'4'#200#180#129\r
+  +#147#7#11'S3'#167'PI'#153'.&L'#23#211#150#142#18#231#142#16'fK'#168#243#149\r
+  +#212'\%1'#10#250';h'#29#13#212'D='#3#4#151',F'#251'K'#144#190#26'b'#172#129\r
+  +#156#172'%$'#192#177#172#150#152#6#129'V'#129'vA*'#148#147'fA'#129'+ \0'#205\r
+  +#193#24#4#241'UQf'#171#201#211#181#184'h'#3#202'9J'#5#251#190#157'G'#132#14\r
+  +#10#21#17',U'#195#151#187'p'#12'Iq]'#139#197#23#208#218#29'"'#141'N'#170'1)t'\r
+  +'.'#149'>'#172'3M'#155'mK'#14#215#25#159'o+'#145#216#156'_'#184#148#159':'\r
+  +#179#182'x'#253#226#250#171#27#133#243#231#231'O'#131#249'{}'#181'`'#228#163\r
+  +#21#148#254#160#14#203'G'#215'q'#16#213'Lh'#149#138#218#167#167#141#153#152\r
+  +'P#'#27'b'#224#140#155'D'#227'N-'#220'eD8'#140'P'#131'r'#152'N'#168#25#234'z'\r
+  +'~b'#224'(f'#188#188#171#230#217#182#138#167#25#136'V*'#180'QB'#232'Eu'#28\r
+  +#231'A'#154'E'#240'.'#139#128#26#176'YS'#185#213'~'#156#186#149#228#170'"'\r
+  ,#197#14'A=e'#164'x'#29'-q|TU'#133'6up"'#197'p'#253#152'<'#215#203#139#131'}5'\r
+  +'''|}P<[K'#138#214'P'#179'''P'#145'c0'#223'1'#168#19#156'4Z)'#129'z'#164#161\r
+  +#159#29#172#194':'#27'h'#209#6'j'#168#28#227#4'='#180#4'nneD'#26')'#129'*'\r
+  +#172#187#12#229'j'#164'%A'#208'e'#248'8'#24#203#167'p'#201'z'#214'\5'#24#212\r
+  +#132#20'h '#213#228'<'#136#175#134#146'k '#166#218#8#193'a'#178#7#216#189#243\r
+  +#140#203#1#129'<Lf'#155#232'|'#147'@'#233#208#218#131#159#253#236'w'#159'~'\r
+  +#253'['#174#220' P'#217#164':'#191#202#148#212'['#231','#206#13#135#247#130\r
+  +';p'#222#233'_'#10'''V}'#129#133'Tbsn'#250#210#234#204#197'KkWV'#179'9>'#14\r
+  +#198'F'#245'q'#208#237'v9LBlS'#210#186#21#212'n9q@'#130#153'01'#169#1#185'('\r
+  +#170#151'D-'#146#184'C'#24'qrCvz'#204#195#4#229#179#16#253'V'#146#207'H'#228\r
+  +#226'Z'#161']'#199#241#163#213'N%^'#207#135#241#145']a'#5'='#165#19'8D'#244\r
+  +#176#195#178#177'ua'#146#170'n#Z'#26'('#177'~'#197#230'IT'#160#141#147']|'\r
+  +#231#191#216#190#213#138'1V3RX3'#206#233#192#170#170'F'#185'c\\7f;'#209'^'#9\r
+  +#209#150#142#235#20#217'7'#252#167'\7f'#12#142#201#253#204'@+'#218#208#142#214\r
+  +#212'B$Mxk'#7'3pr\'#209'Ju'#13#242#195'=,_-Z_'#2'Q('#166'^A'#26#150#202'1'\r
+  +#246'jb'#160#134#18'k`f+'#200#233#10'0$I'#201':r'#10','#8#181#212#153'j'#234\r
+  +'L-5'#223'HJ'#183#19'C'#255#7#223'~'#142#204'O'#23'9'#176#12#13#158#165'a'\r
+  +#203#237#169#249#243#209#252'i'#174#202'-'#208#6'$'#134#132#210#146'S'#218#22\r
+  +'U'#182'U'#165'uMn^'#146#155#166#140#222'9g`9'#154'<'#27#143#159#158'Jo&'#131\r
+  +'Sd'#4#166#242#232'~'#1'yBL'#29#180'+'#144'j'#214#144#150'3'#162'b'#142'RG'\r
+  +#219#153'c0>'#132#202#133#146#25#147#24'6'#12#173'f2'#189':e'#210'c6'#201'XV'\r
+  +'%S'#197#197#138'iP%'#11#206#199#13#161#251'j!'#157#165'B'#234#168#146#5#21\r
+  +#160#134#4#144'~-'#17'&F'#143#219#228#2#167#211#137'd'#202#224#146#157#132'-'\r
+  +'A'#6#26'iY'#243#234#199'_no'#179#156'S'#133's'#183#226's[ZW'#234#214#221#175\r
+  +'Ib'#187#216#154#189#245#195#223#243#140#211#189'h'#205#249'7'#254#243#205'/'\r
+  +#182'?'#254#253'6N'#28'2'''#206#217'3'#23'h'#134't'#230#210#143#152#174'%u'\r
+  +#230'J'#234#234#135#194#192#154'*y.{'#245'C'#178'5'#255#214'o'#183#163#151'>'\r
+  +')Gj'#27'('#190#10#156#187#158#14#230'x'#166#154#146'h'#160#166#26'i'#233'zZ'\r
+  +#190#158'>SC'#155#173#163#21#154#200#153#255#133'o'#239'A'#28'SO'#21#216'h"'\r
+  +#7#137'gAP4'#16#130#2#197'0'#177#20'a'#142':!4L'#203#172#243#10#199#178#204\r
+  +#182',2.'#242't'#5#161')'#167'p'#206#25#253#171#238#200'i'#176'}s{'#242#10\r
+  +#153#249#248#161#195#149'E'#7#131'N'#153']K'#9#218'XN5'#209'(B'#27#248'X'#22\r
+  +'|L'#130'a'#170'I'#10'-M'#165#164#200'%$'#145#148','#148'R'#5'"*'#143#133'#'\r
+  +#161'F'#198#186'j'#170#155'KO'#13'4'#214'@'#187#154'G'#155#170#187#171#143\r
+  +#243'h'#147'V'#21#195')'#229#24'('#132'y'#187#233'|:'#242#147'wn\7f'#246#241']'\r
+  +#24#153'9L'#213#14'p'#146'M'#228'T1'#212#25#188#248#229'k'#191#218'f;b'#191\r
+  +#251#231#246#221#207'~'#246#254#143'\7f'#249#245'7'#255's'#253#245'O^'#187#251\r
+  +#179#247'>'#251#246#211#159#253#237'D'#229#208'\7f'#254'i'#251#245#31#254#250\r
+  +#252#237'Os'#155'w~'#242#205#246#237#143'~'#191'~'#235#211#247'~'#185#189#249\r
+  +#198#151#175'\7f'#249#221#214'[_'#174#221#254#204#183'x'#227#238#175#183'_'#250\r
+  +#244#15#11#183'?7'#205#188'|'#176#155'> L4'#211'B'#205#204'D'#3'#UA'#136#128\r
+  +#233#12#10'lw'#234#233#133#26'z'#1#180#142'FR'#242'\7f%'#239#253#7#137'\3'#153\r
+  +'o%'#9#29'$'#129#155'&'#13#193'iv'#166'2M'#16'DH'#162#24'U'#158#229#128#200\r
+  +#172#139#160'X'#198#25#154'v'#154#170#153'")'#211'$I'#130'!O'#144'y.'#137'* '\r
+  +#144#232'O'#158'<'#217#217'^'#157#137'['#236'Ff'#200'%'#246'['#4'V'#5#195#165\r
+  +#17#218#21'R'#21#141#175'eJ'#213'L'#185#154#165#210#9#140'&'#177'M''4'#203'Y'\r
+  +#26'.ILE'#177#232'h'#186#136'&'#208#9#21'n'#141'>b'#177'F'#29'&!'#11'%d'#192\r
+  +#21'T'#188#147#203#217#8#248#230#157#230#183'.'#175#254#248#195#183#194#217\r
+  +#169#166'qR'#3#220'H'#181']99'#164#143#158#255#252#165#159#254#1'!'#209'\7f'\r
+  +#249#199#237'~'#24#237#195#175#254'k'#237#234';'#222#204#233#183'>'#252'Mz'\r
+  +#230#226#135#159'\7fs'#164#168#249#173#31#252#199'{'#31#254#188#165#23'a'#244\r
+  +'M_x'#253#179#31#253#234#159#237'p'#222#251'_'#255#221#30#223'|'#233#221'_'\r
+  +#188#244#238#207'T'#158#130#204#145#249#226'O'#219#235#183'>9'#247#206#207']'\r
+  +#139#183#14'vP{'#152#193'z'#188#167#5#236#138#248#179';?'#147'S'#227#13#180\r
+  +'x==]G'#159#174#166#229#193#17#184#129#152'h'#197#7#254'_|'#187#159#150'Y'#19\r
+  +#28'u'#8#193'0'#142#19#244'Ti|'#20'g'#31#198'9q'#252'4'#154#151'Dq'#227'(A'\r
+  +#28'-'#140'!'#4#161'q'#150's'#128'j'#238'&'#218'z'#240#246'N'#180'q'#140'b'\r
+  +#31'''had'#25#20'G?QZ<8'#220#230'tH'#20'b'#172'IC3*'#152#26#17'C#'#228':'#213\r
+  +'*'#189#128'+'#163'Sh'#8#4'v'#28'J'#130#17#248#20#137#140#173#17#179#244#2\r
+  +#186'F'#196#212'i%V'#181#192'@C'#209#8'P,'#27'O'#230#146#137'*9'#195'e'#22\r
+  +#219'$"+'#155#23#149#202'\\zP'#199#181#233#185#155#231#183#2#133#205#22#184\r
+  +#190#147#24'n@'#184#166#174'~q'#250#251#159#158#234#31#255#221#246'vq'''#234\r
+  +#251#255#241#221#7#191#218'6D6'#182'^'#254#228#171#223'm_'#190#249#254#201\r
+  +#146#214#31#254#232#235#151'n'#189'[Q'#215's'#245#245#143'>'#254#245#223#223\r
+  ,#253#197'?,'#169#211'w'#191#248#243#203'o\7fy'#249#229#143'>'#254#234#207#171\r
+  +#23#222#188'x'#251#195'w~'#252#237#27#159'~s'#253#253'_'#185'fn'#150#12#240\r
+  +'['#240#142'&B'#160#151'?3(^'#239#17'.6P"'#245#212#8#232'T'#181#180'L5-'#7':'\r
+  +#18#136#239'\7fE'#223#158'''u'#254'<O'#23'e(B8'#142#159#163#158#133'3b'#147#212\r
+  +'8E'#182#136#17#20' '#172#228'(#8Lw'#245'RL'#173'Xe'#29'\R'#3#211#214'#Mu'#16\r
+  +#205#16#197'1B'#212'7'#14#17'j'#187#134#142#151#151#140'AzdJ'#138'H'#136'Q'\r
+  +#202#200#10#17'M/'#19#242#200't'#25#155#233#210#179#29':'#178'AA'#150#11#8#18\r
+  +'.]'#192#226'0'#200','#28#130#134'G'#176'8T'#185'Y'#227#177#27#189#22#173'5'\r
+  +#29#138'/'#229#242#241#144#135#205'DE'#253'F'#183'Ria'#10#220'l'#222#180'A'\r
+  +#29'7'#241#165','#132'\%|'#239''''#255'9w'#229''''#181#227#224#209'-'#12#235\r
+  +#2#205#228'-'#27#134'"'#149#161#147'C'#252'&'#172'a'#140#23'j'#195#234'+'#250\r
+  +#153'|}r'#12'-'#236#31#194#131'-'#23#129#196#239#236#135'N'#18#4',}'#168#159\r
+  +#172'*'#234'@1'#197#158'1'#8'wx'#148#225#143','#247#141'PH,=X'#247#7'Q'#194\r
+  +'A'#140#162'iLX'#218''''#232#165#133'&%'#11#147#242#211#173#212#217'Jt'#12\r
+  +#196#215'@'#11#215#211#147'u'#244'l-8'#171#208#167#155')'#233#14#18#136#207#5\r
+  +#236'>'#6#214#190'G,'#161'i'#134#196'#1'#206'0'#164'y'#138'h'#6#195#203#241\r
+  +#205#231'H'#138#5#180'$;'#193#139#130#167'5!'#216#209'0/'#216#203#244'w'#211\r
+  +#227']'#148'h'#195#164'z'#144#160#30'#p'#27#186'z'#218'{'#218'FG;'#17#240'N'\r
+  +#169#24#163#211#18#205'F'#134'Q'#199#14#251#205#18'>G'#204#161#24'$('#131'x\'\r
+  +#206#25#19'3&'#212'"r'#208'a\'#152#206'n.'#175'_'#218#186#252#202#213'[w'#223\r
+  +#186#251#193#219#239'}'#242#131#247#190#249#249#215#159#189#255'N:'#2#14'$'\r
+  +#162'h'#200#172#19#243#163'fs\'#167#204#219#21'q'#19'=hfHE'#196#204#236#194\r
+  +#23#223'n'#227#164#211#3'$'#223' '#197'\'#209'7Y5'#132'h'#196#232'O'#142'i'\r
+  +#219'H'#254#226'!EI'#191'd'#128'`'#239#131')'#161'85'#142#164#197#226'e0'#4\r
+  +'wh'#130'A'#18#184'D'#214#25'8?8D'#182#14'"e'#131'PA'#239'8'#135#167#8'C'#8\r
+  +#170#1#132#168#7'.n'#157#16#212#142#240#170'F'#132#29'x{'#19#206#221#128#11\r
+  +#128#205']56'#209#198#156'n'#162#6#155'h'#190'fF'#20#172#134'`'#175#222#198\r
+  +'Hw'#208'b}T'#255'('#25#28#218#14#3#187#246#222#175#214#187#180#198')'#133'v'\r
+  +'A'#166'='#171#176'\'#231#153#206'Q'#180#243'0i'#8'"'#247'BU^'#152'&8!'#139\r
+  +#13'p'#227#253#172#233'!'#206'R'#31's'#19'.'#217#4#189#172#31#134'a'#243#208\r
+  +'DT3~'#172#28#221'W$$t8'#212#232#168#151#225'q'#145#205#14#130#221#203'6'#187\r
+  +#197':-CF'#25'q'#242#144'F'#6'D'#140#25#144#145'!&'#1#197'!'#231#187'5'#210\r
+  +#152#221#176'6'#21#191#176#152'_'#207#197#207#206#198'_'#191#180#252#222#205\r
+  +#211#175'^Z'#156#207#251#162#17'S<'#177#195'1'#228#22#198#28#212#181#4'7iF'\r
+  +#217#20'X'#135'U'#243#198#143'~6'#128#215#13'S'#237#134#232'V$'#183#238'M'\r
+  +#173#141#208'BX'#245#233#234'1'#235#16'9'#202'P-{Rwt'#246'-'#177'"'''#16'g'\r
+  +#244#230'%'#157'y'#133#204#137#147#249#211#12#197#138'.t'#135'g9G7'#206'C'\r
+  +#249#129'^'#162#137#237'XD)2'#131#28#255#164'8'#213#195#240#157#28'S'#193#180\r
+  +#243#221'|'#176'S'#241#182'rb'#197#24'G'#5#217'WG'#245'u0'#188#237'T{7'#221\r
+  +#211#195#240#14#241#194#221'd'#231#24#203';D6'#163'Y'#246#157#255#26#3#187#0\r
+  +#153#194'"S'#166#184#194'<'#153#189'D'#18#172#161#133#133'Ia'#148'h'#205#142\r
+  +'Hm-'#20'e+E'#223#199#14#15#241#166#6'Y'#185'>'#198#28'T|'#5#194'['#154#164\r
+  +#27'XR'#190'T'#8'!B'#138#176#189'/'#152#24#221'f'#214'`@'#131#12'Y'#17#22#227\r
+  +#144#209'8hv'#193#13'v'#156'J'#14's'#138'&'#131'"'#152#151'7'#161#167#244#171\r
+  +#8#189#26#218#136#146'<'#196'A'#180#177#16'm"B'#159#140'2$&'#245#137#136#189\r
+  +'F'#238'D'#210#202'ZMh}Z'#178'KC'#10'x'#196'v'#27'K!'#157#8#187#200#5'?e'#202\r
+  +'E'#13#217'x'#171'k'#139#206#212'*X\7f'#235#160#242';?'#254#219#159#254#177#253\r
+  +#235#255#222#30'c'#248'Z'#208'v'#134'a'#149#172','#208#149#211'b'#195#204#233\r
+  +#203#159#168#141#249'X'#250#138'\;'#237#8#156#227#171#243#4'n'#146#169'Z'#132\r
+  +#210#227'c'#212#192#8#213':'#193#177'RtI'#180'$'#212#133#215#214'L'#138#187#8\r
+  +#214'V'#172#177#151#238#173'G'#235'@5'#226#245'm'#20#203#184','#12#215#165\r
+  +#187'Y'#214'a'#142#179#9'%kD'#200'F'#152#182'!'#170#25')'#240'CYv'#138#212'/'\r
+  +'5gw'#254','#13#236#185#135#167#176'p'#165#25#2';?I'#204#141'R'#178#3't\7f/'\r
+  +#203#209#195#182'v'#179#236#157#180'@;1'#210#136#244#215'C'#237#29'8'#235'0;'\r
+  +#216#134#143#194'D'#249'q'#154#18#203#164'v'#247#150#143't'#31#159#236'8nd'\r
+  +#142';'#4#16#191#26#230#215#15#218'5-Nc['#200'3'#18't"'#156#234#17'3'#189'V'\r
+  +#2'9'#200#232'{'#10'R'#183#183#237#8#208']'#10#12'T'#222'S'#253#2#208'Y'#182\r
+  +#167't?P'#252#28#208'U'#185'w'#178#227#169#161#250#135#186#202#247#12'T'#236\r
+  +#185#18'e'#204#235'a'#17#21'\'#195#25#132#13#22';'#180'D'#139#12'mV3'#206#156\r
+  +'9}'#227#157#207#251'Y^p'#240'z'#182#157'w'#245#227#255#249#227#246#246'W\7f'\r
+  +#220#238#192#11'O'#141#17':'#201'"'#251#204#198#194#141#215'/'#189'u'#247#242\r
+  +#235#223'w'#198'Sz'#151#239#230'['#239#222#252#254#7's'#231'_Z'#187#241#182\r
+  +#216#145#132'rt'#145#133#139'/'#189#246#195#141#211#215#150#215'/s'#133'Z'\r
+  +#165#198'='#191'zu~'#229#134'+8[X'#186#202#149':'#230#215'o'#158'\7f'#249'=Gd'\r
+  ,#246#204#205#239#191#250#254#231#185#205#27#19't'#141'm'#234#252#233#215#191\r
+  +#156#185'xw'#233#250'Gc'#20#189#206#191#164'v'#207':'#163'k{'#31#219#233#251\r
+  +#238'#K,8n'#2'B'#153#30'"L'#247'S'#210'=4O'''#195#220'A75'#226','#245#176'P'\r
+  +#27'<'#221#141#140'u'#192'-'#173#16'j'#19#4'W5'#202#26#160#26#198'('#220'!4'\r
+  +#172#178#246'Du'#233#129#134'S'#7#199'['#202'4'#140'1'#151'l<l'#232#14#232'k'\r
+  +#195#198#234#180#179'=c'#27#136'k'#187#132#19#143#146#218#1'v'#255#189#236\r
+  +#225#7#241#29'{'#196#232#3'Nq'#131#146'R<'#222#188#183#13'DY'#183'GB)'#143\r
+  +#154#199#189#234'~)'#165'L0'#177'_'#222#245'`'#24'w'#234'r\8'#239#19'I'#232\r
+  +#16#183'Y'#166'U'#136#12'Fkn'#237'%'#199#220#157#10#180#191#137';'#215'DO'\r
+  +#173#189#253#135'o'#183#183#191#248#205'wE'#29'C'#149#227'H'#145'/'#244#203\r
+  +#237#237'?lo'#255#230#239'\7f'#253#221'_'#255#248#219'?'#255'^g'#213'}'#183#253\r
+  +#221#239#255#242#199'o'#255#246#221'\7foo'#155'C'#209'+o'#221#253#203#246#246\r
+  +#246'?'#183#183#255#246#207#255#254#246#207#153'x6'#232#9'o\7f'#183#253#151'?'\r
+  +#252#207#231#159#254#236#191#190#253#251'tf'#225#239'\7f'#219#217'`n~'#229#23\r
+  +#191#252#13#184#225#219#239'}'#168#247'd'#190#254#211#206#158'\7f'#245#221#246\r
+  +'7'#219#219#31'|'#253#183'`'#238'Bb'#246#170#209'S'#0#30':'#4#0#247'>'#12#227\r
+  +#234#7#9#254'>\'#170#143'83'#200#202'w3'#221#29'tc#A'#219#130'uw'#192#210'm#'\r
+  +#201#166#30's'#215'('#151#200'%'#171#156'"'#150'N'#211#137#198#246#162' '#16\r
+  +'"'#2#134'A'#128#29#223#139#251#14#28'}'#250'ixO'#141#16'_'#239#148'U'#4'TG'\r
+  +#2#210#231'B'#146#253'q'#209#169#184#160#216'I'#222'g'#198'?'#146#150#23#231\r
+  +#244'u'#22#250#139#6#250#17'+'#183#148#131'x'#158#5'\7f'#158#143';'#174'a'#215\r
+  +#186#148#221'~'#253#144'W;'#224#148'w'#251#133#205#204#10#192'6'#242#236#134\r
+  +#131#30'5p'#19#1'o"]'#208'['#163#4#158#19''''#207#181'12'#165#196'\'#3'w'#181\r
+  +'O<\7f'#229'G'#223#253#247'?'#182#255#248#199'\7f'#212'wO'#22#183#14#191#252#238\r
+  +'''\7f'#222#222'~'#231#253#143'3'#217'<'#248#253#191#253#237'o'#164'|'#190'Q'\r
+  +#173'~'#233#242'U'#16#214#255#252'}['#165'4'#254#243#159#219#160#28'V'#207\r
+  +#167#31'\7f'#190#253'?'#219'7'#174#222#166#16'9\7f'#7#137#254'c'#27'|'#249#221'_'\r
+  +#182#147#241#194'w\7f'#221#254#231#255'l'#219#29#222'\7f'#227';s'#254#202#230#197\r
+  +'W>'#250#226#247#191#254#243'68'#143'}'#243#183'm'#240'J'#168'm)'#169'!'#194\r
+  +#22#219#0#224'I'#0'x'#224#137#9#174#169#19#231#237#198'g'#6#153'Kc'#194#133#1\r
+  +'^'#8#204#249'f'#156#182#9#170'k'#26#176'w'#246'['#225'p'#173'Vc<\7f'#214#251\r
+  +#217'OVn'#188'>'#175's'#137#8#28'X'#239'D'#23#28#131#239#232#26'on'#24'}'#225\r
+  +#233'#'''#158'{|'#164'e'#159#148#252#172#149#243'=;m'#183#155'rO'#156#249'\N'\r
+  +'x2'#196'x.'#194'?'#184#230'l='#31#29#153's'#244#204#186#7'W'#162#232#130#23\r
+  +#182#24'!'#174#166'XK'#9#214#148#151#24#179'c"V'#148'[9nd6G'#153'u+'#6'XDM'\r
+  +#197'A&'#20':'#15'G'#21#197'r'#131#245'c'#154'&l'#168#18#159#169'd,W'#210'g'\r
+  +#14#15'('#223#252#201#223#190#249#253#159#191#249#213'o'#234#218#134'aT'#197\r
+  +'['#31#254#252#189#143'~'#17'K'#205#155'L'#158#191#255'u'#7#135'L '#233'k'\r
+  +#237'z'#247#245'wA:'#191#249#249'7x'#12#253#141'W'#223#255#242#167#191#209'h'\r
+  +'l'#239#253#240'S'#144#216#155'o\7f4>I'#248#199'?'#183#191#251#251#246'O'#190\r
+  +#248'}0'#156#147'+'#173'\7f'#249'n'#7#166#214'`'#253#234#151#191#6'W6'#206'^'\r
+  +#180#187#194'\7f'#223#222#254#233'W'#191#247'G'#243#161#228'R$'#189'R'#221'4'\r
+  +#130'"'#138'qT9'#0'<'#1#0#15#239#155#228'[zI'#222'^'#10#136'oa'#152';'#223\r
+  +#195#12#247#208#29#16#190#167#19'"'#234#26#224#136'x'#214#11'k+?'#255#232#226\r
+  +#159#190#206#253#230#139#255#167#135#239#128'r'#162'P'#219#14#229#130#21#203\r
+  +'U'#239#239'U'#239#253#188#194#231'- *EP'#132'e'#217#202#214#244'lz'#157'$'\r
+  +#147#222#219#166#215'I'#159'$'#147#186'I'#182'Wv'#233']'#164'X'#168#130#20'A'\r
+  +'@'#16#245#170#159#138#5#17#20#148#155'o'#130#255#255#159#243#156#156'7g'#223\r
+  +'9I'#158'y'#222'6;'#243'F'#190#254#172'|'#244'Hj`'#176'['#4#18#155'Z:'#137'd'\r
+  +'9'#141'f]'#177#12#191'`'#238#188#206#250'y'#6#224'/~'#197'C~'#0#19#230'b'#10\r
+  +#224'3'#163#134#151''''#220'+G<'#181'#'#222#134'^WC'#198#180'&a'#172'O;'#176\r
+  +'9'#31#189#24#18'f'#3#194#148#23'@'#252#210'2l'#232'K'#154#226'N'#208'"'#193\r
+  +'v'#11#155#142#239#29'-'#245#22#25'2k'#167#16'Z'#184#214#180#12#231']'#205'B'\r
+  +#150't%'#151#178'{'#22#3#3'+'#196#189's'#235#192#15'?'#255#165'r'#231#151#202\r
+  +'/?'#190#214'L'#154#183#146#240'J+'#199#157#30'y'#235#244'g_^'#175#160'z'#250\r
+  +#242#187'_'#136']\'#145'T'#247#237#181#219'7nU'#162'H'#249#209'?'#207#147'j'\r
+  +#157#253#227#219'?'#249#230#6#234#128#226#224#201'KD'#166#12'5'#190#190'^'\r
+  +#241'DJs'#23#172#16'(,('#243'(t6'#239#185'O'#191#184#241#159#202#166']{'#240\r
+  +#132#174#219#183#170#231#3'U'#250#193#195'g'#5'b'#221#170'z<'#153'!c'#240'4'\r
+  +#213#245'#'#152#217'\7fl'#23#219#234'Y'#158'5'#172#216'jfv%#'#253'*%'#184#138\r
+  +#226'\'#220#196#227'),#'#163#3#23'O'#238#248#225#163#241'k'#31#132#175#159'R'\r
+  +#221'<'#171#248#225#156#229#135#203#137'/'#206#247#31'<0('#6#229'8'#146#6'Gt'\r
+  +'0X^:'#141'gR'#147#146#190#154#140'{n\yoD'#240#135#188#248#233'!'#221#162'>'\r
+  +#203#138'>gC'#201#217'Xt'#181#244#6'(9'#15#25#182'we'#252#130#148'O'#156#240\r
+  ,#201#19'~'#21#236#211'F'#156'*'#200#170'@'#17'p'#170#142#30#217'q'#171'r'#219\r
+  +#154#236#173#229#216#214#8#144#21#172#204#10'Z'#170#134#149']'#197#205'/'#164\r
+  +#196'_bgk'#164#133'%$'#195#27#135#207#163#9#236#250#215#159'-k'#192'>'#183\r
+  +#162'sx'#207#9#148'O4I'#21'''w'#221#184#203'N};'#25'J'#228'~'#186'S'#181'qt'\r
+  +#193#226#149#141#223#254'\'#249#225'Ne'#239#225'S'#23#191#184#138#250#160'F'\r
+  +#27#153#243#253#173#170#131'7V'#152#191#180#214#27#203#161#246'W?'#221'V'#152\r
+  +','#23#190#248#2#245#217#176'c'#215#210'%'#175#182#183#224'vn'#219#139'2'#136\r
+  +#198'>'#170#214#186'FR'#7#145#199#17#26#238#210'7'#243#241'N'#192'R'#207'0'\r
+  +#213#210#220#171#169#241'Zj'#186#134#152#170'#'#5'Z)J'#2#181#243#141#29#129\r
+  +'/'#207'A?'#157'W'#223':'#201#170'|'#192#170#156#225#252'r'#140'U'#185'd'#191\r
+  +'~'#17'ys'#3'd'#210#233#219#176#242#166'v'#27#158#234'cr'#148'Z'#13'3'#7#227\r
+  +'J'#177#197'y'#231'3i'#205#159#250#12#11#214#251#155#251'=M'#25'['#253'p'#156\r
+  +'\'#14#18#17'7'#177#20#227#167'! '#238#21#192'Ay:n'#244';dp'#200#18#242#26'"'\r
+  +'~'#19#28#178#239#223#191#245#219';?~'#131'f'#250#161#29#243#201#230'e'#28'd'\r
+  +'%'#183'g99'#178#138#26'k'#0'2'#11#137#158#23#152#209'eBx!Iw'#224#252'7'#191\r
+  +#220#186#243#221#213'o_z'#173#238#197#154#182#157#7#207#160#191'vb'#235'^'\r
+  +#181#197#133#202#7#149'K;'#158'|'#254#242'''h'#220'Mm'#222#246#244#179#243\r
+  +#196'*'#237#181'['#191#253#240#203'm'#149#193'p'#246#194#249#175#190#253#238\r
+  +#228#7'g'#219'qD4B'#191#255#241'g('#18'_'#240#242#146'd.w'#243#183#223#208'C'\r
+  +#24'\'#230#249'+h'#128#223#30#26#31#12#135#226'W'#191#250'qlx#'#228'O'#161'i'\r
+  +#241#135#31'+'#128#216'H'#164'I8'#128#233'n'#240#206#248#19'I'#212#221#202\r
+  +#209#175#229'8Z8'#137'Vn'#169#133#222#223'IO'#243'A'#7#139#213'8'#214#143';'\r
+  +#178'}'#245'wGj*'#31'uT.'#177'*o'#183'V.'#131#215#15#208#183'!MVp'#21#149#136\r
+  +#235' '#168#218')P'''#13'"15'#18#25';'#155#164#245#167'k'#211#206#185'y'#251\r
+  +'\7f'#247#217#151#13#186#214#244'A'#205#136'{'#205'`'#138'R'#138#145'R'#1'B))@'\r
+  +#162#252'DD'#24#134#128'tR'#155'L'#232#227'Q'#3#28'3o'#223#218'{'#232#157'Mh'\r
+  +#241#252#182'r'#237'\7f*'#21#235#192#182#133'd'#203#10'n'#178'N'#144#175#163'E'\r
+  +#154#152#145'E'#237#166#149#188'H'#163'q`'#169#4'y'#182'C'#179#249#131'k?U*7'\r
+  +'~'#173'\'#252#252#218#198'='#135'w'#28'8~'#253'N'#229#205#131#239#195#217\r
+  +#254'/'#191#187#137'2h'#247#133#191#187#241#235'O'#183#238#188#249#238#225'n'\r
+  +'7'#228#14#198'\7f'#167'5'#16#142'\'#184'|'#233#230#237'[G'#142#159'h'#233#192\r
+  +#253'v'#183'r('#180#198#5'//'#13'%'#145#171'?'#221'D},'#30#231'G'#159'\7f'#250\r
+  +#211#157'_'#6#198'F'#160'p'#18#21#221#187#239#156'6'#154#161'['#191'U'#174\r
+  +#221#172#16'h'#178#5#139#27#216'B'#19'f'#26'J'#223#180''''#187'DV,_'#215#9\r
+  +#216#176#0'L'#16#246#17#184#19#20'n'#25'K'#2#197'@'#227#150#241#166#189#163\r
+  +'O'#159#24#185#247#231#189's+'#231')'#149'#'#164'/z_'#220'f\7f'#170#155'x'#15\r
+  +#181#254#9'2'#161#141'.'#180#18#184'p'#29#193'K`'#154#184'BN!'''#30')'#225\r
+  +#163#182#231#203#208#226#129'@}'#222#185#186#28'mH'#248'V'#244'e:'#138#169#14\r
+  +'$'#210#154'Ow'#165'`j:'#197#137#199'X'#145#24#187#220#171#239#235'7'#239#222\r
+  +#153#252#249#198#137'+'#151'w'#220#186#253#225'Ow>E'#211#23#188'nk+'#232'#k'\r
+  +#10'tu'#31'I'#152#192#241#131'k'#24#142#213#194#208#18'0'#245'<?>'#143#25'Zw'\r
+  +#190#242#21#218#166#220#174#160'$^'#252#236'fqh'#7#26'w'#215'\7f'#171#156#253\r
+  +#248#135'ooV'#227#209#228#130#175#223#141'bT'#149#159'|'#251#171'+'#218's'\r
+  +#242#210'7'#168'}'#249'\7f'#174#253#248'k5'#193#237'=x'#170#163'Kp'#245'f'#213\r
+  +#193#18#200'>'#249#223'K'#153'r'#235'ww'#187#159#15#175#222#184#242#211#29\r
+  +#180'1'#218'x'#224#216#139#203#155'.|r'#29#245#255#230'nV'#157#216'vdI'#13\r
+  +#225#213#250'.'#134#168#251#238#173#225#152#167'hB;'#142#167#193#2#22#172'0L'\r
+  +#16#21#241#220#17'2'#167#135''''#178#137#5'M}'#169#197';J'#143#159#159'z'#244\r
+  +#206#190'\7fT'#14#212'\7f'#158#156'W$`B8'#140#1'{'#31#216#245'/'#161#136#205'U'\r
+  +#249#240'"'#164#158#10#145#248'N. ,'#23't'#163'E'#154'U'#250't'#143'\7fi9P'#151\r
+  +#243#172'.'#198#234#194#238#197#197'TcO'#170#25#142#212'!'#137#14'8'#222#153\r
+  +#203#208#145#20#13#10'tNM'#26'6m'#176#238'\7f3'#244#253#213#157#219'68'#246#238\r
+  +#142'~|q'#219#23'_'#157')'#142#142#139#204'q'#141'wB'#227'Y/6'#148#24#178#24\r
+  +'^'#26'Z)'#240#205#231'@'#203'4'#229'E'#162'<7'#252#6#223'2B'#226#6#176'4='\r
+  +#133'gxv~'#141#204#24#22'k'#131#157'tu'#7'S'#131#227#232#151#175'e'#10'M'#177\r
+  +':'#146#180#149#169#165')'#189#207#188#220#216'HW'#201#29#169#14#186#172#1\r
+  +#199#229'H'#29'd'#158#233#191#230#215#129#198#132#220#150#157#183#20#183#176\r
+  +#150#141#5#220#10#255#128'.6'#186#20#7#182#8#173'M|'#243#194'&'#230#252#21\r
+  +#196#186'N'#16#208'F'#245#158#18#142#219#253#236'Kk'#159'{'#169#165#129'('\r
+  +#165#139'l'#213#189'P'#24#204'_'#24'b7'#30'0'#224'P'#13#130#16'V'#156'i'#227\r
+  +#148#176#28'D'#172#12'J@J9'#217'|p'#226#245#175'w/'#191#190#233#197#159#135\r
+  +#23#237#0#166#167#218'1q'#234'c>'#224'_'#26'p'#13#27#228#16#165#221#157#210\r
+  +'T'#167'(E'#19#5'8|q1c'#232'K'#144'E'#196'{c'#230'\7f'#192#150#151'{'#2#171#203\r
+  +#177':'#200#182'0'#31#173#205#195#13#241'@M,P'#27#133#26'{'#210#20'$'#134#15\r
+  ,'y'#155'wo'#181'l'#159#210#149'S'#244#29'S'#154#132#183'}'#247#132#225#192'z'\r
+  +#207'{{'#7#225'xT'#172#240'*'#172#253'J'#219#132#212'4'#192'T'#166'Z'#1'\7f'\r
+  +#147'"'#250#154'4'#213#220'=R/'#239#233#16'"x'#130#131#208#174#198'Q'#212'D'\r
+  +#174#238#213'ff=A'#252#210'j'#202#188'W:'#150#181#242#255#246'*n'#222'*'#210\r
+  +#162#14#225's'#171#200#11#219#4'/'#227'$('#254#222#196'y'#5#11#254's9i'#238\r
+  +#194#150#165#171'9+'#154'%'#175#212#139#234#240#230#197#13#242#5#181#178'W'\r
+  +#177#214#197#173#198'znxn'#157#236#249'&'#213#159#150'q^&Z'#23#180'iVwY'#23\r
+  +#172#230'.o'#147#175#194'k'#255#177#146#241'R'#131#160#158#130#158#27#160'K'\r
+  +#236#186#187'qk'#218'<'#166#20'"'#137'l8'#137#179'S'#30#236#144'%'#215#242'3'\r
+  +'m\'#184#131#170#231'p'#25'=Q'#206#161#9#198'g'#155';'#254'='#184#236#198#240\r
+  +#170'='#210'G'#16#236#195'a'#198'?'#28#130'e'#18'Q3'#9#228'tH'#205#173#210'D'\r
+  +#187'8'#197#146#134'y<I&'#172#236#129#176#188#150#25'A'#213#179'6'#225'Se'\r
+  +#168#166'/'#214#8'Y'#22'g'#161#186#158'XK'#212#189':'#228#168#9#187#234#203#8\r
+  +'5'#19#193'E'#28#205#219#198#212#251'6'#26'G3'#172'}'#147#154#241#20#237#232\r
+  +#166#238#163#235#29'''w'#22#147#193#16'*\7f'#170'0I'#18#229#169'`'#161#19#136\r
+  +#181#138'Cl'#207'`'#139'>'#215#162'Jw)'#210'bq'#204#206#241':'#232'F'#16#11\r
+  +#208#155#233'j'#142'FL'#149#9'(R'#22'I"'#21'Z)'#4#9#157#174#21#8#29'l'#190\r
+  +#149'@'#209',]A"3'#141'X'#138#154'/'#246#129#18'H.'#11's9'#206#214'V%'#185\r
+  +#203#222#197#244'5'#182#155#153#226'L+%'#192#148#151#155'i!'#177'}'#195'*'\r
+  +#178#159#172#238'{'#5'g'#175#227#132'j'#153'h'#14#169'^yZN4'#175' Yj'#233#246\r
+  +#181'<'#23'C'#13'S'#196#238#234#30'4'#148'>'#186'$'#140#23#185#177'2o'#155'"'\r
+  +#216#170#136'4'#136#162#205#130'p'#23#24' P'#248' '#163#13#209#181#159#236'e'\r
+  +#222#216#194#173#236#160'Oq'#30#130'Z'#254'l''/'#214#243'j'#1')'#142#172#150\r
+  +'t'#232#28'm'#170'd'#27#152#16#168#19#0'_'#145#242'H'#202#1#130#134'<''m~^G'\r
+  +#189'w'#0'Z9'#154'$DM5='#254#206#190#8'%'#225'l'#11#155#155#162#221'k'#135'S'\r
+  +#252#156#159#156'v'#226'6'#245#200#142'nv'#31'\g'#253#226'H'#254#204#22#247\r
+  +#177'u'#214'O'#246'e>='#180'q'#176'8'#168#208'!$a'#161#153'S'#236#16#245'6'\r
+  +#11#144'&QT'#28#30#167#152#178#20#9#196'a'#24'q/6'#9#231'.5='#191'$'#188#172\r
+  +#158'~'#223#19#218#185'/)'#158']h^'#176'J6'#247#21#230#147#243#221#181'$'#224\r
+  +#239#175#171'_i'#3'_lR'#188#210#217#221#192#180'6'#178#196'KZ'#233#11#27#208\r
+  +#3#169#171#201#156'f'#14#179#145#7'`'#149#178#174'n'#236'j'#128#214#161'c'\r
+  +#145#29't'#178#131'Jvu'#180#27#201'T7'#153#238#225#136#227'lE'#182#145#27'i'\r
+  +#149#229#215#240#225'FQ'#146'i'#27#193#171'25'#12'{'#187#208'G'#4#189#152#25\r
+  +'OWo'#17#162#136#160'N'#129#171#19#244#182#203#160'VY'#184'Q'#20'j'#18#248')'\r
+  +#146'0[d'#23'r'#197'2'#26'6'#165'&'#237'G'#128#171#219#140'ep'#169#167#171\r
+  +#193'!`'#26#20'|'#129'RDTi'#177'Z?'#217'X`'#26#202'2c'#26#20#171#18#30'p8'\r
+  +#206#244#130#207#13'B'#203#212#228#251#134'C'#13#235#210#140'x'#247#218#18'D'\r
+  +#29#128'y'#136#139#28'2wD'#173#184#209#180'<n#'#245'Fx[J'#186#183''''#221'['\r
+  +#139#170#139#251#146'W'#246''''#143#175'w_'#216#149#188'rp'#227#134#161'I'\r
+  +#167'g'#128#175#29'"I'#135'h'#186'Q'#162#178'P'#195#176'r'#186's'#4#177#143\r
+  +#202#234#230#183#137#25#11#214#28#208#187'+'#31'|\'#233#29#25#174']'#27'\7fi'\r
+  +#185#253'o'#243'C/'#189#230'}y'#133'}'#225#138#255'l'#218#171'\7faE'#178#149'j'\r
+  +'XT+'#249#251#242'`#E1'#255#245'Q'#129#225#131#244#152#165#129'"Z'#222'&]E'\r
+  +#208'4s'#196#171'i'#154#14#137#176'A'#160'$'#234#185'k'#229'"'#130'I'#220'e'\r
+  +#3#168#14#30#205'!'#224'x'#216'L7'#137#233'&J'#211#205' '#130#215#150#219#148\r
+  +#249#215#232#254#6' B'#212'dZ'#5#30'R'#149#190#170#250#254'B'#4'\k'#153#166\r
+  +'&'#134#185#145'ik'#225'y['#129#16#14#140'7'#210'lx'#174#147'&'#176#209#185\r
+  +'j'#14#27'PI'#197#158'nU'#204#235'V'#0#22#153#200'''Q'#250'$'#198#144#212#154\r
+  +#145#216'{A'#203#136#196#216'/'#213'D'#132'"'#176'''c*'#196#169'>'#221#139\r
+  +#195#137'f'#143#228'_%o'#235'H'#154#27#177'w'#22#162#156'R'#18#128#189#140\r
+  +#136#135#145#132#4#227#253'V$"'#202'D'#196#147'}'#150#253#155#195';'#199#237\r
+  +'g'#222#205#157#216#19';'#255'v'#230#226#129#252#149'#'#155'w'#141'OB'#158\r
+  +#188#213'9'#172's'#142#129#214#162#220#211#195'1'#132'%'#150#4#147#231#22's|'\r
+  +'r'#156#177#253#185#213'[-pe'#223#177#155#155'w}'#214'7P'#249#230#187#211#217\r
+  +'|'#229#204'Yt'#254#242'1'#153#255#185'p'#161'`'#233#174'|'#254#249#215'G'\r
+  +#222#203#155#173#149'\7f\7f'#245#253#177'S'#31'm'#223'['#185'z'#211#213#216#229\r
+  +#169#167':'#215'P'#173'kh'#166'54]=K'#213#192#149'5'#11#228#29'r'#9'N-"'#234\r
+  +#4'd3'#135'ja'#211#173','#166#131#198'q'#19#133#161'N0R'#189'l,K'#181#201'3'\r
+  +#237'r'#4'''O'#146'da'#182#18#170#174'&D'#243#31'Q`kc'#26'['#25#166'6'#182#3\r
+  +'/'#128#136#226'(U'#158'd'#169'24y'#140#12'x'#9'|[uw'#145#218#13#168#29#28\r
+  +#169#139'''I'#240#164#25#174#2#230')'#171#219'Px'#170#180'PQ'#20#171#178'b'\r
+  +#153#143#15#8#144#148'.'#147#160'y'#205#175#142'gI'#17#237#138#161#8'c4#'#142\r
+  +#185#136#197#132#160#132'Ha'#136#31#243#243#146#17#201#248#144#183'''c(ft'#27\r
+  +#199#188#7'v!;'#214#251'N'#31'*'#28'}'#19'>'#253'v'#238#226#161#222'O'#143'o'\r
+  ,#219'39'#5#7#10'P`'#196#27#154'0C'#189#14#184#207#149#232#243#132#203'f'#29\r
+  +'b'#3'cn'#142#143#242#175#181'o'#248#11#149#19#31#190#151#200#238'p'#184'\7f=x'\r
+  +#184'('#147'}'#178's'#231#143#239#31#31#12'xo\:\7fh'#235#198#175#206#157#254\r
+  +#230#220#217#253#147#235'.'#191's(mu'#244'z'#131#215#142#158'U.i4,Z'#171'_'\r
+  +#218'nx'#141'`'#172#233'26'#176#140#173'Bm'#167'T'#129#149'I'#241'*!I'#207\r
+  +#239'2q'#233'66'#203#206'f'#187#24'</Y'#24#192#131#213#253'mhUhWd;'#149#25\r
+  +#188'"EQD9J\7fuq#Z}iB+'#158'k"'#242'l(YLY'#148#173'L'#8't'#25#153#165'$2dy'#242\r
+  +'0'#19't'#1'r'#183'T'#231#147'h'#28'\'#208'J'#23#250#233#226#16'S'#234#167'K'\r
+  +#189'T'#208'C'#3'C\IJ'#164'D@'#133'W$'#18#165'`u>'#193#9'[k'#215#23#216#25'K'\r
+  +#203':'#24#24#207#201'a'#15#181#156#148#244'e4'#169#176'('#1#129#233#152'zj$'\r
+  +#212'_'#176#247#23'l'#219'&'#163#7#247#22#246'l'#142#157';:'#240#222#190#244\r
+  +#153#131#197'K''F?='#179#235#141#13#27#18#161'b(<'#17#128'7'#185'c#'#129#236\r
+  +'h'#0#238#181';'#18#221#138#144#137'i'#133#216'6'#218#243'+w'#219#253#149#253\r
+  +'o'#129#207'='#191'Ce'#248'~rc'#154'J'#175'|'#242#239#202#233#179#235#189#254\r
+  +#202#249#11#199#198''''#190'9z'#236#210#158'};s'#165#159'O]8'#183'i'#215#201\r
+  +#177'-'#183#143'_'#210#188'N'#208#175' jW'#146#212'5]'#170'5'#12'Tz'#242#181\r
+  +#0#216'&'#17'u*'#249'x'#29#135'dduY'#152't'''#157#229'bp|]<?'#170'>'#28#24\r
+  +#237#148'&'#219#229#153#14'e'#161'S'#149''''#168#211'TU'#156#163#128'0'#211\r
+  +#159'@'#213#247''''#180#9'B'#187'_'#148'&'#174#12'B+'#128'P'#155#150#24#243\r
+  +'2C^k/'#234#29#213'gb@'#149'G'#162'r'#202'U'#14#169#198#203#149#7#4#186#24'h'\r
+  +'A'#17#17#232#194'\e'#4'P'#166'd'#154#140#193#20#213'h4'#233#132#174#136#0'q'\r
+  +'g'#211#250'</o'#197#143'G'#133#19'94!2'#250#146#202#193#140'.'#29#146'%'#131\r
+  +#178'|'#220#176'a,VHv'#151'2'#214'm'#147#241'c'#251#7#222#222#142'|tb'#221\r
+  +#251#7#10'g'#15#245']'#254'`'#234#242#185#221'[7LB'#190#156#219'7'#226#10'NY'\r
+  +#161#1'o'#188'?'#223#183'1'#17#235#29#128''''#134'<'#229#157#225#1#253#235\r
+  +#173'cb'#241#153#160#159'y'#239#195'oIu'#239'u{'#157'KV}'#213'?~'#6')N'#170\r
+  +'L'#149#19#231#180#181'-'#149#247'?<'#156#27#210#213'c'#191#221'u'#248#253\r
+  +#226#186#2'`'#188#182#231#180#177#137#173'm'#226#169#27'y'#178#6#142#184#145\r
+  +#11'4'#241#185#205'B'#214'Z'#9#171'SE'#199#233#186#136'f'#10#197'F'#166'9)'\r
+  +#12'7'#137#229'#p'#171#177#136'J'#175'S'#150'iW'#228';T%'#172#186'H'#212#228\r
+  +#168#154#4'['#14'UW'#130#162#1#12#200#28'\'#145#141'''q'#1'2H'#164#138#138'T'\r
+  +'q'#177'6!'#209'&M'#142#162'''8'#232#246#247'Z'#237')'#141#222'/'#150#152#25\r
+  +'<'#141#212#24'U'#185'3'#150'h'#143'-Q4'#135#10':OAk'#235'3'#218'JNO'#198'n'\r
+  +#235#206'$t'#253#25'q'#210#221'1'#149#5'J'#14#234'HP4'#145#209#194'nv/'#172\r
+  +#28'H'#235#211'!E'#18'R'#230#162#198'M#p:d('#196#205'['#199#224#247#14#12#191\r
+  +#187'3w'#233#248#228#251#251'J'#167#222#237#189'xv'#234#220#217#29#19#227#195\r
+  +'V['#220'd+Y'#220#163#6'W'#201#30#236#181#187#146'VS0'#239'+'#15'{'#138#219\r
+  +'}9'#240#133#165#130#191'=)'#251#235#227#202#135#254#143#235#169#249#246#167\r
+  +'_'#144'<'#244#23#193#131#207#200#159#153#239'X'#180'&'#211#201#6#158'['#204\r
+  +'x'#230#5#205#226'f'#245#162'&'#201'?k'#185#255#245#154#238#197'6'#193'?'#27\r
+  +#164'k8'#252'F'#30#183'I'#128#178#198'n'#1'Y'#237'r'#22'V'#203'$'#24#168#4'#'\r
+  +#153'l!v'#217#9't7'#129#225#195#179#131#4'N'#4#199#139#226#197#137#170#244'd'\r
+  +#185'vEO'#187#178#212#169'.'#19#213#249'.U'#178'J'#223#180#234#243#188#143\r
+  +#241'%66'#208#205#17';x'#160#143'/'#11'r%A'#190','#12'('#162'JC'#202#234'.'\r
+  +#134'b'#163#153#220#6'81'#172'7@T'#150#26#157#240'8'#26#191#220#21'1E'#210\r
+  +#182'x'#201#5#15#251#224#245'ax'#189'?'#144#247'z'#28'H\='#152#147#164#253\r
+  +#157#235#243#130#1'/'#11#165'o<'#173#129#157#172'r\1'#128#24'3'#144'"'#21'P'\r
+  +#230'c'#166'M#'#201'L'#216#216#3'[P'#250#142#238#29'zg['#238#163#247#214#253\r
+  +'N'#223#249#179#19#167'No'#238#31',k'#13#1#149'!'#167#183#13#161'A`'#245#247\r
+  +#186#3'=n[*'#229#234#25't'#151#182#7'K9'#174'('#134'o'#202#225#27#199#137#244\r
+  +#161'6F'#161#145#188#133#167'F'#7#166'^'#186'$I'#228'{'#154'i'#9#154'\'#190\r
+  +#172'C[C'#14#147'UI'#166'9L'#214#4#137#26'M'#131#0#196'*x'#4#13#151#168'a'#19\r
+  +'u'#236#187#161#202#166#219#153'L'#23#149#233'!'#179'|d6D'#228#134#137#252#24\r
+  +'A'#128#206#175#9#188'('#137#7#147'X'#25#242';}m'#138'r'#187#178#136'W'#230\r
+  +')'#10#152'%'#11'b0'#213'{'#155#31'G'#137'c'#10#236','#177#135'+'#9'pe!6'#218\r
+  +'XI'#195'(~g'#208#238#233#139'%'#167'R'#233'I'#143#175' '#215#6#177','#19':'\r
+  +#222'Q'#228#22#190#209#173't'#197#187'C'#189#1'xC'#28#217#20#142#22#194#144\r
+  +''''#25#147#14#230#133'Y'#168'}*'#199#30#10#178#6' '#254'xZ'#133#210#247#187\r
+  +#250#178'A'#5#2#169'P'#209'm'#30'M'#160#175#197'D'#247#166#225#232#193'7z'\r
+  +#223#218#130'\>1u'#238#224#208#229'S'#227#23#206#143#189'\7ff}'#185'?'#167'P;%'\r
+  +#170#164#210'XF'#211#136#206#209'c'#243#148#220#238#162#215#144'El'#133'ao'\r
+  +#254#141'da'#31#12#157#29#204#29#206#22#142#149#135'7'#248'c'#155'"'#200#254\r
+  +#222#177#157#165#145#193'Xv0U'#142'9'#163')\7fv07'#158#139#15#24#21#30#189#212\r
+  +#227'2'#194'fUX.'#246#139'E'#1'!'#224#227#243'}l'#158#135#193#241#208#185'>'\r
+  ,#10#215#215'%'#136'P'#128#8#25#136#161'#6Q'#148'$'#136#211'x'#16'E'#138' I'\r
+  +#225#165'H'#167','#215'&/'#180#202'K'#232'+V'#154'!J'#163#255#159#190''''#217\r
+  +#160#27#157#219'8'#210#0#154#200#248'*'#152#163#140'qUq'#180#182#2#154'$'#168\r
+  +'I'#8#149#17#169'*'#170'5'#165'-'#246#188#217'Y'#20#234#147',M'#180'Kn'#167\r
+  +#201#173'\'#141'['#214#13'w'#187'{='#129#129'd'#178#12'G'#189#169'88'#212'#'\r
+  +#200#6'['#198#179#212'>'#168#171#228'g'#140'g'#149#176#155#249'{'#238'Cg'#18\r
+  +'$'#164#236'I'#152#182#140#195#168#244'Pc'#253#0#244#214#142#252#254'-'#169\r
+  +#207'>'#216#244#233#169#169#171'W'#182']'#185'<q'#230#236'T'#185'/-QX'#0'0"R'\r
+  +'V'#171#188#216#144'B'#179#138#213#213#235#180#246'''|'#227'I{~Sfx'#192#235\r
+  +#222#130#196'w'#150#251#199#147#133']CS'#19#249#254'b<'#159#8'"}'#165'1'#143\r
+  +'/'#17#138#22's'#229#245#158'P'#201#232'@'#236#254#146#210#156'd'#8#29'J3'\r
+  +#194#147#162#181'.'#200#22#7#25#162#0'U'#8'u'#1#1#10#0#145#133'!'#146'(J'#20\r
+  +#197'Q'#160#209#138#19'''Q`Q'#221#137#18'DI'#2'e'#16#165#172'M'#154'E'#251\r
+  +#231'6):'#129'$'#137#226'0K'#22#184';'#243#254#225#175']B'#23'Q`'''#3'n'#161\r
+  +'1M'#2#252'\'#29#194#214'$'#209#226#203#215'"<e'#130#171#136#161#177','#144\r
+  +'G'#196#202'H5-'#26'z'#132#134#156#208#4#139'L'#17#169'%'#174#182#165#205#246\r
+  +#178#221#209#227'tFB'#144#21'M'#229#131'%n'#204'['#179#177#159#133'8['#7'c'\r
+  +#236#177#188'"'#29#224'$<'#172'rBQLh'#227'~0'#19'Q'#175#27#130#144#168#22#14\r
+  +#202''''#7#253#135#246#20#183#143#7#174'^'#217'uxw'#234#227'3#G'#15'%O'#159\r
+  +#28'-'#22'a'#0'P'#3#146#16#168#206'U'#11#189','#204'S'#163#167#19#145#235#202\r
+  +'&'#203#160#207'5'#148#8#246#23#224#252'@*'#183#189'ojK'#207#186'u'#200#200\r
+  +'P'#188#175#20#233#205'G'#250#178#177#193'Lb4'#157#152'H$'#214'E'#162#227#254\r
+  +#208#168#203';hs'#246#155#173'%'#131#181#12#168'`T'#28',y'#132#129'6'#21#242\r
+  +#24'G'#149#224#234#210#2'C'#1'+'#8't'#2'!'#20'Xa'#20'+'#142#161#157'/N'#156\r
+  +' '#128'0^'#24'$'#136#170#141'0:'#218'c'#229'Y4r'#201#170'4]'#17#227#161#149\r
+  +#247#158'g'#208#202#251't'#7#203#212#220#165'i'#164'hY'#234'8C'#25'e'#235'R'\r
+  +#173#28#7'U'#22'a'#200#162','#244#3#228'Q'#190'"'#6'('#226'"y'#20#144'''82'\r
+  +#132'%'#171#214#29#174#202''''#212#132#228':Xg'#204#153#205'i'#163#222#233\r
+  +#180#171']vR'#14#161#248#236#203#135#11']akC!H'#31#235'Qg'#195'|$ (#'#234#18\r
+  +#162#135#131#178',lX7'#28'NF4'#241#144'|'#172#223'w`g~j'#208'y'#241#212#196\r
+  +#206'I'#255#145'7SG'#223'I'#158'>16'#220#159'Q+'#173'JU\'#162#201'R'#4'^'#130\r
+  +#192'I'#6#3#232'WB'#167'('#145#174'Oc'#233#183'z'#250'<'#161'B$'#146#203#4#11\r
+  +'Y\7f'#30#241#21'R'#254#2#2#149#211#209#161'lr<'#155#158#10#4#250#253#129'A_p'\r
+  +#196#23#26#243#135#215#5'"'#147'Pd'#131'/'#182#161';8b'#8#12'j<'#189'2[^l'\r
+  +#206#2#6#132#167'O'#241#244'i'#158'1'#195'5'#164#217'Z'#132#169'NRU0Y'#30'%'\r
+  +#201'bdI'#152#6'B('#208#25#140'('#137#227'e'#9#20'h'#228'R%~'#134#200'v'#247\r
+  +'_E'#211#158'jc'#232#209#206#185#142'$o'#164'iQ'#224#133#174'&'#186#1#207'w'\r
+  +#160#211#8'U'#236'C'#131#28#237#254#170#2#148#160#178#15's@'#152'%'#141'U'\r
+  +#219#23#165#7'TC'#10']LoH'#155#205')'#179#209#237#180'k<.Z'#6#161#251#221'k'\r
+  +#134#138#172#136#179#163#16#229#151#16'y<'#192#139'z'#249#233#184#18#137'kB~'\r
+  +')'#28#214#247#23#253#145#128':'#28'P'#12#247#6#222#220#217#179'a<x'#254#228\r
+  +#228#155'['#224#163#7#10#239#31#202#31'?4\'#202#192'b'#129#150#207's'#161#241\r
+  +'K'#19'{'#152'J'#31'Vh'#235#20#185'H`'#140'&'#207'r'#181'='#160#185#160't"z'\r
+  +#15#236#241'g'#253#190#180#199#155#241'x'#209'F''W'#173'0'#193#162';'#212#171\r
+  +#182'&5'#246#140#222#149'7'#249#251'l'#225'a''<'#225'Mm'#244'g6:'#225'q[t'\r
+  +#196#4#245'k'#220'='#210'nD'#160#139'rTA'#166'< 2%'#197#230#20#10#208#130#160\r
+  +#211#148#204#150#149#219's'#10'{V'#162#15'K'#181'!@'#27#227'j`'#134#26#166\r
+  +#171#226#213#231#25#229'^'#149'18'#235#129'?c'#230'<'#185#128#1'Z'#133'Z?'\r
+  +#158#171'k'#161'+'#215#16'D'#29'l-'#142'k"'#1'V'#138#208'F'#19#187'Y'#18'/_'\r
+  +#226#7'$'#1#20#2'0 '#146#199#1'EX'#172#242#129#26#151'L'#235'S'#233#195#6'=b'\r
+  +'6$'#172'&'#191#195#170#247#186'8'#241'('#195#235'j'#201#165'9~;5'#25#148#244\r
+  +'f'#140'h'#159#156#138#168#242')s6i'#141'G'#204'H'#194#217#215#27#133'c'#142\r
+  +'x'#164'{'#176'/'#186'{['#239#166'u'#137'SG'#215#31#216']:'#246'V'#255#151#31\r
+  +#239'B'#251#190#141'#'#195'vcP!'#133#132#146#0']h'#161'J'#205']R3Yn'#163#200\r
+  +#130'T9'#204'T'#166#184#186#164#208#20#145'X'#130'Vw'#210#238#140#219#236#176\r
+  +#197#22'3uG'#244#166#176#218#16'T'#233'!'#185'.'#160#208'C*CDc'#137#235'mI'\r
+  +#131'+kq'#231#205#222'B 9'#230'O'#160#221#194#144';'#218'o'#15#150#204#222\r
+  +#156#222#137#168#237#9#190#202#3'h|b=$5'#133#149#214#184#218#153'2x2&O'#218\r
+  +'h'#9#27#204'!'#181'9"3'#193'BC'#28#165'['#160#13#9#213'>'#10'S'#250#192#156\r
+  +'j'#227'2'#7'3'#251'1'#204#180#7'0'#211#31#192#220#251'8f'#250#156#187'x'#184\r
+  +#138'i'#15#223#189#156#255#199#187'x'#252'.'#158#168#230#203#25#143'af>'#136\r
+  +#153'q/f'#250#253#168#207't'#204#159'gb'#158#154#129#153'3'#3#131#185'w6f'\r
+  +#206#3#152'Y31'#143'='#130#153'5'#13#243#224','#204'='#211'0'#179#167'U'#237\r
+  +#153'(0'#152#25#211'0'#211#166'a'#238#185#7'3'#13'S5'#208#183#247#207#174#254\r
+  ,#233#145#7'0'#247#205#196#204#249#221#31#131#153#133#153'9'#3#243#232't'#204\r
+  +'S3g'#253#21'3'#235#143#152'{'#238#175#30'3'#251'~'#204#31#30#175'nO'#153#254\r
+  +'tu_'#252','#244'3'#30#154#137'y'#240'^'#204#156#251'0s'#238#199'<'#132#226\r
+  +'>'#204'C'#232#219'{0'#15'>'#136'y'#228'w'#220#143'y'#24#197'}'#152'G'#239\r
+  +#199'<:'#187#250's'#30#254#191#152#246'H'#21'U{Nu'''#198#140#135#171#152#254\r
+  +#224#255#195#3'UN'#166#221'?{'#214#156#217'3'#31#156'>'#243#145#234#30#252\r
+  +#153'OT'#231#220#233'(]'#143'<'#248#208'S'#24#204#236#255#5#244#136#170#148\r
+  +#243#4#156#20#0#0#0#0'IEND'#174'B`'#130#11'Transparent'#8#0#0#6'TLabel'#10'l'\r
+  +'blVersion'#4'Left'#2#24#6'Height'#2#14#3'Top'#3#200#0#5'Width'#2'$'#7'Capti'\r
+  +'on'#6#7'version'#11'ParentColor'#8#0#0#6'TLabel'#8'LVersion'#4'Left'#2'G'#6\r
+  +'Height'#2#18#3'Top'#3#200#0#5'Width'#2'-'#11'ParentColor'#8#0#0#7'TButton'#8\r
+  +'OKButton'#4'Left'#2' '#6'Height'#2#23#3'Top'#3' '#1#5'Width'#2'd'#25'Border'\r
+  +'Spacing.InnerBorder'#2#4#7'Caption'#6#6'Hmm...'#7'OnClick'#7#13'OKButtonCli'\r
+  +'ck'#8'TabOrder'#2#0#0#0#6'TPanel'#6'Panel1'#4'Left'#3#152#0#6'Height'#3'1'#1\r
+  +#3'Top'#2#8#5'Width'#3'q'#1#10'BevelInner'#7#8'bvRaised'#10'BevelOuter'#7#9\r
+  +'bvLowered'#12'ClientHeight'#3'1'#1#11'ClientWidth'#3'q'#1#11'FullRepaint'#8\r
+  +#8'TabOrder'#2#1#0#5'TMemo'#7'memInfo'#4'Left'#2#8#6'Height'#3'!'#1#3'Top'#2\r
+  +#8#5'Width'#3'a'#1#8'ReadOnly'#9#8'TabOrder'#2#0#0#0#0#11'TStaticText'#8'lbl'\r
+  +'Title'#4'Left'#2#24#6'Height'#2#16#3'Top'#3#176#0#5'Width'#2'd'#8'AutoSize'\r
+  +#9#7'Caption'#6#12'ULOI Browser'#5'Color'#7#9'clBtnFace'#10'Font.Color'#4#226\r
+  +'.5'#0#11'ParentColor'#8#8'TabOrder'#2#2#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/fAbout.pas b/ulan/host/apps/uloi_browser/fAbout.pas
new file mode 100644 (file)
index 0000000..e44b3d9
--- /dev/null
@@ -0,0 +1,78 @@
+unit fAbout;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  LResources,\r
+  Graphics, Forms, Controls,  StdCtrls, ExtCtrls, ActnList,Buttons,\r
+  SysUtils, Classes, lcltype;\r
+\r
+type\r
+\r
+  { TfrmAbout }\r
+\r
+  TfrmAbout = class(TForm)\r
+    LVersion: TLabel;\r
+    lblVersion: TLabel;\r
+    OKButton: TButton;\r
+    Panel1: TPanel;\r
+    imgLogo: TImage;\r
+    memInfo: TMemo;\r
+    lblTitle: TStaticText;\r
+    procedure OKButtonClick(Sender: TObject);\r
+    procedure FormKeyDown(Sender: TObject; var Key: Word;\r
+      Shift: TShiftState);\r
+    procedure frmAboutShow(Sender: TObject);\r
+  private\r
+    { Private declarations }\r
+  public\r
+    { Public declarations }\r
+  end;\r
+\r
+\r
+procedure ShowAboutBox(v:string);\r
+\r
+implementation\r
+\r
+const\r
+  cAboutMsg =\r
+    'This program is free software under GNU GPL 2 license'+#13+\r
+    'Authors: '+ #13 +\r
+    'Petr Smolik (petr.smolik@wo.cz) - author' + #13 +\r
+    'Contributors:'+#13+#13+\r
+    'Big thanks to Lazarus and FreePascal Team';\r
+\r
+procedure ShowAboutBox(v:string);\r
+begin\r
+  with TfrmAbout.Create(Application) do\r
+  try\r
+    Lversion.Caption:=v;\r
+    ShowModal;\r
+  finally\r
+    Free;\r
+  end;\r
+end;\r
+\r
+procedure TfrmAbout.OKButtonClick(Sender: TObject);\r
+begin\r
+  Close;\r
+end;\r
+\r
+procedure TfrmAbout.FormKeyDown(Sender: TObject; var Key: Word;\r
+  Shift: TShiftState);\r
+begin\r
+  if (Key = VK_Escape) then\r
+   Close;\r
+end;\r
+\r
+procedure TfrmAbout.frmAboutShow(Sender: TObject);\r
+begin\r
+  memInfo.Lines.Text:=cAboutMsg;\r
+end;\r
+\r
+initialization\r
+ {$I fAbout.lrs}\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/mainform.lfm b/ulan/host/apps/uloi_browser/mainform.lfm
new file mode 100644 (file)
index 0000000..34a8aae
--- /dev/null
@@ -0,0 +1,1019 @@
+object fmainform: Tfmainform\r
+  Left = 221\r
+  Height = 626\r
+  Top = 206\r
+  Width = 1006\r
+  HorzScrollBar.Page = 1005\r
+  VertScrollBar.Page = 605\r
+  ActiveControl = SGProp\r
+  Caption = 'ULOI Browser'\r
+  ClientHeight = 606\r
+  ClientWidth = 1006\r
+  Menu = MainMenu1\r
+  OnActivate = FormActivate\r
+  OnCreate = FormCreate\r
+  OnDestroy = FormDestroy\r
+  Position = poDesktopCenter\r
+  object Panel1: TPanel\r
+    Left = 520\r
+    Height = 537\r
+    Top = 42\r
+    Width = 482\r
+    Align = alRight\r
+    BorderSpacing.Around = 4\r
+    BevelOuter = bvNone\r
+    ClientHeight = 537\r
+    ClientWidth = 482\r
+    TabOrder = 0\r
+    object Page: TSpkRollPanel\r
+      Height = 537\r
+      Width = 482\r
+      Align = alClient\r
+      BevelOuter = bvLowered\r
+      Caption = 'OI Properties'\r
+      ClientHeight = 537\r
+      ClientWidth = 482\r
+      Font.Color = clWhite\r
+      Font.Height = -16\r
+      Font.Name = 'Arial'\r
+      Font.Style = [fsBold]\r
+      ParentColor = False\r
+      TabOrder = 0\r
+      Margin = 1\r
+      MarginColor = clGray\r
+      CaptionHeight = 22\r
+      BorderColor = clBtnFace\r
+      AllowResize = True\r
+      CaptionGradientMode = gmUser\r
+      CaptionColorFrom = 14991015\r
+      CaptionColorTo = 8342056\r
+      CaptionGradientType = gtHorizontal\r
+      PanelColorFrom = clBtnFace\r
+      PanelColorTo = clBtnFace\r
+      PanelGradientType = gtHorizontal\r
+      BorderInner = 0\r
+      object Shape3: TShape\r
+        Left = 1\r
+        Height = 1\r
+        Top = 45\r
+        Width = 480\r
+        Align = alTop\r
+        Pen.Color = clGray\r
+        Shape = stDiamond\r
+      end\r
+      object ToolBar2: TToolBar\r
+        Left = 1\r
+        Height = 22\r
+        Top = 23\r
+        Width = 480\r
+        ButtonWidth = 22\r
+        Caption = 'ToolBar1'\r
+        Color = clBtnFace\r
+        EdgeBorders = []\r
+        Flat = True\r
+        ParentColor = False\r
+        TabOrder = 0\r
+        object SpeedButton7: TSpeedButton\r
+          Tag = 10\r
+          Left = 1\r
+          Height = 22\r
+          Hint = 'Set property'\r
+          Width = 23\r
+          Color = clBtnFace\r
+          Flat = True\r
+          Glyph.Data = {\r
+            36040000424D3604000000000000360000002800000010000000100000000100\r
+            2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF008D8D8D0C8A8A8AE7878787F284848424FFFFFF00FFFF\r
+            FF00007D21F5037B1EFF00791521FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF009393930C909090E7B0B0B0FFB1B1B1FF878787F784848424FFFF\r
+            FF0001832BF543A15FFF007B1FE400791927FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF009A9A9A0C979797EAB6B6B6FFAEAEAEFF229752FF1C9149FF158F43FF0F8B\r
+            3BFE3A9F5EFF80C196FF46A362FF007D1FE70079192AFFFFFF00FFFFFF00A0A0\r
+            A0179D9D9DFABBBBBBFFAFAFAFFFEDEDEDFF299B5BFF90CAA9FF8DC8A5FF8AC6\r
+            A1FF88C59EFF6AB685FF82C297FF48A566FF007D21EA00791B30FFFFFF00A4A4\r
+            A4E7C5C5C5FFB7B7B7FFEEEEEEFFD7D7D7FF319F63FF94CDADFF6FBA8EFF6BB8\r
+            89FF66B685FF61B380FF67B582FF83C298FF3CA05CFF007F25FCFFFFFF00A7A7\r
+            A7F2D2D2D2FFF0F0F0FFDADADAFFD9D9D9FF37A36BFF96CEB0FF94CDADFF91CB\r
+            AAFF90CBA8FF74BC90FF8AC7A1FF46A568FF078735FD01832D0FFFFFFF00ABAB\r
+            ABBAA8A8A8FEE4E4E4FFDBDBDBFFBABABAFF3DA56FFF38A36EFF34A168FF309E\r
+            62FF55AF7CFF91CBAAFF4FAB74FF178F45FD118B3D0CFFFFFF00FFFFFF00AEAE\r
+            AEBCABABABFAE9E9E9FFACACACFFA2A2A2FFB0B0B0FFEAEAEAFFB2B2B2FFBEBE\r
+            BEFF38A268FF5AB381FF289857FF878B89F988888832FFFFFF00FFFFFF00B2B2\r
+            B20EAFAFAFBCACACACF5E5E5E5FFADADADFFA3A3A3FFB1B1B1FFEAEAEAFFC0C0\r
+            C0FF3EA670FF319F65FFD1C1A6FFC3BCB2FF8B8B8BFA88888842FFFFFF00FFFF\r
+            FF00B2B2B20EAFAFAFBCACACACF5E5E5E5FFAEAEAEFFA4A4A4FFB3B3B3FFEDED\r
+            EDFFD7B995FFC99B64FFCEA373FFE6E4E2FF8F8F8FF28C8C8C3CFFFFFF00FFFF\r
+            FF00FFFFFF00B3B3B30EB0B0B0BCADADADF5E5E5E5FFAFAFAFFFA6A6A6FFB4B4\r
+            B4FFE5DBCEFFD5B58FFFE1CBB0FF959595FE929292C08F8F8F10FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00B3B3B30EB0B0B0BCAEAEAEF5E6E6E6FFB0B0B0FFA7A7\r
+            A7FFB5B5B5FFEFEFEFFFF4F4F4FF999999F29696968893939304FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00B4B4B40EB1B1B1BBAEAEAEF5E6E6E6FFB1B1\r
+            B1FFB0B0B0FFF2F2F2FF9F9F9FFD9C9C9CB399999905FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B4B4B40EB1B1B1BBAFAFAFF5E8E8\r
+            E8FFF4F4F4FFA6A6A6F9A3A3A388A0A0A007FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B5B5B50EB2B2B2BBAFAF\r
+            AFF4ACACACF2A9A9A988A6A6A604FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B5B5B50EB2B2\r
+            B2BAB0B0B088ADADAD04FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+          }\r
+          NumGlyphs = 0\r
+          OnClick = SGPropSetOID\r
+          ShowHint = True\r
+          ParentShowHint = False\r
+        end\r
+      end\r
+      object SGProp: TStringGrid\r
+        Left = 1\r
+        Height = 490\r
+        Top = 46\r
+        Width = 480\r
+        Align = alClient\r
+        AutoFillColumns = True\r
+        BorderStyle = bsNone\r
+        ColCount = 4\r
+        Columns = <        \r
+          item\r
+            Alignment = taCenter\r
+            SizePriority = 0\r
+            Title.Alignment = taCenter\r
+            Title.Caption = 'Number'\r
+            Width = 80\r
+          end        \r
+          item\r
+            Alignment = taCenter\r
+            SizePriority = 0\r
+            Title.Alignment = taCenter\r
+            Title.Caption = 'Access'\r
+            Width = 80\r
+          end        \r
+          item\r
+            Title.Alignment = taCenter\r
+            Title.Caption = 'Name'\r
+            Width = 196\r
+          end        \r
+          item\r
+            SizePriority = 0\r
+            Title.Alignment = taCenter\r
+            Title.Caption = 'Value'\r
+            Width = 107\r
+          end>\r
+        DefaultColWidth = 20\r
+        FixedColor = clBtnFace\r
+        FixedCols = 0\r
+        Flat = True\r
+        Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSizing, goColMoving, goRowSelect, goSmoothScroll]\r
+        RowCount = 1\r
+        ScrollBars = ssVertical\r
+        TabOrder = 1\r
+        TabStop = True\r
+        TitleFont.Style = [fsBold]\r
+        OnDblClick = SGPropSetOID\r
+      end\r
+    end\r
+  end\r
+  object ToolBar1: TToolBar\r
+    Height = 38\r
+    Width = 1006\r
+    ButtonHeight = 36\r
+    ButtonWidth = 36\r
+    Caption = 'ToolBar1'\r
+    EdgeBorders = [ebBottom]\r
+    Flat = True\r
+    Indent = 4\r
+    TabOrder = 1\r
+    object SpeedButton8: TSpeedButton\r
+      Tag = 10\r
+      Left = 40\r
+      Height = 36\r
+      Hint = 'Preferences'\r
+      Width = 36\r
+      Color = clBtnFace\r
+      Flat = True\r
+      Glyph.Data = {\r
+        36100000424D3610000000000000360000002800000020000000200000000100\r
+        2000000000000010000064000000640000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000009FFF00009FFF0000\r
+        9FFF00009FFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF0F08A0FF1020B0FF0F20BFFF1027\r
+        BFFF1F30B0FF2F2FB0FF00009FFF000000000000000000000000000000000000\r
+        000000000000D0700FFFDF7F1FFFE08F1FFFE09020FFD07710FF000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF5F67D0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        000000000000DF872FFFFFC060FFF0A820FFF0B040FFF0B86FFFD0700FFF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFEFBF7FFFFFC060FFF0A820FFF0B03FFFFFCF80FFDF882FFF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFF0D79FFFFFC760FFF0A820FFF0B03FFFFFCF80FFE0983FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFDFAFFFFFC76FFFF0A820FFF0B03FFFFFCF80FFE0A040FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFDFAFFFFFC76FFFF0A820FFF0AF3FFFFFCF7FFFEFA04FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE0AFFFFFC76FFFF0A820FFF0AF3FFFFFCF7FFFEFA74FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE0AFFFFFC870FFF0A820FFF0AF30FFFFCF7FFFEFA74FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE0B0FFFFC870FFF0A820FFF0AF30FFFFC87FFFEFA750FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE0B0FFFFC870FFF0A820FFF0AF30FFFFC87FFFEFA750FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE0B0FFFFC870FFF0A820FFF0A82FFFFFC87FFFEFA850FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE7B0FFFFCF7FFFF0A820FFF0A82FFFFFC87FFFEFA850FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE7B0FFFFCF7FFFF0A820FFF0A82FFFFFC870FFEFA85FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF606FD0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE7B0FFFFCF7FFFF0A820FFF0A82FFFFFC870FFEFA85FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF5F60D0FF5F8FFFFF3F80FFFF3F88\r
+        FFFF60B8FFFFFFFFFFFF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFFFE7BFFFFFCF80FFF0A820FFF0A82FFFFFC870FFEFA85FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000009FFF0F08A0FF2030C0FF1037CFFF1F38\r
+        CFFF2F4FC0FF5057C0FF00009FFF000000000000000000000000000000000000\r
+        0000D0700FFFD07F1FFFDF7F20FFDF7F10FFD07F10FFDF7F1FFFD07710FFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000040287FFFA0787FFFBF8F7FFFBF8F\r
+        7FFFBF887FFF80506FFF00000000000000000000000000000000000000000000\r
+        000000000000E09840FFFFE8C0FFFFE8C0FFFFE8C0FFFFE8C0FFDF9740FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000E0B07FFFEFC890FFEFC8\r
+        90FFEFC890FFD0874FFF00000000000000000000000000000000000000000000\r
+        000000000000E09740FFFFE8C0FFFFE8C0FFFFE8C0FFFFE8C0FFDF9740FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000E0B07FFFEFC890FFEFC8\r
+        90FFEFC890FFD0804FFF00000000000000000000000000000000000000000000\r
+        000000000000E09740FFFFEFCFFFFFEFCFFFFFEFCFFFFFEFCFFFE09740FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000E0B07FFFEFC890FFEFC8\r
+        90FFEFC890FFD0804FFF00000000000000000000000000000000000000000000\r
+        0000D0700FFFEFB880FFFFEFD0FFFFEFD0FFFFEFD0FFFFEFD0FFEFAF6FFFD070\r
+        0FFF000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000E0B07FFFF0C89FFFEFC8\r
+        90FFEFC890FFD0804FFF0000000000000000000000000000000000000000D078\r
+        1FFFF0C89FFFFFF0D0FFFFF0D0FFFFF0D0FFFFF0D0FFFFF0D0FFFFF0D0FFE0A0\r
+        50FF000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000E0B07FFFF0CF9FFFF0C8\r
+        9FFFEFC890FFD0804FFF00000000000000000000000000000000D07F20FFFFDF\r
+        BFFFFFF0DFFFFFF0DFFFFFF0DFFFFFF0DFFFFFF0DFFFFFF0DFFFFFF0D0FFFFF0\r
+        D0FFE0984FFF0000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000CF783FFFE0B07FFFF0CF9FFFF0CF\r
+        9FFFF0C89FFFD08040FF00000000000000000000000000000000DF9740FFFFF7\r
+        DFFFFFF7DFFFFFF7DFFFFFF7DFFFFFF7DFFFFFF7DFFFFFF7DFFFFFF7DFFFFFF7\r
+        DFFFF0C89FFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000D07F40FFDF905FFFEFB88FFFF0CF9FFFF0CF\r
+        9FFFF0CF9FFFDF975FFFD08850FFCF783FFF0000000000000000DF974FFFFFF7\r
+        E0FFFFF7E0FFF0DFBFFFEFC08FFFEFC790FFEFC790FFF0CFA0FFFFF7E0FFFFF7\r
+        E0FFF0C89FFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000DF9760FFF0D7AFFFF0D0A0FFF0CF9FFFF0CF\r
+        9FFFF0CF9FFFF0CF9FFFEFB780FFCF783FFF0000000000000000DF974FFFFFF8\r
+        EFFFFFF8EFFFEFB880FFD0700FFF0000000000000000DF8830FFFFF8E0FFFFF8\r
+        E0FFEFC89FFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000DF9F6FFFF0D8B0FFF0D7AFFFF0D0A0FFF0CF\r
+        9FFFF0CF9FFFF0CF9FFFE0B07FFFCF783FFF0000000000000000DF974FFFFFF8\r
+        EFFFFFF8EFFFEFB880FF000000000000000000000000DF903FFFFFF8EFFFFFF8\r
+        EFFFEFC89FFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000D08850FFF0D8BFFFF0D8B0FFF0D7AFFFF0D0\r
+        A0FFF0CF9FFFF0CF9FFFE0A770FFCF783FFF0000000000000000D07710FFFFEF\r
+        D0FFFFFFEFFFEFB880FF000000000000000000000000DF9040FFFFFFEFFFFFFF\r
+        EFFFDF9740FF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000CF783FFFDFA070FFF0DFC0FFF0D7B0FFF0D7\r
+        AFFFF0D0A0FFEFB880FFD07840FF00000000000000000000000000000000E0A0\r
+        5FFFFFFFF0FFEFB77FFF000000000000000000000000DF974FFFFFFFF0FFEFC0\r
+        90FF000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000CF783FFFEFC09FFFF0DFBFFFF0D7\r
+        AFFFEFC89FFFD07F40FF0000000000000000000000000000000000000000D070\r
+        0FFFF0E0BFFFEFB77FFF000000000000000000000000DF984FFFFFEFD0FFD078\r
+        1FFF000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000D07F40FFDF9060FFDF90\r
+        5FFFD0804FFF0000000000000000000000000000000000000000000000000000\r
+        0000D0781FFFDF882FFF000000000000000000000000DF8F3FFFDF9740FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000\r
+      }\r
+      NumGlyphs = 0\r
+      OnClick = PreferenciesClick\r
+      ShowHint = True\r
+      ParentShowHint = False\r
+    end\r
+    object SpeedButton9: TSpeedButton\r
+      Tag = 10\r
+      Left = 4\r
+      Height = 36\r
+      Hint = 'Autodetection'\r
+      Width = 36\r
+      Color = clBtnFace\r
+      Flat = True\r
+      Glyph.Data = {\r
+        36100000424D3610000000000000360000002800000020000000200000000100\r
+        2000000000000010000064000000640000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000FF6F00FFFF6F\r
+        00FFFF6F00FFFF6F00FF00000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000FF6F00FFFF6F00FFFF6F\r
+        00FFFF6F0FFFFF700FFFFF6F00FF000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF6F00FFFF6F00FFFF77\r
+        10FFFF802FFFFF883FFFFF802FFFFF6F00FF0000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF6F00FFFF771FFFFF80\r
+        2FFFFF8F40FFFF9750FFFF9F5FFFFF8730FFFF6F00FF00000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF700FFFFF802FFFFF8F\r
+        40FFFF9850FFFFA060FFFFAF7FFFFFB080FFFF8730FFFF6F00FF000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF781FFFFF883FFFFF97\r
+        50FFFFA060FFFFB080FFFFB88FFFFFC09FFFFFC09FFFFF8730FFFF6F00FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF7F20FFFF8F40FFFF9F\r
+        5FFFFFAF7FFFFFB88FFFFFC7A0FFFFD0BFFFFFD0BFFFFFCFB0FFFF872FFFFF6F\r
+        00FF000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000FF6F00FFFF7F20FFFF904FFFFFA0\r
+        60FFFFB080FFFFC09FFFFFD0BFFFFFDFCFFFFFE0D0FFFFDFCFFFFFCFB0FFFF87\r
+        30FFFF6F00FF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000505890FFFF700FFFFF9040FFFFA0\r
+        60FFFFB080FFFFC09FFFFFD0BFFFFFE0D0FFFFE8E0FFFFE0D0FFFFD0BFFFFFC0\r
+        9FFFFF8730FFFF6F00FF00000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000050DFFF0057DFFF5F588FFFFF7710FFFFA0\r
+        60FFFFB080FFFFC09FFFFFD0BFFFFFDFCFFFFFE0D0FFFFDFCFFFFFD0BFFFFFC0\r
+        9FFFFFB080FFFF872FFFFF6F00FF000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000050DFFF0F60E0FF3F98F0FF1067E0FF60588FFFFF7F\r
+        20FFFFAF7FFFFFB88FFFFFC7A0FFFFD0BFFFFFD0BFFFFFD0BFFFFFC7A0FFFFB8\r
+        8FFFFFAF7FFFFF9F5FFFFF7820FFFF6F00FF0000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000050DFFF0058DFFF3F98F0FF4FA7F0FF4FA0F0FF1060E0FF6F5F\r
+        80FFFF802FFFFFB080FFFFB88FFFFFC09FFFFFC09FFFFFC09FFFFFB88FFFFFB0\r
+        80FFFFA060FFFF9750FFFF7F20FFFF6F00FF0000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000050DFFF0050DFFF3090EFFF4FA7F0FF4FA8F0FF50AFF0FF5FAFF0FF1060\r
+        E0FF705F7FFFFF802FFFFFAF7FFFFFB080FFFFB080FFFFB080FFFFAF7FFFFFA0\r
+        60FFFF9850FFFF8F40FFFF7710FFFF6F00FF0000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000050DFFF2F87EFFF4FA7F0FF4FA8F0FF5FB0F0FF6FB8F0FF70BFF0FF6FB7\r
+        F0FF105FDFFF7F5F70FFFF872FFFFFA060FFFFA060FFFFA060FFFF9F5FFFFF97\r
+        50FFFF8F40FFFF802FFFFF6F00FFFF6F00FF0000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000050\r
+        DFFF2078E0FF4FA7F0FF50A8F0FF5FB0F0FF70BFF0FF70BFF0FF7FC7F0FF90D0\r
+        FFFF8FC8F0FF0F58DFFF805F6FFFFF802FFFFF904FFFFF904FFFFF8F40FFFF88\r
+        3FFFFF802FFFFF700FFFFF6F00FF000000000000000000000000000000000000\r
+        00000000000000000000000000000000000000000000000000000050DFFF1068\r
+        E0FF4FA7F0FF50AFF0FF60B7F0FF70BFF0FF70BFF0FF80C8FFFF9FD8FFFFAFE0\r
+        FFFFB0E7FFFF7FB7F0FF0050DFFF8F5F60FFFF771FFFFF781FFFFF7710FFFF70\r
+        0FFFFF6F00FFFF6F00FF00000000000000000000000000000000000000000000\r
+        000000000000000000000000000000000000000000000050DFFF0F60E0FF4FA7\r
+        F0FF5FAFF0FF6FB8F0FF70BFF0FF70BFF0FF8FCFFFFFA0DFFFFFAFE0FFFFB0E7\r
+        FFFF9FD7FFFF1067E0FF0050DFFF000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000050DFFF0058DFFF4FA0F0FF5FB0\r
+        F0FF6FB8F0FF70BFF0FF7FC0F0FF90D0FFFFAFE0FFFFAFE7FFFFB0E7FFFF9FD0\r
+        FFFF1060DFFF0050DFFF00000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000050DFFF0050DFFF4097EFFF60B7F0FF70BF\r
+        F0FF70BFF0FF80C8F0FF90D7FFFFAFE0FFFFB0E7FFFFB0E7FFFF90CFF0FF0F5F\r
+        DFFF0050DFFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000000000000000000000000000050DFFF3088EFFF60B7F0FF70BFF0FF70BF\r
+        F0FF8FCFFFFF9FD8FFFFAFE0FFFFB0E7FFFFB0E8FFFF8FC7F0FF0F58DFFF0050\r
+        DFFF000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000050DFFF2F78E0FF6FB8F0FF70BFF0FF7FC0F0FF90D0\r
+        FFFFA0DFFFFFAFE7FFFFB0E7FFFFB0E8FFFF8FC0F0FF0F58DFFF0050DFFF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000050DFFF1F6FE0FF6FBFF0FF70BFF0FF7FC7F0FF90D7FFFFAFE0\r
+        FFFFB0E7FFFFB0E7FFFFB0E8FFFF80BFF0FF0057DFFF004FDFFF000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000050DFFF1060E0FF6FB7F0FF70BFF0FF80C8FFFF9FD8FFFFAFE0FFFFB0E7\r
+        FFFFB0E7FFFFB0E8FFFF7FB8F0FF0057DFFF004FDFFF0010E0FF0000E0FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000050\r
+        DFFF0058DFFF60AFF0FF70C0F0FF8FCFFFFFA0DFFFFFAFE0FFFFB0E7FFFFB0E8\r
+        FFFFB0E8FFFF70B7F0FF0050DFFF0050DFFF0018E0FF9F9FF0FF0F0FE0FF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000050\r
+        DFFF3F88EFFF7FC7F0FF90D0FFFFAFE0FFFFAFE7FFFFB0E7FFFFB0E8FFFFB0E8\r
+        FFFF6FAFF0FF0050DFFF0050DFFF000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000050\r
+        DFFF206FE0FF9FD8FFFFAFE0FFFFB0E7FFFFB0E7FFFFB0E8FFFFB0E8FFFF6FA8\r
+        EFFF0050DFFF0050DFFF00000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000050\r
+        DFFF0050DFFF90CFF0FFB0E7FFFFB0E8FFFFB0E8FFFFB0E8FFFF60A0EFFF0050\r
+        DFFF0050DFFF0000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        00000050DFFF2070E0FF9FD7FFFFB0E8FFFFB0E8FFFF5F98EFFF0050DFFF0050\r
+        DFFF000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000050DFFF0057DFFF206FE0FF3078E0FF0050DFFF0050DFFF0000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        000000000000000000000050DFFF0050DFFF0050DFFF0050DFFF000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000000000000000\r
+        0000000000000000000000000000000000000000000000000000\r
+      }\r
+      NumGlyphs = 0\r
+      OnClick = Autodetection\r
+      ShowHint = True\r
+      ParentShowHint = False\r
+    end\r
+  end\r
+  object Panel3: TPanel\r
+    Left = 4\r
+    Height = 537\r
+    Top = 42\r
+    Width = 503\r
+    Align = alClient\r
+    BorderSpacing.Around = 4\r
+    BevelOuter = bvNone\r
+    ClientHeight = 537\r
+    ClientWidth = 503\r
+    TabOrder = 2\r
+    object Page1: TSpkRollPanel\r
+      Height = 537\r
+      Width = 503\r
+      Align = alClient\r
+      BevelOuter = bvLowered\r
+      Caption = 'Units'\r
+      ClientHeight = 537\r
+      ClientWidth = 503\r
+      Font.Color = clWhite\r
+      Font.Height = -16\r
+      Font.Name = 'Arial'\r
+      Font.Style = [fsBold]\r
+      ParentColor = False\r
+      TabOrder = 0\r
+      Margin = 1\r
+      MarginColor = clGray\r
+      CaptionHeight = 22\r
+      BorderColor = clBtnFace\r
+      AllowResize = True\r
+      CaptionGradientMode = gmUser\r
+      CaptionColorFrom = 14991015\r
+      CaptionColorTo = 8342056\r
+      CaptionGradientType = gtHorizontal\r
+      PanelColorFrom = clBtnFace\r
+      PanelColorTo = clBtnFace\r
+      PanelGradientType = gtHorizontal\r
+      BorderInner = 0\r
+      object Shape4: TShape\r
+        Left = 1\r
+        Height = 1\r
+        Top = 45\r
+        Width = 501\r
+        Align = alTop\r
+        Pen.Color = clGray\r
+        Shape = stDiamond\r
+      end\r
+      object Shape5: TShape\r
+        Left = 1\r
+        Height = 1\r
+        Top = 128\r
+        Width = 501\r
+        Align = alTop\r
+        Pen.Color = clGray\r
+        Shape = stDiamond\r
+      end\r
+      object ToolBar3: TToolBar\r
+        Left = 1\r
+        Height = 22\r
+        Top = 23\r
+        Width = 501\r
+        ButtonWidth = 22\r
+        Caption = 'ToolBar1'\r
+        Color = clBtnFace\r
+        EdgeBorders = []\r
+        Flat = True\r
+        ParentColor = False\r
+        TabOrder = 0\r
+        object SBSetNewAddress: TSpeedButton\r
+          Tag = 10\r
+          Left = 1\r
+          Height = 22\r
+          Hint = 'Readdress'\r
+          Width = 23\r
+          Color = clBtnFace\r
+          Flat = True\r
+          Glyph.Data = {\r
+            36040000424D3604000000000000360000002800000010000000100000000100\r
+            2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00113D55F7285F87FB4988BDFB428DBCC17896AE53AAAA\r
+            AA1EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF002B6583FB94C7F9FF91C9F9FF4185C9FF2367AAFF9DAB\r
+            B7FFAAAAAA21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF004389AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF458B\r
+            C3FFA0AEBBFFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF001D699C637AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0\r
+            EDFF4E9ADAFFA5B1BBFFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00BABABA3B83A6B7F976B9D6FFC2F6FDFF63DFF7FF5DE2\r
+            F8FF79D3F0FF4897DBFFA7B2BBFFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFF\r
+            FF00FFFFFF00BDBDBD3BBCBCBCF6E5E5E5FFB0D4E5FF77CBE7FFC7F7FDFF5EDC\r
+            F5FF5AE1F7FF7BD4F1FF4A98DCFF9DAEBEFFACACAC21FFFFFF00FFFFFF00FFFF\r
+            FF00C1C1C13BC0C0C0F6E7E7E7FFFDFDFDFFFBECD6FFBEC4A0FF79D3EEFFC7F7\r
+            FDFF5FDCF5FF5BE2F7FF7AD6F2FF4E9FDEFFA1AFBBFFACACAC1FFFFFFF00C5C5\r
+            C53BC3C3C3F6E8E8E8FFFDFDFDFFFBECD6FFFDCD88FFFFD598FFC1CEB2FF7DD4\r
+            EDFFC4F6FDFF6CDDF6FF6DCAEDFF63A3D7FF649DD0FF6F9BC138C9C9C93DC7C7\r
+            C7F6E9E9E9FFFDFDFDFFFBEBD3FFFFCC83FFFFD498FFFFD79EFFFFD69BFFB5C6\r
+            A8FF81D5EDFFB2E3F9FF8BC0E7FFAED3F6FFC4E0FCFF669FD3F7CBCBCBF6EBEB\r
+            EBFFFDFDFDFFFAFAFAFFFBF3E7FFFECE89FFFFD496FFFFD59AFFFFCF8BFFFDE2\r
+            BCFFAFE4F4FF77BEE7FFB4D2F0FFE5F3FFFFACD2EFFF488CC7E8CDCDCDFFFDFD\r
+            FDFFFDFDFDFFFCFCFCFFF7F7F7FFFDF5EAFFFECF8AFFFFCC83FFFDE2BCFFFDFD\r
+            FDFFDCDCDCFF92BBCAFF58A5D8FF85B1DBFF469DD0FF2B95D15ECECECEFFFDFD\r
+            FDFFE0E0E0FFCACACAF9C8C8C8E2F7F7F7FFFBF3E8FFFDE3BDFFFDFDFDFFDEDE\r
+            DEFFC3C3C3FFBDBDBD15FFFFFF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFD\r
+            FDFFCDCDCDFFFFFFFF00CACACACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7\r
+            C7FFC0C0C015FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFD\r
+            FDFFE2E2E2FFCECECEFFE0E0E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4\r
+            C415FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFD\r
+            FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4\r
+            D4FFD2D2D2FFD1D1D1FFD0D0D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFF\r
+            FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+          }\r
+          NumGlyphs = 0\r
+          OnClick = SBSetNewAddressClick\r
+          ShowHint = True\r
+          ParentShowHint = False\r
+        end\r
+        object SBReset: TSpeedButton\r
+          Tag = 10\r
+          Left = 24\r
+          Height = 22\r
+          Hint = 'Reset'\r
+          Width = 23\r
+          Color = clBtnFace\r
+          Flat = True\r
+          Glyph.Data = {\r
+            36040000424D3604000000000000360000002800000010000000100000000100\r
+            2000000000000004000064000000640000000000000000000000000000000000\r
+            000000000000000000000000000000000000000000000818BABA202BBEC91824\r
+            B6C2091EB0BA121DB2BA0917B2BA001BBDBA0315C1BA0617C6BA000000000000\r
+            000000000000000000000000000000000000000000001E30C5C93643B2FD344A\r
+            AEFF07269BC3001A94BA00199ABA001CA7BA0214B0BA081BC2BA000000000000\r
+            000000000000000000000000000000000000B2B2B2383846BBFD3E59C2FF5995\r
+            DFFF4EA8D7FF2698DDC335A2E3BA318FE8BA0732B4BA0114ACBA000000000000\r
+            0000000000000000000000000000B6B6B63BB4B4B4F64351C6FF4460C3FF64C4\r
+            F4FF42D6F3FF34D3EAFF16D6F3C32DCCFCBA083A9ABA001AA0BA000000000000\r
+            00000000000000000000BABABA3BB8B8B8F6E4E4E4FF4C5BD3FF435CB7FF5CBC\r
+            D9FF45E4FAFF3AE3EDFF35D7E2FF2DD6F5C3083C8DBA001D9BBA000000000000\r
+            000000000000BDBDBD3BBCBCBCF6E5E5E5FFFDFDFDFF4955C8FF4451A3FF5FBA\r
+            D6FF46D8E2FF43E8F5FF41DDECFF4BCAE4FF103C8DC30022A2BA000000000000\r
+            0000C1C1C13BC0C0C0F6E7E7E7FFFDFDFDFFFBECD6FF464EB5FF455AB5FF6DB2\r
+            DDFF5DCBE0FF5DCEE0FF67D9FDFF6DCFF4FF395DACFF0724ADC200000000C5C5\r
+            C53BC3C3C3F6E8E8E8FFFDFDFDFFFBECD6FFFDCD88FF4550BAFF4554B6FF5D84\r
+            CDFF578DC2FF5D95CCFF5F98DCFF528BD9FF3451B7FF0823BEC0C9C9C93DC7C7\r
+            C7F6E9E9E9FFFDFDFDFFFBEBD3FFFFCC83FFFFD498FF4555C0FF454FB3FF4855\r
+            B0FF4457B3FF4A63C8FF3A53BCFF324AB8FF0524C3C0021CC7BACBCBCBF6EBEB\r
+            EBFFFDFDFDFFFAFAFAFFFBF3E7FFFECE89FFFFD496FFFFD59AFFFFCF8BFFFDE2\r
+            BCFFFDFDFDFFDADADAFFBDBDBDFFB5B5B5150000000000000000CDCDCDFFFDFD\r
+            FDFFFDFDFDFFFCFCFCFFF7F7F7FFFDF5EAFFFECF8AFFFFCC83FFFDE2BCFFFDFD\r
+            FDFFDCDCDCFFC0C0C0FFB9B9B915000000000000000000000000CECECEFFFDFD\r
+            FDFFE0E0E0FFCACACAF9C8C8C8E2F7F7F7FFFBF3E8FFFDE3BDFFFDFDFDFFDEDE\r
+            DEFFC3C3C3FFBDBDBD1500000000000000000000000000000000D0D0D0FFFDFD\r
+            FDFFCDCDCDFF00000000CACACACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7\r
+            C7FFC0C0C0150000000000000000000000000000000000000000D2D2D2FFFDFD\r
+            FDFFE2E2E2FFCECECEFFE0E0E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4\r
+            C415000000000000000000000000000000000000000000000000D3D3D3FFFDFD\r
+            FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C8150000\r
+            0000000000000000000000000000000000000000000000000000D5D5D5FFD4D4\r
+            D4FFD2D2D2FFD1D1D1FFD0D0D0FFCECECEFFCDCDCDFFCBCBCB15000000000000\r
+            0000000000000000000000000000000000000000000000000000\r
+          }\r
+          NumGlyphs = 0\r
+          OnClick = SBResetClick\r
+          ShowHint = True\r
+          ParentShowHint = False\r
+        end\r
+      end\r
+      object Panel4: TPanel\r
+        Left = 1\r
+        Height = 82\r
+        Top = 46\r
+        Width = 501\r
+        Align = alTop\r
+        Anchors = [akTop, akLeft]\r
+        BevelOuter = bvNone\r
+        ClientHeight = 82\r
+        ClientWidth = 501\r
+        TabOrder = 1\r
+        object Label2: TLabel\r
+          Left = 9\r
+          Height = 14\r
+          Top = 12\r
+          Width = 40\r
+          Caption = 'Address'\r
+          ParentColor = False\r
+        end\r
+        object modaddr: TLabel\r
+          Left = 115\r
+          Height = 14\r
+          Top = 12\r
+          Width = 381\r
+          Anchors = [akTop, akLeft, akRight]\r
+          AutoSize = False\r
+          Color = clWhite\r
+          ParentColor = False\r
+          Transparent = False\r
+        end\r
+        object Label4: TLabel\r
+          Left = 9\r
+          Height = 14\r
+          Top = 35\r
+          Width = 41\r
+          Caption = 'ID name'\r
+          ParentColor = False\r
+        end\r
+        object idname: TLabel\r
+          Left = 115\r
+          Height = 14\r
+          Top = 35\r
+          Width = 381\r
+          Anchors = [akTop, akLeft, akRight]\r
+          AutoSize = False\r
+          Color = clWhite\r
+          ParentColor = False\r
+          Transparent = False\r
+        end\r
+        object Label6: TLabel\r
+          Left = 9\r
+          Height = 14\r
+          Top = 59\r
+          Width = 67\r
+          Caption = 'ID description'\r
+          ParentColor = False\r
+        end\r
+        object iddes: TLabel\r
+          Left = 115\r
+          Height = 14\r
+          Top = 59\r
+          Width = 381\r
+          Anchors = [akTop, akLeft, akRight]\r
+          AutoSize = False\r
+          Color = clWhite\r
+          ParentColor = False\r
+          Transparent = False\r
+        end\r
+      end\r
+      object tvunits: TTreeView\r
+        Left = 1\r
+        Height = 407\r
+        Top = 129\r
+        Width = 501\r
+        Align = alClient\r
+        Anchors = [akTop, akLeft]\r
+        BorderStyle = bsNone\r
+        DefaultItemHeight = 16\r
+        Images = ImageList2\r
+        SortType = stData\r
+        TabOrder = 2\r
+        OnChange = tvunitsChange\r
+        OnCompare = tvunitsCompare\r
+      end\r
+    end\r
+  end\r
+  object Splitter1: TSplitter\r
+    Left = 511\r
+    Height = 545\r
+    Top = 38\r
+    Width = 5\r
+    Align = alRight\r
+    ResizeAnchor = akRight\r
+  end\r
+  object StatusBar: TStatusBar\r
+    Height = 23\r
+    Top = 583\r
+    Width = 1006\r
+    Panels = <    \r
+      item\r
+        Text = 'Version:'\r
+        Width = 70\r
+      end    \r
+      item\r
+        Width = 70\r
+      end    \r
+      item\r
+        Width = 50\r
+      end>\r
+    SimplePanel = False\r
+  end\r
+  object MainMenu1: TMainMenu\r
+    left = 176\r
+    top = 256\r
+    object MenuItem1: TMenuItem\r
+      Caption = 'File'\r
+      object MenuItem9: TMenuItem\r
+        Caption = 'Autodetection'\r
+        OnClick = Autodetection\r
+      end\r
+      object MenuItem8: TMenuItem\r
+        Caption = '-'\r
+      end\r
+      object MenuItem2: TMenuItem\r
+        Caption = 'Exit'\r
+        OnClick = MenuItem2Click\r
+      end\r
+    end\r
+    object MenuItem3: TMenuItem\r
+      Caption = 'Tools'\r
+      object MenuItem5: TMenuItem\r
+        Caption = 'Preferences'\r
+        OnClick = PreferenciesClick\r
+      end\r
+    end\r
+    object MenuItem4: TMenuItem\r
+      Caption = 'About'\r
+      OnClick = MenuItem4Click\r
+    end\r
+  end\r
+  object ImageList2: TImageList\r
+    left = 216\r
+    top = 256\r
+    Bitmap = {\r
+      4C69070000001000000010000000D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFFBF3E8FFFDE3BDFFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFFDF5EAFFFECF8AFFFFCC83FFFDE2BCFFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFFBF3\r
+      E7FFFECE89FFFFD496FFFFD59AFFFFCF8BFFFDE2BCFFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFFBEB\r
+      D3FFFFCC83FFFFD498FFFFD79EFFFFD69BFFFFCF8BFFFDE2BCFFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFFBECD6FFFDCD88FFFFD598FFFFD79EFFFFD69BFFFFCE89FFFDE1BAFFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFFBECD6FFFDCD88FFFFD598FFFFD69CFFFFD08EFFF7CC8DFFFDFC\r
+      FBFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFFBECD6FFFDCD86FFFFCF8CFFFAD197FFF9F7F3FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFFBECD5FFFDD297FFFDFBF7FFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFE3EFE9FFAFD3C1FFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFE6F1EBFF70B390FF67AE89FFAED3C0FFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFE3EE\r
+      E8FF6FB38FFF7EBB9BFF83BE9FFF70B391FFAED3C0FFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFCAE2\r
+      D6FF67AF8AFF80BC9DFF88C0A3FF84BEA0FF70B391FFAED3C0FFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFCEE3D8FF6EB18EFF81BC9EFF88C0A3FF84BEA0FF6EB28FFFAAD1BDFFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFCEE3D8FF6EB18EFF81BC9EFF86BFA1FF74B694FF75B293FFFAFC\r
+      FBFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFCEE3D8FF6CB08DFF72B492FF81BA9CFFF2F5F4FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFCDE2D7FF7FBA9CFFF6F9F7FFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFE6EFFBFFB8D5FBFFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFE9F1FDFF81B7FCFF79B2FCFFB7D5FBFFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFE6EF\r
+      FBFF7FB6FCFF8DBEFDFF92C1FDFF81B7FDFFB7D5FBFFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFD0E3\r
+      FAFF79B2FCFF8FBFFDFF96C3FDFF92C1FDFF81B7FDFFB7D5FBFFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFD3E5FAFF7FB5FBFF90BFFDFF96C3FDFF92C1FDFF7FB6FDFFB4D3FBFFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFD3E5FAFF7FB5FBFF90BFFDFF94C2FDFF85B9FDFF85B5F5FFFBFC\r
+      FDFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFD3E5FAFF7DB4FAFF82B8FDFF8FBDF7FFF3F6F9FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFD2E4FAFF8EBEFBFFF7F9FDFFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFF8EBF9FFF0C9F4FFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFF9EDFBFFE79EEEFFE799EDFFF0C8F4FFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFF8EB\r
+      F9FFE79DEEFFEAA8F0FFEBACF0FFE89FEEFFF0C8F4FFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFF3DA\r
+      F6FFE799EDFFEBAAF0FFECAFF1FFEBACF1FFE89FEEFFF0C8F4FFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFF4DDF6FFE79CECFFEBAAF0FFECAFF1FFEBACF1FFE89DEEFFF0C5F3FFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFF4DDF6FFE79CECFFEBAAF0FFECADF1FFE9A2EFFFE3A0E8FFFDFB\r
+      FDFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFF4DDF6FFE69BECFFE8A0EEFFE6A9EBFFF8F4F8FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFF4DCF6FFE9A9EEFFFCF8FCFFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFF5E6EAFFE9B9C5FFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFF7E9ECFFDA8397FFD97B91FFE9B8C4FFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFF5E6\r
+      EAFFDA8296FFDE8FA2FFE094A6FFDB8398FFE9B8C4FFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFEFD1\r
+      D8FFD97B91FFDF91A3FFE198A9FFE094A6FFDB8398FFE9B8C4FFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFF0D4DBFFD98196FFDF92A4FFE198A9FFE094A6FFDA8196FFE8B6C2FFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFF0D4DBFFD98196FFDF92A4FFE096A7FFDC879BFFD68799FFFCFB\r
+      FBFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFF0D4DBFFD88094FFDB8599FFDB92A3FFF7F3F4FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFEFD3DAFFDD90A2FFFBF7F8FFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFE8E9FBFFBFC1FAFFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFEBEBFCFF8D90FAFF8789FAFFBEC0FAFFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFE8E8\r
+      FBFF8D8FFAFF999BFBFF9D9FFBFF8E91FAFFBEC0FAFFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFD5D6\r
+      FAFF878AFAFF9B9DFBFFA1A3FBFF9EA0FBFF8E91FAFFBEC0FAFFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFD8D8FAFF8C8EF9FF9B9EFBFFA1A3FBFF9EA0FBFF8C8FFAFFBCBDFAFFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFD8D8FAFF8C8EF9FF9B9EFBFF9FA1FBFF9294FAFF9193F3FFFBFB\r
+      FDFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFD8D8FAFF8A8DF9FF8F92FAFF9A9CF5FFF3F4F9FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFD6D7FAFF9A9CF9FFF7F7FDFFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D5D5D5FFD4D4D4FFD2D2D2FFD1D1D1FFD0D0\r
+      D0FFCECECEFFCDCDCDFFCBCBCB15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D3D3D3FFFDFDFDFFFDFDFDFFFDFDFDFFFDFD\r
+      FDFFFDFDFDFFE4E4E4FFCDCDCDFFC8C8C815FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D2D2D2FFFDFDFDFFE2E2E2FFCECECEFFE0E0\r
+      E0FFFDFDFDFFFDFDFDFFE2E2E2FFCBCBCBFFC4C4C415FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00D0D0D0FFFDFDFDFFCDCDCDFFFFFFFF00CACA\r
+      CACDF3F3F3FFFBFBFBFFFDFDFDFFE0E0E0FFC7C7C7FFC0C0C015FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CECECEFFFDFDFDFFE0E0E0FFCACACAF9C8C8\r
+      C8E2F7F7F7FFE6F6FAFFB9EAF8FFFDFDFDFFDEDEDEFFC3C3C3FFBDBDBD15FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00CDCDCDFFFDFDFDFFFDFDFDFFFCFCFCFFF7F7\r
+      F7FFE9F8FCFF83DCF5FF7BDAF5FFB8EAF8FFFDFDFDFFDCDCDCFFC0C0C0FFB9B9\r
+      B915FFFFFF00FFFFFF00FFFFFF00CBCBCBF6EBEBEBFFFDFDFDFFFAFAFAFFE6F5\r
+      FAFF82DBF5FF8FDFF6FF94E1F7FF83DCF5FFB8EAF8FFFDFDFDFFDADADAFFBDBD\r
+      BDFFB5B5B515FFFFFF00FFFFFF00C9C9C93DC7C7C7F6E9E9E9FFFDFDFDFFD1EF\r
+      F8FF7BDAF4FF91E0F6FF98E2F7FF94E1F7FF83DCF5FFB8EAF8FFFDFDFDFFD9D9\r
+      D9FFB9B9B9FFB1B1B115FFFFFF00FFFFFF00C5C5C53BC3C3C3F6E8E8E8FFFDFD\r
+      FDFFD4F0F8FF81DAF4FF92E0F7FF98E2F7FF94E1F7FF81DCF5FFB6E9F7FFFDFD\r
+      FDFFD7D7D7FFB5B5B5FFAEAEAE15FFFFFF00FFFFFF00C1C1C13BC0C0C0F6E7E7\r
+      E7FFFDFDFDFFD4F0F8FF81DAF4FF92E0F7FF96E1F7FF87DDF6FF87D8EFFFFBFC\r
+      FDFFD9D9D9FFB7B7B7FFACACAC1FFFFFFF00FFFFFF00FFFFFF00BDBDBD3BBCBC\r
+      BCF6E5E5E5FFFDFDFDFFD4F0F8FF80DAF4FF85DDF5FF92DCF2FFF3F7F9FFD9D9\r
+      D9FFB7B7B7FFACACAC21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00BABA\r
+      BA3BB8B8B8F6E4E4E4FFFDFDFDFFD3F0F8FF90DFF4FFF7FBFDFFD9D9D9FFB7B7\r
+      B7FFABABAB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00B6B6B63BB4B4B4F6E2E2E2FFFDFDFDFFFDFDFDFFD9D9D9FFB6B6B6FFABAB\r
+      AB21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00B2B2B238B1B1B1F6E0E0E0FFD8D8D8FFB6B6B6FFABABAB21FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00AFAFAF38ADADADF6B6B6B6FFAAAAAA21FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00ABABAB38AAAAAA1EFFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+  end\r
+  object uLan1: TuLan\r
+    OSDeviceName = '\\.\UL_DRV'\r
+    left = 136\r
+    top = 256\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/mainform.lrs b/ulan/host/apps/uloi_browser/mainform.lrs
new file mode 100644 (file)
index 0000000..baebe39
--- /dev/null
@@ -0,0 +1,916 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfmainform','FORMDATA',[\r
+  'TPF0'#10'Tfmainform'#9'fmainform'#4'Left'#3#221#0#6'Height'#3'r'#2#3'Top'#3\r
+  +#206#0#5'Width'#3#238#3#18'HorzScrollBar.Page'#3#237#3#18'VertScrollBar.Page'\r
+  +#3']'#2#13'ActiveControl'#7#6'SGProp'#7'Caption'#6#12'ULOI Browser'#12'Clien'\r
+  +'tHeight'#3'^'#2#11'ClientWidth'#3#238#3#4'Menu'#7#9'MainMenu1'#10'OnActivat'\r
+  +'e'#7#12'FormActivate'#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDe'\r
+  +'stroy'#8'Position'#7#15'poDesktopCenter'#0#6'TPanel'#6'Panel1'#4'Left'#3#8#2\r
+  +#6'Height'#3#25#2#3'Top'#2'*'#5'Width'#3#226#1#5'Align'#7#7'alRight'#20'Bord'\r
+  +'erSpacing.Around'#2#4#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#25#2#11\r
+  +'ClientWidth'#3#226#1#8'TabOrder'#2#0#0#13'TSpkRollPanel'#4'Page'#6'Height'#3\r
+  +#25#2#5'Width'#3#226#1#5'Align'#7#8'alClient'#10'BevelOuter'#7#9'bvLowered'#7\r
+  +'Caption'#6#13'OI Properties'#12'ClientHeight'#3#25#2#11'ClientWidth'#3#226#1\r
+  +#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#240#9'Font.Name'#6#5'Arial'#10\r
+  +'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#8'TabOrder'#2#0#6'Margin'#2#1\r
+  +#11'MarginColor'#7#6'clGray'#13'CaptionHeight'#2#22#11'BorderColor'#7#9'clBt'\r
+  +'nFace'#11'AllowResize'#9#19'CaptionGradientMode'#7#6'gmUser'#16'CaptionColo'\r
+  +'rFrom'#4#167#190#228#0#14'CaptionColorTo'#4'(J\7f'#0#19'CaptionGradientType'#7\r
+  +#12'gtHorizontal'#14'PanelColorFrom'#7#9'clBtnFace'#12'PanelColorTo'#7#9'clB'\r
+  +'tnFace'#17'PanelGradientType'#7#12'gtHorizontal'#11'BorderInner'#2#0#0#6'TS'\r
+  +'hape'#6'Shape3'#4'Left'#2#1#6'Height'#2#1#3'Top'#2'-'#5'Width'#3#224#1#5'Al'\r
+  +'ign'#7#5'alTop'#9'Pen.Color'#7#6'clGray'#5'Shape'#7#9'stDiamond'#0#0#8'TToo'\r
+  +'lBar'#8'ToolBar2'#4'Left'#2#1#6'Height'#2#22#3'Top'#2#23#5'Width'#3#224#1#11\r
+  +'ButtonWidth'#2#22#7'Caption'#6#8'ToolBar1'#5'Color'#7#9'clBtnFace'#11'EdgeB'\r
+  +'orders'#11#0#4'Flat'#9#11'ParentColor'#8#8'TabOrder'#2#0#0#12'TSpeedButton'\r
+  +#12'SpeedButton7'#3'Tag'#2#10#4'Left'#2#1#6'Height'#2#22#4'Hint'#6#12'Set pr'\r
+  +'operty'#5'Width'#2#23#5'Color'#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data'#10':'\r
+  +#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '\r
+  +#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#141#141#141#12#138#138#138#231#135#135#135\r
+  +#242#132#132#132'$'#255#255#255#0#255#255#255#0#0'}!'#245#3'{'#30#255#0'y'#21\r
+  +'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#147#147#147#12#144#144#144#231#176#176#176#255#177#177#177#255#135\r
+  +#135#135#247#132#132#132'$'#255#255#255#0#1#131'+'#245'C'#161'_'#255#0'{'#31\r
+  +#228#0'y'#25''''#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#154\r
+  +#154#154#12#151#151#151#234#182#182#182#255#174#174#174#255'"'#151'R'#255#28\r
+  +#145'I'#255#21#143'C'#255#15#139';'#254':'#159'^'#255#128#193#150#255'F'#163\r
+  +'b'#255#0'}'#31#231#0'y'#25'*'#255#255#255#0#255#255#255#0#160#160#160#23#157\r
+  +#157#157#250#187#187#187#255#175#175#175#255#237#237#237#255')'#155'['#255\r
+  +#144#202#169#255#141#200#165#255#138#198#161#255#136#197#158#255'j'#182#133\r
+  +#255#130#194#151#255'H'#165'f'#255#0'}!'#234#0'y'#27'0'#255#255#255#0#164#164\r
+  +#164#231#197#197#197#255#183#183#183#255#238#238#238#255#215#215#215#255'1'\r
+  +#159'c'#255#148#205#173#255'o'#186#142#255'k'#184#137#255'f'#182#133#255'a'\r
+  +#179#128#255'g'#181#130#255#131#194#152#255'<'#160'\'#255#0'\7f%'#252#255#255\r
+  +#255#0#167#167#167#242#210#210#210#255#240#240#240#255#218#218#218#255#217\r
+  +#217#217#255'7'#163'k'#255#150#206#176#255#148#205#173#255#145#203#170#255\r
+  +#144#203#168#255't'#188#144#255#138#199#161#255'F'#165'h'#255#7#135'5'#253#1\r
+  +#131'-'#15#255#255#255#0#171#171#171#186#168#168#168#254#228#228#228#255#219\r
+  +#219#219#255#186#186#186#255'='#165'o'#255'8'#163'n'#255'4'#161'h'#255'0'#158\r
+  +'b'#255'U'#175'|'#255#145#203#170#255'O'#171't'#255#23#143'E'#253#17#139'='\r
+  +#12#255#255#255#0#255#255#255#0#174#174#174#188#171#171#171#250#233#233#233\r
+  +#255#172#172#172#255#162#162#162#255#176#176#176#255#234#234#234#255#178#178\r
+  +#178#255#190#190#190#255'8'#162'h'#255'Z'#179#129#255'('#152'W'#255#135#139\r
+  +#137#249#136#136#136'2'#255#255#255#0#255#255#255#0#178#178#178#14#175#175\r
+  +#175#188#172#172#172#245#229#229#229#255#173#173#173#255#163#163#163#255#177\r
+  +#177#177#255#234#234#234#255#192#192#192#255'>'#166'p'#255'1'#159'e'#255#209\r
+  +#193#166#255#195#188#178#255#139#139#139#250#136#136#136'B'#255#255#255#0#255\r
+  +#255#255#0#178#178#178#14#175#175#175#188#172#172#172#245#229#229#229#255#174\r
+  +#174#174#255#164#164#164#255#179#179#179#255#237#237#237#255#215#185#149#255\r
+  +#201#155'd'#255#206#163's'#255#230#228#226#255#143#143#143#242#140#140#140'<'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#179#179#179#14#176#176#176#188#173\r
+  +#173#173#245#229#229#229#255#175#175#175#255#166#166#166#255#180#180#180#255\r
+  +#229#219#206#255#213#181#143#255#225#203#176#255#149#149#149#254#146#146#146\r
+  +#192#143#143#143#16#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#179#179#179#14#176#176#176#188#174#174#174#245#230#230#230#255#176#176#176\r
+  +#255#167#167#167#255#181#181#181#255#239#239#239#255#244#244#244#255#153#153\r
+  ,#153#242#150#150#150#136#147#147#147#4#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#180#180#180#14#177#177#177#187#174#174#174\r
+  +#245#230#230#230#255#177#177#177#255#176#176#176#255#242#242#242#255#159#159\r
+  +#159#253#156#156#156#179#153#153#153#5#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#180#180#180#14\r
+  +#177#177#177#187#175#175#175#245#232#232#232#255#244#244#244#255#166#166#166\r
+  +#249#163#163#163#136#160#160#160#7#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#181#181#181#14#178#178#178#187#175#175#175#244#172#172#172#242#169\r
+  +#169#169#136#166#166#166#4#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#181#181#181#14#178#178#178#186#176#176#176#136\r
+  +#173#173#173#4#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#9'Num'\r
+  +'Glyphs'#2#0#7'OnClick'#7#12'SGPropSetOID'#8'ShowHint'#9#14'ParentShowHint'#8\r
+  +#0#0#0#11'TStringGrid'#6'SGProp'#4'Left'#2#1#6'Height'#3#234#1#3'Top'#2'.'#5\r
+  +'Width'#3#224#1#5'Align'#7#8'alClient'#15'AutoFillColumns'#9#11'BorderStyle'\r
+  +#7#6'bsNone'#8'ColCount'#2#4#7'Columns'#14#1#9'Alignment'#7#8'taCenter'#12'S'\r
+  +'izePriority'#2#0#15'Title.Alignment'#7#8'taCenter'#13'Title.Caption'#6#6'Nu'\r
+  +'mber'#5'Width'#2'P'#0#1#9'Alignment'#7#8'taCenter'#12'SizePriority'#2#0#15\r
+  +'Title.Alignment'#7#8'taCenter'#13'Title.Caption'#6#6'Access'#5'Width'#2'P'#0\r
+  +#1#15'Title.Alignment'#7#8'taCenter'#13'Title.Caption'#6#4'Name'#5'Width'#3\r
+  +#196#0#0#1#12'SizePriority'#2#0#15'Title.Alignment'#7#8'taCenter'#13'Title.C'\r
+  +'aption'#6#5'Value'#5'Width'#2'k'#0#0#15'DefaultColWidth'#2#20#10'FixedColor'\r
+  +#7#9'clBtnFace'#9'FixedCols'#2#0#4'Flat'#9#7'Options'#11#15'goFixedVertLine'\r
+  +#15'goFixedHorzLine'#10'goVertLine'#10'goHorzLine'#13'goRangeSelect'#11'goRo'\r
+  +'wSizing'#11'goColMoving'#11'goRowSelect'#14'goSmoothScroll'#0#8'RowCount'#2\r
+  +#1#10'ScrollBars'#7#10'ssVertical'#8'TabOrder'#2#1#7'TabStop'#9#15'TitleFont'\r
+  +'.Style'#11#6'fsBold'#0#10'OnDblClick'#7#12'SGPropSetOID'#0#0#0#0#8'TToolBar'\r
+  +#8'ToolBar1'#6'Height'#2'&'#5'Width'#3#238#3#12'ButtonHeight'#2'$'#11'Button'\r
+  +'Width'#2'$'#7'Caption'#6#8'ToolBar1'#11'EdgeBorders'#11#8'ebBottom'#0#4'Fla'\r
+  +'t'#9#6'Indent'#2#4#8'TabOrder'#2#1#0#12'TSpeedButton'#12'SpeedButton8'#3'Ta'\r
+  +'g'#2#10#4'Left'#2'('#6'Height'#2'$'#4'Hint'#6#11'Preferences'#5'Width'#2'$'\r
+  +#5'Color'#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data'#10':'#16#0#0'6'#16#0#0'BM6'\r
+  +#16#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0#0#16#0#0\r
+  +'d'#0#0#0'd'#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\r
+  +#0#0#0#0#0#0#0#0#0#159#255#0#0#159#255#0#0#159#255#0#0#159#255#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255#15#8#160#255#16' '#176\r
+  +#255#15' '#191#255#16''''#191#255#31'0'#176#255'//'#176#255#0#0#159#255#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#223'\7f'#31#255#224\r
+  +#143#31#255#224#144' '#255#208'w'#16#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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#159\r
+  +#255'_g'#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'#184#255#255\r
+  +#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#223#135'/'#255#255#192'`'#255#240#168' '#255#240#176'@'#255#240#184'o'#255\r
+  +#208'p'#15#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'\r
+  +#128#255#255'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#239#191'\7f'#255#255#192'`'\r
+  +#255#240#168' '#255#240#176'?'#255#255#207#128#255#223#136'/'#255#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255\r
+  +'`'#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#208'p'#15#255#240#215#159#255#255#199'`'#255#240#168' '#255#240#176'?'\r
+  +#255#255#207#128#255#224#152'?'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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#159#255'`o'\r
+  +#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255\r
+  +#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255\r
+  +#255#223#175#255#255#199'o'#255#240#168' '#255#240#176'?'#255#255#207#128#255\r
+  +#224#160'@'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255\r
+  +#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#223#175#255#255\r
+  ,#199'o'#255#240#168' '#255#240#175'?'#255#255#207'\7f'#255#239#160'O'#255#208\r
+  +'p'#15#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'#128#255#255\r
+  +'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#224#175#255#255#199'o'#255#240#168\r
+  +' '#255#240#175'?'#255#255#207'\7f'#255#239#167'O'#255#208'p'#15#255#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'\r
+  +#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#208'p'#15#255#255#224#175#255#255#200'p'#255#240#168' '#255#240#175'0'\r
+  +#255#255#207'\7f'#255#239#167'O'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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#159#255'`o'\r
+  +#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255\r
+  +#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255\r
+  +#255#224#176#255#255#200'p'#255#240#168' '#255#240#175'0'#255#255#200'\7f'#255\r
+  +#239#167'P'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255\r
+  +#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#224#176#255#255\r
+  +#200'p'#255#240#168' '#255#240#175'0'#255#255#200'\7f'#255#239#167'P'#255#208\r
+  +'p'#15#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'#128#255#255\r
+  +'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#224#176#255#255#200'p'#255#240#168\r
+  +' '#255#240#168'/'#255#255#200'\7f'#255#239#168'P'#255#208'p'#15#255#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#159#255'`o'#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'\r
+  +#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#208'p'#15#255#255#231#176#255#255#207'\7f'#255#240#168' '#255#240#168'/'\r
+  +#255#255#200'\7f'#255#239#168'P'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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#159#255'`o'\r
+  +#208#255'_'#143#255#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255\r
+  +#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255\r
+  +#255#231#176#255#255#207'\7f'#255#240#168' '#255#240#168'/'#255#255#200'p'#255\r
+  +#239#168'_'#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'`o'#208#255'_'#143#255\r
+  +#255'?'#128#255#255'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#231#176#255#255\r
+  +#207'\7f'#255#240#168' '#255#240#168'/'#255#255#200'p'#255#239#168'_'#255#208\r
+  +'p'#15#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#159#255'_`'#208#255'_'#143#255#255'?'#128#255#255\r
+  +'?'#136#255#255'`'#184#255#255#255#255#255#255#0#0#159#255#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#255#231#191#255#255#207#128#255#240#168\r
+  +' '#255#240#168'/'#255#255#200'p'#255#239#168'_'#255#208'p'#15#255#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#159#255#15#8#160#255' 0'#192#255#16'7'#207#255#31'8'#207#255'/O'#192\r
+  +#255'PW'#192#255#0#0#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'\r
+  +#15#255#208'\7f'#31#255#223'\7f '#255#223'\7f'#16#255#208'\7f'#16#255#223'\7f'#31#255\r
+  +#208'w'#16#255#208'p'#15#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@(\7f'#255#160'x\7f'#255#191#143\r
+  +'\7f'#255#191#143'\7f'#255#191#136'\7f'#255#128'Po'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#224#152'@'#255#255#232#192#255#255#232#192#255\r
+  +#255#232#192#255#255#232#192#255#223#151'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#224#176'\7f'#255#239#200#144#255#239#200#144#255#239#200#144#255#208#135\r
+  +'O'#255#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#224#151'@'\r
+  +#255#255#232#192#255#255#232#192#255#255#232#192#255#255#232#192#255#223#151\r
+  +'@'#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#224#176'\7f'#255#239#200#144#255#239\r
+  +#200#144#255#239#200#144#255#208#128'O'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#224#151'@'#255#255#239#207#255#255#239#207#255#255#239\r
+  +#207#255#255#239#207#255#224#151'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#224#176'\7f'#255#239#200#144#255#239#200#144#255#239#200#144#255#208#128'O'\r
+  ,#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#239#184\r
+  +#128#255#255#239#208#255#255#239#208#255#255#239#208#255#255#239#208#255#239\r
+  +#175'o'#255#208'p'#15#255#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\r
+  +#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#224#176'\7f'#255#240#200\r
+  +#159#255#239#200#144#255#239#200#144#255#208#128'O'#255#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#208'x'#31#255#240#200#159#255#255#240#208#255#255#240#208\r
+  +#255#255#240#208#255#255#240#208#255#255#240#208#255#255#240#208#255#224#160\r
+  +'P'#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#224#176'\7f'#255#240#207#159#255#240#200#159\r
+  +#255#239#200#144#255#208#128'O'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'\7f '\r
+  +#255#255#223#191#255#255#240#223#255#255#240#223#255#255#240#223#255#255#240\r
+  +#223#255#255#240#223#255#255#240#223#255#255#240#208#255#255#240#208#255#224\r
+  +#152'O'#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#207'x?'#255#224#176'\7f'#255#240#207#159#255#240#207#159\r
+  +#255#240#200#159#255#208#128'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#223#151\r
+  +'@'#255#255#247#223#255#255#247#223#255#255#247#223#255#255#247#223#255#255\r
+  +#247#223#255#255#247#223#255#255#247#223#255#255#247#223#255#255#247#223#255\r
+  +#240#200#159#255#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\r
+  +#0#0#0#0#0#0#0#0#0#0#208'\7f@'#255#223#144'_'#255#239#184#143#255#240#207#159\r
+  +#255#240#207#159#255#240#207#159#255#223#151'_'#255#208#136'P'#255#207'x?'\r
+  +#255#0#0#0#0#0#0#0#0#223#151'O'#255#255#247#224#255#255#247#224#255#240#223\r
+  +#191#255#239#192#143#255#239#199#144#255#239#199#144#255#240#207#160#255#255\r
+  +#247#224#255#255#247#224#255#240#200#159#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#223#151'`'#255#240#215#175\r
+  +#255#240#208#160#255#240#207#159#255#240#207#159#255#240#207#159#255#240#207\r
+  +#159#255#239#183#128#255#207'x?'#255#0#0#0#0#0#0#0#0#223#151'O'#255#255#248\r
+  +#239#255#255#248#239#255#239#184#128#255#208'p'#15#255#0#0#0#0#0#0#0#0#223\r
+  +#136'0'#255#255#248#224#255#255#248#224#255#239#200#159#255#0#0#0#0#0#0#0#0#0\r
+  +#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#223#159'o'#255\r
+  +#240#216#176#255#240#215#175#255#240#208#160#255#240#207#159#255#240#207#159\r
+  +#255#240#207#159#255#224#176'\7f'#255#207'x?'#255#0#0#0#0#0#0#0#0#223#151'O'\r
+  +#255#255#248#239#255#255#248#239#255#239#184#128#255#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#223#144'?'#255#255#248#239#255#255#248#239#255#239#200#159#255#0#0#0#0#0#0#0\r
+  +#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#208#136'P'\r
+  +#255#240#216#191#255#240#216#176#255#240#215#175#255#240#208#160#255#240#207\r
+  +#159#255#240#207#159#255#224#167'p'#255#207'x?'#255#0#0#0#0#0#0#0#0#208'w'#16\r
+  +#255#255#239#208#255#255#255#239#255#239#184#128#255#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#223#144'@'#255#255#255#239#255#255#255#239#255#223#151'@'#255#0#0#0#0#0#0#0\r
+  +#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#207'x?'\r
+  +#255#223#160'p'#255#240#223#192#255#240#215#176#255#240#215#175#255#240#208\r
+  +#160#255#239#184#128#255#208'x@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#224#160\r
+  +'_'#255#255#255#240#255#239#183'\7f'#255#0#0#0#0#0#0#0#0#0#0#0#0#223#151'O'#255\r
+  +#255#255#240#255#239#192#144#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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#207'x?'#255#239#192#159\r
+  +#255#240#223#191#255#240#215#175#255#239#200#159#255#208'\7f@'#255#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208'p'#15#255#240#224#191#255#239#183'\7f'#255#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#223#152'O'#255#255#239#208#255#208'x'#31#255#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#208'\7f@'#255#223#144'`'#255#223#144'_'#255#208#128'O'#255#0#0\r
+  +#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#208'x'#31#255#223#136'/'\r
+  +#255#0#0#0#0#0#0#0#0#0#0#0#0#223#143'?'#255#223#151'@'#255#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#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\r
+  +#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#9'NumGlyp'\r
+  +'hs'#2#0#7'OnClick'#7#17'PreferenciesClick'#8'ShowHint'#9#14'ParentShowHint'\r
+  +#8#0#0#12'TSpeedButton'#12'SpeedButton9'#3'Tag'#2#10#4'Left'#2#4#6'Height'#2\r
+  +'$'#4'Hint'#6#13'Autodetection'#5'Width'#2'$'#5'Color'#7#9'clBtnFace'#4'Flat'\r
+  +#9#10'Glyph.Data'#10':'#16#0#0'6'#16#0#0'BM6'#16#0#0#0#0#0#0'6'#0#0#0'('#0#0\r
+  +#0' '#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0#0#16#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#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\r
+  +#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\r
+  ,#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\r
+  +#0#0#0#0#255'o'#0#255#255'o'#0#255#255'o'#0#255#255'o'#0#255#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255'o'#0#255#255'o'#0#255\r
+  +#255'o'#0#255#255'o'#15#255#255'p'#15#255#255'o'#0#255#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#255'o'#0#255#255'o'#0#255#255'o'#0#255#255'w'#16\r
+  +#255#255#128'/'#255#255#136'?'#255#255#128'/'#255#255'o'#0#255#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#255'o'#0#255#255'o'#0#255#255'w'#31#255#255#128'/'\r
+  +#255#255#143'@'#255#255#151'P'#255#255#159'_'#255#255#135'0'#255#255'o'#0#255\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255'o'#0#255#255'p'#15#255#255#128'/'#255\r
+  +#255#143'@'#255#255#152'P'#255#255#160'`'#255#255#175'\7f'#255#255#176#128#255\r
+  +#255#135'0'#255#255'o'#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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#255'o'#0#255#255'x'#31\r
+  +#255#255#136'?'#255#255#151'P'#255#255#160'`'#255#255#176#128#255#255#184#143\r
+  +#255#255#192#159#255#255#192#159#255#255#135'0'#255#255'o'#0#255#0#0#0#0#0#0\r
+  +#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\r
+  +#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\r
+  +#0#0#255'o'#0#255#255'\7f '#255#255#143'@'#255#255#159'_'#255#255#175'\7f'#255\r
+  +#255#184#143#255#255#199#160#255#255#208#191#255#255#208#191#255#255#207#176\r
+  +#255#255#135'/'#255#255'o'#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255'o'#0#255#255'\7f '#255#255#144'O'\r
+  +#255#255#160'`'#255#255#176#128#255#255#192#159#255#255#208#191#255#255#223\r
+  +#207#255#255#224#208#255#255#223#207#255#255#207#176#255#255#135'0'#255#255\r
+  +'o'#0#255#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\r
+  +#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\r
+  +#0#0#0#0'PX'#144#255#255'p'#15#255#255#144'@'#255#255#160'`'#255#255#176#128\r
+  +#255#255#192#159#255#255#208#191#255#255#224#208#255#255#232#224#255#255#224\r
+  +#208#255#255#208#191#255#255#192#159#255#255#135'0'#255#255'o'#0#255#0#0#0#0\r
+  +#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\r
+  +#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'P'#223#255#0'W'#223\r
+  +#255'_X'#143#255#255'w'#16#255#255#160'`'#255#255#176#128#255#255#192#159#255\r
+  +#255#208#191#255#255#223#207#255#255#224#208#255#255#223#207#255#255#208#191\r
+  +#255#255#192#159#255#255#176#128#255#255#135'/'#255#255'o'#0#255#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'P'#223#255#15'`'#224#255'?'#152#240#255#16\r
+  +'g'#224#255'`X'#143#255#255'\7f '#255#255#175'\7f'#255#255#184#143#255#255#199\r
+  +#160#255#255#208#191#255#255#208#191#255#255#208#191#255#255#199#160#255#255\r
+  +#184#143#255#255#175'\7f'#255#255#159'_'#255#255'x '#255#255'o'#0#255#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0'P'#223#255#0'X'#223#255'?'#152#240#255'O'#167#240#255'O'\r
+  +#160#240#255#16'`'#224#255'o_'#128#255#255#128'/'#255#255#176#128#255#255#184\r
+  +#143#255#255#192#159#255#255#192#159#255#255#192#159#255#255#184#143#255#255\r
+  +#176#128#255#255#160'`'#255#255#151'P'#255#255'\7f '#255#255'o'#0#255#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0'P'#223#255#0'P'#223#255'0'#144#239#255'O'#167#240#255'O'#168#240\r
+  +#255'P'#175#240#255'_'#175#240#255#16'`'#224#255'p_\7f'#255#255#128'/'#255#255\r
+  +#175'\7f'#255#255#176#128#255#255#176#128#255#255#176#128#255#255#175'\7f'#255\r
+  +#255#160'`'#255#255#152'P'#255#255#143'@'#255#255'w'#16#255#255'o'#0#255#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0'P'#223#255'/'#135#239#255'O'#167#240#255'O'#168#240#255'_'\r
+  +#176#240#255'o'#184#240#255'p'#191#240#255'o'#183#240#255#16'_'#223#255'\7f_p'\r
+  +#255#255#135'/'#255#255#160'`'#255#255#160'`'#255#255#160'`'#255#255#159'_'\r
+  +#255#255#151'P'#255#255#143'@'#255#255#128'/'#255#255'o'#0#255#255'o'#0#255#0\r
+  +#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\r
+  +#0#0#0#0#0#0'P'#223#255' x'#224#255'O'#167#240#255'P'#168#240#255'_'#176#240\r
+  ,#255'p'#191#240#255'p'#191#240#255'\7f'#199#240#255#144#208#255#255#143#200#240\r
+  +#255#15'X'#223#255#128'_o'#255#255#128'/'#255#255#144'O'#255#255#144'O'#255\r
+  +#255#143'@'#255#255#136'?'#255#255#128'/'#255#255'p'#15#255#255'o'#0#255#0#0\r
+  +#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\r
+  +#0#0#0#0#0'P'#223#255#16'h'#224#255'O'#167#240#255'P'#175#240#255'`'#183#240\r
+  +#255'p'#191#240#255'p'#191#240#255#128#200#255#255#159#216#255#255#175#224\r
+  +#255#255#176#231#255#255'\7f'#183#240#255#0'P'#223#255#143'_`'#255#255'w'#31\r
+  +#255#255'x'#31#255#255'w'#16#255#255'p'#15#255#255'o'#0#255#255'o'#0#255#0#0\r
+  +#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\r
+  +#0#0#0#0#0'P'#223#255#15'`'#224#255'O'#167#240#255'_'#175#240#255'o'#184#240\r
+  +#255'p'#191#240#255'p'#191#240#255#143#207#255#255#160#223#255#255#175#224\r
+  +#255#255#176#231#255#255#159#215#255#255#16'g'#224#255#0'P'#223#255#0#0#0#0#0\r
+  +#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\r
+  +#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'P'#223#255#0'X'#223#255\r
+  +'O'#160#240#255'_'#176#240#255'o'#184#240#255'p'#191#240#255'\7f'#192#240#255\r
+  +#144#208#255#255#175#224#255#255#175#231#255#255#176#231#255#255#159#208#255\r
+  +#255#16'`'#223#255#0'P'#223#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0'P'#223#255#0'P'#223#255'@'#151#239#255'`'#183#240#255'p'#191\r
+  +#240#255'p'#191#240#255#128#200#240#255#144#215#255#255#175#224#255#255#176\r
+  +#231#255#255#176#231#255#255#144#207#240#255#15'_'#223#255#0'P'#223#255#0#0#0\r
+  +#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\r
+  +#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'P'#223#255\r
+  +'0'#136#239#255'`'#183#240#255'p'#191#240#255'p'#191#240#255#143#207#255#255\r
+  +#159#216#255#255#175#224#255#255#176#231#255#255#176#232#255#255#143#199#240\r
+  +#255#15'X'#223#255#0'P'#223#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0'P'#223#255'/x'#224#255'o'#184#240#255'p'#191#240#255\r
+  +'\7f'#192#240#255#144#208#255#255#160#223#255#255#175#231#255#255#176#231#255\r
+  +#255#176#232#255#255#143#192#240#255#15'X'#223#255#0'P'#223#255#0#0#0#0#0#0#0\r
+  +#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\r
+  +#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'P'#223#255#31'o'#224\r
+  +#255'o'#191#240#255'p'#191#240#255'\7f'#199#240#255#144#215#255#255#175#224#255\r
+  +#255#176#231#255#255#176#231#255#255#176#232#255#255#128#191#240#255#0'W'#223\r
+  +#255#0'O'#223#255#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\r
+  +#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\r
+  +#0#0#0#0#0'P'#223#255#16'`'#224#255'o'#183#240#255'p'#191#240#255#128#200#255\r
+  +#255#159#216#255#255#175#224#255#255#176#231#255#255#176#231#255#255#176#232\r
+  +#255#255'\7f'#184#240#255#0'W'#223#255#0'O'#223#255#0#16#224#255#0#0#224#255#0\r
+  +#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\r
+  +#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'P'#223#255#0'X'#223#255\r
+  +'`'#175#240#255'p'#192#240#255#143#207#255#255#160#223#255#255#175#224#255\r
+  +#255#176#231#255#255#176#232#255#255#176#232#255#255'p'#183#240#255#0'P'#223\r
+  +#255#0'P'#223#255#0#24#224#255#159#159#240#255#15#15#224#255#0#0#0#0#0#0#0#0\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'P'#223#255'?'#136#239#255'\7f'#199#240\r
+  +#255#144#208#255#255#175#224#255#255#175#231#255#255#176#231#255#255#176#232\r
+  +#255#255#176#232#255#255'o'#175#240#255#0'P'#223#255#0'P'#223#255#0#0#0#0#0#0\r
+  +#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\r
+  +#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'P'\r
+  +#223#255' o'#224#255#159#216#255#255#175#224#255#255#176#231#255#255#176#231\r
+  +#255#255#176#232#255#255#176#232#255#255'o'#168#239#255#0'P'#223#255#0'P'#223\r
+  +#255#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0'P'#223#255#0'P'#223#255#144#207#240#255#176#231#255\r
+  +#255#176#232#255#255#176#232#255#255#176#232#255#255'`'#160#239#255#0'P'#223\r
+  +#255#0'P'#223#255#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\r
+  +#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\r
+  +#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'P'#223#255' p'#224#255#159\r
+  +#215#255#255#176#232#255#255#176#232#255#255'_'#152#239#255#0'P'#223#255#0'P'\r
+  +#223#255#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\r
+  +#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\r
+  +#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'P'#223#255#0'W'\r
+  +#223#255' o'#224#255'0x'#224#255#0'P'#223#255#0'P'#223#255#0#0#0#0#0#0#0#0#0\r
+  ,#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\r
+  +#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\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'P'#223#255#0'P'#223#255#0'P'\r
+  +#223#255#0'P'#223#255#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\r
+  +#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\r
+  +#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\r
+  +#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\r
+  +#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\r
+  +#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\r
+  +#0#0#0#0#0#0#9'NumGlyphs'#2#0#7'OnClick'#7#13'Autodetection'#8'ShowHint'#9#14\r
+  +'ParentShowHint'#8#0#0#0#6'TPanel'#6'Panel3'#4'Left'#2#4#6'Height'#3#25#2#3\r
+  +'Top'#2'*'#5'Width'#3#247#1#5'Align'#7#8'alClient'#20'BorderSpacing.Around'#2\r
+  +#4#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#25#2#11'ClientWidth'#3#247#1\r
+  +#8'TabOrder'#2#2#0#13'TSpkRollPanel'#5'Page1'#6'Height'#3#25#2#5'Width'#3#247\r
+  +#1#5'Align'#7#8'alClient'#10'BevelOuter'#7#9'bvLowered'#7'Caption'#6#5'Units'\r
+  +#12'ClientHeight'#3#25#2#11'ClientWidth'#3#247#1#10'Font.Color'#7#7'clWhite'\r
+  +#11'Font.Height'#2#240#9'Font.Name'#6#5'Arial'#10'Font.Style'#11#6'fsBold'#0\r
+  +#11'ParentColor'#8#8'TabOrder'#2#0#6'Margin'#2#1#11'MarginColor'#7#6'clGray'\r
+  +#13'CaptionHeight'#2#22#11'BorderColor'#7#9'clBtnFace'#11'AllowResize'#9#19\r
+  +'CaptionGradientMode'#7#6'gmUser'#16'CaptionColorFrom'#4#167#190#228#0#14'Ca'\r
+  +'ptionColorTo'#4'(J\7f'#0#19'CaptionGradientType'#7#12'gtHorizontal'#14'PanelC'\r
+  +'olorFrom'#7#9'clBtnFace'#12'PanelColorTo'#7#9'clBtnFace'#17'PanelGradientTy'\r
+  +'pe'#7#12'gtHorizontal'#11'BorderInner'#2#0#0#6'TShape'#6'Shape4'#4'Left'#2#1\r
+  +#6'Height'#2#1#3'Top'#2'-'#5'Width'#3#245#1#5'Align'#7#5'alTop'#9'Pen.Color'\r
+  +#7#6'clGray'#5'Shape'#7#9'stDiamond'#0#0#6'TShape'#6'Shape5'#4'Left'#2#1#6'H'\r
+  +'eight'#2#1#3'Top'#3#128#0#5'Width'#3#245#1#5'Align'#7#5'alTop'#9'Pen.Color'\r
+  +#7#6'clGray'#5'Shape'#7#9'stDiamond'#0#0#8'TToolBar'#8'ToolBar3'#4'Left'#2#1\r
+  +#6'Height'#2#22#3'Top'#2#23#5'Width'#3#245#1#11'ButtonWidth'#2#22#7'Caption'\r
+  +#6#8'ToolBar1'#5'Color'#7#9'clBtnFace'#11'EdgeBorders'#11#0#4'Flat'#9#11'Par'\r
+  +'entColor'#8#8'TabOrder'#2#0#0#12'TSpeedButton'#15'SBSetNewAddress'#3'Tag'#2\r
+  +#10#4'Left'#2#1#6'Height'#2#22#4'Hint'#6#9'Readdress'#5'Width'#2#23#5'Color'\r
+  +#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0\r
+  +#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'\r
+  +#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255\r
+  +#0#17'=U'#247'(_'#135#251'I'#136#189#251'B'#141#188#193'x'#150#174'S'#170#170\r
+  +#170#30#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'+e'\r
+  +#131#251#148#199#249#255#145#201#249#255'A'#133#201#255'#g'#170#255#157#171\r
+  +#183#255#170#170#170'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'C'\r
+  +#137#170#255#224#242#255#255'T'#154#216#255#26'z'#190#255'I'#152#197#255'E'\r
+  +#139#195#255#160#174#187#255#171#171#171'!'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#29'i'#156'cz'#182#213#255#144#183#209#255'U'#201#228#255'['#223#245\r
+  +#255'x'#208#237#255'N'#154#218#255#165#177#187#255#171#171#171'!'#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#186#186#186';'#131#166#183#249'v'#185#214#255#194#246#253#255'c'\r
+  +#223#247#255']'#226#248#255'y'#211#240#255'H'#151#219#255#167#178#187#255#171\r
+  +#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#189#189#189';'#188#188#188#246#229#229#229#255#176#212#229#255'w'#203\r
+  +#231#255#199#247#253#255'^'#220#245#255'Z'#225#247#255'{'#212#241#255'J'#152\r
+  +#220#255#157#174#190#255#172#172#172'!'#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#193#193#193';'#192#192#192#246#231#231#231#255#253#253#253#255#251#236\r
+  +#214#255#190#196#160#255'y'#211#238#255#199#247#253#255'_'#220#245#255'['#226\r
+  +#247#255'z'#214#242#255'N'#159#222#255#161#175#187#255#172#172#172#31#255#255\r
+  +#255#0#197#197#197';'#195#195#195#246#232#232#232#255#253#253#253#255#251#236\r
+  +#214#255#253#205#136#255#255#213#152#255#193#206#178#255'}'#212#237#255#196\r
+  +#246#253#255'l'#221#246#255'm'#202#237#255'c'#163#215#255'd'#157#208#255'o'\r
+  +#155#193'8'#201#201#201'='#199#199#199#246#233#233#233#255#253#253#253#255\r
+  +#251#235#211#255#255#204#131#255#255#212#152#255#255#215#158#255#255#214#155\r
+  +#255#181#198#168#255#129#213#237#255#178#227#249#255#139#192#231#255#174#211\r
+  +#246#255#196#224#252#255'f'#159#211#247#203#203#203#246#235#235#235#255#253\r
+  +#253#253#255#250#250#250#255#251#243#231#255#254#206#137#255#255#212#150#255\r
+  +#255#213#154#255#255#207#139#255#253#226#188#255#175#228#244#255'w'#190#231\r
+  ,#255#180#210#240#255#229#243#255#255#172#210#239#255'H'#140#199#232#205#205\r
+  +#205#255#253#253#253#255#253#253#253#255#252#252#252#255#247#247#247#255#253\r
+  +#245#234#255#254#207#138#255#255#204#131#255#253#226#188#255#253#253#253#255\r
+  +#220#220#220#255#146#187#202#255'X'#165#216#255#133#177#219#255'F'#157#208\r
+  +#255'+'#149#209'^'#206#206#206#255#253#253#253#255#224#224#224#255#202#202\r
+  +#202#249#200#200#200#226#247#247#247#255#251#243#232#255#253#227#189#255#253\r
+  +#253#253#255#222#222#222#255#195#195#195#255#189#189#189#21#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#208#208#208#255#253#253#253#255#205\r
+  +#205#205#255#255#255#255#0#202#202#202#205#243#243#243#255#251#251#251#255\r
+  +#253#253#253#255#224#224#224#255#199#199#199#255#192#192#192#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#210#210#210#255#253\r
+  +#253#253#255#226#226#226#255#206#206#206#255#224#224#224#255#253#253#253#255\r
+  +#253#253#253#255#226#226#226#255#203#203#203#255#196#196#196#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211\r
+  +#211#211#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255\r
+  +#253#253#253#255#228#228#228#255#205#205#205#255#200#200#200#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#213#213#213#255#212#212#212#255#210#210#210#255#209#209#209#255\r
+  +#208#208#208#255#206#206#206#255#205#205#205#255#203#203#203#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#7'OnClick'#7#20'SBSetNewAddressCli'\r
+  +'ck'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#12'TSpeedButton'#7'SBReset'#3'Ta'\r
+  +'g'#2#10#4'Left'#2#24#6'Height'#2#22#4'Hint'#6#5'Reset'#5'Width'#2#23#5'Colo'\r
+  +'r'#7#9'clBtnFace'#4'Flat'#9#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0\r
+  +#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0\r
+  +'d'#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\r
+  +#0#0#8#24#186#186' +'#190#201#24'$'#182#194#9#30#176#186#18#29#178#186#9#23\r
+  +#178#186#0#27#189#186#3#21#193#186#6#23#198#186#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#30'0'#197#201'6C'#178#253'4J'#174#255#7'&'#155#195\r
+  +#0#26#148#186#0#25#154#186#0#28#167#186#2#20#176#186#8#27#194#186#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#178#178#178'88F'#187#253'>Y'#194#255'Y'\r
+  +#149#223#255'N'#168#215#255'&'#152#221#195'5'#162#227#186'1'#143#232#186#7'2'\r
+  +#180#186#1#20#172#186#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#182#182#182';'\r
+  +#180#180#180#246'CQ'#198#255'D`'#195#255'd'#196#244#255'B'#214#243#255'4'#211\r
+  +#234#255#22#214#243#195'-'#204#252#186#8':'#154#186#0#26#160#186#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#186#186#186';'#184#184#184#246#228#228#228#255'L['#211\r
+  +#255'C\'#183#255'\'#188#217#255'E'#228#250#255':'#227#237#255'5'#215#226#255\r
+  +'-'#214#245#195#8'<'#141#186#0#29#155#186#0#0#0#0#0#0#0#0#0#0#0#0#189#189#189\r
+  +';'#188#188#188#246#229#229#229#255#253#253#253#255'IU'#200#255'DQ'#163#255\r
+  +'_'#186#214#255'F'#216#226#255'C'#232#245#255'A'#221#236#255'K'#202#228#255\r
+  +#16'<'#141#195#0'"'#162#186#0#0#0#0#0#0#0#0#193#193#193';'#192#192#192#246\r
+  +#231#231#231#255#253#253#253#255#251#236#214#255'FN'#181#255'EZ'#181#255'm'\r
+  +#178#221#255']'#203#224#255']'#206#224#255'g'#217#253#255'm'#207#244#255'9]'\r
+  +#172#255#7'$'#173#194#0#0#0#0#197#197#197';'#195#195#195#246#232#232#232#255\r
+  +#253#253#253#255#251#236#214#255#253#205#136#255'EP'#186#255'ET'#182#255']'\r
+  +#132#205#255'W'#141#194#255']'#149#204#255'_'#152#220#255'R'#139#217#255'4Q'\r
+  +#183#255#8'#'#190#192#201#201#201'='#199#199#199#246#233#233#233#255#253#253\r
+  +#253#255#251#235#211#255#255#204#131#255#255#212#152#255'EU'#192#255'EO'#179\r
+  +#255'HU'#176#255'DW'#179#255'Jc'#200#255':S'#188#255'2J'#184#255#5'$'#195#192\r
+  +#2#28#199#186#203#203#203#246#235#235#235#255#253#253#253#255#250#250#250#255\r
+  +#251#243#231#255#254#206#137#255#255#212#150#255#255#213#154#255#255#207#139\r
+  +#255#253#226#188#255#253#253#253#255#218#218#218#255#189#189#189#255#181#181\r
+  +#181#21#0#0#0#0#0#0#0#0#205#205#205#255#253#253#253#255#253#253#253#255#252\r
+  +#252#252#255#247#247#247#255#253#245#234#255#254#207#138#255#255#204#131#255\r
+  +#253#226#188#255#253#253#253#255#220#220#220#255#192#192#192#255#185#185#185\r
+  +#21#0#0#0#0#0#0#0#0#0#0#0#0#206#206#206#255#253#253#253#255#224#224#224#255\r
+  +#202#202#202#249#200#200#200#226#247#247#247#255#251#243#232#255#253#227#189\r
+  +#255#253#253#253#255#222#222#222#255#195#195#195#255#189#189#189#21#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#208#208#208#255#253#253#253#255#205#205#205#255#0#0#0\r
+  +#0#202#202#202#205#243#243#243#255#251#251#251#255#253#253#253#255#224#224\r
+  +#224#255#199#199#199#255#192#192#192#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#210#210#210#255#253#253#253#255#226#226#226#255#206#206#206#255#224#224\r
+  +#224#255#253#253#253#255#253#253#253#255#226#226#226#255#203#203#203#255#196\r
+  +#196#196#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#211#211#211#255\r
+  ,#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253\r
+  +#255#228#228#228#255#205#205#205#255#200#200#200#21#0#0#0#0#0#0#0#0#0#0#0#0#0\r
+  +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#213#213#213#255#212#212#212#255#210#210#210\r
+  +#255#209#209#209#255#208#208#208#255#206#206#206#255#205#205#205#255#203#203\r
+  +#203#21#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#9'Nu'\r
+  +'mGlyphs'#2#0#7'OnClick'#7#12'SBResetClick'#8'ShowHint'#9#14'ParentShowHint'\r
+  +#8#0#0#0#6'TPanel'#6'Panel4'#4'Left'#2#1#6'Height'#2'R'#3'Top'#2'.'#5'Width'\r
+  +#3#245#1#5'Align'#7#5'alTop'#7'Anchors'#11#5'akTop'#6'akLeft'#0#10'BevelOute'\r
+  +'r'#7#6'bvNone'#12'ClientHeight'#2'R'#11'ClientWidth'#3#245#1#8'TabOrder'#2#1\r
+  +#0#6'TLabel'#6'Label2'#4'Left'#2#9#6'Height'#2#14#3'Top'#2#12#5'Width'#2'('#7\r
+  +'Caption'#6#7'Address'#11'ParentColor'#8#0#0#6'TLabel'#7'modaddr'#4'Left'#2\r
+  +'s'#6'Height'#2#14#3'Top'#2#12#5'Width'#3'}'#1#7'Anchors'#11#5'akTop'#6'akLe'\r
+  +'ft'#7'akRight'#0#8'AutoSize'#8#5'Color'#7#7'clWhite'#11'ParentColor'#8#11'T'\r
+  +'ransparent'#8#0#0#6'TLabel'#6'Label4'#4'Left'#2#9#6'Height'#2#14#3'Top'#2'#'\r
+  +#5'Width'#2')'#7'Caption'#6#7'ID name'#11'ParentColor'#8#0#0#6'TLabel'#6'idn'\r
+  +'ame'#4'Left'#2's'#6'Height'#2#14#3'Top'#2'#'#5'Width'#3'}'#1#7'Anchors'#11#5\r
+  +'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#8#5'Color'#7#7'clWhite'#11'Parent'\r
+  +'Color'#8#11'Transparent'#8#0#0#6'TLabel'#6'Label6'#4'Left'#2#9#6'Height'#2\r
+  +#14#3'Top'#2';'#5'Width'#2'C'#7'Caption'#6#14'ID description'#11'ParentColor'\r
+  +#8#0#0#6'TLabel'#5'iddes'#4'Left'#2's'#6'Height'#2#14#3'Top'#2';'#5'Width'#3\r
+  +'}'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#8#5'Color'#7\r
+  +#7'clWhite'#11'ParentColor'#8#11'Transparent'#8#0#0#0#9'TTreeView'#7'tvunits'\r
+  +#4'Left'#2#1#6'Height'#3#151#1#3'Top'#3#129#0#5'Width'#3#245#1#5'Align'#7#8\r
+  +'alClient'#7'Anchors'#11#5'akTop'#6'akLeft'#0#11'BorderStyle'#7#6'bsNone'#17\r
+  +'DefaultItemHeight'#2#16#6'Images'#7#10'ImageList2'#8'SortType'#7#6'stData'#8\r
+  +'TabOrder'#2#2#8'OnChange'#7#13'tvunitsChange'#9'OnCompare'#7#14'tvunitsComp'\r
+  +'are'#0#0#0#0#9'TSplitter'#9'Splitter1'#4'Left'#3#255#1#6'Height'#3'!'#2#3'T'\r
+  +'op'#2'&'#5'Width'#2#5#5'Align'#7#7'alRight'#12'ResizeAnchor'#7#7'akRight'#0\r
+  +#0#10'TStatusBar'#9'StatusBar'#6'Height'#2#23#3'Top'#3'G'#2#5'Width'#3#238#3\r
+  +#6'Panels'#14#1#4'Text'#6#8'Version:'#5'Width'#2'F'#0#1#5'Width'#2'F'#0#1#5\r
+  +'Width'#2'2'#0#0#11'SimplePanel'#8#0#0#9'TMainMenu'#9'MainMenu1'#4'left'#3\r
+  +#176#0#3'top'#3#0#1#0#9'TMenuItem'#9'MenuItem1'#7'Caption'#6#4'File'#0#9'TMe'\r
+  +'nuItem'#9'MenuItem9'#7'Caption'#6#13'Autodetection'#7'OnClick'#7#13'Autodet'\r
+  +'ection'#0#0#9'TMenuItem'#9'MenuItem8'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#9\r
+  +'MenuItem2'#7'Caption'#6#4'Exit'#7'OnClick'#7#14'MenuItem2Click'#0#0#0#9'TMe'\r
+  +'nuItem'#9'MenuItem3'#7'Caption'#6#5'Tools'#0#9'TMenuItem'#9'MenuItem5'#7'Ca'\r
+  +'ption'#6#11'Preferences'#7'OnClick'#7#17'PreferenciesClick'#0#0#0#9'TMenuIt'\r
+  +'em'#9'MenuItem4'#7'Caption'#6#5'About'#7'OnClick'#7#14'MenuItem4Click'#0#0#0\r
+  +#10'TImageList'#10'ImageList2'#4'left'#3#216#0#3'top'#3#0#1#6'Bitmap'#10#14\r
+  +#28#0#0'Li'#7#0#0#0#16#0#0#0#16#0#0#0#213#213#213#255#212#212#212#255#210#210\r
+  +#210#255#209#209#209#255#208#208#208#255#206#206#206#255#205#205#205#255#203\r
+  +#203#203#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211#211#211#255#253#253#253\r
+  +#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255#228#228\r
+  +#228#255#205#205#205#255#200#200#200#21#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#210#210#210\r
+  +#255#253#253#253#255#226#226#226#255#206#206#206#255#224#224#224#255#253#253\r
+  +#253#255#253#253#253#255#226#226#226#255#203#203#203#255#196#196#196#21#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#208#208#208#255#253#253#253#255#205#205#205#255#255#255#255#0#202#202\r
+  +#202#205#243#243#243#255#251#251#251#255#253#253#253#255#224#224#224#255#199\r
+  +#199#199#255#192#192#192#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#206#206#206#255#253#253#253#255#224#224#224#255#202#202\r
+  +#202#249#200#200#200#226#247#247#247#255#251#243#232#255#253#227#189#255#253\r
+  +#253#253#255#222#222#222#255#195#195#195#255#189#189#189#21#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#205#205#205#255#253#253#253#255#253\r
+  +#253#253#255#252#252#252#255#247#247#247#255#253#245#234#255#254#207#138#255\r
+  +#255#204#131#255#253#226#188#255#253#253#253#255#220#220#220#255#192#192#192\r
+  +#255#185#185#185#21#255#255#255#0#255#255#255#0#255#255#255#0#203#203#203#246\r
+  +#235#235#235#255#253#253#253#255#250#250#250#255#251#243#231#255#254#206#137\r
+  +#255#255#212#150#255#255#213#154#255#255#207#139#255#253#226#188#255#253#253\r
+  +#253#255#218#218#218#255#189#189#189#255#181#181#181#21#255#255#255#0#255#255\r
+  +#255#0#201#201#201'='#199#199#199#246#233#233#233#255#253#253#253#255#251#235\r
+  +#211#255#255#204#131#255#255#212#152#255#255#215#158#255#255#214#155#255#255\r
+  ,#207#139#255#253#226#188#255#253#253#253#255#217#217#217#255#185#185#185#255\r
+  +#177#177#177#21#255#255#255#0#255#255#255#0#197#197#197';'#195#195#195#246\r
+  +#232#232#232#255#253#253#253#255#251#236#214#255#253#205#136#255#255#213#152\r
+  +#255#255#215#158#255#255#214#155#255#255#206#137#255#253#225#186#255#253#253\r
+  +#253#255#215#215#215#255#181#181#181#255#174#174#174#21#255#255#255#0#255#255\r
+  +#255#0#193#193#193';'#192#192#192#246#231#231#231#255#253#253#253#255#251#236\r
+  +#214#255#253#205#136#255#255#213#152#255#255#214#156#255#255#208#142#255#247\r
+  +#204#141#255#253#252#251#255#217#217#217#255#183#183#183#255#172#172#172#31\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#189#189#189';'#188#188#188#246#229\r
+  +#229#229#255#253#253#253#255#251#236#214#255#253#205#134#255#255#207#140#255\r
+  +#250#209#151#255#249#247#243#255#217#217#217#255#183#183#183#255#172#172#172\r
+  +'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#186\r
+  +#186#186';'#184#184#184#246#228#228#228#255#253#253#253#255#251#236#213#255\r
+  +#253#210#151#255#253#251#247#255#217#217#217#255#183#183#183#255#171#171#171\r
+  +'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#182#182#182';'#180#180#180#246#226#226#226#255#253\r
+  +#253#253#255#253#253#253#255#217#217#217#255#182#182#182#255#171#171#171'!'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#178#178#178'8'#177#177\r
+  +#177#246#224#224#224#255#216#216#216#255#182#182#182#255#171#171#171'!'#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#175#175#175'8'#173#173#173#246#182#182#182#255#170#170#170'!'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#171#171#171'8'#170#170#170#30#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#213#213#213#255\r
+  +#212#212#212#255#210#210#210#255#209#209#209#255#208#208#208#255#206#206#206\r
+  +#255#205#205#205#255#203#203#203#21#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211\r
+  +#211#211#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255\r
+  +#253#253#253#255#228#228#228#255#205#205#205#255#200#200#200#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#210#210#210#255#253#253#253#255#226#226#226#255#206#206#206#255\r
+  +#224#224#224#255#253#253#253#255#253#253#253#255#226#226#226#255#203#203#203\r
+  +#255#196#196#196#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#208#208#208#255#253#253#253#255#205#205#205#255\r
+  +#255#255#255#0#202#202#202#205#243#243#243#255#251#251#251#255#253#253#253\r
+  +#255#224#224#224#255#199#199#199#255#192#192#192#21#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#206#206#206#255#253#253#253#255\r
+  +#224#224#224#255#202#202#202#249#200#200#200#226#247#247#247#255#227#239#233\r
+  +#255#175#211#193#255#253#253#253#255#222#222#222#255#195#195#195#255#189#189\r
+  +#189#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#205#205#205\r
+  +#255#253#253#253#255#253#253#253#255#252#252#252#255#247#247#247#255#230#241\r
+  +#235#255'p'#179#144#255'g'#174#137#255#174#211#192#255#253#253#253#255#220\r
+  +#220#220#255#192#192#192#255#185#185#185#21#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#203#203#203#246#235#235#235#255#253#253#253#255#250#250#250#255\r
+  +#227#238#232#255'o'#179#143#255'~'#187#155#255#131#190#159#255'p'#179#145#255\r
+  +#174#211#192#255#253#253#253#255#218#218#218#255#189#189#189#255#181#181#181\r
+  +#21#255#255#255#0#255#255#255#0#201#201#201'='#199#199#199#246#233#233#233\r
+  +#255#253#253#253#255#202#226#214#255'g'#175#138#255#128#188#157#255#136#192\r
+  +#163#255#132#190#160#255'p'#179#145#255#174#211#192#255#253#253#253#255#217\r
+  +#217#217#255#185#185#185#255#177#177#177#21#255#255#255#0#255#255#255#0#197\r
+  +#197#197';'#195#195#195#246#232#232#232#255#253#253#253#255#206#227#216#255\r
+  +'n'#177#142#255#129#188#158#255#136#192#163#255#132#190#160#255'n'#178#143\r
+  +#255#170#209#189#255#253#253#253#255#215#215#215#255#181#181#181#255#174#174\r
+  +#174#21#255#255#255#0#255#255#255#0#193#193#193';'#192#192#192#246#231#231\r
+  +#231#255#253#253#253#255#206#227#216#255'n'#177#142#255#129#188#158#255#134\r
+  +#191#161#255't'#182#148#255'u'#178#147#255#250#252#251#255#217#217#217#255\r
+  +#183#183#183#255#172#172#172#31#255#255#255#0#255#255#255#0#255#255#255#0#189\r
+  +#189#189';'#188#188#188#246#229#229#229#255#253#253#253#255#206#227#216#255\r
+  +'l'#176#141#255'r'#180#146#255#129#186#156#255#242#245#244#255#217#217#217\r
+  +#255#183#183#183#255#172#172#172'!'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#186#186#186';'#184#184#184#246#228#228#228#255\r
+  ,#253#253#253#255#205#226#215#255'\7f'#186#156#255#246#249#247#255#217#217#217\r
+  +#255#183#183#183#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#182#182#182';'#180\r
+  +#180#180#246#226#226#226#255#253#253#253#255#253#253#253#255#217#217#217#255\r
+  +#182#182#182#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#178#178#178'8'#177#177#177#246#224#224#224#255#216#216#216#255#182#182\r
+  +#182#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#175#175#175'8'#173#173#173#246#182#182#182#255#170\r
+  +#170#170'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#171#171#171'8'#170#170#170#30#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#213#213#213#255#212#212#212#255#210#210#210#255#209#209#209#255#208\r
+  +#208#208#255#206#206#206#255#205#205#205#255#203#203#203#21#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#211#211#211#255#253#253#253#255#253#253#253#255#253#253\r
+  +#253#255#253#253#253#255#253#253#253#255#228#228#228#255#205#205#205#255#200\r
+  +#200#200#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#210#210#210#255#253#253#253#255#226#226\r
+  +#226#255#206#206#206#255#224#224#224#255#253#253#253#255#253#253#253#255#226\r
+  +#226#226#255#203#203#203#255#196#196#196#21#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#208#208#208#255#253#253\r
+  +#253#255#205#205#205#255#255#255#255#0#202#202#202#205#243#243#243#255#251\r
+  +#251#251#255#253#253#253#255#224#224#224#255#199#199#199#255#192#192#192#21\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#206\r
+  +#206#206#255#253#253#253#255#224#224#224#255#202#202#202#249#200#200#200#226\r
+  +#247#247#247#255#230#239#251#255#184#213#251#255#253#253#253#255#222#222#222\r
+  +#255#195#195#195#255#189#189#189#21#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#205#205#205#255#253#253#253#255#253#253#253#255#252#252#252\r
+  +#255#247#247#247#255#233#241#253#255#129#183#252#255'y'#178#252#255#183#213\r
+  +#251#255#253#253#253#255#220#220#220#255#192#192#192#255#185#185#185#21#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#203#203#203#246#235#235#235#255#253\r
+  +#253#253#255#250#250#250#255#230#239#251#255'\7f'#182#252#255#141#190#253#255\r
+  +#146#193#253#255#129#183#253#255#183#213#251#255#253#253#253#255#218#218#218\r
+  +#255#189#189#189#255#181#181#181#21#255#255#255#0#255#255#255#0#201#201#201\r
+  +'='#199#199#199#246#233#233#233#255#253#253#253#255#208#227#250#255'y'#178\r
+  +#252#255#143#191#253#255#150#195#253#255#146#193#253#255#129#183#253#255#183\r
+  +#213#251#255#253#253#253#255#217#217#217#255#185#185#185#255#177#177#177#21\r
+  +#255#255#255#0#255#255#255#0#197#197#197';'#195#195#195#246#232#232#232#255\r
+  +#253#253#253#255#211#229#250#255'\7f'#181#251#255#144#191#253#255#150#195#253\r
+  +#255#146#193#253#255'\7f'#182#253#255#180#211#251#255#253#253#253#255#215#215\r
+  +#215#255#181#181#181#255#174#174#174#21#255#255#255#0#255#255#255#0#193#193\r
+  +#193';'#192#192#192#246#231#231#231#255#253#253#253#255#211#229#250#255'\7f'\r
+  +#181#251#255#144#191#253#255#148#194#253#255#133#185#253#255#133#181#245#255\r
+  +#251#252#253#255#217#217#217#255#183#183#183#255#172#172#172#31#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#189#189#189';'#188#188#188#246#229#229#229#255\r
+  +#253#253#253#255#211#229#250#255'}'#180#250#255#130#184#253#255#143#189#247\r
+  +#255#243#246#249#255#217#217#217#255#183#183#183#255#172#172#172'!'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#186#186#186';'\r
+  +#184#184#184#246#228#228#228#255#253#253#253#255#210#228#250#255#142#190#251\r
+  +#255#247#249#253#255#217#217#217#255#183#183#183#255#171#171#171'!'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#182#182#182';'#180#180#180#246#226#226#226#255#253#253#253#255\r
+  +#253#253#253#255#217#217#217#255#182#182#182#255#171#171#171'!'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#178#178#178'8'#177#177#177#246#224#224\r
+  +#224#255#216#216#216#255#182#182#182#255#171#171#171'!'#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#175#175#175'8'#173\r
+  +#173#173#246#182#182#182#255#170#170#170'!'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  ,#171#171#171'8'#170#170#170#30#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#213#213#213#255#212#212#212#255#210\r
+  +#210#210#255#209#209#209#255#208#208#208#255#206#206#206#255#205#205#205#255\r
+  +#203#203#203#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211#211#211#255#253#253\r
+  +#253#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255#228\r
+  +#228#228#255#205#205#205#255#200#200#200#21#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#210#210\r
+  +#210#255#253#253#253#255#226#226#226#255#206#206#206#255#224#224#224#255#253\r
+  +#253#253#255#253#253#253#255#226#226#226#255#203#203#203#255#196#196#196#21\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#208#208#208#255#253#253#253#255#205#205#205#255#255#255#255#0#202\r
+  +#202#202#205#243#243#243#255#251#251#251#255#253#253#253#255#224#224#224#255\r
+  +#199#199#199#255#192#192#192#21#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#206#206#206#255#253#253#253#255#224#224#224#255#202\r
+  +#202#202#249#200#200#200#226#247#247#247#255#248#235#249#255#240#201#244#255\r
+  +#253#253#253#255#222#222#222#255#195#195#195#255#189#189#189#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#205#205#205#255#253#253#253#255\r
+  +#253#253#253#255#252#252#252#255#247#247#247#255#249#237#251#255#231#158#238\r
+  +#255#231#153#237#255#240#200#244#255#253#253#253#255#220#220#220#255#192#192\r
+  +#192#255#185#185#185#21#255#255#255#0#255#255#255#0#255#255#255#0#203#203#203\r
+  +#246#235#235#235#255#253#253#253#255#250#250#250#255#248#235#249#255#231#157\r
+  +#238#255#234#168#240#255#235#172#240#255#232#159#238#255#240#200#244#255#253\r
+  +#253#253#255#218#218#218#255#189#189#189#255#181#181#181#21#255#255#255#0#255\r
+  +#255#255#0#201#201#201'='#199#199#199#246#233#233#233#255#253#253#253#255#243\r
+  +#218#246#255#231#153#237#255#235#170#240#255#236#175#241#255#235#172#241#255\r
+  +#232#159#238#255#240#200#244#255#253#253#253#255#217#217#217#255#185#185#185\r
+  +#255#177#177#177#21#255#255#255#0#255#255#255#0#197#197#197';'#195#195#195\r
+  +#246#232#232#232#255#253#253#253#255#244#221#246#255#231#156#236#255#235#170\r
+  +#240#255#236#175#241#255#235#172#241#255#232#157#238#255#240#197#243#255#253\r
+  +#253#253#255#215#215#215#255#181#181#181#255#174#174#174#21#255#255#255#0#255\r
+  +#255#255#0#193#193#193';'#192#192#192#246#231#231#231#255#253#253#253#255#244\r
+  +#221#246#255#231#156#236#255#235#170#240#255#236#173#241#255#233#162#239#255\r
+  +#227#160#232#255#253#251#253#255#217#217#217#255#183#183#183#255#172#172#172\r
+  +#31#255#255#255#0#255#255#255#0#255#255#255#0#189#189#189';'#188#188#188#246\r
+  +#229#229#229#255#253#253#253#255#244#221#246#255#230#155#236#255#232#160#238\r
+  +#255#230#169#235#255#248#244#248#255#217#217#217#255#183#183#183#255#172#172\r
+  +#172'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#186#186#186';'#184#184#184#246#228#228#228#255#253#253#253#255#244#220#246\r
+  +#255#233#169#238#255#252#248#252#255#217#217#217#255#183#183#183#255#171#171\r
+  +#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#182#182#182';'#180#180#180#246#226#226#226#255\r
+  +#253#253#253#255#253#253#253#255#217#217#217#255#182#182#182#255#171#171#171\r
+  +'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#178#178#178'8'#177#177\r
+  +#177#246#224#224#224#255#216#216#216#255#182#182#182#255#171#171#171'!'#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#175#175#175'8'#173#173#173#246#182#182#182#255#170#170#170'!'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#171#171#171'8'#170#170#170#30#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#213#213#213#255\r
+  +#212#212#212#255#210#210#210#255#209#209#209#255#208#208#208#255#206#206#206\r
+  +#255#205#205#205#255#203#203#203#21#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211\r
+  +#211#211#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255\r
+  +#253#253#253#255#228#228#228#255#205#205#205#255#200#200#200#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#210#210#210#255#253#253#253#255#226#226#226#255#206#206#206#255\r
+  +#224#224#224#255#253#253#253#255#253#253#253#255#226#226#226#255#203#203#203\r
+  +#255#196#196#196#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#208#208#208#255#253#253#253#255#205#205#205#255\r
+  +#255#255#255#0#202#202#202#205#243#243#243#255#251#251#251#255#253#253#253\r
+  ,#255#224#224#224#255#199#199#199#255#192#192#192#21#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#206#206#206#255#253#253#253#255\r
+  +#224#224#224#255#202#202#202#249#200#200#200#226#247#247#247#255#245#230#234\r
+  +#255#233#185#197#255#253#253#253#255#222#222#222#255#195#195#195#255#189#189\r
+  +#189#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#205#205#205\r
+  +#255#253#253#253#255#253#253#253#255#252#252#252#255#247#247#247#255#247#233\r
+  +#236#255#218#131#151#255#217'{'#145#255#233#184#196#255#253#253#253#255#220\r
+  +#220#220#255#192#192#192#255#185#185#185#21#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#203#203#203#246#235#235#235#255#253#253#253#255#250#250#250#255\r
+  +#245#230#234#255#218#130#150#255#222#143#162#255#224#148#166#255#219#131#152\r
+  +#255#233#184#196#255#253#253#253#255#218#218#218#255#189#189#189#255#181#181\r
+  +#181#21#255#255#255#0#255#255#255#0#201#201#201'='#199#199#199#246#233#233\r
+  +#233#255#253#253#253#255#239#209#216#255#217'{'#145#255#223#145#163#255#225\r
+  +#152#169#255#224#148#166#255#219#131#152#255#233#184#196#255#253#253#253#255\r
+  +#217#217#217#255#185#185#185#255#177#177#177#21#255#255#255#0#255#255#255#0\r
+  +#197#197#197';'#195#195#195#246#232#232#232#255#253#253#253#255#240#212#219\r
+  +#255#217#129#150#255#223#146#164#255#225#152#169#255#224#148#166#255#218#129\r
+  +#150#255#232#182#194#255#253#253#253#255#215#215#215#255#181#181#181#255#174\r
+  +#174#174#21#255#255#255#0#255#255#255#0#193#193#193';'#192#192#192#246#231\r
+  +#231#231#255#253#253#253#255#240#212#219#255#217#129#150#255#223#146#164#255\r
+  +#224#150#167#255#220#135#155#255#214#135#153#255#252#251#251#255#217#217#217\r
+  +#255#183#183#183#255#172#172#172#31#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#189#189#189';'#188#188#188#246#229#229#229#255#253#253#253#255#240#212#219\r
+  +#255#216#128#148#255#219#133#153#255#219#146#163#255#247#243#244#255#217#217\r
+  +#217#255#183#183#183#255#172#172#172'!'#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#186#186#186';'#184#184#184#246#228#228#228\r
+  +#255#253#253#253#255#239#211#218#255#221#144#162#255#251#247#248#255#217#217\r
+  +#217#255#183#183#183#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#182#182#182';'\r
+  +#180#180#180#246#226#226#226#255#253#253#253#255#253#253#253#255#217#217#217\r
+  +#255#182#182#182#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#178#178#178'8'#177#177#177#246#224#224#224#255#216#216#216#255#182\r
+  +#182#182#255#171#171#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#175#175#175'8'#173#173#173#246#182#182#182#255\r
+  +#170#170#170'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#171#171#171'8'#170#170#170\r
+  +#30#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#213#213#213#255#212#212#212#255#210#210#210#255#209#209#209#255\r
+  +#208#208#208#255#206#206#206#255#205#205#205#255#203#203#203#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#211#211#211#255#253#253#253#255#253#253#253#255#253\r
+  +#253#253#255#253#253#253#255#253#253#253#255#228#228#228#255#205#205#205#255\r
+  +#200#200#200#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#210#210#210#255#253#253#253#255#226\r
+  +#226#226#255#206#206#206#255#224#224#224#255#253#253#253#255#253#253#253#255\r
+  +#226#226#226#255#203#203#203#255#196#196#196#21#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#208#208#208#255#253\r
+  +#253#253#255#205#205#205#255#255#255#255#0#202#202#202#205#243#243#243#255\r
+  +#251#251#251#255#253#253#253#255#224#224#224#255#199#199#199#255#192#192#192\r
+  +#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#206\r
+  +#206#206#255#253#253#253#255#224#224#224#255#202#202#202#249#200#200#200#226\r
+  +#247#247#247#255#232#233#251#255#191#193#250#255#253#253#253#255#222#222#222\r
+  +#255#195#195#195#255#189#189#189#21#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#205#205#205#255#253#253#253#255#253#253#253#255#252#252#252\r
+  +#255#247#247#247#255#235#235#252#255#141#144#250#255#135#137#250#255#190#192\r
+  +#250#255#253#253#253#255#220#220#220#255#192#192#192#255#185#185#185#21#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#203#203#203#246#235#235#235#255#253\r
+  +#253#253#255#250#250#250#255#232#232#251#255#141#143#250#255#153#155#251#255\r
+  +#157#159#251#255#142#145#250#255#190#192#250#255#253#253#253#255#218#218#218\r
+  +#255#189#189#189#255#181#181#181#21#255#255#255#0#255#255#255#0#201#201#201\r
+  +'='#199#199#199#246#233#233#233#255#253#253#253#255#213#214#250#255#135#138\r
+  ,#250#255#155#157#251#255#161#163#251#255#158#160#251#255#142#145#250#255#190\r
+  +#192#250#255#253#253#253#255#217#217#217#255#185#185#185#255#177#177#177#21\r
+  +#255#255#255#0#255#255#255#0#197#197#197';'#195#195#195#246#232#232#232#255\r
+  +#253#253#253#255#216#216#250#255#140#142#249#255#155#158#251#255#161#163#251\r
+  +#255#158#160#251#255#140#143#250#255#188#189#250#255#253#253#253#255#215#215\r
+  +#215#255#181#181#181#255#174#174#174#21#255#255#255#0#255#255#255#0#193#193\r
+  +#193';'#192#192#192#246#231#231#231#255#253#253#253#255#216#216#250#255#140\r
+  +#142#249#255#155#158#251#255#159#161#251#255#146#148#250#255#145#147#243#255\r
+  +#251#251#253#255#217#217#217#255#183#183#183#255#172#172#172#31#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#189#189#189';'#188#188#188#246#229#229#229#255\r
+  +#253#253#253#255#216#216#250#255#138#141#249#255#143#146#250#255#154#156#245\r
+  +#255#243#244#249#255#217#217#217#255#183#183#183#255#172#172#172'!'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#186#186#186';'\r
+  +#184#184#184#246#228#228#228#255#253#253#253#255#214#215#250#255#154#156#249\r
+  +#255#247#247#253#255#217#217#217#255#183#183#183#255#171#171#171'!'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#182#182#182';'#180#180#180#246#226#226#226#255#253#253#253#255\r
+  +#253#253#253#255#217#217#217#255#182#182#182#255#171#171#171'!'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#178#178#178'8'#177#177#177#246#224#224\r
+  +#224#255#216#216#216#255#182#182#182#255#171#171#171'!'#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#175#175#175'8'#173\r
+  +#173#173#246#182#182#182#255#170#170#170'!'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#171#171#171'8'#170#170#170#30#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#213#213#213#255#212#212#212#255#210\r
+  +#210#210#255#209#209#209#255#208#208#208#255#206#206#206#255#205#205#205#255\r
+  +#203#203#203#21#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#211#211#211#255#253#253\r
+  +#253#255#253#253#253#255#253#253#253#255#253#253#253#255#253#253#253#255#228\r
+  +#228#228#255#205#205#205#255#200#200#200#21#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#210#210\r
+  +#210#255#253#253#253#255#226#226#226#255#206#206#206#255#224#224#224#255#253\r
+  +#253#253#255#253#253#253#255#226#226#226#255#203#203#203#255#196#196#196#21\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#208#208#208#255#253#253#253#255#205#205#205#255#255#255#255#0#202\r
+  +#202#202#205#243#243#243#255#251#251#251#255#253#253#253#255#224#224#224#255\r
+  +#199#199#199#255#192#192#192#21#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#206#206#206#255#253#253#253#255#224#224#224#255#202\r
+  +#202#202#249#200#200#200#226#247#247#247#255#230#246#250#255#185#234#248#255\r
+  +#253#253#253#255#222#222#222#255#195#195#195#255#189#189#189#21#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#205#205#205#255#253#253#253#255\r
+  +#253#253#253#255#252#252#252#255#247#247#247#255#233#248#252#255#131#220#245\r
+  +#255'{'#218#245#255#184#234#248#255#253#253#253#255#220#220#220#255#192#192\r
+  +#192#255#185#185#185#21#255#255#255#0#255#255#255#0#255#255#255#0#203#203#203\r
+  +#246#235#235#235#255#253#253#253#255#250#250#250#255#230#245#250#255#130#219\r
+  +#245#255#143#223#246#255#148#225#247#255#131#220#245#255#184#234#248#255#253\r
+  +#253#253#255#218#218#218#255#189#189#189#255#181#181#181#21#255#255#255#0#255\r
+  +#255#255#0#201#201#201'='#199#199#199#246#233#233#233#255#253#253#253#255#209\r
+  +#239#248#255'{'#218#244#255#145#224#246#255#152#226#247#255#148#225#247#255\r
+  +#131#220#245#255#184#234#248#255#253#253#253#255#217#217#217#255#185#185#185\r
+  +#255#177#177#177#21#255#255#255#0#255#255#255#0#197#197#197';'#195#195#195\r
+  +#246#232#232#232#255#253#253#253#255#212#240#248#255#129#218#244#255#146#224\r
+  +#247#255#152#226#247#255#148#225#247#255#129#220#245#255#182#233#247#255#253\r
+  +#253#253#255#215#215#215#255#181#181#181#255#174#174#174#21#255#255#255#0#255\r
+  +#255#255#0#193#193#193';'#192#192#192#246#231#231#231#255#253#253#253#255#212\r
+  +#240#248#255#129#218#244#255#146#224#247#255#150#225#247#255#135#221#246#255\r
+  +#135#216#239#255#251#252#253#255#217#217#217#255#183#183#183#255#172#172#172\r
+  +#31#255#255#255#0#255#255#255#0#255#255#255#0#189#189#189';'#188#188#188#246\r
+  +#229#229#229#255#253#253#253#255#212#240#248#255#128#218#244#255#133#221#245\r
+  +#255#146#220#242#255#243#247#249#255#217#217#217#255#183#183#183#255#172#172\r
+  +#172'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  ,#186#186#186';'#184#184#184#246#228#228#228#255#253#253#253#255#211#240#248\r
+  +#255#144#223#244#255#247#251#253#255#217#217#217#255#183#183#183#255#171#171\r
+  +#171'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#182#182#182';'#180#180#180#246#226#226#226#255\r
+  +#253#253#253#255#253#253#253#255#217#217#217#255#182#182#182#255#171#171#171\r
+  +'!'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#178#178#178'8'#177#177\r
+  +#177#246#224#224#224#255#216#216#216#255#182#182#182#255#171#171#171'!'#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#175#175#175'8'#173#173#173#246#182#182#182#255#170#170#170'!'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#171#171#171'8'#170#170#170#30#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#5'TuLan'#5'uL'\r
+  +'an1'#12'OSDeviceName'#6#10'\\.\UL_DRV'#4'left'#3#136#0#3'top'#3#0#1#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/mainform.pas b/ulan/host/apps/uloi_browser/mainform.pas
new file mode 100644 (file)
index 0000000..2e4abaa
--- /dev/null
@@ -0,0 +1,603 @@
+unit mainform;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,\r
+  ExtCtrls, Menus, ComCtrls, Buttons, StdCtrls, SpkRollPanel, ulan, Grids,\r
+  sortlist{$IFDEF Win32}, Windows{$ENDIF}, xmlcfg;\r
+\r
+type\r
+\r
+  tuoi_prop = record\r
+    number:integer;\r
+    fread:boolean;\r
+    fwrite:boolean;\r
+    name:string;\r
+    value:string;\r
+    value_to_set:string;\r
+    typ:string;\r
+  end;\r
+  puoi_prop = ^tuoi_prop;\r
+\r
+  tumod = record\r
+    address:integer;\r
+    sn:integer;\r
+    idname:string;\r
+    iddes:string;\r
+    mt:string;\r
+    uoi_prop_tree:TSortList;\r
+  end;\r
+  ptumod = ^tumod;\r
+\r
+\r
+  { Tfmainform }\r
+\r
+  Tfmainform = class(TForm)\r
+    iddes: TLabel;\r
+    idname: TLabel;\r
+    ImageList2: TImageList;\r
+    Label2: TLabel;\r
+    Label4: TLabel;\r
+    Label6: TLabel;\r
+    MainMenu1: TMainMenu;\r
+    MenuItem1: TMenuItem;\r
+    MenuItem2: TMenuItem;\r
+    MenuItem3: TMenuItem;\r
+    MenuItem4: TMenuItem;\r
+    MenuItem5: TMenuItem;\r
+    MenuItem8: TMenuItem;\r
+    MenuItem9: TMenuItem;\r
+    modaddr: TLabel;\r
+    Page: TSpkRollPanel;\r
+    Page1: TSpkRollPanel;\r
+    Panel1: TPanel;\r
+    Panel3: TPanel;\r
+    Panel4: TPanel;\r
+    SBReset: TSpeedButton;\r
+    Shape3: TShape;\r
+    Shape4: TShape;\r
+    Shape5: TShape;\r
+    SBSetNewAddress: TSpeedButton;\r
+    SpeedButton7: TSpeedButton;\r
+    SpeedButton8: TSpeedButton;\r
+    SpeedButton9: TSpeedButton;\r
+    Splitter1: TSplitter;\r
+    SGProp: TStringGrid;\r
+    StatusBar: TStatusBar;\r
+    ToolBar1: TToolBar;\r
+    ToolBar2: TToolBar;\r
+    ToolBar3: TToolBar;\r
+    tvunits: TTreeView;\r
+    uLan1: TuLan;\r
+    procedure FormActivate(Sender: TObject);\r
+    procedure FormCreate(Sender: TObject);\r
+    procedure FormDestroy(Sender: TObject);\r
+    procedure MenuItem2Click(Sender: TObject);\r
+    procedure MenuItem4Click(Sender: TObject);\r
+    function  oi_var_oiddes_add(tree:TSortList;oid:integer;despack:pbyte):puoi_prop;\r
+    procedure oi_var_oidval_get(coninfo:puloi_coninfo_t;uoi_prop:puoi_prop);\r
+    procedure oi_var_oidval_set(coninfo:puloi_coninfo_t;uoi_prop:puoi_prop);\r
+    procedure SBResetClick(Sender: TObject);\r
+    procedure SGPropSetOID(Sender: TObject);\r
+    procedure SBSetNewAddressClick(Sender: TObject);\r
+    procedure PreferenciesClick(Sender: TObject);\r
+    procedure tvunitsCompare(Sender: TObject; Node1, Node2: TTreeNode;\r
+      var Compare: Integer);\r
+    procedure tvunitsChange(Sender: TObject; Node: TTreeNode);\r
+    procedure UnitOIPropertiesAdd(tree:TSortList;u:integer);\r
+    procedure Autodetection(Sender: TObject);\r
+    procedure SGPropCreate(tree:TSortList);\r
+    function mt2ImageIndex(mt:String):Integer;\r
+    procedure tvunitsDisposeData;\r
+  private\r
+    { private declarations }\r
+    uerror:boolean;\r
+    ustart,ustop:integer;\r
+    ustartup_autodetection:boolean;\r
+    startup:boolean;\r
+    XMLConfig: TXMLConfig;\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fmainform: Tfmainform;\r
+\r
+implementation\r
+\r
+uses ul_drvdef, sd_info_process, prop_settings, sd_error, prop_set_new_address,\r
+     fAbout, sd_confirm, preferences;\r
+\r
+//*********************************************\r
+function sort_uoi_prop_number(i1,i2: Pointer): integer;\r
+var d1,d2: puoi_prop;\r
+begin\r
+  d1:=i1; d2:=i2;\r
+  if d1^.number < d2^.number then Result:=-1\r
+  else\r
+    if d1^.number > d2^.number then Result:=1\r
+    else\r
+      Result:=0;\r
+end;\r
+\r
+\r
+{ Tfmainform }\r
+\r
+function Tfmainform.oi_var_oiddes_add(tree:TSortList;oid:integer;despack:pbyte):puoi_prop;\r
+var\r
+  desname:pchar;\r
+  destype:pchar;\r
+  uoi_prop:puoi_prop;\r
+  suoi_prop:tuoi_prop;\r
+  i:integer;\r
+begin\r
+  Result:=nil;\r
+  desname:=uloi_oiddespack_strdup(despack,0);\r
+  destype:=uloi_oiddespack_strdup(despack,1);\r
+  if (desname<>nil) then begin\r
+    suoi_prop.number:=oid;\r
+    i:=tree.Search(@suoi_prop);\r
+    if i=-1 then begin\r
+      uoi_prop:=new(puoi_prop);\r
+      uoi_prop^.number:=oid;\r
+      uoi_prop^.name:=desname;\r
+      uoi_prop^.typ:=destype;\r
+      tree.AddSort(uoi_prop);\r
+    end else begin\r
+      uoi_prop:=tree.Items[i];\r
+    end;\r
+    Result:=uoi_prop;\r
+  end;\r
+  uloi_cfree(desname);\r
+  uloi_cfree(destype);\r
+end;\r
+\r
+procedure Tfmainform.oi_var_oidval_get(coninfo:puloi_coninfo_t;uoi_prop:puoi_prop);\r
+var ret:integer;\r
+    buf:array [0..1] of byte;\r
+begin\r
+  if uoi_prop^.typ='u2' then begin\r
+    ret:=uloi_get_var(coninfo,uoi_prop^.number,@buf,2);\r
+    if ret<0 then exit;\r
+    uoi_prop^.value:=inttostr(buf[0]+buf[1]*$100);\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.oi_var_oidval_set(coninfo:puloi_coninfo_t;uoi_prop:puoi_prop);\r
+var ret:integer;\r
+    buf:array [0..1] of byte;\r
+begin\r
+  if uoi_prop^.typ='u2' then begin\r
+    try\r
+      ret:=strtoint(uoi_prop^.value_to_set);\r
+      buf[0]:=ret mod 256;\r
+      buf[1]:=ret div 256;\r
+    except\r
+      exit;\r
+    end;\r
+    ret:=uloi_set_var(coninfo,uoi_prop^.number,@buf,2);\r
+    if ret<0 then exit;\r
+    uoi_prop^.value:=uoi_prop^.value_to_set;\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.SBResetClick(Sender: TObject);\r
+var\r
+  pumod:ptumod;\r
+  r:ttreenode;\r
+  buf_out:array [0..10] of byte;\r
+  ret:integer;\r
+begin\r
+  r:=tvunits.Selected;\r
+  if r=nil then exit;\r
+  while true do begin\r
+    if (r.Parent<>nil) then r:=r.Parent\r
+    else break;\r
+  end;\r
+  pumod:=r.Data;\r
+  if pumod=nil then exit;\r
+  fsd_confirm.LText.Caption:='Do you want to make module '+inttostr(pumod^.address)+' reset?';\r
+  if fsd_confirm.ShowModal=mrOk then begin\r
+    buf_out[0]:=ULRES_CPU;\r
+    buf_out[1]:=$55;\r
+    buf_out[2]:=$aa;\r
+    ret:=uLan1.CommandSendWait(pumod^.address,UL_CMD_RES,UL_BFL_ARQ or UL_BFL_PRQ,@buf_out,3);\r
+    if ret<0 then\r
+      MessageDlg('Module '+inttostr(pumod^.address)+' reset ERROR',mtError,[mbOk],-1)\r
+    else\r
+      MessageDlg('Module '+inttostr(pumod^.address)+' reset OK',mtInformation,[mbOk],-1);\r
+  end;\r
+end;\r
+\r
+\r
+procedure Tfmainform.UnitOIPropertiesAdd(tree:TSortList;u:integer);\r
+var coninfo:puloi_coninfo_t;\r
+    i,ret:integer;\r
+    oids:plongint;\r
+    despack:pbyte;\r
+    uoi_prop:puoi_prop;\r
+begin\r
+  coninfo:=uloi_open(pchar(string(uLan1.OSDeviceName)),u,$10,0,10);\r
+  if coninfo=nil then begin\r
+    writeln('error open coninfo');\r
+    exit;\r
+  end;\r
+  { set vars }\r
+  ret:=uloi_get_oids(coninfo,ULOI_QOII,@oids);\r
+  if(ret<0) then exit;\r
+  for i:=0 to ret-1 do begin\r
+    despack:=nil;\r
+    if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],@despack)>=0) then begin\r
+      uoi_prop:=oi_var_oiddes_add(tree,oids[i],despack);\r
+      if uoi_prop<>nil then begin\r
+        uoi_prop^.fwrite:=true;\r
+      end;\r
+      uloi_cfree(despack);\r
+    end;\r
+  end;\r
+  uloi_cfree(oids);\r
+  { get vars }\r
+  ret:=uloi_get_oids(coninfo,ULOI_QOIO,@oids);\r
+  if(ret<0) then exit;\r
+  for i:=0 to ret-1 do begin\r
+    despack:=nil;\r
+    if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],@despack)>=0) then begin\r
+      uoi_prop:=oi_var_oiddes_add(tree,oids[i],despack);\r
+      if uoi_prop<>nil then begin\r
+         oi_var_oidval_get(coninfo,uoi_prop);\r
+         uoi_prop^.fread:=true;\r
+      end;\r
+      uloi_cfree(despack);\r
+    end;\r
+  end;\r
+  uloi_cfree(oids);\r
+  uloi_close(coninfo);\r
+end;\r
+\r
+function Tfmainform.mt2ImageIndex(mt:String):Integer;\r
+begin\r
+  Result:=0;\r
+  if mt='rja2000m30' then Result:=1;\r
+  if mt='blinder-hisc' then Result:=2;\r
+end;\r
+\r
+procedure Tfmainform.tvunitsDisposeData;\r
+var\r
+  i: integer;\r
+  Item: TTreeNode;\r
+  pumod:ptumod;\r
+  uoi_prop_tree:TSortList;\r
+  uoi_prop:^tuoi_prop;\r
+begin\r
+  if tvunits.Items.Count = 0 then exit;\r
+  for i:=0 to tvunits.Items.Count-1 do begin\r
+    Item:=tvunits.Items.Item[i];\r
+    pumod:=Item.Data;\r
+    try\r
+      if pumod <> nil then begin\r
+        uoi_prop_tree:=pumod^.uoi_prop_tree;\r
+        while true do begin\r
+          uoi_prop:=uoi_prop_tree.First;\r
+          if uoi_prop=nil then break;\r
+          uoi_prop_tree.Delete(0);\r
+          Dispose(uoi_prop)\r
+        end;\r
+        uoi_prop_tree.Free;\r
+        Dispose(pumod);\r
+      end;\r
+      Item.Data:=nil;\r
+    except\r
+    end;\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.Autodetection(Sender: TObject);\r
+var ur,cr:ttreenode;\r
+    ii,i,buf_len,pb,pe:integer;\r
+    buf:array[0..256] of char;\r
+    pbuf:pchar;\r
+    mt:string;\r
+    pumod:ptumod;\r
+    ifrm:Tfsd_info_process;\r
+begin\r
+  pbuf:=@buf;\r
+  SGProp.RowCount:=1;\r
+  ifrm:=Tfsd_info_process.Create(self);\r
+  ifrm.uSetText('Autodetection');\r
+  application.ProcessMessages;\r
+  tvunitsDisposeData;\r
+  tvunits.Items.Clear;\r
+  modaddr.Caption:='';\r
+  idname.Caption:='';\r
+  iddes.Caption:='';\r
+  ifrm.uShow(ustart,ustop);\r
+  try\r
+    for i := ustart to ustop do begin\r
+      buf_len:=sizeof(buf);\r
+      FillChar(buf, SizeOf(buf), 0);                                                     //max input buffer size\r
+      if( uLan1.QuerySendWait(i, UL_CMD_SID, UL_BFL_NORE or UL_BFL_PRQ, nil, 0, pbuf, buf_len) > 0 ) then begin\r
+        pb:=pos('.mt ',pbuf);\r
+        mt:='';\r
+        if pb<>0 then begin\r
+          pb:=pb+4;\r
+          pe:=pos(' ',pbuf+pb);\r
+          if (pe<>0) then begin\r
+            mt:=copy(pbuf,pb,pe);\r
+          end;\r
+        end;\r
+        ii:=mt2ImageIndex(mt);\r
+        ur:=tvunits.Items.AddChild(nil,inttostr(i)+', '+mt);\r
+        ur.ImageIndex:=ii;\r
+        ur.SelectedIndex:=ii;\r
+        pumod:=New(ptumod);\r
+        pumod^.address:=i;\r
+        pumod^.idname:=buf;\r
+        pumod^.mt:=mt;\r
+        pumod^.iddes:='';\r
+        pumod^.sn:=0;\r
+        pumod^.uoi_prop_tree:=TSortList.Create;\r
+        pumod^.uoi_prop_tree.Compare:=@sort_uoi_prop_number;\r
+        ur.Data:=pumod;\r
+        cr:=tvunits.Items.AddChild(ur,buf);\r
+        cr.ImageIndex:=-1;\r
+        cr.SelectedIndex:=-1;\r
+        UnitOIPropertiesAdd(pumod^.uoi_prop_tree,i);\r
+      end;\r
+      ifrm.uSetPosition(i);\r
+      application.ProcessMessages;\r
+    end;\r
+  finally\r
+    ifrm.uHide;\r
+    ifrm.Free;\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.SGPropSetOID(Sender: TObject);\r
+var uoi_prop:puoi_prop;\r
+  pumod:ptumod;\r
+  r:ttreenode;\r
+  coninfo:puloi_coninfo_t;\r
+begin\r
+  if SGProp.Row<1 then exit;\r
+  r:=tvunits.Selected;\r
+  if r=nil then exit;\r
+  while true do begin\r
+    if (r.Parent<>nil) then r:=r.Parent\r
+    else break;\r
+  end;\r
+  pumod:=r.Data;\r
+  if pumod=nil then exit;\r
+  uoi_prop:=pumod^.uoi_prop_tree[SGProp.Row-1];\r
+  fprop_settings.LNumber.Caption:=inttostr(uoi_prop^.number);\r
+  fprop_settings.LName.Caption:=uoi_prop^.name;\r
+  fprop_settings.EValue.Text:=uoi_prop^.value;\r
+  if not uoi_prop^.fwrite then begin\r
+    fsd_error.LText.Caption:='The property '''+uoi_prop^.name+''' hasn''t write access!';\r
+    fsd_error.ShowModal;\r
+    exit;\r
+  end;\r
+  if fprop_settings.ShowModal=mrOK then begin\r
+    coninfo:=uloi_open(pchar(string(uLan1.OSDeviceName)),pumod^.address,$10,0,10);\r
+    if coninfo=nil then begin\r
+      writeln('error open coninfo');\r
+      exit;\r
+    end;\r
+    uoi_prop^.value_to_set:=fprop_settings.EValue.Text;\r
+    oi_var_oidval_set(coninfo,uoi_prop);\r
+    if uoi_prop^.fread then\r
+      SGProp.Cells[3,SGProp.Row]:=uoi_prop^.value;\r
+    uloi_close(coninfo);\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.SBSetNewAddressClick(Sender: TObject);\r
+var\r
+  pumod:ptumod;\r
+  r:ttreenode;\r
+  buf_out:array [0..10] of byte;\r
+  module_sn,new_addr:integer;\r
+begin\r
+  r:=tvunits.Selected;\r
+  if r=nil then exit;\r
+  while true do begin\r
+    if (r.Parent<>nil) then r:=r.Parent\r
+    else break;\r
+  end;\r
+  pumod:=r.Data;\r
+  if pumod=nil then exit;\r
+  fprop_set_new_address.LAddress.Caption:=inttostr(pumod^.address);\r
+  fprop_set_new_address.ESN.Text:=inttostr(pumod^.sn);\r
+  fprop_set_new_address.ENAddress.Text:='';\r
+  if fprop_set_new_address.ShowModal=mrOK then begin\r
+    module_sn:=strtointdef(fprop_set_new_address.ESN.Text,0);\r
+    new_addr:=strtointdef(fprop_set_new_address.ENAddress.Text,0);\r
+    if (new_addr<1) or (new_addr>63) then exit;\r
+    buf_out[0]:=ULNCS_SET_ADDR;        { SN0 SN1 SN2 SN3 NEW_ADR }\r
+    buf_out[1]:=module_sn>>0;\r
+    buf_out[2]:=module_sn>>8;\r
+    buf_out[3]:=module_sn>>16;\r
+    buf_out[4]:=module_sn>>24;\r
+    buf_out[5]:=new_addr;\r
+    uLan1.CommandSend(pumod^.address,UL_CMD_NCS,UL_BFL_ARQ,@buf_out,6);\r
+    if fprop_set_new_address.CBSave.Checked then begin\r
+      buf_out[0]:=ULNCS_ADDR_NVSV;\r
+      buf_out[1]:=module_sn>>0;\r
+      buf_out[2]:=module_sn>>8;\r
+      buf_out[3]:=module_sn>>16;\r
+      buf_out[4]:=module_sn>>24;\r
+      uLan1.CommandSend(new_addr,UL_CMD_NCS,UL_BFL_ARQ,@buf_out,5);\r
+    end;\r
+    pumod^.address:=new_addr;\r
+    r.Text:=inttostr(new_addr)+', '+pumod^.mt;\r
+    tvunits.SortType:=stNone;\r
+    tvunits.SortType:=stData;\r
+    r.Expanded:=True;\r
+    r.Expanded:=False;\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.PreferenciesClick(Sender: TObject);\r
+begin\r
+  fpreferences.EOSDriverName.Text:=ulan1.OSDeviceName;\r
+  fpreferences.EFirstUnit.Text:=inttostr(ustart);\r
+  fpreferences.ELastUnit.Text:=inttostr(ustop);\r
+  fpreferences.CBAutodetection.Checked:=ustartup_autodetection;\r
+  if fpreferences.ShowModal=mrOK then begin\r
+{$IFDEF Win32}\r
+    XMLConfig.SetValue('settings/OSDeviceNameWindows',fpreferences.EOSDriverName.Text);\r
+{$ENDIF}\r
+{$IFDEF UNIX}\r
+    XMLConfig.SetValue('settings/OSDeviceNameLinux',fpreferences.EOSDriverName.Text);\r
+{$ENDIF}\r
+    ustart:=strtointdef(fpreferences.EFirstUnit.Text,1);\r
+    XMLConfig.SetValue('settings/first_unit',ustart);\r
+    ustop:=strtointdef(fpreferences.ELastUnit.Text,63);\r
+    XMLConfig.SetValue('settings/last_unit',ustop);\r
+    XMLConfig.SetValue('settings/startup_autodetection',fpreferences.CBAutodetection.Checked);\r
+    XMLConfig.Flush;\r
+  end\r
+end;\r
+\r
+procedure Tfmainform.tvunitsCompare(Sender: TObject; Node1, Node2: TTreeNode;\r
+  var Compare: Integer);\r
+var pumod1,pumod2:ptumod;\r
+begin\r
+  Compare:=0;\r
+  pumod1:=ptumod(Node1.Data);\r
+  pumod2:=ptumod(Node2.Data);\r
+  if (pumod1=nil) or (pumod2=nil) then exit;\r
+  if pumod1^.address < pumod2^.address then Compare:=-1\r
+    else\r
+      if pumod1^.address > pumod2^.address then Compare:=1\r
+      else\r
+        Compare:=0;\r
+end;\r
+\r
+\r
+procedure Tfmainform.SGPropCreate(tree:TSortList);\r
+var i:integer;\r
+ uoi_prop:puoi_prop;\r
+ s:string;\r
+begin\r
+  SGProp.RowCount:=1;\r
+  for i:=0 to tree.Count-1 do begin\r
+    uoi_prop:=tree.Items[i];\r
+    SGProp.RowCount:=SGProp.RowCount+1;\r
+    s:='';\r
+    if uoi_prop^.fread then s:='R';\r
+    if uoi_prop^.fwrite then s:=s+'W';\r
+    SGProp.Cells[0,SGProp.RowCount-1]:=inttostr(uoi_prop^.number);\r
+    SGProp.Cells[1,SGProp.RowCount-1]:=s;\r
+    SGProp.Cells[2,SGProp.RowCount-1]:=uoi_prop^.name;\r
+    SGProp.Cells[3,SGProp.RowCount-1]:=uoi_prop^.value;\r
+  end;\r
+end;\r
+\r
+procedure Tfmainform.tvunitsChange(Sender: TObject; Node: TTreeNode);\r
+var pumod:ptumod;\r
+begin\r
+  if node=nil then exit;\r
+  while true do begin\r
+    if (node.Parent<>nil) then node:=node.Parent\r
+    else break;\r
+  end;\r
+  pumod:=node.Data;\r
+  if pumod=nil then exit;\r
+  modaddr.caption:=inttostr(pumod^.address);\r
+  idname.Caption:=pumod^.idname;\r
+  iddes.Caption:=pumod^.iddes;\r
+  SGPropCreate(pumod^.uoi_prop_tree);\r
+end;\r
+\r
+\r
+procedure Tfmainform.FormCreate(Sender: TObject);\r
+var FData:string;\r
+    SizeVer:Integer;\r
+    dwHandle: DWord;\r
+    FVer: Pointer;\r
+{$IFDEF Win32}\r
+    SBSize: UInt;\r
+    FileInfo: PVSFixedFileInfo;\r
+{$ENDIF}\r
+begin\r
+{$IFDEF Win32}\r
+  { cti verzi }\r
+  SizeVer := GetFileVersionInfoSize(PChar(Application.exename), dwHandle);\r
+  if SizeVer > 0 then begin\r
+    SetLength(FData, SizeVer);\r
+    try\r
+      if GetFileVersionInfo(PChar(Application.exename), dwHandle, SizeVer, PChar(FData)) then\r
+        if VerQueryValue(PChar(FData), '\', FVer, SBSize) then begin\r
+            FileInfo := PVSFixedFileInfo(FVer);\r
+            StatusBar.Panels.Items[1].Text :=\r
+                            IntToStr(HIWORD(FileInfo^.dwFileVersionMS)) + '.' +\r
+                            IntToStr(LOWORD(FileInfo^.dwFileVersionMS)) + '.' +\r
+                            IntToStr(HIWORD(FileInfo^.dwFileVersionLS)) + '.' +\r
+                            IntToStr(LOWORD(FileInfo^.dwFileVersionLS));\r
+                            IntToStr(LOWORD(FileInfo^.dwProductVersionLS));\r
+        end;\r
+    finally\r
+    end;\r
+  end;\r
+{$ENDIF}\r
+  XMLConfig:=TXMLConfig.Create(Self);\r
+  XMLConfig.Filename:=ChangeFileExt(Application.exename,'.xml');\r
+  {defautl values}\r
+  ulan1.OSDeviceName:=UL_DEV_NAME;\r
+  ustart:=1;\r
+  ustop:=63;\r
+  ustartup_autodetection:=true;\r
+  {load config}\r
+{$IFDEF Win32}\r
+  ulan1.OSDeviceName:=XMLConfig.GetValue('settings/OSDeviceNameWindows',ulan1.OSDeviceName);\r
+{$ENDIF}\r
+{$IFDEF UNIX}\r
+  ulan1.OSDeviceName:=XMLConfig.GetValue('settings/OSDeviceNameLinux',ulan1.OSDeviceName);\r
+{$ENDIF}\r
+  ustart:=XMLConfig.GetValue('settings/first_unit',ustart);\r
+  ustop:=XMLConfig.GetValue('settings/last_unit',ustop);\r
+  ustartup_autodetection:=XMLConfig.GetValue('settings/startup_autodetection',ustartup_autodetection);\r
+  ulan1.Active:=True;\r
+  if not ulan1.GetActive then begin\r
+    MessageDlg('Error during opening of ulan driver.',mtError,[mbOk],-1);\r
+    uerror:=True;\r
+  end;\r
+  startup:=True;\r
+end;\r
+\r
+procedure Tfmainform.FormDestroy(Sender: TObject);\r
+begin\r
+  tvunitsDisposeData;\r
+  XMLConfig.Free;\r
+end;\r
+\r
+procedure Tfmainform.MenuItem2Click(Sender: TObject);\r
+begin\r
+  close;\r
+end;\r
+\r
+procedure Tfmainform.MenuItem4Click(Sender: TObject);\r
+begin\r
+  ShowAboutBox(StatusBar.Panels.Items[1].Text);\r
+end;\r
+\r
+procedure Tfmainform.FormActivate(Sender: TObject);\r
+begin\r
+  if uerror then begin\r
+    close;\r
+    exit;\r
+  end;\r
+  if startup and ustartup_autodetection then begin\r
+    startup:=False;\r
+    Autodetection(Sender);\r
+  end;\r
+end;\r
+\r
+initialization\r
+  {$I mainform.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/manifest.rc b/ulan/host/apps/uloi_browser/manifest.rc
new file mode 100644 (file)
index 0000000..3ad4d1a
--- /dev/null
@@ -0,0 +1,25 @@
+#define RT_MANIFEST  24\r
+#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1\r
+#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2\r
+#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3\r
+\r
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST MOVEABLE PURE\r
+{\r
+ "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"\r
+ "<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">"\r
+ "<assemblyIdentity version=""1.0.0.0"" processorArchitecture=""*"" name=""CompanyName.ProductName.YourApp"" type=""win32""/>"\r
+ "<description>Your application description here.</description>"\r
+ "<dependency>"\r
+ "<dependentAssembly>"\r
+ "<assemblyIdentity type=""win32"" name=""Microsoft.Windows.Common-Controls"" version=""6.0.0.0"" processorArchitecture=""*"" publicKeyToken=""6595b64144ccf1df"" language=""*""/>"\r
+ "</dependentAssembly>"\r
+ "</dependency>"\r
+ "<trustInfo xmlns=""urn:schemas-microsoft-com:asm.v3"">"\r
+ "<security>"\r
+ "<requestedPrivileges>"\r
+ "<requestedExecutionLevel level=""asInvoker"" uiAccess=""false""/>"\r
+ "</requestedPrivileges>"\r
+ "</security>"\r
+ "</trustInfo>"\r
+ "</assembly>"\r
+}
\ No newline at end of file
diff --git a/ulan/host/apps/uloi_browser/manifest.res b/ulan/host/apps/uloi_browser/manifest.res
new file mode 100644 (file)
index 0000000..82d429d
Binary files /dev/null and b/ulan/host/apps/uloi_browser/manifest.res differ
diff --git a/ulan/host/apps/uloi_browser/preferences.lfm b/ulan/host/apps/uloi_browser/preferences.lfm
new file mode 100644 (file)
index 0000000..eb9a913
--- /dev/null
@@ -0,0 +1,180 @@
+object fpreferences: Tfpreferences\r
+  Left = 390\r
+  Height = 439\r
+  Top = 190\r
+  Width = 459\r
+  HorzScrollBar.Page = 458\r
+  VertScrollBar.Page = 438\r
+  ActiveControl = EOSDriverName\r
+  BorderIcons = [biSystemMenu]\r
+  BorderStyle = bsSingle\r
+  Caption = 'Preferences'\r
+  ClientHeight = 439\r
+  ClientWidth = 459\r
+  Position = poMainFormCenter\r
+  object SpeedButton2: TSpeedButton\r
+    Left = 288\r
+    Height = 26\r
+    Top = 408\r
+    Width = 80\r
+    Caption = 'Cancel'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF003F3DED413B38EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00211FE3081E1CE241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004A47F0414F4CF2FF403EEDFD3C39EB08FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF002725E5082422E4FC312FEAFF1F1DE241FFFFFF00FFFFFF00FFFFFF005451\r
+      F3415856F5FF6361FAFF5855F6FF413FEDFC3D3AEC08FFFFFF00FFFFFF00302D\r
+      E7082C2AE6FC413FF1FF4C4AF6FF312FEAFF1F1DE241FFFFFF00FFFFFF005956\r
+      F52B5B58F6FF6562FAFF7170FFFF5956F6FF4240EEFC3E3BEC083937EB083532\r
+      E9FC4745F2FF6362FFFF4A48F4FF2F2DE9FF2220E32BFFFFFF00FFFFFF00FFFF\r
+      FF005A57F52B5B59F6FF6663FAFF7471FFFF5A58F6FF4341EEFC3E3CECFD504D\r
+      F4FF6867FFFF504EF5FF3634EBFF2A27E52BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF005B58F62B5C5AF6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6C\r
+      FFFF5755F7FF3F3DEEFF3230E82BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF005C59F62B5D5BF7FF7976FFFF5956FFFF5754FFFF7270\r
+      FFFF4846F0FF3C39EB2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00615EF8085D5AF6FD7D79FFFF5E5BFFFF5B58FFFF7674\r
+      FFFF4643EFFD413FED08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF006967FB086663F9FC706DFBFF807EFFFF7E7BFFFF7C79FFFF7977\r
+      FFFF5E5CF7FF4744EFFC4240EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00716EFD086E6BFCFC7774FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6A\r
+      FAFF7B79FFFF605DF7FF4845EFFC4341EE08FFFFFF00FFFFFF00FFFFFF007673\r
+      FF087471FEFD7D7AFEFF8A87FFFF7C79FDFF6C69FBFF6361F92B5F5CF72B615E\r
+      F8FF6E6CFAFF7D7AFFFF615FF7FF4946F0FC4441EE05FFFFFF00FFFFFF007774\r
+      FF1F7A77FFFF817EFFFF817EFEFF7471FDFF6C69FB2BFFFFFF00FFFFFF00605D\r
+      F72B625FF8FF6F6DFBFF7E7CFFFF625FF8FF4A47F06F4542EE02FFFFFF00FFFF\r
+      FF007774FF1F7A77FFFF7976FEFF726FFD2BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00615EF82B6461F8FF6A68F9FF5451F3A84F4DF229FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF007774FF1F7774FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00625FF82B5D5BF76F5956F53EFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF006360F80AFFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton2Click\r
+  end\r
+  object SpeedButton1: TSpeedButton\r
+    Left = 376\r
+    Height = 26\r
+    Top = 408\r
+    Width = 72\r
+    Caption = 'OK'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00317A360A2D753207FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF003985400A37833DFF317B37FB2E763307FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004292490A408E47FF54A35CFF4F9F57FF327C38FE2E773408FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004B9E530A499A51FF5BAC64FF77CA82FF74C87EFF51A059FF337D39FE2F78\r
+      3508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0053A9\r
+      5C0A51A65AFF63B56DFF7ECE89FF7BCC87FF76CA81FF76C981FF52A25AFF347E\r
+      3AFE30793508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AB4650959B0\r
+      63FF6BBD76FF84D290FF7AC985FF60B26AFF63B46DFF78C983FF78CB82FF53A3\r
+      5CFF347F3AFD317A3608FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB969465BB5\r
+      66E479C986FF80CE8DFF51A65AFC4DA1566F499C518B5CAD67FF7CCC86FF79CB\r
+      85FF54A45DFF35803BFC317B3708FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBA\r
+      6A3C5CB666E66DC079FF55AC5F6FFFFFFF00FFFFFF004A9D52915EAE68FF7DCD\r
+      89FF7CCD87FF56A55FFF36813CFC327C3808FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF005FBB6A435CB76765FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9E53915FAF\r
+      69FF7FCE8AFF7ECE89FF57A660FF37823DFC337D3908FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9F\r
+      549160B06AFF81CF8DFF7FCF8BFF58A761FF398540FF347E3A08FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004CA0559162B26CFF82D18FFF7AC885FF57A660FF38843F7BFFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004DA1569163B36DFF5FAF69FF41914979FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF004EA257914A9D527FFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton1Click\r
+  end\r
+  object GroupBox1: TGroupBox\r
+    Left = 8\r
+    Height = 392\r
+    Top = 8\r
+    Width = 441\r
+    Caption = 'General'\r
+    ClientHeight = 374\r
+    ClientWidth = 437\r
+    TabOrder = 0\r
+    object Label1: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 15\r
+      Width = 59\r
+      Caption = 'Driver name'\r
+      ParentColor = False\r
+    end\r
+    object Label2: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 42\r
+      Width = 43\r
+      Caption = 'First unit'\r
+      ParentColor = False\r
+    end\r
+    object Label3: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 69\r
+      Width = 42\r
+      Caption = 'Last unit'\r
+      ParentColor = False\r
+    end\r
+    object Shape1: TShape\r
+      Left = 6\r
+      Height = 1\r
+      Top = 92\r
+      Width = 424\r
+      Shape = stDiamond\r
+    end\r
+    object EOSDriverName: TEdit\r
+      Left = 142\r
+      Height = 21\r
+      Top = 8\r
+      Width = 280\r
+      Color = clYellow\r
+      TabOrder = 0\r
+    end\r
+    object CBAutodetection: TCheckBox\r
+      Left = 12\r
+      Height = 19\r
+      Top = 104\r
+      Width = 169\r
+      Caption = 'After startup run autodetection'\r
+      TabOrder = 1\r
+    end\r
+    object EFirstUnit: TEdit\r
+      Left = 142\r
+      Height = 21\r
+      Top = 35\r
+      Width = 280\r
+      Color = clYellow\r
+      TabOrder = 2\r
+    end\r
+    object ELastUnit: TEdit\r
+      Left = 142\r
+      Height = 21\r
+      Top = 62\r
+      Width = 280\r
+      Color = clYellow\r
+      TabOrder = 3\r
+    end\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/preferences.lrs b/ulan/host/apps/uloi_browser/preferences.lrs
new file mode 100644 (file)
index 0000000..9e8e0af
--- /dev/null
@@ -0,0 +1,123 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfpreferences','FORMDATA',[\r
+  'TPF0'#13'Tfpreferences'#12'fpreferences'#4'Left'#3#134#1#6'Height'#3#183#1#3\r
+  +'Top'#3#190#0#5'Width'#3#203#1#18'HorzScrollBar.Page'#3#202#1#18'VertScrollB'\r
+  +'ar.Page'#3#182#1#13'ActiveControl'#7#13'EOSDriverName'#11'BorderIcons'#11#12\r
+  +'biSystemMenu'#0#11'BorderStyle'#7#8'bsSingle'#7'Caption'#6#11'Preferences'\r
+  +#12'ClientHeight'#3#183#1#11'ClientWidth'#3#203#1#8'Position'#7#16'poMainFor'\r
+  +'mCenter'#0#12'TSpeedButton'#12'SpeedButton2'#4'Left'#3' '#1#6'Height'#2#26#3\r
+  +'Top'#3#152#1#5'Width'#2'P'#7'Caption'#6#6'Cancel'#5'Color'#7#9'clBtnFace'#10\r
+  +'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0\r
+  +#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'?='#237'A;8'#235#8#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'!'#31#227\r
+  +#8#30#28#226'A'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'JG'#240'AOL'#242#255'@>'#237#253'<9'#235#8#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'''%'#229#8'$"'#228#252'1/'#234#255#31#29\r
+  +#226'A'#255#255#255#0#255#255#255#0#255#255#255#0'TQ'#243'AXV'#245#255'ca'\r
+  +#250#255'XU'#246#255'A?'#237#252'=:'#236#8#255#255#255#0#255#255#255#0'0-'\r
+  +#231#8',*'#230#252'A?'#241#255'LJ'#246#255'1/'#234#255#31#29#226'A'#255#255\r
+  +#255#0#255#255#255#0'YV'#245'+[X'#246#255'eb'#250#255'qp'#255#255'YV'#246#255\r
+  +'B@'#238#252'>;'#236#8'97'#235#8'52'#233#252'GE'#242#255'cb'#255#255'JH'#244\r
+  +#255'/-'#233#255'" '#227'+'#255#255#255#0#255#255#255#0#255#255#255#0'ZW'#245\r
+  +'+[Y'#246#255'fc'#250#255'tq'#255#255'ZX'#246#255'CA'#238#252'><'#236#253'PM'\r
+  +#244#255'hg'#255#255'PN'#245#255'64'#235#255'*'''#229'+'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'[X'#246'+\Z'#246#255'gd'\r
+  +#250#255'tr'#255#255'sp'#255#255'pn'#255#255'nl'#255#255'WU'#247#255'?='#238\r
+  +#255'20'#232'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'\Y'#246'+]['#247#255'yv'#255#255'YV'\r
+  +#255#255'WT'#255#255'rp'#255#255'HF'#240#255'<9'#235'+'#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'a^'#248#8']Z'#246#253'}y'#255#255'^['#255#255'[X'#255#255'vt'\r
+  +#255#255'FC'#239#253'A?'#237#8#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'ig'#251#8'fc'#249#252'p'\r
+  +'m'#251#255#128'~'#255#255'~{'#255#255'|y'#255#255'yw'#255#255'^\'#247#255'G'\r
+  +'D'#239#252'B@'#238#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'qn'#253#8'nk'#252#252'wt'#253#255#134#130#255#255'vs'#252#255\r
+  +'db'#248#255'`]'#247#255'mj'#250#255'{y'#255#255'`]'#247#255'HE'#239#252'CA'\r
+  +#238#8#255#255#255#0#255#255#255#0#255#255#255#0'vs'#255#8'tq'#254#253'}z'\r
+  +#254#255#138#135#255#255'|y'#253#255'li'#251#255'ca'#249'+_\'#247'+a^'#248\r
+  +#255'nl'#250#255'}z'#255#255'a_'#247#255'IF'#240#252'DA'#238#5#255#255#255#0\r
+  +#255#255#255#0'wt'#255#31'zw'#255#255#129'~'#255#255#129'~'#254#255'tq'#253\r
+  +#255'li'#251'+'#255#255#255#0#255#255#255#0'`]'#247'+b_'#248#255'om'#251#255\r
+  +'~|'#255#255'b_'#248#255'JG'#240'oEB'#238#2#255#255#255#0#255#255#255#0'wt'\r
+  +#255#31'zw'#255#255'yv'#254#255'ro'#253'+'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'a^'#248'+da'#248#255'jh'#249#255'TQ'#243#168'OM'#242\r
+  +')'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'wt'#255#31'wt'\r
+  +#255'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'b_'#248'+]['#247'oYV'#245'>'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'c`'#248#10#255#255#255#0#255#255#255#0#255#255#255#0#9'NumGly'\r
+  +'phs'#2#0#7'OnClick'#7#17'SpeedButton2Click'#0#0#12'TSpeedButton'#12'SpeedBu'\r
+  +'tton1'#4'Left'#3'x'#1#6'Height'#2#26#3'Top'#3#152#1#5'Width'#2'H'#7'Caption'\r
+  +#6#2'OK'#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0\r
+  +#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0\r
+  +#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'1z6'#10'-u2'#7#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'9'#133\r
+  +'@'#10'7'#131'='#255'1{7'#251'.v3'#7#255#255#255#0#255#255#255#0#255#255#255\r
+  ,#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'B'#146'I'#10'@'#142'G'#255'T'#163'\'\r
+  +#255'O'#159'W'#255'2|8'#254'.w4'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'K'#158'S'#10'I'#154'Q'#255'['#172'd'#255'w'#202#130#255't'#200'~'\r
+  +#255'Q'#160'Y'#255'3}9'#254'/x5'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'S'#169'\'#10'Q'#166\r
+  +'Z'#255'c'#181'm'#255'~'#206#137#255'{'#204#135#255'v'#202#129#255'v'#201#129\r
+  +#255'R'#162'Z'#255'4~:'#254'0y5'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'Z'#180'e'#9'Y'#176'c'#255'k'#189'v'#255#132#210\r
+  +#144#255'z'#201#133#255'`'#178'j'#255'c'#180'm'#255'x'#201#131#255'x'#203#130\r
+  +#255'S'#163'\'#255'4\7f:'#253'1z6'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'^'#185'iF['#181'f'#228'y'#201#134#255#128#206#141#255'Q'#166\r
+  +'Z'#252'M'#161'VoI'#156'Q'#139'\'#173'g'#255'|'#204#134#255'y'#203#133#255'T'\r
+  +#164']'#255'5'#128';'#252'1{7'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'_'#186'j<\'#182'f'#230'm'#192'y'#255'U'#172'_o'#255#255#255#0\r
+  +#255#255#255#0'J'#157'R'#145'^'#174'h'#255'}'#205#137#255'|'#205#135#255'V'\r
+  +#165'_'#255'6'#129'<'#252'2|8'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'_'#187'jC\'#183'ge'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'K'#158'S'#145'_'#175'i'#255'\7f'#206#138#255'~'#206#137#255'W'\r
+  +#166'`'#255'7'#130'='#252'3}9'#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'K'#159'T'#145'`'#176'j'#255#129#207#141#255'\7f'#207\r
+  +#139#255'X'#167'a'#255'9'#133'@'#255'4~:'#8#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'L'#160'U'#145'b'#178'l'#255#130#209#143\r
+  +#255'z'#200#133#255'W'#166'`'#255'8'#132'?{'#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'V'#145'c'#179'm'#255\r
+  +'_'#175'i'#255'A'#145'Iy'#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'N'#162'W'#145'J'#157\r
+  +'R\7f'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#7'OnClick'#7#17'SpeedBut'\r
+  +'ton1Click'#0#0#9'TGroupBox'#9'GroupBox1'#4'Left'#2#8#6'Height'#3#136#1#3'To'\r
+  +'p'#2#8#5'Width'#3#185#1#7'Caption'#6#7'General'#12'ClientHeight'#3'v'#1#11\r
+  +'ClientWidth'#3#181#1#8'TabOrder'#2#0#0#6'TLabel'#6'Label1'#4'Left'#2#12#6'H'\r
+  +'eight'#2#14#3'Top'#2#15#5'Width'#2';'#7'Caption'#6#11'Driver name'#11'Paren'\r
+  +'tColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'#2#12#6'Height'#2#14#3'Top'#2'*'#5\r
+  +'Width'#2'+'#7'Caption'#6#10'First unit'#11'ParentColor'#8#0#0#6'TLabel'#6'L'\r
+  +'abel3'#4'Left'#2#12#6'Height'#2#14#3'Top'#2'E'#5'Width'#2'*'#7'Caption'#6#9\r
+  +'Last unit'#11'ParentColor'#8#0#0#6'TShape'#6'Shape1'#4'Left'#2#6#6'Height'#2\r
+  +#1#3'Top'#2'\'#5'Width'#3#168#1#5'Shape'#7#9'stDiamond'#0#0#5'TEdit'#13'EOSD'\r
+  +'riverName'#4'Left'#3#142#0#6'Height'#2#21#3'Top'#2#8#5'Width'#3#24#1#5'Colo'\r
+  +'r'#7#8'clYellow'#8'TabOrder'#2#0#0#0#9'TCheckBox'#15'CBAutodetection'#4'Lef'\r
+  +'t'#2#12#6'Height'#2#19#3'Top'#2'h'#5'Width'#3#169#0#7'Caption'#6#31'After s'\r
+  +'tartup run autodetection'#8'TabOrder'#2#1#0#0#5'TEdit'#10'EFirstUnit'#4'Lef'\r
+  +'t'#3#142#0#6'Height'#2#21#3'Top'#2'#'#5'Width'#3#24#1#5'Color'#7#8'clYellow'\r
+  +#8'TabOrder'#2#2#0#0#5'TEdit'#9'ELastUnit'#4'Left'#3#142#0#6'Height'#2#21#3\r
+  +'Top'#2'>'#5'Width'#3#24#1#5'Color'#7#8'clYellow'#8'TabOrder'#2#3#0#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/preferences.pas b/ulan/host/apps/uloi_browser/preferences.pas
new file mode 100644 (file)
index 0000000..cf33edd
--- /dev/null
@@ -0,0 +1,57 @@
+unit preferences;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,\r
+  Buttons, ExtCtrls;\r
+\r
+type\r
+\r
+  { Tfpreferences }\r
+\r
+  Tfpreferences = class(TForm)\r
+    CBAutodetection: TCheckBox;\r
+    EOSDriverName: TEdit;\r
+    EFirstUnit: TEdit;\r
+    ELastUnit: TEdit;\r
+    GroupBox1: TGroupBox;\r
+    Label1: TLabel;\r
+    Label2: TLabel;\r
+    Label3: TLabel;\r
+    Shape1: TShape;\r
+    SpeedButton1: TSpeedButton;\r
+    SpeedButton2: TSpeedButton;\r
+    procedure SpeedButton1Click(Sender: TObject);\r
+    procedure SpeedButton2Click(Sender: TObject);\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fpreferences: Tfpreferences;\r
+\r
+implementation\r
+\r
+{ Tfpreferences }\r
+\r
+\r
+procedure Tfpreferences.SpeedButton1Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrOk;\r
+end;\r
+\r
+procedure Tfpreferences.SpeedButton2Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrCancel;\r
+end;\r
+\r
+initialization\r
+  {$I preferences.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/prop_set_new_address.lfm b/ulan/host/apps/uloi_browser/prop_set_new_address.lfm
new file mode 100644 (file)
index 0000000..6b86028
--- /dev/null
@@ -0,0 +1,178 @@
+object fprop_set_new_address: Tfprop_set_new_address\r
+  Left = 535\r
+  Height = 194\r
+  Top = 399\r
+  Width = 363\r
+  HorzScrollBar.Page = 362\r
+  VertScrollBar.Page = 193\r
+  ActiveControl = ENAddress\r
+  BorderIcons = [biSystemMenu]\r
+  BorderStyle = bsSingle\r
+  Caption = 'New unit address'\r
+  ClientHeight = 194\r
+  ClientWidth = 363\r
+  Position = poMainFormCenter\r
+  object SpeedButton2: TSpeedButton\r
+    Left = 184\r
+    Height = 26\r
+    Top = 160\r
+    Width = 80\r
+    Caption = 'Cancel'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF003F3DED413B38EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00211FE3081E1CE241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004A47F0414F4CF2FF403EEDFD3C39EB08FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF002725E5082422E4FC312FEAFF1F1DE241FFFFFF00FFFFFF00FFFFFF005451\r
+      F3415856F5FF6361FAFF5855F6FF413FEDFC3D3AEC08FFFFFF00FFFFFF00302D\r
+      E7082C2AE6FC413FF1FF4C4AF6FF312FEAFF1F1DE241FFFFFF00FFFFFF005956\r
+      F52B5B58F6FF6562FAFF7170FFFF5956F6FF4240EEFC3E3BEC083937EB083532\r
+      E9FC4745F2FF6362FFFF4A48F4FF2F2DE9FF2220E32BFFFFFF00FFFFFF00FFFF\r
+      FF005A57F52B5B59F6FF6663FAFF7471FFFF5A58F6FF4341EEFC3E3CECFD504D\r
+      F4FF6867FFFF504EF5FF3634EBFF2A27E52BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF005B58F62B5C5AF6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6C\r
+      FFFF5755F7FF3F3DEEFF3230E82BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF005C59F62B5D5BF7FF7976FFFF5956FFFF5754FFFF7270\r
+      FFFF4846F0FF3C39EB2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00615EF8085D5AF6FD7D79FFFF5E5BFFFF5B58FFFF7674\r
+      FFFF4643EFFD413FED08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF006967FB086663F9FC706DFBFF807EFFFF7E7BFFFF7C79FFFF7977\r
+      FFFF5E5CF7FF4744EFFC4240EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00716EFD086E6BFCFC7774FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6A\r
+      FAFF7B79FFFF605DF7FF4845EFFC4341EE08FFFFFF00FFFFFF00FFFFFF007673\r
+      FF087471FEFD7D7AFEFF8A87FFFF7C79FDFF6C69FBFF6361F92B5F5CF72B615E\r
+      F8FF6E6CFAFF7D7AFFFF615FF7FF4946F0FC4441EE05FFFFFF00FFFFFF007774\r
+      FF1F7A77FFFF817EFFFF817EFEFF7471FDFF6C69FB2BFFFFFF00FFFFFF00605D\r
+      F72B625FF8FF6F6DFBFF7E7CFFFF625FF8FF4A47F06F4542EE02FFFFFF00FFFF\r
+      FF007774FF1F7A77FFFF7976FEFF726FFD2BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00615EF82B6461F8FF6A68F9FF5451F3A84F4DF229FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF007774FF1F7774FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00625FF82B5D5BF76F5956F53EFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF006360F80AFFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton2Click\r
+  end\r
+  object SpeedButton1: TSpeedButton\r
+    Left = 272\r
+    Height = 26\r
+    Top = 160\r
+    Width = 72\r
+    Caption = 'OK'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00317A360A2D753207FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF003985400A37833DFF317B37FB2E763307FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004292490A408E47FF54A35CFF4F9F57FF327C38FE2E773408FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004B9E530A499A51FF5BAC64FF77CA82FF74C87EFF51A059FF337D39FE2F78\r
+      3508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0053A9\r
+      5C0A51A65AFF63B56DFF7ECE89FF7BCC87FF76CA81FF76C981FF52A25AFF347E\r
+      3AFE30793508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AB4650959B0\r
+      63FF6BBD76FF84D290FF7AC985FF60B26AFF63B46DFF78C983FF78CB82FF53A3\r
+      5CFF347F3AFD317A3608FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB969465BB5\r
+      66E479C986FF80CE8DFF51A65AFC4DA1566F499C518B5CAD67FF7CCC86FF79CB\r
+      85FF54A45DFF35803BFC317B3708FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBA\r
+      6A3C5CB666E66DC079FF55AC5F6FFFFFFF00FFFFFF004A9D52915EAE68FF7DCD\r
+      89FF7CCD87FF56A55FFF36813CFC327C3808FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF005FBB6A435CB76765FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9E53915FAF\r
+      69FF7FCE8AFF7ECE89FF57A660FF37823DFC337D3908FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9F\r
+      549160B06AFF81CF8DFF7FCF8BFF58A761FF398540FF347E3A08FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004CA0559162B26CFF82D18FFF7AC885FF57A660FF38843F7BFFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004DA1569163B36DFF5FAF69FF41914979FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF004EA257914A9D527FFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton1Click\r
+  end\r
+  object GB: TGroupBox\r
+    Left = 8\r
+    Height = 136\r
+    Top = 8\r
+    Width = 345\r
+    Caption = 'Parameters'\r
+    ClientHeight = 118\r
+    ClientWidth = 341\r
+    TabOrder = 0\r
+    object LAddress: TLabel\r
+      Left = 150\r
+      Height = 21\r
+      Top = 6\r
+      Width = 176\r
+      AutoSize = False\r
+      Color = clWhite\r
+      Layout = tlCenter\r
+      ParentColor = False\r
+      Transparent = False\r
+    end\r
+    object Label1: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 13\r
+      Width = 40\r
+      Caption = 'Address'\r
+      ParentColor = False\r
+    end\r
+    object Label3: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 40\r
+      Width = 14\r
+      Caption = 'SN'\r
+      ParentColor = False\r
+    end\r
+    object Label5: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 67\r
+      Width = 63\r
+      Caption = 'New address'\r
+      ParentColor = False\r
+    end\r
+    object ENAddress: TEdit\r
+      Left = 150\r
+      Height = 21\r
+      Top = 60\r
+      Width = 177\r
+      Color = clYellow\r
+      TabOrder = 0\r
+    end\r
+    object ESN: TEdit\r
+      Left = 150\r
+      Height = 21\r
+      Top = 33\r
+      Width = 177\r
+      Color = clYellow\r
+      TabOrder = 1\r
+    end\r
+    object CBSave: TCheckBox\r
+      Left = 12\r
+      Height = 19\r
+      Top = 95\r
+      Width = 140\r
+      Caption = 'Save address to FLASH'\r
+      Checked = True\r
+      State = cbChecked\r
+      TabOrder = 2\r
+    end\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/prop_set_new_address.lrs b/ulan/host/apps/uloi_browser/prop_set_new_address.lrs
new file mode 100644 (file)
index 0000000..5d042e3
--- /dev/null
@@ -0,0 +1,123 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfprop_set_new_address','FORMDATA',[\r
+  'TPF0'#22'Tfprop_set_new_address'#21'fprop_set_new_address'#4'Left'#3#23#2#6\r
+  +'Height'#3#194#0#3'Top'#3#143#1#5'Width'#3'k'#1#18'HorzScrollBar.Page'#3'j'#1\r
+  +#18'VertScrollBar.Page'#3#193#0#13'ActiveControl'#7#9'ENAddress'#11'BorderIc'\r
+  +'ons'#11#12'biSystemMenu'#0#11'BorderStyle'#7#8'bsSingle'#7'Caption'#6#16'Ne'\r
+  +'w unit address'#12'ClientHeight'#3#194#0#11'ClientWidth'#3'k'#1#8'Position'\r
+  +#7#16'poMainFormCenter'#0#12'TSpeedButton'#12'SpeedButton2'#4'Left'#3#184#0#6\r
+  +'Height'#2#26#3'Top'#3#160#0#5'Width'#2'P'#7'Caption'#6#6'Cancel'#5'Color'#7\r
+  +#9'clBtnFace'#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0\r
+  +'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0\r
+  +#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'?='#237'A;8'#235#8#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0'!'#31#227#8#30#28#226'A'#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'JG'#240'AOL'#242#255'@>'#237#253'<9'#235#8#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'''%'#229#8'$"'#228#252'1/'\r
+  +#234#255#31#29#226'A'#255#255#255#0#255#255#255#0#255#255#255#0'TQ'#243'AXV'\r
+  +#245#255'ca'#250#255'XU'#246#255'A?'#237#252'=:'#236#8#255#255#255#0#255#255\r
+  +#255#0'0-'#231#8',*'#230#252'A?'#241#255'LJ'#246#255'1/'#234#255#31#29#226'A'\r
+  +#255#255#255#0#255#255#255#0'YV'#245'+[X'#246#255'eb'#250#255'qp'#255#255'YV'\r
+  +#246#255'B@'#238#252'>;'#236#8'97'#235#8'52'#233#252'GE'#242#255'cb'#255#255\r
+  +'JH'#244#255'/-'#233#255'" '#227'+'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +'ZW'#245'+[Y'#246#255'fc'#250#255'tq'#255#255'ZX'#246#255'CA'#238#252'><'#236\r
+  +#253'PM'#244#255'hg'#255#255'PN'#245#255'64'#235#255'*'''#229'+'#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'[X'#246'+\Z'#246\r
+  +#255'gd'#250#255'tr'#255#255'sp'#255#255'pn'#255#255'nl'#255#255'WU'#247#255\r
+  +'?='#238#255'20'#232'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0'\Y'#246'+]['#247#255'yv'#255#255\r
+  +'YV'#255#255'WT'#255#255'rp'#255#255'HF'#240#255'<9'#235'+'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'a^'#248#8']Z'#246#253'}y'#255#255'^['#255#255'[X'#255\r
+  +#255'vt'#255#255'FC'#239#253'A?'#237#8#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'ig'#251#8'fc'\r
+  +#249#252'pm'#251#255#128'~'#255#255'~{'#255#255'|y'#255#255'yw'#255#255'^\'\r
+  +#247#255'GD'#239#252'B@'#238#8#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'qn'#253#8'nk'#252#252'wt'#253#255#134#130#255#255'v'\r
+  +'s'#252#255'db'#248#255'`]'#247#255'mj'#250#255'{y'#255#255'`]'#247#255'HE'\r
+  +#239#252'CA'#238#8#255#255#255#0#255#255#255#0#255#255#255#0'vs'#255#8'tq'\r
+  +#254#253'}z'#254#255#138#135#255#255'|y'#253#255'li'#251#255'ca'#249'+_\'#247\r
+  +'+a^'#248#255'nl'#250#255'}z'#255#255'a_'#247#255'IF'#240#252'DA'#238#5#255\r
+  +#255#255#0#255#255#255#0'wt'#255#31'zw'#255#255#129'~'#255#255#129'~'#254#255\r
+  +'tq'#253#255'li'#251'+'#255#255#255#0#255#255#255#0'`]'#247'+b_'#248#255'om'\r
+  +#251#255'~|'#255#255'b_'#248#255'JG'#240'oEB'#238#2#255#255#255#0#255#255#255\r
+  +#0'wt'#255#31'zw'#255#255'yv'#254#255'ro'#253'+'#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'a^'#248'+da'#248#255'jh'#249#255'TQ'#243#168'OM'\r
+  +#242')'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'wt'#255#31'w'\r
+  +'t'#255'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'b_'#248'+]['#247'oYV'#245'>'#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'c`'#248#10#255#255#255#0#255#255#255#0#255#255#255#0#9\r
+  +'NumGlyphs'#2#0#7'OnClick'#7#17'SpeedButton2Click'#0#0#12'TSpeedButton'#12'S'\r
+  +'peedButton1'#4'Left'#3#16#1#6'Height'#2#26#3'Top'#3#160#0#5'Width'#2'H'#7'C'\r
+  +'aption'#6#2'OK'#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0\r
+  +'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4\r
+  +#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'1z6'#10'-u2'#7#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0'9'#133'@'#10'7'#131'='#255'1{7'#251'.v3'#7#255#255#255#0#255#255#255#0\r
+  ,#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'B'#146'I'#10'@'#142'G'\r
+  +#255'T'#163'\'#255'O'#159'W'#255'2|8'#254'.w4'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'K'#158'S'#10'I'#154'Q'#255'['#172'd'#255'w'#202#130\r
+  +#255't'#200'~'#255'Q'#160'Y'#255'3}9'#254'/x5'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'S'#169\r
+  +'\'#10'Q'#166'Z'#255'c'#181'm'#255'~'#206#137#255'{'#204#135#255'v'#202#129\r
+  +#255'v'#201#129#255'R'#162'Z'#255'4~:'#254'0y5'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0'Z'#180'e'#9'Y'#176'c'#255'k'#189\r
+  +'v'#255#132#210#144#255'z'#201#133#255'`'#178'j'#255'c'#180'm'#255'x'#201#131\r
+  +#255'x'#203#130#255'S'#163'\'#255'4\7f:'#253'1z6'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'^'#185'iF['#181'f'#228'y'#201#134#255#128#206\r
+  +#141#255'Q'#166'Z'#252'M'#161'VoI'#156'Q'#139'\'#173'g'#255'|'#204#134#255'y'\r
+  +#203#133#255'T'#164']'#255'5'#128';'#252'1{7'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'_'#186'j<\'#182'f'#230'm'#192'y'#255'U'#172'_o'\r
+  +#255#255#255#0#255#255#255#0'J'#157'R'#145'^'#174'h'#255'}'#205#137#255'|'\r
+  +#205#135#255'V'#165'_'#255'6'#129'<'#252'2|8'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'_'#187'jC\'#183'ge'#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'K'#158'S'#145'_'#175'i'#255'\7f'#206#138#255'~'\r
+  +#206#137#255'W'#166'`'#255'7'#130'='#252'3}9'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'K'#159'T'#145'`'#176'j'#255#129#207\r
+  +#141#255'\7f'#207#139#255'X'#167'a'#255'9'#133'@'#255'4~:'#8#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'L'#160'U'#145'b'#178'l'#255\r
+  +#130#209#143#255'z'#200#133#255'W'#166'`'#255'8'#132'?{'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'V'#145\r
+  +'c'#179'm'#255'_'#175'i'#255'A'#145'Iy'#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'N'#162\r
+  +'W'#145'J'#157'R\7f'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#7'OnClick'\r
+  +#7#17'SpeedButton1Click'#0#0#9'TGroupBox'#2'GB'#4'Left'#2#8#6'Height'#3#136#0\r
+  +#3'Top'#2#8#5'Width'#3'Y'#1#7'Caption'#6#10'Parameters'#12'ClientHeight'#2'v'\r
+  +#11'ClientWidth'#3'U'#1#8'TabOrder'#2#0#0#6'TLabel'#8'LAddress'#4'Left'#3#150\r
+  +#0#6'Height'#2#21#3'Top'#2#6#5'Width'#3#176#0#8'AutoSize'#8#5'Color'#7#7'clW'\r
+  +'hite'#6'Layout'#7#8'tlCenter'#11'ParentColor'#8#11'Transparent'#8#0#0#6'TLa'\r
+  +'bel'#6'Label1'#4'Left'#2#12#6'Height'#2#14#3'Top'#2#13#5'Width'#2'('#7'Capt'\r
+  +'ion'#6#7'Address'#11'ParentColor'#8#0#0#6'TLabel'#6'Label3'#4'Left'#2#12#6\r
+  +'Height'#2#14#3'Top'#2'('#5'Width'#2#14#7'Caption'#6#2'SN'#11'ParentColor'#8\r
+  +#0#0#6'TLabel'#6'Label5'#4'Left'#2#12#6'Height'#2#14#3'Top'#2'C'#5'Width'#2\r
+  +'?'#7'Caption'#6#11'New address'#11'ParentColor'#8#0#0#5'TEdit'#9'ENAddress'\r
+  +#4'Left'#3#150#0#6'Height'#2#21#3'Top'#2'<'#5'Width'#3#177#0#5'Color'#7#8'cl'\r
+  +'Yellow'#8'TabOrder'#2#0#0#0#5'TEdit'#3'ESN'#4'Left'#3#150#0#6'Height'#2#21#3\r
+  +'Top'#2'!'#5'Width'#3#177#0#5'Color'#7#8'clYellow'#8'TabOrder'#2#1#0#0#9'TCh'\r
+  +'eckBox'#6'CBSave'#4'Left'#2#12#6'Height'#2#19#3'Top'#2'_'#5'Width'#3#140#0#7\r
+  +'Caption'#6#21'Save address to FLASH'#7'Checked'#9#5'State'#7#9'cbChecked'#8\r
+  +'TabOrder'#2#2#0#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/prop_set_new_address.pas b/ulan/host/apps/uloi_browser/prop_set_new_address.pas
new file mode 100644 (file)
index 0000000..2526728
--- /dev/null
@@ -0,0 +1,55 @@
+unit prop_set_new_address;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,\r
+  Buttons;\r
+\r
+type\r
+\r
+  { Tfprop_set_new_address }\r
+\r
+  Tfprop_set_new_address = class(TForm)\r
+    CBSave: TCheckBox;\r
+    ENAddress: TEdit;\r
+    ESN: TEdit;\r
+    GB: TGroupBox;\r
+    Label1: TLabel;\r
+    Label3: TLabel;\r
+    Label5: TLabel;\r
+    LAddress: TLabel;\r
+    SpeedButton1: TSpeedButton;\r
+    SpeedButton2: TSpeedButton;\r
+    procedure SpeedButton1Click(Sender: TObject);\r
+    procedure SpeedButton2Click(Sender: TObject);\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fprop_set_new_address: Tfprop_set_new_address;\r
+\r
+implementation\r
+\r
+{ Tfprop_set_new_address }\r
+\r
+procedure Tfprop_set_new_address.SpeedButton1Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrOk;\r
+end;\r
+\r
+procedure Tfprop_set_new_address.SpeedButton2Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrCancel;\r
+end;\r
+\r
+initialization\r
+  {$I prop_set_new_address.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/prop_settings.lfm b/ulan/host/apps/uloi_browser/prop_settings.lfm
new file mode 100644 (file)
index 0000000..cfb81cf
--- /dev/null
@@ -0,0 +1,171 @@
+object fprop_settings: Tfprop_settings\r
+  Left = 534\r
+  Height = 171\r
+  Top = 234\r
+  Width = 357\r
+  HorzScrollBar.Page = 356\r
+  VertScrollBar.Page = 170\r
+  ActiveControl = EValue\r
+  BorderIcons = [biSystemMenu]\r
+  BorderStyle = bsSingle\r
+  Caption = 'Set new OI property value'\r
+  ClientHeight = 171\r
+  ClientWidth = 357\r
+  Position = poMainFormCenter\r
+  object SpeedButton1: TSpeedButton\r
+    Left = 272\r
+    Height = 26\r
+    Top = 136\r
+    Width = 72\r
+    Caption = 'OK'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00317A360A2D753207FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF003985400A37833DFF317B37FB2E763307FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004292490A408E47FF54A35CFF4F9F57FF327C38FE2E773408FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004B9E530A499A51FF5BAC64FF77CA82FF74C87EFF51A059FF337D39FE2F78\r
+      3508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0053A9\r
+      5C0A51A65AFF63B56DFF7ECE89FF7BCC87FF76CA81FF76C981FF52A25AFF347E\r
+      3AFE30793508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AB4650959B0\r
+      63FF6BBD76FF84D290FF7AC985FF60B26AFF63B46DFF78C983FF78CB82FF53A3\r
+      5CFF347F3AFD317A3608FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB969465BB5\r
+      66E479C986FF80CE8DFF51A65AFC4DA1566F499C518B5CAD67FF7CCC86FF79CB\r
+      85FF54A45DFF35803BFC317B3708FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBA\r
+      6A3C5CB666E66DC079FF55AC5F6FFFFFFF00FFFFFF004A9D52915EAE68FF7DCD\r
+      89FF7CCD87FF56A55FFF36813CFC327C3808FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF005FBB6A435CB76765FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9E53915FAF\r
+      69FF7FCE8AFF7ECE89FF57A660FF37823DFC337D3908FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9F\r
+      549160B06AFF81CF8DFF7FCF8BFF58A761FF398540FF347E3A08FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004CA0559162B26CFF82D18FFF7AC885FF57A660FF38843F7BFFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004DA1569163B36DFF5FAF69FF41914979FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF004EA257914A9D527FFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton1Click\r
+  end\r
+  object SpeedButton2: TSpeedButton\r
+    Left = 184\r
+    Height = 26\r
+    Top = 136\r
+    Width = 80\r
+    Caption = 'Cancel'\r
+    Color = clBtnFace\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF003F3DED413B38EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00211FE3081E1CE241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004A47F0414F4CF2FF403EEDFD3C39EB08FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF002725E5082422E4FC312FEAFF1F1DE241FFFFFF00FFFFFF00FFFFFF005451\r
+      F3415856F5FF6361FAFF5855F6FF413FEDFC3D3AEC08FFFFFF00FFFFFF00302D\r
+      E7082C2AE6FC413FF1FF4C4AF6FF312FEAFF1F1DE241FFFFFF00FFFFFF005956\r
+      F52B5B58F6FF6562FAFF7170FFFF5956F6FF4240EEFC3E3BEC083937EB083532\r
+      E9FC4745F2FF6362FFFF4A48F4FF2F2DE9FF2220E32BFFFFFF00FFFFFF00FFFF\r
+      FF005A57F52B5B59F6FF6663FAFF7471FFFF5A58F6FF4341EEFC3E3CECFD504D\r
+      F4FF6867FFFF504EF5FF3634EBFF2A27E52BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF005B58F62B5C5AF6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6C\r
+      FFFF5755F7FF3F3DEEFF3230E82BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF005C59F62B5D5BF7FF7976FFFF5956FFFF5754FFFF7270\r
+      FFFF4846F0FF3C39EB2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00615EF8085D5AF6FD7D79FFFF5E5BFFFF5B58FFFF7674\r
+      FFFF4643EFFD413FED08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF006967FB086663F9FC706DFBFF807EFFFF7E7BFFFF7C79FFFF7977\r
+      FFFF5E5CF7FF4744EFFC4240EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00716EFD086E6BFCFC7774FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6A\r
+      FAFF7B79FFFF605DF7FF4845EFFC4341EE08FFFFFF00FFFFFF00FFFFFF007673\r
+      FF087471FEFD7D7AFEFF8A87FFFF7C79FDFF6C69FBFF6361F92B5F5CF72B615E\r
+      F8FF6E6CFAFF7D7AFFFF615FF7FF4946F0FC4441EE05FFFFFF00FFFFFF007774\r
+      FF1F7A77FFFF817EFFFF817EFEFF7471FDFF6C69FB2BFFFFFF00FFFFFF00605D\r
+      F72B625FF8FF6F6DFBFF7E7CFFFF625FF8FF4A47F06F4542EE02FFFFFF00FFFF\r
+      FF007774FF1F7A77FFFF7976FEFF726FFD2BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00615EF82B6461F8FF6A68F9FF5451F3A84F4DF229FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF007774FF1F7774FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00625FF82B5D5BF76F5956F53EFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF006360F80AFFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    NumGlyphs = 0\r
+    OnClick = SpeedButton2Click\r
+  end\r
+  object GroupBox1: TGroupBox\r
+    Left = 8\r
+    Height = 113\r
+    Top = 8\r
+    Width = 337\r
+    Caption = 'Property'\r
+    ClientHeight = 95\r
+    ClientWidth = 333\r
+    TabOrder = 0\r
+    object Label1: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 13\r
+      Width = 38\r
+      Caption = 'Number'\r
+      ParentColor = False\r
+    end\r
+    object LNumber: TLabel\r
+      Left = 110\r
+      Height = 21\r
+      Top = 6\r
+      Width = 216\r
+      AutoSize = False\r
+      Color = clWhite\r
+      Layout = tlCenter\r
+      ParentColor = False\r
+      Transparent = False\r
+    end\r
+    object Label3: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 40\r
+      Width = 28\r
+      Caption = 'Name'\r
+      ParentColor = False\r
+    end\r
+    object LName: TLabel\r
+      Left = 110\r
+      Height = 21\r
+      Top = 33\r
+      Width = 216\r
+      AutoSize = False\r
+      Color = clWhite\r
+      Layout = tlCenter\r
+      ParentColor = False\r
+      Transparent = False\r
+    end\r
+    object Label5: TLabel\r
+      Left = 12\r
+      Height = 14\r
+      Top = 67\r
+      Width = 27\r
+      Caption = 'Value'\r
+      ParentColor = False\r
+    end\r
+    object EValue: TEdit\r
+      Left = 110\r
+      Height = 21\r
+      Top = 60\r
+      Width = 217\r
+      Color = clYellow\r
+      TabOrder = 0\r
+    end\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/prop_settings.lrs b/ulan/host/apps/uloi_browser/prop_settings.lrs
new file mode 100644 (file)
index 0000000..12ae7bb
--- /dev/null
@@ -0,0 +1,121 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfprop_settings','FORMDATA',[\r
+  'TPF0'#15'Tfprop_settings'#14'fprop_settings'#4'Left'#3#22#2#6'Height'#3#171#0\r
+  +#3'Top'#3#234#0#5'Width'#3'e'#1#18'HorzScrollBar.Page'#3'd'#1#18'VertScrollB'\r
+  +'ar.Page'#3#170#0#13'ActiveControl'#7#6'EValue'#11'BorderIcons'#11#12'biSyst'\r
+  +'emMenu'#0#11'BorderStyle'#7#8'bsSingle'#7'Caption'#6#25'Set new OI property'\r
+  +' value'#12'ClientHeight'#3#171#0#11'ClientWidth'#3'e'#1#8'Position'#7#16'po'\r
+  +'MainFormCenter'#0#12'TSpeedButton'#12'SpeedButton1'#4'Left'#3#16#1#6'Height'\r
+  +#2#26#3'Top'#3#136#0#5'Width'#2'H'#7'Caption'#6#2'OK'#5'Color'#7#9'clBtnFace'\r
+  +#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16\r
+  +#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'1z6'\r
+  +#10'-u2'#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0'9'#133'@'#10'7'#131'='#255'1{7'\r
+  +#251'.v3'#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'B'#146'I'#10'@'#142'G'#255'T'#163'\'#255'O'#159'W'#255'2|8'\r
+  +#254'.w4'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'K'#158'S'#10\r
+  +'I'#154'Q'#255'['#172'd'#255'w'#202#130#255't'#200'~'#255'Q'#160'Y'#255'3}9'\r
+  +#254'/x5'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'S'#169'\'#10'Q'#166'Z'#255'c'#181'm'#255\r
+  +'~'#206#137#255'{'#204#135#255'v'#202#129#255'v'#201#129#255'R'#162'Z'#255'4'\r
+  +'~:'#254'0y5'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'Z'#180'e'#9'Y'#176'c'#255'k'#189'v'#255#132#210#144#255'z'#201#133\r
+  +#255'`'#178'j'#255'c'#180'm'#255'x'#201#131#255'x'#203#130#255'S'#163'\'#255\r
+  +'4\7f:'#253'1z6'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'^'\r
+  +#185'iF['#181'f'#228'y'#201#134#255#128#206#141#255'Q'#166'Z'#252'M'#161'VoI'\r
+  +#156'Q'#139'\'#173'g'#255'|'#204#134#255'y'#203#133#255'T'#164']'#255'5'#128\r
+  +';'#252'1{7'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'_'#186\r
+  +'j<\'#182'f'#230'm'#192'y'#255'U'#172'_o'#255#255#255#0#255#255#255#0'J'#157\r
+  +'R'#145'^'#174'h'#255'}'#205#137#255'|'#205#135#255'V'#165'_'#255'6'#129'<'\r
+  +#252'2|8'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'_'#187'j'\r
+  +'C\'#183'ge'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'K'#158\r
+  +'S'#145'_'#175'i'#255'\7f'#206#138#255'~'#206#137#255'W'#166'`'#255'7'#130'='\r
+  +#252'3}9'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +'K'#159'T'#145'`'#176'j'#255#129#207#141#255'\7f'#207#139#255'X'#167'a'#255'9'\r
+  +#133'@'#255'4~:'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'L'#160'U'#145'b'#178'l'#255#130#209#143#255'z'#200#133#255'W'#166\r
+  +'`'#255'8'#132'?{'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'M'#161'V'#145'c'#179'm'#255'_'#175'i'#255'A'#145'Iy'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'N'#162'W'#145'J'#157'R\7f'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#9'NumGlyphs'#2#0#7'OnClick'#7#17'SpeedButton1Click'#0#0#12'TSpeed'\r
+  +'Button'#12'SpeedButton2'#4'Left'#3#184#0#6'Height'#2#26#3'Top'#3#136#0#5'Wi'\r
+  +'dth'#2'P'#7'Caption'#6#6'Cancel'#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10\r
+  +':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0\r
+  +' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'?='#237'A;8'#235#8#255#255#255#0#255#255#255#0#255#255\r
+  ,#255#0#255#255#255#0#255#255#255#0#255#255#255#0'!'#31#227#8#30#28#226'A'#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'JG'#240'A'\r
+  +'OL'#242#255'@>'#237#253'<9'#235#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'''%'#229#8'$"'#228#252'1/'#234#255#31#29#226'A'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'TQ'#243'AXV'#245#255'ca'#250#255'XU'#246#255'A?'\r
+  +#237#252'=:'#236#8#255#255#255#0#255#255#255#0'0-'#231#8',*'#230#252'A?'#241\r
+  +#255'LJ'#246#255'1/'#234#255#31#29#226'A'#255#255#255#0#255#255#255#0'YV'#245\r
+  +'+[X'#246#255'eb'#250#255'qp'#255#255'YV'#246#255'B@'#238#252'>;'#236#8'97'\r
+  +#235#8'52'#233#252'GE'#242#255'cb'#255#255'JH'#244#255'/-'#233#255'" '#227'+'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0'ZW'#245'+[Y'#246#255'fc'#250#255\r
+  +'tq'#255#255'ZX'#246#255'CA'#238#252'><'#236#253'PM'#244#255'hg'#255#255'PN'\r
+  +#245#255'64'#235#255'*'''#229'+'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'[X'#246'+\Z'#246#255'gd'#250#255'tr'#255#255'sp'\r
+  +#255#255'pn'#255#255'nl'#255#255'WU'#247#255'?='#238#255'20'#232'+'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'\Y'#246'+]['#247#255'yv'#255#255'YV'#255#255'WT'#255#255'rp'\r
+  +#255#255'HF'#240#255'<9'#235'+'#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'a^'#248#8\r
+  +']Z'#246#253'}y'#255#255'^['#255#255'[X'#255#255'vt'#255#255'FC'#239#253'A?'\r
+  +#237#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'ig'#251#8'fc'#249#252'pm'#251#255#128'~'#255#255\r
+  +'~{'#255#255'|y'#255#255'yw'#255#255'^\'#247#255'GD'#239#252'B@'#238#8#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'qn'#253#8\r
+  +'nk'#252#252'wt'#253#255#134#130#255#255'vs'#252#255'db'#248#255'`]'#247#255\r
+  +'mj'#250#255'{y'#255#255'`]'#247#255'HE'#239#252'CA'#238#8#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'vs'#255#8'tq'#254#253'}z'#254#255#138#135#255#255'|'\r
+  +'y'#253#255'li'#251#255'ca'#249'+_\'#247'+a^'#248#255'nl'#250#255'}z'#255#255\r
+  +'a_'#247#255'IF'#240#252'DA'#238#5#255#255#255#0#255#255#255#0'wt'#255#31'zw'\r
+  +#255#255#129'~'#255#255#129'~'#254#255'tq'#253#255'li'#251'+'#255#255#255#0\r
+  +#255#255#255#0'`]'#247'+b_'#248#255'om'#251#255'~|'#255#255'b_'#248#255'JG'\r
+  +#240'oEB'#238#2#255#255#255#0#255#255#255#0'wt'#255#31'zw'#255#255'yv'#254\r
+  +#255'ro'#253'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'a^'\r
+  +#248'+da'#248#255'jh'#249#255'TQ'#243#168'OM'#242')'#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'wt'#255#31'wt'#255'+'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b_'#248'+'\r
+  +']['#247'oYV'#245'>'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'c`'#248#10\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#7'OnClick'#7#17\r
+  +'SpeedButton2Click'#0#0#9'TGroupBox'#9'GroupBox1'#4'Left'#2#8#6'Height'#2'q'\r
+  +#3'Top'#2#8#5'Width'#3'Q'#1#7'Caption'#6#8'Property'#12'ClientHeight'#2'_'#11\r
+  +'ClientWidth'#3'M'#1#8'TabOrder'#2#0#0#6'TLabel'#6'Label1'#4'Left'#2#12#6'He'\r
+  +'ight'#2#14#3'Top'#2#13#5'Width'#2'&'#7'Caption'#6#6'Number'#11'ParentColor'\r
+  +#8#0#0#6'TLabel'#7'LNumber'#4'Left'#2'n'#6'Height'#2#21#3'Top'#2#6#5'Width'#3\r
+  +#216#0#8'AutoSize'#8#5'Color'#7#7'clWhite'#6'Layout'#7#8'tlCenter'#11'Parent'\r
+  +'Color'#8#11'Transparent'#8#0#0#6'TLabel'#6'Label3'#4'Left'#2#12#6'Height'#2\r
+  +#14#3'Top'#2'('#5'Width'#2#28#7'Caption'#6#4'Name'#11'ParentColor'#8#0#0#6'T'\r
+  +'Label'#5'LName'#4'Left'#2'n'#6'Height'#2#21#3'Top'#2'!'#5'Width'#3#216#0#8\r
+  +'AutoSize'#8#5'Color'#7#7'clWhite'#6'Layout'#7#8'tlCenter'#11'ParentColor'#8\r
+  +#11'Transparent'#8#0#0#6'TLabel'#6'Label5'#4'Left'#2#12#6'Height'#2#14#3'Top'\r
+  +#2'C'#5'Width'#2#27#7'Caption'#6#5'Value'#11'ParentColor'#8#0#0#5'TEdit'#6'E'\r
+  +'Value'#4'Left'#2'n'#6'Height'#2#21#3'Top'#2'<'#5'Width'#3#217#0#5'Color'#7#8\r
+  +'clYellow'#8'TabOrder'#2#0#0#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/prop_settings.pas b/ulan/host/apps/uloi_browser/prop_settings.pas
new file mode 100644 (file)
index 0000000..0bf0660
--- /dev/null
@@ -0,0 +1,53 @@
+unit prop_settings;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,\r
+  Buttons;\r
+\r
+type\r
+\r
+  { Tfprop_settings }\r
+\r
+  Tfprop_settings = class(TForm)\r
+    EValue: TEdit;\r
+    GroupBox1: TGroupBox;\r
+    Label1: TLabel;\r
+    LNumber: TLabel;\r
+    Label3: TLabel;\r
+    LName: TLabel;\r
+    Label5: TLabel;\r
+    SpeedButton1: TSpeedButton;\r
+    SpeedButton2: TSpeedButton;\r
+    procedure SpeedButton1Click(Sender: TObject);\r
+    procedure SpeedButton2Click(Sender: TObject);\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fprop_settings: Tfprop_settings;\r
+\r
+implementation\r
+\r
+{ Tfprop_settings }\r
+\r
+procedure Tfprop_settings.SpeedButton1Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrOk;\r
+end;\r
+\r
+procedure Tfprop_settings.SpeedButton2Click(Sender: TObject);\r
+begin\r
+  ModalResult:=mrCancel;\r
+end;\r
+\r
+initialization\r
+  {$I prop_settings.lrs}\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/sd_confirm.lfm b/ulan/host/apps/uloi_browser/sd_confirm.lfm
new file mode 100644 (file)
index 0000000..1fa9530
--- /dev/null
@@ -0,0 +1,223 @@
+object fsd_confirm: Tfsd_confirm\r
+  Left = 584\r
+  Height = 138\r
+  Top = 377\r
+  Width = 449\r
+  HorzScrollBar.Page = 448\r
+  VertScrollBar.Page = 137\r
+  ActiveControl = BitBtn1\r
+  BorderIcons = []\r
+  BorderStyle = bsSingle\r
+  Caption = 'ULOI Browser'\r
+  ClientHeight = 138\r
+  ClientWidth = 449\r
+  Position = poMainFormCenter\r
+  object Shape1: TShape\r
+    Height = 2\r
+    Top = 86\r
+    Width = 449\r
+    Align = alTop\r
+    Pen.Color = clHighlight\r
+  end\r
+  object Panel1: TPanel\r
+    Height = 86\r
+    Width = 449\r
+    Align = alTop\r
+    BevelOuter = bvNone\r
+    ClientHeight = 86\r
+    ClientWidth = 449\r
+    Color = clWhite\r
+    ParentColor = False\r
+    TabOrder = 0\r
+    object Label1: TLabel\r
+      Left = 88\r
+      Height = 20\r
+      Top = 16\r
+      Width = 107\r
+      Caption = 'Confirmation'\r
+      Font.CharSet = 20\r
+      Font.Color = clHighlight\r
+      Font.Height = -16\r
+      Font.Style = [fsBold]\r
+      ParentColor = False\r
+    end\r
+    object LText: TLabel\r
+      Left = 88\r
+      Height = 33\r
+      Top = 45\r
+      Width = 29\r
+      ParentColor = False\r
+    end\r
+    object Image1: TImage\r
+      Left = 16\r
+      Height = 40\r
+      Top = 19\r
+      Width = 40\r
+      Picture.Data = {\r
+        1754506F727461626C654E6574776F726B477261706869636408000089504E47\r
+        0D0A1A0A0000000D494844520000002400000023080200000073673F77000008\r
+        2B4944415478DACD977B4C5BD71DC7AF5469D3A44995A64E959A5669A74C6BD7\r
+        556AD6F58FB65AA7697F6CEBA46C8AB2244B3281A2AE6D32D290171035241042\r
+        4221842C219884807904880D3104304F83631B83B18DB1C160FC7E5CBF7D6D5F\r
+        FBFAFDFAED5C278B42DAA60FB5DBAEBE3ABAB2EEF97D7EE77B7E3EF77731F82F\r
+        5ED8FF0B2C99CE84A271B39BB43A7D1E2FF1C8E5F7FAFC764F408BD323494553\r
+        A9D43787A533395F907278FC843F10228391482491482653E964FABE3289543A\r
+        1A4B5054C41F0C5BDD018D11C75D443A9DFEDA301F19414B41E993A150341A43\r
+        906C36F7054BCF46E2A92015F306C206DC27531B9101B95CEE2BC152E9ACC945\r
+        DA1D2EBFDF1FA6A268295F3CF19159995C309AF204A2367780BFA855690CC964\r
+        F24B60C83ABD3D60C3ED6E8F2F1C4D64F21834A01B3426B320517B2AAECB8E5C\r
+        129FBC2A6AE32CEAF1E0C34CD00D95C8D88988D9E1172E1904F3F2582CF62498\r
+        D119345B71871B6D562C9B9F9FCA422C4D8F3E32B1AF948DFDACF2E7DB7B5EFD\r
+        EB6DECF912ECD982A77F71A882C1A732104AD1CFA02B14CF98DD940E2746C4AB\r
+        A2D9B9CF56CD0318EEA3D68D16ABC34390B17496264553104E02958458060E54\r
+        72B01F7DF0CCAF2FCB75A4DD9F7A73C735ECC563D89632ECF90317DA25912C78\r
+        A280A8F47E47335A27B56CF6760C09351ACD63FB47C362C9CCA2C6A23359ED5E\r
+        329ECA22DF10838C0399A0E50EA59F79B30C7BA51ADB52515CCB43CF575C9BC6\r
+        367D8C6D6DC45E38FEFAF62613917647010F41300DA81CCD4472C5EC9F52989A\r
+        982C8FC7F338CC4E4495AB7A9DD5ED211309A001FE3804624020C5C146249F7A\r
+        A5147BAD017BB9E6ED829E401A6E0C2E633F3D8EBDDE886D29FFC9EFAF480D11\r
+        04B304C14CD23C4F22A7B28639C2B5B6BB22814098A0433E0213AB2D4A8D518F\r
+        FBFDF10C99025F04BC51F044C04D813B425BF4D179DE96ED7DEF1E5A286B9245\r
+        7250DF2DC55E3A9A8755BCBCEDFAA23581536008809E002309DE34AC3813C3F3\r
+        3AD6CCF2AD1EB6C3E9DC009B9C53C9D406832384D68130AE3038295AF6302D07\r
+        05465F86AFA6E6F449A33F4BA4A0E0543FF6DCF1EFBFD5F2BD371AF7944FDAA3\r
+        A0F3839680751F687C6089C29A272558F5B067542D3D772592850DB071916276\r
+        49BB6E275D1170E40136126C21B006C142823908D610382280D2B74760C1483D\r
+        F76ECD53AFD5BF7550B1A74A2936C4740158F53ED08A07347E50BA92D3CBAE3B\r
+        A23546EF10B3A373036C42A4E0CBD7D5D620DA646B3EBA39408FA6001891397E\r
+        5A3A82CEDD4A4175C712B6F9CCD6FDC2066E7CC1925AF7C38A1B96DDA0CA4BE9\r
+        82651FC8F1E4B8D23138AB6DBA75B7AEBE61036C44B0C85BD028CD0153908E6E\r
+        F0D37A0858276873D6EE8BC86E7E8FF9C3776E32C65C6B446ED547475F728122\r
+        AF4527C89DA07083C492E4CA1DFD82D5BAE69EAAF3351B60AC71D9F8DCAA5447\r
+        68899C360F7810DD0BEABC903928F73502C696C3A82EF65F909822A074D3D191\r
+        648EBCEC20B5C3021A1D20D0C786A4B656AEA2B4A2EE424DED06583B776190AF\r
+        9851E24A471231561F023CFF31C74DA78FFC195E0ABFB8ADA7B6DFA409D20014\r
+        770107495EF338CCD9600E07B12D37BAEC678BF49758C2C3C74F3299CC0D30DE\r
+        A2A973587457A499D505EFBBBFE47A20640E7266319FBBDC018B6EE0EB33287D\r
+        F4E37C1E20A6A3D39AB580C80A221B4C6913EC79BC6D6CA9B481557CF4049FCF\r
+        DF0033BB825759333DE3D211A965DE1C5FCA03E4F9C46967F2892380CC099707\r
+        F4076BF9E7BA96678C198411594068058105EE59806FA6C5336438726FFB94E6\r
+        52BFA4F0D885AAAA73E8D0DA00432726932B6FEE9BBE35A11891D9C4E6C4437F\r
+        6873F2FE485D70A65D896DFA3BF6EC2EECC77BFF78A86FD6FE00306DA2C533C1\r
+        8421DB2FF7B54D69AF0E488F358EEDD8B597C562A1F7FAE307B105779D6B1D6B\r
+        624F778C2B06A5F83D431231666D7967F2B98B70F8D5EEEBD8E622ECD50BD84B\r
+        253FD85A7E5B1EE55B61CA0093465AA3DA2C4B4AB44CAC5FBE2329670AB6EDFD\r
+        E0C489135AAD3693C93C0ECB66B3330BEACA16EE955E1EAAA2BE39EBF81AC537\r
+        E704797F66CC20B0C1EF0EF6A393F7E9DF746C7AAFEF853FDCE0AC24278C30A6\r
+        87511D0CA813B7E63D8C314D3D7BFE939BD33B8BAA0A0A0A2627271F3D1837BC\r
+        CFE2F1782F57F44933B7BE9BC7185C689F5A674B5CC32BD498363DA1CF221E73\r
+        96FCE5EEEEDF16CF5572E29F0EB9274C30B49EBDB31CBF25216E4C9BAF0CAB6A\r
+        7BC56537F83B0F7FFAB73D7BBBBABA0281C093DA827038CC1E9A28AE6755B470\r
+        2FF5DCBBCA915E1F5D6DE5193A85F86D997F7025DAAF8A7156D2237AE01A80BD\r
+        146D133AAF8DEB1B0694B5ACF9F256DE8717397F2E3CB26FDFBEB6B636A7D3F9\r
+        D966E4F1860735527CA1B8AC8E59FCAFA1332DE3D5ED53D51D3355DDE2F32CD9\r
+        45CE5223779D2974B155895E45A479CA72F18EE26CA7E074EB74D195B15D472F\r
+        FE6577615151D1F0F0B0CFE7FBDCB6E773BA2B549C3A9DAEB3FBF681B29AFDA7\r
+        9A0ED7F79532464F32C64E32C64FB7CED4719437859E9B426FDD80BAE4FA7441\r
+        65E78EE2FA3F6DDB5E5858C86030E4723945515FAF6F4479A13908393A3A7AF9\r
+        CAB5B2CABA43A5670F9F6938C518A9EC125FE3E12D426F356B714FD1E99D3B77\r
+        969494343737AB542A92249FDC3A3EA92346485435C160D066B3C964327416B4\r
+        DF993ADB2DAEE71A6ECC064EF72A0BDEFF279BCDC6713C140AA17AFE767A7D44\r
+        45DEA23AF612C1F2AEF96AB6B2E99EE744A7B2F0C3628542F1E83FE9DBFCB040\r
+        54B9DA70A871AA6E487BB443B9EF1F1FABD5EA2FEDBABFF9570C0A7D775A52D4\r
+        2C3AD2B1B2F7BB86DDFFFB0F4C883EAAB9FDFEC1C3DF398C6E3563318944828E\r
+        09BBDDFE554AE37FF031F86FF366C8FE2B322B710000000049454E44AE426082\r
+      }\r
+      Transparent = False\r
+    end\r
+  end\r
+  object BitBtn1: TBitBtn\r
+    Left = 368\r
+    Height = 28\r
+    Top = 100\r
+    Width = 62\r
+    Anchors = [akRight, akBottom]\r
+    Caption = 'OK'\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00317A360A2D753207FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF003985400A37833DFF317B37FB2E763307FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004292490A408E47FF54A35CFF4F9F57FF327C38FE2E773408FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004B9E530A499A51FF5BAC64FF77CA82FF74C87EFF51A059FF337D39FE2F78\r
+      3508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0053A9\r
+      5C0A51A65AFF63B56DFF7ECE89FF7BCC87FF76CA81FF76C981FF52A25AFF347E\r
+      3AFE30793508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AB4650959B0\r
+      63FF6BBD76FF84D290FF7AC985FF60B26AFF63B46DFF78C983FF78CB82FF53A3\r
+      5CFF347F3AFD317A3608FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB969465BB5\r
+      66E479C986FF80CE8DFF51A65AFC4DA1566F499C518B5CAD67FF7CCC86FF79CB\r
+      85FF54A45DFF35803BFC317B3708FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBA\r
+      6A3C5CB666E66DC079FF55AC5F6FFFFFFF00FFFFFF004A9D52915EAE68FF7DCD\r
+      89FF7CCD87FF56A55FFF36813CFC327C3808FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF005FBB6A435CB76765FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9E53915FAF\r
+      69FF7FCE8AFF7ECE89FF57A660FF37823DFC337D3908FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9F\r
+      549160B06AFF81CF8DFF7FCF8BFF58A761FF398540FF347E3A08FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004CA0559162B26CFF82D18FFF7AC885FF57A660FF38843F7BFFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004DA1569163B36DFF5FAF69FF41914979FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF004EA257914A9D527FFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    ModalResult = 1\r
+    NumGlyphs = 0\r
+    TabOrder = 1\r
+  end\r
+  object BitBtn2: TBitBtn\r
+    Left = 272\r
+    Height = 28\r
+    Top = 100\r
+    Width = 80\r
+    Anchors = [akRight, akBottom]\r
+    Caption = 'Cancel'\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF003F3DED413B38EB08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00211FE3081E1CE241FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004A47F0414F4CF2FF403EEDFD3C39EB08FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF002725E5082422E4FC312FEAFF1F1DE241FFFFFF00FFFFFF00FFFFFF005451\r
+      F3415856F5FF6361FAFF5855F6FF413FEDFC3D3AEC08FFFFFF00FFFFFF00302D\r
+      E7082C2AE6FC413FF1FF4C4AF6FF312FEAFF1F1DE241FFFFFF00FFFFFF005956\r
+      F52B5B58F6FF6562FAFF7170FFFF5956F6FF4240EEFC3E3BEC083937EB083532\r
+      E9FC4745F2FF6362FFFF4A48F4FF2F2DE9FF2220E32BFFFFFF00FFFFFF00FFFF\r
+      FF005A57F52B5B59F6FF6663FAFF7471FFFF5A58F6FF4341EEFC3E3CECFD504D\r
+      F4FF6867FFFF504EF5FF3634EBFF2A27E52BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF005B58F62B5C5AF6FF6764FAFF7472FFFF7370FFFF706EFFFF6E6C\r
+      FFFF5755F7FF3F3DEEFF3230E82BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF005C59F62B5D5BF7FF7976FFFF5956FFFF5754FFFF7270\r
+      FFFF4846F0FF3C39EB2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00615EF8085D5AF6FD7D79FFFF5E5BFFFF5B58FFFF7674\r
+      FFFF4643EFFD413FED08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF006967FB086663F9FC706DFBFF807EFFFF7E7BFFFF7C79FFFF7977\r
+      FFFF5E5CF7FF4744EFFC4240EE08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00716EFD086E6BFCFC7774FDFF8682FFFF7673FCFF6462F8FF605DF7FF6D6A\r
+      FAFF7B79FFFF605DF7FF4845EFFC4341EE08FFFFFF00FFFFFF00FFFFFF007673\r
+      FF087471FEFD7D7AFEFF8A87FFFF7C79FDFF6C69FBFF6361F92B5F5CF72B615E\r
+      F8FF6E6CFAFF7D7AFFFF615FF7FF4946F0FC4441EE05FFFFFF00FFFFFF007774\r
+      FF1F7A77FFFF817EFFFF817EFEFF7471FDFF6C69FB2BFFFFFF00FFFFFF00605D\r
+      F72B625FF8FF6F6DFBFF7E7CFFFF625FF8FF4A47F06F4542EE02FFFFFF00FFFF\r
+      FF007774FF1F7A77FFFF7976FEFF726FFD2BFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00615EF82B6461F8FF6A68F9FF5451F3A84F4DF229FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF007774FF1F7774FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00625FF82B5D5BF76F5956F53EFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF006360F80AFFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    ModalResult = 2\r
+    NumGlyphs = 0\r
+    TabOrder = 2\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/sd_confirm.lrs b/ulan/host/apps/uloi_browser/sd_confirm.lrs
new file mode 100644 (file)
index 0000000..6887c9b
--- /dev/null
@@ -0,0 +1,207 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfsd_confirm','FORMDATA',[\r
+  'TPF0'#12'Tfsd_confirm'#11'fsd_confirm'#4'Left'#3'H'#2#6'Height'#3#138#0#3'To'\r
+  +'p'#3'y'#1#5'Width'#3#193#1#18'HorzScrollBar.Page'#3#192#1#18'VertScrollBar.'\r
+  +'Page'#3#137#0#13'ActiveControl'#7#7'BitBtn1'#11'BorderIcons'#11#0#11'Border'\r
+  +'Style'#7#8'bsSingle'#7'Caption'#6#12'ULOI Browser'#12'ClientHeight'#3#138#0\r
+  +#11'ClientWidth'#3#193#1#8'Position'#7#16'poMainFormCenter'#0#6'TShape'#6'Sh'\r
+  +'ape1'#6'Height'#2#2#3'Top'#2'V'#5'Width'#3#193#1#5'Align'#7#5'alTop'#9'Pen.'\r
+  +'Color'#7#11'clHighlight'#0#0#6'TPanel'#6'Panel1'#6'Height'#2'V'#5'Width'#3\r
+  +#193#1#5'Align'#7#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'V'\r
+  +#11'ClientWidth'#3#193#1#5'Color'#7#7'clWhite'#11'ParentColor'#8#8'TabOrder'\r
+  +#2#0#0#6'TLabel'#6'Label1'#4'Left'#2'X'#6'Height'#2#20#3'Top'#2#16#5'Width'#2\r
+  +'k'#7'Caption'#6#12'Confirmation'#12'Font.CharSet'#2#20#10'Font.Color'#7#11\r
+  +'clHighlight'#11'Font.Height'#2#240#10'Font.Style'#11#6'fsBold'#0#11'ParentC'\r
+  +'olor'#8#0#0#6'TLabel'#5'LText'#4'Left'#2'X'#6'Height'#2'!'#3'Top'#2'-'#5'Wi'\r
+  +'dth'#2#29#11'ParentColor'#8#0#0#6'TImage'#6'Image1'#4'Left'#2#16#6'Height'#2\r
+  +'('#3'Top'#2#19#5'Width'#2'('#12'Picture.Data'#10#128#8#0#0#23'TPortableNetw'\r
+  +'orkGraphicd'#8#0#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0'$'#0#0#0'#'#8#2\r
+  +#0#0#0'sg?w'#0#0#8'+IDATx'#218#205#151'{L['#215#29#199#175'Ti'#211#164'I'#149\r
+  +#166'N'#149#154'Vi'#167'Lk'#215'Uj'#214#245#143#182'Z'#167'i\7fl'#235#164'l'\r
+  +#138#178'$K2'#129#162#174'm2'#210#144#23#16'5$'#16'BB!'#132',!'#152#132#128\r
+  +'y'#4#136#13'1'#4'0O'#131'c'#27#131#177#141#177#193'`'#252'~\'#191'}m_'#251\r
+  +#250#253#250#237'\'''#139'B'#218#166#15#181#219#174#190':'#186#178#238#249'}'\r
+  +'~'#231'{~>'#247'w1'#248'/^'#216#255#11','#153#206#132#162'q'#179#155#180':}'\r
+  +#30'/'#241#200#229#247#250#252'vO@'#139#211'#IES'#169#212'7'#135#165'39_'#144\r
+  +'rx'#252#132'?'#16'"'#131#145'H$'#145'H&S'#233'd'#250#190'2'#137'T:'#26'KPT'\r
+  +#196#31#12'['#221#1#141#17#199']D:'#157#254#218'0'#31#25'AKA'#233#147#161'P4'\r
+  +#26'C'#144'l6'#247#5'K'#207'F'#226#169' '#21#243#6#194#6#220'''S'#27#145#1\r
+  +#185'\'#238'+'#193'R'#233#172#201'E'#218#29'.'#191#223#31#166#162'h)_<'#241\r
+  +#145'Y'#153'\0'#154#242#4#162'6w'#128#191#168'Ui'#12#201'd'#242'K`'#200':'\r
+  +#189'=`'#195#237'n'#143'/'#28'Md'#242#24'4'#160#27'4&'#179' Q{*'#174#203#142\r
+  +'\'#18#159#188'*j'#227','#234#241#224#195'L'#208#13#149#200#216#137#136#217\r
+  +#225#23'.'#25#4#243#242'X,'#246'$'#152#209#25'4[q'#135#27'mV,'#155#159#159\r
+  +#202'B,M'#143'>2'#177#175#148#141#253#172#242#231#219'{^'#253#235'm'#236#249\r
+  +#18#236#217#130#167'\7fq'#168#130#193#167'2'#16'J'#209#207#160'+'#20#207#152\r
+  +#221#148#14'''F'#196#171#162#217#185#207'V'#205#3#24#238#163#214#141#22#171\r
+  +#195'C'#144#177't'#150'&ES'#16'N'#2#149#132'X'#6#14'Tr'#176#31'}'#240#204#175\r
+  +'/'#203'u'#164#221#159'zs'#199'5'#236#197'c'#216#150'2'#236#249#3#23#218'%'\r
+  +#145',x'#162#128#168#244'~G3Z'''#181'l'#246'v'#12#9'5'#26#205'c'#251'G'#195\r
+  +'b'#201#204#162#198#162'3Y'#237'^2'#158#202'"'#223#16#131#140#3#153#160#229\r
+  +#14#165#159'y'#179#12'{'#165#26#219'RQ\'#203'C'#207'W\'#155#198'6}'#140'mm'\r
+  +#196'^8'#254#250#246'&'#19#145'vG'#1#15'A0'#13#168#28#205'Dr'#197#236#159'R'\r
+  +#152#154#152','#143#199#243'8'#204'ND'#149#171'z'#157#213#237'!'#19#9#160#1\r
+  +#254'8'#4'b@ '#197#193'F$'#159'z'#165#20'{'#173#1'{'#185#230#237#130#158'@'\r
+  +#26'n'#12'.c?='#142#189#222#136'm)'#255#201#239#175'H'#13#17#4#179#4#193'L'\r
+  +#210'<O"'#167#178#134'9'#194#181#182#187'"'#129'@'#152#160'C>'#2#19#171'-J'\r
+  +#141'Q'#143#251#253#241#12#153#2'_'#4#188'Q'#240'D'#192'M'#129';B['#244#209\r
+  +'y'#222#150#237'}'#239#30'Z(k'#146'ErP'#223'-'#197'^:'#154#135'U'#188#188#237\r
+  +#250#162'5'#129'S`'#8#128#158#0'#'#9#222'4'#172'8'#19#195#243':'#214#204#242\r
+  +#173#30#182#195#233#220#0#155#156'S'#201#212#6#131'#'#132#214#129'0'#174'08)'\r
+  +'Z'#246'0-'#7#5'F_'#134#175#166#230#244'I'#163'?K'#164#160#224'T?'#246#220\r
+  +#241#239#191#213#242#189'7'#26#247#148'O'#218#163#160#243#131#150#128'u'#31\r
+  +'h|`'#137#194#154'''%X'#245#176'gT-=w%'#146#133#13#176'q'#145'bvI'#187'n'']'\r
+  +#17'p'#228#1'6'#18'l!'#176#6#193'B'#130'9'#8#214#16'8"'#128#210#183'G`'#193\r
+  +'H='#247'n'#205'S'#175#213#191'uP'#177#167'J)6'#196't'#1'X'#245'>'#208#138#7\r
+  +'4~P'#186#146#211#203#174';'#162'5F'#239#16#179#163's'#3'lB'#164#224#203#215\r
+  +#213#214' '#218'dk>'#186'9@'#143#166#0#24#145'9~Z:'#130#206#221'JAu'#199#18\r
+  +#182#249#204#214#253#194#6'n|'#193#146'Z'#247#195#138#27#150#221#160#202'K'\r
+  +#233#130'e'#31#200#241#228#184#210'18'#171'm'#186'u'#183#174#190'a'#3'lD'#176\r
+  +#200'['#208'('#205#1'S'#144#142'n'#240#211'z'#8'X''hs'#214#238#139#200'n~'\r
+  +#143#249#195'wn2'#198'\kDn'#213'GG_r'#129'"'#175'E'''#200#157#160'p'#131#196\r
+  +#146#228#202#29#253#130#213#186#230#158#170#243'5'#27'`'#172'q'#217#248#220\r
+  +#170'TGh'#137#156'6'#15'x'#16#221#11#234#188#144'9('#247'5'#2#198#150#195#168\r
+  +'.'#246'_'#144#152'"'#160't'#211#209#145'd'#142#188#236' '#181#195#2#26#29' '\r
+  +#208#199#134#164#182'V'#174#162#180#162#238'BM'#237#6'X;wa'#144#175#152'Q'\r
+  +#226'JG'#18'1V'#31#2'<'#255'1'#199'M'#167#143#252#25'^'#10#191#184#173#167\r
+  ,#182#223#164#9#210#0#20'w'#1#7'I^'#243'8'#204#217'`'#14#7#177'-7'#186#236'g'\r
+  +#139#244#151'X'#194#195#199'O2'#153#204#13'0'#222#162#169'sXtW'#164#153#213#5\r
+  +#239#187#191#228'z d'#14'rf1'#159#187#220#1#139'n'#224#235'3(}'#244#227'|'#30\r
+  +' '#166#163#211#154#181#128#200#10'"'#27'Li'#19#236'y'#188'ml'#169#180#129'U'\r
+  +'|'#244#4#159#207#223#0'3'#187#130'WY3='#227#210#17#169'e'#222#28'_'#202#3\r
+  +#228#249#196'ig'#242#137'#'#128#204#9#151#7#244#7'k'#249#231#186#150'g'#140\r
+  +#25#132#17'Y@h'#5#129#5#238'Y'#128'o'#166#197'3d8ro'#251#148#230'R'#191#164\r
+  +#240#216#133#170#170's'#232#208#218#0'C''&'#147'+o'#238#155#190'5'#161#24#145\r
+  +#217#196#230#196'C\7fhs'#242#254'H]p'#166']'#137'm'#250';'#246#236'.'#236#199\r
+  +'{'#255'x'#168'o'#214#254#0'0m'#162#197'3'#193#132'!'#219'/'#247#181'Mi'#175\r
+  +#14'H'#143'5'#142#237#216#181#151#197'b'#161#247#250#227#7#177#5'w'#157'k'#29\r
+  +'kbOw'#140'+'#6#165#248'=C'#18'1fmyg'#242#185#139'p'#248#213#238#235#216#230\r
+  +'"'#236#213#11#216'K%?'#216'Z~['#30#229'[a'#202#0#147'FZ'#163#218',KJ'#180'L'\r
+  +#172'_'#190'#)g'#10#182#237#253#224#196#137#19'Z'#173'6'#147#201'<'#14#203'f'\r
+  +#179'3'#11#234#202#22#238#149'^'#30#170#162#190'9'#235#248#26#197'7'#231#4'y'\r
+  +'\7ff'#204' '#176#193#239#14#246#163#147#247#233#223'tlz'#175#239#133'?'#220\r
+  +#224#172'$'''#140'0'#166#135'Q'#29#12#168#19#183#230'='#140'1M={'#254#147#155\r
+  +#211';'#139#170#10#10#10'&'''''#31'='#24'7'#188#207#226#241'x/W'#244'I3'#183\r
+  +#190#155#199#24'\h'#159'ZgK\'#195'+'#212#152'6='#161#207'"'#30's'#150#252#229\r
+  +#238#238#223#22#207'Ur'#226#159#14#185'''L0'#180#158#189#179#28#191'%!nL'#155\r
+  +#175#12#171'j{'#197'e7'#248';'#15'\7f'#250#183'={'#187#186#186#2#129#192#147\r
+  +#218#130'p8'#204#30#154'('#174'gU'#180'p/'#245#220#187#202#145'^'#31']m'#229\r
+  +#25':'#133#248'm'#153'\7fp%'#218#175#138'qV'#210'#z'#224#26#128#189#20'm'#19':'\r
+  +#175#141#235#27#6#148#181#172#249#242'V'#222#135#23'9\7f.<'#178'o'#223#190#182\r
+  +#182'6'#167#211#249#217'f'#228#241#134#7'5R|'#161#184#172#142'Y'#252#175#161\r
+  +'3-'#227#213#237'S'#213#29'3U'#221#226#243','#217'E'#206'R#w'#157')t'#177'U'\r
+  +#137'^E'#164'y'#202'r'#241#142#226'l'#167#224't'#235't'#209#149#177']G/'#254\r
+  +'ewaQQ'#209#240#240#176#207#231#251#220#182#231's'#186'+T'#156':'#157#174#179\r
+  +#251#246#129#178#154#253#167#154#14#215#247#149'2FO2'#198'N2'#198'O'#183#206\r
+  +#212'q'#148'7'#133#158#155'Bo'#221#128#186#228#250'tAe'#231#142#226#250'?m'\r
+  +#219'^XX'#200'`0'#228'r9EQ_'#175'oDy'#161'9'#8'9::z'#249#202#181#178#202#186\r
+  +'C'#165'g'#15#159'i8'#197#24#169#236#18'_'#227#225'-Bo5kqO'#209#233#157';w'\r
+  +#150#148#148'477'#171'T*'#146'$'#159#220':>'#169'#FHT5'#193'`'#208'f'#179#201\r
+  +'d2t'#22#180#223#153':'#219'-'#174#231#26'n'#204#6'N'#247'*'#11#222#255''''\r
+  +#155#205#198'q<'#20#10#161'z'#254'vz}DE'#222#162':'#246#18#193#242#174#249'j'\r
+  +#182#178#233#158#231'D'#167#178#240#195'b'#133'B'#241#232'?'#233#219#252#176\r
+  +'@T'#185#218'p'#168'q'#170'nH{'#180'C'#185#239#31#31#171#213#234'/'#237#186\r
+  +#191#249'W'#12#10'}wZR'#212',:'#210#177#178#247#187#134#221#255#251#15'L'#136\r
+  +'>'#170#185#253#254#193#195#223'9'#140'n5c1'#137'D'#130#142#9#187#221#254'UJ'\r
+  +#227'\7f'#240'1'#248'o'#243'f'#200#254'+2+q'#0#0#0#0'IEND'#174'B`'#130#11'Tran'\r
+  +'sparent'#8#0#0#0#7'TBitBtn'#7'BitBtn1'#4'Left'#3'p'#1#6'Height'#2#28#3'Top'\r
+  +#2'd'#5'Width'#2'>'#7'Anchors'#11#7'akRight'#8'akBottom'#0#7'Caption'#6#2'OK'\r
+  +#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16\r
+  +#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'1z6'\r
+  +#10'-u2'#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0'9'#133'@'#10'7'#131'='#255'1{7'\r
+  +#251'.v3'#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'B'#146'I'#10'@'#142'G'#255'T'#163'\'#255'O'#159'W'#255'2|8'\r
+  +#254'.w4'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'K'#158'S'#10\r
+  +'I'#154'Q'#255'['#172'd'#255'w'#202#130#255't'#200'~'#255'Q'#160'Y'#255'3}9'\r
+  +#254'/x5'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'S'#169'\'#10'Q'#166'Z'#255'c'#181'm'#255\r
+  +'~'#206#137#255'{'#204#135#255'v'#202#129#255'v'#201#129#255'R'#162'Z'#255'4'\r
+  +'~:'#254'0y5'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'Z'#180'e'#9'Y'#176'c'#255'k'#189'v'#255#132#210#144#255'z'#201#133\r
+  +#255'`'#178'j'#255'c'#180'm'#255'x'#201#131#255'x'#203#130#255'S'#163'\'#255\r
+  +'4\7f:'#253'1z6'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'^'\r
+  ,#185'iF['#181'f'#228'y'#201#134#255#128#206#141#255'Q'#166'Z'#252'M'#161'VoI'\r
+  +#156'Q'#139'\'#173'g'#255'|'#204#134#255'y'#203#133#255'T'#164']'#255'5'#128\r
+  +';'#252'1{7'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'_'#186\r
+  +'j<\'#182'f'#230'm'#192'y'#255'U'#172'_o'#255#255#255#0#255#255#255#0'J'#157\r
+  +'R'#145'^'#174'h'#255'}'#205#137#255'|'#205#135#255'V'#165'_'#255'6'#129'<'\r
+  +#252'2|8'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'_'#187'j'\r
+  +'C\'#183'ge'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'K'#158\r
+  +'S'#145'_'#175'i'#255'\7f'#206#138#255'~'#206#137#255'W'#166'`'#255'7'#130'='\r
+  +#252'3}9'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +'K'#159'T'#145'`'#176'j'#255#129#207#141#255'\7f'#207#139#255'X'#167'a'#255'9'\r
+  +#133'@'#255'4~:'#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0'L'#160'U'#145'b'#178'l'#255#130#209#143#255'z'#200#133#255'W'#166\r
+  +'`'#255'8'#132'?{'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'M'#161'V'#145'c'#179'm'#255'_'#175'i'#255'A'#145'Iy'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'N'#162'W'#145'J'#157'R\7f'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#11'ModalResult'#2#1#9'NumGlyphs'#2#0#8'TabOrder'#2#1#0#0#7'TBitBt'\r
+  +'n'#7'BitBtn2'#4'Left'#3#16#1#6'Height'#2#28#3'Top'#2'd'#5'Width'#2'P'#7'Anc'\r
+  +'hors'#11#7'akRight'#8'akBottom'#0#7'Caption'#6#6'Cancel'#10'Glyph.Data'#10\r
+  +':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0\r
+  +' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'?='#237'A;8'#235#8#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'!'#31#227#8#30#28#226'A'#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'JG'#240'A'\r
+  +'OL'#242#255'@>'#237#253'<9'#235#8#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'''%'#229#8'$"'#228#252'1/'#234#255#31#29#226'A'#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'TQ'#243'AXV'#245#255'ca'#250#255'XU'#246#255'A?'\r
+  +#237#252'=:'#236#8#255#255#255#0#255#255#255#0'0-'#231#8',*'#230#252'A?'#241\r
+  +#255'LJ'#246#255'1/'#234#255#31#29#226'A'#255#255#255#0#255#255#255#0'YV'#245\r
+  +'+[X'#246#255'eb'#250#255'qp'#255#255'YV'#246#255'B@'#238#252'>;'#236#8'97'\r
+  +#235#8'52'#233#252'GE'#242#255'cb'#255#255'JH'#244#255'/-'#233#255'" '#227'+'\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0'ZW'#245'+[Y'#246#255'fc'#250#255\r
+  +'tq'#255#255'ZX'#246#255'CA'#238#252'><'#236#253'PM'#244#255'hg'#255#255'PN'\r
+  +#245#255'64'#235#255'*'''#229'+'#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'[X'#246'+\Z'#246#255'gd'#250#255'tr'#255#255'sp'\r
+  +#255#255'pn'#255#255'nl'#255#255'WU'#247#255'?='#238#255'20'#232'+'#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0'\Y'#246'+]['#247#255'yv'#255#255'YV'#255#255'WT'#255#255'rp'\r
+  +#255#255'HF'#240#255'<9'#235'+'#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'a^'#248#8\r
+  +']Z'#246#253'}y'#255#255'^['#255#255'[X'#255#255'vt'#255#255'FC'#239#253'A?'\r
+  +#237#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'ig'#251#8'fc'#249#252'pm'#251#255#128'~'#255#255\r
+  +'~{'#255#255'|y'#255#255'yw'#255#255'^\'#247#255'GD'#239#252'B@'#238#8#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'qn'#253#8\r
+  +'nk'#252#252'wt'#253#255#134#130#255#255'vs'#252#255'db'#248#255'`]'#247#255\r
+  +'mj'#250#255'{y'#255#255'`]'#247#255'HE'#239#252'CA'#238#8#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0'vs'#255#8'tq'#254#253'}z'#254#255#138#135#255#255'|'\r
+  +'y'#253#255'li'#251#255'ca'#249'+_\'#247'+a^'#248#255'nl'#250#255'}z'#255#255\r
+  +'a_'#247#255'IF'#240#252'DA'#238#5#255#255#255#0#255#255#255#0'wt'#255#31'zw'\r
+  +#255#255#129'~'#255#255#129'~'#254#255'tq'#253#255'li'#251'+'#255#255#255#0\r
+  ,#255#255#255#0'`]'#247'+b_'#248#255'om'#251#255'~|'#255#255'b_'#248#255'JG'\r
+  +#240'oEB'#238#2#255#255#255#0#255#255#255#0'wt'#255#31'zw'#255#255'yv'#254\r
+  +#255'ro'#253'+'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'a^'\r
+  +#248'+da'#248#255'jh'#249#255'TQ'#243#168'OM'#242')'#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0'wt'#255#31'wt'#255'+'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b_'#248'+'\r
+  +']['#247'oYV'#245'>'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'c`'#248#10\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#11'ModalResult'#2#2#9'NumGlyphs'#2\r
+  +#0#8'TabOrder'#2#2#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/sd_confirm.pas b/ulan/host/apps/uloi_browser/sd_confirm.pas
new file mode 100644 (file)
index 0000000..e634931
--- /dev/null
@@ -0,0 +1,42 @@
+unit sd_confirm;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls,\r
+  ExtCtrls, StdCtrls, Buttons;\r
+\r
+type\r
+\r
+  { Tfsd_error }\r
+\r
+  { Tfsd_confirm }\r
+\r
+  Tfsd_confirm = class(TForm)\r
+    BitBtn1: TBitBtn;\r
+    BitBtn2: TBitBtn;\r
+    Image1: TImage;\r
+    Label1: TLabel;\r
+    LText: TLabel;\r
+    Panel1: TPanel;\r
+    Shape1: TShape;\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fsd_confirm: Tfsd_confirm;\r
+\r
+implementation\r
+\r
+{ Tfsd_confirm }\r
+\r
+initialization\r
+ {$I sd_confirm.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/sd_confirm.rc b/ulan/host/apps/uloi_browser/sd_confirm.rc
new file mode 100644 (file)
index 0000000..8a73aee
--- /dev/null
@@ -0,0 +1,25 @@
+1 VERSIONINFO\r
+FILEVERSION 0,1,0,126\r
+PRODUCTVERSION 1,0,0,1\r
+{\r
+ BLOCK "StringFileInfo"\r
+ {\r
+  BLOCK "040904E4"\r
+  {\r
+   VALUE "Comments", "\000"\r
+   VALUE "CompanyName", "\000"\r
+   VALUE "FileDescription", "\000"\r
+   VALUE "FileVersion", "0.1.0.126\000"\r
+   VALUE "InternalName", "\000"\r
+   VALUE "LegalCopyright", "\000"\r
+   VALUE "LegalTrademarks", "\000"\r
+   VALUE "OriginalFilename", "\000"\r
+   VALUE "ProductName", "\000"\r
+   VALUE "ProductVersion", "1.0.0.1\000"\r
+  }\r
+ }\r
+ BLOCK "VarFileInfo"\r
+ {\r
+  VALUE "Translation", 0x0409, 0x04E4\r
+ }\r
+}\r
diff --git a/ulan/host/apps/uloi_browser/sd_error.lfm b/ulan/host/apps/uloi_browser/sd_error.lfm
new file mode 100644 (file)
index 0000000..97ccc97
--- /dev/null
@@ -0,0 +1,159 @@
+object fsd_error: Tfsd_error\r
+  Left = 584\r
+  Height = 138\r
+  Top = 377\r
+  Width = 449\r
+  HorzScrollBar.Page = 448\r
+  VertScrollBar.Page = 137\r
+  ActiveControl = BitBtn1\r
+  BorderIcons = []\r
+  BorderStyle = bsSingle\r
+  Caption = 'ULOI Browser'\r
+  ClientHeight = 138\r
+  ClientWidth = 449\r
+  Position = poMainFormCenter\r
+  object Shape1: TShape\r
+    Height = 2\r
+    Top = 86\r
+    Width = 449\r
+    Align = alTop\r
+    Pen.Color = clHighlight\r
+  end\r
+  object Panel1: TPanel\r
+    Height = 86\r
+    Width = 449\r
+    Align = alTop\r
+    BevelOuter = bvNone\r
+    ClientHeight = 86\r
+    ClientWidth = 449\r
+    Color = clWhite\r
+    ParentColor = False\r
+    TabOrder = 0\r
+    object Label1: TLabel\r
+      Left = 88\r
+      Height = 20\r
+      Top = 16\r
+      Width = 42\r
+      Caption = 'Error'\r
+      Font.CharSet = 20\r
+      Font.Color = clHighlight\r
+      Font.Height = -16\r
+      Font.Style = [fsBold]\r
+      ParentColor = False\r
+    end\r
+    object LText: TLabel\r
+      Left = 88\r
+      Height = 32\r
+      Top = 45\r
+      Width = 28\r
+      ParentColor = False\r
+    end\r
+    object Image1: TImage\r
+      Left = 16\r
+      Height = 40\r
+      Top = 19\r
+      Width = 40\r
+      Picture.Data = {\r
+        1754506F727461626C654E6574776F726B477261706869635606000089504E47\r
+        0D0A1A0A0000000D4948445200000020000000200806000000737A7AF4000006\r
+        1D4944415478DAD597E953935714876F1265538810084B05EBD2AAD4BA14A980\r
+        B655CB26847D73295AC5D68E8A8C45EB5AFBA59DE91FD019A7FDD2765AA7339D\r
+        AE2ADB4CDBD1AA83ECCA16960222A0B26625810472FABBF062435802B55F9A99\r
+        67DEE492DCE79C73EF7BDE0B63FF975721631E5719CB2C5CB0A0A0D0C1A1355F\r
+        22D15C138946F8B568E1C2964289E4FA35C6F65D67CCFD3F1563D2170A249282\r
+        3C89C458EAE737D811114EAAFD6F9121E7048D5CBA806B360D64EEA38EF037A9\r
+        D4D777304F2C1ECA1789AEFDCAD8AA67127FCF9843BE587C19189B36078D9A2F\r
+        9E27CBD9D364399C45963DBBC9929C4C96F8B8F1EB9E0C8C1F22CB995C325F38\r
+        430D9B368EA23206FEFBCF195B386F793E635EC8A2B2D4DBDB38743A972CEFE7\r
+        902529912CD1D15318B56284939C442327B3C9702A878AE55EC63C91A81C55F4\r
+        9CB39CAF217ED4A90C0C345B3EFA902CBBD3ED4ACD51516398ACC94827D3A5B3\r
+        541BB8C68CF93A5051E95CCA2E2910894A1AD7AE355B2E9E234B62C2F4590A52\r
+        6BE1B0C010304E90104F43E773A96EED6A13E6BDC3E79F7DA78BC59F967BCA0C\r
+        964BE7693421C16E9613C209A9C18AC1C8C87114B164BC789AEE7ACA06B1273E\r
+        9951FE2363BE4562B1DA949B4323E969D34AA7CBD256AA17D0012D272282B429\r
+        49A4C9798F90A00A7787F7B4011488C5DFB5AD7B696424FBE8AC591AA7C97242\r
+        38490A34402DA03D7698EAB11FE0F966BAB59762A31886CF9DA261DC5AF64AAB\r
+        9F41AAB192AA38E1E1FF101B43EADCA3745D241AC45DE666DB6CF6DE9579E84C\r
+        1F9C9C354BFD6C59624CC511E403A05FA00FE37DFCBBA78ED32DA99B0ECB9036\r
+        79F3A173B585049331EB2019B0F6835C0CF440C7C118478BF71A013507631C15\r
+        DE7306403FE8B3BA727A410F1FCBDA4FF59BD611AAFDF3E4F517899ABBD39369\r
+        101D4DBF6B17E9383131A4D3E99E991ECCD58D20BB71EDDD9B416D8A0842936B\r
+        9814002252AB8E1F217D5A2AE96263490B34602E02AD564B6AB57A0C954A3576\r
+        E563137FEFC63C4F04BAD352A8F3401AAF40BFED1E18D1A36B69D146357171A4\r
+        16B027D7683463D299E07F7F8C4A3E5628E811273599BA4F1C24F84C532A3090\r
+        9B4DEA8C0C52A1017106C06CF2898CEDD1E2ED4D0F4343A90BF3756189DB3314\r
+        FC4E985C01AC4953D7FEDDA43E9049FD89894FF93759DBD2E4EA4A8DA00981B4\r
+        85049172CB7ABE040DB6015C6D0CDB42EA6347A80F8FD7BE9494317A410F3EF7\r
+        2425D1A3B0306AF7F3A3075229B571DCDCA815B480BF049A01174E481B0494A0\r
+        7EF1626AD9B8862A562C251C647E9A14004E3A7BFE7473D50DA05DF6A6A6528F\r
+        C013ECDEAEA0206AF7F51D934E085BAC84CD82D05ACA854A08B9B44EA016B445\r
+        87D11FCE8EDA297D807742AC8BE14972247504F8D3437F7F7A2097CF9865F32C\r
+        59DA4A6B40F5A24554EBE541AD71DB903D332000D729ED1847A92B55CFF998BB\r
+        5E0B9E94E54CA5B5CEB2DE4658032197DE17B8071AB76EA0626F99398FB1AF67\r
+        7C1A622FA83A63DFA0D6654B67CC52394B96D556424E15C7C585AA977A536344\r
+        30DFFD333F0DC73623CE03375C9C07BB92C3A9C94B366D696DB39C2285B01254\r
+        0854CADCA9397E1BFDE6E4A8C7FC1FDB3D11E116292E91CB4C0FE3B79352EE69\r
+        B7B45536D2728132FED9D39D1A6342E8A64C3A8CEC6FDB3D11F1179E124BD0A9\r
+        3AEF78B99BDA937752FD323FBB593E953A3B53A94065800F35C66FA51B32A909\r
+        F3B5CFE94C68D59A3D71382DFFDDD9C9D01CB3959AB607D17D2C89ADB4CC4A5A\r
+        02EE8232B98C6A5FDF407551C154E4E460C03C25B8E965F33E9AF3F33C36CC17\r
+        681A86DB3EB2D1A6F8D7A829F255AA59BF8AAA027CA942EE4165EE52083DA802\r
+        9FEFBDBC92EA22369332760BDD94BB9BD15B0C3F3076398E3197F9BA456CFC3E\r
+        F501AB521953E00C750BC10C17393B1A8A97FB52D5E6D554B363132915A154BD\r
+        632395BDF222DD79DE87F29C1C0DBFE07B5F31765BC1187ECAD683156C7CE72F\r
+        9A6B003C6239580936806D20DA9FB1B78FA0309719ABB9C2582FB23342368AEB\r
+        D0B78CF57DC698328BB12FFD183B8AEFA78028102604B19C8DFF7322994F1063\r
+        1510820805E1001565E92013C0C7DE05EF8043C2186FB1489EED042156F225F3\r
+        91DB2E8783B024BC2A01425081426041C2751D582DC8FC04A1D35CA47F03A587\r
+        695BEBB299AA0000000049454E44AE426082\r
+      }\r
+    end\r
+  end\r
+  object BitBtn1: TBitBtn\r
+    Left = 352\r
+    Height = 28\r
+    Top = 100\r
+    Width = 78\r
+    Anchors = [akRight, akBottom]\r
+    Caption = 'OK'\r
+    Glyph.Data = {\r
+      36040000424D3604000000000000360000002800000010000000100000000100\r
+      2000000000000004000064000000640000000000000000000000FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00317A360A2D753207FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF003985400A37833DFF317B37FB2E763307FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004292490A408E47FF54A35CFF4F9F57FF327C38FE2E773408FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004B9E530A499A51FF5BAC64FF77CA82FF74C87EFF51A059FF337D39FE2F78\r
+      3508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0053A9\r
+      5C0A51A65AFF63B56DFF7ECE89FF7BCC87FF76CA81FF76C981FF52A25AFF347E\r
+      3AFE30793508FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AB4650959B0\r
+      63FF6BBD76FF84D290FF7AC985FF60B26AFF63B46DFF78C983FF78CB82FF53A3\r
+      5CFF347F3AFD317A3608FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB969465BB5\r
+      66E479C986FF80CE8DFF51A65AFC4DA1566F499C518B5CAD67FF7CCC86FF79CB\r
+      85FF54A45DFF35803BFC317B3708FFFFFF00FFFFFF00FFFFFF00FFFFFF005FBA\r
+      6A3C5CB666E66DC079FF55AC5F6FFFFFFF00FFFFFF004A9D52915EAE68FF7DCD\r
+      89FF7CCD87FF56A55FFF36813CFC327C3808FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF005FBB6A435CB76765FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9E53915FAF\r
+      69FF7FCE8AFF7ECE89FF57A660FF37823DFC337D3908FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B9F\r
+      549160B06AFF81CF8DFF7FCF8BFF58A761FF398540FF347E3A08FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF004CA0559162B26CFF82D18FFF7AC885FF57A660FF38843F7BFFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF004DA1569163B36DFF5FAF69FF41914979FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF004EA257914A9D527FFFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF\r
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00\r
+    }\r
+    ModalResult = 1\r
+    NumGlyphs = 0\r
+    TabOrder = 1\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/sd_error.lrs b/ulan/host/apps/uloi_browser/sd_error.lrs
new file mode 100644 (file)
index 0000000..1ec2085
--- /dev/null
@@ -0,0 +1,138 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfsd_error','FORMDATA',[\r
+  'TPF0'#10'Tfsd_error'#9'fsd_error'#4'Left'#3'H'#2#6'Height'#3#138#0#3'Top'#3\r
+  +'y'#1#5'Width'#3#193#1#18'HorzScrollBar.Page'#3#192#1#18'VertScrollBar.Page'\r
+  +#3#137#0#13'ActiveControl'#7#7'BitBtn1'#11'BorderIcons'#11#0#11'BorderStyle'\r
+  +#7#8'bsSingle'#7'Caption'#6#12'ULOI Browser'#12'ClientHeight'#3#138#0#11'Cli'\r
+  +'entWidth'#3#193#1#8'Position'#7#16'poMainFormCenter'#0#6'TShape'#6'Shape1'#6\r
+  +'Height'#2#2#3'Top'#2'V'#5'Width'#3#193#1#5'Align'#7#5'alTop'#9'Pen.Color'#7\r
+  +#11'clHighlight'#0#0#6'TPanel'#6'Panel1'#6'Height'#2'V'#5'Width'#3#193#1#5'A'\r
+  +'lign'#7#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'V'#11'Client'\r
+  +'Width'#3#193#1#5'Color'#7#7'clWhite'#11'ParentColor'#8#8'TabOrder'#2#0#0#6\r
+  +'TLabel'#6'Label1'#4'Left'#2'X'#6'Height'#2#20#3'Top'#2#16#5'Width'#2'*'#7'C'\r
+  +'aption'#6#5'Error'#12'Font.CharSet'#2#20#10'Font.Color'#7#11'clHighlight'#11\r
+  +'Font.Height'#2#240#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TL'\r
+  +'abel'#5'LText'#4'Left'#2'X'#6'Height'#2' '#3'Top'#2'-'#5'Width'#2#28#11'Par'\r
+  +'entColor'#8#0#0#6'TImage'#6'Image1'#4'Left'#2#16#6'Height'#2'('#3'Top'#2#19\r
+  +#5'Width'#2'('#12'Picture.Data'#10'r'#6#0#0#23'TPortableNetworkGraphicV'#6#0\r
+  +#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0' '#0#0#0' '#8#6#0#0#0'szz'#244#0\r
+  +#0#6#29'IDATx'#218#213#151#233'S'#147'W'#20#135'o'#18'eS'#136#16#8'K'#5#235\r
+  +#210#170#212#186#20#169#128#182'U'#203'&'#132'}s)Z'#197#214#142#138#140'E'\r
+  +#235'Z'#251#165#157#233#31#208#25#167#253#210'vZ'#167'3'#157#174'*'#219'L'\r
+  +#219#209#170#131#236#202#22#150#2'"'#160#178'f%'#129#4'r'#250#187#240'bCX'#2\r
+  +#181'_'#154#153'g'#222#228#146#220#231#156's'#239'{'#222#11'c'#255#151'W!c'\r
+  +#30'W'#25#203',\'#176#160#160#208#193#161'5_"'#209'\'#19#137'F'#248#181'h'\r
+  +#225#194#150'B'#137#228#250'5'#198#246']g'#204#253'?'#21'c'#210#23#10'$'#146\r
+  +#130'<'#137#196'X'#234#231'7'#216#17#17'N'#170#253'o'#145'!'#231#4#141'\'#186\r
+  +#128'k6'#13'd'#238#163#142#240'7'#169#212#215'w0O,'#30#202#23#137#174#253#202\r
+  +#216#170'g'#18'\7f'#207#152'C'#190'X|'#25#24#155'6'#7#141#154'/'#158''''#203\r
+  +#217#211'd9'#156'E'#150'='#187#201#146#156'L'#150#248#184#241#235#158#12#140\r
+  +#31'"'#203#153'\2_8C'#13#155'6'#142#162'2'#6#254#251#207#25'[8oy>c^'#200#162\r
+  +#178#212#219#219'8t:'#151','#239#231#144'%)'#145','#209#209'S'#24#181'b'#132\r
+  +#147#156'D#'''#179#201'p*'#135#138#229'^'#198'<'#145#168#28'U'#244#156#179\r
+  +#156#175'!~'#212#169#12#12'4[>'#250#144','#187#211#237'J'#205'QQc'#152#172\r
+  +#201'H'''#211#165#179'T'#27#184#198#140#249':PQ'#233'\'#202'.)'#16#137'J'#26\r
+  +#215#174'5[.'#158'#Kb'#194#244'Y'#10'Rk'#225#176#192#16'0N'#144#16'OC'#231's'\r
+  +#169'n'#237'j'#19#230#189#195#231#159'}'#167#139#197#159#150'{'#202#12#150'K'\r
+  +#231'i4!'#193'n'#150#19#194#9#169#193#138#193#200#200'q'#20#177'd'#188'x'#154\r
+  +#238'z'#202#6#177'''>'#153'Q'#254'#c'#190'Eb'#177#218#148#155'C#'#233'i'#211\r
+  +'J'#167#203#210'V'#170#23#208#1'-''"'#130#180')I'#164#201'y'#143#144#160#10\r
+  +'w'#135#247#180#1#20#136#197#223#181#173'{id$'#251#232#172'Y'#26#167#201'rB8'\r
+  +'I'#10'4@-'#160'=v'#152#234#177#31#224#249'f'#186#181#151'b'#163#24#134#207\r
+  +#157#162'a'#220'Z'#246'J'#171#159'A'#170#177#146#170'8'#225#225#255#16#27'C'\r
+  +#234#220#163't]$'#26#196']'#230'f'#219'l'#246#222#149'y'#232'L'#31#156#156'5'\r
+  +'K'#253'lYbL'#197#17#228#3#160'_'#160#15#227'}'#252#187#167#142#211'-'#169\r
+  +#155#14#203#144'6y'#243#161's'#181#133#4#147'1'#235' '#25#176#246#131'\'#12\r
+  +#244'@'#199#193#24'G'#139#247#26#1'5'#7'c'#28#21#222's'#6'@?'#232#179#186'rz'\r
+  +'A'#15#31#203#218'O'#245#155#214#17#170#253#243#228#245#23#137#154#187#211\r
+  +#147'i'#16#29'M'#191'k'#23#233'811'#164#211#233#158#153#30#204#213#141' '#187\r
+  +'q'#237#221#155'Am'#138#8'B'#147'k'#152#20#0'"R'#171#142#31'!}Z*'#233'bcI'#11\r
+  +'4`.'#2#173'VKj'#181'z'#12#149'J5v'#229'c'#19'\7f'#239#198'<O'#4#186#211'R'#168\r
+  +#243'@'#26#175'@'#191#237#30#24#209#163'ki'#209'F5qq'#164#22#176''''#215'h4c'\r
+  +#210#153#224'\7f\7f'#140'J>V('#232#17'''5'#153#186'O'#28'$'#248'LS*0'#144#155'M'\r
+  +#234#140#12'R'#161#1'q'#6#192'l'#242#137#140#237#209#226#237'M'#15'CC'#169#11\r
+  +#243'ua'#137#219'3'#20#252'N'#152'\'#1#172'IS'#215#254#221#164'>'#144'I'#253\r
+  +#137#137'O'#249'7Y'#219#210#228#234'J'#141#160#9#129#180#133#4#145'r'#203'z'\r
+  +#190#4#13#182#1'\m'#12#219'B'#234'cG'#168#15#143#215#190#148#148'1zA'#15'>'\r
+  +#247'$%'#209#163#176'0j'#247#243#163#7'R)'#181'q'#220#220#168#21#180#128#191\r
+  +#4#154#1#23'NH'#27#4#148#160'~'#241'bj'#217#184#134'*V,%'#28'd~'#154#20#0'N:'\r
+  +'{'#254'ts'#213#13#160']'#246#166#166'R'#143#192#19#236#222#174#160' j'#247\r
+  +#245#29#147'N'#8'['#172#132#205#130#208'Z'#202#133'J'#8#185#180'N'#160#22#180\r
+  +'E'#135#209#31#206#142#218')}'#128'wB'#172#139#225'Ir$u'#4#248#211'C\7f\7fz '#151\r
+  +#207#152'e'#243',Y'#218'Jk@'#245#162'ET'#235#229'A'#173'q'#219#144'=3 '#0#215\r
+  +')'#237#24'G'#169'+U'#207#249#152#187'^'#11#158#148#229'L'#165#181#206#178\r
+  +#222'FX'#3'!'#151#222#23#184#7#26#183'n'#160'bo'#153'9'#143#177#175'g|'#26'b'\r
+  +'/'#168':c'#223#160#214'eKg'#204'R9K'#150#213'VBN'#21#199#197#133#170#151'zS'\r
+  +'cD0'#223#253'3?'#13#199'6#'#206#3'7\'#156#7#187#146#195#169#201'K6mim'#179\r
+  ,#156'"'#133#176#18'T'#8'T'#202#220#169'9~'#27#253#230#228#168#199#252#31#219\r
+  +'='#17#225#22').'#145#203'L'#15#227#183#147'R'#238'i'#183#180'U6'#210'r'#129\r
+  +'2'#254#217#211#157#26'cB'#232#166'L:'#140#236'o'#219'='#17#241#23#158#18'K'\r
+  +#208#169':'#239'x'#185#155#218#147'wR'#253'2?'#187'Y>'#149':;S'#169'@e'#128\r
+  +#15'5'#198'o'#165#27'2'#169#9#243#181#207#233'Lh'#213#154'=q8-'#255#221#217\r
+  +#201#208#28#179#149#154#182#7#209'},'#137#173#180#204'JZ'#2#238#130'2'#185\r
+  +#140'j_'#223'@uQ'#193'T'#228#228'`'#192'<%'#184#233'e'#243'>'#154#243#243'<6'\r
+  +#204#23'h'#26#134#219'>'#178#209#166#248#215#168')'#242'U'#170'Y'#191#138#170\r
+  +#2'|'#169'B'#238'Ae'#238'R'#8'='#168#2#159#239#189#188#146#234'"6'#147'2v'#11\r
+  +#221#148#187#155#209'['#12'?0v9'#142'1'#151#249#186'El'#252'>'#245#1#171'R'\r
+  +#25'S'#224#12'u'#11#193#12#23'9;'#26#138#151#251'R'#213#230#213'T'#179'c'#19\r
+  +')'#21#161'T'#189'c#'#149#189#242'"'#221'y'#222#135#242#156#28#13#191#224'{_'\r
+  +'1v['#193#24'~'#202#214#131#21'l|'#231'/'#154'k'#0'<b9X'#9'6'#128'm '#218#159\r
+  +#177#183#143#160'0'#151#25#171#185#194'X/'#178'3B6'#138#235#208#183#140#245\r
+  +'}'#198#152'2'#139#177'/'#253#24';'#138#239#167#128'('#16'&'#4#177#156#141\r
+  +#255's"'#153'O'#16'c'#21#16#130#8#5#225#0#21'e'#233' '#19#192#199#222#5#239\r
+  +#128'C'#194#24'o'#177'H'#158#237#4'!V'#242'%'#243#145#219'.'#135#131#176'$'\r
+  +#188'*'#1'BP'#129'B`A'#194'u'#29'X-'#200#252#4#161#211'\'#164'\7f'#3#165#135'i'\r
+  +'['#235#178#153#170#0#0#0#0'IEND'#174'B`'#130#0#0#0#7'TBitBtn'#7'BitBtn1'#4\r
+  +'Left'#3'`'#1#6'Height'#2#28#3'Top'#2'd'#5'Width'#2'N'#7'Anchors'#11#7'akRig'\r
+  +'ht'#8'akBottom'#0#7'Caption'#6#2'OK'#10'Glyph.Data'#10':'#4#0#0'6'#4#0#0'BM'\r
+  +'6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0\r
+  +#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255\r
+  +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'1z6'#10'-u2'#7#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +'9'#133'@'#10'7'#131'='#255'1{7'#251'.v3'#7#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'B'#146'I'#10'@'#142'G'#255\r
+  +'T'#163'\'#255'O'#159'W'#255'2|8'#254'.w4'#8#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0'K'#158'S'#10'I'#154'Q'#255'['#172'd'#255'w'#202#130#255\r
+  +'t'#200'~'#255'Q'#160'Y'#255'3}9'#254'/x5'#8#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'S'#169'\'\r
+  +#10'Q'#166'Z'#255'c'#181'm'#255'~'#206#137#255'{'#204#135#255'v'#202#129#255\r
+  +'v'#201#129#255'R'#162'Z'#255'4~:'#254'0y5'#8#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'Z'#180'e'#9'Y'#176'c'#255'k'#189'v'\r
+  +#255#132#210#144#255'z'#201#133#255'`'#178'j'#255'c'#180'm'#255'x'#201#131\r
+  +#255'x'#203#130#255'S'#163'\'#255'4\7f:'#253'1z6'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'^'#185'iF['#181'f'#228'y'#201#134#255#128#206\r
+  +#141#255'Q'#166'Z'#252'M'#161'VoI'#156'Q'#139'\'#173'g'#255'|'#204#134#255'y'\r
+  +#203#133#255'T'#164']'#255'5'#128';'#252'1{7'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'_'#186'j<\'#182'f'#230'm'#192'y'#255'U'#172'_o'\r
+  +#255#255#255#0#255#255#255#0'J'#157'R'#145'^'#174'h'#255'}'#205#137#255'|'\r
+  +#205#135#255'V'#165'_'#255'6'#129'<'#252'2|8'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'_'#187'jC\'#183'ge'#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0'K'#158'S'#145'_'#175'i'#255'\7f'#206#138#255'~'\r
+  +#206#137#255'W'#166'`'#255'7'#130'='#252'3}9'#8#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0'K'#159'T'#145'`'#176'j'#255#129#207\r
+  +#141#255'\7f'#207#139#255'X'#167'a'#255'9'#133'@'#255'4~:'#8#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'L'#160'U'#145'b'#178'l'#255\r
+  +#130#209#143#255'z'#200#133#255'W'#166'`'#255'8'#132'?{'#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'V'#145\r
+  +'c'#179'm'#255'_'#175'i'#255'A'#145'Iy'#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'N'#162\r
+  +'W'#145'J'#157'R\7f'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  ,#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0\r
+  +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255\r
+  +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255\r
+  +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#11'ModalResult'#2#1#9'NumGl'\r
+  +'yphs'#2#0#8'TabOrder'#2#1#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/sd_error.pas b/ulan/host/apps/uloi_browser/sd_error.pas
new file mode 100644 (file)
index 0000000..dad2ba5
--- /dev/null
@@ -0,0 +1,37 @@
+unit sd_error;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls,\r
+  ExtCtrls, StdCtrls, Buttons;\r
+\r
+type\r
+\r
+  { Tfsd_error }\r
+\r
+  Tfsd_error = class(TForm)\r
+    BitBtn1: TBitBtn;\r
+    Image1: TImage;\r
+    Label1: TLabel;\r
+    LText: TLabel;\r
+    Panel1: TPanel;\r
+    Shape1: TShape;\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+  end; \r
+\r
+var\r
+  fsd_error: Tfsd_error;\r
+\r
+implementation\r
+\r
+initialization\r
+  {$I sd_error.lrs}\r
+\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/sd_info_process.lfm b/ulan/host/apps/uloi_browser/sd_info_process.lfm
new file mode 100644 (file)
index 0000000..d2a48f1
--- /dev/null
@@ -0,0 +1,40 @@
+object fsd_info_process: Tfsd_info_process\r
+  Left = 348\r
+  Height = 97\r
+  Top = 193\r
+  Width = 400\r
+  HorzScrollBar.Page = 399\r
+  VertScrollBar.Page = 96\r
+  BorderIcons = []\r
+  BorderStyle = bsSingle\r
+  Caption = 'Working ...'\r
+  ClientHeight = 97\r
+  ClientWidth = 400\r
+  Position = poDesktopCenter\r
+  object Label1: TLabel\r
+    Left = 8\r
+    Height = 14\r
+    Top = 16\r
+    Width = 384\r
+    AutoSize = False\r
+    ParentColor = False\r
+  end\r
+  object Label2: TLabel\r
+    Left = 8\r
+    Height = 14\r
+    Top = 72\r
+    Width = 384\r
+    Alignment = taCenter\r
+    AutoSize = False\r
+    Caption = 'Please wait'\r
+    ParentColor = False\r
+  end\r
+  object ProgressBar1: TProgressBar\r
+    Left = 8\r
+    Height = 20\r
+    Top = 40\r
+    Width = 384\r
+    Max = 100\r
+    TabOrder = 0\r
+  end\r
+end\r
diff --git a/ulan/host/apps/uloi_browser/sd_info_process.lrs b/ulan/host/apps/uloi_browser/sd_info_process.lrs
new file mode 100644 (file)
index 0000000..ac34200
--- /dev/null
@@ -0,0 +1,14 @@
+{ This is an automatically generated lazarus resource file }\r
+\r
+LazarusResources.Add('Tfsd_info_process','FORMDATA',[\r
+  'TPF0'#17'Tfsd_info_process'#16'fsd_info_process'#4'Left'#3'\'#1#6'Height'#2\r
+  +'a'#3'Top'#3#193#0#5'Width'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertSc'\r
+  +'rollBar.Page'#2'`'#11'BorderIcons'#11#0#11'BorderStyle'#7#8'bsSingle'#7'Cap'\r
+  +'tion'#6#11'Working ...'#12'ClientHeight'#2'a'#11'ClientWidth'#3#144#1#8'Pos'\r
+  +'ition'#7#15'poDesktopCenter'#0#6'TLabel'#6'Label1'#4'Left'#2#8#6'Height'#2\r
+  +#14#3'Top'#2#16#5'Width'#3#128#1#8'AutoSize'#8#11'ParentColor'#8#0#0#6'TLabe'\r
+  +'l'#6'Label2'#4'Left'#2#8#6'Height'#2#14#3'Top'#2'H'#5'Width'#3#128#1#9'Alig'\r
+  +'nment'#7#8'taCenter'#8'AutoSize'#8#7'Caption'#6#11'Please wait'#11'ParentCo'\r
+  +'lor'#8#0#0#12'TProgressBar'#12'ProgressBar1'#4'Left'#2#8#6'Height'#2#20#3'T'\r
+  +'op'#2'('#5'Width'#3#128#1#3'Max'#2'd'#8'TabOrder'#2#0#0#0#0\r
+]);\r
diff --git a/ulan/host/apps/uloi_browser/sd_info_process.pas b/ulan/host/apps/uloi_browser/sd_info_process.pas
new file mode 100644 (file)
index 0000000..215b8ff
--- /dev/null
@@ -0,0 +1,61 @@
+unit sd_info_process;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+interface\r
+\r
+uses\r
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,\r
+  ComCtrls;\r
+\r
+type\r
+\r
+  { Tfsd_info_process }\r
+\r
+  Tfsd_info_process = class(TForm)\r
+    Label1: TLabel;\r
+    Label2: TLabel;\r
+    ProgressBar1: TProgressBar;\r
+  private\r
+    { private declarations }\r
+  public\r
+    { public declarations }\r
+    procedure uShow(min,max:integer);\r
+    procedure uHide;\r
+    procedure uSetPosition(value:integer);\r
+    procedure uSetText(txt:string);\r
+  end; \r
+\r
+var\r
+  fsd_info_process: Tfsd_info_process;\r
+\r
+implementation\r
+\r
+procedure Tfsd_info_process.uShow(min,max:integer);\r
+begin\r
+  Show;\r
+//  ProgressBar1.Min:=0;ProgressBar1.Max:=0;\r
+  ProgressBar1.Max:=max;ProgressBar1.Min:=min;\r
+  ProgressBar1.Position:=min;\r
+  Application.ProcessMessages;\r
+end;\r
+\r
+procedure Tfsd_info_process.uHide;\r
+begin\r
+  Hide;\r
+end;\r
+\r
+procedure Tfsd_info_process.uSetPosition(value:integer);\r
+begin\r
+  ProgressBar1.Position:=value;\r
+end;\r
+\r
+procedure Tfsd_info_process.uSetText(txt:string);\r
+begin\r
+  Label1.Caption:=txt;\r
+end;\r
+\r
+initialization\r
+  {$I sd_info_process.lrs}\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/uloi_browser.lpi b/ulan/host/apps/uloi_browser/uloi_browser.lpi
new file mode 100644 (file)
index 0000000..3d1b3dd
--- /dev/null
@@ -0,0 +1,327 @@
+<?xml version="1.0"?>\r
+<CONFIG>\r
+  <ProjectOptions>\r
+    <PathDelim Value="\"/>\r
+    <Version Value="6"/>\r
+    <General>\r
+      <MainUnit Value="0"/>\r
+      <IconPath Value=".\"/>\r
+      <TargetFileExt Value=".exe"/>\r
+      <UseXPManifest Value="True"/>\r
+      <ActiveEditorIndexAtStart Value="0"/>\r
+    </General>\r
+    <VersionInfo>\r
+      <UseVersionInfo Value="True"/>\r
+      <AutoIncrementBuild Value="True"/>\r
+      <CurrentMajorRevNr Value="1"/>\r
+      <CurrentBuildNr Value="186"/>\r
+      <ProjectVersion Value="0.1.0.1"/>\r
+    </VersionInfo>\r
+    <PublishOptions>\r
+      <Version Value="2"/>\r
+      <DestinationDirectory Value="$(TestDir)\publishedproject\"/>\r
+      <IgnoreBinaries Value="False"/>\r
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>\r
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>\r
+    </PublishOptions>\r
+    <RunParams>\r
+      <local>\r
+        <FormatVersion Value="1"/>\r
+        <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>\r
+      </local>\r
+    </RunParams>\r
+    <RequiredPackages Count="3">\r
+      <Item1>\r
+        <PackageName Value="LCL"/>\r
+      </Item1>\r
+      <Item2>\r
+        <PackageName Value="spkvcl"/>\r
+        <MinVersion Release="1" Build="1" Valid="True"/>\r
+      </Item2>\r
+      <Item3>\r
+        <PackageName Value="uLanlaz"/>\r
+        <MinVersion Minor="1" Valid="True"/>\r
+      </Item3>\r
+    </RequiredPackages>\r
+    <Units Count="21">\r
+      <Unit0>\r
+        <Filename Value="uloi_browser.lpr"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <UnitName Value="uloi_browser"/>\r
+        <CursorPos X="29" Y="9"/>\r
+        <TopLine Value="3"/>\r
+        <UsageCount Value="88"/>\r
+      </Unit0>\r
+      <Unit1>\r
+        <Filename Value="mainform.pas"/>\r
+        <ComponentName Value="fmainform"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="mainform.lrs"/>\r
+        <UnitName Value="mainform"/>\r
+        <CursorPos X="1" Y="593"/>\r
+        <TopLine Value="570"/>\r
+        <EditorIndex Value="0"/>\r
+        <UsageCount Value="88"/>\r
+        <Loaded Value="True"/>\r
+      </Unit1>\r
+      <Unit2>\r
+        <Filename Value="..\..\comp\spkvcl\SpkRollPanel.pas"/>\r
+        <UnitName Value="SpkRollPanel"/>\r
+        <CursorPos X="68" Y="9"/>\r
+        <TopLine Value="1"/>\r
+        <UsageCount Value="5"/>\r
+      </Unit2>\r
+      <Unit3>\r
+        <Filename Value="autodetection.pas"/>\r
+        <ComponentName Value="fautodetection"/>\r
+        <HasResources Value="True"/>\r
+        <ResourceFilename Value="autodetection.lrs"/>\r
+        <UnitName Value="autodetection"/>\r
+        <CursorPos X="1" Y="1"/>\r
+        <TopLine Value="1"/>\r
+        <UsageCount Value="17"/>\r
+      </Unit3>\r
+      <Unit4>\r
+        <Filename Value="..\..\comp\ulan\uLan.pas"/>\r
+        <UnitName Value="ulan"/>\r
+        <CursorPos X="18" Y="227"/>\r
+        <TopLine Value="193"/>\r
+        <UsageCount Value="23"/>\r
+      </Unit4>\r
+      <Unit5>\r
+        <Filename Value="rbtree.pas"/>\r
+        <UnitName Value="rbtree"/>\r
+        <CursorPos X="1" Y="109"/>\r
+        <TopLine Value="93"/>\r
+        <UsageCount Value="5"/>\r
+      </Unit5>\r
+      <Unit6>\r
+        <Filename Value="..\FastosR2\sd_info_process.pas"/>\r
+        <ComponentName Value="fsd_info_process"/>\r
+        <HasResources Value="True"/>\r
+        <UnitName Value="sd_info_process"/>\r
+        <CursorPos X="1" Y="1"/>\r
+        <TopLine Value="1"/>\r
+        <UsageCount Value="4"/>\r
+      </Unit6>\r
+      <Unit7>\r
+        <Filename Value="sd_info_process.pas"/>\r
+        <ComponentName Value="fsd_info_process"/>\r
+        <HasResources Value="True"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="sd_info_process.lrs"/>\r
+        <UnitName Value="sd_info_process"/>\r
+        <CursorPos X="68" Y="62"/>\r
+        <TopLine Value="30"/>\r
+        <UsageCount Value="84"/>\r
+      </Unit7>\r
+      <Unit8>\r
+        <Filename Value="SortList.pas"/>\r
+        <UnitName Value="Sortlist"/>\r
+        <CursorPos X="23" Y="138"/>\r
+        <TopLine Value="123"/>\r
+        <UsageCount Value="9"/>\r
+      </Unit8>\r
+      <Unit9>\r
+        <Filename Value="prop_settings.pas"/>\r
+        <ComponentName Value="fprop_settings"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="prop_settings.lrs"/>\r
+        <UnitName Value="prop_settings"/>\r
+        <CursorPos X="1" Y="48"/>\r
+        <TopLine Value="21"/>\r
+        <UsageCount Value="79"/>\r
+      </Unit9>\r
+      <Unit10>\r
+        <Filename Value="sd_error.pas"/>\r
+        <ComponentName Value="fsd_error"/>\r
+        <HasResources Value="True"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="sd_error.lrs"/>\r
+        <UnitName Value="sd_error"/>\r
+        <CursorPos X="31" Y="37"/>\r
+        <TopLine Value="5"/>\r
+        <UsageCount Value="78"/>\r
+      </Unit10>\r
+      <Unit11>\r
+        <Filename Value="sd_potvrdte.pas"/>\r
+        <ComponentName Value="fsd_confirm"/>\r
+        <HasResources Value="True"/>\r
+        <ResourceFilename Value="sd_potvrdte.lrs"/>\r
+        <UnitName Value="sd_potvrdte"/>\r
+        <CursorPos X="17" Y="15"/>\r
+        <TopLine Value="4"/>\r
+        <UsageCount Value="76"/>\r
+      </Unit11>\r
+      <Unit12>\r
+        <Filename Value="prop_set_new_address.pas"/>\r
+        <ComponentName Value="fprop_set_new_address"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="prop_set_new_address.lrs"/>\r
+        <UnitName Value="prop_set_new_address"/>\r
+        <CursorPos X="3" Y="43"/>\r
+        <TopLine Value="23"/>\r
+        <UsageCount Value="77"/>\r
+      </Unit12>\r
+      <Unit13>\r
+        <Filename Value="..\..\comp\ulan\ul_drvdef.pas"/>\r
+        <UnitName Value="ul_drvdef"/>\r
+        <CursorPos X="19" Y="66"/>\r
+        <TopLine Value="42"/>\r
+        <UsageCount Value="10"/>\r
+      </Unit13>\r
+      <Unit14>\r
+        <Filename Value="..\doublecmd\fAbout.lfm"/>\r
+        <CursorPos X="1" Y="1"/>\r
+        <TopLine Value="1"/>\r
+        <UsageCount Value="8"/>\r
+        <SyntaxHighlighter Value="LFM"/>\r
+      </Unit14>\r
+      <Unit15>\r
+        <Filename Value="..\doublecmd\fAbout.pas"/>\r
+        <ComponentName Value="frmAbout"/>\r
+        <HasResources Value="True"/>\r
+        <UnitName Value="fAbout"/>\r
+        <CursorPos X="11" Y="92"/>\r
+        <TopLine Value="49"/>\r
+        <UsageCount Value="8"/>\r
+      </Unit15>\r
+      <Unit16>\r
+        <Filename Value="fAbout.pas"/>\r
+        <ComponentName Value="frmAbout"/>\r
+        <HasResources Value="True"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="fAbout.lrs"/>\r
+        <UnitName Value="fAbout"/>\r
+        <CursorPos X="1" Y="78"/>\r
+        <TopLine Value="46"/>\r
+        <UsageCount Value="45"/>\r
+      </Unit16>\r
+      <Unit17>\r
+        <Filename Value="preferences.pas"/>\r
+        <ComponentName Value="fpreferences"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="preferences.lrs"/>\r
+        <UnitName Value="preferences"/>\r
+        <CursorPos X="1" Y="27"/>\r
+        <TopLine Value="25"/>\r
+        <UsageCount Value="24"/>\r
+      </Unit17>\r
+      <Unit18>\r
+        <Filename Value="nabidka.lrs"/>\r
+        <CursorPos X="1" Y="1"/>\r
+        <TopLine Value="1"/>\r
+        <UsageCount Value="10"/>\r
+      </Unit18>\r
+      <Unit19>\r
+        <Filename Value="..\..\comp\rxfpc\rxctrls.pas"/>\r
+        <UnitName Value="rxctrls"/>\r
+        <CursorPos X="51" Y="918"/>\r
+        <TopLine Value="892"/>\r
+        <UsageCount Value="10"/>\r
+      </Unit19>\r
+      <Unit20>\r
+        <Filename Value="sd_confirm.pas"/>\r
+        <ComponentName Value="fsd_confirm"/>\r
+        <HasResources Value="True"/>\r
+        <IsPartOfProject Value="True"/>\r
+        <ResourceFilename Value="sd_confirm.lrs"/>\r
+        <UnitName Value="sd_confirm"/>\r
+        <CursorPos X="6" Y="39"/>\r
+        <TopLine Value="10"/>\r
+        <UsageCount Value="22"/>\r
+      </Unit20>\r
+    </Units>\r
+    <JumpHistory Count="9" HistoryIndex="8">\r
+      <Position1>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="1" Column="32" TopLine="1"/>\r
+      </Position1>\r
+      <Position2>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="112" Column="24" TopLine="96"/>\r
+      </Position2>\r
+      <Position3>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="200" Column="47" TopLine="186"/>\r
+      </Position3>\r
+      <Position4>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="304" Column="23" TopLine="288"/>\r
+      </Position4>\r
+      <Position5>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="311" Column="22" TopLine="292"/>\r
+      </Position5>\r
+      <Position6>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="364" Column="1" TopLine="358"/>\r
+      </Position6>\r
+      <Position7>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="364" Column="1" TopLine="358"/>\r
+      </Position7>\r
+      <Position8>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="589" Column="3" TopLine="571"/>\r
+      </Position8>\r
+      <Position9>\r
+        <Filename Value="mainform.pas"/>\r
+        <Caret Line="558" Column="1" TopLine="548"/>\r
+      </Position9>\r
+    </JumpHistory>\r
+  </ProjectOptions>\r
+  <CompilerOptions>\r
+    <Version Value="5"/>\r
+    <PathDelim Value="\"/>\r
+    <SearchPaths>\r
+      <UnitOutputDirectory Value="build"/>\r
+    </SearchPaths>\r
+    <CodeGeneration>\r
+      <Generate Value="Faster"/>\r
+    </CodeGeneration>\r
+    <Linking>\r
+      <Options>\r
+        <Win32>\r
+          <GraphicApplication Value="True"/>\r
+        </Win32>\r
+      </Options>\r
+    </Linking>\r
+    <Other>\r
+      <CompilerPath Value="$(CompPath)"/>\r
+    </Other>\r
+  </CompilerOptions>\r
+  <Debugging>\r
+    <BreakPoints Count="2">\r
+      <Item1>\r
+        <Source Value="SortList.pas"/>\r
+        <Line Value="172"/>\r
+      </Item1>\r
+      <Item2>\r
+        <Source Value="mainform.pas"/>\r
+        <Line Value="444"/>\r
+      </Item2>\r
+    </BreakPoints>\r
+    <Watches Count="5">\r
+      <Item1>\r
+        <Expression Value="FieldDef.FDataType"/>\r
+        <Enabled Value="False"/>\r
+      </Item1>\r
+      <Item2>\r
+        <Expression Value="FieldDef.FSize"/>\r
+        <Enabled Value="False"/>\r
+      </Item2>\r
+      <Item3>\r
+        <Expression Value="IsSeq"/>\r
+        <Enabled Value="False"/>\r
+      </Item3>\r
+      <Item4>\r
+        <Expression Value="TIBCURSOR(CURSOR).SQLDA^"/>\r
+        <Enabled Value="False"/>\r
+      </Item4>\r
+      <Item5>\r
+        <Expression Value="x"/>\r
+      </Item5>\r
+    </Watches>\r
+  </Debugging>\r
+</CONFIG>\r
diff --git a/ulan/host/apps/uloi_browser/uloi_browser.lpr b/ulan/host/apps/uloi_browser/uloi_browser.lpr
new file mode 100644 (file)
index 0000000..499aa90
--- /dev/null
@@ -0,0 +1,36 @@
+program uloi_browser;\r
+\r
+{$mode objfpc}{$H+}\r
+\r
+uses\r
+  {$IFDEF UNIX}{$IFDEF UseCThreads}\r
+  cthreads,\r
+  {$ENDIF}{$ENDIF}\r
+  Interfaces, // this includes the LCL widgetset\r
+  Forms\r
+  { add your units here }, mainform, spkvcl, uLanlaz,\r
+  sd_info_process, prop_settings, sd_error, prop_set_new_address, preferences,\r
+  fAbout, sd_confirm;\r
+\r
+\r
+{$IFDEF Win32}\r
+{$R manifest.res}\r
+{$R uloi_browser_ico.res}\r
+{$ENDIF}\r
+\r
+\r
+{$IFDEF WINDOWS}{$R sd_confirm.rc}{$ENDIF}\r
+\r
+{$IFDEF WINDOWS}{$R uloi_browser.rc}{$ENDIF}\r
+\r
+begin\r
+  Application.Initialize;\r
+  Application.CreateForm(Tfmainform, fmainform);\r
+  Application.CreateForm(Tfprop_settings, fprop_settings);\r
+  Application.CreateForm(Tfsd_error, fsd_error);\r
+  Application.CreateForm(Tfprop_set_new_address, fprop_set_new_address);\r
+  Application.CreateForm(Tfpreferences, fpreferences);\r
+  Application.CreateForm(Tfsd_confirm, fsd_confirm);\r
+  Application.Run;\r
+end.\r
+\r
diff --git a/ulan/host/apps/uloi_browser/uloi_browser.rc b/ulan/host/apps/uloi_browser/uloi_browser.rc
new file mode 100644 (file)
index 0000000..0182032
--- /dev/null
@@ -0,0 +1,25 @@
+1 VERSIONINFO\r
+FILEVERSION 0,1,0,186\r
+PRODUCTVERSION 1,0,0,1\r
+{\r
+ BLOCK "StringFileInfo"\r
+ {\r
+  BLOCK "040904E4"\r
+  {\r
+   VALUE "Comments", "\000"\r
+   VALUE "CompanyName", "\000"\r
+   VALUE "FileDescription", "\000"\r
+   VALUE "FileVersion", "0.1.0.186\000"\r
+   VALUE "InternalName", "\000"\r
+   VALUE "LegalCopyright", "\000"\r
+   VALUE "LegalTrademarks", "\000"\r
+   VALUE "OriginalFilename", "\000"\r
+   VALUE "ProductName", "\000"\r
+   VALUE "ProductVersion", "1.0.0.1\000"\r
+  }\r
+ }\r
+ BLOCK "VarFileInfo"\r
+ {\r
+  VALUE "Translation", 0x0409, 0x04E4\r
+ }\r
+}\r
diff --git a/ulan/host/apps/uloi_browser/uloi_browser.res b/ulan/host/apps/uloi_browser/uloi_browser.res
new file mode 100644 (file)
index 0000000..577db26
Binary files /dev/null and b/ulan/host/apps/uloi_browser/uloi_browser.res differ
diff --git a/ulan/host/apps/uloi_browser/uloi_browser_ico.res b/ulan/host/apps/uloi_browser/uloi_browser_ico.res
new file mode 100644 (file)
index 0000000..6956d43
Binary files /dev/null and b/ulan/host/apps/uloi_browser/uloi_browser_ico.res differ
diff --git a/ulan/host/config.omk-default b/ulan/host/config.omk-default
new file mode 100644 (file)
index 0000000..af76d4b
--- /dev/null
@@ -0,0 +1,30 @@
+# Start of OMK config file
+# This file should not be altered manually
+# Overrides should be stored in file config.omk
+
+# Config for libs4c/ulut
+CONFIG_OC_ULUT=y
+CONFIG_OC_ULUTRTL=n
+#CONFIG_OC_SOLIBS=x
+# Config for libs4c/ulcintf
+#CONFIG_OC_SOLIBS=x
+# Config for libs4c
+# Config for ul_drv/ul_drv
+#CONFIG_OC_UL_DRV_USLIB=x
+#CONFIG_OC_UL_DRV_SYSLESS=x
+CONFIG_OC_UL_DRV_U450_VARPINS=n
+# Config for ul_drv/ul_lib
+#CONFIG_OC_ULUT=x
+#CONFIG_UL_SOLIBS=x
+#CONFIG_UL_FD_INDIRECT=x
+#CONFIG_UL_FD_ETH=x
+#CONFIG_OC_UL_DRV_SYSLESS=x
+#CONFIG_ULOI_GENOBJIDTAG=x
+# Config for ul_drv/utils
+# Config for ul_drv
+# Config for apps/ul_asd
+CONFIG_OC_UL_ASD=n
+# Config for apps/ul_ethd
+CONFIG_OC_UL_ETHD=n
+# Config for apps
+# Config for 
diff --git a/ulan/host/contrib/CVS/Entries b/ulan/host/contrib/CVS/Entries
new file mode 100644 (file)
index 0000000..1784810
--- /dev/null
@@ -0,0 +1 @@
+D
diff --git a/ulan/host/contrib/CVS/Repository b/ulan/host/contrib/CVS/Repository
new file mode 100644 (file)
index 0000000..a956ea6
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/contrib
diff --git a/ulan/host/contrib/CVS/Root b/ulan/host/contrib/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/kernelcfg2mk b/ulan/host/kernelcfg2mk
new file mode 100755 (executable)
index 0000000..0698b08
--- /dev/null
@@ -0,0 +1,204 @@
+#!/bin/bash
+
+if [ $# -lt 1 ] ; then
+  echo "kernelcfg2mk: requires linux kernel directory as the first argument"
+  exit 2
+fi
+
+LINUX_DIR="$1"
+
+if [ $# -gt 1 ] ; then
+  KERN_MODULES_DIR="$2"
+fi
+
+if [ ! -e $LINUX_DIR/.config ] ; then
+  echo "kernelcfg2mk: the provided locations doesnot point to configured kernel sources"
+  echo "        check directory $LINUX_DIR"
+  exit 2
+fi
+
+if [ ! -e $LINUX_DIR/.config ] ; then
+  echo "kernelcfg2mk: the provided locations doesnot point to configured kernel sources"
+  echo "        check directory $LINUX_DIR"
+  exit 2
+fi
+
+if [ -z "$KERN_BUILD_DIR" ]  ; then
+  KERN_BUILD_DIR=`pwd`
+fi
+
+if [ -z "$KERN_MODULES_DIR" ]  ; then
+  KERN_MODULES_DIR=`pwd`
+fi
+
+
+if [ -z "$MAKE" ]  ; then
+  MAKE="make"
+fi
+
+
+KERN_TEST_DIR="$KERN_BUILD_DIR/kern-test-mk"
+
+mkdir -p $KERN_TEST_DIR
+
+#echo MAKERULES_DIR $MAKERULES_DIR
+#echo LINUX_DIR $LINUX_DIR
+#echo KERN_BUILD_DIR $KERN_BUILD_DIR
+#echo KERN_MODULES_DIR $KERN_MODULES_DIR
+
+RETVAL="0"
+
+LINUX_VERSION=$(grep UTS_RELEASE ${LINUX_DIR}/include/linux/version.h | \
+               sed 's/[^"]*"\(.*\)\{1\}"/\1/')
+if [ -z "$LINUX_VERSION" ] ; then
+  LINUX_VERSION=$(grep UTS_RELEASE ${LINUX_DIR}/include/linux/utsrelease.h | \
+                 sed 's/[^"]*"\(.*\)\{1\}"/\1/')
+fi
+
+LINUX_VERSION_MAJOR=$(echo ${LINUX_VERSION} | cut -d. -f1)
+LINUX_VERSION_MINOR=$(echo ${LINUX_VERSION} | cut -d. -f2)
+
+#echo $LINUX_VERSION
+#echo $LINUX_VERSION_MAJOR
+#echo $LINUX_VERSION_MINOR
+
+
+case $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR in
+
+
+#=====================================================================
+# test for 2.4.x kernels
+    2.[01234])
+
+       rm -f ${KERN_BUILD_DIR}/kernel.mk
+       rm -rf ${KERN_TEST_DIR}
+       mkdir ${KERN_TEST_DIR}
+       if [ $? -ne 0 ] ; then
+               echo "Cannot create Linux kernel test build directory \"${KERN_TEST_DIR}\""
+               exit 3
+       fi
+       cd ${KERN_TEST_DIR}
+
+       cat >${KERN_TEST_DIR}/Makefile <<EOF
+
+.PHONY: modules
+modules:
+       @echo LINUX_ARCH="\$(ARCH)" >>flags
+       @echo LINUX_LDFLAGS="" >>flags
+       @echo LINUX_ARFLAGS="\$(ARFLAGS)" >>flags
+       @echo LINUX_CROSS_COMPILE="\$(CROSS_COMPILE)" >>flags
+       @echo LINUX_KERNELRELEASE="\$(KERNELRELEASE)" >>flags
+       @echo LINUX_AFLAGS="\$(AFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>flags
+       @echo LINUX_CFLAGS="\$(CFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>flags
+       @echo LINUX_MODFLAGS="\$(MODFLAGS)"
+       @echo LINUX_CC="\$(CC)" >>flags
+       @echo LINUX_LD="\$(LD) \$(LDFLAGS)" >>flags
+       @echo LINUX_AS="\$(AS)" >>flags
+       @echo LINUX_AR="\$(AR)" >>flags
+       @echo LINUX_MODULE_EXT=".o" >>flags
+
+EOF
+
+       #echo ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} modules
+       ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} modules
+       if [ $? == 0 ] ; then
+               cp -v flags ${KERN_MODULES_DIR}/kernel.mk       
+               if [ ! $? == 0 ] ; then
+                       RETVAL="2"
+               fi
+       else
+               RETVAL="1"
+       fi
+
+       cd ${KERN_BUILD_DIR}
+       rm -rf ${KERN_TEST_DIR}
+       ;;
+
+#=====================================================================
+# test for 2.6.x kernels
+
+    2.6)
+
+       rm -f ${KERN_BUILD_DIR}/kernel.mk
+       rm -rf ${KERN_TEST_DIR}
+       mkdir ${KERN_TEST_DIR}
+       if [ $? -ne 0 ] ; then
+               echo "Cannot create Linux kernel test build directory \"${KERN_TEST_DIR}\""
+               exit 3
+       fi
+       cd ${KERN_TEST_DIR}
+
+       cat >${KERN_TEST_DIR}/Makefile <<EOF
+obj-m += fake.o
+
+\$(obj)/fake.c: flags
+       touch \$(obj)/fake.c
+
+ifeq (\$(KBUILD_SRC),)
+OMK_LINUX_SRC = \$(LINUXDIR)
+else
+OMK_LINUX_SRC = \$(KBUILD_SRC)
+endif
+#\$(warning Test \$OMK_LINUX_SRC)
+
+.PHONY: flags
+flags:
+       @echo LINUX_SRC="\$(OMK_LINUX_SRC)" >>\$(obj)/flags
+       @echo LINUX_ARCH="\$(ARCH)" >>\$(obj)/flags
+       @echo LINUX_LDFLAGS="" >>\$(obj)/flags
+       @echo LINUX_ARFLAGS="\$(ARFLAGS)" >>\$(obj)/flags
+       @echo LINUX_CROSS_COMPILE="\$(CROSS_COMPILE)" >>\$(obj)/flags
+       @echo LINUX_KERNELRELEASE="\$(KERNELRELEASE)" >>\$(obj)/flags
+ifdef KBUILD_CFLAGS
+       @echo LINUX_CPPFLAGS="\$(KBUILD_CPPFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>\$(obj)/flags
+       @echo LINUX_AFLAGS="\$(KBUILD_AFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+       @echo LINUX_CFLAGS="\$(KBUILD_CFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+else
+       @echo LINUX_CPPFLAGS="\$(CPPFLAGS)" | sed 's#Iinclude#I"\$(LINUXDIR)/include"#g'>>\$(obj)/flags
+       @echo LINUX_AFLAGS="\$(AFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+       @echo LINUX_CFLAGS="\$(CFLAGS)" | sed 's#Iinclude#I"\$(OMK_LINUX_SRC)/include"#g'>>\$(obj)/flags
+endif
+       @echo LINUX_CFLAGS_MODULE="\$(CFLAGS_MODULE)" >>\$(obj)/flags
+       @echo LINUX_CC="\$(CC)" >>\$(obj)/flags
+       @echo LINUX_LD="\$(LD) \$(LDFLAGS) \$(LDFLAGS_MODULE)" >>\$(obj)/flags
+       @echo LINUX_AS="\$(AS)" >>\$(obj)/flags
+       @echo LINUX_AR="\$(AR)" >>\$(obj)/flags
+       @echo LINUX_MODULE_EXT=".ko" >>\$(obj)/flags
+       @echo LINUX_QUOTE_MODNAME=\$(if \$(findstring KBUILD_STR,\$(basename_flags)),y,) >>\$(obj)/flags
+EOF
+
+       # modkern_cflags := $(CFLAGS_KERNEL) / $(CFLAGS_MODULE)
+
+       # _c_flags       = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o)
+       # _a_flags       = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o)
+       # _cpp_flags     = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F))
+
+       # export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
+       # export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
+       # export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
+
+       #  -p V=1
+       #echo ${MAKE} -C ${LINUX_DIR} SUBDIRS=${KERN_TEST_DIR} LINUXDIR=${LINUX_DIR} MODVERDIR=${KERN_TEST_DIR} modules
+       ${MAKE} -C ${LINUX_DIR} M=${KERN_TEST_DIR} LINUXDIR=${LINUX_DIR} MODVERDIR=${KERN_TEST_DIR}/modver modules
+       #if [ $? == 0 ] ; then
+               cp -v flags ${KERN_MODULES_DIR}/kernel.mk       
+               if [ ! $? == 0 ] ; then
+                       RETVAL="2"
+               fi
+       #else
+       #       RETVAL="1"
+       #fi
+
+       cd ${KERN_BUILD_DIR}
+       rm -rf ${KERN_TEST_DIR}
+       ;;
+
+#=====================================================================
+
+    *)
+       echo "Unsupported Linux version $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR"
+    ;;
+esac
+
+
+exit ${RETVAL}
diff --git a/ulan/host/libs4c/.cvsignore b/ulan/host/libs4c/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/libs4c/CVS/Entries b/ulan/host/libs4c/CVS/Entries
new file mode 100644 (file)
index 0000000..d1b912f
--- /dev/null
@@ -0,0 +1,5 @@
+/.cvsignore/1.1/Wed Sep 22 22:13:09 2004//
+/Makefile.omk/1.1/Wed Sep 22 22:14:37 2004//
+D/ulcintf////
+D/ulevloop////
+D/ulut////
diff --git a/ulan/host/libs4c/CVS/Repository b/ulan/host/libs4c/CVS/Repository
new file mode 100644 (file)
index 0000000..eb92f6b
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/libs4c
diff --git a/ulan/host/libs4c/CVS/Root b/ulan/host/libs4c/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/libs4c/Makefile.omk b/ulan/host/libs4c/Makefile.omk
new file mode 100644 (file)
index 0000000..5975370
--- /dev/null
@@ -0,0 +1,12 @@
+SUBDIRS = ulut ulcintf
+
+#nobase_include_HEADERS = 
+
+#lib_LIBRARIES =
+#shared_LIBRARIES =
+#include_HEADERS  = 
+#xxx_SOURCES =
+#lib_LOADLIBES =
+#bin_PROGRAMS = 
+#utils_PROGRAMS = 
+
diff --git a/ulan/host/libs4c/ulcintf/.cvsignore b/ulan/host/libs4c/ulcintf/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/libs4c/ulcintf/CVS/Entries b/ulan/host/libs4c/ulcintf/CVS/Entries
new file mode 100644 (file)
index 0000000..23c11b6
--- /dev/null
@@ -0,0 +1,5 @@
+/.cvsignore/1.1/Wed Sep 22 22:13:09 2004//
+/Makefile.omk/1.3/Sun Nov 11 18:35:39 2007//
+/ul_netbase.c/1.4/Sun Nov 11 18:35:39 2007//
+/ul_netbase.h/1.4/Sun Nov 11 18:35:39 2007//
+D
diff --git a/ulan/host/libs4c/ulcintf/CVS/Repository b/ulan/host/libs4c/ulcintf/CVS/Repository
new file mode 100644 (file)
index 0000000..39b4127
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/libs4c/ulcintf
diff --git a/ulan/host/libs4c/ulcintf/CVS/Root b/ulan/host/libs4c/ulcintf/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/libs4c/ulcintf/Makefile.omk b/ulan/host/libs4c/ulcintf/Makefile.omk
new file mode 100644 (file)
index 0000000..9990bfb
--- /dev/null
@@ -0,0 +1,21 @@
+default_CONFIG = CONFIG_OC_SOLIBS=x
+
+ifeq ($(CONFIG_OC_ULUT),y)
+
+lib_LIBRARIES = ulcintf
+
+ifeq ($(CONFIG_OC_SOLIBS),y)
+shared_LIBRARIES = ulcintf
+endif
+
+include_HEADERS  = ul_netbase.h
+
+ulcintf_SOURCES = ul_netbase.c
+
+ifeq ($(CONFIG_OC_SOLIBS),y)
+  ulcintf_LIBS = ulut ulan
+endif
+
+#utils_PROGRAMS =
+
+endif
diff --git a/ulan/host/libs4c/ulcintf/ul_netbase.c b/ulan/host/libs4c/ulcintf/ul_netbase.c
new file mode 100644 (file)
index 0000000..9e16ef4
--- /dev/null
@@ -0,0 +1,892 @@
+/*******************************************************************
+  uLan Communication - C interface library
+
+  ul_netbase.c  - basic network and module constructions
+
+  (C) Copyright 2002-2004 by Pavel Pisa - Originator
+
+  The uLan C interface library can be used, copied and modified
+  under next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <string.h>
+#include <time.h>
+#include <ul_lib/ulan.h>
+#include <ul_gsa.h>
+#include <ul_netbase.h>
+
+#undef DEBUG
+
+#define UL_DY_RQ_MAX 6
+
+int
+ul_stat_dy_adr_asg(ul_net_stat_t *stat) {
+  if (!stat) return -1;
+  stat->dy_adr_asg_cnt++;
+  time(&stat->dy_adr_asg_last);
+  return 0;
+}
+
+int
+ul_stat_st_adr_req(ul_net_stat_t *stat) {
+  if (!stat) return -1;
+  stat->st_adr_req_cnt++;  
+  time(&stat->st_adr_req_last);
+  return 0;
+}
+
+int ul_net_new(ul_net_info_t **pnet, char *dev_name)
+{
+  ul_net_info_t *net;
+  ul_fd_t ul_fd;
+  *pnet=NULL;
+  if(!dev_name) dev_name=UL_DEV_NAME;
+  ul_fd=ul_open(dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    return -1;  
+  net=(ul_net_info_t*)malloc(sizeof(ul_net_info_t));
+  memset(net,0,sizeof(ul_net_info_t));
+  net->ul_fd=ul_fd;
+  net->dev_name=strdup(dev_name);
+  gsa_struct_init(ul_net_m2gsa(net),
+    UL_OFFSETOF(ul_mod_info_t,mod_adr), gsa_cmp_int);
+  gsa_struct_init(ul_net_f2gsa(net),
+    UL_OFFSETOF(ul_msg_filt_t,filt_cmd), gsa_cmp_int);
+  *pnet=net;
+  return 0;
+}
+
+ul_mod_info_t*
+ul_net_mod_find(ul_net_info_t *net, int adr)
+{
+  return (ul_mod_info_t*)gsa_find_first(ul_net_m2gsa(net),&adr);
+}
+
+ul_mod_info_t*
+ul_net_mod_find_indx(ul_net_info_t *net, int adr, int *indx)
+{
+  return (ul_mod_info_t*)gsa_find_indx(ul_net_m2gsa(net),&adr,indx);
+}
+
+
+ul_msg_filt_t*
+ul_net_filt_find(ul_net_info_t *net, int cmd)
+{
+  return (ul_msg_filt_t*)gsa_find_first(ul_net_f2gsa(net),&cmd);
+}
+
+ul_msg_filt_t*
+ul_mod_filt_find(ul_mod_info_t *mod, int cmd)
+{
+  return (ul_msg_filt_t*)gsa_find_first(ul_mod_f2gsa(mod),&cmd);
+}
+
+int
+ul_net_filt_to_drv(ul_net_info_t *net, int cmd, int adr)
+{
+  int res;
+  ul_msginfo msginfo;
+  int cmd_indx=cmd/8;
+  uchar cmd_msk=1<<(cmd%8);
+  if((cmd<0)||(cmd>0xff)) return -1;
+  if(net->filts_in_drv[cmd_indx]&cmd_msk) return 0;
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.cmd=cmd;
+  res=ul_addfilt(net->ul_fd,&msginfo);
+  if(res>=0)
+    net->filts_in_drv[cmd_indx]|=cmd_msk;
+  return res;
+}
+
+int
+ul_net_filt_test(ul_net_info_t *net, int cmd, int adr)
+{
+  return net->filts_in_drv[cmd/8]&(1<<(cmd%8));
+}
+
+int
+ul_net_filt_add(ul_net_info_t *net, ul_msg_filt_t *filt)
+{
+  int res;
+  filt->mod=NULL;
+  filt->net=NULL;
+  res=gsa_insert(ul_net_f2gsa(net),filt,2);
+  if(res>=0) {
+    filt->net=net;
+    ul_net_filt_to_drv(net,filt->filt_cmd,0);
+  }
+  return res;
+}
+
+int
+ul_mod_filt_add(ul_mod_info_t *mod, ul_msg_filt_t *filt)
+{
+  int res;
+  filt->mod=NULL;
+  filt->net=NULL;
+  res=gsa_insert(ul_mod_f2gsa(mod),filt,2);
+  if(res>=0) {
+    filt->mod=mod;
+    if(mod->net)
+      ul_net_filt_to_drv(mod->net,filt->filt_cmd,mod->mod_adr);
+  }
+  return res;
+}
+
+void
+ul_filt_detach(ul_msg_filt_t *filt)
+{
+  if(filt->net) gsa_delete(ul_net_f2gsa(filt->net),filt);
+  if(filt->mod) gsa_delete(ul_mod_f2gsa(filt->mod),filt);
+}
+
+int
+ul_net_mod_insert(ul_net_info_t *net, ul_mod_info_t *mod)
+{
+  int res;
+  res=gsa_insert(ul_net_m2gsa(net),mod,2);
+  if(res>=0)
+    mod->net=net;
+   else
+    mod->net=NULL;
+  return res;
+}
+
+int
+ul_net_mod_delete(ul_net_info_t *net, ul_mod_info_t *mod)
+{
+  mod->net=NULL;
+  return gsa_delete(ul_net_m2gsa(net),mod);
+}
+
+void
+ul_net_mod_print(ul_net_info_t *net)
+{
+  int mindx;
+  ul_mod_info_t *mod;
+  for(mindx=0;mindx<net->modules.count;mindx++){
+    mod=net->modules.items[mindx];
+    printf("%02d# %02d: %04lX\n",mindx,mod->mod_adr,mod->mod_sn);
+  }
+}
+
+int
+ul_net_rec_dispatch(ul_net_info_t *net, ul_msg_buf_t *msg_buf, ul_mevent_t *mevent,
+                    ul_msg_filt_gsa_t *filts, int cmd, int *frames)
+{
+  int           findx;
+  ul_msg_filt_t *filt;
+
+  if(!(filt=(ul_msg_filt_t*)gsa_find_indx((gsa_array_t*)filts,&cmd,&findx)))
+    return 0;
+  do{
+    if(!mevent->ev_type) return 2;
+    if(!(*frames)&&net)
+      if((*frames=ul_msg_buf_rd_rest(msg_buf,net->ul_fd))<=0) return -1;
+    filt->filt_fnc(filt,mevent,filt->context);
+    if(filt==filts->items[findx]) findx++;
+    if(findx>=filts->count) return 1;
+    filt=filts->items[findx];
+  }while(filt->filt_cmd==cmd);
+
+  return 1;
+}
+
+int
+ul_net_do_rec_msg(ul_net_info_t *net)
+{
+  ul_msg_buf_t  msg_buf;
+  ul_mevent_t   mevent;
+  int           frames=0;
+  int           mod_adr;
+  ul_mod_info_t *mod;
+  int           mindx;
+  int           ret=0;
+  
+  /* read message informations */
+  ul_msg_buf_init(&msg_buf);
+
+  if(ul_acceptmsg(net->ul_fd,&msg_buf.msginfo)<0){
+    ul_msg_buf_destroy(&msg_buf);
+    return -1;
+  }
+  
+  mevent.u.msg.buf=&msg_buf;
+  if(msg_buf.msginfo.flg&(UL_BFL_M2IN|UL_BFL_FAIL)){
+    mod_adr=msg_buf.msginfo.dadr;
+    mevent.ev_type=msg_buf.msginfo.flg&UL_BFL_FAIL?
+                        ULEV_MSG_ERR:ULEV_MSG_PROC;
+    mevent.ev_info=0;
+    
+    if((msg_buf.msginfo.dadr==msg_buf.msginfo.sadr)&&
+       (mevent.ev_type==ULEV_MSG_PROC))
+           mevent.ev_type=ULEV_MSG_REC;
+  }else{
+    mod_adr=msg_buf.msginfo.sadr;
+    mevent.ev_type=ULEV_MSG_REC;
+    mevent.ev_info=0;
+  }
+
+  /* process module registered filters */
+
+  if((mod=ul_net_mod_find_indx(net,mod_adr,&mindx))) do{
+    if(!mevent.ev_type) break;
+    if((ret=ul_net_rec_dispatch(net,&msg_buf,&mevent,&mod->msg_filts,
+                                msg_buf.msginfo.cmd,&frames))<0)
+      goto rd_error;
+      
+    if(msg_buf.msginfo.cmd!=0)
+      if((ret=ul_net_rec_dispatch(net,&msg_buf,&mevent,&mod->msg_filts,0,&frames))<0)
+        goto rd_error;
+        
+    if(mod==net->modules.items[mindx]) mindx++;
+    if(mindx>=net->modules.count) break;
+    mod=net->modules.items[mindx];
+  }while(mod->mod_adr==mod_adr);;
+
+  /* process network registered filters */
+
+  if(mevent.ev_type){
+    if((ret=ul_net_rec_dispatch(net,&msg_buf,&mevent,&net->msg_filts,
+                                msg_buf.msginfo.cmd,&frames))<0)
+      goto rd_error;
+    if(msg_buf.msginfo.cmd!=0)
+      if((ret=ul_net_rec_dispatch(net,&msg_buf,&mevent,&net->msg_filts,0,&frames))<0)
+        goto rd_error;
+  }
+  
+ rd_error:
+  
+  ul_msg_buf_destroy(&msg_buf);
+  ul_freemsg(net->ul_fd);
+  return ret;
+}
+
+int
+ul_mod_desc_set(ul_mod_info_t *mod, void *des_new, int des_len)
+{
+  char *des, *mt, *p;
+  int i;
+  if(!des_new) des_len=0;
+  else {
+    if(!des_len) des_len=strlen(des_new);
+    if(mod->mod_des){
+      if(strlen(mod->mod_des)<=des_len)
+        if(!strncmp(des_new,mod->mod_des,des_len))
+          return 0;
+    }
+  }
+  if(mod->mod_des) free(mod->mod_des);
+  mod->mod_des=NULL;
+  if(!des_new) return 0;
+  if((des=malloc(des_len+1))==NULL) return -1;
+  des[des_len]=0;
+  memcpy(des,des_new,des_len);
+  mod->mod_des=des;
+  if(mod->mod_type) free(mod->mod_type);
+  mod->mod_type=NULL;
+  p=strstr(des,".mt ");
+  if(!p) return 0;
+  p+=4;
+  for(i=0;p[i]>' ';i++);
+  if((mt=malloc(i+1))==NULL) return -1;
+  mt[i]=0;
+  memcpy(mt,p,i);
+  mod->mod_type=mt;
+  /*printf("mod_type \"%s\"\n",mt);*/
+  if(!(mod->flg&ULMI_DYADR)){
+    /* check if module supporting dynamic addressing has been found */
+    /* by manual request or by other mystery occasions */
+    p=des;
+    while(*p){
+      p=strstr(p,".dy");
+      if(!p) break;
+      p+=3;
+      if(!*p || *p==' '){
+        mod->flg|=ULMI_DYADR;
+       break;
+      }
+    }
+  }
+  return 1;
+}
+
+int
+ul_net_desc_rec(struct ul_msg_filt *filt,struct ul_mevent* event, void *context)
+{
+  int adr, len;
+  uchar *data;
+  ul_net_info_t *net=filt->net;  
+  ul_mod_info_t *mod;
+  switch(event->ev_type){
+    case ULEV_MSG_PROC:
+      if(!net) break;
+      adr=ul_msg_event_dadr(event);
+      if(!adr) break;
+      len=ul_msg_event_tail_len(event);
+      data=ul_msg_event_tail_data(event);
+      if((!len)||(!data)) break;
+      mod=ul_net_mod_find(net,adr);
+      if(!mod){
+        /* !!!!! */
+        break;
+      }
+      ul_mod_desc_set(mod,data,len);
+      break;
+  }
+  return 0;
+}
+
+int
+ul_net_query_desc(ul_net_info_t *net, int adr, int mode)
+{
+  int ret=0;
+  char c;
+  if(!net) return -1;
+  if(adr&&(mode&1)){
+    if(!ul_net_filt_test(net,UL_CMD_SID,0)){
+      if(!ul_net_filt_find(net,UL_CMD_SID)){
+        ul_msg_filt_t *filt;
+        /* initialize filters */
+        filt=malloc(sizeof(ul_msg_filt_t));
+        filt->filt_cmd=UL_CMD_SID;
+        filt->filt_fnc=ul_net_desc_rec;
+        if(ul_net_filt_add(net,filt)<0){
+          free(filt);
+          return -1;
+        }
+      }
+    }
+    ret=ul_send_query(net->ul_fd,adr,UL_CMD_SID,
+          UL_BFL_NORE|UL_BFL_PRQ,NULL,0);
+  }
+  if(mode&2){
+    c=ULNCS_SID_RQ;
+    ret=ul_send_command(net->ul_fd,adr,UL_CMD_NCS,
+                        UL_BFL_ARQ,&c,1);
+  }
+  return ret;
+}
+
+int
+ul_mod_adr_set(ul_mod_info_t *mod, int new_adr)
+{
+  ul_net_info_t *net=mod->net;
+  if(net)
+    ul_net_mod_delete(mod->net,mod);
+  mod->mod_adr=new_adr;
+  if(net)
+    return ul_net_mod_insert(net,mod);
+  return 0;
+}
+
+int
+ul_mod_net_set(ul_mod_info_t *mod, ul_net_info_t *net)
+{
+  if(mod->net)
+    ul_net_mod_delete(mod->net,mod);
+  if(net)
+    return ul_net_mod_insert(net,mod);
+  return 0;
+}
+
+int
+ul_mod_sn_set(ul_mod_info_t *mod, unsigned long new_sn)
+{
+  if(mod->mod_sn)
+    gsa_delete(ul_sn_array2gsa(),mod);
+  mod->mod_sn=new_sn;
+  if(new_sn)
+    return gsa_insert(ul_sn_array2gsa(),mod,0);;
+  return 0;
+}
+
+ul_mod_info_t *
+ul_mod_sn_find(unsigned long mod_sn)
+{
+  return  (ul_mod_info_t*) gsa_find(ul_sn_array2gsa(),&mod_sn);
+}
+
+int
+ul_mod_new(ul_mod_info_t **pmod, ul_net_info_t *net,
+           int mod_adr, unsigned long mod_sn, char *mod_des)
+{
+  ul_mod_info_t *mod;
+  if(pmod) *pmod=NULL;
+  mod=(ul_mod_info_t *)malloc(sizeof(ul_mod_info_t));
+  if(!mod) return -1;
+  memset(mod,0,sizeof(ul_mod_info_t));
+  ul_dbuff_init(&mod->mod_st0_buf,0);
+  ul_dbuff_init(&mod->mod_st1_buf,0);
+  mod->mod_adr=mod_adr;
+  mod->mod_sn=mod_sn;
+  if(mod_des) mod->mod_des=strdup(mod_des);
+  if(net) ul_net_mod_insert(net,mod);
+  if(mod_sn) gsa_insert(ul_sn_array2gsa(),mod,0);
+  if(pmod) *pmod=mod;
+  gsa_struct_init(ul_mod_f2gsa(mod),
+    UL_OFFSETOF(ul_msg_filt_t,filt_cmd), gsa_cmp_int);
+  return 1;
+}
+
+int
+ul_mod_static_add(ul_net_info_t *net,int adr,unsigned long mod_sn)
+{
+  ul_mod_info_t *mod;
+  if((mod=ul_mod_sn_find(mod_sn))==NULL){
+    if(ul_mod_new(&mod,net,adr,mod_sn,NULL)<0) return -1;
+    mod->flg=ULMI_STATIC;
+  } else return -2;
+  return 0;
+}
+
+void
+ul_mod_free(ul_mod_info_t *mod)
+{
+  int findx;
+  ul_msg_filt_t* filt;
+  ul_mevent_t mevent;
+  if(mod->mod_sn)
+    gsa_delete(ul_sn_array2gsa(),mod);
+  if(mod->net)
+    ul_net_mod_delete(mod->net,mod);
+  ul_dbuff_destroy(&mod->mod_st0_buf);
+  ul_dbuff_destroy(&mod->mod_st1_buf);
+  /* notify all filters */
+  findx=mod->msg_filts.count;
+  while(findx--){
+    filt=mod->msg_filts.items[findx];
+    mevent.ev_type=ULEV_MOD_FREE;
+    mevent.u.mod.mod=mod;
+    filt->filt_fnc(filt,&mevent,filt->context);
+    if(findx>mod->msg_filts.count)
+      findx=mod->msg_filts.count;
+     else
+      mod->msg_filts.count=findx;
+  }
+  gsa_delete_all(ul_mod_f2gsa(mod));
+  if(mod->mod_des) free(mod->mod_des);
+  if(mod->mod_type) free(mod->mod_type);
+  free(mod);
+}
+
+int
+ul_mod_static_remove(ul_net_info_t *net,unsigned long mod_sn)
+{
+  ul_mod_info_t *mod;
+  if((mod=ul_mod_sn_find(mod_sn))!=NULL){
+    ul_mod_free(mod);
+  } else return -2;
+  return 0;
+}
+
+inline void
+ul_dy_sn2buf(uchar *buf,unsigned long mod_sn)
+{
+  buf[0]=mod_sn>>0;
+  buf[1]=mod_sn>>8;
+  buf[2]=mod_sn>>16;
+  buf[3]=mod_sn>>24;
+}
+
+inline unsigned long
+ul_dy_buf2sn(const uchar *buf)
+{
+  unsigned long l;
+  l=(unsigned long)buf[0];
+  l+=(unsigned long)buf[1]<<8;
+  l+=(unsigned long)buf[2]<<16;
+  l+=(unsigned long)buf[3]<<24;
+  return l;
+}
+
+void
+ul_dy_cycle_start(ul_net_info_t *net)
+{
+  ul_send_command(net->ul_fd,0,UL_CMD_GST,UL_BFL_NORE|UL_BFL_PRQ,
+                  &ul_dy_cycle_subfn,1);  
+}
+
+int
+ul_dy_status_rq(ul_mod_info_t *mod, int subfn)
+{
+  uchar buf_out[8];
+  ul_net_info_t *net=mod->net;
+  if(!net) return -1;
+  if(!subfn) subfn=0x10;
+  buf_out[0]=subfn;
+  ul_dy_sn2buf(&buf_out[1],mod->mod_sn);
+  return ul_send_query(net->ul_fd,mod->mod_adr,UL_CMD_GST,
+                         UL_BFL_NORE|UL_BFL_PRQ,buf_out,5); 
+}
+
+void
+ul_dy_gen_rq(ul_net_info_t *net)
+{
+  int mindx;
+  int adr;
+  ul_mod_info_t *mod;
+  ul_dy_state_t *dy_state=net->dy_state;
+  if(!dy_state) return;
+
+  adr=dy_state->last_rq_adr;
+  ul_net_mod_find_indx(net,adr+1,&mindx);
+  for(;mindx<net->modules.count;mindx++){
+    if(dy_state->rq_max&&(dy_state->rq_count>=dy_state->rq_max))
+      return;
+    mod=net->modules.items[mindx];
+    if(mod->mod_adr==adr) continue;
+    adr=mod->mod_adr;
+    if((!mod->mod_st0_cmd)&&(!mod->mod_st1_cmd)){
+      if(!(mod->flg&ULMI_DYADR)) continue;
+      mod->mod_st0_cmd=0x10;
+    }
+    dy_state->last_rq_adr=adr;
+    if(mod->mod_st0_cmd) {
+      /*printf("ul_dy_gen_rq: q st0:%2d c:%2d\n",adr,dy_state->rq_count);*/
+      if(ul_dy_status_rq(mod,mod->mod_st0_cmd)>=0)
+        dy_state->rq_count++;
+      else {
+        dy_state->last_rq_adr=adr-1;
+        return;
+      }
+    }
+    if(mod->mod_st1_cmd) {
+      /*printf("ul_dy_gen_rq: q st1:%2d c:%2d\n",adr,dy_state->rq_count);*/
+      if(ul_dy_status_rq(mod,mod->mod_st1_cmd)>=0)
+        dy_state->rq_count++;
+    }
+  }
+  dy_state->last_rq_adr=0;      /* all requests found */
+}
+
+void
+ul_dy_dec_rq(ul_net_info_t *net)
+{
+  ul_dy_state_t *dy_state=net->dy_state;
+  if(!dy_state) return;
+  if(dy_state->rq_count>0) dy_state->rq_count--;
+  /*printf("ul_dy_dec_rq:\n");*/
+  if(!dy_state->last_rq_adr) return;
+  if(dy_state->rq_max&&(dy_state->rq_count>=dy_state->rq_max))
+    return;
+  ul_dy_gen_rq(net);
+}
+
+int 
+ul_dy_set_adr(ul_mod_info_t *mod, int new_adr)
+{ int ret;
+  int old_adr=0;
+  uchar buf_out[8];
+  unsigned long mod_sn=mod->mod_sn;
+  ul_net_info_t *net=mod->net;
+  if(!net) return -1;
+  if(mod_sn==0) old_adr=mod->mod_adr;
+  buf_out[0]=ULNCS_SET_ADDR;    /* SN0 SN1 SN2 SN3 NEW_ADR */
+  ul_dy_sn2buf(&buf_out[1],mod_sn);
+  buf_out[5]=new_adr;
+  ret=ul_send_command(net->ul_fd,old_adr,UL_CMD_NCS,
+                      old_adr?UL_BFL_ARQ:0,buf_out,6);
+  return ret;
+}
+
+
+void 
+ul_dy_do_timer(unsigned long data)
+{
+  int mindx;
+  int adr=0;
+  int pri;
+  int askdes_adr=0;
+  int askdes_pri=0;
+  ul_htim_time_t next_expire;
+  ul_mod_info_t *askdes_mod=NULL;
+  ul_dy_state_t *dy_state=(ul_dy_state_t*)data;
+  ul_net_info_t *net=dy_state->net;
+  ul_mod_info_t *mod;
+  if(!net) return;
+  if(!dy_state->last_rq_adr) {
+    ul_dy_cycle_start(net);
+  } else {
+    dy_state->flg|=ULDY_CYOVR;
+  }
+  ul_dy_gen_rq(net);
+  /* send deffered requests for module description */
+  for(mindx=0;mindx<net->modules.count;mindx++){
+    mod=net->modules.items[mindx];
+    if(mod->mod_adr==adr) continue;
+    adr=mod->mod_adr;
+    if((pri=mod->flg&ULMI_ASKDES)>askdes_pri){
+      if(mod->mod_des){
+        mod->flg&=~ULMI_ASKDES;
+      }else{
+        askdes_pri=pri;
+        askdes_adr=adr;
+          askdes_mod=mod;
+      }
+    }
+  }
+  if(askdes_adr){
+    askdes_mod->flg-=ULMI_ASKDES_MIN;
+    ul_net_query_desc(net,askdes_adr,3);
+  }
+  next_expire=ul_htimer_get_expire(&dy_state->timer);
+  next_expire+=dy_state->period;
+  if((ul_msdiff_t)(next_expire-ul_mstime_last)<=0)
+    next_expire=ul_mstime_last+1;
+  ul_htimer_set_expire(&dy_state->timer,next_expire);
+  ul_timer_add(&dy_state->timer);
+}
+
+int
+ul_dy_ncs_adr_rq(ul_net_info_t *net, int *padr,
+                 unsigned long mod_sn, int first_dy_adr)
+{
+  int new_adr;
+  int mindx;
+  int adr=*padr;
+  ul_mod_info_t *mod, *mod_sa;
+  if((!mod_sn)||(mod_sn==0xffffffff)) return -1;
+  if((mod=ul_mod_sn_find(mod_sn))==NULL){
+    if(ul_mod_new(&mod,net,adr,mod_sn,NULL)<0) return -1;
+  }
+  mod_sa=ul_net_mod_find(net,adr);
+  if(!mod->mod_des){
+    mod->flg|=ULMI_ASKDES;
+  }
+  if(mod_sa==mod){
+    if((adr>0)&&(adr<99)){
+      ul_dy_set_adr(mod,adr);
+      mod->flg|=ULMI_DYADR;
+      return 1;
+    }
+  }
+ #ifdef DEBUG
+  printf("\nul_dy_ncs_adr_rq: before readdress\n");
+  ul_net_mod_print(net);
+ #endif /*DEBUG*/
+  if((mod->flg&ULMI_STATIC)&&(mod->net==net)){
+    new_adr=mod->mod_adr;
+    ul_dy_set_adr(mod,new_adr);
+    mod->flg|=ULMI_DYADR;
+   #ifdef DEBUG
+    printf("\nul_dy_ncs_adr_rq: static assigment address:%d\n",mod->mod_adr);
+    ul_net_mod_print(net);
+   #endif /*DEBUG*/
+    *padr=new_adr;
+    ul_stat_st_adr_req(net->statistics);
+    return 1;
+  }
+  if(mod->net)
+    ul_net_mod_delete(mod->net,mod);
+ #ifdef DEBUG
+  printf("\nul_dy_ncs_adr_rq: after delete\n");
+  ul_net_mod_print(net);
+ #endif /*DEBUG*/
+  if(mod->flg&ULMI_STATIC){
+   #ifdef DEBUG
+    printf("\nul_dy_ncs_adr_rq: module with STATIC flag has moved between networks\n");
+   #endif /*DEBUG*/
+    mod->flg&=~ULMI_STATIC;
+  }
+  /* resolve free address on net for module */
+  if((mod_sa==NULL)&&(adr>0)&&(adr<99)) {
+    new_adr=adr;
+  }else{
+    new_adr=first_dy_adr;
+    ul_net_mod_find_indx(net,new_adr,&mindx);
+   #ifdef DEBUG
+    printf("ul_dy_ncs_adr_rq: mindx=%d modules=%d\n",mindx,net->modules.count);
+   #endif /*DEBUG*/
+    while(mindx<net->modules.count){
+     #ifdef DEBUG
+      printf("ul_dy_ncs_adr_rq: mindx=%d adr=%d\n",mindx,
+                        net->modules.items[mindx]->mod_adr);
+     #endif /*DEBUG*/
+      if(new_adr<net->modules.items[mindx]->mod_adr) break;
+      if(new_adr==net->modules.items[mindx]->mod_adr) {
+        if(++new_adr>=99) { new_adr=0; break; }
+      }
+      mindx++;
+    }
+  }
+ #ifdef DEBUG
+  printf("ul_dy_ncs_adr_rq: mod_sn=%06lX new_adr=%02d\n",mod_sn, new_adr);
+ #endif /*DEBUG*/
+  ul_mod_adr_set(mod,new_adr);
+  ul_net_mod_insert(net,mod);
+  ul_dy_set_adr(mod,new_adr);
+  mod->flg|=ULMI_DYADR;
+ #ifdef DEBUG
+  printf("\nul_dy_ncs_adr_rq: after readdress\n");
+  ul_net_mod_print(net);
+ #endif /*DEBUG*/
+  *padr=new_adr;
+  ul_stat_dy_adr_asg(net->statistics);
+  return new_adr?1:-1;
+}
+
+int 
+ul_dy_ncs_rec(struct ul_msg_filt *filt,struct ul_mevent* event, void *context)
+{
+  int adr, subfn, len;
+  uchar *data;
+  /* ul_mod_info_t *mod; */
+  unsigned long mod_sn;
+  ul_dy_state_t *dy_state=(ul_dy_state_t*)context;
+  ul_net_info_t *net=dy_state->net;
+  if(!net) return 0;
+  switch(event->ev_type){
+    case ULEV_MSG_REC:
+      adr=ul_msg_event_sadr(event);
+      len=ul_msg_event_len(event);
+      data=ul_msg_event_data(event);
+      if((len<5)||(!data)) break;
+      subfn=data[0];
+      /*printf("ul_dy_ncs_rec: rec:%2d c:%2d\n",adr,dy_state->rq_count);        */
+      mod_sn=ul_dy_buf2sn(data+1);
+      switch(subfn){
+        case ULNCS_ADR_RQ:
+          if(ul_dy_ncs_adr_rq(net,&adr,mod_sn,
+             dy_state->first_dy_adr)<0) break;
+          ul_net_query_desc(net,adr,3);
+          break;
+      }
+      break;
+  }
+  return 0;
+}
+
+int 
+ul_dy_gst_proc(struct ul_msg_filt *filt,struct ul_mevent* event, void *context)
+{
+  int adr, subfn;
+  int len, tail_len;
+  uchar *data, *tail_data;
+  ul_mod_info_t *mod;
+  unsigned long mod_sn;
+  ul_dy_state_t *dy_state=(ul_dy_state_t*)context;
+  ul_net_info_t *net=dy_state->net;
+  switch(event->ev_type){
+    case ULEV_MSG_PROC:
+      ul_dy_dec_rq(net);
+      adr=ul_msg_event_dadr(event);
+      len=ul_msg_event_len(event);
+      data=ul_msg_event_data(event);
+      tail_len=ul_msg_event_tail_len(event);
+      tail_data=ul_msg_event_tail_data(event);
+      mod=ul_net_mod_find(net,adr);
+      if(!mod) break;
+      if((len<5)||(!data)) break;
+      subfn=data[0];
+      if((tail_len<4)||(!tail_data)) break;
+      mod_sn=ul_dy_buf2sn(tail_data);
+      if(mod_sn!=mod->mod_sn) break;
+      /* !!! mark module Present !!! */
+
+      tail_len-=4; tail_data+=4;
+      if(subfn==mod->mod_st0_cmd) {
+        if(ul_dbuff_prep(&mod->mod_st0_buf,tail_len)<tail_len) break;
+        memcpy(mod->mod_st0_buf.data,tail_data,tail_len);
+        mod->mod_st0_mstime=ul_mstime_last;
+        if(mod->mod_des) mod->flg|=ULMI_PRESENT;
+        mod->st_err_cnt=0;
+      } else if(subfn==mod->mod_st1_cmd) {
+        if(ul_dbuff_prep(&mod->mod_st1_buf,tail_len)<tail_len) break;
+        memcpy(mod->mod_st1_buf.data,tail_data,tail_len);
+        mod->mod_st1_mstime=ul_mstime_last;
+      } 
+      break;
+             
+    case ULEV_MSG_ERR: 
+      ul_dy_dec_rq(net);
+      adr=ul_msg_event_dadr(event);
+      len=ul_msg_event_len(event);
+      data=ul_msg_event_data(event);
+      mod=ul_net_mod_find(net,adr);
+      if(!mod) break;
+      if(mod->st_err_cnt>50) break;
+      mod->st_err_cnt++;
+      if((mod->st_err_cnt>=4)&&(mod->flg&ULMI_PRESENT)){
+        mod->flg&=~ULMI_PRESENT;
+        mod->flg&=~ULMI_DISCON;
+       /* !!! notify app !!! */
+      }
+      if(mod->st_err_cnt>=10){
+        if(mod->flg&ULMI_DYADR){
+          ul_net_mod_delete(net,mod);
+        }
+      }
+      break;
+  }
+  
+  return 0;
+}
+
+
+int ul_net_dy_init(ul_net_info_t *net)
+{
+  ul_dy_state_t *dy_state;
+  ul_net_stat_t *stat;
+  
+  if(net->dy_state) return -1;
+
+  /* dy state */
+  dy_state=malloc(sizeof(ul_dy_state_t));
+  memset(dy_state,0,sizeof(ul_dy_state_t));
+  dy_state->net=net;
+  net->dy_state=dy_state;
+  dy_state->first_dy_adr=10;
+  dy_state->period=2000;
+  dy_state->rq_max=UL_DY_RQ_MAX;
+  dy_state->last_rq_adr=0;
+  dy_state->rq_count=0;
+  dy_state->flg=0;
+
+  /* statistic */
+  if(!net->statistics){
+    stat=malloc(sizeof(ul_net_stat_t));
+    memset(stat,0,sizeof(ul_net_stat_t));
+    stat->net=net;
+    net->statistics=stat;
+    time(&stat->start_time);
+    stat->dy_adr_asg_cnt=0;
+    stat->st_adr_req_cnt=0;
+  }
+
+  /* initialize timer */
+  ul_htimer_set_expire(&dy_state->timer,ul_mstime_last);
+  dy_state->timer.function=ul_dy_do_timer;
+  dy_state->timer.data=(unsigned long)dy_state;
+  ul_timer_add(&dy_state->timer);
+
+  /* initialize filters */
+  dy_state->ncs_filt.filt_cmd=UL_CMD_NCS;
+  dy_state->ncs_filt.filt_fnc=ul_dy_ncs_rec;
+  dy_state->ncs_filt.context=dy_state;
+  ul_net_filt_add(net,&dy_state->ncs_filt);
+
+  dy_state->gst_filt.filt_cmd=UL_CMD_GST;
+  dy_state->gst_filt.filt_fnc=ul_dy_gst_proc;
+  dy_state->gst_filt.context=dy_state;
+  ul_net_filt_add(net,&dy_state->gst_filt);  
+  return 1;
+}
+
+
diff --git a/ulan/host/libs4c/ulcintf/ul_netbase.h b/ulan/host/libs4c/ulcintf/ul_netbase.h
new file mode 100644 (file)
index 0000000..0f15cd1
--- /dev/null
@@ -0,0 +1,248 @@
+/*******************************************************************
+  uLan Communication - C interface library
+
+  ul_netbase.c - basic network and module constructions
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  (C) Copyright 2002-2004 by Pavel Pisa - Originator
+
+  The uLan C interface library can be used, copied and modified
+  under next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_NETBASE_H
+#define _UL_NETBASE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h>
+#include <ul_lib/ulan.h>
+#include <ul_utdefs.h>
+#include <ul_gsa.h>
+#include <ul_dbuff.h>
+#include <ul_htimer.h>
+#include <ul_msg_buf.h>
+
+static inline int
+ul_timer_add(ul_htimer_t *timer)
+{
+  return ul_htimer_add(&ul_root_htimer, timer);
+}
+
+static inline int
+ul_timer_detach(ul_htimer_t *timer)
+{
+  return ul_htimer_detach(&ul_root_htimer, timer);
+}
+
+struct ul_net_info;
+struct ul_mod_info;
+struct ul_dy_state;
+struct ul_msg_filt;
+struct ul_msg_buf;
+struct ul_mevent;
+struct ul_net_stat;
+
+typedef int ul_msg_filt_fnc_t(struct ul_msg_filt *filt, struct ul_mevent* event, void *context);
+        
+typedef struct ul_msg_filt {
+  int          filt_cmd;       /* command/message type to filter, 0=all */
+  ul_msg_filt_fnc_t *filt_fnc; /* function to call */
+  struct ul_net_info *net;     /* net, where is filter or module is registered */
+  struct ul_mod_info *mod;     /* module ptr if per module, else NULL */
+  void         *context;       /* user usable context */
+} ul_msg_filt_t;
+
+typedef GSA_ARRAY_FOR(ul_msg_filt_t) ul_msg_filt_gsa_t;
+
+#define ULEV_MSG_REC   0x10    /* message has been received */
+#define ULEV_MSG_PROC  0x11    /* outgoing message has been transmitted */
+#define ULEV_MSG_ERR   0x12    /* message has failed to be transmitted */
+#define ULEV_MOD_FREE  0x13    /* module is going to be discarded */
+
+typedef struct ul_mevent {
+  int          ev_type;
+  long         ev_info;
+  union        {
+    struct{
+      ul_msg_buf_t *buf;
+    } msg;
+    struct{
+      struct ul_mod_info *mod;
+    } mod;
+  } u;
+} ul_mevent_t;
+
+#define ULMI_DYADR   0x010     /* module supports dynamic addressing */
+#define ULMI_PRESENT 0x020     /* module responds to status check */
+#define ULMI_DISCON  0x040     /* for disconnection processing */
+#define ULMI_STATIC  0x080     /* module has assigned static address */
+#define ULMI_ASKDES  0x300     /* priority of ask for description */
+
+/* minimal step of ask description priority */
+#define ULMI_ASKDES_MIN ULMI_ASKDES&(~(ULMI_ASKDES<<1))
+
+typedef struct ul_mod_info {   /* module state information structure */
+  int          flg;
+  int          mod_adr;
+  unsigned long mod_sn;
+  struct ul_net_info* net;
+  int          mod_state;
+  char         *mod_des;
+  char         *mod_type;
+  int          err_cnt;
+  int          st_err_cnt;
+  ul_mstime_t  mod_st0_mstime;
+  ul_mstime_t  mod_st1_mstime;
+  int          mod_st0_cmd;
+  int          mod_st1_cmd;
+  ul_dbuff_t   mod_st0_buf;
+  ul_dbuff_t   mod_st1_buf;
+  ul_msg_filt_gsa_t msg_filts;
+  void         *mod_log;
+} ul_mod_info_t;
+
+typedef struct ul_net_info {
+  GSA_ARRAY_FOR(ul_mod_info_t) modules;
+  char         *dev_name;
+  ul_fd_t      ul_fd;
+  struct ul_dy_state *dy_state;
+  ul_msg_filt_gsa_t msg_filts;
+  uchar                filts_in_drv[32];
+  struct ul_net_stat *statistics;
+} ul_net_info_t;
+
+#define ULDY_CYOVR   0x010
+
+typedef struct ul_dy_state {
+  int          flg;
+  int          first_dy_adr;
+  ul_net_info_t        *net;
+  ul_htimer_t  timer;
+  int          period;
+  int          last_rq_adr;
+  int          rq_count;
+  int          rq_max;
+  ul_msg_filt_t        ncs_filt;
+  ul_msg_filt_t        gst_filt;
+} ul_dy_state_t;
+
+typedef struct ul_net_stat {   /* net statistic structure */
+  ul_net_info_t        *net;
+  time_t       start_time;
+  int          dy_adr_asg_cnt;  /* dynamic address assigment */
+  time_t       dy_adr_asg_last;
+  int          st_adr_req_cnt;  /* static address request */
+  time_t       st_adr_req_last;  
+} ul_net_stat_t;
+
+int ul_dy_cycle_subfn;
+
+GSA_ARRAY_FOR(ul_mod_info_t) ul_sn_array;
+
+static inline gsa_array_t *
+ul_mod_f2gsa(ul_mod_info_t *mod)
+{
+  return (gsa_array_t *)&mod->msg_filts;
+}
+
+static inline gsa_array_t *
+ul_net_m2gsa(ul_net_info_t *net)
+{
+  return (gsa_array_t *)&net->modules;
+}
+
+static inline gsa_array_t *
+ul_net_f2gsa(ul_net_info_t *net)
+{
+  return (gsa_array_t *)&net->msg_filts;
+}
+
+static inline gsa_array_t *
+ul_sn_array2gsa(void)
+{
+  return (gsa_array_t *)&ul_sn_array;
+}
+
+static inline int
+ul_msg_event_dadr(ul_mevent_t *event)
+{
+  return event->u.msg.buf->msginfo.dadr;
+}
+
+static inline int
+ul_msg_event_sadr(ul_mevent_t *event)
+{
+  return event->u.msg.buf->msginfo.sadr;
+}
+
+static inline int
+ul_msg_event_len(ul_mevent_t *event)
+{
+  return event->u.msg.buf->msginfo.len;
+}
+
+static inline uchar * 
+ul_msg_event_data(ul_mevent_t *event)
+{
+  return event->u.msg.buf->data.data;
+}
+
+static inline int
+ul_msg_event_tail_len(ul_mevent_t *event)
+{
+  ul_msg_buf_t *msg_buf=event->u.msg.buf;
+  if(msg_buf->tail) return msg_buf->tail->msginfo.len;
+  return 0;
+}
+
+static inline uchar *
+ul_msg_event_tail_data(ul_mevent_t *event)
+{
+  ul_msg_buf_t *msg_buf=event->u.msg.buf;
+  if(msg_buf->tail) return msg_buf->tail->data.data;
+  return NULL;
+}
+
+int ul_net_new(ul_net_info_t **pnet, char *dev_name);
+ul_mod_info_t *ul_net_mod_find(ul_net_info_t *net, int adr);
+ul_msg_filt_t *ul_mod_filt_find(ul_mod_info_t *mod, int cmd);
+int ul_net_filt_add(ul_net_info_t *net, ul_msg_filt_t *filt);
+int ul_mod_filt_add(ul_mod_info_t *mod, ul_msg_filt_t *filt);
+void ul_filt_detach(ul_msg_filt_t *filt);
+int ul_net_mod_insert(ul_net_info_t *net, ul_mod_info_t *mod);
+int ul_net_mod_delete(ul_net_info_t *net, ul_mod_info_t *mod);
+void ul_net_mod_print(ul_net_info_t *net);
+int ul_net_do_rec_msg(ul_net_info_t *net);
+int ul_mod_desc_set(ul_mod_info_t *mod, void *des_new, int des_len);
+int ul_net_query_desc(ul_net_info_t *net, int adr, int mode);
+ul_mod_info_t *ul_mod_sn_find(unsigned long mod_sn);
+int ul_mod_new(ul_mod_info_t **pmod, ul_net_info_t *net,
+           int mod_adr, unsigned long mod_sn, char *mod_des);
+void ul_mod_free(ul_mod_info_t *mod);
+int ul_mod_static_add(ul_net_info_t *net,int adr,unsigned long mod_sn);
+int ul_mod_static_remove(ul_net_info_t *net,unsigned long mod_sn);
+
+
+int ul_net_dy_init(ul_net_info_t *net);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_NETBASE_H */
diff --git a/ulan/host/libs4c/ulevloop/CVS/Entries b/ulan/host/libs4c/ulevloop/CVS/Entries
new file mode 100644 (file)
index 0000000..9b138ef
--- /dev/null
@@ -0,0 +1,8 @@
+/Makefile/1.1/Wed May 28 11:53:42 2008//
+/Makefile.omk/1.1/Wed May 28 11:53:42 2008//
+/ul_evp_sysvpoll.c/1.1/Wed May 28 11:53:43 2008//
+/ul_evp_sysvpoll.h/1.1/Wed May 28 11:53:43 2008//
+/ul_evpchk.c/1.1/Wed May 28 11:53:43 2008//
+/ul_evpoll.c/1.1/Wed May 28 11:53:43 2008//
+/ul_evpoll.h/1.1/Wed May 28 11:53:43 2008//
+D
diff --git a/ulan/host/libs4c/ulevloop/CVS/Repository b/ulan/host/libs4c/ulevloop/CVS/Repository
new file mode 100644 (file)
index 0000000..7467f4e
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/libs4c/ulevloop
diff --git a/ulan/host/libs4c/ulevloop/CVS/Root b/ulan/host/libs4c/ulevloop/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/libs4c/ulevloop/Makefile b/ulan/host/libs4c/ulevloop/Makefile
new file mode 100644 (file)
index 0000000..142cc88
--- /dev/null
@@ -0,0 +1,14 @@
+# Generic directory or leaf node makefile for OCERA make framework
+
+ifndef MAKERULES_DIR
+MAKERULES_DIR := $(shell ( old_pwd="" ;  while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd`  ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) )
+endif
+
+ifeq ($(MAKERULES_DIR),)
+all : default
+.DEFAULT::
+       @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n"
+else
+include $(MAKERULES_DIR)/Makefile.rules
+endif
+
diff --git a/ulan/host/libs4c/ulevloop/Makefile.omk b/ulan/host/libs4c/ulevloop/Makefile.omk
new file mode 100644 (file)
index 0000000..cb233c5
--- /dev/null
@@ -0,0 +1,13 @@
+lib_LIBRARIES = ulevpoll
+
+#shared_LIBRARIES = ul_evloop
+
+include_HEADERS  = ul_evpoll.h
+
+ulevpoll_SOURCES = ul_evpoll.c ul_evp_sysvpoll.c
+
+lib_LOADLIBES = ulevpoll ulut
+
+utils_PROGRAMS = ul_evpchk
+
+ul_evpchk_SOURCES = ul_evpchk.c
diff --git a/ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.c b/ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.c
new file mode 100644 (file)
index 0000000..e42487a
--- /dev/null
@@ -0,0 +1,567 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evpsimple.c       - monitoring of open file handles
+
+  (C) Copyright 2005-2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+
+#include <poll.h>
+
+#include "ul_evpoll.h"
+#include "ul_evp_sysvpoll.h"
+
+#include <ul_log.h>
+
+extern UL_LOG_CUST(ulogd_evpoll);
+
+UL_HTIMER_DEC(ul_evpsimple_htimer, ul_evpbase_simple_t, ul_evptrig_simple_t, \
+             htim_queue, htim)
+
+UL_HTIMER_IMP(ul_evpsimple_htimer, ul_evpbase_simple_t, ul_evptrig_simple_t, \
+             htim_queue, htim)
+
+#ifdef UL_HTIMER_WITH_MSTIME
+
+ul_htim_time_t ul_evpsimple_get_current_time(ul_evpbase_t *base)
+{
+  ul_mstime_t mstm;
+  ul_mstime_now(&mstm);
+  return mstm;
+}
+
+#endif /*UL_HTIMER_WITH_MSTIME*/
+
+static inline ul_htim_time_t ul_evpsimple_next_timeout(ul_evpbase_t *base, ul_htim_diff_t *timeout)
+{
+  return ul_evpoll_get_current_time(base) + *timeout;
+}
+
+static int ul_evpsimple_resize_pollfd_array(ul_evpbase_simple_t *eb, int count)
+{
+  ul_evptrig_simple_t **trig_array;
+  struct pollfd *pollfd_array;
+
+  int capacity = eb->pollfd_capacity;
+  if(!eb->pollfd_array || !eb->trig_array)
+    capacity = 0;
+
+  if(count+4 < capacity/2) {
+    capacity /= 2;
+  } else if(count > capacity) {
+    if(count < 8)
+      capacity = 8;
+    else
+      capacity = (count + capacity/4 + 7) & ~7;
+  }
+
+  if(!eb->trig_array)
+    trig_array = malloc(capacity * sizeof(*eb->trig_array));
+  else
+    trig_array = realloc(eb->trig_array, capacity * sizeof(*eb->trig_array));
+
+  if(trig_array)
+    eb->trig_array = trig_array;
+  else
+    return -1;
+
+  if(!eb->pollfd_array)
+    pollfd_array = malloc(capacity * sizeof(*eb->pollfd_array));
+  else
+    pollfd_array = realloc(eb->pollfd_array, capacity * sizeof(*eb->pollfd_array));
+
+  if(pollfd_array)
+    eb->pollfd_array = pollfd_array;
+  else
+    return -1;
+
+  eb->pollfd_capacity = capacity;
+
+  return 0;
+}
+
+static inline int ul_evpsimple_is_fd(ul_evptrig_simple_t *ei)
+{
+  return (ei->what_events & (UL_EVP_READ | UL_EVP_WRITE)) && (ei->fd >= 0);
+}
+
+static inline void ul_evpsimple_sync_pollfd_array(ul_evpbase_simple_t *eb)
+{
+  int i;
+  struct pollfd *ff, *fr;
+  ul_evptrig_simple_t **ef, **er, *ei;
+  int new_count = eb->activefd_count;
+  int old_count = eb->pollfd_count;
+
+  eb->need_resync = 0;
+
+  ul_logdeb("ul_evpsimple_sync_pollfd_array: old_count %d new_count %d\n",
+            old_count, new_count);
+
+  if(new_count > old_count) {
+    if(ul_evpsimple_resize_pollfd_array(eb, new_count)<0){
+      ul_logerr("ul_evpsimple_sync_pollfd_array: resize failed\n");
+      return;
+    }
+  }
+
+  i = 0;
+  ef = eb->trig_array;
+  ff = eb->pollfd_array;
+
+  if(old_count > 0) {
+    /* pack sparse arrays first */
+    er = ef + old_count;
+    fr = ff + old_count;
+
+    for(;ef != er; ef++, ff++, i++) {
+      if(*ef)
+        continue;
+      do {
+        er--;
+       fr--;
+      } while(!*er && (ef != er));
+
+      if(ef == er) {
+        break;
+      }
+      ei = *er;
+      ei->idx = i;
+      *ef = ei;
+      *ff = *fr;
+    }
+  }
+
+  eb->pollfd_count = ef - eb->trig_array;
+
+  er = eb->trig_array + new_count;
+  for(ei = ul_evpsimple_active_last(eb); ei; ei = ul_evpsimple_active_prev(eb, ei)) {
+    if(ei->idx != -1)
+      break;
+
+    if(!ul_evpsimple_is_fd(ei)){
+      ei->idx = -2;
+      continue;
+    }
+
+    if(ef == er) {
+      ul_logfatal("ul_evpsimple_sync_pollfd_array: new_count too small for fds\n");
+      return;
+    }
+
+    ul_logdeb("ul_evpsimple_sync_pollfd_array: adding fd %d\n", ei->fd);
+
+    ff->fd = ei->fd;
+    ff->revents = 0;
+    ff->events = 0;
+    if(ei->what_events & UL_EVP_READ) ff->events |= POLLIN;
+    if(ei->what_events & UL_EVP_WRITE) ff->events |= POLLOUT;
+    ei->idx = i;
+    *ef = ei;
+
+    ef++, ff++, i++;
+  }
+
+  if(new_count < old_count) {
+    if(ul_evpsimple_resize_pollfd_array(eb, new_count)<0){
+      ul_logfatal("ul_evpsimple_sync_pollfd_array: shrinking failed\n");
+    }
+  }
+  if(ef - eb->trig_array != new_count) {
+    ul_logerr("ul_evpsimple_sync_pollfd_array: new_count %d but array size is %d\n",
+               new_count, ef - eb->trig_array);
+  }
+  eb->pollfd_count = ef - eb->trig_array;
+}
+
+static inline void ul_evpsimple_arm_internal(ul_evpbase_simple_t *eb,
+                                 ul_evptrig_simple_t *ei)
+{
+  ei->idx = -1;
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED) {
+    ul_logerr("ul_evpsimple_arm_internal: tring to arm armed evptrig\n");
+    return;
+  }
+
+  ul_evpsimple_idle_delete(eb, ei);
+  ei->flags |= UL_EVPSIMPLE_ARMED;
+  ul_evpsimple_active_insert(eb, ei);
+
+  if(ul_evpsimple_is_fd(ei)) {
+    eb->activefd_count++;
+    eb->need_resync = 1;
+  }
+}
+
+static inline void ul_evpsimple_disarm_internal(ul_evpbase_simple_t *eb,
+                                 ul_evptrig_simple_t *ei)
+{
+  if(!(ei->flags & UL_EVPSIMPLE_ARMED)) {
+    ul_logerr("ul_evpsimple_arm_internal: tring to disarm idle evptrig\n");
+    return;
+  }
+
+  if(ei->idx >= 0)
+     eb->trig_array[ei->idx] = NULL;
+
+  if(ul_evpsimple_is_fd(ei)) {
+    eb->activefd_count--;
+    eb->need_resync = 1;
+  }
+
+  ul_evpsimple_active_delete(eb, ei);
+  ei->flags &= ~UL_EVPSIMPLE_ARMED;
+  ul_evpsimple_idle_insert(eb, ei);
+}
+
+
+static int ul_evpsimple_trig_init(ul_evpbase_t *base, ul_evptrig_t *evptrig)
+{
+  ul_evptrig_simple_t *ei;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(base, ul_evpbase_simple_t, base);
+
+  evptrig->cb = NULL;
+  evptrig->base = base;
+  evptrig->impl_data = (ul_evptrig_simple_t*)malloc(sizeof(ul_evptrig_simple_t));
+  if(!evptrig->impl_data) {
+    ul_logerr("ul_evpsimple_trig_init: malloc failed\n");
+    return -1;
+  }
+  ei = evptrig->impl_data;
+  memset(ei, 0, sizeof(ul_evptrig_simple_t));
+  ei->fd = -1;
+
+  ul_evpsimple_htimer_init_detached(ei);
+
+  ei->trig_ptr = evptrig;
+
+  ul_evpsimple_idle_insert(eb, ei);
+
+  return 0;
+}
+
+static void ul_evpsimple_trig_done(ul_evptrig_t *evptrig)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+
+  if(!ei)
+    return;
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED)
+    ul_evptrig_disarm(evptrig);
+
+  ul_evpsimple_idle_del_item(ei);
+
+  free(ei);
+
+  evptrig->impl_data = NULL;
+}
+
+static int ul_evpsimple_trig_set_fd(ul_evptrig_t *evptrig, ul_evfd_t fd, int what)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED) {
+    ul_evpbase_simple_t *eb = UL_CONTAINEROF(evptrig->base, ul_evpbase_simple_t, base);
+    ul_evpsimple_disarm_internal(eb, ei);
+    ei->fd = fd;
+    ei->what_events = what;
+    ul_evpsimple_arm_internal(eb, ei);
+  } else {
+    ei->fd = fd;
+    ei->what_events = what;
+  }
+  return 0;
+}
+
+static int ul_evpsimple_trig_set_time(ul_evptrig_t *evptrig, ul_htim_time_t *time)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(evptrig->base, ul_evpbase_simple_t, base);
+
+  if((ei->flags & UL_EVPSIMPLE_ARMED) &&
+     (ei->flags & UL_EVPSIMPLE_TIMED))
+    ul_evpsimple_htimer_detach(eb, ei);
+
+  ei->flags &= ~(UL_EVPSIMPLE_TIMED | UL_EVPSIMPLE_TIMEOUT | UL_EVPSIMPLE_PERIODIC);
+
+  if(!time)
+    return 0;
+
+  ul_evpsimple_htimer_set_expire(ei, *time);
+
+  ei->flags |= UL_EVPSIMPLE_TIMED;
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED)
+    ul_evpsimple_htimer_add(eb, ei);
+
+  return 0;
+}
+
+static int ul_evpsimple_trig_set_timeout(ul_evptrig_t *evptrig, ul_htim_diff_t *timeout)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(evptrig->base, ul_evpbase_simple_t, base);
+
+  if((ei->flags & UL_EVPSIMPLE_ARMED) &&
+     (ei->flags & UL_EVPSIMPLE_TIMED))
+    ul_evpsimple_htimer_detach(eb, ei);
+
+  ei->flags &= ~(UL_EVPSIMPLE_TIMED | UL_EVPSIMPLE_TIMEOUT | UL_EVPSIMPLE_PERIODIC);
+
+  if(!timeout)
+    return 0;
+
+  ei->timeout = *timeout;
+
+  ei->flags |= UL_EVPSIMPLE_TIMED | UL_EVPSIMPLE_TIMEOUT;
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED) {
+    ul_evpsimple_htimer_set_expire(ei, ul_evpsimple_next_timeout(&eb->base, &ei->timeout));
+    ul_evpsimple_htimer_add(eb, ei);
+  }
+
+  return 0;
+}
+
+static int ul_evpsimple_trig_set_callback(ul_evptrig_t *evptrig, ul_evpoll_cb_t cb)
+{
+  evptrig->cb = cb;
+  return 0;
+}
+
+static int ul_evpsimple_trig_arm(ul_evptrig_t *evptrig)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(evptrig->base, ul_evpbase_simple_t, base);
+
+  if(ei->flags & UL_EVPSIMPLE_ARMED)
+    return 0;
+
+  if(ei->flags & UL_EVPSIMPLE_TIMEOUT)
+    ul_evpsimple_htimer_set_expire(ei, ul_evpsimple_next_timeout(&eb->base, &ei->timeout));
+
+  if(ei->flags & UL_EVPSIMPLE_TIMED) {
+    ul_evpsimple_htimer_add(eb, ei);
+  }
+
+  ei->flags &= ~UL_EVPSIMPLE_ONCE;
+  ul_evpsimple_arm_internal(eb, ei);
+
+  return 0;
+}
+
+static int ul_evpsimple_trig_disarm(ul_evptrig_t *evptrig)
+{
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(evptrig->base, ul_evpbase_simple_t, base);
+
+  if(!(ei->flags & UL_EVPSIMPLE_ARMED))
+    return 0;
+
+  if(ei->flags & UL_EVPSIMPLE_TIMED)
+    ul_evpsimple_htimer_detach(eb, ei);
+
+  ul_evpsimple_disarm_internal(eb, ei);
+
+  return 0;
+}
+
+static int ul_evpsimple_trig_arm_once(ul_evptrig_t *evptrig)
+{
+  int ret = 0;
+  ul_evptrig_simple_t *ei = evptrig->impl_data;
+  if(!(ei->flags & UL_EVPSIMPLE_ARMED))
+    ret = ul_evpsimple_trig_arm(evptrig);
+  ei->flags |= UL_EVPSIMPLE_ONCE;
+  return ret;
+}
+
+
+static ul_evpbase_t *ul_evpsimple_base_new(void)
+{
+  ul_evpbase_simple_t *eb;
+
+  eb = (ul_evpbase_simple_t*)malloc(sizeof(ul_evpbase_simple_t));
+  if(!eb)
+    return NULL;
+
+  memset(eb,0,sizeof(ul_evpbase_simple_t));
+
+  ul_evpsimple_htimer_init_queue(eb);
+
+  eb->trig_array = NULL;
+  eb->pollfd_array = NULL;
+  eb->pollfd_count = 0;
+
+  ul_evpsimple_idle_init_head(eb);
+  ul_evpsimple_active_init_head(eb);
+
+  eb->base.ops = &ul_evpoll_ops_simple;
+
+  return &eb->base;
+}
+
+static void ul_evpsimple_base_destroy(ul_evpbase_t *base)
+{
+  ul_evptrig_simple_t *ei;
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(base, ul_evpbase_simple_t, base);
+
+  while((ei = ul_evpsimple_active_first(eb))!=NULL){
+    ul_evpsimple_trig_disarm(ei->trig_ptr);
+  }
+
+  while((ei = ul_evpsimple_idle_first(eb))!=NULL){
+    ei->trig_ptr->cb(ei->trig_ptr, UL_EVP_DONE);
+    if(ei == ul_evpsimple_idle_first(eb)) {
+      ul_logdeb("UL_EVP_DONE not handled for %i when poll is being destroyed\n", ei->fd);
+      ul_evpsimple_trig_done(ei->trig_ptr);
+    }
+  }
+
+  if(eb->trig_array)
+    free(eb->trig_array);
+
+  if(eb->pollfd_array)
+    free(eb->pollfd_array);
+
+  free(eb);
+}
+
+static int ul_evpsimple_base_update(ul_evpbase_t *base)
+{
+  return 0;
+}
+
+static int ul_evpsimple_base_dispatch(ul_evpbase_t *base, ul_htim_diff_t *timeout)
+{
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(base, ul_evpbase_simple_t, base);
+  ul_htim_diff_t timeout_min = -1;
+  ul_htim_diff_t time_diff;
+  int ret;
+  int i;
+
+  if(eb->quit_loop)
+    return UL_EVP_DISPRET_QUIT;
+
+  if(eb->need_resync)
+    ul_evpsimple_sync_pollfd_array(eb);
+
+  if(timeout!=NULL) {
+    timeout_min = *timeout;
+    if(timeout_min < 0)
+      timeout_min = 0;
+  }
+
+  if(ul_evpsimple_htimer_first_changed(eb))
+    eb->time_next_expire_fl=ul_evpsimple_htimer_next_expire(eb,&eb->time_next_expire);
+
+  if(eb->time_next_expire_fl) {
+    eb->time_act = ul_evpoll_get_current_time(base);
+    time_diff = eb->time_next_expire - eb->time_act;
+    if(time_diff < 0)
+      time_diff = 0;
+    if((timeout_min < 0) || (timeout_min > time_diff))
+      timeout_min = time_diff;
+  }
+
+  ret = poll(eb->pollfd_array, eb->pollfd_count, timeout_min);
+
+  if(ret < 0 ) {
+    ret = UL_EVP_DISPRET_ERROR;
+  } else if(ret == 0) {
+    ret = UL_EVP_DISPRET_TIMEOUT;
+  } else if(ret > 0) {
+    ret = UL_EVP_DISPRET_HANDLED;
+    /* An evptrig on one of the fds has occurred. */
+    for(i=0; i<eb->pollfd_count; i++) {
+      int revents = eb->pollfd_array[i].revents;
+      int what = 0;
+      eb->pollfd_array[i].revents = 0;
+      ul_evptrig_simple_t *ei;
+      if(!revents) continue;
+      if(revents & (POLLOUT)) what |= UL_EVP_WRITE;
+      if(revents & (POLLIN)) what |= UL_EVP_READ;
+      ei = eb->trig_array[i];
+      if(!ei) {
+        if(!eb->need_resync) {
+         ul_logerr("ul_evpsimple_base_dispatch: empty slot and no need_resync\n");
+          eb->need_resync = 1;
+       }
+       continue;
+      }
+      if(ei->flags & UL_EVPSIMPLE_ONCE)
+        ul_evpsimple_trig_disarm(ei->trig_ptr);
+      if(ei->flags & UL_EVPSIMPLE_TIMEOUT)
+        ul_evpsimple_trig_set_timeout(ei->trig_ptr, &ei->timeout);
+      if(ei->trig_ptr->cb)
+        ei->trig_ptr->cb(ei->trig_ptr, what);
+    }
+  }
+
+  if(ul_evpsimple_htimer_first_changed(eb))
+    eb->time_next_expire_fl=ul_evpsimple_htimer_next_expire(eb,&eb->time_next_expire);
+
+  if(!eb->need_resync && eb->time_next_expire_fl) {
+    ul_evptrig_simple_t *ei;
+    eb->time_act = ul_evpoll_get_current_time(base);
+
+    while((ei=ul_evpsimple_htimer_cut_expired(eb, &eb->time_act))){
+      if(ei->trig_ptr->cb)
+        ei->trig_ptr->cb(ei->trig_ptr, UL_EVP_TIMEOUT);
+      ret = UL_EVP_DISPRET_HANDLED;
+    }
+  }
+
+  return ret;
+}
+
+static int ul_evpsimple_base_set_option(ul_evpbase_t *base, int option, int val)
+{
+  ul_evpbase_simple_t *eb = UL_CONTAINEROF(base, ul_evpbase_simple_t, base);
+
+  switch(option) {
+    case UL_EVP_OPTION_QUIT:
+      if(val)
+        eb->quit_loop = 1;
+      return 0;
+   }
+  return -1;
+}
+
+const ul_evpoll_ops_t ul_evpoll_ops_simple = {
+  .trig_init = ul_evpsimple_trig_init,
+  .trig_done = ul_evpsimple_trig_done,
+  .trig_set_fd = ul_evpsimple_trig_set_fd,
+  .trig_set_time = ul_evpsimple_trig_set_time,
+  .trig_set_timeout = ul_evpsimple_trig_set_timeout,
+  .trig_set_callback = ul_evpsimple_trig_set_callback,
+  .trig_arm = ul_evpsimple_trig_arm,
+  .trig_disarm = ul_evpsimple_trig_disarm,
+  .trig_arm_once = ul_evpsimple_trig_arm_once,
+  .base_new = ul_evpsimple_base_new,
+  .base_destroy = ul_evpsimple_base_destroy,
+  .base_update = ul_evpsimple_base_update,
+  .base_dispatch = ul_evpsimple_base_dispatch,
+  .base_get_current_time = ul_evpsimple_get_current_time,
+  .base_set_option = ul_evpsimple_base_set_option,
+};
diff --git a/ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.h b/ulan/host/libs4c/ulevloop/ul_evp_sysvpoll.h
new file mode 100644 (file)
index 0000000..55b0496
--- /dev/null
@@ -0,0 +1,96 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evpollint.h       - monitoring of open file handles
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_EVPOLLINT_H
+#define _UL_EVPOLLINT_H
+
+#include "ul_utdefs.h"
+
+#include <string.h>
+
+#include "ul_evpoll.h"
+#include <ul_list.h>
+#include <ul_htimer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_EVPSIMPLE_ARMED    0x01
+#define UL_EVPSIMPLE_ONCE     0x02
+#define UL_EVPSIMPLE_TIMED    0x04
+#define UL_EVPSIMPLE_TIMEOUT  0x08
+#define UL_EVPSIMPLE_PERIODIC 0x10
+
+typedef struct ul_evptrig_data_t {
+  unsigned flags;
+  unsigned what_events;
+
+  ul_evfd_t      fd;
+  int            idx;
+
+  ul_htim_diff_t timeout;
+  ul_htim_node_t htim;
+
+  ul_list_node_t list_node;
+
+  ul_evptrig_t *trig_ptr;
+
+} ul_evptrig_simple_t;
+
+typedef struct ul_evpbase_simple_t {
+  ul_evpbase_t base;
+
+  ul_evptrig_simple_t **trig_array;
+  struct pollfd *pollfd_array;
+  int pollfd_count;
+  int pollfd_capacity;
+
+  int need_resync:1;
+  int time_next_expire_fl:1;
+  int quit_loop:1;
+
+  int            activefd_count;
+  ul_list_head_t active_list;
+  ul_list_head_t idle_list;
+
+  ul_htim_time_t time_act;
+  ul_htim_time_t time_next_expire;
+  ul_htim_queue_t htim_queue;
+
+} ul_evpbase_simple_t;
+
+
+UL_LIST_CUST_DEC(ul_evpsimple_active, ul_evpbase_simple_t, ul_evptrig_simple_t,
+                active_list, list_node)
+
+UL_LIST_CUST_DEC(ul_evpsimple_idle, ul_evpbase_simple_t, ul_evptrig_simple_t,
+                idle_list, list_node)
+
+extern const ul_evpoll_ops_t ul_evpoll_ops_simple;
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_EVPOLLINT_H */
diff --git a/ulan/host/libs4c/ulevloop/ul_evpchk.c b/ulan/host/libs4c/ulevloop/ul_evpchk.c
new file mode 100644 (file)
index 0000000..4b90a0b
--- /dev/null
@@ -0,0 +1,361 @@
+#include <string.h>
+#include "ul_utmalloc.h"
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ul_evpoll.h"
+#include "ul_htimer.h"
+
+#include <ul_log.h>
+
+UL_LOG_CUST(ulogd_evpoll);
+
+/******************************************************************************/
+
+typedef struct my_timer_t {
+  ul_evptrig_t evptrig;
+  ul_htim_time_t time;
+  ul_htim_diff_t interval;
+  int timno;
+  int count;
+  int count_limit;
+} my_timer_t;
+
+void my_timer_cb(ul_evptrig_t *evptrig, int what)
+{
+  my_timer_t *mt = UL_CONTAINEROF(evptrig, my_timer_t, evptrig);
+
+  mt->count++;
+
+  ul_logdeb("@ timer #%d evptrig %d count %d\n", mt->timno, what, mt->count);
+
+  if(what != UL_EVP_TIMEOUT)
+    return;
+
+  if(mt->count_limit && (mt->count>=mt->count_limit)) {
+    ul_evptrig_done(&mt->evptrig);
+    ul_logerr("@ timer #%d reached limit %d\n", mt->timno, mt->count);
+    free(mt);
+    return;
+  }
+
+  mt->time += mt->interval;
+  if(ul_evptrig_set_time(&mt->evptrig, &mt->time) < 0) {
+    ul_logerr("ul_evptrig_set_time for timer #%d evptrig\n", mt->timno);
+  }
+}
+
+int add_my_timer(int interval, int count_limit)
+{
+  static int timno = 0;
+  my_timer_t *mt;
+
+  timno++;
+
+  mt = malloc(sizeof(my_timer_t));
+  if(!mt) {
+    ul_logerr("cannot allocate space for timer #%d\n", timno);
+    return -1;
+  }
+
+  mt->timno = timno;
+  mt->interval = interval;
+  mt->count = 0;
+  mt->count_limit = count_limit;
+  ul_mstime_now(&mt->time);
+
+  if(ul_evptrig_init(NULL, &mt->evptrig)<0) {
+    free(mt);
+    ul_logerr("cannot init timer #%d evptrig\n", mt->timno);
+    return -1;
+  }
+
+  ul_evptrig_set_callback(&mt->evptrig, my_timer_cb);
+
+  mt->time += mt->interval;
+  if(ul_evptrig_set_time(&mt->evptrig, &mt->time) < 0) {
+    ul_logerr("ul_evptrig_set_time for timer #%d evptrig\n", mt->timno);
+  }
+
+  if(ul_evptrig_arm(&mt->evptrig)<0) {
+    ul_evptrig_done(&mt->evptrig);
+    ul_logerr("ul_evptrig_arm for timer #%d evptrig\n", mt->timno);
+    free(mt);
+  }
+
+
+  return 0;
+}
+
+/******************************************************************************/
+
+typedef struct my_pipe_t {
+  ul_evptrig_t rd_evptrig;
+  ul_evptrig_t wr_evptrig;
+  ul_evptrig_t timer_evptrig;
+  int rd_fd;
+  int wr_fd;
+  int rd_count;
+  int wr_count;
+  int chunk_count;
+} my_pipe_t;
+
+
+void my_pipe_destroy(my_pipe_t *mp)
+{
+  ul_logmsg("@ pipe rd #%d wr %d destroyed\n", mp->rd_fd, mp->wr_fd);
+  ul_evptrig_done(&mp->timer_evptrig);
+  ul_evptrig_done(&mp->wr_evptrig);
+  ul_evptrig_done(&mp->rd_evptrig);
+
+  if(mp->rd_fd>=0)
+    close(mp->rd_fd);
+  if(mp->wr_fd>=0)
+    close(mp->wr_fd);
+
+  free(mp);
+}
+
+void my_pipe_rd_cb(ul_evptrig_t *evptrig, int what)
+{
+  int ret;
+  my_pipe_t *mp = UL_CONTAINEROF(evptrig, my_pipe_t, rd_evptrig);
+
+  if(what == UL_EVP_TIMEOUT) {
+    ul_logdeb("@ pipe #%d evptrig rd timeout\n", mp->rd_fd);
+    return;
+  }
+
+  if(what == UL_EVP_READ) {
+    char ch;
+    ret = read(mp->rd_fd, &ch, 1);
+    if(ret != 1)
+      ul_logerr("@ pipe #%d read returned %d\n", mp->rd_fd, ret);
+    else {
+      ul_logdeb("@ pipe #%d rd evptrig %d count wr %d rd %d\n", mp->rd_fd, what, mp->wr_count, mp->rd_count);
+      mp->rd_count++;
+      if(mp->rd_count>1000)
+        my_pipe_destroy(mp);
+    }
+  }
+}
+
+void my_pipe_wr_cb(ul_evptrig_t *evptrig, int what)
+{
+  int ret;
+  my_pipe_t *mp = UL_CONTAINEROF(evptrig, my_pipe_t, wr_evptrig);
+
+  if(what == UL_EVP_TIMEOUT) {
+    ul_logdeb("@ pipe #%d evptrig wr timeout\n", mp->wr_fd);
+    return;
+  }
+
+  if(what == UL_EVP_WRITE) {
+    char ch = 'a' + (mp->wr_count & 0xf);
+    ret = write(mp->wr_fd, &ch, 1);
+    if(ret != 1)
+      ul_logerr("@ pipe #%d write returned %d\n", mp->wr_fd, ret);
+    else {
+      mp->wr_count++;
+      ul_logdeb("@ pipe #%d wr evptrig %d count wr %d rd %d\n", mp->wr_fd, what, mp->wr_count, mp->rd_count);
+      mp->chunk_count++;
+      if(mp->chunk_count>=32) {
+        ul_htim_diff_t timo = 2000;
+        mp->chunk_count=0;
+        ul_evptrig_disarm(&mp->wr_evptrig);
+
+        ul_evptrig_set_timeout(&mp->timer_evptrig, &timo);
+        ul_evptrig_arm_once(&mp->timer_evptrig);
+      }
+    }
+  }
+}
+
+void my_pipe_timer_cb(ul_evptrig_t *evptrig, int what)
+{
+  my_pipe_t *mp = UL_CONTAINEROF(evptrig, my_pipe_t, timer_evptrig);
+
+  if(what == UL_EVP_TIMEOUT) {
+    ul_logdeb("@ pipe #%d evptrig timer\n", mp->wr_fd);
+    ul_evptrig_disarm(&mp->timer_evptrig);
+    ul_evptrig_arm(&mp->wr_evptrig);
+  }
+}
+
+int add_my_pipe(void)
+{
+  my_pipe_t *mp;
+  ul_htim_diff_t timo = 4000;
+
+  mp = malloc(sizeof(my_pipe_t));
+  if(!mp) {
+    ul_logerr("cannot allocate space for pipe\n");
+    return -1;
+  }
+  memset(mp, 0, sizeof(*mp));
+
+  mp->rd_fd=-1;
+  mp->wr_fd=-1;
+
+  do {
+    if(ul_evptrig_init(NULL, &mp->rd_evptrig)>=0) {
+      if(ul_evptrig_init(NULL, &mp->wr_evptrig)>=0) {
+        if(ul_evptrig_init(NULL, &mp->timer_evptrig)>=0)
+         break;
+        ul_evptrig_done(&mp->wr_evptrig);
+      }
+      ul_evptrig_done(&mp->rd_evptrig);
+    }
+    free(mp);
+    ul_logerr("pipe test cannot init evptrigs\n");
+    return -1;
+  } while(0);
+
+  ul_evptrig_set_callback(&mp->rd_evptrig, my_pipe_rd_cb);
+  ul_evptrig_set_callback(&mp->wr_evptrig, my_pipe_wr_cb);
+  ul_evptrig_set_callback(&mp->timer_evptrig, my_pipe_timer_cb);
+
+  {
+    int filedes[2];
+    if(pipe(filedes)<0) {
+      ul_logerr("pipe creation failed\n");
+      my_pipe_destroy(mp);
+      return -1;
+    }
+    mp->rd_fd = filedes[0];
+    mp->wr_fd = filedes[1];
+  }
+
+  ul_evptrig_set_fd(&mp->rd_evptrig, mp->rd_fd, UL_EVP_READ);
+  ul_evptrig_set_fd(&mp->wr_evptrig, mp->wr_fd, UL_EVP_WRITE);
+
+  ul_evptrig_set_timeout(&mp->rd_evptrig, &timo);
+  ul_evptrig_set_timeout(&mp->wr_evptrig, &timo);
+
+  if(ul_evptrig_arm(&mp->rd_evptrig)<0) {
+    ul_logerr("ul_evptrig_arm rd for pipe rd #%d wr #%d evptrig\n", mp->rd_fd, mp->wr_fd);
+    my_pipe_destroy(mp);
+    return -1;
+  }
+
+  if(ul_evptrig_arm(&mp->wr_evptrig)<0) {
+    ul_logerr("ul_evptrig_arm wr for pipe rd #%d wr #%d evptrig\n", mp->rd_fd, mp->wr_fd);
+    my_pipe_destroy(mp);
+    return -1;
+  }
+
+  return 0;
+}
+
+/******************************************************************************/
+
+typedef struct my_fd_t {
+  ul_evptrig_t evptrig;
+  int fd;
+  int count;
+} my_fd_t;
+
+void my_fd_cb(ul_evptrig_t *evptrig, int what)
+{
+  int ret;
+  my_fd_t *mf = UL_CONTAINEROF(evptrig, my_fd_t, evptrig);
+
+  if(what == UL_EVP_TIMEOUT) {
+    ul_logdeb("@ fd #%d evptrig timeout\n", mf->fd);
+    return;
+  }
+
+  mf->count++;
+
+  ul_logdeb("@ fd #%d evptrig %d count %d\n", mf->fd, what, mf->count);
+
+  if(what == UL_EVP_READ) {
+    char ch;
+    ret = read(mf->fd, &ch, 1);
+    if(ret != 1)
+      ul_logerr("@ fd #%d read returned %d\n", mf->fd, ret);
+    printf("'%c'\n", ch);
+
+    switch(ch) {
+      case 'q':
+        ul_evpoll_set_option(ul_evptrig_get_base(evptrig),UL_EVP_OPTION_QUIT,1);
+       break;
+      case 'p':
+        add_my_pipe();
+       break;
+    }
+  }
+}
+
+int add_my_fd(int fd, int timeout)
+{
+  my_fd_t *mf;
+  ul_htim_diff_t timo = timeout;
+
+  mf = malloc(sizeof(my_fd_t));
+  if(!mf) {
+    ul_logerr("cannot allocate space for fd #%d\n", fd);
+    return -1;
+  }
+
+  mf->fd = fd;
+  mf->count = 0;
+
+  if(ul_evptrig_init(NULL, &mf->evptrig)<0) {
+    free(mf);
+    ul_logerr("cannot init fd #%d evptrig\n", mf->fd);
+    return -1;
+  }
+
+  ul_evptrig_set_callback(&mf->evptrig, my_fd_cb);
+
+  ul_evptrig_set_fd(&mf->evptrig, mf->fd, UL_EVP_READ);
+
+  if(ul_evptrig_set_timeout(&mf->evptrig, &timo) < 0) {
+    ul_logerr("ul_evptrig_set_timeout for fd #%d evptrig\n", mf->fd);
+  }
+
+  if(ul_evptrig_arm(&mf->evptrig)<0) {
+    ul_evptrig_done(&mf->evptrig);
+    ul_logerr("ul_evptrig_arm for fd #%d evptrig\n", mf->fd);
+    free(mf);
+  }
+
+  return 0;
+}
+
+/******************************************************************************/
+
+int main(int argc, char *argv[])
+{
+  ul_mstime_init();
+  int ret;
+
+  ulogd_evpoll.level = UL_LOGL_DEB;
+  //ulogd_evpoll.level = UL_LOGL_MSG;
+
+  ul_logmsg("starting ul_evpchk application\n");
+
+  if(1) {
+    add_my_timer(2000, 0);
+    add_my_timer(3000, 20);
+    add_my_timer(1400, 10);
+  }
+
+  add_my_fd(0, 20000);
+
+  while(1) {
+    ul_logdeb("***** ul_evpoll_dispatch called *****\n");
+    ret = ul_evpoll_dispatch(NULL, NULL);
+    ul_logdeb("***** ul_evpoll_dispatch returned %d *****\n", ret);
+    if(ret == UL_EVP_DISPRET_QUIT)
+      break;
+  }
+  ul_logdeb("***** breaking loop destroying poll *****\n");
+  ul_evpoll_destroy(NULL);
+  ul_logdeb("***** breaking loop destroying poll *****\n");
+
+  return 0;
+}
diff --git a/ulan/host/libs4c/ulevloop/ul_evpoll.c b/ulan/host/libs4c/ulevloop/ul_evpoll.c
new file mode 100644 (file)
index 0000000..bbc2791
--- /dev/null
@@ -0,0 +1,176 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evpoll.c  - monitoring of open file handles
+
+  (C) Copyright 2005-2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+
+#include "ul_evpoll.h"
+
+#include <ul_log.h>
+
+UL_LOG_CUST(ulogd_evpoll);
+
+ul_evpbase_t *ul_evpoll_base_implicit;
+
+const ul_evpoll_ops_t *ul_evpoll_ops_implicit;
+
+const extern ul_evpoll_ops_t ul_evpoll_ops_simple;
+
+int ul_evpoll_chose_implicit_ops(void)
+{
+  ul_evpoll_ops_implicit = &ul_evpoll_ops_simple;
+  return 0;
+}
+
+ul_evpbase_t *ul_evpoll_new(const ul_evpoll_ops_t *ops, int flags)
+{
+  if(!ops) {
+    ops = ul_evpoll_ops_implicit;
+    if(!ops) {
+      ul_evpoll_chose_implicit_ops();
+      if(!ul_evpoll_ops_implicit)
+        return NULL;
+      ops = ul_evpoll_ops_implicit;
+    }
+  }
+  return ops->base_new();
+}
+
+ul_evpbase_t *ul_evpoll_chose_implicit_base(void)
+{
+  ul_evpbase_t *base;
+  base = ul_evpoll_base_implicit;
+  if(!base) {
+    base = ul_evpoll_new(NULL, 0);
+    ul_evpoll_base_implicit = base;
+  }
+  return base;
+}
+
+void ul_evpoll_destroy(ul_evpbase_t *base)
+{
+  if(!base) {
+    base = ul_evpoll_base_implicit;
+    if(!base)
+      return;
+  }
+  if(base == ul_evpoll_base_implicit)
+    ul_evpoll_base_implicit=NULL;
+  base->ops->base_destroy(base);
+}
+
+int ul_evpoll_update(ul_evpbase_t *base)
+{
+  if(!base) {
+    base = ul_evpoll_chose_implicit_base();
+    if(!base)
+      return -1;
+  }
+  return base->ops->base_update(base);
+}
+
+int ul_evpoll_dispatch(ul_evpbase_t *base, ul_htim_diff_t *timeout)
+{
+  if(!base) {
+    base = ul_evpoll_chose_implicit_base();
+    if(!base)
+      return -1;
+  }
+  return base->ops->base_dispatch(base, timeout);
+}
+
+int ul_evpoll_set_option(ul_evpbase_t *base, int option, int val)
+{
+  if(!base) {
+    base = ul_evpoll_chose_implicit_base();
+    if(!base)
+      return -1;
+  }
+  return base->ops->base_set_option(base, option, val);
+}
+
+int ul_evptrig_init(ul_evpbase_t *base, ul_evptrig_t *evptrig)
+{
+  if(!base) {
+    base = ul_evpoll_chose_implicit_base();
+    if(!base)
+      return -1;
+  }
+  return base->ops->trig_init(base, evptrig);
+}
+
+int ul_evpoll_loop(ul_evpbase_t *base, int flags)
+{
+  int ret;
+
+  if(!base) {
+    base = ul_evpoll_chose_implicit_base();
+    if(!base)
+      return -1;
+  }
+
+  do {
+
+    ret = ul_evpoll_dispatch(base, NULL);
+
+  } while(ret >= 0);
+
+  if(ret == UL_EVP_DISPRET_QUIT)
+    ret = 0;
+
+  return ret;
+}
+
+int ul_evptrig_set_and_arm_fd(ul_evptrig_t *evptrig, ul_evpoll_cb_t cb, ul_evfd_t fd,
+                            int what, ul_htim_diff_t *timeout, int once)
+{
+  int ret;
+
+  if(!evptrig->base) {
+    ul_logerr("ul_evptrig_set_and_arm_fd called for uninitialized evptrig\n");
+    return -1;
+  }
+
+  ul_evptrig_set_callback(evptrig, cb);
+
+  ul_evptrig_set_fd(evptrig, fd, what);
+
+  ul_evptrig_set_timeout(evptrig, timeout);
+
+  if(!once)
+    ret = ul_evptrig_arm(evptrig);
+  else
+    ret = ul_evptrig_arm_once(evptrig);
+
+  if(ret<0) {
+    ul_logerr("ul_evptrig_set_and_arm_fd for fd #%d failed %d\n", fd, ret);
+    return -1;
+  }
+
+  return 0;
+}
+
+int ul_evpoll_quilt_loop(ul_evpbase_t *base)
+{
+   return ul_evpoll_set_option(base, UL_EVP_OPTION_QUIT, 1);
+}
diff --git a/ulan/host/libs4c/ulevloop/ul_evpoll.h b/ulan/host/libs4c/ulevloop/ul_evpoll.h
new file mode 100644 (file)
index 0000000..2fb02b2
--- /dev/null
@@ -0,0 +1,168 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evpoll.h  - monitoring of open file handles
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_EVPOLL_H
+#define _UL_EVPOLL_H
+
+#include "ul_utdefs.h"
+
+#include <string.h>
+
+#include "ul_htimdefs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_EVP_READ    0x01
+#define UL_EVP_WRITE   0x02
+#define UL_EVP_STATE   0x04
+#define UL_EVP_TIMEOUT 0x08
+#define UL_EVP_SIGNAL  0x10
+#define UL_EVP_DONE    0x20
+
+#define UL_EVP_OPTION_QUIT      1
+
+#define UL_EVP_DISPRET_ERROR   -1
+#define UL_EVP_DISPRET_QUIT    -2
+#define UL_EVP_DISPRET_NOEVENT  0
+#define UL_EVP_DISPRET_HANDLED  1
+#define UL_EVP_DISPRET_TIMEOUT  2
+
+typedef int ul_evfd_t;
+
+struct ul_evptrig_data_t;
+typedef struct ul_evpbase_t ul_evpbase_t;
+typedef struct ul_evptrig_t ul_evptrig_t;
+
+typedef void (*ul_evpoll_cb_t)(ul_evptrig_t *evptrig, int what);
+
+struct ul_evptrig_t {
+  struct ul_evptrig_data_t *impl_data;
+  ul_evpbase_t *base;
+  ul_evpoll_cb_t   cb;
+};
+
+typedef struct ul_evpoll_ops_t {
+  int (*trig_init)(ul_evpbase_t *base, ul_evptrig_t *evptrig);
+  void (*trig_done)(ul_evptrig_t *evptrig);
+  int (*trig_set_fd)(ul_evptrig_t *evptrig, ul_evfd_t fd, int what);
+  int (*trig_set_time)(ul_evptrig_t *evptrig, ul_htim_time_t *time);
+  int (*trig_set_timeout)(ul_evptrig_t *evptrig, ul_htim_diff_t *timeout);
+  int (*trig_set_callback)(ul_evptrig_t *evptrig, ul_evpoll_cb_t cb);
+  int (*trig_arm)(ul_evptrig_t *evptrig);
+  int (*trig_disarm)(ul_evptrig_t *evptrig);
+  int (*trig_arm_once)(ul_evptrig_t *evptrig);
+
+  ul_evpbase_t *(*base_new)(void);
+  void (*base_destroy)(ul_evpbase_t *base);
+  int (*base_update)(ul_evpbase_t *base);
+  int (*base_dispatch)(ul_evpbase_t *base, ul_htim_diff_t *timeout);
+  ul_htim_time_t (*base_get_current_time)(ul_evpbase_t *base);
+  int (*base_set_option)(ul_evpbase_t *base, int option, int val);
+} ul_evpoll_ops_t;
+
+struct ul_evpbase_t {
+  const ul_evpoll_ops_t *ops;
+};
+
+extern ul_evpbase_t *ul_evpoll_base_implicit;
+
+const ul_evpoll_ops_t *ul_evpoll_ops_implicit;
+
+int ul_evptrig_init(ul_evpbase_t *base, ul_evptrig_t *evptrig);
+
+static inline void ul_evptrig_done(ul_evptrig_t *evptrig)
+{
+  evptrig->base->ops->trig_done(evptrig);
+}
+
+static inline int ul_evptrig_set_fd(ul_evptrig_t *evptrig, ul_evfd_t fd, int what)
+{
+  return evptrig->base->ops->trig_set_fd(evptrig, fd, what);
+}
+
+static inline int ul_evptrig_set_time(ul_evptrig_t *evptrig, ul_htim_time_t *time)
+{
+  return evptrig->base->ops->trig_set_time(evptrig, time);
+}
+
+static inline int ul_evptrig_set_timeout(ul_evptrig_t *evptrig, ul_htim_diff_t *timeout)
+{
+  return evptrig->base->ops->trig_set_timeout(evptrig, timeout);
+}
+
+static inline int ul_evptrig_set_callback(ul_evptrig_t *evptrig, ul_evpoll_cb_t cb)
+{
+  return evptrig->base->ops->trig_set_callback(evptrig, cb);
+}
+
+static inline int ul_evptrig_arm(ul_evptrig_t *evptrig)
+{
+  return evptrig->base->ops->trig_arm(evptrig);
+}
+
+static inline int ul_evptrig_disarm(ul_evptrig_t *evptrig)
+{
+  return evptrig->base->ops->trig_disarm(evptrig);
+}
+
+static inline int ul_evptrig_arm_once(ul_evptrig_t *evptrig)
+{
+  return evptrig->base->ops->trig_arm_once(evptrig);
+}
+
+static inline ul_evpbase_t *ul_evptrig_get_base(ul_evptrig_t *evptrig)
+{
+  return evptrig->base;
+}
+
+int ul_evptrig_set_and_arm_fd(ul_evptrig_t *evptrig, ul_evpoll_cb_t cb, ul_evfd_t fd,
+                            int what, ul_htim_diff_t *timeout, int once);
+
+ul_evpbase_t *ul_evpoll_new(const ul_evpoll_ops_t *ops, int flags);
+
+void ul_evpoll_destroy(ul_evpbase_t *base);
+
+int ul_evpoll_update(ul_evpbase_t *base);
+
+int ul_evpoll_dispatch(ul_evpbase_t *base, ul_htim_diff_t *timeout);
+
+static inline ul_htim_time_t ul_evpoll_get_current_time(ul_evpbase_t *base)
+{
+  return base->ops->base_get_current_time(base);
+}
+
+int ul_evpoll_set_option(ul_evpbase_t *base, int option, int val);
+
+int ul_evpoll_loop(ul_evpbase_t *base, int flags);
+
+int ul_evpoll_quilt_loop(ul_evpbase_t *base);
+
+ul_evpbase_t *ul_evpoll_chose_implicit_base(void);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_EVPOLL_H */
diff --git a/ulan/host/libs4c/ulut/.cvsignore b/ulan/host/libs4c/ulut/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/libs4c/ulut/CVS/Entries b/ulan/host/libs4c/ulut/CVS/Entries
new file mode 100644 (file)
index 0000000..1be124e
--- /dev/null
@@ -0,0 +1,47 @@
+/.cvsignore/1.1/Wed Sep 22 22:13:10 2004//
+/Makefile.omk/1.7/Tue Dec  4 20:02:09 2007//
+/Makefile.std/1.2/Sun Aug 12 12:08:02 2007//
+/ul_cbuff.c/1.1/Sat Apr 29 09:37:38 2006//
+/ul_cbuff.h/1.1/Sat Apr 29 09:37:38 2006//
+/ul_dbufbase.c/1.2/Sat Nov  4 09:15:19 2006//
+/ul_dbuff.h/1.3/Tue Feb 13 11:29:42 2007//
+/ul_dbufflog.c/1.4/Sat Nov  4 09:15:19 2006//
+/ul_dbufflog.h/1.4/Tue Dec  4 20:02:09 2007//
+/ul_dbufmore.c/1.6/Tue Feb 13 11:29:42 2007//
+/ul_evcbase.c/1.4/Tue Jan 24 11:18:24 2006//
+/ul_evcbase.h/1.2/Tue Jun 28 20:42:54 2005//
+/ul_gavl.c/1.4/Fri Feb 29 11:04:50 2008//
+/ul_gavl.h/1.2/Fri Jan 14 11:52:52 2005//
+/ul_gavlchk.c/1.3/Fri Feb 29 11:04:50 2008//
+/ul_gavlcust.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_gavlflesint.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_gavlprim.c/1.1/Wed Sep 22 22:13:10 2004//
+/ul_gavlrepcust.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_gsa.c/1.3/Fri Jan 14 11:52:52 2005//
+/ul_gsa.h/1.5/Fri Jul 28 13:01:47 2006//
+/ul_gsachk.c/1.1/Wed Sep 22 22:13:10 2004//
+/ul_gsacust.c/1.4/Tue Feb 13 11:29:42 2007//
+/ul_gsacust.h/1.2/Tue Aug  9 15:20:45 2005//
+/ul_hptree.c/1.2/Sun May  8 13:19:38 2005//
+/ul_hptree.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_htimbase.c/1.1/Wed Sep 22 22:13:10 2004//
+/ul_htimchk.c/1.1/Wed Sep 22 22:13:10 2004//
+/ul_htimdefs.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_htimer.c/1.1/Wed Sep 22 22:13:10 2004//
+/ul_htimer.h/1.2/Sun May  8 22:01:10 2005//
+/ul_htimmstime.c/1.2/Sun May  8 22:01:11 2005//
+/ul_itbase.h/1.1/Wed Sep 22 22:13:10 2004//
+/ul_list.h/1.1/Wed Sep 22 22:13:11 2004//
+/ul_listbase.h/1.2/Fri Jan 14 11:52:52 2005//
+/ul_log.h/1.2/Tue Feb 13 11:29:42 2007//
+/ul_logbase.c/1.3/Sun Jul 30 23:37:07 2006//
+/ul_logbase.h/1.3/Sun Jul 30 23:37:07 2006//
+/ul_logbuf.c/1.1/Fri Apr  7 07:21:43 2006//
+/ul_logreg.c/1.3/Sun Jul 30 23:37:07 2006//
+/ul_logreg.h/1.2/Fri Jul 28 15:31:42 2006//
+/ul_uniqid.c/1.2/Tue Jan 24 11:18:24 2006//
+/ul_uniqid.h/1.3/Tue Dec  4 20:02:09 2007//
+/ul_utdefs.h/1.3/Tue Feb 13 11:29:42 2007//
+/ul_utexport.h/1.1/Wed Sep 22 22:13:11 2004//
+/ul_utmalloc.h/1.1/Wed Sep 22 22:13:11 2004//
+D
diff --git a/ulan/host/libs4c/ulut/CVS/Repository b/ulan/host/libs4c/ulut/CVS/Repository
new file mode 100644 (file)
index 0000000..fc52ebb
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/libs4c/ulut
diff --git a/ulan/host/libs4c/ulut/CVS/Root b/ulan/host/libs4c/ulut/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/libs4c/ulut/Makefile.omk b/ulan/host/libs4c/ulut/Makefile.omk
new file mode 100644 (file)
index 0000000..899dddc
--- /dev/null
@@ -0,0 +1,79 @@
+default_CONFIG = CONFIG_OC_ULUT=y 
+default_CONFIG += CONFIG_OC_ULUTRTL=n 
+default_CONFIG += CONFIG_OC_SOLIBS=x
+
+ifeq ($(CONFIG_OC_ULUT),y)
+
+include_HEADERS  = ul_dbuff.h ul_evcbase.h ul_gavl.h ul_gavlcust.h \
+              ul_gavlflesint.h ul_gavlrepcust.h ul_gsa.h ul_gsacust.h \
+              ul_hptree.h ul_htimdefs.h ul_htimer.h ul_itbase.h \
+              ul_list.h ul_listbase.h ul_utdefs.h ul_utmalloc.h \
+              ul_uniqid.h ul_dbufflog.h ul_log.h ul_logbase.h \
+              ul_logreg.h ul_cbuff.h
+
+lib_LIBRARIES = ulut
+
+ifeq ($(CONFIG_OC_SOLIBS),y)
+shared_LIBRARIES = ulut
+endif
+
+ulut_SOURCES = ul_dbufbase.c ul_dbufmore.c ul_gsa.c ul_gsacust.c \
+              ul_gavlprim.c ul_gavl.c ul_hptree.c \
+              ul_htimer.c ul_htimbase.c ul_htimmstime.c \
+              ul_evcbase.c ul_uniqid.c ul_dbufflog.c ul_logbase.c \
+              ul_logreg.c ul_cbuff.c
+
+lib_LOADLIBES = ulut
+
+ifneq ($(TARGET_OS),win32)
+utils_PROGRAMS = ul_gavlchk ul_gsachk ul_htimchk
+endif
+
+ul_gavlchk_SOURCES = ul_gavlchk.c
+ul_gsachk_SOURCES = ul_gsachk.c
+ul_htimchk_SOURCES = ul_htimchk.c
+
+endif
+
+# RT-Linux version of build
+
+ifeq ($(CONFIG_OC_ULUTRLT),y)
+
+rtlinux_INCLUDES = -DUL_WITH_RTL_MALLOC
+
+rtlinux_LIBRARIES = ulutrtl
+
+rtlinux_with_malloc_HEADERS  = ul_dbuff.h ul_evcbase.h \
+               ul_gsa.h ul_gsacust.h ul_hptree.h ul_utmalloc.h
+
+rtlinux_HEADERS = ul_gavl.h ul_gavlcust.h \
+               ul_gavlflesint.h ul_gavlrepcust.h \
+              ul_htimdefs.h ul_htimer.h ul_itbase.h \
+              ul_list.h ul_listbase.h ul_utdefs.h \
+              $(rtlinux_with_malloc_HEADERS)
+
+ulutrtl_with_malloc_SOURCES = ul_dbufbase.c ul_dbufmore.c ul_gavl.c ul_hptree.c \
+              ul_evcbase.c ul_gsa.c ul_gsacust.c
+
+ulutrtl_SOURCES = ul_gavlprim.c ul_htimer.c ul_htimbase.c \
+              $(ulutrtl_with_malloc_SOURCES)
+              
+rtlinux_LOADLIBES = ulutrtl
+
+rtlinux_MODULES = ul_rtlchk ul_gsachk
+
+ul_rtlchk_SOURCES = ul_rtlchk.c
+
+# Linux-kernel version of build
+
+kernel_LIBRARIES = ulutkern
+
+kernel_HEADERS = ul_gavl.h ul_gavlcust.h \
+               ul_gavlflesint.h ul_gavlrepcust.h \
+              ul_htimdefs.h ul_htimer.h ul_itbase.h \
+              ul_list.h ul_listbase.h ul_utdefs.h \
+              $(rtlinux_with_malloc_HEADERS)
+
+ulutkern_SOURCES = ul_gavlprim.c ul_htimer.c ul_htimbase.c
+
+endif
diff --git a/ulan/host/libs4c/ulut/Makefile.std b/ulan/host/libs4c/ulut/Makefile.std
new file mode 100644 (file)
index 0000000..00d1e80
--- /dev/null
@@ -0,0 +1,103 @@
+#*******************************************************************
+# uLan Communication - Makefile for uLan library compilation
+#
+#
+# (C) Copyright 2001 by Pavel Pisa - Originator
+#
+# The uLan driver is distributed under the Gnu General Public License. 
+# See file COPYING for details.
+#
+# Originator reserve the right to use and publish sources
+# under different conditions too. If third party contributors
+# do not accept this condition, they can delete this statement
+# and only GNU license will apply.
+#*******************************************************************
+
+all : default
+
+default : library tests
+
+.PHONY : depend
+
+# Select compiler
+CC=gcc
+
+# Basic compilation flags
+CFLAGS += -Wall -Wstrict-prototypes 
+CFLAGS += -O2
+CFLAGS += -I.
+CFLAGS += -ggdb
+#CFLAGS += -pg
+#CFLAGS += -std=c99
+#CFLAGS += -std=gnu99 -DWITH_C99
+
+# CFLAGS for the uLan library
+# note: some macro expansions require at least -O
+LCFLAGS=  $(CFLAGS)
+LCFLAGS+= $(CPUFLAGS)
+# uncomment the next line if you want a shared library
+# LIB_SHARED = 1
+#LCFLAGS += -pg
+
+#LDFLAGS += -pg
+
+LIB_OBJS  = ul_dbufbase.lo ul_dbufmore.lo ul_gsa.lo ul_gsacust.lo \
+            ul_gavlprim.lo ul_gavl.lo ul_hptree.lo \
+            ul_htimer.lo ul_htimbase.lo ul_htimmstime.lo \
+            ul_evcbase.lo ul_uniqid.lo ul_dbufflog.lo ul_logbase.lo \
+           ul_logreg.lo
+
+# DJGPP = 1
+
+ifndef LIB_SHARED
+
+LIBULUT = libulut.a
+
+%.lo: %.c
+       $(CC) -o $@ $(LCFLAGS) -c $<
+
+$(LIBULUT): $(LIB_OBJS)
+       ar rcs $(LIBULUT) $^
+       ranlib $(LIBULUT)
+
+else
+
+%.lo: %.c
+       $(CC) --shared -o $@ $(LCFLAGS) -c $<
+
+LIBULUT = libulut.so.0.0.4
+
+$(LIBULUT): $(LIB_OBJS)
+       ld --shared --soname=$(LIBULUT) -o $(LIBULUT) $^
+       ln -s -f $(LIBULUT) libulan.so
+
+endif
+
+library: $(LIBULUT)
+
+.SUFFIXES: .i .s
+%.c : %.i
+       $(CC) -E $(CFLAGS) $< >$@
+
+%.c : %.s
+       $(CC) -S $(CFLAGS) $<
+
+dep:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M *.c $(MORE_C_FILES) | \
+       sed 's/^\([^:]*\)\.o *:/\1.o \1.lo:/g' > depend
+
+depend:
+       @touch depend
+
+clean :
+       rm -f depend *.o *.lo *~ *.a *.so *.so.* ul_gavlchk ul_htimchk ul_gsachk test
+
+tests: ul_gsachk ul_gavlchk ul_htimchk
+
+ul_gavlchk: ul_gavlchk.o libulut.a
+
+ul_htimchk: ul_htimchk.o libulut.a
+
+ul_gsachk: ul_gsachk.o libulut.a
+
+-include depend
diff --git a/ulan/host/libs4c/ulut/ul_cbuff.c b/ulan/host/libs4c/ulut/ul_cbuff.c
new file mode 100644 (file)
index 0000000..0c00f39
--- /dev/null
@@ -0,0 +1,69 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_cbuff.c   - circular buffer
+
+  (C) Copyright 2005-2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+
+#define UL_CBUFF_INCLUDE_INTERNAL
+
+#include "ul_cbuff.h"
+
+int ul_cbuff_init(ul_cbuff_t *buff, ul_cbuff_state_t *state,
+                 void *buff_start, ul_cbuff_loc_t size)
+{
+  ul_cbuff_msg_head_t *msg_head;
+  int state_alloc=(state==NULL);
+
+  if(state_alloc){
+    state=(ul_cbuff_state_t *)malloc(sizeof(ul_cbuff_state_t));
+    if(state==NULL)
+      return -1;
+  }
+
+  if(buff_start!=NULL){
+    size=ul_cbuff_align(size+1)-ul_cbuff_align(1);
+  }else{
+    size=ul_cbuff_align(size);
+    buff_start=malloc(size);
+    if(buff_start==NULL){
+      if(state_alloc)
+        free(state);
+      return -1;
+    }
+  }
+
+  state->buff_size=size;
+  state->head=0;
+  state->lasttail=0;
+  state->cycles=0;
+  state->readers=0;
+  state->rear_size=0;
+
+  buff->state=state;
+  buff->buff_start=(unsigned char *)buff_start;
+
+  msg_head=(ul_cbuff_msg_head_t *)buff_start;
+  msg_head->flags=0;
+
+  return 0;
+}
diff --git a/ulan/host/libs4c/ulut/ul_cbuff.h b/ulan/host/libs4c/ulut/ul_cbuff.h
new file mode 100644 (file)
index 0000000..d846a25
--- /dev/null
@@ -0,0 +1,505 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_cbuff.h   - circular buffer
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_CBUFF_H
+#define _UL_CBUFF_H
+
+#include "ul_utdefs.h"
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_CBUFF_NO_INLINE
+
+#ifndef UL_CBUFF_NO_INLINE
+#define UL_CBUFF_INLINE
+#endif
+
+#ifndef ul_cbuff_inline
+#ifdef UL_CBUFF_INLINE
+#define ul_cbuff_inline static inline
+#else
+#define ul_cbuff_inline
+#endif
+#endif
+
+#define ul_cbuff_align(x) (((x)+3)&~3)
+
+typedef unsigned int ul_cbuff_loc_t;
+
+typedef struct ul_cbuff_msg_head_t {
+  unsigned short flags;
+  unsigned short length;
+} ul_cbuff_msg_head_t;
+
+#define UL_CBUFF_MSG_READY    0x8000
+#define UL_CBUFF_MSG_OVERFLOW 0x4000
+#define UL_CBUFF_MSG_READERS  0x3fff
+
+#define ul_cbuff_msg_head_size (ul_cbuff_align(sizeof(ul_cbuff_msg_head_t)))
+
+typedef struct ul_cbuff_state_t {
+  ul_cbuff_loc_t buff_size;
+  ul_cbuff_loc_t head;
+  ul_cbuff_loc_t lasttail;
+  ul_cbuff_loc_t firsttail;
+  unsigned int   cycles;
+  unsigned int   readers;
+  ul_cbuff_loc_t rear_size;
+} ul_cbuff_state_t;
+
+typedef struct ul_cbuff_t {
+  unsigned char    *buff_start;
+  ul_cbuff_state_t *state;
+} ul_cbuff_t;
+
+typedef struct ul_cbuff_data_info_t {
+  unsigned char *ptr;
+  unsigned char *wrap_ptr;
+  unsigned int  cont_len;
+  unsigned int  wrap_len;
+} ul_cbuff_data_info_t;
+
+typedef struct ul_cbuff_put_info_t {
+  ul_cbuff_data_info_t data;
+  ul_cbuff_msg_head_t *msg_head;
+} ul_cbuff_put_info_t;
+
+typedef struct ul_cbuff_tail_info_t {
+  ul_cbuff_data_info_t data;
+  ul_cbuff_msg_head_t *msg_head;
+} ul_cbuff_tail_info_t;
+
+#if !defined(UL_CBUFF_INLINE)
+
+void ul_cbuff_mark_ready(ul_cbuff_msg_head_t *msg);
+int ul_cbuff_is_ready(const ul_cbuff_msg_head_t *msg);
+int ul_cbuff_head_alloc(ul_cbuff_t *buff, ul_cbuff_put_info_t *put_info, unsigned int size, unsigned int flags);
+int ul_cbuff_head_put(ul_cbuff_t *buff, ul_cbuff_put_info_t *put_info);
+ul_cbuff_loc_t ul_cbuff_head_loc(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head);
+ul_cbuff_loc_t ul_cbuff_next_loc(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head);
+int ul_cbuff_tail_attach(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info, int mode);
+int ul_cbuff_tail_incontact(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info);
+int ul_cbuff_tail_test(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info);
+int ul_cbuff_tail_release(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info);
+int ul_cbuff_tail_next(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info);
+int ul_cbuff_tail_state_update(ul_cbuff_t *buff, int release_result, ul_cbuff_loc_t loc, ul_cbuff_loc_t loc_next);
+void ul_cbuff_data_do_wrap(ul_cbuff_data_info_t *data_info);
+int ul_cbuff_data_at_once(ul_cbuff_data_info_t *data_info, void **pptr, int size);
+int ul_cbuff_put_data(ul_cbuff_data_info_t *data_info, const void *data, int size);
+int ul_cbuff_get_data(ul_cbuff_data_info_t *data_info, void *data, int size);
+void *ul_cbuff_get_rear_ptr(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head);
+void *ul_cbuff_prev_rear_ptr(ul_cbuff_t *buff, ul_cbuff_loc_t loc);
+
+#endif /* UL_CBUFF_INLINE */
+
+#if defined(UL_CBUFF_INLINE) || defined(UL_CBUFF_INCLUDE_INTERNAL)
+
+ul_cbuff_inline void
+ul_cbuff_mark_ready(ul_cbuff_msg_head_t *msg)
+{
+  msg->flags|=UL_CBUFF_MSG_READY;
+}
+
+ul_cbuff_inline int
+ul_cbuff_is_ready(const ul_cbuff_msg_head_t *msg)
+{
+  return msg->flags&UL_CBUFF_MSG_READY;
+}
+
+ul_cbuff_inline int
+ul_cbuff_head_alloc(ul_cbuff_t *buff, ul_cbuff_put_info_t *put_info, unsigned int size, unsigned int flags)
+{
+  ul_cbuff_state_t *state=buff->state;
+  unsigned int length=size;
+
+  size=ul_cbuff_align(size+state->rear_size)+ul_cbuff_msg_head_size;
+
+  if((state->lasttail > state->head) &&
+     (state->lasttail-state->head <= size))
+      return -1;
+
+  if((state->lasttail > state->head) ||
+     (state->buff_size-state->head > size)){
+    put_info->msg_head=(ul_cbuff_msg_head_t *)(buff->buff_start+state->head);
+
+    put_info->data.ptr=(buff->buff_start+state->head+ul_cbuff_msg_head_size);
+    put_info->data.cont_len=length;
+    put_info->data.wrap_ptr=NULL;
+    put_info->data.wrap_len=0;
+
+    state->head+=size;
+  }else{
+    ul_cbuff_loc_t res_size=state->buff_size-state->head;
+    if(size-res_size >= state->lasttail)
+      return -1;
+
+    put_info->msg_head=(ul_cbuff_msg_head_t *)(buff->buff_start+state->head);
+
+    if(res_size != ul_cbuff_msg_head_size){
+      put_info->data.ptr=(buff->buff_start+state->head+ul_cbuff_msg_head_size);
+      put_info->data.cont_len=res_size-ul_cbuff_msg_head_size;
+      if(put_info->data.cont_len<length){
+       put_info->data.wrap_ptr=buff->buff_start;
+       put_info->data.wrap_len=length-put_info->data.cont_len;
+      }else{
+       put_info->data.wrap_ptr=NULL;
+       put_info->data.wrap_len=0;
+      }
+    }else{
+      put_info->data.ptr=buff->buff_start;
+      put_info->data.cont_len=length;
+      put_info->data.wrap_ptr=NULL;
+      put_info->data.wrap_len=0;
+    }
+
+    state->cycles++;
+    state->head=size-res_size;
+  }
+
+  ((ul_cbuff_msg_head_t *)(buff->buff_start+state->head))->flags=0;
+
+  put_info->msg_head->flags|=flags;
+  put_info->msg_head->length=length;
+
+  return 0;
+}
+
+ul_cbuff_inline int
+ul_cbuff_head_put(ul_cbuff_t *buff, ul_cbuff_put_info_t *put_info)
+{
+  if(buff->state->readers>0)
+    put_info->msg_head->flags+=buff->state->readers;
+  ul_cbuff_mark_ready(put_info->msg_head);
+  put_info->msg_head=NULL;
+  return 0;
+}
+
+ul_cbuff_inline ul_cbuff_loc_t
+ul_cbuff_head_loc(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head)
+{
+  return (unsigned char*)msg_head-buff->buff_start;
+}
+
+ul_cbuff_inline ul_cbuff_loc_t
+ul_cbuff_next_loc(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head)
+{
+  ul_cbuff_loc_t loc;
+  unsigned int size;
+
+  size=ul_cbuff_align(msg_head->length+buff->state->rear_size)+ul_cbuff_msg_head_size;
+
+  loc=(unsigned char*)msg_head-buff->buff_start;
+  if(buff->state->buff_size-loc > size)
+    loc+=size;
+  else
+    loc=size-(buff->state->buff_size-loc);
+
+  return loc;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_attach(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info, int mode)
+{
+  ul_cbuff_state_t *state=buff->state;
+  ul_cbuff_msg_head_t *msg_head;
+
+  msg_head=(ul_cbuff_msg_head_t *)(buff->buff_start+state->head);
+  if(state->readers>=0)
+    state->readers++;
+  if((state->readers<0)||(state->firsttail==state->head)){
+    tail_info->msg_head=msg_head;
+    tail_info->data.ptr=NULL;
+  }else{
+    /* There is already some message(s) write in progress */
+    tail_info->msg_head=NULL;
+    tail_info->msg_head->flags++;
+    /* Some data fields are abused for ready condition checking */
+    tail_info->data.ptr=(unsigned char*)msg_head;
+    tail_info->data.wrap_ptr=buff->buff_start+state->firsttail;
+    tail_info->data.wrap_len=state->cycles;
+  }
+  return 0;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_incontact(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info)
+{
+  if(tail_info->msg_head==NULL){
+    unsigned char *new_firsttail=buff->buff_start+buff->state->firsttail;
+    unsigned char *old_head=tail_info->data.ptr;
+    unsigned char *old_firsttail=tail_info->data.wrap_ptr;
+    unsigned int old_cycles=tail_info->data.wrap_len;
+    unsigned int new_cycles=buff->state->cycles;
+
+    if(old_firsttail<old_head){
+      if((new_firsttail<old_head)&&(new_cycles==old_cycles))
+        return 0;
+    }else{
+      if(new_cycles==old_cycles)
+        return 0;
+      if((new_firsttail<old_head)&&((new_cycles-old_cycles)==1))
+        return 0;
+    }
+    tail_info->msg_head=(ul_cbuff_msg_head_t *)old_head;
+    return 1;
+  }
+  return 1;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_test(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info)
+{
+  ul_cbuff_loc_t res_size;
+  unsigned int length;
+  ul_cbuff_msg_head_t *msg_head=tail_info->msg_head;
+
+  if(!msg_head)
+    return -1;
+
+  if(!ul_cbuff_is_ready(msg_head))
+    return 0;
+
+  res_size=buff->state->buff_size-((unsigned char*)msg_head-buff->buff_start);
+  length=msg_head->length;
+
+  if(res_size > ul_cbuff_msg_head_size){
+    tail_info->data.ptr=(unsigned char*)msg_head+ul_cbuff_msg_head_size;
+    if(res_size-ul_cbuff_msg_head_size >= length){
+      tail_info->data.cont_len=length;
+      tail_info->data.wrap_ptr=NULL;
+      tail_info->data.wrap_len=0;
+    }else{
+      tail_info->data.cont_len=res_size-ul_cbuff_msg_head_size;
+      tail_info->data.wrap_ptr=buff->buff_start;
+      tail_info->data.wrap_len=length-(res_size-ul_cbuff_msg_head_size);
+    }
+  } else {
+    tail_info->data.ptr=buff->buff_start;
+    tail_info->data.cont_len=length;
+    tail_info->data.wrap_ptr=NULL;
+    tail_info->data.wrap_len=0;
+  }
+  return msg_head->flags;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_release(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info)
+{
+  ul_cbuff_msg_head_t *msg_head=tail_info->msg_head;
+  unsigned msg_readers;
+
+  if(!ul_cbuff_is_ready(msg_head))
+    return -1;
+
+  if(buff->state->readers<=0)
+    return 1;
+
+  msg_readers=msg_head->flags&UL_CBUFF_MSG_READERS;
+  if(msg_readers)
+    msg_head->flags--;
+
+  return msg_readers<=1?1:0;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_next(ul_cbuff_t *buff, ul_cbuff_tail_info_t *tail_info)
+{
+  ul_cbuff_msg_head_t *msg_head=tail_info->msg_head;
+
+  if(!ul_cbuff_is_ready(msg_head))
+    return -1;
+
+  tail_info->msg_head=(ul_cbuff_msg_head_t *)(buff->buff_start+
+                       ul_cbuff_next_loc(buff, msg_head));
+  return 0;
+}
+
+ul_cbuff_inline int
+ul_cbuff_tail_state_update(ul_cbuff_t *buff, int release_result, ul_cbuff_loc_t loc, ul_cbuff_loc_t loc_next)
+{
+  if(loc==buff->state->firsttail)
+    buff->state->firsttail=loc_next;
+
+  if(release_result<=0)
+    return 0;
+
+  if(loc==buff->state->lasttail){
+    buff->state->lasttail=loc_next;
+    return 1;
+  }else{
+    return -1;
+  }
+}
+
+ul_cbuff_inline void
+ul_cbuff_data_do_wrap(ul_cbuff_data_info_t *data_info)
+{
+  data_info->ptr=data_info->wrap_ptr;
+  data_info->cont_len=data_info->wrap_len;
+  data_info->wrap_ptr=NULL;
+  data_info->wrap_len=0;
+}
+
+ul_cbuff_inline int
+ul_cbuff_data_at_once(ul_cbuff_data_info_t *data_info, void **pptr, int size)
+{
+  int cont_len;
+
+  *pptr=data_info->ptr;
+  if(!data_info->ptr)
+    return 0;
+  cont_len=data_info->cont_len;
+  if(cont_len>size){
+    cont_len=size;
+    data_info->ptr+=size;
+    data_info->cont_len-=cont_len;
+  }else{
+    ul_cbuff_data_do_wrap(data_info);
+  }
+  return cont_len;
+}
+
+ul_cbuff_inline int
+ul_cbuff_put_data(ul_cbuff_data_info_t *data_info, const void *data, int size)
+{
+  void *ptr;
+  int count;
+  int cont_len;
+
+  ptr=data_info->ptr;
+  if(!ptr)
+    return 0;
+  cont_len=data_info->cont_len;
+  if(cont_len>size){
+    cont_len=size;
+    data_info->ptr+=size;
+    data_info->cont_len-=cont_len;
+  }else{
+    ul_cbuff_data_do_wrap(data_info);
+  }
+  if(cont_len<=0)
+    return 0;
+  memcpy(ptr,data,cont_len);
+  count=cont_len;
+  cont_len=size-cont_len;
+  if(!cont_len)
+    return count;
+
+  ptr=data_info->ptr;
+  if(!ptr)
+    return count;
+  data=(char*)data+count;
+  if(cont_len>data_info->cont_len)
+    cont_len=data_info->cont_len;
+  data_info->ptr+=cont_len;
+  data_info->cont_len-=cont_len;
+  memcpy(ptr,data,cont_len);
+
+  return cont_len+count;
+}
+
+ul_cbuff_inline int
+ul_cbuff_get_data(ul_cbuff_data_info_t *data_info, void *data, int size)
+{
+  void *ptr;
+  int count;
+  int cont_len;
+
+  ptr=data_info->ptr;
+  if(!ptr)
+    return 0;
+  cont_len=data_info->cont_len;
+  if(cont_len>size){
+    cont_len=size;
+    data_info->ptr+=size;
+    data_info->cont_len-=cont_len;
+  }else{
+    ul_cbuff_data_do_wrap(data_info);
+  }
+  if(cont_len<=0)
+    return 0;
+  memcpy(data,ptr,cont_len);
+  count=cont_len;
+  cont_len=size-cont_len;
+  if(!cont_len)
+    return count;
+
+  ptr=data_info->ptr;
+  if(!ptr)
+    return count;
+  data=(char*)data+count;
+  if(cont_len>data_info->cont_len)
+    cont_len=data_info->cont_len;
+  data_info->ptr+=cont_len;
+  data_info->cont_len-=cont_len;
+  memcpy(data,ptr,cont_len);
+
+  return cont_len+count;
+}
+
+
+ul_cbuff_inline void *
+ul_cbuff_get_rear_ptr(ul_cbuff_t *buff, ul_cbuff_msg_head_t *msg_head)
+{
+  ul_cbuff_loc_t loc;
+  unsigned int size;
+  ul_cbuff_state_t *state=buff->state;
+
+  size=ul_cbuff_align(msg_head->length+state->rear_size)+ul_cbuff_msg_head_size;
+  size-=state->rear_size;
+
+  loc=(unsigned char*)msg_head-buff->buff_start;
+  if(state->buff_size-loc > size)
+    loc+=size;
+  else
+    loc=size-(state->buff_size-loc);
+
+  return buff->buff_start+loc;
+}
+
+ul_cbuff_inline void *
+ul_cbuff_prev_rear_ptr(ul_cbuff_t *buff, ul_cbuff_loc_t loc)
+{
+  ul_cbuff_state_t *state=buff->state;
+
+  if(loc>state->rear_size)
+    return buff->buff_start+loc-state->rear_size;
+  else
+    return buff->buff_start+loc+state->buff_size-state->rear_size;
+}
+
+#endif /*UL_CBUFF_INLINE*/
+
+int ul_cbuff_init(ul_cbuff_t *buff, ul_cbuff_state_t *state,
+                 void *buff_start, ul_cbuff_loc_t size);
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_CBUFF_H */
diff --git a/ulan/host/libs4c/ulut/ul_dbufbase.c b/ulan/host/libs4c/ulut/ul_dbufbase.c
new file mode 100644 (file)
index 0000000..ab9b961
--- /dev/null
@@ -0,0 +1,100 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_dbufbase.c        - dynamicaly allocated buffer
+
+  (C) Copyright 2001-2004 by Pavel Pisa - Originator
+  (C) Copyright 2003-2004 by Frantisek Vacek - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_dbuff.h"
+
+typedef unsigned char byte;
+
+/**
+ * ul_dbuff_init - init memory allocated for dynamic buffer 
+ * @buf: buffer structure
+ * @flags: flags describing behaviour of the buffer
+ *         only UL_DBUFF_IS_STATIC flag is supported.
+ *         in this case buffer use unly static array sbuf 
+ *
+ * Returns capacity of initialised buffer
+ */
+int ul_dbuff_init(ul_dbuff_t *buf, int flags)
+{
+    buf->capacity = UL_DBUFF_SLEN;
+    buf->data = buf->sbuff;
+    buf->len = 0;
+    buf->flags = flags;
+    return buf->capacity;
+}                                                                               
+
+/**
+ * ul_dbuff_destroy - frees all resources allocated by buf 
+ * @buf: buffer structure
+ */
+void ul_dbuff_destroy(ul_dbuff_t *buf)
+{
+    ul_dbuff_prep(buf, 0);
+}
+
+/**
+ * ul_dbuff_prep - sets a new len and capacity of the buffer
+ * @buf: buffer structure
+ * @new_len: new desired buffer length
+ *
+ * Returns new buffer length
+ */
+int ul_dbuff_prep(ul_dbuff_t *buf, int new_len)
+{
+    if(buf->flags & UL_DBUFF_IS_STATIC) {
+        if(!buf->data || !buf->capacity) {
+            buf->capacity = sizeof(buf->sbuff);
+            buf->data = buf->sbuff;
+        }
+        if(new_len > buf->capacity) {
+            buf->len=0;
+           return 0;
+        }
+    }else{
+        if(new_len > UL_DBUFF_SLEN) {
+            if(new_len != buf->capacity){
+                if((buf->data) && (buf->data != &(buf->sbuff[0]))) {
+                    free(buf->data);
+                }
+                buf->data=malloc(new_len);
+                if(!buf->data){
+                    buf->capacity=0;
+                    buf->len=0;
+                    return 0;
+                }
+                buf->capacity=new_len;
+            }
+        }else{
+            if((buf->data) && (buf->data != &(buf->sbuff[0]))) {
+                free(buf->data);
+                buf->data = &(buf->sbuff[0]);
+            }
+            buf->capacity=UL_DBUFF_SLEN;
+        }
+    }
+    buf->len = new_len;
+    memset(buf->data,0,new_len);
+    return buf->len;
+}
diff --git a/ulan/host/libs4c/ulut/ul_dbuff.h b/ulan/host/libs4c/ulut/ul_dbuff.h
new file mode 100644 (file)
index 0000000..de9fda4
--- /dev/null
@@ -0,0 +1,109 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_dbuff.c   - dynamic buffer
+
+  (C) Copyright 2001-2004 by Pavel Pisa - Originator
+  (C) Copyright 2003-2004 by Frantisek Vacek - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_DBUFF_H
+#define _UL_DBUFF_H
+
+#include "ul_utdefs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_DBUFF_SLEN 8
+
+#define UL_DBUFF_IS_STATIC 1 
+/* use only sbuf or reserved data space (no dynamic allocation) */
+
+/**
+ * struct ul_dbuff - Generic Buffer for Dynamic Data
+ * @len:       actual length of stored data
+ * @capacity:  capacity of allocated buffer
+ * @flags:     only one flag (%UL_DBUFF_IS_STATIC) used now
+ * @data:      pointer to dynamically allocated buffer
+ * @sbuff:     static buffer for small data sizes
+ */
+typedef struct ul_dbuff {      /* generic buffer for dynamic data */
+  unsigned long len;           /* actual length of stored data */
+  unsigned long capacity;      /* capacity of allocated buffer */
+  int flags;                /* only one flag (UL_DBUFF_IS_STATIC) exists*/
+  unsigned char *data;         /* pointer to dynamically allocated buffer */
+  unsigned char        sbuff[UL_DBUFF_SLEN]; /* static buffer */
+} ul_dbuff_t;
+
+/* Basic routines */
+
+int ul_dbuff_init(ul_dbuff_t *buf, int flags);
+void ul_dbuff_destroy(ul_dbuff_t *buf);
+int ul_dbuff_prep(ul_dbuff_t *buf, int new_len);
+
+/* Extended set of routines */
+
+int ul_dbuff_set_capacity(ul_dbuff_t *buf, int new_capacity);
+int ul_dbuff_set_len(ul_dbuff_t *buf, int new_len);
+int ul_dbuff_set(ul_dbuff_t *buf, unsigned char b, int len);
+int ul_dbuff_cpy(ul_dbuff_t *buf, const void *b, int len);
+int ul_dbuff_cat(ul_dbuff_t *buf, const void *b, int len);
+int ul_dbuff_pos(const ul_dbuff_t *buf, unsigned char what, unsigned char quote);
+int ul_dbuff_strcpy(ul_dbuff_t *buf, const char *str);
+int ul_dbuff_strcat(ul_dbuff_t *buf, const char *str);
+int ul_dbuff_append_byte(ul_dbuff_t *buf, unsigned char b);
+int ul_dbuff_export(ul_dbuff_t *srcdb, void *dest, int maxlen);
+
+void ul_dbuff_cut_pos(ul_dbuff_t *fromdb, ul_dbuff_t *todb, int n);
+void ul_dbuff_cut_delimited(ul_dbuff_t *fromdb, ul_dbuff_t *todb, char delimiter, char quote);
+void ul_dbuff_cut_token(ul_dbuff_t *fromdb, ul_dbuff_t *todb);
+
+/*
+ * ul_dbuff_ltrim - removes all white spaces from left of dbuff.
+ *
+ * Return Value: new len of dbuff (including terminating zero, if present)
+ */
+int ul_dbuff_ltrim(ul_dbuff_t *buf);
+/*
+ * ul_dbuff_rtrim - removes all white spaces from right of dbuff.
+ *                  If dbuff is zero terminated, trimmed dbuff is also zero terminated
+ *
+ * Return Value: new len of dbuff (including terminating zero, if present)
+ */
+int ul_dbuff_rtrim(ul_dbuff_t *buf);
+/*
+ * ul_dbuff_trim - removes all white spaces from left and right of dbuff.
+ *                 If dbuff is zero terminated, trimmed dbuff is also zero terminated
+ *
+ * Return Value: new len of dbuff (including terminating zero, if present)
+ */
+int ul_dbuff_trim(ul_dbuff_t *buf);
+
+void ul_dbuff_log_hex(ul_dbuff_t *buf, int log_level);
+
+int ul_str_pos(const unsigned char *str, const unsigned char *what, unsigned char quote);
+int ul_str_cpos(const unsigned char *str, unsigned char what, unsigned char quote);
+int ul_str_ncpy(unsigned char *to, const unsigned char *from, int buff_size);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_DBUFF_H */
diff --git a/ulan/host/libs4c/ulut/ul_dbufflog.c b/ulan/host/libs4c/ulut/ul_dbufflog.c
new file mode 100644 (file)
index 0000000..068e092
--- /dev/null
@@ -0,0 +1,25 @@
+#include "ul_dbufflog.h"
+#include "ul_log.h"
+
+ul_log_domain_t ulogd_dbuff;
+
+void ul_dbuff_log_hex(ul_dbuff_t *buf, int log_level)
+{
+    int i;
+    ul_log(&ulogd_dbuff, log_level, "len=%li capacity=%li\n", buf->len, buf->capacity);
+    log_level |= UL_LOGL_CONT;
+    for(i=0; i<buf->len; i++) {
+        char c = buf->data[i];
+        if(i > 0) ul_log(&ulogd_dbuff, log_level, " ");
+        if(c > ' ') ul_log(&ulogd_dbuff, log_level, " %c", c);
+        else        ul_log(&ulogd_dbuff, log_level, "%02x", c);
+    }
+    ul_log(&ulogd_dbuff, log_level, "\n");
+    for(i=0; i<buf->len; i++) {
+        char c = buf->data[i];
+        if(i > 0) ul_log(&ulogd_dbuff, log_level, " ");
+        ul_log(&ulogd_dbuff, log_level, "%02x", c);
+    }
+    ul_log(&ulogd_dbuff, log_level, "\n");
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_dbufflog.h b/ulan/host/libs4c/ulut/ul_dbufflog.h
new file mode 100644 (file)
index 0000000..5853904
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef UL_DBUFFLOG_H
+#define UL_DBUFFLOG_H
+
+#include "ul_dbuff.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * ul_dbuff_log_hex - writes content of dbuff to log
+ * @buf: buffer structure
+ * @log_level: logging level
+ */
+void ul_dbuff_log_hex(ul_dbuff_t *buf, int log_level);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* UL_DBUFFLOG_H */
+
diff --git a/ulan/host/libs4c/ulut/ul_dbufmore.c b/ulan/host/libs4c/ulut/ul_dbufmore.c
new file mode 100644 (file)
index 0000000..34b8fc9
--- /dev/null
@@ -0,0 +1,467 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_dbufmore.c        - more functions for dynamically allocated buffer
+
+  (C) Copyright 2001-2004 by Pavel Pisa - Originator
+  (C) Copyright 2003-2004 by Frantisek Vacek - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_dbuff.h"
+
+typedef unsigned char byte;
+
+//#undef DEBUG
+
+/**
+ * ul_dbuff_set_capacity - change capacity of buffer to at least @new_capacity
+ * @buf: buffer structure
+ * @new_capacity: new capacity
+ *
+ * Returns real capacity of reallocated buffer
+ */
+int ul_dbuff_set_capacity(ul_dbuff_t *buf, int new_capacity)
+{
+    if(new_capacity < 0) new_capacity = 0;
+    #ifdef UL_DBUFF_LOGGING
+    int old_capacity = buf->capacity;
+    #endif
+    if(buf->flags & UL_DBUFF_IS_STATIC) {
+        if(!buf->data || !buf->capacity) {
+            buf->capacity = sizeof(buf->sbuff);
+            buf->data = buf->sbuff;
+        }
+    }
+    else{
+        if(new_capacity <= UL_DBUFF_SLEN) {
+            if((buf->data) && (buf->data != buf->sbuff)) {
+                // dynamic storage -> static
+                unsigned long c = buf->capacity;
+                if(c > sizeof(buf->sbuff)) c = sizeof(buf->sbuff);
+                memcpy(buf->sbuff, buf->data, c);
+                free(buf->data);
+            }
+            buf->capacity = sizeof(buf->sbuff);
+            buf->data = buf->sbuff;
+        }
+        else if(new_capacity != buf->capacity) {
+            if(buf->data == buf->sbuff) {
+                // static storage -> dynamic
+                buf->data = malloc((size_t)new_capacity);
+                if(buf->data != NULL) {
+                    memcpy(buf->data, buf->sbuff, buf->capacity);
+                    buf->capacity = new_capacity;
+                }
+                else {
+                    buf->capacity = 0;
+                }
+            }
+            else {
+                // dynamic storage -> dynamic
+               unsigned char *new_data;
+                new_data = realloc(buf->data, (size_t)new_capacity);
+                if(buf->data != NULL) {
+                    buf->capacity = new_capacity;
+                    buf->data = new_data;
+                }
+                else {
+                    /* Old data are not changed if realloc fails, capacity remains at old value */
+                    #ifdef UL_DBUFF_LOGGING
+                    vca_log("dbuff", LOG_DEB, "realloc buffer to %d failed\n", new_capacity);
+                    #endif
+                }
+            }
+        }
+    }
+    if(buf->len > buf->capacity) buf->len = buf->capacity;
+    #ifdef UL_DBUFF_LOGGING
+    vca_log("dbuff", LOG_DEB, "capacity changed from %d to %ld, required %d\n", old_capacity, buf->capacity, new_capacity);
+    #endif
+    return buf->capacity;
+}                                                                               
+
+/**
+ * ul_dbuff_set_len - sets a new len of the buffer, change the capacity if neccessary 
+ * @buf: buffer structure
+ * @new_len: new desired buffer length
+ *
+ * Returns new buffer length
+ */
+int ul_dbuff_set_len(ul_dbuff_t *buf, int new_len)
+{
+    if(new_len < 0) new_len = 0;
+    if(new_len > buf->capacity) {
+        unsigned long new_cap = UL_DBUFF_SLEN;
+        for(; new_cap < new_len; new_cap <<= 1);
+        ul_dbuff_set_capacity(buf, new_cap);
+    }
+    if(new_len > buf->capacity) {
+        /*buf->data = buf->sbuff;*/
+        /*strncpy(buf->data, "set_len ERROR", buf->capacity);*/
+        new_len = buf->capacity;
+    }
+    buf->len = new_len;
+    return buf->len;
+}
+/**
+ * ul_dbuff_cpy - copies bytes to buffer and change its capacity if neccessary like memset
+ * @buf: buffer structure
+ * @b: appended bytes
+ * @n: number of apended bytes
+ *
+ * Returns: length of buffer
+ */
+int ul_dbuff_set(ul_dbuff_t *buf, byte b, int n)
+{
+    ul_dbuff_set_len(buf, n);
+    memset(buf->data, b, buf->len);
+    return buf->len;
+}
+
+/**
+ * ul_dbuff_cpy - copies bytes to buffer and change its capacity if neccessary 
+ * @buf: buffer structure
+ * @b: appended bytes
+ * @n: number of apended bytes
+ *
+ * Returns: length of buffer
+ */
+int ul_dbuff_cpy(ul_dbuff_t *buf, const void *b, int n)
+{
+    if(b == NULL) return 0;
+    ul_dbuff_set_len(buf, n);
+    memcpy(buf->data, b, buf->len);
+    return buf->len;
+}
+
+/**
+ * ul_dbuff_cat - appends bytes at end of buffer and change its capacity if neccessary 
+ * @buf: buffer structure
+ * @b: appended bytes
+ * @n: number of apended bytes
+ *
+ * Returns: length of buffer
+ */
+int ul_dbuff_cat(ul_dbuff_t *buf, const void *b, int n)
+{
+    unsigned long old_len = buf->len;
+    unsigned long new_len = old_len + n;
+    if(b == NULL) return 0;
+    if(new_len == ul_dbuff_set_len(buf, new_len)) {
+        memcpy(buf->data + old_len, b, n);
+    }
+    #ifdef UL_DBUFF_LOGGING
+    else {
+        vca_log("dbuff", LOG_DEB, "ul_dbuff_cat: set_len(%lu) error, old_len == %lu\n, act len == %lu\n", new_len, old_len, buf->len);
+    }
+    #endif
+    return buf->len;
+}
+
+/**
+ * ul_dbuff_strcat - appends str at dhe end of buffer and change its capacity if neccessary 
+ * @buf: buffer structure
+ * @str: string to append
+ *
+ * Returns number length of buffer (including terminating '\0')
+ */
+inline int ul_dbuff_strcat(ul_dbuff_t *buf, const char *str)
+{
+    /*
+    #ifdef UL_DBUFF_LOGGING
+    if(buf->len > 0) vca_log("dbuff", LOG_DEB, "ul_dbuff_strcat: '%s' + '%s'\n", buf->data, str);
+    else vca_log("dbuff", LOG_DEB, "ul_dbuff_strcat: '' + %s\n", str);
+    #endif
+    */
+    if(str == NULL) return 0;
+    if(buf->len > 0 && buf->data[buf->len-1] == '\0') { 
+        /* #ifdef UL_DBUFF_LOGGING
+        vca_log("dbuff", LOG_DEB, "ul_dbuff_strcat: terminating zero found at %ld, after '%c'\n", buf->len-1, buf->data[buf->len - 2]);
+        #endif
+        */
+        ul_dbuff_set_len(buf, buf->len - 1);
+    }
+    #ifdef UL_DBUFF_LOGGING
+    if(buf->len > 0 && buf->data[buf->len-1] != '\0') {
+        vca_log("dbuff", LOG_ERR, "ul_dbuff_strcat: terminating zero not found at %ld, found '%c'\n", buf->len-1, buf->data[buf->len-1]);
+    }
+    #endif
+    /* #ifdef UL_DBUFF_LOGGING
+    ul_dbuff_cat(buf, str, strlen(str) + 1);
+    vca_log("dbuff", LOG_DEB, "ul_dbuff_strcat: returning '%s'\n", buf->data);
+    return buf->len;
+    #else
+    return ul_dbuff_cat(buf, str, strlen(str) + 1);
+    #endif */
+    return ul_dbuff_cat(buf, str, strlen(str) + 1);
+}
+/**
+ * ul_dbuff_strcpy - copy str to the buffer and change its capacity if neccessary 
+ * @buf: buffer structure
+ * @str: string to copy
+ *
+ * Returns number length of buffer (including terminating '\0')
+ */
+inline int ul_dbuff_strcpy(ul_dbuff_t *buf, const char *str)
+{
+    ul_dbuff_set_len(buf, 0);
+    return ul_dbuff_strcat(buf, str);
+}
+/**
+ * ul_dbuff_append_byte - appends byte at dhe end of buffer and change its capacity if neccessary 
+ * @buf: buffer structure
+ * @b: appended byte
+ *
+ * Returns number length of buffer (including terminating '\0')
+ */
+inline int ul_dbuff_append_byte(ul_dbuff_t *buf, unsigned char b)
+{
+    return ul_dbuff_cat(buf, &b, 1);
+}
+/**
+ * ul_dbuff_ltrim - remove all white space characters from the left 
+ * @buf: buffer structure
+ *
+ * Return: new length of buffer
+ */
+int ul_dbuff_ltrim(ul_dbuff_t *buf)
+{
+       byte *pb = buf->data;
+    int i, j;
+       for(i=0; pb[i]<=' ' && i<buf->len; i++);
+       if(i > 0) {
+               for(j=i, i=0; j<buf->len; j++, i++) pb[i] = pb[j];
+        buf->len = i;
+       }
+       return buf->len;
+}
+
+/**
+ * ul_dbuff_rtrim - remove all white space characters from the right
+ * @buf: buffer structure
+ *
+ * if buffer is terminated by '\0', than is also terminated after rtrim
+ *
+ * Return: new length of buffer
+ */
+int ul_dbuff_rtrim(ul_dbuff_t *buf)
+{
+    int i = buf->len - 1;
+    unsigned char *pb = buf->data;
+    int terminated = 0;
+    if(i < 0) return buf->len;
+    if(pb[i] == '\0') terminated = 1;
+    for(; i>=0; i--) {
+               if(pb[i]>' ') {
+            i++;
+            if(terminated) pb[i++] = '\0';
+            buf->len = i;
+            break;
+        }
+       }
+       return buf->len;
+}
+
+/**
+ * ul_dbuff_trim - remove all white space characters from the right and from the left 
+ * @buf: buffer structure
+ *
+ * Returns number length of buffer (including terminating '\0')
+ */
+int ul_dbuff_trim(ul_dbuff_t *buf)
+{
+    ul_dbuff_rtrim(buf);
+    return ul_dbuff_ltrim(buf);
+}
+
+/**
+ * ul_dbuff_cpos - searches string for char 
+ * @buf:   searched dbuff
+ * @what:  char to find
+ * @quote: skip str areas quoted in quote chars<br>
+ *         If you want to ignore quotes assign '\0' to quote in function call 
+ *
+ * Return: position of what char or negative value
+ */
+int ul_dbuff_cpos(const ul_dbuff_t *buf, unsigned char what, unsigned char quote)
+{
+    int in_quotes = 0;
+    int ret;
+    unsigned char *bytes = buf->data;
+    for(ret = 0; ret < buf->len; ret++) {
+        if(bytes[ret] == quote) {
+            in_quotes = !in_quotes;
+            continue;
+        }
+        if(bytes[ret] == what && !in_quotes) {
+            break;
+        }
+    }
+    if(ret >= buf->len) ret = -1;
+    return ret;
+}
+
+/**
+ * ul_str_cpos - searches string for char 
+ * @str:   zero terminated string
+ * @what:  char to find
+ * @quote: skip str areas quoted in quote chars
+ *         If you want to ignore quotes assign '\0' to quote in function call 
+ *
+ * Return: position of what char or negative value
+ */
+int ul_str_cpos(const unsigned char *str, unsigned char what, unsigned char quote)
+{
+    int in_quotes = 0;
+    int ret;
+    for(ret = 0; str[ret]; ret++) {
+        if(str[ret] == quote) {
+            in_quotes = !in_quotes;
+            continue;
+        }
+        if(str[ret] == what && !in_quotes) {
+            break;
+        }
+    }
+    if(!str[ret]) ret = -1;
+    return ret;
+}
+
+/**
+ * ul_str_pos - searches string for substring
+ * @str:   zero terminated string
+ * @what:  string to find
+ * @quote: skip str areas quoted in quote chars
+ *         If you want to ignore quotes assign '\0' to quote in function call 
+ *
+ * Return: position of what string or negative value
+ */
+int ul_str_pos(const unsigned char *str, const unsigned char *what, unsigned char quote)
+{
+    int in_quotes = 0;
+    int ret;
+    for(ret = 0; str[ret]; ret++) {
+        if(str[ret] == quote) {
+            in_quotes = !in_quotes;
+            continue;
+        }
+        if(!in_quotes) {
+            int i;
+            for(i=0; str[ret + i]==what[i] && what[i]; i++);
+            if(!what[i]) return ret;
+        }
+    }
+    return -1;
+}
+
+/**
+ * ul_str_ncpy - copies string to the buffer
+ * @to:         buffer where to copy str
+ * @from:       zero terminated string
+ * @buff_size:  size of the @to buffer (including terminating zero)
+ *
+ * Standard strncpy function have some disadvatages 
+ * (ie. do not append term. zero if copied string doesn't fit in to buffer, fills whole rest of buffer with zeros)
+ *
+ * Returns strlen(to) or negative value in case of error
+ */
+int ul_str_ncpy(unsigned char *to, const unsigned char *from, int buff_size)
+{
+    int i;
+    if(!to || !from) return -1;
+    if(buff_size <= 0) return -2;
+    for(i=0; i<buff_size-1 && from[i]; i++) to[i] = from[i];
+    to[i] = '\0';
+    return i;
+}
+
+/**
+ * ul_dbuff_cut_pos - cut first @n bytes from @fromdb and copies it to @todb.
+ * If @n is greater than fromdb.len whole @fromdb is copied to @todb.
+ * If @n is negative position to cut is counted from the end of @fromdb.
+ * If @n is zero @fromdb stays unchanged and todb is resized to len equal zero.
+ * @fromdb: buffer to cut from
+ * @todb:   buffer to copy to
+ * @n:      position where to cut
+ */
+void ul_dbuff_cut_pos(ul_dbuff_t *fromdb, ul_dbuff_t *todb, int n)
+{
+    int newlen;
+    if(n < 0) n = fromdb->len + n;
+    if(n < 0) n = 0;
+    if(n > fromdb->len) n = fromdb->len;
+    newlen = fromdb->len - n;
+    ul_dbuff_cpy(todb, fromdb->data, n);
+    memmove(fromdb->data, fromdb->data + n, fromdb->len - n);
+    ul_dbuff_set_len(fromdb, newlen);
+}
+
+/**
+ * ul_dbuff_cut - cuts bytes before delimiter + delimiter char from @fromdb and copies tham to the @todb
+ * If @fromdb doesn't contain delimiter @todb is trimmed to zero length.
+ * @fromdb: buffer to cut from
+ * @todb:   buffer to copy to
+ * @delimiter: delimiter char
+ * @quote:   quoted delimiters are ignored, @quote can be '\0', than it is ignored.
+ */
+void ul_dbuff_cut_delimited(ul_dbuff_t *fromdb, ul_dbuff_t *todb, char delimiter, char quote)
+{
+    int pos = ul_dbuff_cpos(fromdb, delimiter, quote);
+    if(pos < 0) pos = -1;
+    ul_dbuff_cut_pos(fromdb, todb, pos+1);
+}
+
+/**
+ * ul_dbuff_cut_token - cuts not whitespaces from %fromdb to %todb.
+ *                      Leading whitespaces are ignored. Cut string is trimmed.
+ * @fromdb: buffer to cut from
+ * @todb:   buffer to copy to
+ */
+void ul_dbuff_cut_token(ul_dbuff_t *fromdb, ul_dbuff_t *todb)
+{
+    const unsigned char *pc = (unsigned char*)fromdb->data;
+    int pos;
+    /* skip leading white spaces */
+    for(pos=0; pc[pos]>0 && pc[pos]<=' ' && pos<fromdb->len; pos++);
+    /* skip token */
+    for(; pc[pos]>' ' && pos<fromdb->len; pos++);
+    ul_dbuff_cut_pos(fromdb, todb, pos);
+    ul_dbuff_trim(todb);
+}
+
+/**
+ * ul_dbuff_export - Copies data from %srcdb to the buffer %dest.
+ * @srcdb: source dbuff
+ * @dest: destination buffer
+ * @maxlen: maximum number of bytes to copy
+ * 
+ * Returns: the number of bytes copied.
+ */
+int ul_dbuff_export(ul_dbuff_t *srcdb, void *dest, int maxlen)
+{
+    int len;
+    if (!dest) return 0;
+    len = srcdb->len < maxlen ? srcdb->len : maxlen;
+    memcpy(dest, srcdb->data, len);
+    return len;
+}
diff --git a/ulan/host/libs4c/ulut/ul_evcbase.c b/ulan/host/libs4c/ulut/ul_evcbase.c
new file mode 100644 (file)
index 0000000..353b6e4
--- /dev/null
@@ -0,0 +1,423 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evcbase.c - event connectors
+
+  (C) Copyright 2001-2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <stdarg.h>
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_list.h"
+#include "ul_evcbase.h"
+
+UL_LIST_CUST_DEC(evc_tx_list, evc_tx_hub_t, evc_link_t, links, src.peers)
+UL_LIST_CUST_DEC(evc_rx_list, evc_rx_hub_t, evc_link_t, links, dst.multi.peers)
+
+/**
+ * evc_link_init - Initialize Event Connector Link
+ * @link:      pointer to the link
+ *
+ * Link reference count is set to 1 by this function
+ * Return Value: negative value informs about failure.
+ */
+int evc_link_init(evc_link_t *link)
+{
+  memset(link,0,sizeof(evc_link_t));
+  evc_rx_list_init_detached(link);
+  evc_tx_list_init_detached(link);
+  evc_link_inc_refcnt(link);
+  return 0;
+}
+
+/**
+ * evc_link_new - Allocates New Event Connector Link
+ *
+ * Link reference count is set to 1 by this function
+ * Return Value: pointer to the new link or %NULL.
+ */
+evc_link_t *evc_link_new(void)
+{
+  evc_link_t *link;
+  
+  link=malloc(sizeof(evc_link_t));
+  if(link==NULL) return NULL;
+
+  evc_link_init(link);
+  link->malloced=1;
+  return link;
+}
+
+/**
+ * evc_link_connect - Connects Link between Two Hubs
+ * @link:      pointer to the non-connected initialized link
+ * @src:       pointer to the source hub of type &evc_tx_hub_t
+ * @dst:       pointer to the destination hub of type &evc_rx_hub_t
+ * @prop:      propagation function corresponding to source and destination
+ *             expected event arguments
+ *
+ * If ready flag is not set, link state is set to ready
+ * and reference count is increased.
+ * Return Value: negative return value indicates fail.
+ */
+int evc_link_connect(evc_link_t *link, evc_tx_hub_t *src, evc_rx_hub_t *dst,
+                     evc_prop_fnc_t *prop)
+{
+  int link_ready;
+
+  if(!link || !src || !dst || !prop) return -1;
+  if(link->standalone) return -1;
+  evc_link_inc_refcnt(link);
+  link->delete_pend=0;
+  link->propagate=prop;
+  link->src.hub=src;
+  evc_tx_list_insert(src,link);
+  link->dst.multi.hub=dst;
+  evc_rx_list_insert(dst,link);
+  link_ready=link->ready;
+  link->ready=1;
+  if(link_ready){
+    evc_link_dec_refcnt(link);
+  }
+
+  return 0;
+}
+
+/**
+ * evc_link_init_standalone - Initialize Standalone Link
+ * @link:      pointer to the link
+ * @rx_fnc:    pointer to the function invoked by event reception
+ * @context:   context for the rx_fnc() function invocation
+ *
+ * Link reference count is set to 1 by this function
+ * Return Value: negative value informs about failure.
+ */
+int evc_link_init_standalone(evc_link_t *link, evc_rx_fnc_t *rx_fnc, void *context)
+{
+  memset(link,0,sizeof(evc_link_t));
+  evc_rx_list_init_detached(link);
+  link->standalone=1;
+  link->dst.standalone.rx_fnc=rx_fnc;
+  link->dst.standalone.context=context;
+  evc_link_inc_refcnt(link);
+  return 0;
+}
+
+/**
+ * evc_link_new_standalone - Allocates New Standalone Link
+ * @rx_fnc:   callback function invoked if event is delivered
+ * @context:  context provided to the callback function
+ *
+ * Link reference count is set to 1 by this function
+ * Return Value: pointer to the new link or %NULL.
+ */
+evc_link_t *evc_link_new_standalone(evc_rx_fnc_t *rx_fnc, void *context)
+{
+  evc_link_t *link;
+  
+  link=malloc(sizeof(evc_link_t));
+  if(link==NULL) return NULL;
+
+  evc_link_init_standalone(link, rx_fnc, context);
+  link->malloced=1;
+  return link;
+}
+
+/**
+ * evc_link_connect_standalone - Connects Standalone Link to Source Hubs
+ * @link:      pointer to the non-connected initialized link
+ * @src:       pointer to the source hub of type &evc_tx_hub_t
+ * @prop:      propagation function corresponding to hub source
+ *             and standalone rx_fnc() expected event arguments
+ *
+ * If ready flag is not set, link state is set to ready
+ * and reference count is increased.
+ * Return Value: negative return value indicates failure.
+ */
+int evc_link_connect_standalone(evc_link_t *link, evc_tx_hub_t *src,
+           evc_prop_fnc_t *prop)
+{
+  int link_ready;
+
+  if(!link || !src || !prop) return -1;
+  if(!link->standalone) return -1;
+  evc_link_inc_refcnt(link);
+  link->delete_pend=0;
+  link->propagate=prop;
+  link->src.hub=src;
+  evc_tx_list_insert(src,link);
+  link_ready=link->ready;
+  link->ready=1;
+  if(link_ready){
+    evc_link_dec_refcnt(link);
+  }
+
+  return 0;
+}
+
+
+static inline
+void evc_link_do_delete(evc_link_t *link)
+{
+  evc_tx_list_del_item(link);
+  link->src.hub=NULL;
+  if(!link->standalone){
+    evc_rx_list_del_item(link);
+    link->dst.multi.hub=NULL;
+  }
+  link->delete_pend=0;
+}
+
+
+/**
+ * evc_link_delete - Deletes Link from Hubs Lists
+ * @link:      pointer to the possibly connected initialized link
+ *
+ * If ready flag is set, link ready flag is cleared and reference count
+ * is decreased. This could lead to link disappear, if nobody is holding
+ * reference.
+ * Return Value: positive return value indicates immediate delete,
+ *             zero return value informs about delayed delete.
+ */
+int evc_link_delete(evc_link_t *link)
+{
+  int res;
+  link->delete_pend=1;
+  if(!link->taken){
+    evc_link_do_delete(link);
+    res=1;
+  } else {
+    res=0;
+  }
+  if(link->ready){
+    link->ready=0;
+    evc_link_dec_refcnt(link);
+  }
+  return res;
+}
+
+/**
+ * evc_link_dispose - Disposes Link
+ * @link:      pointer to the possibly connected initialized link
+ *
+ * Deletes link from hubs, marks it as dead, calls final death propagate()
+ * for the link and if link is @malloced, releases link occupied memory.
+ */
+void evc_link_dispose(evc_link_t *link)
+{
+  if(!link->dead){
+    link->dead=1;
+    if(!link->propagate(link,0)){
+      evc_link_inc_refcnt(link);
+      evc_link_delete(link);
+      if(link->malloced) free(link);
+      else if(link->refcnt>0) link->refcnt--;
+    }
+  }
+}
+/**
+ * evc_tx_hub_init - Initializes Event Transmition Hub
+ * @hub:       pointer to the &evc_tx_hub_t type hub
+ *
+ * Return Value: negative return value indicates failure.
+ */
+int evc_tx_hub_init(evc_tx_hub_t *hub)
+{
+  evc_tx_list_init_head(hub);
+  return 0;
+}
+
+/**
+ * evc_tx_hub_done - Finalize Event Transmition Hub
+ * @hub:       pointer to the &evc_tx_hub_t type hub
+ */
+void evc_tx_hub_done(evc_tx_hub_t *hub)
+{
+  evc_link_t *link;
+  ul_list_for_each_cut(evc_tx_list, hub, link){
+    evc_link_inc_refcnt(link);
+    link->src.hub=NULL;
+    evc_link_delete(link);
+    evc_link_dec_refcnt(link);
+  }
+}
+
+static inline
+int evc_prop_link_skip(evc_link_t *link)
+{
+  if(link->dead || link->blocked || link->delete_pend) return 1;
+  if(!link->recursive && link->taken) return 1;
+  return 0;
+}
+
+/**
+ * evc_tx_hub_propagate - Propagate Event to Links Destinations
+ * @hub:       pointer to the &evc_tx_hub_t type hub
+ * @args:      pointer to the variable arguments list
+ *
+ * The function propagates event to the connected links,
+ * it skips links marked as @dead, @blocked or @delete_pend.
+ * If the link is not marked as @recursive, it ensures, that
+ * link is not called twice.
+ */
+void evc_tx_hub_propagate(evc_tx_hub_t *hub, va_list args)
+{
+  evc_link_t *link, *next;
+  
+  link=evc_tx_list_first(hub);
+  while(1){
+    if(!link) return;
+    if(!evc_prop_link_skip(link)) break;
+    link=evc_tx_list_next(hub,link);
+  }
+  evc_link_inc_refcnt(link);   /*prevents dispose of the link*/
+  link->taken++;               /*prevents delete of the link from the hub*/
+  do{
+    link->propagate(link, args);
+
+    if(link->src.hub == hub){  /*check for correct hub relation*/
+      next=link;
+      while(1){
+        next=evc_tx_list_next(hub,next);
+        if(!next) break;
+        if(!evc_prop_link_skip(next)) {
+          evc_link_inc_refcnt(next); /*prevents dispose of the link*/
+          next->taken++;       /*prevents delete of the link from the hub*/
+          break;
+        }
+      }
+    }else{
+      /* link is already disconnected from the hub, 
+         result of evc_tx_hub_done  */
+      next=NULL;
+    }
+    if(!(--link->taken)){
+      if(link->delete_pend)
+        evc_link_delete(link); /*process pending delete*/
+    }
+    evc_link_dec_refcnt(link); /*can lead to dispose of the link*/
+  }while((link=next));
+}
+
+/**
+ * evc_tx_hub_emit - Emits Event to Hub
+ * @hub:       pointer to the &evc_tx_hub_t type hub
+ *
+ * The function hands over arguments to evc_tx_hub_propagate()
+ * as &va_list.
+ */
+void evc_tx_hub_emit(evc_tx_hub_t *hub, ...)
+{
+  va_list args;
+
+  va_start (args, hub);
+  evc_tx_hub_propagate(hub, args);
+  va_end (args);
+}
+
+int evc_tx_hub_eol_weakptr(evc_tx_hub_t *hub, void **weakptr)
+{
+  evc_link_t *link, *next;
+  int ret=0;
+  
+  link=evc_tx_list_first(hub);
+  while(link){
+    next=evc_tx_list_next(hub,link);
+    if(link->standalone && (link->dst.standalone.weakptr==weakptr)){
+      link->dst.standalone.weakptr=NULL;
+      evc_link_delete(link);
+      ret++;
+    }
+    link=next;
+  }
+  return ret;
+}
+
+
+/**
+ * evc_rx_hub_init - Initializes Event Receiption Hub
+ * @hub:       pointer to the &evc_rx_hub_t type hub
+ * @rx_fnc:    pointer to the function invoked by event reception
+ * @context:   context for the rx_fnc() function invocation
+ *
+ * Return Value: negative return value indicates failure.
+ */
+int evc_rx_hub_init(evc_rx_hub_t *hub, evc_rx_fnc_t *rx_fnc, void *context)
+{
+  evc_rx_list_init_head(hub);
+  hub->rx_fnc=rx_fnc;
+  hub->context=context;
+  return 0;
+}
+
+/**
+ * evc_rx_hub_disconnect_all - Disconnect Receiption Hub from All Sources
+ * @hub:       pointer to the &evc_rx_hub_t type hub
+ */
+void evc_rx_hub_disconnect_all(evc_rx_hub_t *hub)
+{
+  evc_link_t *link;
+  ul_list_for_each_cut(evc_rx_list, hub, link){
+    evc_link_inc_refcnt(link);
+    link->dst.multi.hub=NULL;
+    evc_link_delete(link);
+    evc_link_dec_refcnt(link);
+  }
+}
+
+/**
+ * evc_rx_hub_done - Finalize Event Receiption Hub
+ * @hub:       pointer to the &evc_rx_hub_t type hub
+ */
+void evc_rx_hub_done(evc_rx_hub_t *hub)
+{
+  evc_rx_hub_disconnect_all(hub);
+}
+
+/*===========================================================*/
+/* arguments propagation functions */
+
+typedef int evc_fnc_propagate_i_p_l(void *, long);
+
+int evc_link_propagate_i_p_l(evc_link_t *link, va_list args)
+{
+  void *context;
+  evc_fnc_propagate_i_p_l *fnc;
+  
+  if(link->dead){
+    if(link->standalone && link->dst.standalone.weakptr){
+      *link->dst.standalone.weakptr=NULL;
+      link->dst.standalone.weakptr=NULL;
+    }
+    return 0;
+  }
+  if(link->standalone){
+    fnc=(evc_fnc_propagate_i_p_l*)link->dst.standalone.rx_fnc;
+    context=link->dst.standalone.context;
+  }else{
+    if(!link->dst.multi.hub) return 0;
+    fnc=(evc_fnc_propagate_i_p_l*)link->dst.multi.hub->rx_fnc;
+    context=link->dst.multi.hub->context;
+  }
+  if(fnc)
+    fnc(context, va_arg(args, long));
+  return 0;
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_evcbase.h b/ulan/host/libs4c/ulut/ul_evcbase.h
new file mode 100644 (file)
index 0000000..da77c68
--- /dev/null
@@ -0,0 +1,184 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_evcbase.h - event connectors
+
+  (C) Copyright 2001-2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_EVCBASE_H
+#define _UL_EVCBASE_H
+
+#include <stdarg.h>
+
+#include "ul_utdefs.h"
+#include "ul_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct evc_link;
+struct evc_tx_hub;
+struct evc_rx_hub;
+
+typedef int evc_rx_fnc_t(void);
+typedef int evc_prop_fnc_t(struct evc_link *link, va_list args);
+
+/**
+ * struct evc_link - Event Connector Link
+ * @src:       describes source of the event link, contains pointer
+ *             to &evc_tx_hub_t and @peers links list
+ * @dst:       determines destination of the event, it can be @standalone
+ *             rx_fnc() function with with @context or &evc_tx_hub_t
+ *             in the @multi case
+ * @propagate: pointer to the arguments propagation function,
+ * @refcnt:    link reference counter
+ * @recursive: link can propagate could be invoked recursively,
+ *             else recursive events are ignored by link
+ * @blocked:   event propagation is blocked for the link,
+ *             can be used by application
+ * @ready:     link is ready and has purpose to live - it connects
+ *             two active entities  
+ * @dead:      link is dead and cannot propagate events
+ * @delete_pend: link is being deleted, but it is taken simultaneously,
+ *             delete has to wait for finish of the propagate and to moving
+ *             to the next link
+ * @malloced:  link has been malloced and should be automatically freed
+ *             when referenc counts drop to zero
+ * @standalone:        link is used for standalone function invocation
+ * @tx_full_hub: @src points to the full hub structure
+ * @rx_full_hub: @dst points to the full hub structure
+ * @taken:     link is in middle of the propagation process
+ *
+ * The link delivers events from the source to the destination.
+ * The link specific function propagate() is called for each link leading from
+ * the hub activated by evc_tx_hub_emit() and evc_tx_hub_propagate().
+ * The propagate function is responsible for parameters transformation before
+ * invocation of standalone or destination hub rx_fnc() function.
+ */
+typedef struct evc_link {
+  struct {
+    ul_list_node_t peers;
+    struct evc_tx_hub *hub;
+  } src;
+  union {
+    struct {
+      ul_list_node_t peers;
+      struct evc_rx_hub *hub;
+    } multi;
+    struct {
+      evc_rx_fnc_t *rx_fnc;
+      void *context;
+      void **weakptr;
+    } standalone;
+  } dst;
+  evc_prop_fnc_t *propagate;
+  int          refcnt;
+  unsigned     recursive:1;
+  unsigned     blocked:1;
+  unsigned     ready:1;
+  unsigned     dead:1;
+  unsigned     delete_pend:1;
+  unsigned     malloced:1;
+  unsigned     standalone:1;
+  unsigned     tx_full_hub:1;
+  unsigned     rx_full_hub:1;
+  short                taken;
+} evc_link_t;
+
+/**
+ * struct evc_tx_hub - Event Transmit Hub
+ * @links:     list of links outgoing from the hub
+ */
+typedef struct evc_tx_hub {
+  ul_list_head_t links;
+} evc_tx_hub_t;
+
+/**
+ * struct evc_rx_hub -  Event Receiving Hub
+ * @links:     list of links incoming to the hub
+ * @rx_fnc:    function invoked when event arives
+ * @context:   context for rx_fnc()
+ */
+typedef struct evc_rx_hub {
+  ul_list_head_t links;
+  evc_rx_fnc_t *rx_fnc;
+  void *context;
+} evc_rx_hub_t;
+
+evc_link_t *evc_link_new(void);
+evc_link_t *evc_link_new_standalone(evc_rx_fnc_t *rx_fnc, void *context);
+int evc_link_init(evc_link_t *link);
+int evc_link_init_standalone(evc_link_t *link, evc_rx_fnc_t *rx_fnc,
+                     void *context);
+int evc_link_connect(evc_link_t *link, evc_tx_hub_t *src, evc_rx_hub_t *dst,
+                     evc_prop_fnc_t *prop);
+int evc_link_connect_standalone(evc_link_t *link, evc_tx_hub_t *src,
+           evc_prop_fnc_t *prop);
+int evc_link_delete(evc_link_t *link);
+void evc_link_dispose(evc_link_t *link);
+
+int evc_tx_hub_init(evc_tx_hub_t *hub);
+void evc_tx_hub_done(evc_tx_hub_t *hub);
+void evc_tx_hub_propagate(evc_tx_hub_t *hub, va_list args);
+void evc_tx_hub_emit(evc_tx_hub_t *hub, ...);
+int evc_tx_hub_eol_weakptr(evc_tx_hub_t *hub, void **weakptr);
+
+int evc_rx_hub_init(evc_rx_hub_t *hub, evc_rx_fnc_t *rx_fnc, void *context);
+void evc_rx_hub_done(evc_rx_hub_t *hub);
+void evc_rx_hub_disconnect_all(evc_rx_hub_t *hub);
+
+int evc_link_propagate_i_p_l(evc_link_t *link, va_list args);
+
+/**
+ * evc_link_inc_refcnt - Increment Link Reference Count
+ * @link:      pointer to link
+ */
+static inline
+void evc_link_inc_refcnt(evc_link_t *link)
+{
+  if(!link) return;
+  if(link->refcnt >= 0) link->refcnt++;
+}
+
+/**
+ * evc_link_dec_refcnt - Decrement Link Reference Count
+ * @link:      pointer to link
+ *
+ * if the link reference count drops to 0, link is deleted
+ * from hubs by evc_link_dispose() function and if @malloced
+ * is sed, link memory is disposed by free().
+ * Special handlink can be achieved if propagate() returns non-zero
+ * value if called with @ded link.
+ */
+static inline
+void evc_link_dec_refcnt(evc_link_t *link)
+{
+  if(!link) return;
+  if(link->refcnt > 0) link->refcnt--;
+  if(!link->refcnt) evc_link_dispose(link);
+}
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+
+#endif /* _UL_EVCBASE_H */
diff --git a/ulan/host/libs4c/ulut/ul_gavl.c b/ulan/host/libs4c/ulut/ul_gavl.c
new file mode 100644 (file)
index 0000000..d290dfc
--- /dev/null
@@ -0,0 +1,598 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavl.c    - generic AVL tree
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_gavl.h"
+
+int 
+gavl_hdiff_check(gavl_node_t *node, int mode);
+
+#if 0
+ #define GAVL_HDIFF_DEBUG(tree, mode) gavl_hdiff_check(tree, mode)
+#else
+ #define GAVL_HDIFF_DEBUG(tree, mode)
+#endif
+
+
+/**
+ * gavl_first_node - Returns First Node of GAVL Tree
+ * @root:      GAVL tree root
+ *
+ * Return Value: pointer to the first node of tree according to ordering
+ */
+gavl_node_t *
+gavl_first_node(const gavl_root_t *root)
+{
+  gavl_node_t *n=root->root_node;
+  if(!n) return NULL;
+  while(n->left)
+    n=n->left;
+  return n;
+}
+
+/**
+ * gavl_last_node - Returns Last Node of GAVL Tree
+ * @root:      GAVL tree root
+ *
+ * Return Value: pointer to the last node of tree according to ordering
+ */
+gavl_node_t *
+gavl_last_node(const gavl_root_t *root)
+{
+  gavl_node_t *n=root->root_node;
+  if(!n) return NULL;
+  while(n->right)
+    n=n->right;
+  return n;
+}
+
+/**
+ * gavl_is_empty - Check for Empty GAVL Tree
+ * @root:      GAVL tree root
+ *
+ * Return Value: returns non-zero value if there is no node in the tree
+ */
+int
+gavl_is_empty(const gavl_root_t *root)
+{
+  return !root->root_node;
+}
+
+/**
+ * gavl_search_node - Search for Node or Place for Node by Key
+ * @root:      GAVL tree root
+ * @key:       key value searched for
+ * @mode:      mode of the search operation
+ * @nodep:     pointer to place for storing of pointer to found node
+ *             or pointer to node which should be parent of inserted node
+ *
+ * Core search routine for GAVL trees
+ * searches in tree starting at @root for node of item
+ * with value of item field at offset @key_off 
+ * equal to provided *@key value. Values are compared by function
+ * pointed by *@cmp_fnc field in the tree @root.
+ * Integer @mode modifies search algorithm:
+ *   %GAVL_FANY   .. finds node of any item with field value *@key,
+ *   %GAVL_FFIRST .. finds node of first item with *@key,
+ *   %GAVL_FAFTER .. node points after last item with *@key value,
+ *        reworded - index points at first item with higher 
+ *        value of field or after last item
+ * Return Value: Return of nonzero value indicates match found.
+ *     If the @mode is ored with %GAVL_FCMP, result of last compare
+ *     is returned.
+ */
+int 
+gavl_search_node(const gavl_root_t *root, const void *key, 
+                int mode, gavl_node_t **nodep)
+{
+  int cmp=1;
+  gavl_node_t *n, *p;
+  n=p=root->root_node;
+  while(n){
+    p=n;
+    /*If external int than equivalent to cmp=*(int*)(n)-*(int*)key;*/
+    cmp=root->cmp_fnc(gavl_node2key(root,n),key);
+    if(cmp>0){
+      n=n->left;
+    }else if((cmp<0)||(mode&GAVL_FAFTER)){
+      n=n->right;
+    }else{
+      break;
+    }
+  }
+  if(mode&GAVL_FAFTER){
+    if(cmp<=0)
+      if(p) p=gavl_next_node(p);
+    *nodep=p;
+    return p!=NULL;
+  }
+  if(cmp&&!(mode&GAVL_FCMP)){
+    *nodep=0;
+    return 0;
+  }
+  if(mode&GAVL_FFIRST){
+    while((n=p->left)){
+      cmp=root->cmp_fnc(gavl_node2key(root,n),key);
+      if(!cmp){
+        p=n;
+      }else{
+       while((n=n->right)){
+         cmp=root->cmp_fnc(gavl_node2key(root,n),key);
+         if(!cmp){
+           p=n;
+           break;
+         }
+       }
+       if(cmp) break;
+      }
+    }
+    cmp=0;
+  }
+  *nodep=p;
+  return (mode&GAVL_FCMP)?cmp:1;
+}
+
+/**
+ * gavl_find - Find Item for Provided Key
+ * @root:      GAVL tree root
+ * @key:       key value searched for
+ *
+ * Return Value: pointer to item associated to key value.
+ */
+void * 
+gavl_find(const gavl_root_t *root, const void *key)
+{
+  gavl_node_t *n;
+  int ret;
+  ret=gavl_search_node(root, key, GAVL_FANY, &n);
+  if(!ret) return NULL;
+  return gavl_node2item(root,n);
+}
+
+/**
+ * gavl_find_first - Find the First Item with Provided Key Value
+ * @root:      GAVL tree root
+ * @key:       key value searched for
+ *
+ * same as above, but first matching item is found.
+ * Return Value: pointer to the first item associated to key value.
+ */
+void * 
+gavl_find_first(const gavl_root_t *root, const void *key)
+{
+  gavl_node_t *n;
+  n=gavl_find_first_node(root, key);
+  return n?gavl_node2item(root,n):NULL;
+}
+
+/**
+ * gavl_find_after - Find the First Item with Higher Key Value
+ * @root:      GAVL tree root
+ * @key:       key value searched for
+ *
+ * same as above, but points to item with first key value above searched @key.
+ * Return Value: pointer to the first item associated to key value.
+ */
+void * 
+gavl_find_after(const gavl_root_t *root, const void *key)
+{
+  gavl_node_t *n;
+  n=gavl_find_after_node(root, key);
+  return n?gavl_node2item(root,n):NULL;
+}
+
+/**
+ * gavl_insert_node_at - Insert Existing Node to Already Computed Place into GAVL Tree 
+ * @root:      GAVL tree root
+ * @node:      pointer to inserted node
+ * @where:     pointer to found parent node
+ * @leftright: left (1) or right (0) branch
+ *
+ * Return Value: positive value informs about success
+ */
+int
+gavl_insert_node_at(gavl_root_t *root, gavl_node_t *node,
+                   gavl_node_t *where, int leftright)
+{
+  return gavl_insert_primitive_at(&root->root_node, node, where, leftright);
+}
+
+/**
+ * gavl_insert_node - Insert Existing Node into GAVL Tree 
+ * @root:      GAVL tree root
+ * @node:      pointer to inserted node
+ * @mode:      if mode is %GAVL_FAFTER, multiple items with same key can
+ *             be used, else strict ordering is required
+ *
+ * Return Value: positive value informs about success
+ */
+int
+gavl_insert_node(gavl_root_t *root, gavl_node_t *node, int mode)
+{
+  int cmp;
+  gavl_node_t *where;
+  
+  cmp=gavl_search_node(root, gavl_node2key(root, node),
+                       (mode|GAVL_FCMP), &where);
+  if((mode!=GAVL_FAFTER) && !cmp) return -1;
+  /*return gavl_insert_node_at(root, node, where, cmp);*/
+  /* insert_primitive called directly for speedup */
+  return gavl_insert_primitive_at(&root->root_node, node, where, cmp);
+}
+
+/**
+ * gavl_insert - Insert New Item into GAVL Tree 
+ * @root:      GAVL tree root
+ * @item:      pointer to inserted item
+ * @mode:      if mode is GAVL_FAFTER, multiple items with same key can
+ *             be used, else strict ordering is required
+ *
+ * Return Value: positive value informs about success, negative
+ *     value indicates malloc fail or attempt to insert item
+ *     with already defined key.
+ */
+int
+gavl_insert(gavl_root_t *root, void *item, int mode)
+{
+  int cmp;
+  gavl_node_t *where, *n2add;
+  
+  cmp=gavl_search_node(root, (char*)item+root->key_offs,
+                       (mode|GAVL_FCMP), &where);
+  if((mode!=GAVL_FAFTER) && !cmp) return -1;
+  if(root->node_offs<0){
+    n2add=malloc(sizeof(gavl_node_t)+sizeof(void*));
+    if(!n2add) return -1;
+    *(void**)(n2add+1)=item;
+  } else {
+    n2add=(gavl_node_t*)((char*)item+root->node_offs);
+  }
+  /*return gavl_insert_node_at(root, n2add, where, cmp);*/
+  /* insert_primitive called directly for speedup */
+  return gavl_insert_primitive_at(&root->root_node, n2add, where, cmp);
+}
+
+/**
+ * gavl_delete_node - Deletes/Unlinks Node from GAVL Tree 
+ * @root:      GAVL tree root
+ * @node:      pointer to deleted node
+ *
+ * Return Value: positive value informs about success.
+ */
+int
+gavl_delete_node(gavl_root_t *root, gavl_node_t *node)
+{
+  return gavl_delete_primitive(&root->root_node, node);
+}
+
+/**
+ * gavl_delete - Delete/Unlink Item from GAVL Tree 
+ * @root:      GAVL tree root
+ * @item:      pointer to deleted item
+ *
+ * Return Value: positive value informs about success, negative
+ *     value indicates that item is not found in tree defined by root
+ */
+int
+gavl_delete(gavl_root_t *root, void *item)
+{
+  int ret;
+  gavl_node_t *n, *p;
+  if(!item) return -1;
+  if(root->node_offs>=0){
+    n=(gavl_node_t*)((char*)item+root->node_offs);
+    for(p=n; p->parent; p=p->parent);
+    if(p!=root->root_node)
+      return -1;
+  } else {
+    if(!gavl_search_node(root, (char*)item+root->key_offs, GAVL_FFIRST, &n))
+      return -1;
+    while(gavl_node2item(root,n)!=item){
+      n=gavl_next_node(n);
+      if(!n) return -1;
+      if(root->cmp_fnc(gavl_node2key(root,n),(char*)item+root->key_offs))
+       return -1;
+    }
+  }
+  /*ret=gavl_delete_node(root, n);*/
+  /* delete_primitive called directly for speedup */
+  ret=gavl_delete_primitive(&root->root_node, n);
+  if(root->node_offs<0)
+    free(n);
+  return ret;
+}
+
+/**
+ * gavl_delete_and_next_node - Delete/Unlink Item from GAVL Tree 
+ * @root:      GAVL tree root
+ * @node:      pointer to actual node which is unlinked from tree
+ *             after function call, it can be unalocated or reused
+ *             by application code after this call. 
+ *
+ * This function can be used after call gavl_first_node() for destructive
+ * traversal through the tree, it cannot be combined with gavl_next_node()
+ * or gavl_prev_node() and root is emptied after the end of traversal.
+ * If the tree is used after unsuccessful/unfinished traversal, it 
+ * must be balanced again. The height differences are inconsistent in other
+ * case. If traversal could be interrupted, the function gavl_cut_first()
+ * could be better choice.
+ * Return Value: pointer to next node or NULL, when all nodes are deleted
+ */
+gavl_node_t *
+gavl_delete_and_next_node(gavl_root_t *root, gavl_node_t *node)
+{
+  gavl_node_t *n, **np;
+  if(!node) node=gavl_first_node(root);
+  /* We are in big troubles if there is left child, somebody misused 
+     this function => stop an pray, something bad happens in future */
+  if(node->left) return NULL;
+  if((n=node->parent)){
+    if(n->left==node) np=&n->left;
+    else np=&n->right;
+  } else if(node==root->root_node) {
+    np=&root->root_node;
+  }else {
+    /* Cross tree arguments or corrupted tree */
+    return NULL;
+  }
+  if((n=node->right)){
+    *np=n;
+    n->parent=node->parent;
+    while(n->left) n=n->left;
+  } else {
+    if(!node->parent){
+      *np=NULL;
+      return NULL;
+    }
+    /* Again, this cannot happen */
+    if(node->parent->left!=node) return NULL;
+    *np=NULL;
+    n=node->parent;
+  }
+  node->left=node->right=NULL;
+  node->parent=NULL;
+  return n;
+}
+
+/*===========================================================*/
+/* basic types compare functions */
+
+int gavl_cmp_int(const void *a, const void *b)
+{
+  if (*(int*)a>*(int*)b) return 1;
+  if (*(int*)a<*(int*)b) return -1;
+  return 0;
+}
+
+int gavl_cmp_long(const void *a, const void *b)
+{
+  if (*(long*)a>*(long*)b) return 1;
+  if (*(long*)a<*(long*)b) return -1;
+  return 0;
+}
+
+int gavl_cmp_ptr(const void *a, const void *b)
+{
+  if (*(void**)a>*(void**)b) return 1;
+  if (*(void**)a<*(void**)b) return -1;
+  return 0;
+}
+
+/*===========================================================*/
+/* support for unbalanced trees */
+
+#ifdef GAVL_UNBALANCED_SUPPORT
+
+int
+gavl_adjust_hdiff(gavl_node_t *node, int adj)
+{
+  gavl_node_t *p;
+  int hdiff;
+  while((p=node->parent)&&adj){
+    if(p->left==node){
+      hdiff=p->hdiff;
+      /*printf("L%d ",adj);*/
+      p->hdiff=hdiff+adj;
+      if(adj>0){
+        if(hdiff<0)
+         if((adj+=hdiff)<=0) break;
+      }else{
+        if(hdiff<=0) break;
+       if(adj<-hdiff) adj=-hdiff;
+      }
+    }else{
+      hdiff=p->hdiff;
+      p->hdiff=hdiff-adj;
+      /*printf("R%d ",adj);*/
+      if(adj>0){
+        if(hdiff>0)
+         if((adj-=hdiff)<=0) break;
+      }else{
+        if(hdiff>=0) break;
+       if(adj<hdiff) adj=hdiff;
+      }
+    }
+    node=p;
+  }
+  return adj;
+}
+
+/* Partial balance - reduces number of nodes with hdiff >1 or <-1 */
+int
+gavl_balance_enhance(gavl_node_t **subtree)
+{
+  gavl_node_t *n, *p;
+  int ret=0;
+  if(!*subtree) return 0;
+  p=*subtree;
+  while(p->left) p=p->left;
+  do{
+    if((n=p->right)){
+      while(n->left) n=n->left;
+      p=n;
+    } else {
+      while(p){
+        n=p->parent;
+        if(!n || (p==*subtree)){
+          if((p->hdiff>1)||((p->hdiff<-1))){
+           gavl_balance_one(subtree);
+           ret=1;
+         }
+         break;
+       }
+       if(n->right!=p){
+          if((p->hdiff>1)||((p->hdiff<-1))){
+           if(gavl_balance_one(&n->left))
+             gavl_adjust_hdiff(n->left,-1);
+           ret=1;
+         }
+         break;
+       }
+        if((p->hdiff>1)||((p->hdiff<-1))){
+         if(gavl_balance_one(&n->right))
+            gavl_adjust_hdiff(n->right,-1);
+          ret=1;
+       }
+       p=n;
+      }
+      p=n;
+    }
+  } while(p);
+  return ret;
+}
+
+/* Full tree balance */
+int
+gavl_balance(gavl_root_t *root)
+{
+  int height=0;
+  gavl_node_t *n1,*n2;
+  gavl_node_t *s=NULL;
+  gavl_node_t **np;
+  if(!root->root_node) return 0;
+  for(n1=gavl_first_node(root);n1;n1=n2){
+    n2=gavl_delete_and_next_node(root, n1);
+    if(!s){
+      s=n1; height=1;
+      n1->hdiff=1;
+    } else {
+      for(;;) {
+       if(s->left && !s->right){
+         s->right=n1; n1->parent=s;
+         s=n1; height--;
+         n1->hdiff=1;
+         break;
+       } else if(!s->parent || (s->parent->hdiff>s->hdiff+1)){
+         n1->left=s; 
+         n1->parent=s->parent;
+         if(s->parent) s->parent->right=n1;
+         s->parent=n1;
+         n1->hdiff=s->hdiff+1;
+         s=n1;
+         break;
+       } 
+       height++;
+       if(s->parent->hdiff<s->hdiff+1) s->parent->hdiff=s->hdiff+1;
+       s=s->parent;
+      }
+    }
+  }
+  while(s->parent){
+    height++;
+    if(s->parent->hdiff<s->hdiff+1) s->parent->hdiff=s->hdiff+1;
+    s=s->parent;
+  }
+  root->root_node=s;
+  for(n1=s;n1;){
+    if(!n1->right) n1->hdiff=0; 
+    else n1->hdiff=-n1->right->hdiff;
+    if(n1->left){
+      n1->hdiff+=n1->left->hdiff;
+      n1=n1->left;
+    }else{
+      n2=n1->right;
+      do{
+        if(n2){ n1=n2; break;}
+        n2=n1;
+       n1=n1->parent;
+        if(!n1) np=&s;
+       else{
+         if(n1->left==n2) {np=&n1->left; n2=n1->right;}
+         else {np=&n1->right; n2=NULL;}
+       }
+      }while(n1);
+    }
+  }
+  {
+    int adj,hdiff, balfl;
+    do{
+      for(n1=s;n1->right;n1=n1->right);
+      adj=0;
+      balfl=0;
+      do{
+       n1=n1->parent;
+       if(n1) np=&n1->right;
+       else np=&s;
+       hdiff=(*np)->hdiff;
+       (*np)->hdiff+=adj;
+       if(hdiff<0){
+          if(adj>-hdiff) adj=-hdiff;
+       }else adj=0;
+       while((*np)->hdiff>1){
+         if(gavl_balance_one(np))
+           adj++;
+         balfl=1;
+       }
+      }while(n1);
+    }while(balfl);
+  }
+  root->root_node=s;
+  return 1;
+}
+
+/**
+ * gavl_cut_first - Cut First Item from Tree 
+ * @root:      GAVL tree root
+ *
+ * This enables fast delete of the first item without tree balancing.
+ * The resulting tree is degraded but height differences are kept consistent.
+ * Use of this function can result in height of tree maximally one greater
+ * the tree managed by optimal AVL functions.
+ * Return Value: returns the first item or NULL if the tree is empty
+ */
+void *
+gavl_cut_first(gavl_root_t *root)
+{
+  gavl_node_t *n;
+  void *item;
+  if(!(n=gavl_cut_first_primitive(&root->root_node)))
+    return NULL;
+  item=gavl_node2item(root,n);
+  if(root->node_offs<0)
+    free(n);
+  return item;
+}
+
+#endif /*GAVL_UNBALANCED_SUPPORT*/
+
diff --git a/ulan/host/libs4c/ulut/ul_gavl.h b/ulan/host/libs4c/ulut/ul_gavl.h
new file mode 100644 (file)
index 0000000..9fbe4a4
--- /dev/null
@@ -0,0 +1,498 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavl.h    - generic AVL tree
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GAVL_H
+#define _UL_GAVL_H
+
+#include "ul_utdefs.h"
+#include "ul_itbase.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Add support to work correctly even with unbalamced tree
+   with hdiff out of range <-1,0,+1>, else unbalanced tree
+   results in continuous tree degradation and even fatal errors.
+   This option does not solve errors caused by incorrectly 
+   assigned hdiff values.
+ */
+#define GAVL_UNBALANCED_SUPPORT
+
+/* function to compare fields of two items */
+typedef int gavl_cmp_fnc_t(const void *a, const void *b);
+
+/**
+ * struct gavl_node - Structure Representing Node of Generic AVL Tree
+ * @left:      pointer to left child or NULL
+ * @right:     pointer to right child or NULL
+ * @parent:    pointer to parent node, NULL for root
+ * @hdiff:     difference of height between left and right child
+ *
+ * This structure represents one node in the tree and links @left and @right
+ * to nodes with lower and higher value of order criterion.
+ * Each tree is built from one type of items defined by user.
+ * User can decide to include node structure inside item representation
+ * or GAVL can malloc node structures for each inserted item.
+ * The GAVL allocates memory space with capacity 
+ * sizeof(gavl_node_t)+sizeof(void*) in the second case. The item pointer
+ * is stored following node structure (void**)(node+1);
+ */
+typedef struct gavl_node {
+  struct gavl_node *left;
+  struct gavl_node *right;
+  struct gavl_node *parent;
+  int hdiff;
+} gavl_node_t;
+
+/**
+ * struct gavl_root - Structure Representing Root of Generic AVL Tree
+ * @root_node: pointer to root node of GAVL tree
+ * @node_offs: offset between start of user defined item representation
+ *             and included GAVL node structure. If negative value
+ *             is stored there, user item does not contain node structure
+ *             and GAVL manages standalone ones with item pointers.
+ * @key_offs:  offset to compared (ordered) fields in the item representation
+ * @cmp_fnc:   function defining order of items by comparing fields at offset
+ *             @key_offs.
+ */
+
+typedef struct gavl_root {
+  gavl_node_t *root_node;
+  int node_offs;
+  int key_offs;
+  gavl_cmp_fnc_t *cmp_fnc;
+} gavl_root_t;
+
+#define GAVL_FANY 0
+#define GAVL_FFIRST 1
+#define GAVL_FAFTER 2
+#define GAVL_FCMP 0x80
+
+gavl_node_t *
+gavl_first_node(const gavl_root_t *root);
+
+gavl_node_t *
+gavl_last_node(const gavl_root_t *root);
+
+gavl_node_t *
+gavl_next_node(const gavl_node_t *node);
+
+gavl_node_t *
+gavl_prev_node(const gavl_node_t *node);
+
+int
+gavl_is_empty(const gavl_root_t *root);
+
+/* Core search routine for GAVL trees
+   searches in "root" for node "node" of item
+   with value of item field at offset "key_offs" 
+   equal to "*key". Values are compared by function
+   "*cmp_fnc".
+   Integer "mode" modifies search algorithm
+     GAVL_FANY   .. finds index of any item with field value "*key"
+     GAVL_FFIRST .. finds index of first item with "*key"
+     GAVL_FAFTER .. index points after last item with "*key" value 
+          reworded - index points at first item with higher 
+          value of field or after last item
+   Return of nonzero value indicates match found.
+   If the mode is ored with GAVL_FCMP, result of last compare is returned
+ */
+
+int 
+gavl_search_node(const gavl_root_t *root, const void *key,
+           int mode, gavl_node_t **nodep);
+
+/* returns first node with associated key field value equal to "*key" or NULL */
+static inline gavl_node_t * 
+gavl_find_first_node(const gavl_root_t *root, const void *key)
+{
+  gavl_node_t *node;
+  gavl_search_node(root, key, GAVL_FFIRST, &node);
+  return node;
+}
+
+/* returns first node after node with associated key
+  field value equal to "*key" or NULL */
+static inline gavl_node_t * 
+gavl_find_after_node(const gavl_root_t *root, const void *key)
+{
+  gavl_node_t *node;
+  gavl_search_node(root, key, GAVL_FAFTER, &node);
+  return node;
+}
+
+/* returns item with key field value equal to "*key" or NULL */
+void * 
+gavl_find(const gavl_root_t *root, const void *key);
+
+/* same as above, but first matching item is found */
+void * 
+gavl_find_first(const gavl_root_t *root, const void *key);
+
+/* same as above, but first nonmatching higher item is found */
+void * 
+gavl_find_after(const gavl_root_t *root, const void *key);
+
+
+/**
+ * gavl_node2item - Conversion from GAVL Tree Node to User Defined Item
+ * @root:      GAVL tree root
+ * @node:      node belonging to @root GAVL tree
+ *
+ * Return Value: pointer to item corresponding to node
+ */
+static inline void *
+gavl_node2item(const gavl_root_t *root, const gavl_node_t *node)
+{
+  if(root->node_offs<0) return *(void**)(node+1);
+  return (void*)((char*)node-root->node_offs);
+}
+
+/**
+ * gavl_node2item_safe - Conversion from GAVL Tree Node to User Defined Item
+ * @root:      GAVL tree root
+ * @node:      node belonging to @root GAVL tree
+ *
+ * Return Value: pointer to item corresponding to node
+ */
+static inline void *
+gavl_node2item_safe(const gavl_root_t *root, const gavl_node_t *node)
+{
+  if(!node) return 0;
+  return gavl_node2item(root, node);
+}
+
+/**
+ * gavl_node2key - Conversion from GAVL Tree Node to Ordering Key
+ * @root:      GAVL tree root
+ * @node:      node belonging to @root GAVL tree
+ *
+ * Return Value: pointer to key corresponding to node
+ */
+static inline void *
+gavl_node2key(const gavl_root_t *root, const gavl_node_t *node)
+{
+  char *p;
+  p=(char*)gavl_node2item(root, node);
+  return (void*)(p+root->key_offs);
+}
+
+int
+gavl_balance_one(gavl_node_t **subtree);
+
+/* This function can be used for defining AVL trees with custom
+   root definition. Use gavl_insert or gavl_insert_node for
+   standard trees */
+int
+gavl_insert_primitive_at(gavl_node_t **root_nodep, gavl_node_t *node,
+                   gavl_node_t *where, int leftright);
+
+int
+gavl_insert_node_at(gavl_root_t *root, gavl_node_t *node,
+                   gavl_node_t *where, int leftright);
+
+int
+gavl_insert_node(gavl_root_t *root, gavl_node_t *node, int mode);
+
+/* insert new item at the right position, 
+   "mode" has same meaning as in "gavl_search_node"
+   if mode==0 then strict sorting is required
+   and violation result in ignore of new item
+   and return value <0
+ */
+int
+gavl_insert(gavl_root_t *root, void *item, int mode);
+
+/* delete node from AVL tree */
+int
+gavl_delete_primitive(gavl_node_t **root_nodep, gavl_node_t *node);
+
+/* delete node from AVL tree */
+int
+gavl_delete_node(gavl_root_t *root, gavl_node_t *node);
+
+/* delete item from AVL tree */
+int
+gavl_delete(gavl_root_t *root, void *item);
+
+/* This function can be used after call gavl_first_node to destructive
+   traversal through the tree, it cannot be combined with gavl_next_node
+   or gavl_prev_node and root is emptied after the end of traversal.
+   If the tree is used after unsuccessful/unfinished traversal, it 
+   must be balanced again */
+gavl_node_t *
+gavl_delete_and_next_node(gavl_root_t *root, gavl_node_t *node);
+
+/*===========================================================*/
+/* iterators for generic GAVL type */
+
+typedef struct {
+  gavl_root_t *container;
+  gavl_node_t *node;
+} gavl_it_t;
+
+static inline void *
+gavl_it2item(const gavl_it_t *it)
+{
+  return gavl_node2item_safe(it->container,it->node);
+}
+
+static inline void
+gavl_first_it(gavl_root_t *container, gavl_it_t *it)
+{
+  it->container=container;
+  it->node=gavl_first_node(container);
+}
+
+static inline void 
+gavl_last_it(gavl_root_t *container, gavl_it_t *it)
+{
+  it->container=container;
+  it->node=gavl_last_node(container);
+}
+
+static inline void 
+gavl_next_it(gavl_it_t *it)
+{
+  if(it->node) it->node=gavl_next_node(it->node);
+  else it->node=gavl_first_node(it->container);
+}
+
+static inline void 
+gavl_prev_it(gavl_it_t *it)
+{
+  if(it->node) it->node=gavl_prev_node(it->node);
+  else it->node=gavl_last_node(it->container);
+}
+
+static inline int
+gavl_is_end_it(gavl_it_t *it)
+{
+  return !it->node;
+}
+
+static inline void 
+gavl_delete_it(gavl_it_t *it)
+{
+  gavl_node_t *n;
+  if(!(n=it->node)) return;
+  it->node=gavl_next_node(it->node);
+  gavl_delete_node(it->container,n);
+}
+
+static inline int 
+gavl_find_it(gavl_root_t *container, void *key, gavl_it_t *it)
+{
+  it->container=container;
+  return (it->node=gavl_find_first_node(container, key))!=0;
+}
+
+static inline int 
+gavl_find_first_it(gavl_root_t *container, void *key, gavl_it_t *it)
+{
+  it->container=container;
+  return (it->node=gavl_find_first_node(container, key))!=0;
+}
+
+static inline int 
+gavl_find_after_it(gavl_root_t *container, void *key, gavl_it_t *it)
+{
+  it->container=container;
+  return (it->node=gavl_find_after_node(container, key))!=0;
+}
+
+/* The next implementation of foreaach is elegant, but can not
+   be used in C99 non-conformant C compiler */
+#ifdef WITH_C99
+
+#define gavl_generic_for_each(item_t, root, ptr) \
+       for(gavl_node_t *__fe_node=gavl_first_node(root);\
+           (ptr=(item_t*)gavl_node2item_safe(root,__fe_node));\
+           __fe_node=gavl_next_node(__fe_node))
+
+#define gavl_generic_for_each_rev(item_t, root, ptr) \
+       for(gavl_node_t *__fe_node=gavl_last_node(root);\
+           (ptr=__(item_t*)gavl_node2item_safe(root,__fe_node));\
+           __fe_node=gavl_prev_node(__fe_node))
+
+#define gavl_generic_for_each_from(item_t, root, key, ptr) \
+       for(gavl_node_t *__fe_node=gavl_find_first_node(root, key); \
+           (ptr=(item_t*)gavl_node2item_safe(root,__fe_node)); \
+           __fe_node=gavl_next_node(__fe_node))
+
+#define gavl_generic_for_each_after(item_t, root, key, ptr) \
+       for(gavl_node_t *__fe_node=gavl_find_after_node(root, key); \
+           (ptr=(item_t*)gavl_node2item_safe(root,__fe_node)); \
+           __fe_node=gavl_next_node(__fe_node))
+
+#endif /*WITH_C99*/
+
+#define gavl_generic_for_each_cut(item_t, root, ptr) \
+       for(;(ptr=(item_t*)gavl_cut_first(root));)
+
+/*===========================================================*/
+/* basic types compare functions */
+
+int gavl_cmp_int(const void *a, const void *b);
+int gavl_cmp_long(const void *a, const void *b);
+int gavl_cmp_ptr(const void *a, const void *b);
+
+/*===========================================================*/
+/* More functions useful for partially balanced trees */
+
+/* Adjust hdiff in parent nodes after change of height of
+   branch starting at node */
+int
+gavl_adjust_hdiff(gavl_node_t *node, int adj);
+
+/* Partial balance - reduces number of nodes with hdiff >1 or <-1,
+   return zero if none unbalanced node is found */
+int
+gavl_balance_enhance(gavl_node_t **subtree);
+
+/* Full tree balance to state correct for AVL tree 
+   => hdiff is in range <-1,0,1> */
+int
+gavl_balance(gavl_root_t *root);
+
+/* take and delete first node without balancing but keep tree consistent */
+gavl_node_t *
+gavl_cut_first_primitive(gavl_node_t **root_nodep);
+
+/* take and delete first item without balancing but keep tree consistent */
+void *
+gavl_cut_first(gavl_root_t *root);
+
+
+/*===========================================================*/
+/* Declarations of root fields for typesafe custom trees     */
+
+/* Root type for GAVL_CUST_NODE_INT_DEC tree declaration     */
+/* implementation uses "ul_gavlcust.h" or ul_gavlrepcust.h"  */
+/* with implementation macro GAVL_CUST_NODE_INT_IMP          */
+/* or GAVL_CUST_NODE_INT_REP_IMP                             */
+typedef gavl_node_t * gavl_cust_root_field_t;
+
+/* Forward declaration of tree root for GAVL_FLES_INT_DEC    */
+/* function declarations and implementations require         */
+/* inclusion of ul_gavlflesint.h" and GAVL_FLES_INT_IMP      */
+typedef struct{
+  gavl_node_t *root;
+  gavl_node_t *first;
+  gavl_node_t *last;
+  long count;
+} gavl_fles_int_root_field_t;
+
+/*===========================================================*/
+/* Macrodefinitions to prepare custom fast AVL trees with
+   fast possibly inlined search */
+
+/* User must provide his/her own compare routine with 
+    int cust_cmp_fnc(cust_key_t *a, cust_key_t *b) */
+
+/* Declaration of new custom tree with internal node */
+#define GAVL_CUST_NODE_INT_DEC(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_node, cust_item_node, cust_item_key, cust_cmp_fnc) \
+\
+static inline cust_item_t * \
+cust_prefix##_node2item(const cust_root_t *root, const gavl_node_t *node) \
+  {return (cust_item_t*)((char*)node-(long)&((cust_item_t*)0)->cust_item_node);}\
+\
+static inline cust_key_t *\
+cust_prefix##_node2key(const cust_root_t *root, gavl_node_t *node)\
+  { return &(cust_prefix##_node2item(root, node)->cust_item_key);}\
+\
+void cust_prefix##_init_root_field(cust_root_t *root);\
+int cust_prefix##_search_node(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep);\
+cust_item_t *cust_prefix##_find(const cust_root_t *root, cust_key_t *key);\
+cust_item_t *cust_prefix##_find_first(const cust_root_t *root, cust_key_t *key);\
+cust_item_t *cust_prefix##_find_after(const cust_root_t *root, cust_key_t *key);\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item);\
+int cust_prefix##_delete_node(cust_root_t *root, gavl_node_t *node);\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item);\
+gavl_node_t *cust_prefix##_first_node(const cust_root_t *root);\
+gavl_node_t *cust_prefix##_last_node(const cust_root_t *root);\
+\
+static inline void \
+cust_prefix##_init_detached(cust_item_t *item){\
+  item->cust_item_node.parent=NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_first(const cust_root_t *root)\
+{\
+  gavl_node_t *n=cust_prefix##_first_node(root);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_last(const cust_root_t *root)\
+{\
+  gavl_node_t *n=cust_prefix##_last_node(root);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_next(const cust_root_t *root, cust_item_t *item)\
+{\
+  gavl_node_t *n=gavl_next_node(&item->cust_item_node);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_prev(const cust_root_t *root, cust_item_t *item)\
+{\
+  gavl_node_t *n=gavl_prev_node(&item->cust_item_node);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline int \
+cust_prefix##_is_empty(const cust_root_t *root)\
+{\
+  return !root->cust_root_node;\
+}\
+static inline cust_item_t *\
+cust_prefix##_cut_first(cust_root_t *root)\
+{\
+  gavl_node_t *n=gavl_cut_first_primitive(&root->cust_root_node);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+/*** Iterators ***/\
+UL_ITBASE_SORT_DEC(cust_prefix, cust_root_t, cust_item_t, cust_key_t)
+
+#define gavl_cust_for_each(cust_prefix, root, ptr) \
+       for(ptr=cust_prefix##_first(root);ptr;ptr=cust_prefix##_next((root),ptr))
+
+#define gavl_cust_for_each_rev(cust_prefix, root, ptr) \
+       for(ptr=cust_prefix##_last(root);ptr;ptr=cust_prefix##_prev((root),ptr))
+
+#define gavl_cust_for_each_from(cust_prefix, root, key, ptr) \
+       for(ptr=cust_prefix##_find_first(root,key);ptr;ptr=cust_prefix##_next((root),ptr))
+
+#define gavl_cust_for_each_after(cust_prefix, root, key, ptr) \
+       for(ptr=cust_prefix##_find_after(root,key);ptr;ptr=cust_prefix##_next((root),ptr))
+
+#define gavl_cust_for_each_cut(cust_prefix, root, ptr) \
+       for(;(ptr=cust_prefix##_cut_first(root));)
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GAVL_H */
diff --git a/ulan/host/libs4c/ulut/ul_gavlchk.c b/ulan/host/libs4c/ulut/ul_gavlchk.c
new file mode 100644 (file)
index 0000000..36f818f
--- /dev/null
@@ -0,0 +1,725 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <sys/time.h>
+
+#include "ul_utmalloc.h"
+#include "ul_gavl.h"
+
+/*===========================================================*/
+/* checking code */
+
+#define GAVL_CHECK_NOBAL 0x0020
+
+#define GAVL_ERR_PARENT  0x0001
+#define GAVL_ERR_HDIFF   0x0002
+#define GAVL_ERR_HEIGHT  0x0010
+#define GAVL_ERR_BALANCE 0x0020
+
+typedef struct gavl_check_st{
+  int mode;
+  int err;
+  int count;
+  int depth;
+  gavl_node_t *node;
+  gavl_root_t *root;
+  int (*node_fnc)(gavl_node_t *node, struct gavl_check_st *check);
+  void *context;
+  int *status;
+} gavl_check_st_t;
+
+int 
+gavl_hdiff_check_recurse(gavl_node_t *node, gavl_node_t *parent,
+                         gavl_check_st_t* check)
+{
+  int lh, rh;
+
+  if(!node) return 0;
+  check->depth++;
+  if(node->parent!=parent) check->err|=GAVL_ERR_PARENT;
+  lh=gavl_hdiff_check_recurse(node->left, node, check);
+  if(check->node_fnc)
+    check->err|=check->node_fnc(node, check);
+  rh=gavl_hdiff_check_recurse(node->right, node, check);
+  check->count++;
+  if((rh>lh+1) || (rh+1<lh)){
+    if(!(check->mode&GAVL_CHECK_NOBAL)){
+      check->err|=GAVL_ERR_BALANCE;
+    }
+  }
+  if(node->hdiff!=lh-rh){
+    check->err|=GAVL_ERR_HDIFF;
+  }
+  if(check->err && !check->node) check->node=node;
+  check->depth--;
+  return lh>rh?lh+1:rh+1;
+}
+
+void 
+gavl_hdiff_check_reperr(gavl_node_t *node, gavl_check_st_t* check)
+{
+  volatile int i;
+  for(i=0;i<1000;i++);
+}
+
+int 
+gavl_hdiff_check(gavl_node_t *node, int mode)
+{
+  int i;
+  int h=0;
+  gavl_check_st_t check;
+  check.mode=mode;
+  check.err=0;
+  check.count=0;
+  check.node=NULL;
+  check.depth=0;
+  check.node_fnc=NULL;
+  check.root=NULL;
+  
+  if(node)
+    h=gavl_hdiff_check_recurse(node, node->parent,&check);
+
+  if(!(check.mode&GAVL_CHECK_NOBAL)){
+    for(i=0;(1<<i)<=check.count;i++);
+    if(h>i+1) check.err|=GAVL_ERR_HEIGHT;
+  }
+
+  if(check.err){
+    gavl_hdiff_check_reperr(node,&check);
+  }
+  return check.err;
+}
+
+/*===========================================================*/
+/* custom tree definition */
+
+#include "ul_gavlcust.h"
+#include "ul_gavlrepcust.h"
+#include "ul_gavlflesint.h"
+
+#undef GAVL_TEST_FLES
+
+typedef struct cust2_item {
+  int my_val;
+  gavl_node_t my_node;
+  int more_data;
+} cust2_item_t;
+
+typedef struct cust2_root {
+ #ifndef GAVL_TEST_FLES
+  gavl_cust_root_field_t my_root;
+ #else /*GAVL_TEST_FLES*/
+  gavl_fles_int_root_field_t my_root;
+ #endif /*GAVL_TEST_FLES*/
+  int my_info;
+  int my_first_val;
+  int my_last_val;
+} cust2_root_t;
+
+typedef int cust2_key_t;
+
+/* Custom tree declarations */
+/* GAVL_CUST_NODE_INT_DEC - standard custom tree with internal node */
+/* GAVL_FLES_INT_DEC      - tree with enhanced first last access speed  */
+
+#ifndef GAVL_TEST_FLES
+GAVL_CUST_NODE_INT_DEC(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_node, my_val, cust2_cmp_fnc)
+#else /*GAVL_TEST_FLES*/
+GAVL_FLES_INT_DEC(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_node, my_val, cust2_cmp_fnc)
+#endif /*GAVL_TEST_FLES*/
+
+inline int
+cust2_cmp_fnc(const cust2_key_t *a, const cust2_key_t *b)
+{
+  if (*a>*b) return 1;
+  if (*a<*b) return -1;
+  return 0;
+}
+
+/* Custom tree implementation */
+/* GAVL_CUST_NODE_INT_IMP - version with strict ordering */
+/* GAVL_CUST_NODE_INT_REP_IMP - version without strict ordering */
+/* GAVL_FLES_INT_IMP      - tree with enhanced first last access speed  */
+
+#ifndef GAVL_TEST_FLES
+GAVL_CUST_NODE_INT_IMP(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_node, my_val, cust2_cmp_fnc)
+#else /*GAVL_TEST_FLES*/
+GAVL_FLES_INT_IMP(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_node, my_val, cust2_cmp_fnc, 0, 
+       root->my_first_val=cust2_first(root)->my_val,
+       root->my_last_val=cust2_first(root)->my_val, 
+       )
+#endif /*GAVL_TEST_FLES*/
+
+cust2_root_t cust2_root;
+
+
+void test_cust_tree(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item, *item2;
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom tree cust2 for_each:\n");
+  gavl_cust_for_each(cust2, &cust2_root, item)
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  k=90;
+  printf("Custom tree cust2 for_each_from %ld:\n", (long)k);
+  gavl_cust_for_each_from(cust2, &cust2_root, &k, item){
+    printf("After %d : ",item->my_val);
+    gavl_cust_for_each_after(cust2, &cust2_root, &item->my_val, item2)
+      printf(" %d",item2->my_val);
+    printf("\n");
+  }
+
+  printf("Custom tree cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom tree cust2 for_each_rev:\n");
+  gavl_cust_for_each_rev(cust2,&cust2_root,item)
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  printf("Custom tree cust2 for_each_cut:\n");
+  gavl_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+void test_cust_tree_it(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item;
+  cust2_it_t it1, it2;
+  
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom tree cust2 for each with iterator:\n");
+  for(cust2_first_it(&cust2_root, &it1);
+      (item=cust2_it2item(&it1));cust2_next_it(&it1))
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  k=90;
+  printf("Custom tree cust2 for_each_from %ld:\n", (long)k);
+  for(cust2_find_first_it(&cust2_root, &k, &it1);
+      (item=cust2_it2item(&it1));cust2_next_it(&it1)){
+    printf("After %d : ",item->my_val);
+    for(cust2_find_after_it(&cust2_root, &item->my_val, &it2);
+        (item=cust2_it2item(&it2));cust2_next_it(&it2))
+      printf(" %d",item->my_val);
+    printf("\n");
+  }
+
+  printf("Custom tree cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom tree cust2 for_each_rev:\n");
+  for(cust2_last_it(&cust2_root, &it1);
+      (item=cust2_it2item(&it1));cust2_prev_it(&it1))
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  printf("Custom tree cust2 for_each_cut:\n");
+  gavl_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+void test_cust_tree_macro_it(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item;
+  cust2_it_t it1, it2;
+  
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom tree cust2 for each with iterator:\n");
+  ul_for_each_it(cust2, &cust2_root, it1){
+    item=cust2_it2item(&it1);
+    printf("%d ",item->my_val);
+  }
+  printf("\n");
+
+  k=90;
+  printf("Custom tree cust2 for_each_from %ld:\n", (long)k);
+  ul_for_each_from_it(cust2, &cust2_root, &k, it1){
+    item=cust2_it2item(&it1);
+    printf("After %d : ",item->my_val);
+    ul_for_each_after_it(cust2, &cust2_root, &item->my_val, it2){
+      item=cust2_it2item(&it2);
+      printf(" %d",item->my_val);
+    }
+    printf("\n");
+  }
+
+  printf("Custom tree cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom tree cust2 for_each_rev:\n");
+  ul_for_each_rev_it(cust2, &cust2_root, it1){
+    item=cust2_it2item(&it1);
+    printf("%d ",item->my_val);
+  }
+  printf("\n");
+
+  printf("Custom tree cust2 for_each_cut:\n");
+  gavl_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+/*===========================================================*/
+/* timing tests */
+
+void timing_test_print(struct timeval *start, struct timeval *stop, char *s)
+{
+  long sec, usec;
+  sec=stop->tv_sec-start->tv_sec;
+  usec=stop->tv_usec-start->tv_usec;
+  if(usec>=1000000) {
+    usec-=1000000;
+    sec++;
+  }
+  if(usec<0) {
+    usec+=1000000;
+    sec--;
+  }
+  printf("%s :\t%4ld.%06ld\n",s,sec,usec);
+}
+
+void cust_timing_test(void)
+{
+  int i;
+  int items_cnt=100000;
+  cust2_item_t *items, *item;
+  struct timeval time_start, time_stop;
+
+  printf("\nRunning custom tree timing test for %d items\n",items_cnt);
+  
+  items=malloc(items_cnt*sizeof(cust2_item_t));
+  if(!items){
+    printf("malloc failed\n");
+    return;
+  }
+  
+  for(i=0;i<items_cnt;i++){
+    items[i].my_val=i;
+    items[i].more_data=0;
+  }
+  
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(cust2_insert(&cust2_root,items+i)<0)
+      printf("cust2_insert error\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"cust insert");
+  
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(!(item=cust2_find(&cust2_root,&i)))
+      printf("cust2_find error\n");
+    else 
+      if(item->my_val!=i)
+        printf("gavl_find mismatch\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"cust find");
+
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(1){
+      if(cust2_delete(&cust2_root,items+i)<0)
+       printf("cust2_delete error\n");
+    }else{
+      if(!cust2_cut_first(&cust2_root))
+       printf("cust2_cut_first NULL\n");
+    }
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"cust delete");
+
+  free(items);
+}
+
+void timing_test(void)
+{
+  int i;
+  int items_cnt=100000;
+  cust2_item_t *items;
+  cust2_item_t *item;
+  struct timeval time_start, time_stop;
+  gavl_root_t tt_root;
+  
+  tt_root.root_node = NULL;
+  tt_root.node_offs = UL_OFFSETOF(cust2_item_t, my_node);
+  /*tt_root.node_offs = -1;*/
+  tt_root.key_offs = UL_OFFSETOF(cust2_item_t, my_val);
+  tt_root.cmp_fnc = gavl_cmp_int;
+
+  printf("\nRunning generic tree timing test for %d items\n",items_cnt);
+  
+  items=malloc(items_cnt*sizeof(cust2_item_t));
+  if(!items){
+    printf("malloc failed\n");
+    return;
+  }
+  
+  for(i=0;i<items_cnt;i++){
+    items[i].my_val=i;
+    items[i].more_data=0;
+  }
+  
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(gavl_insert(&tt_root,items+i,0)<0)
+      printf("gavl_insert error\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"GAVL insert");
+  
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(!(item=gavl_find(&tt_root,&i)))
+      printf("gavl_find error\n");
+    else
+      if(item->my_val!=i)
+        printf("gavl_find mismatch\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"GAVL find");
+
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(gavl_delete(&tt_root,items+i)<0)
+      printf("gavl_delete error\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"GAVL delete");
+
+  free(items);
+}
+
+/*===========================================================*/
+/* test code */
+
+typedef struct test_item1 {
+  int val;
+} test_item1_t;
+
+gavl_root_t test_gavl1={
+  .root_node = NULL,
+  .node_offs = -1,
+  .key_offs = UL_OFFSETOF(test_item1_t, val),
+  .cmp_fnc = gavl_cmp_int
+};
+
+int gavl_print_tree1(gavl_root_t *root, gavl_node_t *node,
+               int lev, gavl_node_t *parent, int mode)
+{
+  static int cnt;
+  static int err;
+  int i, val;
+  int lh, rh;
+  int ret;
+  if(!parent){
+    cnt=0;
+    err=0;
+  }
+  if(node!=NULL)
+  {
+    lh=gavl_print_tree1(root, node->left,lev+1, node, mode);
+    cnt++;
+    val=*(int*)gavl_node2key(root,node);
+    if(!(mode&0x80)){
+      for(i=0;i++<lev;) printf(" ");
+      printf(">%d  %d\n",val,node->hdiff);
+    }
+    if(node->parent!=parent) printf("Parent error\n");
+    rh=gavl_print_tree1(root, node->right,lev+1, node, mode);
+    if((rh>lh+1) || (rh+1<lh)){
+      if(!(mode&0x20)){
+        printf("Balance error for value %d, lh %d, rd %d, hdiff %d\n",val,lh,rh,node->hdiff);
+        err=2;
+      }
+    }
+    if(node->hdiff!=lh-rh){
+      printf("HDIFF error for value %d, lh %d, rd %d, hdiff %d\n",val,lh,rh,node->hdiff);
+      err=1;
+    }
+    ret=lh>rh?lh+1:rh+1;
+  } else ret=0;
+  if(!parent){
+    for(i=0;(1<<i)<=cnt;i++);
+    if(!(mode&0x40)){
+      printf("Count %d log %d max %d\n",cnt,i,ret);
+    }
+    if(ret>i+1) printf("Tree height >log2(n)+1\n");
+    if(err){
+      printf("Error %d\n",err);
+      ret=-1;
+    }
+  }
+  return ret;  
+}
+
+int gavl_check(gavl_root_t *root)
+{
+  int ret;
+  if(!root)
+    root=&test_gavl1;
+  ret=gavl_print_tree1(root, root->root_node, 0, NULL, 0xc0);
+  return ret;
+}
+
+
+void gavl_foreach_test1(gavl_root_t *root)
+{
+  int val, prev=-INT_MAX;
+  gavl_node_t *n;
+  for(n=gavl_first_node(root);n;n=gavl_next_node(n)){
+    val=*(int*)gavl_node2key(&test_gavl1,n);
+    printf(" %d",val);
+    if(prev>val) printf("\nError in ordering\n");
+    prev=val;
+  } 
+  printf("\n");
+  
+}
+
+#ifdef WITH_C99
+void gavl_foreach_test2(gavl_root_t *root)
+{
+  int val, prev=-INT_MAX;
+  test_item1_t *item1;
+  test_item1_t *item2;
+  printf("gavl_generic_for_each:\n");
+  gavl_generic_for_each(test_item1_t, root, item1){
+    val=item1->val;
+    printf("after %d:",val);
+    if(prev>val) printf("\nError in ordering\n");
+    prev=val;
+    gavl_generic_for_each_after(test_item1_t, root, &val, item2)
+    {
+      printf(" %d",item2->val);
+    }
+    printf("\n");  
+  }
+}
+#endif /*WITH_C99*/
+
+int main(int argc, char *argv[])
+{
+  int val;
+  int n, i;
+  int ret;
+  char c;
+  test_item1_t *item;
+  gavl_node_t *node, *node1, *node2;
+  
+  if(0){
+    cust_timing_test();
+    return 0;
+  }
+
+  c=0;
+  do{
+    if(!c || (c=='\n'))
+      printf("\nTree edit: a <val>|d <val>|x..exit > ");
+    c=0;
+    scanf("%c",&c);
+    switch(c){
+      case 'a':
+        if (scanf("%d",&val)==1){
+         item=malloc(sizeof(test_item1_t));
+         item->val=val;
+         ret=gavl_insert(&test_gavl1,item,0);
+         printf("gavl_insert of val %d returned %d\n\n",val,ret);
+         gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0);
+        }
+       break;
+      case 'd':
+        if (scanf("%d",&val)==1){
+         ret=gavl_search_node(&test_gavl1, &val, GAVL_FANY, &node);
+         if(!ret){
+           printf("No node with key %d\n",val);
+           break;
+         }
+         item=gavl_node2item(&test_gavl1,node);
+         ret=gavl_delete_node(&test_gavl1,node);
+         free(item);
+         printf("gavl_delete_node of val %d returned %d\n\n",val,ret);
+         gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0);
+        }
+       break;
+      case 'S':
+        if (scanf("%d",&val)==1){
+         item=gavl_find_first(&test_gavl1, &val);
+         if(item)
+           printf("gavl_find_first find item with value %d\n", item->val);
+         else
+           printf("gavl_find_first found no item\n");
+         item=gavl_find_after(&test_gavl1, &val);
+         if(item)
+           printf("gavl_find_after find item with value %d\n", item->val);
+         else
+           printf("gavl_find_after found no item\n");
+        }
+       break;
+      case 'f':
+       gavl_foreach_test1(&test_gavl1);
+       break;
+     #ifdef WITH_C99
+      case 'F':
+       gavl_foreach_test2(&test_gavl1);
+       break;
+     #endif /*WITH_C99*/
+      case 's':
+        ret=scanf("%d %d %d",&val, &n, &i);
+       if(ret<3) i=1;
+        if (ret>=2){
+         while(n--){
+           item=malloc(sizeof(test_item1_t));
+           item->val=val;
+           ret=gavl_insert(&test_gavl1,item,0);
+           if(ret<0)
+             printf("gavl_insert of val %d returned %d\n\n",val,ret);
+           gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0xc0);
+           val+=i;
+         }
+         printf("\n");
+         gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0);
+         gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0xc0);
+        }
+       break;
+      case 'l':
+       i=0;
+       node2=NULL;
+        node=gavl_last_node(&test_gavl1);
+       while(node){
+         node1=gavl_prev_node(node);
+          gavl_delete_node(&test_gavl1,node);
+         gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0xc0);
+         node->hdiff=i; i--;
+         node->right=node2; if(node2) node2->parent=node;
+         node2=node;
+         node=node1;
+       }
+       test_gavl1.root_node=node2;
+        gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x20);
+        break;
+      case 'L':
+       i=0;
+       node2=NULL;
+        node=gavl_first_node(&test_gavl1);
+       while(node){
+         node1=gavl_next_node(node);
+          gavl_delete_node(&test_gavl1,node);
+          gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0xc0);
+         node->hdiff=i; i++;
+         node->left=node2; if(node2) node2->parent=node;
+         node2=node;
+         node=node1;
+       }
+       test_gavl1.root_node=node2;
+        gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x20);
+        break;
+      case 'r':
+       gavl_balance_enhance(&test_gavl1.root_node);
+        gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x20);
+        break;
+      case 'k':
+        for(node1=gavl_first_node(&test_gavl1);node1;node1=node2){
+         /*This is test code and it doesnot free node or item */
+         node2=gavl_delete_and_next_node(&test_gavl1, node1);
+         printf("Value of node %d\n",*(int*)gavl_node2key(&test_gavl1, node1));
+          gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x20);
+       } 
+       break;
+      case 'b':
+       gavl_balance(&test_gavl1);
+        gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x00);
+        break;
+      case 'c':
+        if (scanf("%d",&val)==1){
+         ret=gavl_search_node(&test_gavl1, &val, GAVL_FANY, &node);
+         if(!ret){
+           printf("No node with key %d\n",val);
+           break;
+         }
+         node1=node;
+         for(i=0;node1;i++){
+           if(node1->hdiff>0) node1=node1->left;
+           else node1=node1->right;
+         }
+          gavl_adjust_hdiff(node,-i);
+         if(!node->parent) test_gavl1.root_node=NULL;
+         else if(node==node->parent->left) node->parent->left=NULL;
+         else node->parent->right=NULL;
+         
+        }
+        gavl_print_tree1(&test_gavl1, test_gavl1.root_node, 0, NULL, 0x20);
+       break;
+      case 'C':
+        printf("\nCheck of custom tree for_each\n");
+        test_cust_tree();
+        printf("\nCheck of custom tree iterators\n");
+        test_cust_tree_macro_it();
+        printf("\nCheck of custom tree for_each iterators\n");
+        test_cust_tree_it();
+        break;
+      case 't':
+        timing_test();
+        break;
+      case 'T':
+        cust_timing_test();
+        break;
+    }
+  } while(c!='x');
+  return 0;
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_gavlcust.h b/ulan/host/libs4c/ulut/ul_gavlcust.h
new file mode 100644 (file)
index 0000000..df5d3f7
--- /dev/null
@@ -0,0 +1,160 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavlcust.h  - custom GAVL trees for unique keys
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GAVLCUST_H
+#define _UL_GAVLCUST_H
+
+#include "ul_gavl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * GAVL_CUST_NODE_INT_IMP - Implementation of new custom tree with internal node
+ * @cust_prefix:       defines prefix for builded function names 
+ * @cust_root_t:       user defined structure type of root of the tree
+ * @cust_item_t:       user defined structure type of items stored in the tree
+ * @cust_key_t:                type of the key used for sorting of the items
+ * @cust_root_node:    the field of the root structure pointing to the tree root node 
+ * @cust_item_node:    the field of item structure used for chaining of items
+ * @cust_item_key:     the key field of item structure defining order of items
+ * @cust_cmp_fnc:      the keys compare function 
+ *
+ * There are two macros designed for building custom AVL trees. The macro
+ * %GAVL_CUST_NODE_INT_DEC declares functions for custom tree manipulations
+ * and is intended for use in header files.
+ * The macro %GAVL_CUST_NODE_INT_IMP builds implementations for non-inlined
+ * functions declared by %GAVL_CUST_NODE_INT_DEC. The @cust_cmp_fnc is used
+ * for comparison of item keys in the search and insert functions. The types
+ * of two input arguments of @cust_cmp_fnc functions must correspond 
+ * with @cust_key_t type. Return value should be positive for case when
+ * the first pointed key value is greater then second, negative for reverse
+ * case and zero for equal pointed values.
+ */
+#define GAVL_CUST_NODE_INT_IMP(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_node, cust_item_node, cust_item_key, cust_cmp_fnc) \
+\
+void cust_prefix##_init_root_field(cust_root_t *root)\
+{\
+  root->cust_root_node=NULL;\
+}\
+\
+int cust_prefix##_search_node(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep)\
+{\
+  int cmp=1;\
+  gavl_node_t *n, *p;\
+  n=p=root->cust_root_node;\
+  while(n){\
+    cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+    p=n;\
+    if(cmp>0){\
+      n=n->left;\
+    }else if(cmp<0){\
+      n=n->right;\
+    }else{\
+      *nodep=n;\
+      return 0;\
+    }\
+  }\
+  *nodep=p;\
+  return cmp;\
+}\
+\
+cust_item_t *cust_prefix##_find(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node(root, key, &node))\
+    return NULL;\
+  return cust_prefix##_node2item(root,node);\
+}\
+\
+cust_item_t *cust_prefix##_find_first(const cust_root_t *root, cust_key_t *key)\
+{\
+  return cust_prefix##_find(root, key);\
+}\
+\
+cust_item_t *cust_prefix##_find_after(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node(root, key, &node)<=0){\
+     if(node) node=gavl_next_node(node);\
+  }\
+  return node?cust_prefix##_node2item(root,node):NULL;\
+}\
+\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item)\
+{\
+  int cmp;\
+  gavl_node_t *where, *n2add;\
+  \
+  cmp=cust_prefix##_search_node(root, &item->cust_item_key, &where);\
+  if(!cmp) return -1;\
+  n2add=&item->cust_item_node;\
+  return gavl_insert_primitive_at(&root->cust_root_node, n2add, where, cmp);\
+}\
+\
+int cust_prefix##_delete_node(cust_root_t *root, gavl_node_t *node)\
+{\
+  return gavl_delete_primitive(&root->cust_root_node, node);\
+}\
+\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item)\
+{\
+  int ret;\
+  gavl_node_t *n, *p;\
+  if(!item) return -1;\
+  /*if(cust_prefix##_search_node(root, &item->cust_item_key, &n))*/\
+  n=&item->cust_item_node;\
+  /*check if node is inserted into tree*/\
+  for(p=n; p->parent; p=p->parent);\
+  if(p!=root->cust_root_node)\
+    return -1;\
+  ret=gavl_delete_primitive(&root->cust_root_node, n);\
+  return 1;\
+}\
+\
+gavl_node_t *cust_prefix##_first_node(const cust_root_t *root)\
+{\
+  gavl_node_t *n=root->cust_root_node;\
+  if(!n) return NULL;\
+  while(n->left)\
+    n=n->left;\
+  return n;\
+}\
+\
+gavl_node_t *cust_prefix##_last_node(const cust_root_t *root)\
+{\
+  gavl_node_t *n=root->cust_root_node;\
+  if(!n) return NULL;\
+  while(n->right)\
+    n=n->right;\
+  return n;\
+}
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GAVLCUST_H */
diff --git a/ulan/host/libs4c/ulut/ul_gavlflesint.h b/ulan/host/libs4c/ulut/ul_gavlflesint.h
new file mode 100644 (file)
index 0000000..7733d40
--- /dev/null
@@ -0,0 +1,293 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavlflesint.h  - custom trees with allowed repeat of keys
+                      and fast access to the first and last item
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GAVLFLESINT_H
+#define _UL_GAVLFLESINT_H
+
+#include "ul_gavl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Declaration of tree with first/last enhanced speed functions with internal node */
+#define GAVL_FLES_INT_DEC(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_field, cust_item_node, cust_item_key, cust_cmp_fnc) \
+\
+static inline cust_item_t * \
+cust_prefix##_node2item(const cust_root_t *root, const gavl_node_t *node) \
+  {return (cust_item_t*)((char*)node-(long)&((cust_item_t*)0)->cust_item_node);}\
+\
+static inline cust_key_t *\
+cust_prefix##_node2key(const cust_root_t *root, gavl_node_t *node)\
+  { return &(cust_prefix##_node2item(root, node)->cust_item_key);}\
+\
+void cust_prefix##_init_root_field(cust_root_t *root);\
+int cust_prefix##_search_node(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep);\
+cust_item_t *cust_prefix##_find(const cust_root_t *root, cust_key_t *key);\
+cust_item_t *cust_prefix##_find_first(const cust_root_t *root, cust_key_t *key);\
+cust_item_t *cust_prefix##_find_after(const cust_root_t *root, cust_key_t *key);\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item);\
+cust_item_t *cust_prefix##_cut_first(cust_root_t *root);\
+int cust_prefix##_delete_node(cust_root_t *root, gavl_node_t *node);\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item);\
+\
+static inline void \
+cust_prefix##_init_detached(cust_item_t *item){\
+  item->cust_item_node.parent=NULL;\
+}\
+static inline gavl_node_t *\
+cust_prefix##_first_node(const cust_root_t *root)\
+{\
+  return root->cust_root_field.first;\
+}\
+static inline gavl_node_t *\
+cust_prefix##_last_node(const cust_root_t *root)\
+{\
+  return root->cust_root_field.last;\
+}\
+static inline cust_item_t *\
+cust_prefix##_first(const cust_root_t *root)\
+{\
+  gavl_node_t *n=cust_prefix##_first_node(root);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_last(const cust_root_t *root)\
+{\
+  gavl_node_t *n=cust_prefix##_last_node(root);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_next(const cust_root_t *root, cust_item_t *item)\
+{\
+  gavl_node_t *n=gavl_next_node(&item->cust_item_node);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_prev(const cust_root_t *root, cust_item_t *item)\
+{\
+  gavl_node_t *n=gavl_prev_node(&item->cust_item_node);\
+  return n?cust_prefix##_node2item(root,n):NULL;\
+}\
+static inline int \
+cust_prefix##_is_empty(const cust_root_t *root)\
+{\
+  return !root->cust_root_field.root;\
+}\
+/*** Iterators ***/\
+UL_ITBASE_SORT_DEC(cust_prefix, cust_root_t, cust_item_t, cust_key_t)
+
+
+/**
+ * GAVL_FLES_INT_IMP - Implementation of new custom tree with fast first/last functions
+ * @cust_prefix:       defines prefix for builded function names 
+ * @cust_root_t:       user defined structure type of root of the tree
+ * @cust_item_t:       user defined structure type of items stored in the tree
+ * @cust_key_t:                type of the key used for sorting of the items
+ * @cust_root_field:   the field of the root structure pointing to the tree root node 
+ * @cust_item_node:    the field of item structure used for chaining of items
+ * @cust_item_key:     the key field of item structure defining order of items
+ * @cust_cmp_fnc:      the keys compare function 
+ *
+ * This version of custom tree implementation allows multiple items with same
+ * key value to be stored in tree.
+ * There are two macros designed for building custom AVL trees. The macro
+ * %GAVL_CUST_NODE_INT_DEC declares functions for custom tree manipulations
+ * and is intended for use in header files.
+ * The macro %GAVL_CUST_NODE_INT_REP_IMP builds implementations for non-inlined
+ * functions declared by %GAVL_CUST_NODE_INT_DEC. The @cust_cmp_fnc is used
+ * for comparison of item keys in the search and insert functions. The types
+ * of two input arguments of @cust_cmp_fnc functions must correspond 
+ * with @cust_key_t type. Return value should be positive for case when
+ * the first pointed key value is greater then second, negative for reverse
+ * case and zero for equal pointed values.
+ */
+#define GAVL_FLES_INT_IMP(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_field, cust_item_node, cust_item_key, cust_cmp_fnc,\
+               cust_ins_fl, cust_first_change, cust_last_change, cust_empty_state) \
+\
+void cust_prefix##_init_root_field(cust_root_t *root)\
+{\
+  root->cust_root_field.root=NULL;\
+  root->cust_root_field.first=NULL;\
+  root->cust_root_field.last=NULL;\
+  root->cust_root_field.count=0;\
+}\
+\
+int cust_prefix##_search_node4(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep, int mode)\
+{\
+  int cmp=1;\
+  gavl_node_t *n, *p;\
+  n=p=root->cust_root_field.root;\
+  while(n){\
+    cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+    p=n;\
+    if(cmp>0){\
+      n=n->left;\
+    }else if((cmp<0)||(mode&GAVL_FAFTER)){\
+      n=n->right;\
+    }else{\
+      break;\
+    }\
+  }\
+  if(!cmp && (mode&GAVL_FFIRST)){\
+    while((n=p->left)){\
+      cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+      if(!cmp){\
+        p=n;\
+      }else{\
+        while((n=n->right)){\
+          cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+          if(!cmp){\
+            p=n;\
+            break;\
+          }\
+        }\
+        if(cmp) break;\
+      }\
+    }\
+    cmp=0;\
+  }\
+  *nodep=p;\
+  return cmp;\
+}\
+\
+int cust_prefix##_search_node(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep)\
+{\
+  return cust_prefix##_search_node4(root, key, nodep, 0);\
+}\
+\
+cust_item_t *cust_prefix##_find(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node4(root, key, &node, 0))\
+    return NULL;\
+  return cust_prefix##_node2item(root,node);\
+}\
+\
+cust_item_t *cust_prefix##_find_first(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *n;\
+  if(cust_prefix##_search_node4(root, key, &n, GAVL_FFIRST))\
+    return NULL;\
+  return cust_prefix##_node2item(root,n);\
+}\
+\
+cust_item_t *cust_prefix##_find_after(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node4(root, key, &node, GAVL_FAFTER)<=0){\
+     if(node) node=gavl_next_node(node);\
+  }\
+  return node?cust_prefix##_node2item(root,node):NULL;\
+}\
+\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item)\
+{\
+  int cmp;\
+  gavl_node_t *where, *n2add;\
+  \
+  cmp=cust_prefix##_search_node4(root, &item->cust_item_key, &where, cust_ins_fl);\
+  if(!cmp && !(cust_ins_fl&GAVL_FAFTER)) return -1;\
+  n2add=&item->cust_item_node;\
+  if(!root->cust_root_field.root){\
+    root->cust_root_field.first=root->cust_root_field.last=n2add;\
+    cust_first_change; cust_last_change;\
+  }else if((cmp>0)&&(where==root->cust_root_field.first)){\
+    root->cust_root_field.first=n2add;\
+    cust_first_change;\
+  }else if((cmp<=0)&&(where==root->cust_root_field.last)){\
+    root->cust_root_field.last=n2add;\
+    cust_last_change;\
+  }\
+  root->cust_root_field.count++;\
+  return gavl_insert_primitive_at(&root->cust_root_field.root, n2add, where, cmp);\
+}\
+\
+int cust_prefix##_delete_node(cust_root_t *root, gavl_node_t *node)\
+{\
+  gavl_node_t *p;\
+  /*check if node is inserted into tree*/\
+  for(p=node; p->parent; p=p->parent);\
+  if(p!=root->cust_root_field.root)\
+    return -1;\
+  if(root->cust_root_field.first==node){\
+    if(root->cust_root_field.last==node){\
+      root->cust_root_field.first=root->cust_root_field.last=NULL;\
+      cust_empty_state;\
+    }else{\
+      root->cust_root_field.first=gavl_next_node(node);\
+      cust_first_change;\
+    }\
+  }else if(root->cust_root_field.last==node){\
+    root->cust_root_field.last=gavl_prev_node(node);\
+    cust_last_change;\
+  }\
+  root->cust_root_field.count--;\
+  return gavl_delete_primitive(&root->cust_root_field.root, node);\
+}\
+\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item)\
+{\
+  gavl_node_t *n;\
+  if(!item) return -1;\
+  n=&item->cust_item_node;\
+  return cust_prefix##_delete_node(root, n);\
+}\
+\
+cust_item_t *cust_prefix##_cut_first(cust_root_t *root)\
+{\
+  gavl_node_t *n, *p;\
+  gavl_node_t **np=&root->cust_root_field.root;\
+  if(!(n=root->cust_root_field.first))\
+    return NULL;\
+  if(n->parent) np=&n->parent->left;\
+  if((*np=n->right)){\
+    p=n->right;\
+    p->parent=n->parent;\
+    while(p->left) p=p->left;\
+    root->cust_root_field.first=p;\
+    cust_first_change;\
+  }else{\
+    if(!(root->cust_root_field.first=n->parent)){\
+      root->cust_root_field.last=n->parent;\
+      cust_empty_state;\
+    }else{\
+      cust_first_change;\
+    }\
+  }\
+  for(p=n->parent;p;p=p->parent)\
+    if(p->hdiff++<0) break;\
+  n->parent=n->left=n->right=NULL;\
+  root->cust_root_field.count--;\
+  return cust_prefix##_node2item(root,n);\
+}
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GAVLFLESINT_H */
diff --git a/ulan/host/libs4c/ulut/ul_gavlprim.c b/ulan/host/libs4c/ulut/ul_gavlprim.c
new file mode 100644 (file)
index 0000000..fb6352d
--- /dev/null
@@ -0,0 +1,438 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavlprim.c        - primitives for generic AVL tree
+
+  (C) Copyright 2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_gavl.h"
+
+int 
+gavl_hdiff_check(gavl_node_t *node, int mode);
+
+#if 0
+ #define GAVL_HDIFF_DEBUG(tree, mode) gavl_hdiff_check(tree, mode)
+#else
+ #define GAVL_HDIFF_DEBUG(tree, mode)
+#endif
+
+/**
+ * gavl_next_node - Returns Next Node of GAVL Tree
+ * @node:      node for which accessor is looked for
+ *
+ * Return Value: pointer to next node of tree according to ordering
+ */
+gavl_node_t *
+gavl_next_node(const gavl_node_t *node)
+{
+  gavl_node_t *n;
+  if((n=node->right)){
+    while(n->left) n=n->left;
+    return n;
+  } else {
+    while((n=node->parent)){
+      if(n->right!=node) break;
+      node=n;
+    }
+    return n;
+  }
+}
+
+/**
+ * gavl_prev_node - Returns Previous Node of GAVL Tree
+ * @node:      node for which predecessor is looked for
+ *
+ * Return Value: pointer to previous node of tree according to ordering
+ */
+gavl_node_t *
+gavl_prev_node(const gavl_node_t *node)
+{
+  gavl_node_t *n;
+  if((n=node->left)){
+    while(n->right) n=n->right;
+    return n;
+  } else {
+    while((n=node->parent)){
+      if(n->left!=node) break;
+      node=n;
+    }
+    return n;
+  }
+}
+
+/**
+ * gavl_balance_one - Balance One Node to Enhance Balance Factor
+ * @subtree:   pointer to pointer to node for which balance is enhanced
+ *
+ * Return Value: returns nonzero value if height of subtree is lowered by one
+ */
+int
+gavl_balance_one(gavl_node_t **subtree)
+{
+  int shdiff; int ret;
+  gavl_node_t *n, *p, *parent;
+  
+ #ifdef GAVL_UNBALANCED_SUPPORT
+  if(!*subtree) return 0;
+ #endif /* GAVL_UNBALANCED_SUPPORT */
+  parent=(*subtree)->parent;
+  shdiff=(*subtree)->hdiff;
+  
+  if (shdiff>1)
+  {
+    n=(*subtree)->left;
+   #ifdef GAVL_UNBALANCED_SUPPORT
+    if(!n) return 0;
+   #endif /* GAVL_UNBALANCED_SUPPORT */
+    if (n->hdiff>=0) {
+      /* ds1=ds-dn-1; */
+      /* if(ds>dn) dn1=dn-1; else dn1=ds-2; */
+      (*subtree)->hdiff=shdiff-n->hdiff-1;
+      ret=n->hdiff>0;
+     #ifdef GAVL_UNBALANCED_SUPPORT
+      if(shdiff<=n->hdiff)
+       n->hdiff=shdiff-2;
+      else
+     #endif /* GAVL_UNBALANCED_SUPPORT */
+       n->hdiff--;
+      p=n->right;
+      n->right=*subtree; (*subtree)->parent=n;
+      (*subtree)->left=p; if(p) p->parent=*subtree;
+      *subtree=n; n->parent=parent;
+      GAVL_HDIFF_DEBUG(*subtree, 0);
+    }else{
+      p=n->right;
+     #ifdef GAVL_UNBALANCED_SUPPORT
+      if(!p) return 0;
+     #endif /* GAVL_UNBALANCED_SUPPORT */
+      shdiff-=2;
+      if(p->hdiff>=0){
+        /* ds1=ds-2-dp; dn1=dn+1; dp1=min(dp;ds-2); */
+        (*subtree)->hdiff=shdiff-p->hdiff;
+       n->hdiff++;
+       #ifndef GAVL_UNBALANCED_SUPPORT
+       p->hdiff=0;
+       #else /* GAVL_UNBALANCED_SUPPORT */
+       if (p->hdiff>shdiff) p->hdiff=shdiff;
+       #endif /* GAVL_UNBALANCED_SUPPORT */
+      }else{
+        /* ds1=ds-2; dn1=dn+1-dp; dp1=max(dn+1;dp); */
+        (*subtree)->hdiff=shdiff;
+       shdiff=n->hdiff; /* shdiff reused for nhdiff */
+       n->hdiff=shdiff+1-p->hdiff;
+       #ifndef GAVL_UNBALANCED_SUPPORT
+       p->hdiff=0;
+       #else /* GAVL_UNBALANCED_SUPPORT */
+       if (p->hdiff<=shdiff) p->hdiff=shdiff+1;
+       #endif /* GAVL_UNBALANCED_SUPPORT */
+      }
+      n->right=p->left; if(p->left) p->left->parent=n;
+      (*subtree)->left=p->right; if(p->right) p->right->parent=*subtree;
+      p->left=n; n->parent=p;
+      p->right=*subtree; (*subtree)->parent=p;
+      *subtree=p; p->parent=parent;
+      GAVL_HDIFF_DEBUG(*subtree, 0);
+      ret=1;
+    }
+  }
+  else if (shdiff<-1)
+  {
+    n=(*subtree)->right;
+   #ifdef GAVL_UNBALANCED_SUPPORT
+    if(!n) return 0;
+   #endif /* GAVL_UNBALANCED_SUPPORT */
+    if (n->hdiff<=0) {
+      /* ds1=ds-dn+1; */
+      /* if(ds<dn) dn1=dn+1; else dn1=ds+2; */
+      (*subtree)->hdiff=shdiff-n->hdiff+1;
+      ret=n->hdiff<0;
+     #ifdef GAVL_UNBALANCED_SUPPORT
+      if(shdiff>=n->hdiff)
+       n->hdiff=shdiff+2;
+      else
+     #endif /* GAVL_UNBALANCED_SUPPORT */
+       n->hdiff++;
+      p=n->left;
+      n->left=*subtree; (*subtree)->parent=n;
+      (*subtree)->right=p; if(p) p->parent=*subtree;
+      *subtree=n; n->parent=parent;
+      GAVL_HDIFF_DEBUG(*subtree, 0);
+    }else{
+      p=n->left;
+     #ifdef GAVL_UNBALANCED_SUPPORT
+      if(!p) return 0;
+     #endif /* GAVL_UNBALANCED_SUPPORT */
+      shdiff+=2;
+      if(p->hdiff<=0){
+        /* ds1=ds+2-dp; dn1=dn-1; dp1=max(dp;ds+2); */
+        (*subtree)->hdiff=shdiff-p->hdiff;
+       n->hdiff--;
+       #ifndef GAVL_UNBALANCED_SUPPORT
+       p->hdiff=0;
+       #else /* GAVL_UNBALANCED_SUPPORT */
+       if (p->hdiff<shdiff) p->hdiff=shdiff;
+       #endif /* GAVL_UNBALANCED_SUPPORT */
+      }else{
+        /* ds1=ds+2; dn1=dn-1-dp; dp1=min(dn-1;dp); */
+        (*subtree)->hdiff=shdiff;
+       shdiff=n->hdiff; /* shdiff reused for nhdiff */
+       n->hdiff=shdiff-1-p->hdiff;
+       #ifndef GAVL_UNBALANCED_SUPPORT
+       p->hdiff=0;
+       #else /* GAVL_UNBALANCED_SUPPORT */
+       if (p->hdiff>=shdiff) p->hdiff=shdiff-1;
+       #endif /* GAVL_UNBALANCED_SUPPORT */
+      }
+      n->left=p->right; if(p->right) p->right->parent=n;
+      (*subtree)->right=p->left; if(p->left) p->left->parent=*subtree;
+      p->right=n; n->parent=p;
+      p->left=*subtree; (*subtree)->parent=p;
+      *subtree=p; p->parent=parent;
+      GAVL_HDIFF_DEBUG(*subtree, 0);
+      ret=1;
+    }
+  } else ret=0;
+
+  /*printf("#%d",ret);*/
+  return(ret);
+}
+
+/**
+ * gavl_insert_primitive_at - Low Lewel Routine to Insert Node into Tree 
+ * @root_nodep:        pointer to pointer to GAVL tree root node
+ * @node:      pointer to inserted node
+ * @where:     pointer to found parent node
+ * @leftright: left (>=1) or right (<=0) branch
+ *
+ * This function can be used for implementing AVL trees with custom
+ * root definition. The value of the selected @left or @right pointer
+ * of provided @node has to be NULL before insert operation,
+ * i.e. node has to be end node in the selected direction.
+ * Return Value: positive value informs about success
+ */
+int
+gavl_insert_primitive_at(gavl_node_t **root_nodep, gavl_node_t *node,
+                   gavl_node_t *where, int leftright)
+{
+  int hdiff;
+
+  node->hdiff=0;
+  node->left=node->right=0;
+  if(!*root_nodep){
+    node->parent=NULL;
+    *root_nodep=node;
+    return 1;
+  }
+  node->parent=where;
+  if(leftright>0)
+    where->left=node;  /* where->avl+=1 */
+  else
+    where->right=node; /* where->avl-=1 */
+    
+  do{
+    hdiff=where->hdiff;
+    if(where->left==node){
+      /* break if balance enhanced */
+      if(where->hdiff++ <0) break;
+    }else{
+      /* break if balance enhanced */
+      if(where->hdiff-- >0) break;
+    }
+    node=where;
+    where=where->parent;
+    if(hdiff){
+      gavl_node_t **np;
+      if(!where)
+        np=root_nodep;
+      else if(where->left==node)
+        np=&where->left;
+      else
+        np=&where->right;
+      /* if only balanced trees are supposed, then next operation
+         leads to loop break for all possible cases */
+      if(gavl_balance_one(np)) break;
+    }
+  } while(where);
+    
+  return 1;
+}
+
+/**
+ * gavl_delete_primitive - Low Lewel Deletes/Unlinks Node from GAVL Tree 
+ * @root_nodep:        pointer to pointer to GAVL tree root node
+ * @node:      pointer to deleted node
+ *
+ * Return Value: positive value informs about success.
+ */
+int
+gavl_delete_primitive(gavl_node_t  **root_nodep, gavl_node_t *node)
+{
+  int bal=0;
+  int hdiff=1;
+  int left_fl;
+  gavl_node_t *p, *n;
+  gavl_node_t **np;
+
+  p=node->parent;
+  if(node==*root_nodep){
+    np=root_nodep;
+    left_fl=0;
+  }else if(p->left==node){
+    np=&p->left;
+    left_fl=1;
+  }else{
+    np=&p->right;
+    left_fl=0;
+  }
+  if(!node->left){
+    if(!node->right){
+      /* No child */
+      *np=NULL;
+    }else{
+      /* Right child only */
+      *np=node->right;
+      node->right->parent=p;
+    }
+  }else{
+    if(!node->right){
+      /* Left child only */
+      *np=node->left;
+      node->left->parent=p;
+    }else{
+      gavl_node_t *neigh;
+      if(node->hdiff>=0){
+        gavl_node_t **np;
+        /* Use nearest left node for top of subtree */
+       np=&node->left; n=*np;
+       while(n->right) {np=&n->right; n=*np;}
+       neigh=n;
+       if((*np=n->left)) n->left->parent=n->parent;
+       while(n->parent!=node){
+         n=n->parent;
+         if(bal){
+           bal=0;
+            if(!gavl_balance_one(&n->right)) {hdiff=0; break;}
+         }
+         if(n->hdiff++ ==0) {hdiff=0; break;}
+         bal=(n->hdiff>0);
+       }
+        if(bal)
+          if(!gavl_balance_one(&node->left)) hdiff=0;
+
+       neigh->hdiff=node->hdiff;
+       if(hdiff){
+         if(!(neigh->hdiff--)) hdiff=0;
+       }
+      }else{
+        gavl_node_t **np;
+        /* Use nearest right node for top of subtree */
+       np=&node->right; n=*np;
+       while(n->left) {np=&n->left; n=*np;}
+       neigh=n;
+       if((*np=n->right)) n->right->parent=n->parent; 
+       while(n->parent!=node){
+         n=n->parent;
+         if(bal){
+           bal=0;
+            if(!gavl_balance_one(&n->left)) {hdiff=0; break;}
+         }
+         if(n->hdiff-- ==0) {hdiff=0; break;}
+         bal=(n->hdiff<0);
+       }
+        if(bal)
+          if(!gavl_balance_one(&node->right)) hdiff=0;
+
+       neigh->hdiff=node->hdiff;
+       if(hdiff){
+         if(!(neigh->hdiff++)) hdiff=0;
+       }
+      }
+      if((neigh->left=node->left)) neigh->left->parent=neigh;
+      if((neigh->right=node->right)) neigh->right->parent=neigh;
+      neigh->parent=node->parent;
+
+      bal=0;
+      p=node->parent;
+      *np=neigh;
+    }
+  }
+  if(hdiff) do{
+    if(!p){
+      if(bal)
+        gavl_balance_one(root_nodep);
+      break;
+    }else if(left_fl){
+      if(bal)
+        if(!gavl_balance_one(&p->left)) break;
+      /* three cases for hdiff--
+       * +1 ->  0 => recurse
+       *  0 -> -1 => break
+       * -1 -> -2 => balance and recurse
+       */
+      bal=p->hdiff<0;
+      if(!p->hdiff--) break;
+    }else{
+      if(bal)
+        if(!gavl_balance_one(&p->right)) break;
+      /* three cases for hdiff++
+       * -1 ->  0 => recurse
+       *  0 -> +1 => break
+       * +1 -> +2 => balance and recurse
+       */
+      bal=p->hdiff>0;
+      if(!p->hdiff++) break;
+    }
+    n=p;
+    p=p->parent;
+    if(p) left_fl=(p->left==n);
+  }while(1);
+
+  node->parent=node->left=node->right=NULL;
+  return 1;
+}
+
+#ifdef GAVL_UNBALANCED_SUPPORT
+
+/**
+ * gavl_cut_first_primitive - Low Lewel Routine to Cut First Node from Tree 
+ * @root_nodep:        pointer to pointer to GAVL tree root node
+ *
+ * This enables fast delete of the first node without tree balancing.
+ * The resulting tree is degraded but height differences are kept consistent.
+ * Use of this function can result in height of tree maximally one greater
+ * the tree managed by optimal AVL functions.
+ * Return Value: returns the first node or NULL if the tree is empty
+ */
+gavl_node_t *
+gavl_cut_first_primitive(gavl_node_t **root_nodep)
+{
+  gavl_node_t *n, *p;
+  gavl_node_t **np=root_nodep;
+  if(!*np) return NULL;
+  while((n=*np)->left)
+    np=&(n->left);
+  if((*np=n->right)) n->right->parent=n->parent;
+  for(p=n->parent;p;p=p->parent)
+    if(p->hdiff++<0) break;
+  n->parent=n->left=n->right=NULL;
+  return n;
+}
+
+#endif /*GAVL_UNBALANCED_SUPPORT*/
diff --git a/ulan/host/libs4c/ulut/ul_gavlrepcust.h b/ulan/host/libs4c/ulut/ul_gavlrepcust.h
new file mode 100644 (file)
index 0000000..158da3d
--- /dev/null
@@ -0,0 +1,185 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gavlrepcust.h  - custom trees with allowed repeat of keys
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GAVLREPCUST_H
+#define _UL_GAVLREPCUST_H
+
+#include "ul_gavl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * GAVL_CUST_NODE_INT_REP_IMP - Implementation of new custom tree with internal node allowed item repeat
+ * @cust_prefix:       defines prefix for builded function names 
+ * @cust_root_t:       user defined structure type of root of the tree
+ * @cust_item_t:       user defined structure type of items stored in the tree
+ * @cust_key_t:                type of the key used for sorting of the items
+ * @cust_root_node:    the field of the root structure pointing to the tree root node 
+ * @cust_item_node:    the field of item structure used for chaining of items
+ * @cust_item_key:     the key field of item structure defining order of items
+ * @cust_cmp_fnc:      the keys compare function 
+ *
+ * This version of custom tree implementation allows multiple items with same
+ * key value to be stored in tree.
+ * There are two macros designed for building custom AVL trees. The macro
+ * %GAVL_CUST_NODE_INT_DEC declares functions for custom tree manipulations
+ * and is intended for use in header files.
+ * The macro %GAVL_CUST_NODE_INT_REP_IMP builds implementations for non-inlined
+ * functions declared by %GAVL_CUST_NODE_INT_DEC. The @cust_cmp_fnc is used
+ * for comparison of item keys in the search and insert functions. The types
+ * of two input arguments of @cust_cmp_fnc functions must correspond 
+ * with @cust_key_t type. Return value should be positive for case when
+ * the first pointed key value is greater then second, negative for reverse
+ * case and zero for equal pointed values.
+ */
+#define GAVL_CUST_NODE_INT_REP_IMP(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_node, cust_item_node, cust_item_key, cust_cmp_fnc) \
+\
+void cust_prefix##_init_root_field(cust_root_t *root)\
+{\
+  root->cust_root_node=NULL;\
+}\
+\
+int cust_prefix##_search_node4(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep, int mode)\
+{\
+  int cmp=1;\
+  gavl_node_t *n, *p;\
+  n=p=root->cust_root_node;\
+  while(n){\
+    cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+    p=n;\
+    if(cmp>0){\
+      n=n->left;\
+    }else if((cmp<0)||(mode&GAVL_FAFTER)){\
+      n=n->right;\
+    }else{\
+      break;\
+    }\
+  }\
+  if(!cmp && (mode&GAVL_FFIRST)){\
+    while((n=p->left)){\
+      cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+      if(!cmp){\
+        p=n;\
+      }else{\
+        while((n=n->right)){\
+          cmp=cust_cmp_fnc(cust_prefix##_node2key(root,n),key);\
+          if(!cmp){\
+            p=n;\
+            break;\
+          }\
+        }\
+        if(cmp) break;\
+      }\
+    }\
+    cmp=0;\
+  }\
+  *nodep=p;\
+  return cmp;\
+}\
+\
+int cust_prefix##_search_node(const cust_root_t *root, cust_key_t *key, gavl_node_t **nodep)\
+{\
+  return cust_prefix##_search_node4(root, key, nodep, 0);\
+}\
+\
+cust_item_t *cust_prefix##_find(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node4(root, key, &node, 0))\
+    return NULL;\
+  return cust_prefix##_node2item(root,node);\
+}\
+\
+cust_item_t *cust_prefix##_find_first(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *n;\
+  if(cust_prefix##_search_node4(root, key, &n, GAVL_FFIRST))\
+    return NULL;\
+  return cust_prefix##_node2item(root,n);\
+}\
+\
+cust_item_t *cust_prefix##_find_after(const cust_root_t *root, cust_key_t *key)\
+{\
+  gavl_node_t *node;\
+  if(cust_prefix##_search_node4(root, key, &node, GAVL_FAFTER)<=0){\
+     if(node) node=gavl_next_node(node);\
+  }\
+  return node?cust_prefix##_node2item(root,node):NULL;\
+}\
+\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item)\
+{\
+  int cmp;\
+  gavl_node_t *where, *n2add;\
+  \
+  cmp=cust_prefix##_search_node4(root, &item->cust_item_key, &where, GAVL_FAFTER);\
+  n2add=&item->cust_item_node;\
+  return gavl_insert_primitive_at(&root->cust_root_node, n2add, where, cmp);\
+}\
+\
+int cust_prefix##_delete_node(cust_root_t *root, gavl_node_t *node)\
+{\
+  return gavl_delete_primitive(&root->cust_root_node, node);\
+}\
+\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item)\
+{\
+  int ret;\
+  gavl_node_t *n, *p;\
+  if(!item) return -1;\
+  n=&item->cust_item_node;\
+  /*check if node is inserted into tree*/\
+  for(p=n; p->parent; p=p->parent);\
+  if(p!=root->cust_root_node)\
+    return -1;\
+  ret=gavl_delete_primitive(&root->cust_root_node, n);\
+  return 1;\
+}\
+\
+gavl_node_t *cust_prefix##_first_node(const cust_root_t *root)\
+{\
+  gavl_node_t *n=root->cust_root_node;\
+  if(!n) return NULL;\
+  while(n->left)\
+    n=n->left;\
+  return n;\
+}\
+\
+gavl_node_t *cust_prefix##_last_node(const cust_root_t *root)\
+{\
+  gavl_node_t *n=root->cust_root_node;\
+  if(!n) return NULL;\
+  while(n->right)\
+    n=n->right;\
+  return n;\
+}
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GAVLREPCUST_H */
diff --git a/ulan/host/libs4c/ulut/ul_gsa.c b/ulan/host/libs4c/ulut/ul_gsa.c
new file mode 100644 (file)
index 0000000..838d793
--- /dev/null
@@ -0,0 +1,394 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gsa.c     - generic sorted arrays
+
+  (C) Copyright 2001-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_gsa.h"
+
+#undef DEBUG
+
+#define GSA_ALLOC_STEP 8
+#define GSA_DEALLOC_STEP 32
+
+/**
+ * gsa_struct_init - Initialize GSA Structure
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key_offs:  offset to the order controlling field obtained by %UL_OFFSETOF
+ * @cmp_fnc:   function defining order of items by comparing fields at offset
+ *             @key_offs.
+ */
+void 
+gsa_struct_init(gsa_array_t *array, int key_offs,
+               gsa_cmp_fnc_t *cmp_fnc)
+{
+  array->key_offs=key_offs;
+  array->cmp_fnc=cmp_fnc;
+  array->count=0;
+  array->alloc_count=0;
+  array->items=NULL;
+}
+
+/**
+ * gsa_delete_all - Delete Pointers to the All Items in the Array
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ *
+ * This function releases all internally allocated memory,
+ * but does not release memory of the @array structure
+ */
+void 
+gsa_delete_all(gsa_array_t *array)
+{
+  if(array->items) free(array->items);
+  array->items=NULL;
+  array->count=0;
+  array->alloc_count=0;
+}
+
+
+/**
+ * gsa_bsearch_indx - Search for Item or Place for Item by Key
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key:       key value searched for
+ * @key_offs:  offset to the order controlling field obtained by %UL_OFFSETOF
+ * @cmp_fnc:   function defining order of items by comparing fields
+ * @mode:      mode of the search operation
+ * @indx:      pointer to place, where store value of found item array index 
+ *             or index where new item should be inserted
+ *
+ * Core search routine for GSA arrays
+ * binary searches for item with field at offset @key_off equal to @key value
+ * Values are compared by function pointed by *@cmp_fnc field in the array
+ * structure @array.
+ * Integer @mode modifies search algorithm:
+ *   %GSA_FANY   .. finds item with field value *@key,
+ *   %GSA_FFIRST .. finds the first item with field value *@key,
+ *   %GSA_FAFTER .. index points after last item with *@key value,
+ *        reworded - index points at first item with higher 
+ *        value of field or after last item
+ * Return Value: Return of nonzero value indicates match found.
+ */
+int 
+gsa_bsearch_indx(gsa_array_t *array, void *key, int key_offs,
+           gsa_cmp_fnc_t *cmp_fnc, int mode, unsigned *indx)
+{
+  unsigned a, b, c;
+  int r;
+  if(!array->items || !array->count || !cmp_fnc){
+    *indx=0;
+    if(mode&GSA_FAFTER)
+      *indx=array->count;
+    return 0;
+  }
+  a=0;
+  b=array->count;
+  while(1){
+    c=(a+b)/2;
+    r=cmp_fnc((char*)array->items[c]+key_offs,key);
+    if(!r) break;
+    if(r<0)
+      a=c+1;
+     else
+      b=c;  
+    if(a==b){
+      *indx=a;
+      return 0;
+    }
+  }
+  if(mode&GSA_FFIRST){
+    /* equal items can be in range a to b-1 */
+    /* routine looks for first one */
+    b=c;
+    do{
+      c=(a+b)/2;
+      r=cmp_fnc((char*)array->items[c]+key_offs,key);
+      if(r)
+       a=c+1;
+       else
+       b=c;  
+    }while(a!=b);
+    c=b;
+  } else if(mode&GSA_FAFTER) {
+    /* equal items can be in range a to b-1 */
+    /* return index after last one */
+    a=c+1;
+    while(a!=b){
+      c=(a+b)/2;
+      r=cmp_fnc((char*)array->items[c]+key_offs,key);
+      if(r)
+       b=c;
+       else
+       a=c+1;
+    }
+    c=a;
+  }
+  *indx=c;
+  return 1;
+}
+
+/**
+ * gsa_find - Find Item for Provided Key
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key:       key value searched for
+ *
+ * Return Value: pointer to item associated to key value or %NULL.
+ */
+void * 
+gsa_find(gsa_array_t *array, void *key)
+{
+  unsigned indx;
+  if(gsa_bsearch_indx(array,key,array->key_offs,
+                     array->cmp_fnc,0,&indx))
+    return array->items[indx];
+  else return NULL;
+}
+
+/**
+ * gsa_find_first - Find the First Item for Provided Key
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key:       key value searched for
+ *
+ * same as above, but first matching item is found.
+ * Return Value: pointer to the first item associated to key value or %NULL.
+ */
+void * 
+gsa_find_first(gsa_array_t *array, void *key)
+{
+  unsigned indx;
+  if(gsa_bsearch_indx(array,key,array->key_offs,
+                     array->cmp_fnc,GSA_FFIRST,&indx))
+    return array->items[indx];
+  else return NULL;
+}
+
+/**
+ * gsa_find_indx - Find the First Item with Key Value and Return Its Index 
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key:       key value searched for
+ * @indx:      pointer to place for index, at which new item should be inserted
+ *
+ * same as above, but additionally stores item index value.
+ * Return Value: pointer to the first item associated to key value or %NULL.
+ */
+void * 
+gsa_find_indx(gsa_array_t *array, void *key, int *indx)
+{
+  if(gsa_bsearch_indx(array,key,array->key_offs,
+                     array->cmp_fnc,GSA_FFIRST,indx))
+    return array->items[*indx];
+  else return NULL;
+}
+
+/**
+ * gsa_insert_at - Insert Existing Item to the Specified Array Index 
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @item:      pointer to inserted Item
+ * @where:     at which index should be @item inserted
+ *
+ * Return Value: positive or zero value informs about success
+ */
+int
+gsa_insert_at(gsa_array_t *array, void *item, unsigned where)
+{
+  unsigned acnt=array->alloc_count;
+  unsigned cnt=array->count;
+  void **items, **p;
+  if(where>cnt) where=cnt;
+  if((cnt+1>=acnt)||!array->items)
+  {
+    acnt+=GSA_ALLOC_STEP;
+    if(!array->items)
+      items=malloc(acnt*sizeof(void*));
+     else
+      items=realloc(array->items,acnt*sizeof(void*));
+    if(!items) return -1;
+    array->alloc_count=acnt;
+    array->items=items;
+  }
+  else items=array->items;
+  p=items+where;
+  memmove(p+1,p,(char*)(items+cnt)-(char*)p);
+  array->count=cnt+1;
+  *p=item;
+  return 0;
+}
+
+/**
+ * gsa_insert - Insert Existing into Ordered Item Array
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @item:      pointer to inserted Item
+ * @mode:      if mode is %GSA_FAFTER, multiple items with same key can
+ *             be stored into array, else strict ordering is required
+ *
+ * Return Value: positive or zero value informs about success
+ */
+int
+gsa_insert(gsa_array_t *array, void *item, int mode)
+{
+  unsigned indx;
+  int res;
+  res=gsa_bsearch_indx(array,(char*)item+array->key_offs,
+               array->key_offs,array->cmp_fnc,mode,&indx);
+  if(res){
+    if(!mode) return -1;
+  }
+  if(gsa_insert_at(array,item,indx)<0)
+    return -1;
+  return res;
+}
+
+/**
+ * gsa_delete_at - Delete Item from the Specified Array Index 
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @indx:      index of deleted item
+ *
+ * Return Value: positive or zero value informs about success
+ */
+int
+gsa_delete_at(gsa_array_t *array, unsigned indx)
+{
+  unsigned acnt=array->alloc_count;
+  unsigned cnt=array->count;
+  void **items=array->items;
+  void **p;
+  if(indx>=cnt) return -1;
+  p=items+indx;
+  array->count=--cnt;
+  memmove(p,p+1,(items+cnt-p)*sizeof(void *));
+  if(acnt-cnt>GSA_DEALLOC_STEP+GSA_ALLOC_STEP)
+  {
+    acnt-=GSA_DEALLOC_STEP;
+    items=realloc(array->items,acnt*sizeof(void*));
+    if(items){
+      array->alloc_count=acnt;
+      array->items=items;
+    }
+  }
+  return 0;
+}
+
+/**
+ * gsa_delete - Delete Item from the Array
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @item:      pointer to deleted Item
+ *
+ * Return Value: positive or zero value informs about success
+ */
+int
+gsa_delete(gsa_array_t *array, void *item)
+{
+  unsigned indx;
+  int key_offs=array->key_offs;
+  gsa_cmp_fnc_t *cmp_fnc=array->cmp_fnc;
+  if(!gsa_bsearch_indx(array,(char*)item+key_offs,
+       key_offs,cmp_fnc,GSA_FFIRST,&indx))
+    return -1;
+
+  while(array->items[indx]!=item){
+    if(++indx>=array->count) return -1;
+    if(cmp_fnc){
+      if(cmp_fnc((char*)(array->items[indx])+key_offs,
+               (char*)item+key_offs))
+        return -1;
+    }
+  }
+  return gsa_delete_at(array,indx);
+}
+
+/**
+ * gsa_resort_buble - Sort Again Array If Sorting Criteria Are Changed
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key_offs:  offset to the order controlling field obtained by %UL_OFFSETOF
+ * @cmp_fnc:   function defining order of items by comparing fields
+ *
+ * Return Value: non-zero value informs, that resorting changed order
+ */
+int
+gsa_resort_buble(gsa_array_t *array, int key_offs,
+              gsa_cmp_fnc_t *cmp_fnc)
+{
+  char **a, **b, **p;
+  char *k1, *k2;
+  int m, m1;
+  if(array->count<2) return 0;
+  a=(char**)array->items; m=0;
+  b=(char**)&array->items[array->count-1];
+  do{
+    /* upward run */
+    p=a; m1=0;
+    k1=*p+key_offs;
+    do{
+      k2=*(p+1)+key_offs;
+      if(cmp_fnc(k1,k2)>0) {
+        k2=*p;
+        *p=*(p+1);
+        *(p+1)=k2;
+        m1=1;
+      } else k1=k2;
+    } while(++p!=b);
+    m|=m1;
+    if((a==--b)||!m1) return m;
+    /* downward run */
+    p=b; m1=0;
+    k1=*p+key_offs;
+    do{
+      k2=*(p-1)+key_offs;
+      if(cmp_fnc(k1,k2)<0) {
+        k2=*p;
+        *p=*(p-1);
+        *(p-1)=k2;
+        m1=1;
+      } else k1=k2;
+    } while(--p!=a);
+    m|=m1;
+    if((++a==b)||!m1) return m;
+  }while(1);
+}
+
+/**
+ * gsa_setsort - Change Array Sorting Criterion
+ * @array:     pointer to the array structure declared through %GSA_ARRAY_FOR
+ * @key_offs:  new value of offset to the order controlling field 
+ * @cmp_fnc:   new function defining order of items by comparing fields at
+ *              offset @key_offs
+ *
+ * Return Value: non-zero value informs, that resorting changed order
+ */
+int
+gsa_setsort(gsa_array_t *array, int key_offs,
+              gsa_cmp_fnc_t *cmp_fnc)
+{
+  if(key_offs>=0) array->key_offs=key_offs;
+  if(cmp_fnc!=NULL) array->cmp_fnc=cmp_fnc;
+  return gsa_resort_buble(array,array->key_offs,array->cmp_fnc);
+}
+
+int gsa_cmp_int(const void *a, const void *b)
+{
+  return *(int*)a-*(int*)b;
+}
+
+int gsa_cmp_ulong(const void *a, const void *b)
+{
+  return *(unsigned long*)a-*(unsigned long*)b;
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_gsa.h b/ulan/host/libs4c/ulut/ul_gsa.h
new file mode 100644 (file)
index 0000000..0573616
--- /dev/null
@@ -0,0 +1,412 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gsa.h     - generic sorted arrays
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GSA_H
+#define _UL_GSA_H
+
+#include "ul_utdefs.h"
+#include "ul_itbase.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define GSA_FANY 0
+#define GSA_FFIRST 1
+#define GSA_FAFTER 2
+
+/* function to compare fields of two array items */
+typedef int gsa_cmp_fnc_t(const void *a, const void *b);
+
+/* compare two integer fields */
+int gsa_cmp_int(const void *a, const void *b);
+
+/* compare two unsigned long fields */
+int gsa_cmp_ulong(const void *a, const void *b);
+
+/* define structure representing head of array */
+#define GSA_ARRAY_FOR(_type) \
+  struct { \
+    _type **items; \
+    unsigned count; \
+    unsigned alloc_count; \
+    int key_offs; \
+    gsa_cmp_fnc_t *cmp_fnc; \
+  }
+
+/* array type for functions independent on stored type */
+typedef GSA_ARRAY_FOR(void) gsa_array_t;
+
+/* initialize array head structure */
+void
+gsa_struct_init(gsa_array_t *array, int key_offs,
+               gsa_cmp_fnc_t *cmp_fnc);
+
+/* delete all pointers from array */
+void 
+gsa_delete_all(gsa_array_t *array);
+
+/* Core binary search routine for GSA arrays
+   searches in "array" for index "indx" of item
+   with value of item field at offset "key_offs" 
+   equal to "*key". Values are compared by function
+   "*cmp_fnc".
+   Integer "mode" modifies search algorithm
+     0 .. finds index of any item with field value "*key"
+     1 .. finds index of first item with "*key"
+     2 .. index points after last item with "*key" value 
+          reworded - index points at first item with higher 
+          value of field or after last item
+   Return of nonzerro value indicates match found.
+ */
+int 
+gsa_bsearch_indx(gsa_array_t *array, void *key, int key_offs,
+           gsa_cmp_fnc_t *cmp_fnc, int mode, unsigned *indx);
+
+/* returns item with key field value equal to "*key" or NULL */
+void * 
+gsa_find(gsa_array_t *array, void *key);
+
+/* same as above, but first matching item is found */
+void * 
+gsa_find_first(gsa_array_t *array, void *key);
+
+/* find index "indx" of the first matching item */
+void * 
+gsa_find_indx(gsa_array_t *array, void *key, int *indx);
+
+/* insert new item at index "where" */
+int
+gsa_insert_at(gsa_array_t *array, void *item, unsigned where);
+
+/* insert new item at the right index, 
+   "mode" has same meaning as in "gsa_bsearch_indx"
+   if mode==0 then strict sorting is required
+   and violation result in ignore of new item
+   and return value <0
+ */
+int
+gsa_insert(gsa_array_t *array, void *item, int mode);
+
+/* delete item at index */
+int
+gsa_delete_at(gsa_array_t *array, unsigned indx);
+
+/* delete item from array */
+int
+gsa_delete(gsa_array_t *array, void *item);
+
+/* set new sorting field and function
+   returns 0 if no change needed */
+int
+gsa_setsort(gsa_array_t *array, int key_offs,
+              gsa_cmp_fnc_t *cmp_fnc);
+
+/*===========================================================*/
+/* Macrodefinitions to prepare custom GSA arrays with */
+
+/**
+ * struct gsa_array_field_t - Structure Representing Anchor of ustom GSA Array
+ * @items:     pointer to array of pointers to individual items
+ * @count:     number of items in the sorted array
+ * @alloc_count: allocated pointer array capacity
+ */
+
+typedef struct gsa_array_field_t{
+  void **items;
+  unsigned count;
+  unsigned alloc_count;
+} gsa_array_field_t;
+
+typedef struct gsa_static_array_field_t{
+  void * const *items;
+  unsigned count;
+} gsa_static_array_field_t;
+
+void gsa_cust_init_array_field(gsa_array_field_t *array);
+int gsa_cust_insert_at(gsa_array_field_t *array, void *item, unsigned where);
+int gsa_cust_delete_at(gsa_array_field_t *array, unsigned indx);
+void gsa_cust_delete_all(gsa_array_field_t *array);
+
+
+/* User must provide his/her own compare routine with 
+    int cust_cmp_fnc(cust_key_t *a, cust_key_t *b) */
+
+/*** Base declaration of custom GSA array  ***/
+#define GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+static inline cust_item_t * \
+cust_prefix##_indx2item(const cust_array_t *array, unsigned indx) \
+{\
+  if(indx>=array->cust_array_field.count) return NULL;\
+  return (cust_item_t*)array->cust_array_field.items[indx];\
+}\
+\
+static inline cust_key_t *\
+cust_prefix##_indx2key(const cust_array_t *array, unsigned indx)\
+  { return &(cust_prefix##_indx2item(array, indx)->cust_item_key);}\
+\
+int cust_prefix##_bsearch_indx(const cust_array_t *array, const cust_key_t *key, int mode, unsigned *indxp);\
+\
+static inline  cust_item_t *\
+cust_prefix##_at(const cust_array_t *array, unsigned indx)\
+{\
+  return cust_prefix##_indx2item(array, indx);\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_find(const cust_array_t *array, cust_key_t *key)\
+{\
+  unsigned indx;\
+  if(!cust_prefix##_bsearch_indx(array, key, 0, &indx)) return NULL;\
+  return cust_prefix##_indx2item(array, indx);\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_find_first(const cust_array_t *array, cust_key_t *key)\
+{\
+  unsigned indx;\
+  if(!cust_prefix##_bsearch_indx(array, key, GSA_FFIRST, &indx)) return NULL;\
+  return cust_prefix##_indx2item(array, indx);\
+}\
+\
+static inline unsigned \
+cust_prefix##_find_first_indx(const cust_array_t *array, cust_key_t *key)\
+{\
+  unsigned indx;\
+  if(!cust_prefix##_bsearch_indx(array, key, GSA_FFIRST, &indx)) return -1;\
+  return indx;\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_find_after(const cust_array_t *array, cust_key_t *key)\
+{\
+  unsigned indx;\
+  if(!cust_prefix##_bsearch_indx(array, key, GSA_FAFTER, &indx)) return NULL;\
+  return cust_prefix##_indx2item(array, indx);\
+}\
+\
+static inline unsigned \
+cust_prefix##_find_after_indx(const cust_array_t *array, cust_key_t *key)\
+{\
+  unsigned indx;\
+  cust_prefix##_bsearch_indx(array, key, GSA_FAFTER, &indx);\
+  return indx;\
+}\
+\
+static inline int \
+cust_prefix##_is_empty(const cust_array_t *array)\
+{\
+  return !array->cust_array_field.count;\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_first(const cust_array_t *array)\
+{\
+  return cust_prefix##_indx2item(array, 0);\
+}\
+\
+static inline unsigned \
+cust_prefix##_first_indx(const cust_array_t *array)\
+{\
+  return 0;\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_last(const cust_array_t *array)\
+{\
+  return cust_prefix##_indx2item(array, array->cust_array_field.count-1);\
+}\
+\
+static inline unsigned \
+cust_prefix##_last_indx(const cust_array_t *array)\
+{\
+  return array->cust_array_field.count-1;\
+}
+
+/*** Iterators for GSA arrays ***/
+#define GSA_IT_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t) \
+\
+typedef struct {\
+  cust_array_t *container;\
+  unsigned indx;\
+} cust_prefix##_it_t;\
+\
+static inline cust_item_t *\
+cust_prefix##_it2item(const cust_prefix##_it_t *it)\
+{\
+  return cust_prefix##_indx2item(it->container,it->indx);\
+}\
+\
+static inline void \
+cust_prefix##_first_it(cust_array_t *container, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  it->indx=cust_prefix##_first_indx(container);\
+}\
+\
+static inline void \
+cust_prefix##_last_it(cust_array_t *container, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  it->indx=cust_prefix##_last_indx(container);\
+}\
+\
+static inline void \
+cust_prefix##_next_it(cust_prefix##_it_t *it)\
+{\
+  if(it->indx<=cust_prefix##_last_indx(it->container)) it->indx++;\
+  else it->indx=cust_prefix##_first_indx(it->container);\
+}\
+\
+static inline void \
+cust_prefix##_prev_it(cust_prefix##_it_t *it)\
+{\
+  if(it->indx<=cust_prefix##_last_indx(it->container)) it->indx--;\
+  else it->indx=cust_prefix##_first_indx(it->container);\
+}\
+\
+static inline int \
+cust_prefix##_is_end_it(cust_prefix##_it_t *it)\
+{\
+  if(!it->container) return 1;\
+  return it->indx>cust_prefix##_last_indx(it->container);\
+}\
+\
+static inline int \
+cust_prefix##_find_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->indx=cust_prefix##_find_first_indx(container, key))!=(unsigned)-1;\
+}\
+\
+static inline int \
+cust_prefix##_find_first_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->indx=cust_prefix##_find_first_indx(container, key))!=(unsigned)-1;\
+}\
+\
+static inline int \
+cust_prefix##_find_after_it(cust_array_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->indx=cust_prefix##_find_after_indx(container, key))!=(unsigned)-1;\
+}
+
+/* Declaration of new static custom array without support of runtime modifications */
+#define GSA_STATIC_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_IT_CUST_DEC(cust_prefix, const cust_array_t, cust_item_t, cust_key_t)
+
+/*** Declaration of dynamic custom array with  ***/
+#define GSA_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+GSA_BASE_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc) \
+\
+int cust_prefix##_insert(cust_array_t *array, cust_item_t *item);\
+int cust_prefix##_delete(cust_array_t *array, const cust_item_t *item);\
+\
+static inline void \
+cust_prefix##_init_array_field(cust_array_t *array)\
+{\
+  gsa_cust_init_array_field(&array->cust_array_field);\
+}\
+\
+static inline int \
+cust_prefix##_insert_at(cust_array_t *array, cust_item_t *item, unsigned indx)\
+{\
+  return gsa_cust_insert_at(&array->cust_array_field, item, indx);\
+}\
+\
+static inline int \
+cust_prefix##_delete_at(cust_array_t *array, unsigned indx)\
+{\
+  return gsa_cust_delete_at(&array->cust_array_field, indx);\
+}\
+\
+static inline void \
+cust_prefix##_delete_all(cust_array_t *array)\
+{\
+  gsa_cust_delete_all(&array->cust_array_field);\
+}\
+\
+static inline cust_item_t *\
+cust_prefix##_cut_last(cust_array_t *array)\
+{\
+  if(cust_prefix##_is_empty(array)) return NULL;\
+  return (cust_item_t *)array->cust_array_field.items\
+                          [--array->cust_array_field.count];\
+}\
+/*** Iterators ***/\
+GSA_IT_CUST_DEC(cust_prefix, cust_array_t, cust_item_t, cust_key_t) \
+\
+static inline void \
+cust_prefix##_delete_it(cust_prefix##_it_t *it)\
+{\
+  cust_prefix##_delete_at(it->container,it->indx);\
+}\
+
+
+/* The next implementation of foreaach is elegant, but can not
+   be used in C99 non-conformant C compiler */
+#ifdef WITH_C99
+
+#define gsa_cust_for_each(cust_prefix, array, ptr) \
+       for(unsigned __fe_indx=cust_prefix##_first_indx(array);\
+           (ptr=cust_prefix##_indx2item(array,__fe_indx));\
+           __fe_indx++)
+
+#define gsa_cust_for_each_rev(cust_prefix, array, ptr) \
+       for(unsigned __fe_indx=cust_prefix##_last_indx(array);\
+           (ptr=cust_prefix##_indx2item(array,__fe_indx));\
+           __fe_indx--)
+
+#define gsa_cust_for_each_from(cust_prefix, array, key, ptr) \
+       for(unsigned __fe_indx=cust_prefix##_find_first_indx(array, key); \
+           (ptr=cust_prefix##_indx2item(array,__fe_indx)); \
+           __fe_indx++)
+
+#define gsa_cust_for_each_after(cust_prefix, array, key, ptr) \
+       for(unsigned __fe_indx=cust_prefix##_find_after_indx(array, key); \
+           (ptr=cust_prefix##_indx2item(array,__fe_indx)); \
+           __fe_indx++)
+
+#endif /*WITH_C99*/
+
+#define gsa_cust_for_each_cut(cust_prefix, array, ptr) \
+       for(;(ptr=cust_prefix##_cut_last(array));)
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GSA_H */
diff --git a/ulan/host/libs4c/ulut/ul_gsachk.c b/ulan/host/libs4c/ulut/ul_gsachk.c
new file mode 100644 (file)
index 0000000..3a16c3d
--- /dev/null
@@ -0,0 +1,257 @@
+#include <string.h>
+
+#ifndef __RTL__
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#else /*__RTL__*/
+
+#include <rtl.h>
+#include <signal.h>
+#include <pthread.h>
+#define printf rtl_printf
+
+#endif /*__RTL__*/
+
+#include "ul_utmalloc.h"
+#include "ul_gsa.h"
+
+/*===========================================================*/
+/* custom array definition */
+
+#include "ul_gsacust.h"
+
+typedef struct cust2_item {
+  int my_val;
+  /*gavl_node_t my_node;*/
+  int more_data;
+} cust2_item_t;
+
+typedef struct cust2_root {
+  gsa_array_field_t my_root;
+  int my_info;
+  int my_first_val;
+  int my_last_val;
+} cust2_root_t;
+
+typedef int cust2_key_t;
+
+/* Custom array declarations */
+
+GSA_CUST_DEC(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_val, cust2_cmp_fnc)
+
+inline int
+cust2_cmp_fnc(const cust2_key_t *a, const cust2_key_t *b)
+{
+  if (*a>*b) return 1;
+  if (*a<*b) return -1;
+  return 0;
+}
+
+GSA_CUST_IMP(cust2, cust2_root_t, cust2_item_t, cust2_key_t,
+       my_root, my_val, cust2_cmp_fnc, 0)
+
+cust2_root_t cust2_root;
+
+
+#ifdef WITH_C99
+
+void test_cust_array(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item, *item2;
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom array cust2 for_each:\n");
+  gsa_cust_for_each(cust2, &cust2_root, item)
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  k=90;
+  printf("Custom array cust2 for_each_from %ld:\n", (long)k);
+  gsa_cust_for_each_from(cust2, &cust2_root, &k, item){
+    printf("After %d : ",item->my_val);
+    gsa_cust_for_each_after(cust2, &cust2_root, &item->my_val, item2)
+      printf(" %d",item2->my_val);
+    printf("\n");
+  }
+
+  printf("Custom array cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom array cust2 for_each_rev:\n");
+  gsa_cust_for_each_rev(cust2,&cust2_root,item)
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  printf("Custom array cust2 for_each_cut:\n");
+  gsa_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+#endif /*WITH_C99*/
+
+void test_cust_array_it(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item;
+  cust2_it_t it1, it2;
+  
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom array cust2 for each with iterator:\n");
+  for(cust2_first_it(&cust2_root, &it1);
+      (item=cust2_it2item(&it1));cust2_next_it(&it1))
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  k=90;
+  printf("Custom array cust2 for_each_from %ld:\n", (long)k);
+  for(cust2_find_first_it(&cust2_root, &k, &it1);
+      (item=cust2_it2item(&it1));cust2_next_it(&it1)){
+    printf("After %d : ",item->my_val);
+    for(cust2_find_after_it(&cust2_root, &item->my_val, &it2);
+        (item=cust2_it2item(&it2));cust2_next_it(&it2))
+      printf(" %d",item->my_val);
+    printf("\n");
+  }
+
+  printf("Custom array cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom array cust2 for_each_rev:\n");
+  for(cust2_last_it(&cust2_root, &it1);
+      (item=cust2_it2item(&it1));cust2_prev_it(&it1))
+    printf("%d ",item->my_val);
+  printf("\n");
+
+  printf("Custom array cust2 for_each_cut:\n");
+  gsa_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+void test_cust_array_macro_it(void)
+{
+  int i;
+  cust2_key_t k;
+  cust2_item_t *item;
+  cust2_it_t it1, it2;
+  
+  for(i=1;i<=100;i++){
+    item=malloc(sizeof(cust2_item_t));
+    item->my_val=i;
+    if(cust2_insert(&cust2_root,item)<0)
+      printf("cust2_insert error\n");
+  }
+  printf("Custom array cust2 for each with iterator:\n");
+  ul_for_each_it(cust2, &cust2_root, it1){
+    item=cust2_it2item(&it1);
+    printf("%d ",item->my_val);
+  }
+  printf("\n");
+
+  k=90;
+  printf("Custom array cust2 for_each_from %ld:\n", (long)k);
+  ul_for_each_from_it(cust2, &cust2_root, &k, it1){
+    item=cust2_it2item(&it1);
+    printf("After %d : ",item->my_val);
+    ul_for_each_after_it(cust2, &cust2_root, &item->my_val, it2){
+      item=cust2_it2item(&it2);
+      printf(" %d",item->my_val);
+    }
+    printf("\n");
+  }
+
+  printf("Custom array cust2 delete 1-90:\n");
+  for(i=1;i<=100-10;i++){
+    item=cust2_find(&cust2_root,&i);
+    if(cust2_delete(&cust2_root,item)<0)
+      printf("cust2_delete error\n");
+    free(item);
+  }
+
+  printf("Custom array cust2 for_each_rev:\n");
+  ul_for_each_rev_it(cust2, &cust2_root, it1){
+    item=cust2_it2item(&it1);
+    printf("%d ",item->my_val);
+  }
+  printf("\n");
+
+  printf("Custom array cust2 for_each_cut:\n");
+  gsa_cust_for_each_cut(cust2,&cust2_root,item){
+    printf("%d ",item->my_val);
+    free(item);
+  }
+  printf("\n");
+}
+
+/*===========================================================*/
+
+int main(int argc, char *argv[])
+{
+ #ifdef WITH_C99
+  printf("\nCheck of for_each for C99 compliant compiler\n");
+  test_cust_array();
+ #endif /*WITH_C99*/
+  printf("\nCheck of iterators\n");
+  test_cust_array_it();
+  printf("\nCheck of for_each iterators\n");
+  test_cust_array_macro_it();
+  return 0;
+}
+
+/*===========================================================*/
+#ifdef __RTL__
+
+pthread_t t1;
+
+void * t1_routine(void *arg)
+{
+  main(0, NULL);
+
+  while (1) {
+    pthread_wait_np ();
+
+  }
+  return 0;
+}
+
+
+int init_module(void) {
+        return pthread_create (&t1, NULL, t1_routine, 0);
+
+}
+
+void cleanup_module(void) {
+        pthread_delete_np (t1);
+}
+
+#endif /*__RTL__*/
diff --git a/ulan/host/libs4c/ulut/ul_gsacust.c b/ulan/host/libs4c/ulut/ul_gsacust.c
new file mode 100644 (file)
index 0000000..2a18a5c
--- /dev/null
@@ -0,0 +1,112 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gsacust.c - generic sorted arrays
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_gsa.h"
+
+#define GSA_ALLOC_STEP 8
+#define GSA_DEALLOC_STEP 32
+
+void
+gsa_cust_init_array_field(gsa_array_field_t *array)
+{
+  array->count=0;
+  array->alloc_count=0;
+  array->items=NULL;
+}
+
+
+int
+gsa_cust_insert_at(gsa_array_field_t *array, void *item, unsigned where)
+{
+  unsigned acnt=array->alloc_count;
+  unsigned cnt=array->count;
+  void **items, **p;
+  if(where>cnt) where=cnt;
+  if((cnt+1>=acnt)||!array->items)
+  {
+    if(!array->items || !acnt){
+      acnt=cnt+GSA_ALLOC_STEP;
+      items=malloc(acnt*sizeof(void*));
+      if(array->items && items)
+        memcpy(items,array->items,cnt*sizeof(void*));
+    }else{
+      if(acnt/4>GSA_ALLOC_STEP)
+       acnt+=acnt/4;
+      else
+       acnt+=GSA_ALLOC_STEP;
+      items=realloc(array->items,acnt*sizeof(void*));
+    }
+    if(!items) return -1;
+    array->alloc_count=acnt;
+    array->items=items;
+  }
+  else items=array->items;
+  p=items+where;
+  memmove(p+1,p,(char*)(items+cnt)-(char*)p);
+  array->count=cnt+1;
+  *p=item;
+  return 0;
+}
+
+int
+gsa_cust_delete_at(gsa_array_field_t *array, unsigned indx)
+{
+  unsigned acnt=array->alloc_count;
+  unsigned cnt=array->count;
+  void **items=array->items;
+  void **p;
+  if(indx>=cnt) return -1;
+  if(cnt && !acnt){
+    p=malloc(cnt*sizeof(void*));
+    if(p){
+      memcpy(p,items,cnt*sizeof(void*));
+      array->alloc_count=acnt=cnt;
+      array->items=items=p;
+    }
+  }
+  p=items+indx;
+  array->count=--cnt;
+  memmove(p,p+1,(items+cnt-p)*sizeof(void *));
+  if(acnt-cnt>GSA_DEALLOC_STEP+GSA_ALLOC_STEP)
+  {
+    acnt-=GSA_DEALLOC_STEP;
+    items=realloc(array->items,acnt*sizeof(void*));
+    if(items){
+      array->alloc_count=acnt;
+      array->items=items;
+    }
+  }
+  return 0;
+}
+
+void
+gsa_cust_delete_all(gsa_array_field_t *array)
+{
+  if(array->items && array->alloc_count)
+    free(array->items);
+  array->items=NULL;
+  array->count=0;
+  array->alloc_count=0;
+}
diff --git a/ulan/host/libs4c/ulut/ul_gsacust.h b/ulan/host/libs4c/ulut/ul_gsacust.h
new file mode 100644 (file)
index 0000000..655735f
--- /dev/null
@@ -0,0 +1,116 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_gsacust.h - generic sorted arrays
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_GSACUST_H
+#define _UL_GSACUST_H
+
+#include "ul_gsa.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Static version of custom GSA arrays. It does not support runtime modifications. */
+#define GSA_STATIC_CUST_IMP(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc, cust_ins_fl) \
+\
+int \
+cust_prefix##_bsearch_indx(const cust_array_t *array, const cust_key_t *key, \
+                          int mode, unsigned *indx) \
+{\
+  unsigned a, b, c;\
+  int r;\
+  if(!array->cust_array_field.items || !array->cust_array_field.count){\
+    *indx=0;\
+    return 0;\
+  }\
+  a=0;\
+  b=array->cust_array_field.count;\
+  while(1){\
+    c=(a+b)/2;\
+    r=cust_cmp_fnc(cust_prefix##_indx2key(array, c), key);\
+    if(!r) if(!(mode&GSA_FAFTER)) break;\
+    if(r<=0)\
+      a=c+1;\
+     else\
+      b=c;\
+    if(a==b){\
+      *indx=a;\
+      return mode&GSA_FAFTER;\
+    }\
+  }\
+  if(mode&GSA_FFIRST){\
+    /* equal items can be in range a to b-1 */\
+    /* routine looks for first one */\
+    b=c;\
+    do{\
+      c=(a+b)/2;\
+      r=cust_cmp_fnc(cust_prefix##_indx2key(array, c), key);\
+      if(r)\
+       a=c+1;\
+       else\
+       b=c;\
+    }while(a!=b);\
+    c=b;\
+  }\
+  *indx=c;\
+  return 1;\
+}
+
+
+/* Dynamic version with full support of insert and delete functions. */
+#define GSA_CUST_IMP(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+               cust_array_field, cust_item_key, cust_cmp_fnc, cust_ins_fl) \
+\
+GSA_STATIC_CUST_IMP(cust_prefix, cust_array_t, cust_item_t, cust_key_t,\
+       cust_array_field, cust_item_key, cust_cmp_fnc, cust_ins_fl) \
+\
+int \
+cust_prefix##_insert(cust_array_t *array, cust_item_t *item)\
+{\
+  unsigned indx;\
+  if(cust_prefix##_bsearch_indx(array, &item->cust_item_key, cust_ins_fl, &indx))\
+    if(!cust_ins_fl) return -1;\
+  return cust_prefix##_insert_at(array,item,indx);\
+}\
+\
+int \
+cust_prefix##_delete(cust_array_t *array, const cust_item_t *item)\
+{\
+  unsigned indx;\
+  if(!cust_prefix##_bsearch_indx(array, &item->cust_item_key, GSA_FFIRST,&indx))\
+    return -1;\
+  while(cust_prefix##_indx2item(array, indx)!=item){\
+    if(++indx>=array->cust_array_field.count) return -1;\
+    if(cust_cmp_fnc(cust_prefix##_indx2key(array, indx),\
+                    &item->cust_item_key))  return -1;\
+  }\
+  return cust_prefix##_delete_at(array,indx);\
+}
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_GSACUST_H */
diff --git a/ulan/host/libs4c/ulut/ul_hptree.c b/ulan/host/libs4c/ulut/ul_hptree.c
new file mode 100644 (file)
index 0000000..fa62926
--- /dev/null
@@ -0,0 +1,60 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_hptree.c  - heap tree implementation
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_utmalloc.h"
+#include "ul_hptree.h"
+
+int ul_hpt_init_root_hpt(ul_hpt_root_field_t *hpt_root, int acapacity)
+{
+  ul_hpt_node_t **ha;
+  hpt_root->count=0;
+  hpt_root->capacity=acapacity;
+  ha=malloc(hpt_root->capacity*sizeof(void *));
+  if(!ha){
+    hpt_root->heaparr=NULL;
+    hpt_root->capacity=0;
+    return -1;
+  }
+  hpt_root->heaparr=ha-1;
+  return 0;
+}
+
+int ul_hpt_enlarge_hpt(ul_hpt_root_field_t *hpt_root)
+{
+  ul_hpt_node_t **ha;
+  long acap;
+  acap=hpt_root->capacity;
+  acap=((acap+7)&(~7))*2;
+  ha=realloc(hpt_root->heaparr+1,acap*sizeof(void *));
+  if(!ha) return -1;  
+  hpt_root->capacity=acap;
+  hpt_root->heaparr=ha-1;
+  return 0;
+}
+
+void ul_hpt_done_root_hpt(ul_hpt_root_field_t *hpt_root)
+{
+  if(hpt_root->heaparr)
+    free(hpt_root->heaparr+1);
+}
diff --git a/ulan/host/libs4c/ulut/ul_hptree.h b/ulan/host/libs4c/ulut/ul_hptree.h
new file mode 100644 (file)
index 0000000..5f9db59
--- /dev/null
@@ -0,0 +1,206 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_hptree.h  - heap tree implementation
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_HPTREE_H
+#define _UL_HPTREE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ul_hpt_node {
+  long index;
+} ul_hpt_node_t;
+
+typedef struct{
+  ul_hpt_node_t **heaparr;
+  long count;
+  long capacity;
+} ul_hpt_root_field_t;
+
+#define ul_hpt_first_i     (1)
+#define ul_hpt_parent_i(i) ((i)/2)
+#define ul_hpt_left_i(i)   ((i)*2)
+#define ul_hpt_right_i(i)  ((i)*2+1)
+
+/* Declaration of heap tree */
+#define UL_HPTREE_DEC(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_field, cust_item_node, cust_item_key, cust_cmp_fnc) \
+\
+static inline cust_item_t * \
+cust_prefix##_node2item(const cust_root_t *root, const ul_hpt_node_t *node) \
+  {return (cust_item_t*)((char*)node-(long)&((cust_item_t*)0)->cust_item_node);}\
+\
+static inline cust_key_t *\
+cust_prefix##_node2key(const cust_root_t *root, ul_hpt_node_t *node)\
+  { return &(cust_prefix##_node2item(root, node)->cust_item_key);}\
+\
+int cust_prefix##_init_root_field(cust_root_t *root);\
+\
+static inline void \
+cust_prefix##_init_detached(cust_item_t *item){;}\
+\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item);\
+cust_item_t *cust_prefix##_cut_first(cust_root_t *root);\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item);\
+\
+static inline cust_item_t *\
+cust_prefix##_first(const cust_root_t *root)\
+{\
+  ul_hpt_node_t *n;\
+  if(!root->cust_root_field.count)\
+    return NULL;\
+  n=root->cust_root_field.heaparr[ul_hpt_first_i];\
+  return cust_prefix##_node2item(root,n);\
+}\
+static inline int \
+cust_prefix##_is_empty(const cust_root_t *root)\
+{\
+  return !root->cust_root_field.count;\
+}
+
+#define UL_HPTREE_IMP(cust_prefix, cust_root_t, cust_item_t, cust_key_t,\
+               cust_root_field, cust_item_node, cust_item_key, cust_cmp_fnc,\
+               cust_ins_fl, cust_first_change, cust_empty_state) \
+\
+int cust_prefix##_init_root_field(cust_root_t *root)\
+  { return ul_hpt_init_root_hpt(&root->cust_root_field, 64);}\
+\
+static inline int \
+cust_prefix##_cmp_hpt_i(cust_root_t *root, ul_hpt_node_t *p, ul_hpt_node_t *r)\
+{\
+  return cust_cmp_fnc(cust_prefix##_node2key(root,p),\
+                      cust_prefix##_node2key(root,r));\
+}\
+\
+int cust_prefix##_insert(cust_root_t *root, cust_item_t *item)\
+{\
+  long i, j; \
+  ul_hpt_node_t *p, *r;\
+  i=root->cust_root_field.count+1;\
+  if(i>root->cust_root_field.capacity)\
+    if(ul_hpt_enlarge_hpt(&root->cust_root_field)<0)\
+      return -1;\
+  root->cust_root_field.count=i;\
+  p=&item->cust_item_node;\
+  while(i>ul_hpt_first_i){\
+    j=ul_hpt_parent_i(i);\
+    r=root->cust_root_field.heaparr[j];\
+    if(cust_prefix##_cmp_hpt_i(root,p,r)>=0)\
+      break;\
+    r->index=i;\
+    root->cust_root_field.heaparr[i]=r;\
+    i=j;\
+  }\
+  p->index=i;\
+  root->cust_root_field.heaparr[i]=p;\
+  if(i<=ul_hpt_first_i){\
+    cust_first_change;\
+  }\
+  return 1;\
+}\
+\
+cust_item_t *cust_prefix##_cut_first(cust_root_t *root)\
+{\
+  long i, j;\
+  ul_hpt_node_t *n, *p, *r;\
+  if(!(i=root->cust_root_field.count))\
+    return NULL;\
+  \
+  n=root->cust_root_field.heaparr[ul_hpt_first_i];\
+  if((root->cust_root_field.count=i-1)){\
+    p=root->cust_root_field.heaparr[i];\
+    i=ul_hpt_first_i;\
+    while((j=ul_hpt_left_i(i))<=root->cust_root_field.count){\
+      r=root->cust_root_field.heaparr[j];\
+      if(j!=root->cust_root_field.count)\
+        if(cust_prefix##_cmp_hpt_i(root,r,root->cust_root_field.heaparr[j+1])>0)\
+          {j++; r=root->cust_root_field.heaparr[j];}\
+      if(cust_prefix##_cmp_hpt_i(root,p,r)<=0)\
+        break;\
+      r->index=i;\
+      root->cust_root_field.heaparr[i]=r;\
+      i=j;\
+    }\
+    p->index=i;\
+    root->cust_root_field.heaparr[i]=p;\
+    cust_first_change;\
+  }else{\
+    cust_empty_state;\
+  }\
+  return cust_prefix##_node2item(root,n);\
+}\
+\
+int cust_prefix##_delete(cust_root_t *root, cust_item_t *item)\
+{\
+  long i, j;\
+  ul_hpt_node_t *p, *r;\
+  p=&item->cust_item_node;\
+  i=p->index;\
+  if(i>root->cust_root_field.count) return -1;\
+  if(root->cust_root_field.heaparr[i]!=p) return -1;\
+  if(i==ul_hpt_first_i){\
+    cust_prefix##_cut_first(root);\
+    return 1;\
+  }\
+  if(i==(j=root->cust_root_field.count--))\
+    return 0;\
+  p=root->cust_root_field.heaparr[j];\
+  j=ul_hpt_parent_i(i);\
+  r=root->cust_root_field.heaparr[j];\
+  if(cust_prefix##_cmp_hpt_i(root,p,r)<0){\
+    do{\
+      r->index=i;\
+      root->cust_root_field.heaparr[i]=r;\
+      i=j;\
+      j=ul_hpt_parent_i(i);\
+      r=root->cust_root_field.heaparr[j];\
+      if(cust_prefix##_cmp_hpt_i(root,p,r)>=0)\
+       break;\
+    }while(1);\
+  }else{\
+    while((j=ul_hpt_left_i(i))<=root->cust_root_field.count){\
+      r=root->cust_root_field.heaparr[j];\
+      if(j!=root->cust_root_field.count)\
+        if(cust_prefix##_cmp_hpt_i(root,r,root->cust_root_field.heaparr[j+1])>0)\
+          {j++; r=root->cust_root_field.heaparr[j];}\
+      if(cust_prefix##_cmp_hpt_i(root,p,r)<=0)\
+        break;\
+      r->index=i;\
+      root->cust_root_field.heaparr[i]=r;\
+      i=j;\
+    }\
+  }\
+  p->index=i;\
+  root->cust_root_field.heaparr[i]=p;\
+  return 1;\
+}
+
+int ul_hpt_init_root_hpt(ul_hpt_root_field_t *hpt_root, int acapacity);
+int ul_hpt_enlarge_hpt(ul_hpt_root_field_t *hpt_root);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_HPTREE_H */
diff --git a/ulan/host/libs4c/ulut/ul_htimbase.c b/ulan/host/libs4c/ulut/ul_htimbase.c
new file mode 100644 (file)
index 0000000..06f9c72
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_htimbase.c        - hierarchical timer base declarations
+
+  (C) Copyright 2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+
+#define UL_HTIMER_INC_FROM_BASE
+#include "ul_htimer.h"
+
+#ifndef UL_HTIMER_WITH_HPTREE
+ #include "ul_gavl.h"
+ #include "ul_gavlflesint.h"
+#else /*UL_HTIMER_WITH_HPTREE*/
+ #include "ul_hptree.h"
+#endif /*UL_HTIMER_WITH_HPTREE*/
+
+#ifndef UL_HTIMER_WITH_HPTREE
+
+GAVL_FLES_INT_DEC(ul_htim_queue, ul_htim_queue_t, ul_htim_node_t, ul_htim_time_t,
+       timers, node, expires, ul_htimer_cmp_fnc)
+
+
+GAVL_FLES_INT_IMP(ul_htim_queue, ul_htim_queue_t, ul_htim_node_t, ul_htim_time_t,
+       timers, node, expires, ul_htimer_cmp_fnc, GAVL_FAFTER, 
+       root->first_changed=1,,root->first_changed=1)
+
+#else /*UL_HTIMER_WITH_HPTREE*/
+
+UL_HPTREE_DEC(ul_htim_queue, ul_htim_queue_t, ul_htim_node_t, ul_htim_time_t,
+       timers, node, expires, ul_htimer_cmp_fnc)
+
+
+UL_HPTREE_IMP(ul_htim_queue, ul_htim_queue_t, ul_htim_node_t, ul_htim_time_t,
+       timers, node, expires, ul_htimer_cmp_fnc, GAVL_FAFTER, 
+       root->first_changed=1,root->first_changed=1)
+
+#endif /*UL_HTIMER_WITH_HPTREE*/
diff --git a/ulan/host/libs4c/ulut/ul_htimchk.c b/ulan/host/libs4c/ulut/ul_htimchk.c
new file mode 100644 (file)
index 0000000..832ef44
--- /dev/null
@@ -0,0 +1,192 @@
+#include <string.h>
+#include <time.h>
+#include <time.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#include <sys/time.h>
+#include <malloc.h>
+#else /*_WIN32*/
+#include <malloc.h>
+#endif /*_WIN32*/
+#include "ul_htimer.h"
+
+/*===========================================================*/
+/* timing tests */
+
+void timing_test_print(struct timeval *start, struct timeval *stop, char *s)
+{
+  long sec, usec;
+  sec=stop->tv_sec-start->tv_sec;
+  usec=stop->tv_usec-start->tv_usec;
+  if(usec>=1000000) {
+    usec-=1000000;
+    sec++;
+  }
+  if(usec<0) {
+    usec+=1000000;
+    sec--;
+  }
+  printf("%s :\t%4ld.%06ld\n",s,sec,usec);
+}
+
+void timing_test(void)
+{
+  int i, r;
+  int items_cnt=100000;
+  ul_htimer_t *items;
+  ul_htimer_t *p;
+  ul_htim_time_t cmp_time;
+  
+  struct timeval time_start, time_stop;
+
+  printf("\nRunning htimer timing test for %d items\n",items_cnt);
+  
+  items=malloc(items_cnt*sizeof(ul_htimer_t));
+  if(!items){
+    printf("malloc items failed\n");
+    return;
+  }
+  
+  for(i=0;i<items_cnt;i++){
+    ul_htimer_init_detached(&items[i]);
+    items[i].function=NULL;
+    items[i].data=i;
+    if(0){
+      ul_htimer_set_expire(&items[i],(i&~1)*500);
+    }else{
+      do{
+        r=rand();
+      }while((r>0x7fffffff)||(r<0));
+      ul_htimer_set_expire(&items[i],r);
+    }
+  }
+  cmp_time=0x7fffffff;
+      
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+  //for(i=items_cnt;i-->0;){
+    if(ul_htimer_add(&ul_root_htimer, items+i)<0)
+      printf("ul_htimer_add is buggy\n");
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"htimer insert");
+  
+  r=0;
+  gettimeofday(&time_start,NULL);
+  for(i=0;i<items_cnt;i++){
+    if(!(p=ul_htimer_cut_expired(&ul_root_htimer, &cmp_time)))
+      printf("ul_htimer_cut_expired NULL\n");
+    else{
+      if(0){
+       if(ul_htimer_get_expire(p)<r)
+          printf("ul_htimer_cut_expired returns items in the bad order !!!!!\n");
+       r=ul_htimer_get_expire(p);
+       ul_htimer_set_expire(p,0);
+      }
+    }
+  }
+  gettimeofday(&time_stop,NULL);
+  timing_test_print(&time_start,&time_stop,"cut expired");
+
+  free(items);
+}
+
+/*===========================================================*/
+/* mstimer test */
+
+void test_htimer_fnc(unsigned long data)
+{
+  char s[30];
+  ul_get_log_time_str(s);
+  printf("%6ld : ms %8ld real %s\n",data,ul_mstime_last,s);
+}
+
+int mstime_test(void)
+{
+  int i;
+  
+  for(i=0;i<100;i++){
+    ul_htimer_t *timer;
+    /*allocate new timer*/
+    timer=malloc(sizeof(ul_htimer_t));
+    /*ensure, that timer is in detached state*/
+    ul_htimer_init_detached(timer);
+    timer->function=test_htimer_fnc;
+    timer->data=i;
+    ul_htimer_set_expire(timer,(i&~1)*500);
+    if(ul_htimer_add(&ul_root_htimer, timer)<0)
+      printf("ul_htimer_add is buggy\n");
+  }
+  
+  while(1){
+    ul_msdiff_t ms_sleep;
+    ul_mstime_update();
+    ul_htimer_run_expired(&ul_root_htimer,&ul_mstime_last);
+    ul_mstime_update();
+    ul_compute_mstime_next();
+    ms_sleep=ul_mstime_next-ul_mstime_last;
+    if(ms_sleep<0) ms_sleep=0;
+    /* we do not want to overflow usec field of timeout.tv_usec */
+    if(ms_sleep>(~(ul_mstime_t)0/2001)) ms_sleep=~(ul_mstime_t)0/2001;
+
+   #ifdef there_is_something_else_do
+    if(ul_inepoll(ul_net->ul_fd)>0){
+      int loopcnt=100;
+      do {
+      ul_net_do_rec_msg(ul_net);
+      } while((ul_inepoll(ul_net->ul_fd)>0)&&loopcnt--);
+    }else 
+   #endif /*there_is_something_else_do*/
+    {
+    #ifdef WITHOUT_SYS_SELECT
+     #ifdef _WIN32
+      if(ms_sleep>100) ms_sleep=100;
+      Sleep(ms_sleep);
+     #elif defined(UL_DRV_IN_LIB)
+      if(ms_sleep>100) ms_sleep=100;
+      usleep(ms_sleep*1000);
+     #endif /* UL_DRV_IN_LIB */
+    #else /* !WITHOUT_SYS_SELECT */
+      {
+       int ret;
+       struct timeval timeout;
+       fd_set set;
+
+       FD_ZERO (&set);
+       /*set ones for all other monitored file handles*/
+       /*FD_SET (ul_net->ul_fd, &set);*/
+       FD_SET (0, &set);
+       timeout.tv_sec = 0;
+       timeout.tv_usec = ms_sleep*1000;
+       while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+               &&errno==-EINTR);
+       /* printf("select %d ",ret); */
+        if(FD_ISSET(0,&set))
+        { char ch;
+          read(0,&ch,1);
+          switch(ch) {
+            case 'q' : 
+              printf("\nUser requested quit\n");
+              return 0;
+          }
+        }
+      }
+    #endif /* !WITHOUT_SYS_SELECT */
+    }
+  }
+}
+
+
+int main(int argc, char *argv[])
+{
+  ul_mstime_init();
+  ul_htimer_init_queue(&ul_root_htimer);
+
+  timing_test();
+  mstime_test();
+
+  return 0;
+}
diff --git a/ulan/host/libs4c/ulut/ul_htimdefs.h b/ulan/host/libs4c/ulut/ul_htimdefs.h
new file mode 100644 (file)
index 0000000..273abec
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef _UL_HTIMDEFS_H
+#define _UL_HTIMDEFS_H
+
+#include "ul_utdefs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Select heap-tree as base structure to implement
+ * hierarchic timer - not recomended
+ */
+//#define UL_HTIMER_WITH_HPTREE
+
+/* If defined, standard timer type
+ * is built
+ */
+#define UL_HTIMER_WITH_STD_TYPE
+
+/* If defined, standard microsecond resolution 
+ * data types are selected for timer implementation
+ */
+#define UL_HTIMER_WITH_MSTIME
+
+#ifdef UL_HTIMER_WITH_MSTIME
+typedef unsigned long ul_mstime_t;
+typedef signed long ul_msdiff_t;
+
+typedef ul_mstime_t ul_htim_time_t;
+typedef ul_msdiff_t ul_htim_diff_t;
+
+static inline int
+ul_htimer_cmp_fnc(const ul_htim_time_t *a, const ul_htim_time_t *b)
+{
+  ul_htim_diff_t d=(ul_htim_diff_t)(*a-*b);
+  if (d>0) return 1;
+  if (d<0) return -1;
+  return 0;
+}
+#endif /*UL_HTIMER_WITH_MSTIME*/
+
+/*===========================================================*/
+/*  Configuration of types for standard timer (ul_htimer) */
+
+/* Additional, user defined fields for ul_htimer_t structure */
+#define UL_HTIMER_USER_FIELDS 
+
+typedef void (ul_htimer_fnc_t)(unsigned long data);
+
+/* The wrapper for ul_htimer_run_expired */
+#define UL_HTIMER_FNC_CALL(queue, timer, pact_time) \
+    do{ timer->function(timer->data); } while(0)
+
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_HTIMDEFS_H */
diff --git a/ulan/host/libs4c/ulut/ul_htimer.c b/ulan/host/libs4c/ulut/ul_htimer.c
new file mode 100644 (file)
index 0000000..4ebdf30
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_htimer.c  - hierarchical timer for basic ul_htimer_t type
+
+  (C) Copyright 2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_htimer.h"
+
+UL_HTIMER_IMP(ul_htimer, ul_htimer_queue_t, ul_htimer_t, \
+             htim_queue, htim) 
+
+void ul_htimer_run_expired(ul_htimer_queue_t *queue, ul_htim_time_t *pact_time)
+{
+  ul_htimer_t *timer;
+  
+  while((timer=ul_htimer_cut_expired(queue, pact_time))){
+    UL_HTIMER_FNC_CALL(queue, timer, pact_time);
+  }
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_htimer.h b/ulan/host/libs4c/ulut/ul_htimer.h
new file mode 100644 (file)
index 0000000..cdd9711
--- /dev/null
@@ -0,0 +1,246 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_htimer.h  - hierarchical timer basic declarations
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_HTIMER_H
+#define _UL_HTIMER_H
+
+#include "ul_htimdefs.h"
+
+#include "ul_list.h"
+#ifndef UL_HTIMER_WITH_HPTREE
+ #include "ul_gavl.h"
+#else /*UL_HTIMER_WITH_HPTREE*/
+ #include "ul_hptree.h"
+#endif /*UL_HTIMER_WITH_HPTREE*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * struct ul_htim_node - Timer queue entry base structure
+ * @node:    regular GAVL node structure for insertion into 
+ * @expires: time to trigger timer in &ul_htim_time_t type defined resolution
+ *
+ * This is basic type useful to define more complete timer types
+ */
+typedef struct ul_htim_node {
+ #ifndef UL_HTIMER_WITH_HPTREE
+  gavl_node_t    node;
+ #else /*UL_HTIMER_WITH_HPTREE*/
+  ul_hpt_node_t    node;
+ #endif /*UL_HTIMER_WITH_HPTREE*/
+  ul_htim_time_t expires;
+} ul_htim_node_t;
+
+/**
+ * struct ul_htim_queue - Timer queue head/root base structure
+ * @timers:  root of FLES GAVL tree of timer entries 
+ * @first_changed: flag, which is set after each add, detach operation
+ *                 which concerning of firsts scheduled timer
+ *
+ * This is basic type useful to define more complete timer queues types
+ */
+typedef struct ul_htim_queue {
+ #ifndef UL_HTIMER_WITH_HPTREE
+  gavl_fles_int_root_field_t timers;
+ #else /*UL_HTIMER_WITH_HPTREE*/
+  ul_hpt_root_field_t timers;
+ #endif /*UL_HTIMER_WITH_HPTREE*/
+  int first_changed;
+} ul_htim_queue_t;
+
+int ul_htim_queue_insert(ul_htim_queue_t *queue, ul_htim_node_t *htim);
+int ul_htim_queue_delete(ul_htim_queue_t *queue, ul_htim_node_t *htim);
+ul_htim_node_t *ul_htim_queue_cut_first(ul_htim_queue_t *queue);
+
+#ifndef UL_HTIMER_WITH_HPTREE
+void ul_htim_queue_init_root_field(ul_htim_queue_t *queue);
+
+static inline void 
+ul_htim_queue_init_detached(ul_htim_node_t *htim)
+#ifndef UL_HTIMER_INC_FROM_BASE
+  {htim->node.parent=NULL;}
+#else /*UL_HTIMER_INC_FROM_BASE*/
+  ;
+#endif /*UL_HTIMER_INC_FROM_BASE*/
+
+static inline int
+ul_htim_queue_inline_first(ul_htim_queue_t *queue, ul_htim_node_t **phtim)
+{
+  /*little faster equivalent to ul_htim_queue_first(&queue->cust_queue_field);*/
+  gavl_node_t *gavl_node=queue->timers.first;
+  if(!gavl_node) return 0;
+  *phtim=UL_CONTAINEROF(gavl_node,ul_htim_node_t,node);
+  return 1;
+}
+
+#else /*UL_HTIMER_WITH_HPTREE*/
+int ul_htim_queue_init_root_field(ul_htim_queue_t *queue);
+
+static inline void 
+ul_htim_queue_init_detached(ul_htim_node_t *htim)
+#ifndef UL_HTIMER_INC_FROM_BASE
+  {;}
+#else /*UL_HTIMER_INC_FROM_BASE*/
+  ;
+#endif /*UL_HTIMER_INC_FROM_BASE*/
+
+static inline int
+ul_htim_queue_inline_first(ul_htim_queue_t *queue, ul_htim_node_t **phtim)
+{
+  if(!queue->timers.count) return 0;
+  *phtim=UL_CONTAINEROF(queue->timers.heaparr[ul_hpt_first_i],ul_htim_node_t,node);
+  return *phtim!=0;
+}
+#endif /*UL_HTIMER_WITH_HPTREE*/
+
+#define UL_HTIMER_DEC(cust_prefix, cust_queue_t, cust_timer_t, \
+               cust_queue_field, cust_timer_field) \
+\
+void cust_prefix##_init_queue(cust_queue_t *queue);\
+cust_timer_t *cust_prefix##_cut_expired(cust_queue_t *queue, ul_htim_time_t *act_time);\
+int cust_prefix##_next_expire(cust_queue_t *queue, ul_htim_time_t *act_time);\
+static inline int \
+cust_prefix##_add(cust_queue_t *queue, cust_timer_t *timer){ \
+  return ul_htim_queue_insert(&queue->cust_queue_field, &timer->cust_timer_field); \
+} \
+static inline int \
+cust_prefix##_detach(cust_queue_t *queue, cust_timer_t *timer){ \
+  return ul_htim_queue_delete(&queue->cust_queue_field, &timer->cust_timer_field); \
+}\
+static inline int \
+cust_prefix##_first_changed(cust_queue_t *queue){\
+  int first_changed=queue->cust_queue_field.first_changed;\
+  queue->cust_queue_field.first_changed=0;\
+  return first_changed;\
+}\
+static inline void \
+cust_prefix##_init_detached(cust_timer_t *timer){\
+  ul_htim_queue_init_detached(&timer->cust_timer_field);\
+}\
+static inline void \
+cust_prefix##_set_expire(cust_timer_t *timer, ul_htim_time_t expire){\
+  timer->cust_timer_field.expires=expire;\
+}\
+static inline ul_htim_time_t \
+cust_prefix##_get_expire(cust_timer_t *timer){\
+  return timer->cust_timer_field.expires;\
+}
+
+#define UL_HTIMER_IMP(cust_prefix, cust_queue_t, cust_timer_t, \
+               cust_queue_field, cust_timer_field) \
+\
+void cust_prefix##_init_queue(cust_queue_t *queue)\
+{\
+  ul_htim_queue_init_root_field(&queue->cust_queue_field);\
+}\
+cust_timer_t *cust_prefix##_cut_expired(cust_queue_t *queue, ul_htim_time_t *pact_time)\
+{ /*little faster equivalent to ul_htim_queue_first(&queue->cust_queue_field);*/\
+  ul_htim_node_t *htim_node;\
+  if(!ul_htim_queue_inline_first(&queue->cust_queue_field,&htim_node))\
+    return 0;\
+  if(ul_htimer_cmp_fnc(&htim_node->expires,pact_time)>0) return NULL;\
+  htim_node=ul_htim_queue_cut_first(&queue->cust_queue_field);\
+  return UL_CONTAINEROF(htim_node,cust_timer_t,cust_timer_field);\
+}\
+int cust_prefix##_next_expire(cust_queue_t *queue, ul_htim_time_t *pnext_time)\
+{\
+  /*same as above, allows also new timers without "ul_gavlflesint.h" explicit inclussion */\
+  ul_htim_node_t *htim_node;\
+  if(!ul_htim_queue_inline_first(&queue->cust_queue_field,&htim_node))\
+    return 0;\
+  *pnext_time=htim_node->expires;\
+  return 1;\
+}
+
+/*===========================================================*/
+/*  Standard timer (ul_htimer) */
+
+#ifdef UL_HTIMER_WITH_STD_TYPE
+
+/**
+ * struct ul_htimer - Standard timer entry with callback function
+ * @htim:     basic timer queue entry
+ * @function: user provided function to call at trigger time
+ * @data:     user selected data
+ *
+ * This is standard timer type, which requires @data casting
+ * in many cases. The type of @function field has to be declared
+ * in "ul_htimdefs.h" header file.
+ */
+typedef struct ul_htimer {
+  ul_htim_node_t htim;
+  ul_htimer_fnc_t *function;
+  unsigned long data;
+  UL_HTIMER_USER_FIELDS
+} ul_htimer_t;
+
+/**
+ * struct ul_htimer_queue - Standard timer queue
+ * @htim_queue: the structure wraps &ul_htim_queue structure
+ *
+ * This is standard timer type, which requires @data casting
+ * in many cases
+ */
+typedef struct ul_htimer_queue {
+  ul_htim_queue_t htim_queue;
+} ul_htimer_queue_t;
+
+UL_HTIMER_DEC(ul_htimer, ul_htimer_queue_t, ul_htimer_t, htim_queue, htim) 
+
+void ul_htimer_run_expired(ul_htimer_queue_t *queue, ul_htim_time_t *pact_time);
+/* there are next usefull functions 
+ * void ul_htimer_init_queue(ul_htimer_queue_t *queue);
+ * int ul_htimer_add(ul_htimer_queue_t *queue, ul_htimer_t *timer);
+ * int ul_htimer_detach(ul_htimer_queue_t *queue, ul_htimer_t *timer);
+ * int ul_htimer_first_changed(ul_htimer_queue_t *queue);
+ * int ul_htimer_next_expire(ul_htimer_queue_t *queue, ul_htimer_time_t *pnext_time);
+ * ul_htimer_t *ul_htimer_cut_expired(ul_htimer_queue_t *queue, ul_htimer_time_t *pact_time);
+ * void ul_htimer_init_detached(ul_htimer_t *timer);
+ * void ul_htimer_set_expire(ul_htimer_t *timer, ul_htimer_time_t expire);
+ * ul_htimer_time_t ul_htimer_get_expire(ul_htimer_t *timer);
+ */
+
+#endif /*UL_HTIMER_WITH_STD_TYPE*/
+
+#ifdef UL_HTIMER_WITH_MSTIME
+#ifdef UL_HTIMER_WITH_STD_TYPE
+ul_htimer_queue_t ul_root_htimer;
+#endif /*UL_HTIMER_WITH_STD_TYPE*/
+ul_mstime_t ul_mstime_last;
+ul_mstime_t ul_mstime_next;
+
+void ul_mstime_now(ul_mstime_t *mstm);
+void ul_mstime_update(void);
+void ul_mstime_init(void);
+void ul_get_log_time_str(char str[30]);
+void ul_compute_mstime_next(void);
+
+#endif /*UL_HTIMER_WITH_MSTIME*/
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_HTIMER_H */
diff --git a/ulan/host/libs4c/ulut/ul_htimmstime.c b/ulan/host/libs4c/ulut/ul_htimmstime.c
new file mode 100644 (file)
index 0000000..cc79e42
--- /dev/null
@@ -0,0 +1,105 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_htimmstime.c   - standard hierarchical timer for microsecond
+                     time resolution
+
+  (C) Copyright 2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+#include "ul_gavl.h"
+#include "ul_gavlflesint.h"
+#include "ul_htimer.h"
+
+#ifdef UL_HTIMER_WITH_MSTIME
+
+#include <time.h>
+#include <stdio.h>
+
+ul_htimer_queue_t ul_root_htimer;
+
+ul_mstime_t ul_mstime_last;
+ul_mstime_t ul_mstime_next;
+
+static ul_mstime_t ul_mstime_base_offs;
+
+#ifndef _WIN32
+
+#include <sys/time.h>
+
+void ul_mstime_now(ul_mstime_t *mstm)
+{
+  struct timeval tv_actual;
+  ul_mstime_t ms_actual;
+  long int sec;
+  gettimeofday(&tv_actual,NULL);
+  sec=tv_actual.tv_sec;
+  ms_actual=sec*1000+tv_actual.tv_usec/1000+ul_mstime_base_offs;
+  *mstm=ms_actual;
+}
+#else /* _WIN32 */
+
+#include <sys/timeb.h>
+
+void ul_mstime_now(ul_mstime_t *mstm)
+{
+  struct timeb tb_actual;
+  ul_mstime_t ms_actual;
+  long int sec;
+  ftime(&tb_actual);
+  sec=tb_actual.time;
+  ms_actual=sec*1000+tb_actual.millitm+ul_mstime_base_offs;
+  *mstm=ms_actual;
+}
+#endif /* _WIN32 */
+
+void ul_mstime_update(void)
+{
+    ul_mstime_now(&ul_mstime_last);
+}
+
+void ul_mstime_init(void)
+{
+  ul_mstime_update();
+  ul_mstime_base_offs=-ul_mstime_last;
+  ul_mstime_update();
+}
+
+void
+ul_get_log_time_str(char str[30])
+{
+  time_t log_time;
+  struct tm *log_tm;
+  time(&log_time);
+  
+  log_tm=localtime(&log_time);
+  sprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",
+          (int)log_tm->tm_year+1900,(int)log_tm->tm_mon+1,
+          (int)log_tm->tm_mday,(int)log_tm->tm_hour,
+         (int)log_tm->tm_min,(int)log_tm->tm_sec);
+}
+
+void ul_compute_mstime_next(void)
+{
+  if(!ul_htimer_next_expire(&ul_root_htimer,&ul_mstime_next))
+    ul_mstime_next=ul_mstime_last+0x10000000;
+}
+  
+
+#endif /*UL_HTIMER_WITH_MSTIME*/
diff --git a/ulan/host/libs4c/ulut/ul_itbase.h b/ulan/host/libs4c/ulut/ul_itbase.h
new file mode 100644 (file)
index 0000000..9f7ab88
--- /dev/null
@@ -0,0 +1,97 @@
+#ifndef _UL_ITBASE_H
+#define _UL_ITBASE_H
+
+#include "ul_utdefs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_ITBASE_UL_DEC(cust_prefix, cust_container_t, cust_item_t) \
+typedef struct { cust_container_t *container; cust_item_t *item;}\
+        cust_prefix##_it_t;\
+static inline cust_item_t * \
+cust_prefix##_it2item(const cust_prefix##_it_t *it)\
+{\
+  return it->item;\
+}\
+static inline void \
+cust_prefix##_first_it(cust_container_t *container, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  it->item=cust_prefix##_first(container);\
+}\
+static inline void \
+cust_prefix##_last_it(cust_container_t *container, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  it->item=cust_prefix##_last(container);\
+}\
+static inline void \
+cust_prefix##_next_it(cust_prefix##_it_t *it)\
+{\
+  if(it->item) it->item=cust_prefix##_next(it->container,it->item);\
+  else it->item=cust_prefix##_first(it->container);\
+}\
+static inline void \
+cust_prefix##_prev_it(cust_prefix##_it_t *it)\
+{\
+  if(it->item) it->item=cust_prefix##_prev(it->container,it->item);\
+  else it->item=cust_prefix##_last(it->container);\
+}\
+static inline int \
+cust_prefix##_is_end_it(cust_prefix##_it_t *it)\
+{\
+  return !it->item;\
+}\
+static inline void \
+cust_prefix##_delete_it(cust_prefix##_it_t *it)\
+{\
+  cust_item_t *p;\
+  if(!(p=it->item)) return;\
+  it->item=cust_prefix##_next(it->container,it->item);\
+  cust_prefix##_delete(it->container,p);\
+}
+
+#define UL_ITBASE_SORT_DEC(cust_prefix, cust_container_t, cust_item_t, cust_key_t) \
+UL_ITBASE_UL_DEC(cust_prefix, cust_container_t, cust_item_t) \
+static inline int \
+cust_prefix##_find_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->item=cust_prefix##_find(container, key))!=0;\
+}\
+static inline int \
+cust_prefix##_find_first_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->item=cust_prefix##_find_first(container, key))!=0;\
+}\
+static inline int \
+cust_prefix##_find_after_it(cust_container_t *container, cust_key_t *key, cust_prefix##_it_t *it)\
+{\
+  it->container=container;\
+  return (it->item=cust_prefix##_find_after(container, key))!=0;\
+}
+
+#define ul_for_each_it(cust_prefix, root, it) \
+       for(cust_prefix##_first_it(root,&it);\
+       !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
+
+#define ul_for_each_rev_it(cust_prefix, root, it) \
+       for(cust_prefix##_last_it(root,&it);\
+       !cust_prefix##_is_end_it(&it);cust_prefix##_prev_it(&it))
+
+#define ul_for_each_from_it(cust_prefix, root, key, it) \
+       for(cust_prefix##_find_first_it(root, key, &it);\
+       !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
+
+#define ul_for_each_after_it(cust_prefix, root, key, it) \
+       for(cust_prefix##_find_after_it(root, key, &it);\
+       !cust_prefix##_is_end_it(&it);cust_prefix##_next_it(&it))
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_ITBASE_H */
diff --git a/ulan/host/libs4c/ulut/ul_list.h b/ulan/host/libs4c/ulut/ul_list.h
new file mode 100644 (file)
index 0000000..6328795
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef _UL_LISTS_H
+#define _UL_LISTS_H
+
+#include "ul_utdefs.h"
+#include "ul_listbase.h"
+#include "ul_itbase.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct list_head ul_list_node_t;
+typedef struct list_head ul_list_head_t;
+
+#define UL_LIST_CUST_DEC(cust_prefix, cust_head_t, cust_item_t,\
+               cust_head_field, cust_node_field) \
+\
+static inline cust_item_t * \
+cust_prefix##_node2item(const cust_head_t *head, const ul_list_node_t *node) \
+  {return UL_CONTAINEROF(node, cust_item_t, cust_node_field);}\
+\
+static inline void \
+cust_prefix##_init_head(cust_head_t *head)\
+{\
+  INIT_LIST_HEAD(&head->cust_head_field);\
+}\
+static inline void \
+cust_prefix##_init_detached(cust_item_t *item){\
+  INIT_LIST_HEAD(&item->cust_node_field);\
+}\
+static inline cust_item_t *\
+cust_prefix##_first(const cust_head_t *head)\
+{\
+  ul_list_node_t *n=head->cust_head_field.next;\
+  return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_last(const cust_head_t *head)\
+{\
+  ul_list_node_t *n=head->cust_head_field.prev;\
+  return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_next(const cust_head_t *head, const cust_item_t *item)\
+{\
+  ul_list_node_t *n=item->cust_node_field.next;\
+  return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
+}\
+static inline cust_item_t *\
+cust_prefix##_prev(const cust_head_t *head, const cust_item_t *item)\
+{\
+  ul_list_node_t *n=item->cust_node_field.prev;\
+  return (n!=&head->cust_head_field)?cust_prefix##_node2item(head,n):NULL;\
+}\
+static inline int \
+cust_prefix##_is_empty(const cust_head_t *head)\
+{\
+  return head->cust_head_field.next==&head->cust_head_field;\
+}\
+static inline void \
+cust_prefix##_ins_head(cust_head_t *head, cust_item_t *item)\
+{\
+  list_add(&item->cust_node_field, &head->cust_head_field);\
+}\
+static inline void \
+cust_prefix##_ins_tail(cust_head_t *head, cust_item_t *item)\
+{\
+  list_add_tail(&item->cust_node_field, &head->cust_head_field);\
+}\
+static inline void \
+cust_prefix##_insert(cust_head_t *head, cust_item_t *item)\
+{\
+  cust_prefix##_ins_tail(head, item);\
+}\
+static inline void \
+cust_prefix##_delete(cust_head_t *head, cust_item_t *item)\
+{\
+  list_del_init(&item->cust_node_field);\
+}\
+static inline void \
+cust_prefix##_del_item(cust_item_t *item)\
+{\
+  list_del_init(&item->cust_node_field);\
+}\
+static inline cust_item_t *\
+cust_prefix##_cut_first(cust_head_t *head)\
+{\
+  ul_list_node_t *n=head->cust_head_field.next;\
+  if(n==&head->cust_head_field) return NULL;\
+  list_del_init(n);\
+  return cust_prefix##_node2item(head,n);\
+}\
+/*** Iterators ***/\
+UL_ITBASE_UL_DEC(cust_prefix, cust_head_t, cust_item_t)
+
+
+#define ul_list_for_each(cust_prefix, head, ptr) \
+       for(ptr=cust_prefix##_first(head);ptr;ptr=cust_prefix##_next((head),ptr))
+
+#define ul_list_for_each_rev(cust_prefix, head, ptr) \
+       for(ptr=cust_prefix##_last(head);ptr;ptr=cust_prefix##_prev((head),ptr))
+
+#define ul_list_for_each_cut(cust_prefix, head, ptr) \
+       for(;(ptr=cust_prefix##_cut_first(head));)
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_LISTS_H */
diff --git a/ulan/host/libs4c/ulut/ul_listbase.h b/ulan/host/libs4c/ulut/ul_listbase.h
new file mode 100644 (file)
index 0000000..2d4fece
--- /dev/null
@@ -0,0 +1,287 @@
+#ifndef _UL_LISTBASE_H
+#define _UL_LISTBASE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __KERNEL__
+
+#define LIST_POISON1  ((void *) 0)
+#define LIST_POISON2  ((void *) 0)
+
+/*
+ * Simple doubly linked list implementation.
+ *
+ * Some of the internal functions ("__xxx") are useful when
+ * manipulating whole lists rather than single entries, as
+ * sometimes we already know the next/prev entries and we can
+ * generate better code by using them directly rather than
+ * using the generic single-entry routines.
+ */
+
+struct list_head {
+       struct list_head *next, *prev;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+       struct list_head name = LIST_HEAD_INIT(name)
+
+#define INIT_LIST_HEAD(ptr) do { \
+       (ptr)->next = (ptr); (ptr)->prev = (ptr); \
+} while (0)
+
+/*
+ * Insert a new entry between two known consecutive entries. 
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_add(struct list_head *new,
+                             struct list_head *prev,
+                             struct list_head *next)
+{
+       next->prev = new;
+       new->next = next;
+       new->prev = prev;
+       prev->next = new;
+}
+
+/**
+ * list_add - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+       __list_add(new, head, head->next);
+}
+
+/**
+ * list_add_tail - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it before
+ *
+ * Insert a new entry before the specified head.
+ * This is useful for implementing queues.
+ */
+static inline void list_add_tail(struct list_head *new, struct list_head *head)
+{
+       __list_add(new, head->prev, head);
+}
+
+/*
+ * Delete a list entry by making the prev/next entries
+ * point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_del(struct list_head * prev, struct list_head * next)
+{
+       next->prev = prev;
+       prev->next = next;
+}
+
+/**
+ * list_del - deletes entry from list.
+ * @entry: the element to delete from the list.
+ * Note: list_empty on entry does not return true after this, the entry is
+ * in an undefined state.
+ */
+static inline void list_del(struct list_head *entry)
+{
+       __list_del(entry->prev, entry->next);
+       entry->next = LIST_POISON1;
+       entry->prev = LIST_POISON2;
+}
+
+/**
+ * list_del_init - deletes entry from list and reinitialize it.
+ * @entry: the element to delete from the list.
+ */
+static inline void list_del_init(struct list_head *entry)
+{
+       __list_del(entry->prev, entry->next);
+       INIT_LIST_HEAD(entry); 
+}
+
+/**
+ * list_move - delete from one list and add as another's head
+ * @list: the entry to move
+ * @head: the head that will precede our entry
+ */
+static inline void list_move(struct list_head *list, struct list_head *head)
+{
+        __list_del(list->prev, list->next);
+        list_add(list, head);
+}
+
+/**
+ * list_move_tail - delete from one list and add as another's tail
+ * @list: the entry to move
+ * @head: the head that will follow our entry
+ */
+static inline void list_move_tail(struct list_head *list,
+                                 struct list_head *head)
+{
+        __list_del(list->prev, list->next);
+        list_add_tail(list, head);
+}
+
+/**
+ * list_empty - tests whether a list is empty
+ * @head: the list to test.
+ */
+static inline int list_empty(struct list_head *head)
+{
+       return head->next == head;
+}
+
+static inline void __list_splice(struct list_head *list,
+                                struct list_head *head)
+{
+       struct list_head *first = list->next;
+       struct list_head *last = list->prev;
+       struct list_head *where = head->next;
+
+       first->prev = head;
+       head->next = first;
+
+       last->next = where;
+       where->prev = last;
+}
+
+/**
+ * list_splice - join two lists
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ */
+static inline void list_splice(struct list_head *list, struct list_head *head)
+{
+       if (!list_empty(list))
+               __list_splice(list, head);
+}
+
+/**
+ * list_splice_init - join two lists and reinitialise the emptied list.
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ *
+ * The list at @list is reinitialised
+ */
+static inline void list_splice_init(struct list_head *list,
+                                   struct list_head *head)
+{
+       if (!list_empty(list)) {
+               __list_splice(list, head);
+               INIT_LIST_HEAD(list);
+       }
+}
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr:       the &struct list_head pointer.
+ * @type:      the type of the struct this is embedded in.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+       container_of(ptr, type, member)
+
+/**
+ * list_for_each       -       iterate over a list
+ * @pos:       the &struct list_head to use as a loop counter.
+ * @head:      the head for your list.
+ */
+#define list_for_each(pos, head) \
+       for (pos = (head)->next, prefetch(pos->next); pos != (head); \
+               pos = pos->next, prefetch(pos->next))
+
+/**
+ * __list_for_each     -       iterate over a list
+ * @pos:       the &struct list_head to use as a loop counter.
+ * @head:      the head for your list.
+ *
+ * This variant differs from list_for_each() in that it's the
+ * simplest possible list iteration code, no prefetching is done.
+ * Use this for code that knows the list to be very short (empty
+ * or 1 entry) most of the time.
+ */
+#define __list_for_each(pos, head) \
+       for (pos = (head)->next; pos != (head); pos = pos->next)
+
+/**
+ * list_for_each_prev  -       iterate over a list backwards
+ * @pos:       the &struct list_head to use as a loop counter.
+ * @head:      the head for your list.
+ */
+#define list_for_each_prev(pos, head) \
+       for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \
+               pos = pos->prev, prefetch(pos->prev))
+               
+/**
+ * list_for_each_safe  -       iterate over a list safe against removal of list entry
+ * @pos:       the &struct list_head to use as a loop counter.
+ * @n:         another &struct list_head to use as temporary storage
+ * @head:      the head for your list.
+ */
+#define list_for_each_safe(pos, n, head) \
+       for (pos = (head)->next, n = pos->next; pos != (head); \
+               pos = n, n = pos->next)
+
+/**
+ * list_for_each_entry -       iterate over list of given type
+ * @pos:       the type * to use as a loop counter.
+ * @head:      the head for your list.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_for_each_entry(pos, head, member)                         \
+       for (pos = list_entry((head)->next, typeof(*pos), member),      \
+                    prefetch(pos->member.next);                        \
+            &pos->member != (head);                                    \
+            pos = list_entry(pos->member.next, typeof(*pos), member),  \
+                    prefetch(pos->member.next))
+
+/**
+ * list_for_each_entry_reverse - iterate backwards over list of given type.
+ * @pos:       the type * to use as a loop counter.
+ * @head:      the head for your list.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_for_each_entry_reverse(pos, head, member)                 \
+       for (pos = list_entry((head)->prev, typeof(*pos), member),      \
+                    prefetch(pos->member.prev);                        \
+            &pos->member != (head);                                    \
+            pos = list_entry(pos->member.prev, typeof(*pos), member),  \
+                    prefetch(pos->member.prev))
+
+
+/**
+ * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
+ * @pos:       the type * to use as a loop counter.
+ * @n:         another type * to use as temporary storage
+ * @head:      the head for your list.
+ * @member:    the name of the list_struct within the struct.
+ */
+#define list_for_each_entry_safe(pos, n, head, member)                 \
+       for (pos = list_entry((head)->next, typeof(*pos), member),      \
+               n = list_entry(pos->member.next, typeof(*pos), member); \
+            &pos->member != (head);                                    \
+            pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
+#else /*__KERNEL__*/
+
+#include <linux/list.h>
+
+#endif /*__KERNEL__*/
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_LISTBASE_H */
diff --git a/ulan/host/libs4c/ulut/ul_log.h b/ulan/host/libs4c/ulut/ul_log.h
new file mode 100644 (file)
index 0000000..7bf54a4
--- /dev/null
@@ -0,0 +1,111 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_log.h     - standard logging facility
+
+  (C) Copyright 2005 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <ul_logbase.h>
+
+#define UL_LOG_CUST(log_domain) \
+\
+ul_log_domain_t log_domain; \
+\
+static inline \
+void ul_loglev(int level, const char *format, ...) UL_ATTR_PRINTF (2, 3);\
+static inline \
+void ul_vloglev(int level, const char *format, va_list ap) \
+{ \
+    ul_vlog(&log_domain, level, format, ap); \
+} \
+\
+static inline \
+void ul_loglev(int level, const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(level, format, ap); \
+    va_end(ap); \
+} \
+\
+static inline \
+void ul_logfatal(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_logfatal(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_FATAL, format, ap); \
+    va_end(ap); \
+}\
+\
+static inline \
+void ul_logerr(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_logerr(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_ERR, format, ap); \
+    va_end(ap); \
+} \
+\
+static inline \
+void ul_logmsg(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_logmsg(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_MSG, format, ap); \
+    va_end(ap); \
+} \
+\
+static inline \
+void ul_loginf(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_loginf(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_INF, format, ap); \
+    va_end(ap); \
+} \
+\
+static inline \
+void ul_logdeb(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_logdeb(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_DEB, format, ap); \
+    va_end(ap); \
+}\
+\
+static inline \
+void ul_logtrash(const char *format, ...) UL_ATTR_PRINTF (1, 2);\
+static inline \
+void ul_logtrash(const char *format, ...) \
+{ \
+    va_list ap; \
+    va_start(ap, format); \
+    ul_vloglev(UL_LOGL_TRASH, format, ap); \
+    va_end(ap); \
+}
diff --git a/ulan/host/libs4c/ulut/ul_logbase.c b/ulan/host/libs4c/ulut/ul_logbase.c
new file mode 100644 (file)
index 0000000..af7f8a8
--- /dev/null
@@ -0,0 +1,203 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_logbase.c - base of standard logging facility
+
+  (C) Copyright 2003 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef __RTL__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdarg.h>
+
+#else /*__RTL__*/
+
+#include <rtl.h>
+#include <string.h>
+#include <signal.h>
+#include <posix/unistd.h>
+
+#endif /*__RTL__*/
+
+#include "ul_utdefs.h"
+#include "ul_logbase.h"
+
+
+int ul_debug_flg;
+int ul_log_cutoff_level;   
+
+#ifdef UL_LOG_NOINLINE
+
+int ul_log_cond(ul_log_domain_t *domain, int level)
+{
+  if(!domain || ((level&UL_LOGL_MASK) > UL_LOGL_MAX))
+    return 0;
+  return (level&UL_LOGL_MASK) <= domain->level;
+}
+
+void ul_vlog(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap)
+{
+  if(!ul_log_cond(domain,level))
+    return;
+  ul_vlog1(domain, level, format, ap);
+}
+
+void ul_log(ul_log_domain_t *domain, int level,
+       const char *format, ...)
+{
+  va_list ap;
+
+  if(!ul_log_cond(domain,level))
+    return;
+  va_start (ap, format);
+  ul_vlog1(domain, level, format, ap);
+  va_end (ap);
+}
+
+#endif /*UL_LOG_NOINLINE*/
+
+
+void
+ul_log_fnc_default(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap);
+
+ul_log_fnc_t *ul_log_output;
+#ifndef __RTL__
+FILE *ul_log_default_file;
+#endif /*__RTL__*/
+
+/**
+ * ul_log - generic logging facility for ULUT library
+ * @domain: pointer to domain of debugging messages
+ * @level:  severity level
+ * @format: printf style format followed by arguments
+ *
+ * This functions is used for logging of various events.
+ * If not overridden by application, logged messages goes to the stderr.
+ * Environment variable %UL_LOG_FILENAME can be used to redirect 
+ * output to file. Environment variable %UL_DEBUG_FLG can be used
+ * to select different set of logged events through ul_debug_flg.
+ *
+ * Note: There is a global variable %ul_log_cutoff_level. 
+ * Only the messages with %level <= %ul_log_cutoff_level will be logged.
+ */           
+
+void
+ul_log1(ul_log_domain_t *domain, int level,
+       const char *format, ...)
+{
+  va_list ap;
+  va_start(ap, format);
+  ul_vlog1(domain,level,format,ap);
+  va_end(ap); 
+}
+
+void
+ul_vlog1(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap)
+{
+  if(ul_log_cutoff_level) {
+      if((level & UL_LOGL_MASK) > ul_log_cutoff_level) return;
+  }
+  if(ul_log_output==NULL) {
+    ul_log_check_default_output();
+  }
+  if(ul_log_output)
+    (*ul_log_output)(domain,level,format,ap);
+}
+
+/**
+ * ul_log_redir - redirects default log output function
+ * @log_fnc: new log output function. Value NULL resets
+ *           to default function
+ * @add_flags: some more flags
+ */
+
+void
+ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags)
+{
+  if(log_fnc==NULL) log_fnc=ul_log_fnc_default;
+  ul_log_output=log_fnc;
+}
+
+#ifndef __RTL__
+void
+ul_log_fnc_default(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap)
+{
+  if(!(level&UL_LOGL_CONT)) {
+    level&=UL_LOGL_MASK;
+    if(level)
+      fprintf(ul_log_default_file,"<%d>",level);
+    if(domain && domain->name)
+      fprintf(ul_log_default_file,"%s: ",domain->name);
+  }
+  vfprintf(ul_log_default_file, format, ap);
+  fflush(ul_log_default_file);
+}
+
+
+#else /*__RTL__*/
+void
+ul_log_fnc_default(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap)
+{
+  if(!(level&UL_LOGL_CONT)) {
+    level&=UL_LOGL_MASK;
+    if(level)
+      rtl_printf("<%d>",level);
+    if(domain && domain->name)
+      rtl_printf("%s: ",domain->name);
+  }
+  rtl_vprintf(format, ap);
+}
+
+#endif /*__RTL__*/
+
+int
+ul_log_check_default_output(void)
+{
+ #ifndef __RTL__
+  char *s;
+  char *log_fname;
+ #endif /*__RTL__*/
+
+  if(ul_log_output!=NULL)
+    return 0;
+
+  ul_log_output=ul_log_fnc_default;
+ #ifndef __RTL__
+  if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
+    ul_log_default_file=fopen(log_fname,"a");
+  }
+  if(ul_log_default_file==NULL)
+    ul_log_default_file=stderr;
+  if(!ul_debug_flg&&((s=getenv("UL_DEBUG_FLG"))!=NULL)){
+    ul_debug_flg=atoi(s);
+  }
+  if((s = getenv("UL_LOG_CUTTOFF")) != NULL) {
+      ul_log_cutoff_level = atoi(s);
+  }
+ #endif /*__RTL__*/
+  return 0;
+}
+
diff --git a/ulan/host/libs4c/ulut/ul_logbase.h b/ulan/host/libs4c/ulut/ul_logbase.h
new file mode 100644 (file)
index 0000000..4136e08
--- /dev/null
@@ -0,0 +1,125 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_logbase.h - base of standard logging facility
+
+  (C) Copyright 2005 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_LOGBASE_H
+#define _UL_LOGBASE_H
+
+#include <stdarg.h>
+#include "ul_utdefs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UL_LOGL_MASK (0xff)
+#define UL_LOGL_CONT (0x1000)
+
+#define UL_LOGL_FATAL   1
+#define UL_LOGL_ERR     2
+#define UL_LOGL_MSG     3
+#define UL_LOGL_INF     4
+#define UL_LOGL_DEB     5
+#define UL_LOGL_TRASH   6
+
+#ifndef UL_LOGL_MAX
+#define UL_LOGL_MAX     6
+#endif
+
+/**
+ * struct ul_log_domain - Loggomg domain structure
+ * @level:     maximal enabled logging level for domain
+ * @name:      logging domain name
+ * @flags:     logging domain flags
+ */
+typedef struct ul_log_domain {
+  int level;
+  const char *name;
+  int flags;
+} ul_log_domain_t;
+
+typedef void (ul_log_fnc_t)(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap);
+
+void ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags);
+
+int ul_log_check_default_output(void);
+
+void ul_vlog1(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap);
+
+void ul_log1(ul_log_domain_t *domain, int level,
+       const char *format, ...) UL_ATTR_PRINTF (3, 4);
+
+#ifdef UL_LOG_NOINLINE
+
+int ul_log_cond(ul_log_domain_t *domain, int level);
+
+void ul_vlog(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap);
+
+void ul_log(ul_log_domain_t *domain, int level,
+       const char *format, ...) UL_ATTR_PRINTF (3, 4);
+
+#else /*UL_LOG_NOINLINE*/
+
+static inline
+int ul_log_cond(ul_log_domain_t *domain, int level)
+{
+  if(!domain || ((level&UL_LOGL_MASK) > UL_LOGL_MAX))
+    return 0;
+  return (level&UL_LOGL_MASK) <= domain->level;
+}
+
+static inline
+void ul_vlog(ul_log_domain_t *domain, int level,
+       const char *format, va_list ap)
+{
+  if(!ul_log_cond(domain,level))
+    return;
+  ul_vlog1(domain, level, format, ap);
+}
+
+static inline
+void ul_log(ul_log_domain_t *domain, int level,
+       const char *format, ...) UL_ATTR_PRINTF (3, 4);
+
+static inline
+void ul_log(ul_log_domain_t *domain, int level,
+       const char *format, ...)
+{
+  va_list ap;
+
+  if(!ul_log_cond(domain,level))
+    return;
+  va_start (ap, format);
+  ul_vlog1(domain, level, format, ap);
+  va_end (ap);
+}
+
+#endif /*UL_LOG_NOINLINE*/
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_LOGBASE_H*/
diff --git a/ulan/host/libs4c/ulut/ul_logbuf.c b/ulan/host/libs4c/ulut/ul_logbuf.c
new file mode 100644 (file)
index 0000000..97e4b36
--- /dev/null
@@ -0,0 +1,51 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_logbuf.c  - circular log buffer
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef __RTL__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdarg.h>
+
+#else /*__RTL__*/
+
+#include <rtl.h>
+#include <string.h>
+#include <signal.h>
+#include <posix/unistd.h>
+
+#endif /*__RTL__*/
+
+#include "ul_utdefs.h"
+#include "ul_logbase.h"
+
+typedef struct ul_log_buff {
+  unsigned char *buf_beg;
+  unsigned char *buf_end;
+  unsigned char *ip;
+  unsigned char *op;
+} ul_log_buff_t;
+
+
+ul_log_domain_t *domain
diff --git a/ulan/host/libs4c/ulut/ul_logreg.c b/ulan/host/libs4c/ulut/ul_logreg.c
new file mode 100644 (file)
index 0000000..e6fe132
--- /dev/null
@@ -0,0 +1,193 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_logreg.c  - registration of logging domains
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ul_logbase.h>
+#include <ul_logreg.h>
+#include <ul_gsacust.h>
+
+
+typedef struct ul_log_domains_t {
+ #ifdef UL_LOG_DOMAINS_STATIC
+  /*gsa_static_array_field_t domains;*/
+  struct {
+    ul_log_domain_t * const* items;
+    int count;
+  } domains;
+ #else /*UL_LOG_DOMAINS_STATIC*/
+  gsa_array_field_t domains;
+ #endif /*UL_LOG_DOMAINS_STATIC*/
+} ul_log_domains_t;
+
+typedef const char *ul_log_domains_key_t;
+
+inline int
+ul_log_domains_cmp_fnc(const ul_log_domains_key_t *a, const ul_log_domains_key_t *b)
+{
+  return strcmp(*a,*b);
+}
+
+/* Custom array declarations */
+#ifdef UL_LOG_DOMAINS_STATIC
+
+GSA_STATIC_CUST_DEC(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
+       domains, name, ul_log_domains_cmp_fnc)
+
+GSA_STATIC_CUST_IMP(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
+       domains, name, ul_log_domains_cmp_fnc, 0)
+
+#else /*UL_LOG_DOMAINS_STATIC*/
+
+GSA_CUST_DEC(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
+       domains, name, ul_log_domains_cmp_fnc)
+
+GSA_CUST_IMP(ul_log_domains, ul_log_domains_t, ul_log_domain_t, ul_log_domains_key_t,
+       domains, name, ul_log_domains_cmp_fnc, 0)
+
+#endif /*UL_LOG_DOMAINS_STATIC*/
+
+ul_log_domains_t ul_log_domains;
+
+/*This is not ideal*/
+extern int ul_log_cutoff_level;
+
+int ul_log_domain_setlevel(const char *name, int setlevel)
+{
+  int all_fl=0;
+
+  ul_log_domains_it_t it;
+  ul_log_domain_t *domain=NULL;
+
+  if(setlevel<0)
+    return -1;
+
+  if(setlevel>UL_LOGL_MAX)
+    setlevel=UL_LOGL_MAX;
+
+  if(!name)
+    all_fl=1;
+  else
+    all_fl=!strcmp(name,"all") || !strcmp(name,"ALL");
+
+  if(!all_fl){
+    domain=ul_log_domains_find(&ul_log_domains,&name);
+    if(!domain){
+      return 1;
+    }
+    domain->level=setlevel;
+  }else{
+    ul_for_each_it(ul_log_domains, &ul_log_domains, it){
+      domain=ul_log_domains_it2item(&it);
+      domain->level=setlevel;
+    }
+  }
+
+  return 0;
+}
+
+int ul_log_domain_getlevel(const char *name)
+{
+  ul_log_domain_t *domain=NULL;
+
+  if(!name)
+    return -1;
+
+  domain=ul_log_domains_find(&ul_log_domains,&name);
+  if(!domain){
+    return -1;
+  }
+  
+  return domain->level;
+}
+
+#ifndef UL_MAX_DOMAIN_NAME
+#define UL_MAX_DOMAIN_NAME 20
+#endif /*UL_MAX_DOMAIN_NAME*/
+
+int ul_log_domain_arg2levels(const char *arg)
+{
+  const char *p=arg;
+  const char *r;
+  int l;
+  char name[UL_MAX_DOMAIN_NAME+1];
+
+  if(!arg)
+    return -1;
+
+  while(*p){
+    if(isdigit(*p)){
+      strcpy(name,"all");
+    }else{
+      r=p;
+      while(isalnum(*p)) p++;
+      l=p-r;
+      if(l>UL_MAX_DOMAIN_NAME)
+        l=UL_MAX_DOMAIN_NAME;
+      memcpy(name,r,l);
+      name[l]=0;
+      if(*p&&(*p!='.')&&(*p!='='))
+        return p-arg;
+      p++;
+    }
+    r=p;
+    l=strtol(r,(char**)&p,0);
+    if(!p||(p==r)||(*p&&(*p!=':')&&(*p!=',')))
+      return p-arg;
+    if(ul_log_domain_setlevel(name, l)<0)
+      return p-arg;
+    if(*p)
+      p++;
+  }
+
+  return 0;
+}
+
+int ul_logreg_domain(ul_log_domain_t *domain)
+{
+  ul_log_check_default_output();
+  if(!domain->level)
+    domain->level=ul_log_cutoff_level;
+  return ul_log_domains_insert(&ul_log_domains,domain);
+}
+
+int ul_logreg_domains_static(ul_log_domain_t *const *domains, int count)
+{
+  if(!ul_log_domains.domains.items && !ul_log_domains.domains.alloc_count){
+    ul_log_domains.domains.items=(void**)domains;
+    ul_log_domains.domains.count=count;
+    ul_log_check_default_output();
+    while(count-->0){
+      if(!(*domains)->level)
+         (*domains)->level=ul_log_cutoff_level;
+      domains++;
+    }
+    return 0;
+  }
+  while(count-->0){
+    if(ul_logreg_domain(*(domains++))<0)
+      return -1;
+  }
+  return 0;
+}
diff --git a/ulan/host/libs4c/ulut/ul_logreg.h b/ulan/host/libs4c/ulut/ul_logreg.h
new file mode 100644 (file)
index 0000000..9a25b83
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_logreg.h  - registration of logging domains
+
+  (C) Copyright 2006 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <ul_logbase.h>
+
+#ifndef _UL_LOGREG_H
+#define _UL_LOGREG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int ul_log_domain_setlevel(const char *name, int setlevel);
+int ul_log_domain_getlevel(const char *name);
+
+int ul_logreg_domain(ul_log_domain_t *domain);
+int ul_logreg_domains_static(ul_log_domain_t *const *domains, int count);
+int ul_log_domain_arg2levels(const char *arg);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_LOGREG_H*/
diff --git a/ulan/host/libs4c/ulut/ul_uniqid.c b/ulan/host/libs4c/ulut/ul_uniqid.c
new file mode 100644 (file)
index 0000000..4b0e9f4
--- /dev/null
@@ -0,0 +1,307 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_uniqid.h  - unique ID generator
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#include <string.h>
+
+#include "ul_gavl.h"
+#include "ul_gavlflesint.h"
+#include "ul_uniqid.h"
+#include "ul_utmalloc.h"
+
+typedef struct ul_uniqid_pool_item {
+  gavl_node_t    node;
+  ul_uniqid_range_t range;
+} ul_uniqid_pool_item_t;
+
+static inline int
+ul_uniqid_pool_cmp_fnc( const ul_uniqid_range_t *a, const ul_uniqid_range_t *b)
+{
+        if (a->first>b->last) return 1;
+        if (a->last<b->first) return -1;
+        return 0;
+}
+
+GAVL_FLES_INT_DEC(ul_uniqid_pool, ul_uniqid_pool_t, ul_uniqid_pool_item_t, ul_uniqid_range_t,
+       items, node, range, ul_uniqid_pool_cmp_fnc)
+
+
+GAVL_FLES_INT_IMP(ul_uniqid_pool, ul_uniqid_pool_t, ul_uniqid_pool_item_t, ul_uniqid_range_t,
+       items, node, range, ul_uniqid_pool_cmp_fnc, GAVL_FANY, , , )
+
+
+/**
+ * ul_uniqid_pool_init - Initialize Unique IDs Pool
+ * @pool:      the pointer to the unique IDs pool
+ * @first:     the start of the available numeric range
+ * @last:      the end of the available numeric range
+ *
+ * Return Value: The function returns -1 if the @first>@last or if there
+ *     is not enough memory to allocate item for initial range representation.
+ *     The zero value indicates successful initialization.
+ */
+int ul_uniqid_pool_init(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
+{
+  ul_uniqid_pool_item_t *item;
+  
+  ul_uniqid_pool_init_root_field(pool);
+  
+  if(first>last)
+    return -1;
+
+  pool->range.first=first;
+  pool->range.last=last;
+
+  item=malloc(sizeof(ul_uniqid_pool_item_t));
+  if(!item)
+    return -1;
+  item->range=pool->range;
+
+  ul_uniqid_pool_insert(pool, item);
+
+  return 0;
+}
+
+/**
+ * ul_uniqid_pool_done - Finalize Unique IDs Pool
+ * @pool:      the pointer to the unique IDs pool
+ *
+ * Return Value: The zero value indicates success.
+ */
+int ul_uniqid_pool_done(ul_uniqid_pool_t *pool)
+{
+  ul_uniqid_pool_item_t *item;
+
+  gavl_cust_for_each_cut(ul_uniqid_pool, pool, item){
+    free(item);
+  }
+
+  return 0;
+}
+
+/**
+ * ul_uniqid_pool_reserve - Reserve Range from the Unique IDs Pool
+ * @pool:      the pointer to the unique IDs pool
+ * @first:     the start value of the range
+ * @last:      the end value of the range
+ *
+ * The function checks if specified range @first..@last is free
+ * and reserves it from free pool.
+ *
+ * Return Value: The zero value indicates success. The value of -1 indicates,
+ *     that range overlaps with already reserved values or exceeds pool boundaries.
+ *     The value 1 is returned in the case, that there is not enough free memory
+ *     to represent new non-continuous ranges.
+ */
+int ul_uniqid_pool_reserve(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
+{
+  ul_uniqid_range_t range;
+  ul_uniqid_t idsave;
+  ul_uniqid_pool_item_t *item;
+
+  range.first=first;
+  range.last=last;
+  
+  if(range.first>range.last)
+    return -1;
+
+  item=ul_uniqid_pool_find(pool, &range);
+  if(!item)
+    return -1;
+
+  if(range.first<item->range.first)
+    return -1;
+
+  if(range.last>item->range.last)
+    return -1;
+
+  if(range.first==item->range.first){
+    if(range.last==item->range.last){
+      ul_uniqid_pool_delete(pool, item);
+      free(item);
+    }else{
+      item->range.first=range.last+1;
+    }
+  }else{
+    idsave=item->range.last;
+    item->range.last=range.first-1;
+    if(range.last!=idsave){
+      item=malloc(sizeof(ul_uniqid_pool_item_t));
+      if(!item)
+       return 1;
+      item->range.last=idsave;
+      item->range.first=range.last+1;
+      ul_uniqid_pool_insert(pool, item);
+    }
+  }
+
+  return 0;
+}
+
+
+/**
+ * ul_uniqid_pool_release - Release Range Back to the Unique IDs Pool
+ * @pool:      the pointer to the unique IDs pool
+ * @first:     the start value of the range
+ * @last:      the end value of the range
+ *
+ * The range @first..@last is returned to the pool for subsequent reuse.
+ *
+ * Return Value: The zero value indicates success. The value of -1 indicates,
+ *     that range cannot be return back, because there is no free memory
+ *     to allocate space for returned range.
+ */
+int ul_uniqid_pool_release(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
+{
+  ul_uniqid_pool_item_t *post, *prev;
+  ul_uniqid_range_t range;
+
+  range.first=first;
+  range.last=last;
+  post=ul_uniqid_pool_find_after(pool,&range);
+
+  if(post){
+    prev=ul_uniqid_pool_prev(pool,post);
+    if(post->range.first!=range.last+1)
+      post=NULL;
+    else
+      post->range.first=range.first;
+  }else{
+    prev=ul_uniqid_pool_last(pool);
+  }
+
+  if(prev){
+    if(prev->range.last!=range.first-1)
+      prev=NULL;
+    else{
+      if(post){
+        post->range.first=prev->range.first;
+        ul_uniqid_pool_delete(pool, prev);
+        free(prev);
+      }else{
+        prev->range.last=range.last;
+      }
+    }
+  }
+
+  if(!prev && !post){
+    post=malloc(sizeof(ul_uniqid_pool_item_t));
+    if(!post)
+      return -1;
+    post->range=range;
+    ul_uniqid_pool_insert(pool, post);
+  }
+  return 0;
+}
+
+/**
+ * ul_uniqid_pool_alloc_one - Allocate/Generate One Unique ID from the Pool
+ * @pool:      the pointer to the unique IDs pool
+ * @ptrid:     pointer to ul_uniqid_t variable where unique ID is returned
+ *
+ * The function allocates lowest available ID from the pool and assigns
+ * its value to the space pointed by @ptrid.
+ *
+ * Return Value: The zero value indicates success. The value of -1 indicates,
+ *     that all IDs from the pool are taken. No other reason is possible,
+ *     because function does not call any memory allocation function.
+ */
+int ul_uniqid_pool_alloc_one(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid)
+{
+  ul_uniqid_t id;
+  ul_uniqid_pool_item_t *item;
+
+  item=ul_uniqid_pool_first(pool);
+  if(!item) return -1;
+  id=item->range.first;
+  if(item->range.first!=item->range.last){
+    item->range.first=id+1;
+  }else{
+    ul_uniqid_pool_delete(pool, item);
+    free(item);
+  }
+  *ptrid=id;
+  
+  return 0;
+}
+
+/**
+ * ul_uniqid_pool_alloc_one_after - Allocate One Unique ID Greater Than Value Specified
+ * @pool:      the pointer to the unique IDs pool
+ * @ptrid:     pointer to ul_uniqid_t variable where unique ID is returned
+ * @afterid:   the ID value after which free ID is searched
+ *
+ * The function allocates the first available ID after @afterid from the
+ * pool and assigns its value to the space pointed by @ptrid.
+ * If there is no available ID with value greater than @afterid, the first free ID
+ * from the whole pool is returned.
+ *
+ * Return Value: The zero value indicates success. The value of -1 indicates,
+ *     that all IDs from the pool are taken. No other reason is possible,
+ *     because function does not call any memory allocation function.
+ */
+int ul_uniqid_pool_alloc_one_after(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid, ul_uniqid_t afterid)
+{
+  ul_uniqid_t id;
+  ul_uniqid_pool_item_t *item;
+
+  if((afterid>=pool->range.last)||
+     (afterid<=pool->range.first)){
+    item=NULL;
+  } else {
+    ul_uniqid_range_t range;
+    range.first=range.last=afterid;
+    item=ul_uniqid_pool_find_after(pool,&range);
+  }
+
+  if(!item)
+    item=ul_uniqid_pool_first(pool);
+
+  if(!item)
+    return -1;
+
+  id=item->range.first;
+  if(item->range.first!=item->range.last){
+    item->range.first=id+1;
+  }else{
+    ul_uniqid_pool_delete(pool, item);
+    free(item);
+  }
+  *ptrid=id;
+  
+  return 0;
+}
+
+
+/**
+ * ul_uniqid_pool_free_one - Release One Previously Allocated Unique ID
+ * @pool:      the pointer to the unique IDs pool
+ * @id:                the released ID value
+ *
+ * Return Value: The zero value indicates success. The value of -1 indicates,
+ *     that ID cannot be return back, because there is no free memory
+ *     to allocate space for range representing returned ID.
+ */
+int ul_uniqid_pool_free_one(ul_uniqid_pool_t *pool, ul_uniqid_t id)
+{
+  return ul_uniqid_pool_release(pool, id, id);
+}
diff --git a/ulan/host/libs4c/ulut/ul_uniqid.h b/ulan/host/libs4c/ulut/ul_uniqid.h
new file mode 100644 (file)
index 0000000..b9a6dfc
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_uniqid.h  - unique ID generator
+
+  (C) Copyright 2003-2004 by Pavel Pisa - Originator
+
+  The uLan utilities library can be used, copied and modified under
+  next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_UNIQID_H
+#define _UL_UNIQID_H
+
+#include "ul_gavl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef unsigned long ul_uniqid_t;
+
+typedef struct ul_uniqid_range_t {
+  ul_uniqid_t first;
+  ul_uniqid_t last;
+} ul_uniqid_range_t;
+
+/**
+ * struct ul_uniqid_pool_t - The Unique Identifiers Pool
+ * @items:     GAVL tree of not allocated yet ranges
+ * @range:     numeric range to allocate IDs from
+ *
+ * The unique pool provides functions to manage unique numerical IDs.
+ * The pool is first initialized by function ul_uniqid_pool_init().
+ * The available range is specified at this time. The pool can be
+ * flushed and destroyed by call ul_uniqid_pool_done().
+ *
+ * The function ul_uniqid_pool_alloc_one() returns first free ID from
+ * range. The ID is returned to the pool by function ul_uniqid_pool_free_one().
+ * There are even functions to reserve and release specific IDs range.
+ */
+typedef struct ul_uniqid_pool_t {
+  gavl_fles_int_root_field_t items;
+  ul_uniqid_range_t range;
+} ul_uniqid_pool_t;
+
+int ul_uniqid_pool_init(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last);
+int ul_uniqid_pool_done(ul_uniqid_pool_t *pool);
+int ul_uniqid_pool_reserve(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last);
+int ul_uniqid_pool_release(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last);
+int ul_uniqid_pool_alloc_one(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid);
+int ul_uniqid_pool_alloc_one_after(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid, ul_uniqid_t afterid);
+int ul_uniqid_pool_free_one(ul_uniqid_pool_t *pool, ul_uniqid_t id);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_UNIQID_H*/
diff --git a/ulan/host/libs4c/ulut/ul_utdefs.h b/ulan/host/libs4c/ulut/ul_utdefs.h
new file mode 100644 (file)
index 0000000..3cf4b27
--- /dev/null
@@ -0,0 +1,93 @@
+/*******************************************************************
+  uLan Utilities Library - C library of basic reusable constructions
+
+  ul_utdefs.h  - common defines used in uLan utilities library
+
+ *******************************************************************/
+
+
+#ifndef _UL_UTDEFS_H
+#define _UL_UTDEFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(_WIN32)&&defined(_MSC_VER)&&!defined(inline)
+#define inline _inline
+#endif
+
+#ifndef UL_OFFSETOF
+/* offset of structure field */
+#define UL_OFFSETOF(_type,_member) \
+                ((int)&(((_type*)0)->_member))
+#endif /*UL_OFFSET*/
+
+#ifndef UL_CONTAINEROF
+#ifdef  __GNUC__
+#define UL_CONTAINEROF(_ptr, _type, _member) ({ \
+        const typeof( ((_type *)0)->_member ) *__mptr = (_ptr); \
+        (_type *)( (char *)__mptr - UL_OFFSETOF(_type,_member) );})
+#else /*!__GNUC__*/
+#define UL_CONTAINEROF(_ptr, _type, _member) \
+        ((_type *)( (char *)_ptr - UL_OFFSETOF(_type,_member)))
+#endif /*__GNUC__*/
+#endif /*UL_CONTAINEROF*/
+
+#ifndef ul_cyclic_gt
+#define ul_cyclic_gt(x,y) \
+       ((sizeof(x)>=sizeof(long long))&&(sizeof(y)>=sizeof(long long))? \
+               (long long)((long long)(x)-(long long)(y))>0: \
+        (sizeof(x)>=sizeof(long))&&(sizeof(y)>=sizeof(long))? \
+               (long)((long)(x)-(long)(y))>0: /* x,y casts to suppress warnings only*/ \
+        (sizeof(x)>=sizeof(int))&&(sizeof(y)>=sizeof(int))?(int)((x)-(y))>0: \
+        (sizeof(x)>=sizeof(short))&&(sizeof(y)>=sizeof(short))?(short)((x)-(y))>0: \
+        (signed char)((x)-(y))>0 \
+       )
+#endif /*ul_cyclic_gt*/
+
+#ifndef ul_cyclic_ge
+#define ul_cyclic_ge(x,y) \
+       ((sizeof(x)>=sizeof(long long))&&(sizeof(y)>=sizeof(long long))? \
+               (long long)((long long)(x)-(long long)(y))>=0: \
+        (sizeof(x)>=sizeof(long))&&(sizeof(y)>=sizeof(long))? \
+               (long)((long)(x)-(long)(y))>=0: /* x,y casts to suppress warnings only*/ \
+        (sizeof(x)>=sizeof(int))&&(sizeof(y)>=sizeof(int))?(int)((x)-(y))>=0: \
+        (sizeof(x)>=sizeof(short))&&(sizeof(y)>=sizeof(short))?(short)((x)-(y))>=0: \
+        (signed char)((x)-(y))>=0 \
+       )
+#endif /*ul_cyclic_ge*/
+
+/* GNUC neat features */
+
+#ifdef __GNUC__
+#ifndef UL_ATTR_UNUSED
+#define UL_ATTR_PRINTF( format_idx, arg_idx )  \
+  __attribute__((format (printf, format_idx, arg_idx)))
+#define UL_ATTR_SCANF( format_idx, arg_idx )   \
+  __attribute__((format (scanf, format_idx, arg_idx)))
+#define UL_ATTR_FORMAT( arg_idx )              \
+  __attribute__((format_arg (arg_idx)))
+#define UL_ATTR_NORETURN                       \
+  __attribute__((noreturn))
+#define UL_ATTR_CONST                          \
+  __attribute__((const))
+#define        UL_ATTR_UNUSED                          \
+  __attribute__((unused))
+#endif  /*UL_ATTR_UNUSED*/
+#else  /* !__GNUC__ */
+#ifndef UL_ATTR_UNUSED
+#define UL_ATTR_PRINTF( format_idx, arg_idx )
+#define UL_ATTR_SCANF( format_idx, arg_idx )
+#define UL_ATTR_FORMAT( arg_idx )
+#define UL_ATTR_NORETURN
+#define UL_ATTR_CONST
+#define UL_ATTR_UNUSED
+#endif  /*UL_ATTR_UNUSED*/
+#endif /* !__GNUC__ */
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_UTDEFS_H */
diff --git a/ulan/host/libs4c/ulut/ul_utexport.h b/ulan/host/libs4c/ulut/ul_utexport.h
new file mode 100644 (file)
index 0000000..4abe376
--- /dev/null
@@ -0,0 +1,53 @@
+/* Shared library support */
+#ifndef UL_EXPORT
+  #if defined(_WIN32)&&defined(_MSC_VER)
+    #define UL_IMPORT __declspec(dllimport)
+    #define UL_EXPORT __declspec(dllexport)
+    #define UL_DLLLOCAL
+    #define UL_DLLPUBLIC
+  #else
+    #define UL_IMPORT
+    #ifdef GCC_HASCLASSVISIBILITY
+      #define UL_EXPORT __attribute__ ((visibility("default")))
+      #define UL_DLLLOCAL __attribute__ ((visibility("hidden")))
+      #define UL_DLLPUBLIC __attribute__ ((visibility("default")))
+    #else
+      #define UL_EXPORT
+      #define UL_DLLLOCAL
+      #define UL_DLLPUBLIC
+    #endif
+  #endif
+#endif /* UL_EXPORT */
+
+/* Define UL_UTAPI for DLL builds */
+#ifdef UL_UTDLL
+  #ifdef UL_UTDLL_EXPORTS
+    #define UL_UTAPI UL_EXPORT
+  #else
+    #define UL_UTAPI  UL_IMPORT
+  #endif /* UL_UTDLL_EXPORTS */
+#else
+  #define UL_API
+#endif /* UL_UTDLL */
+
+/* Throwable classes must always be visible on GCC in all binaries */
+#if defined(_WIN32)&&defined(_MSC_VER)
+  #define UL_EXCEPTIONAPI(api) api
+#elif defined(GCC_HASCLASSVISIBILITY)
+  #define UL_EXCEPTIONAPI(api) UL_EXPORT
+#else
+  #define UL_EXCEPTIONAPI(api)
+#endif
+
+/* Other possible solution is to use pragmas */
+/*
+ * #pragma GCC visibility push(hidden)
+ * extern void someprivatefunct(int);
+ * #pragma GCC visibility pop
+ */
+
+/* GCC switches to handle visibility */
+/*
+ * -fvisibilty=hidden
+ * -fvisibility-inlines-hidden
+ */
\ No newline at end of file
diff --git a/ulan/host/libs4c/ulut/ul_utmalloc.h b/ulan/host/libs4c/ulut/ul_utmalloc.h
new file mode 100644 (file)
index 0000000..cad9c7f
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _UL_UTMALLOC_H
+#define _UL_UTMALLOC_H
+
+#if !defined(__RTL__)&&!defined(__KERNEL__)
+
+#include <malloc.h>
+
+#else /*__RTL__ or __KERNEL__*/
+
+#ifdef UL_WITH_RTL_MALLOC
+#include <rtl_malloc.h>
+#define malloc    rt_malloc
+#define free      rt_free
+#define realloc   rt_realloc
+#endif /*UL_WITH_RTL_MALLOC*/
+
+#endif /*__RTL__ or __KERNEL__*/
+
+#endif /*_UL_UTMALLOC_H*/
diff --git a/ulan/host/switch2omk b/ulan/host/switch2omk
new file mode 100755 (executable)
index 0000000..9c950bf
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+MAKEFILES=`find . -name Makefile.omk`
+
+for i in ${MAKEFILES} ; do 
+   i=`dirname ${i}`
+   rm -f ${i}/Makefile
+   cp Makefile4omk ${i}/Makefile
+done
+
+make default-config
diff --git a/ulan/host/switch2std b/ulan/host/switch2std
new file mode 100755 (executable)
index 0000000..3ab1368
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+MAKEFILES=`find . -name Makefile.std`
+
+for i in ${MAKEFILES} ; do 
+  ( cd `dirname ${i}` && rm -f Makefile && ln -sf Makefile.std Makefile )
+done
diff --git a/ulan/host/ul_drv/.cvsignore b/ulan/host/ul_drv/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/ul_drv/COPYING b/ulan/host/ul_drv/COPYING
new file mode 100644 (file)
index 0000000..60549be
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ulan/host/ul_drv/CVS/Entries b/ulan/host/ul_drv/CVS/Entries
new file mode 100644 (file)
index 0000000..72fb3e6
--- /dev/null
@@ -0,0 +1,13 @@
+/.cvsignore/1.2/Wed Sep 22 22:13:11 2004//
+/COPYING/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/Makefile.omk/1.4/Fri Apr  7 08:13:43 2006//
+/Makefile.std/1.1/Fri Sep 10 17:48:26 2004//
+/README/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/ul_drv.lsm/1.5/Sun Jan 27 22:31:33 2008//
+D/config////
+D/lazarus////
+D/ul_dll////
+D/ul_drv////
+D/ul_iss////
+D/ul_lib////
+D/utils////
diff --git a/ulan/host/ul_drv/CVS/Repository b/ulan/host/ul_drv/CVS/Repository
new file mode 100644 (file)
index 0000000..031257e
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv
diff --git a/ulan/host/ul_drv/CVS/Root b/ulan/host/ul_drv/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/Makefile.omk b/ulan/host/ul_drv/Makefile.omk
new file mode 100644 (file)
index 0000000..eec717d
--- /dev/null
@@ -0,0 +1,13 @@
+SUBDIRS = ul_drv ul_lib 
+ifneq ($(CONFIG_OC_UL_DRV_SYSLESS),y)
+SUBDIRS += utils
+endif
+
+#lib_LIBRARIES =
+#shared_LIBRARIES =
+#include_HEADERS  = 
+#xxx_SOURCES =
+#lib_LOADLIBES =
+#bin_PROGRAMS = 
+#utils_PROGRAMS = 
+
diff --git a/ulan/host/ul_drv/Makefile.std b/ulan/host/ul_drv/Makefile.std
new file mode 100644 (file)
index 0000000..6e934b2
--- /dev/null
@@ -0,0 +1,24 @@
+# enable next for WinNT target
+# export OS=Windows_NT
+
+# enable next for DJGPP target
+# export DJGPP = 1
+
+all: default
+
+.PHONY: default subdirs clean cleandepend
+
+dirs = ul_lib utils
+
+ifdef DJGPP
+else
+ifeq ($(OS),Windows_NT)
+else
+dirs += ul_drv
+endif
+endif
+
+default clean install:
+       $(foreach dir, $(dirs), $(MAKE) -C $(dir) $@ ;)
+
+
diff --git a/ulan/host/ul_drv/README b/ulan/host/ul_drv/README
new file mode 100644 (file)
index 0000000..9edf318
--- /dev/null
@@ -0,0 +1,89 @@
+ul_drv - uLan RS-485 communication driver
+
+Copyright (C) 1999 Pavel Pisa  (pisa@cmp.felk.cvut.cz)
+
+uLan provides 9-bit message oriented communication protocol,
+which is transfered over RS-485 link. Characters are transfered
+same way as for RS-232 asynchronous transfer except parity
+bit, which is used to distinguish between data characters
+and protocol control information. Physical layer consist
+of one twisted pair of leads and RS-485 transceivers.
+
+ul_drv is Linux device driver designed to access uLan network. 
+Latest versions of the ul_drv can be compiled from same 
+source into Windows NT KMD driver too (try to use ul_drv.mak).
+Today supported hardware is i82510 RS-485 card or simple
+active converter dongle for standard PC RS-232 ports.
+This version of driver was compiled and tested with 
+Linux 2.2.4 kernel. Header file k_compat.h should enable
+compilation for most of 2.0.xx, 2.1.xx and 2.2.xx kernels,
+but tweaking of k_compat.h may be necessary for some
+2.1.xx kernel versions.
+
+Makefile is link to Makefile-mod to compile driver with
+your kernel configuration. Makefile-mod expect, that
+kernel sources are in "/usr/src/linux" directory
+and that kernel sources and its configuration 
+are of same version as current running kernel.
+Enter next command in ul_drv directory to compile and
+install the module
+
+    make install
+
+Module is installed into "/lib/modules/x.y.z/misc" directory.
+
+Driver can control up to four devices, but only check
+for 0x3e8 port number is default behavior after "insmod ul_drv".
+Because of driver controls same hardware as Linux serial
+driver, it is necessary to disable default kernel driver
+for same port in case of conflict. It can be done for example by
+
+    setserial /dev/ttyS2 uart none
+
+Port numbers and others parameters can be defined by module 
+parameters. To access driver from programs special character
+device files must be created. Suggested names are
+
+    mknod /dev/ulan0 c 248 0
+    mknod /dev/ulan1 c 248 1
+    ln -sf /dev/ulan0 /dev/ulan
+
+"/dev/ulan" is default name for client programs.
+Major number 248 is in experimental range and will
+be changed in future. Number is defined in ul_hdep.h.
+If defined as zero, dynamic number is assigned after insmod.
+
+ul_drv module parameters
+
+  port=<iop>{,<iop> ...}
+       up to four IO port numbers separated by comas
+        for up to four uLan devices
+
+  irq=<int>{,<int> ...}
+       select for every defined device corresponding
+       IRQ number. Value 0 means autoprobe.
+
+  baud=<spd>{,<spd> ...}
+       defines transfer baud-rate for every device
+       default value is 9600
+
+  my_adr=<adr>{,<adr> ...}
+       address of every computer interface as seen
+       from uLan network 
+       range is from 1 to 64
+       default value is 2 for all interfaces
+
+
+Bellow are example parameters for dongle converter plugged
+to regular COM2 port.
+
+    setserial /dev/ttyS1 uart none
+    insmod ul_drv port=0x2f8 irq=3 baud=9600 my_adr=2
+
+Add next lines to /etc/modules.conf to enable on-demand
+module loading
+
+    alias    char-major-248 ul_drv
+    options    ul_drv port=0x2f8 irq=3 baud=9600 my_adr=2
+    pre-install ul_drv /sbin/setserial /dev/ttyS1 uart none
+
diff --git a/ulan/host/ul_drv/config/CVS/Entries b/ulan/host/ul_drv/config/CVS/Entries
new file mode 100644 (file)
index 0000000..1cf24a2
--- /dev/null
@@ -0,0 +1,3 @@
+D/djgpp////
+D/linux////
+D/winnt////
diff --git a/ulan/host/ul_drv/config/CVS/Repository b/ulan/host/ul_drv/config/CVS/Repository
new file mode 100644 (file)
index 0000000..972c635
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/config
diff --git a/ulan/host/ul_drv/config/CVS/Root b/ulan/host/ul_drv/config/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/config/djgpp/CVS/Entries b/ulan/host/ul_drv/config/djgpp/CVS/Entries
new file mode 100644 (file)
index 0000000..6223cf1
--- /dev/null
@@ -0,0 +1,2 @@
+/getopt.h/1.1.1.1/Fri Sep 10 17:46:33 2004//
+D
diff --git a/ulan/host/ul_drv/config/djgpp/CVS/Repository b/ulan/host/ul_drv/config/djgpp/CVS/Repository
new file mode 100644 (file)
index 0000000..5d3e14c
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/config/djgpp
diff --git a/ulan/host/ul_drv/config/djgpp/CVS/Root b/ulan/host/ul_drv/config/djgpp/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/config/djgpp/getopt.h b/ulan/host/ul_drv/config/djgpp/getopt.h
new file mode 100644 (file)
index 0000000..fb30719
--- /dev/null
@@ -0,0 +1,133 @@
+/* Declarations for getopt.
+   Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+
+   NOTE: The canonical source of this file is maintained with the GNU C Library.
+   Bugs can be reported to bug-glibc@gnu.org.
+
+   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, 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 _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if defined (__STDC__) && __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if defined (__STDC__) && __STDC__
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* getopt.h */
diff --git a/ulan/host/ul_drv/config/linux/10-ulan.rules b/ulan/host/ul_drv/config/linux/10-ulan.rules
new file mode 100644 (file)
index 0000000..c59a329
--- /dev/null
@@ -0,0 +1,5 @@
+# uLan driver
+
+SUBSYSTEM=="ulan",GROUP="users",MODE="0660"
+KERNEL=="ttyS0",RUN+="/bin/setserial /dev/ttyS0 uart none"
+ACTION=="add",DEVPATH=="/class/ulan/ulan0",SYMLINK="ulan"
\ No newline at end of file
diff --git a/ulan/host/ul_drv/config/linux/CVS/Entries b/ulan/host/ul_drv/config/linux/CVS/Entries
new file mode 100644 (file)
index 0000000..1d054d7
--- /dev/null
@@ -0,0 +1,3 @@
+/10-ulan.rules/1.2/Sun Jan  7 14:43:31 2007//
+/ulan/1.1/Sun Jan  7 14:43:31 2007//
+D
diff --git a/ulan/host/ul_drv/config/linux/CVS/Repository b/ulan/host/ul_drv/config/linux/CVS/Repository
new file mode 100644 (file)
index 0000000..989cccc
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/config/linux
diff --git a/ulan/host/ul_drv/config/linux/CVS/Root b/ulan/host/ul_drv/config/linux/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/config/linux/ulan b/ulan/host/ul_drv/config/linux/ulan
new file mode 100644 (file)
index 0000000..c474b99
--- /dev/null
@@ -0,0 +1,2 @@
+alias   /dev/ulan*  ul_drv
+options ul_drv port=0x3f8 irq=4 my_adr=2 baud=19200
\ No newline at end of file
diff --git a/ulan/host/ul_drv/config/winnt/CVS/Entries b/ulan/host/ul_drv/config/winnt/CVS/Entries
new file mode 100644 (file)
index 0000000..9250e90
--- /dev/null
@@ -0,0 +1,18 @@
+/drvenv.bat/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/drvenv2k.bat/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/getopt.h/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/isa98_com4_9600.reg/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/pnp98_com2_9600.reg/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/smingw32.bat/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/ul_w98_1.reg/1.1.1.1/Fri Sep 10 17:46:28 2004//
+/ul_w98_2.reg/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/ul_w98_3.reg/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/ul_w98_4.reg/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/ul_wdm.ine/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/ul_wdm.inf/1.7/Sun Jan 27 19:09:38 2008//
+/ul_wdm.sys/1.7/Sun Jan 27 22:17:21 2008//
+/ul_wdm9600.ine/1.1.1.1/Fri Sep 10 17:46:32 2004//
+/ulanclass.dll/1.1/Fri Oct 22 13:39:53 2004//
+/ulanpp.dll/1.1/Fri Oct 22 13:39:53 2004//
+/wdfenv.bat/1.1/Sun Oct 29 11:23:36 2006//
+D
diff --git a/ulan/host/ul_drv/config/winnt/CVS/Repository b/ulan/host/ul_drv/config/winnt/CVS/Repository
new file mode 100644 (file)
index 0000000..dd091a4
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/config/winnt
diff --git a/ulan/host/ul_drv/config/winnt/CVS/Root b/ulan/host/ul_drv/config/winnt/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/config/winnt/drvenv.bat b/ulan/host/ul_drv/config/winnt/drvenv.bat
new file mode 100644 (file)
index 0000000..7527100
--- /dev/null
@@ -0,0 +1,15 @@
+@ECHO OFF\r
+\r
+REM SET MSVC60ROOT=E:\MorePrograms\MSVisualStudio\r
+REM SET DDKROOT=E:\NTDDK\r
+\r
+IF "%MSVC60ROOT%"=="" SET MSVC60ROOT=%SystemDrive%\Program Files\Microsoft Visual Studio\r
+SET PATH=%MSVC60ROOT%\Common\MSDev98\Bin;%PATH%\r
+SET PATH=%MSVC60ROOT%\Vc98\Bin;%PATH%\r
+SET INCLUDE=%MSVC60ROOT%\Vc98\Include;%INCLUDE%\r
+SET LIB=%MSVC60ROOT%\Vc98\Lib;%LIB%\r
+\r
+IF "%DDKROOT%"=="" SET DDKROOT=%SystemDrive%\WinDDK\2195\r
+SET INCLUDE=%DDKROOT%\INC;%INCLUDE%\r
+SET LIB=%DDKROOT%\LIB\i386\free;%LIB%\r
+SET PATH=%DDKROOT%\BIN;%PATH%\r
diff --git a/ulan/host/ul_drv/config/winnt/drvenv2k.bat b/ulan/host/ul_drv/config/winnt/drvenv2k.bat
new file mode 100644 (file)
index 0000000..315bbb0
--- /dev/null
@@ -0,0 +1,14 @@
+@ECHO OFF\r
+\r
+IF "%MSVC60ROOT%"=="" SET MSVC60ROOT=%SystemDrive%\Program Files\Microsoft Visual Studio\r
+SET PATH=%MSVC60ROOT%\Common\MSDev98\Bin;%PATH%\r
+SET PATH=%MSVC60ROOT%\Vc98\Bin;%PATH%\r
+SET INCLUDE=%MSVC60ROOT%\Vc98\Include;%INCLUDE%\r
+SET LIB=%MSVC60ROOT%\Vc98\Lib;%LIB%\r
+\r
+IF "%DDKROOT%"=="" SET DDKROOT=%SystemDrive%\WinDDK\2195\r
+SET INCLUDE=%DDKROOT%\INC;%INCLUDE%\r
+SET INCLUDE=%DDKROOT%\INC\DDK;%INCLUDE%\r
+SET INCLUDE=%DDKROOT%\INC\DDK\WDM;%INCLUDE%\r
+SET LIB=%DDKROOT%\LIBFRE\i386;%LIB%\r
+SET PATH=%DDKROOT%\BIN;%PATH%\r
diff --git a/ulan/host/ul_drv/config/winnt/getopt.h b/ulan/host/ul_drv/config/winnt/getopt.h
new file mode 100644 (file)
index 0000000..fb30719
--- /dev/null
@@ -0,0 +1,133 @@
+/* Declarations for getopt.
+   Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+
+   NOTE: The canonical source of this file is maintained with the GNU C Library.
+   Bugs can be reported to bug-glibc@gnu.org.
+
+   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, 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 _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if defined (__STDC__) && __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if defined (__STDC__) && __STDC__
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* getopt.h */
diff --git a/ulan/host/ul_drv/config/winnt/isa98_com4_9600.reg b/ulan/host/ul_drv/config/winnt/isa98_com4_9600.reg
new file mode 100644 (file)
index 0000000..fbde241
--- /dev/null
@@ -0,0 +1,5 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\Root\Unknown\0000]\r
+"uLanBaudrate"=dword:00002580\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/pnp98_com2_9600.reg b/ulan/host/ul_drv/config/winnt/pnp98_com2_9600.reg
new file mode 100644 (file)
index 0000000..ed07bd9
--- /dev/null
@@ -0,0 +1,5 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501\00000002]\r
+"uLanBaudrate"=dword:00002580\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/smingw32.bat b/ulan/host/ul_drv/config/winnt/smingw32.bat
new file mode 100644 (file)
index 0000000..929685e
--- /dev/null
@@ -0,0 +1,7 @@
+rem mingw32\r
+set MINGW32_ROOT=%SystemDrive%\mingw32\r
+set PATH=%MINGW32_ROOT%\bin;%PATH%\r
+set C_INCLUDE_PATH=%MINGW32_ROOT%\include\r
+set CPLUS_INCLUDE_PATH=%MINGW32_ROOT%\include\g++;C:\MINGW32\include\r
+set LIBRARY_PATH=%MINGW32_ROOT%\lib\r
+set GCC_EXEC_PREFIX=%MINGW32_ROOT%\lib\gcc-lib\\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_w98_1.reg b/ulan/host/ul_drv/config/winnt/ul_w98_1.reg
new file mode 100644 (file)
index 0000000..5cdcd67
--- /dev/null
@@ -0,0 +1,30 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501]\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501\00000001]\r
+"Capabilities"=hex:14,00,00,00\r
+"HardwareID"="ACPI\\*PNP0501,*PNP0501"\r
+"ClassGUID"="{4d36e97e-e325-11ce-bfc1-08002be10318}"\r
+"Class"="Unknown"\r
+"Driver"="Ports\\0001"\r
+"Mfg"="(Standard serial ports)"\r
+"DeviceDesc"="Serial Communication Port - uLan 501"\r
+"ConfigFlags"=hex:00,00,00,00\r
+"PORTNAME"="COM1"\r
+"FRIENDLYNAME"="Komunikaèní port (COM1)"\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501\00000001\LogConfig]\r
+"0000"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,ff,ff,08,00,f8,03,ff,03,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,10,00,00,00,00,00,00,00\r
+"0001"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,ff,ff,08,00,f8,02,ff,02,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,08,00,00,00,00,00,00,00\r
+"0002"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,ff,ff,08,00,e8,03,ef,03,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,10,00,00,00,00,00,00,00\r
+"0003"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,ff,ff,08,00,e8,02,ef,02,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,08,00,00,00,00,00,00,00\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_w98_2.reg b/ulan/host/ul_drv/config/winnt/ul_w98_2.reg
new file mode 100644 (file)
index 0000000..ff5612a
--- /dev/null
@@ -0,0 +1,39 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Ports]\r
+@="Porty (COM A LPT)"\r
+"Icon"="-23"\r
+"Link"="{4d36e978-e325-11ce-bfc1-08002be10318}"\r
+\r
+[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Ports\0000]\r
+"DevLoader"="*vcomm"\r
+"Enumerator"="lptenum.vxd"\r
+"Contention"="*vpd"\r
+"PortDriver"="lpt.vxd"\r
+"PortSubClass"=hex:00\r
+"ECPDevice"=hex:01\r
+"InfPath"="MSPORTS.INF"\r
+"InfSection"="EcpPort"\r
+"ProviderName"="Microsoft"\r
+"DriverDate"=" 5- 5-1999"\r
+"DriverDesc"="Port tiskárny ECP"\r
+"MatchingDeviceId"="*PNP0401"\r
+\r
+[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Ports\0001]\r
+"DevLoader"="*ntkern"\r
+"Enumerator"="serenum.vxd"\r
+"PortDriver"="serial.vxd"\r
+"Contention"="*vcd"\r
+"ConfigDialog"="serialui.dll"\r
+"DCB"=hex:1c,00,00,00,80,25,00,00,11,33,00,00,00,00,0a,00,0a,00,08,00,00,11,13,\\r
+  00,00,00\r
+"PortSubClass"=hex:01\r
+"EnumPropPages"="serialui.dll,EnumPropPages"\r
+"InfPath"="PAVELP~1.INF"\r
+"InfSection"="uLanComPort"\r
+"ProviderName"="Pavel Pisa under GNU GPL license"\r
+"DriverDesc"="Serial Communication Port - uLan 501"\r
+"MatchingDeviceId"="*PNP0501"\r
+"NTMPDriver"="ul_wdm.sys"\r
+"DriverDate"="10-13-2001"\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_w98_3.reg b/ulan/host/ul_drv/config/winnt/ul_w98_3.reg
new file mode 100644 (file)
index 0000000..7e4052a
--- /dev/null
@@ -0,0 +1,29 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501\00000002]\r
+"Capabilities"=hex:14,00,00,00\r
+"HardwareID"="ACPI\\*PNP0501,*PNP0501"\r
+"ClassGUID"="{4d36e97e-e325-11ce-bfc1-08002be10318}"\r
+"Class"="Unknown"\r
+"Driver"="Ports\\0002"\r
+"Mfg"="(Standard serial ports)"\r
+"DeviceDesc"="Serial Communication Port - uLan 501"\r
+"ConfigFlags"=hex:00,00,00,00\r
+"PORTNAME"="COM2"\r
+"FRIENDLYNAME"="Komunikaèní port (COM2)"\r
+"uLanBaudrate"=dword:00002580\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\ACPI\*PNP0501\00000002\LogConfig]\r
+"0000"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,1d,01,\\r
+  00,00,00,00,00,00,f8,ff,08,00,f8,03,ff,03,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,04,00,10,00,00,00,00,00,00,00\r
+"0001"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,f8,02,\\r
+  ff,02,00,00,00,00,f8,ff,08,00,f8,02,ff,02,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,03,00,08,00,00,00,00,00,00,00\r
+"0002"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,f8,ff,08,00,e8,03,ef,03,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,10,00,00,00,00,00,00,00\r
+"0003"=hex:00,04,00,00,00,30,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,\\r
+  00,00,00,00,00,00,f8,ff,08,00,e8,02,ef,02,00,00,00,00,10,00,00,00,04,00,00,\\r
+  00,01,00,00,00,08,00,00,00,00,00,00,00\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_w98_4.reg b/ulan/host/ul_drv/config/winnt/ul_w98_4.reg
new file mode 100644 (file)
index 0000000..f390575
--- /dev/null
@@ -0,0 +1,27 @@
+REGEDIT4\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\Root\Unknown\0000]\r
+"Class"="Unknown"\r
+"Driver"="Unknown\\0000"\r
+"Mfg"="PiKRON Ltd."\r
+"HardwareID"="ISA_82C510_SIO1"\r
+"ClassGUID"="{4d36e97e-e325-11ce-bfc1-08002be10318}"\r
+"DeviceDesc"="Serial ISA Card with 82C510 - uLan"\r
+"ConfigFlags"=hex:04,00,00,00\r
+"ForcedConfig"=hex:00,04,00,00,00,00,00,00,20,00,00,00,02,00,00,00,01,00,02,00,\\r
+  e8,02,ef,02,00,00,00,00,f0,ff,08,00,e8,02,e8,02,ee,01,78,02,10,00,00,00,04,\\r
+  00,00,00,01,00,05,00,00,00,00,00,00,00,00,00\r
+"Capabilities"=hex:14,00,00,00\r
+"uLanBaudrate"=dword:00002580\r
+\r
+[HKEY_LOCAL_MACHINE\Enum\Root\Unknown\0000\LogConfig]\r
+"0"=hex:0a,04,00,00,00,c0,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,00,\\r
+  00,00,00,00,00,ff,ff,08,00,e8,02,ef,02,00,00,00,03,10,00,00,00,04,00,00,00,\\r
+  01,00,00,00,20,00,00,00,00,00,00,00\r
+"1"=hex:0a,04,00,00,00,c0,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,00,\\r
+  00,00,00,00,00,ff,ff,08,00,e8,03,ef,03,00,00,00,03,10,00,00,00,04,00,00,00,\\r
+  01,00,00,00,20,00,00,00,00,00,00,00\r
+"2"=hex:0a,04,00,00,00,c0,00,00,20,00,00,00,02,00,00,00,01,00,0c,00,00,00,00,\\r
+  00,00,00,00,00,f8,ff,08,00,00,01,ff,ff,00,00,00,03,10,00,00,00,04,00,00,00,\\r
+  01,00,00,00,b8,de,00,00,00,00,00,00\r
+\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_wdm.ine b/ulan/host/ul_drv/config/winnt/ul_wdm.ine
new file mode 100644 (file)
index 0000000..ed375c9
--- /dev/null
@@ -0,0 +1,342 @@
+;*******************************************************************\r
+; uLan Communication - low level and link driver\r
+;\r
+; ul_wdm.inf   - uLan Window Mode Driver for Win2000/98  \r
+;\r
+; (C) Copyright 2001 by Pavel Pisa \r
+;\r
+; The uLan driver is distributed under the Gnu General Public Licence. \r
+; See file COPYING for details.\r
+;\r
+;*******************************************************************/\r
+\r
+[version]\r
+Signature="$CHICAGO$"\r
+Class=Unknown\r
+;Class=Ports\r
+;uLan WDM Driver GUID\r
+;ClassGUID={3EF4F782-AF00-11d5-87B2-00D0595444D7}\r
+;// {3EF4F782-AF00-11d5-87B2-00D0595444D7}\r
+;DEFINE_GUID(GUID_ULAN_WDM_DRIVER1, \r
+; 0x3ef4f782, 0xaf00, 0x11d5, 0x87, 0xb2, 0x0, 0xd0, 0x59, 0x54, 0x44, 0xd7);\r
+Provider=%PROVIDER%\r
+DriverVer=07/16/2002, 0.6.6\r
+\r
+[DestinationDirs]\r
+; 10 Winxx = %windir%\r
+; 11 Win2k = %windir%\system32\r
+; 11 Win98 = %windir%\system\r
+; 12 Win2k = %windir%\system32\drivers \r
+; 12 Win98 = %windir%\system\IoSubsys\r
+DefaultDestDir=11\r
+; Required by Win98 \r
+uLanComPort.Copy=10,system32\drivers\r
+uLanComPort.NT.Copy=12\r
+\r
+[ControlFlags]\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9501\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9511\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9521\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_950A\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_950B\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_8401\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9512\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9510\r
+ExcludeFromSelect=PCI\VEN_13FE&DEV_1600\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8004\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8005\r
+\r
+\r
+; Drivers\r
+;----------------------------------------------------------\r
+\r
+[Manufacturer]\r
+%OxfordSemi%=OxfordSemi\r
+%PiKRON%=PiKRON\r
+%Std%=Std\r
+%Tedia%=Tedia\r
+\r
+\r
+[Std]\r
+%*PNP0500.DeviceDesc% = uLanComPort, *PNP0500  ; Communications Port\r
+%*PNP0501.DeviceDesc% = uLanComPort, *PNP0501  ; Communications Port\r
+\r
+[OxfordSemi]\r
+%PCI\VEN_1415&DEV_9501.DeviceDesc% = PCI_9501, PCI\VEN_1415&DEV_9501\r
+%PCI\VEN_1415&DEV_950A.DeviceDesc% = PCI_950A, PCI\VEN_1415&DEV_950A\r
+%PCI\VEN_13FE&DEV_1600.DeviceDesc% = PCI_9501, PCI\VEN_13FE&DEV_1600\r
+%PCI\VEN_1415&DEV_9510.DeviceDesc% = NoDrv,    PCI\VEN_1415&DEV_9510\r
+\r
+[Tedia]\r
+%PCI\VEN_1760&DEV_8004.DeviceDesc% = PCI_950A, PCI\VEN_1760&DEV_8004\r
+%PCI\VEN_1760&DEV_8005.DeviceDesc% = NoDrv,    PCI\VEN_1760&DEV_8005\r
+\r
+[PiKRON]\r
+%uLan82C510.DeviceDesc% = uLan82C510Port, ISA_82C510_SIO1  ; ISA uLan CARD\r
+\r
+\r
+; COM sections\r
+;----------------------------------------------------------\r
+\r
+[uLanComPort]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=c14,c1a,c23,c2a,c34,c3a,c43,c4a,caa\r
+\r
+[uLanComPort.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.AddReg]\r
+HKR,,PortDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+;HKR,,DCB,3,1C,00,00,00, 80,25,00,00, 11,33,00,00, 00,00, 0a,00, 0a,00, 08, 00, 00, 11, 13, 00, 00, 00\r
+\r
+[uLanComPort.AddReg]\r
+HKR,,DevLoader,,*ntkern\r
+HKR,,NTMPDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+\r
+[uLanComPort.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLanComPort.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+[uL_WDM_Service_Inst]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %10%\system32\drivers\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+[uL_WDM_Service_Inst_NT]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %12%\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+\r
+\r
+[*pnp0500.det]\r
+AddReg=Ports.AddReg,DevMap.AddReg\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = c (COM port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[c14]                   ; COM1,IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c1a]                   ; COM1, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c23]                   ; COM2, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3\r
+\r
+[c2a]                   ; COM2, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c34]                   ; COM3, IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c3a]                   ; COM3, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c43]                   ; COM4, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,5\r
+\r
+[c4a]                   ; COM4, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[caa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+; End COM port LogConfig sections\r
+\r
+[uLanComPort.PosDup]\r
+; Note: don't include *PNP051x\r
+*PNP0500,*PNP0501\r
+\r
+\r
+; "NoDrv" section: We do not yet support these port devices.\r
+;----------------------------------------------------------\r
+[NoDrv]\r
+\r
+[NoDrv.Services]\r
+AddService = ,2    ; no value for the service name\r
+\r
+;Install OX16PCI954 quad UART\r
+;----------------------------------------------------------\r
+\r
+[PCI_9501]\r
+DriverVer=09/22/2001, 0.6.6\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_9501.HW]\r
+AddReg=PCI_9501.HW.AddReg\r
+\r
+[PCI_9501.HW.AddReg]\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+\r
+[PCI_9501.NT]\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_9501.NT.HW]\r
+AddReg=PCI_9501.NT.HW.AddReg\r
+\r
+[PCI_9501.NT.HW.AddReg]\r
+HKR,,"OxsemiDeviceType",       0x00010001,     0x95010000\r
+\r
+[PCI_9501.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_9501.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+\r
+;Install OX16PCI954 dual UART\r
+;----------------------------------------------------------\r
+\r
+[PCI_950A]\r
+DriverVer=09/22/2001, 0.6.6\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_950A.HW]\r
+AddReg=PCI_950A.HW.AddReg\r
+\r
+[PCI_950A.HW.AddReg]\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+\r
+[PCI_950A.NT]\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_950A.NT.HW]\r
+AddReg=PCI_950A.NT.HW.AddReg\r
+\r
+[PCI_950A.NT.HW.AddReg]\r
+HKR,, "OxsemiDeviceType",      0x00010001,     0x95010000\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+\r
+[PCI_950A.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_950A.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+; ISA uLan 82C510 card sections\r
+;----------------------------------------------------------\r
+[uLan82C510Port]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=u45,u35,uaa\r
+\r
+[uLan82C510Port.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLan82C510Port.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = u (uLan card port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[u45]                   ; COM4, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[u35]                   ; COM3, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[uaa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+\r
+; User readable strings\r
+;----------------------------------------------------------\r
+\r
+[Strings]\r
+PROVIDER="Pavel Pisa under GNU GPL license"\r
+Std = "(Standard serial ports)"\r
+OxfordSemi="(Enhanced ports OX16C954)"\r
+PiKRON="PiKRON Ltd."\r
+Tedia="Tedia spol. s r.o."\r
+\r
+*PNP0500.DeviceDesc = "Serial Communication Port - uLan 500"\r
+*PNP0501.DeviceDesc = "Serial Communication Port - uLan 501"\r
+uLan82C510.DeviceDesc= "Serial ISA Card with 82C510 - uLan"\r
+\r
+PCI\VEN_1415&DEV_9501.DeviceDesc="OX16PCI954 PCI UARTs - uLan Mode"\r
+PCI\VEN_1415&DEV_9511.DeviceDesc="OX16PCI954 PCI bridge"\r
+PCI\VEN_1415&DEV_9512.DeviceDesc="OX16PCI954 32-bit PCI bridge"\r
+PCI\VEN_1415&DEV_950A.DeviceDesc="OX16PCI954 Dual PCI UART - uLan Mode"\r
+PCI\VEN_1415&DEV_950B.DeviceDesc="OXCB950 Cardbus UART"\r
+PCI\VEN_1415&DEV_8401.DeviceDesc="OX9162 PCI bridge"\r
+PCI\VEN_1415&DEV_9521.DeviceDesc="OX16PCI952 PCI UARTs"\r
+\r
+PCI\VEN_13FE&DEV_1600.DeviceDesc="OX16PCI954 Advantech PCI UARTs - uLan Mode"\r
+\r
+PCI\VEN_1415&DEV_9500.DeviceDesc="PCI Function"\r
+PCI\VEN_1415&DEV_9510.DeviceDesc="PCI Function"\r
+\r
+PCI\VEN_1760&DEV_8004.DeviceDesc="Tedia PCI-1482 OX16PCI954 UARTs - uLan Mode"\r
+PCI\VEN_1760&DEV_8005.DeviceDesc="Tedia Unused PCI Function"\r
+\r
+SERVICE_DESCSTRING     = "uL_WDM - uLan WDM Driver"\r
+SPSVCINST_ASSOCSERVICE = 0x00000002\r
+SERVICE_KERNEL_DRIVER  = 1\r
+SERVICE_MANUAL_START   = 3\r
+SERVICE_ERROR_NORMAL   = 1\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_wdm.inf b/ulan/host/ul_drv/config/winnt/ul_wdm.inf
new file mode 100644 (file)
index 0000000..8789587
--- /dev/null
@@ -0,0 +1,410 @@
+;*******************************************************************\r
+; uLan Communication - low level and link driver\r
+;\r
+; ul_wdm.inf   - uLan Window Mode Driver for Win2000/98  \r
+;\r
+; (C) Copyright 2001 by Pavel Pisa \r
+;\r
+; The uLan driver is distributed under the Gnu General Public Licence. \r
+; See file COPYING for details.\r
+;\r
+;*******************************************************************/\r
+\r
+[version]\r
+Signature="$CHICAGO$"\r
+Class=uLan\r
+;uLan WDM Driver GUID\r
+ClassGUID={3EF4F782-AF00-11d5-87B2-00D0595444D7}\r
+;DEFINE_GUID(GUID_ULAN_WDM_DRIVER1, \r
+; 0x3ef4f782, 0xaf00, 0x11d5, 0x87, 0xb2, 0x0, 0xd0, 0x59, 0x54, 0x44, 0xd7);\r
+Provider=%PROVIDER%\r
+DriverVer=01/27/2008, 0.7.3\r
+\r
+; ================= Class section =====================\r
+[ClassInstall32.NT]\r
+Addreg=uLanClassReg\r
+CopyFiles=uLanClassCopy\r
+\r
+[uLanClassReg]\r
+HKR,,,,%ClassName%\r
+HKR,,Icon,,101\r
+HKR,,Installer32,,"ulanclass.dll,ClassInstall"\r
+\r
+[uLanClassCopy]\r
+ulanclass.dll,,0x00000020\r
+\r
+; ================= Device Install section ===================== \r
+[DestinationDirs]\r
+; 10 Winxx = %windir%\r
+; 11 Win2k = %windir%\system32\r
+; 11 Win98 = %windir%\system\r
+; 12 Win2k = %windir%\system32\drivers \r
+; 12 Win98 = %windir%\system\IoSubsys\r
+DefaultDestDir=11\r
+; Required by Win98 \r
+uLanComPort.Copy=10,system32\drivers\r
+uLanComPort.NT.Copy=12\r
+uLanDll.Copy=11 ; added by RB 14.10.03\r
+\r
+[ControlFlags]\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9501\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9511\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9521\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_950A\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_950B\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_8401\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9512\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9510\r
+ExcludeFromSelect=PCI\VEN_13FE&DEV_1600\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8004\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8005\r
+ExcludeFromSelect=USB\VID_DEAD&PID_1001\r
+ExcludeFromSelect=USB\VID_1669&PID_1001\r
+ExcludeFromSelect=USB\VID_1669&PID_1002\r
+ExcludeFromSelect=USB\VID_1669&PID_1003\r
+\r
+; ================= Drivers =====================\r
+\r
+[Manufacturer]\r
+%OxfordSemi%=OxfordSemi\r
+%PiKRON%=PiKRON\r
+%Std%=Std\r
+%Tedia%=Tedia\r
+\r
+\r
+[Std]\r
+%*PNP0500.DeviceDesc% = uLanComPort, *PNP0500  ; Communications Port\r
+%*PNP0501.DeviceDesc% = uLanComPort, *PNP0501  ; Communications Port\r
+\r
+[OxfordSemi]\r
+%PCI\VEN_1415&DEV_9501.DeviceDesc% = PCI_9501, PCI\VEN_1415&DEV_9501\r
+%PCI\VEN_1415&DEV_950A.DeviceDesc% = PCI_950A, PCI\VEN_1415&DEV_950A\r
+%PCI\VEN_13FE&DEV_1600.DeviceDesc% = PCI_9501, PCI\VEN_13FE&DEV_1600\r
+%PCI\VEN_1415&DEV_9510.DeviceDesc% = NoDrv,    PCI\VEN_1415&DEV_9510\r
+\r
+[Tedia]\r
+%PCI\VEN_1760&DEV_8004.DeviceDesc% = PCI_950A, PCI\VEN_1760&DEV_8004\r
+%PCI\VEN_1760&DEV_8005.DeviceDesc% = NoDrv,    PCI\VEN_1760&DEV_8005\r
+\r
+[PiKRON]\r
+%uLan82C510.DeviceDesc% = uLan82C510Port, ISA_82C510_SIO1  ; ISA uLan CARD\r
+%USB\VID_DEAD&PID_1001.DeviceDesc% = uLan2USB, USB\VID_DEAD&PID_1001\r
+%USB\VID_1669&PID_1001.DeviceDesc% = uLan2USB, USB\VID_1669&PID_1001\r
+%USB\VID_1669&PID_1002.DeviceDesc% = uLan2USB, USB\VID_1669&PID_1002\r
+%USB\VID_1669&PID_1003.DeviceDesc% = uLan2USB, USB\VID_1669&PID_1003\r
+\r
+\r
+; ================= COM sections =====================\r
+\r
+[uLanComPort]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=c14,c1a,c23,c2a,c34,c3a,c43,c4a,caa\r
+\r
+[uLanComPort.NT]\r
+CopyFiles=uLanComPort.Copy,uLanDll.Copy\r
+AddReg=uLanComPort.AddReg, uLanDll.AddReg\r
+LogConfig=c14,c1a,c23,c2a,c34,c3a,c43,c4a,caa\r
+\r
+[uLanComPort.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.AddReg]\r
+HKR,,PortDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+;HKR,,DCB,3,1C,00,00,00, 80,25,00,00, 11,33,00,00, 00,00, 0a,00, 0a,00, 08, 00, 00, 11, 13, 00, 00, 00\r
+\r
+[uLanComPort.AddReg]\r
+HKR,,DevLoader,,*ntkern\r
+HKR,,NTMPDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+\r
+[uLanComPort.NT.HW]\r
+AddReg=uLanSettings.AddReg\r
+\r
+[uLanComPort.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLanComPort.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+[uL_WDM_Service_Inst]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %10%\system32\drivers\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+[uL_WDM_Service_Inst_NT]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %12%\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+\r
+[*pnp0500.det]\r
+AddReg=Ports.AddReg,DevMap.AddReg\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = c (COM port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[c14]                   ; COM1,IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c1a]                   ; COM1, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c23]                   ; COM2, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3\r
+\r
+[c2a]                   ; COM2, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c34]                   ; COM3, IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c3a]                   ; COM3, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c43]                   ; COM4, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,5\r
+\r
+[c4a]                   ; COM4, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[caa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+; End COM port LogConfig sections\r
+\r
+[uLanComPort.PosDup]\r
+; Note: don't include *PNP051x\r
+*PNP0500,*PNP0501\r
+\r
+\r
+; "NoDrv" section: We do not yet support these port devices.\r
+;----------------------------------------------------------\r
+[NoDrv]\r
+\r
+[NoDrv.Services]\r
+AddService = ,2    ; no value for the service name\r
+\r
+; ================= OX16PCI954 quad UART =====================\r
+\r
+[PCI_9501]\r
+DriverVer=01/27/2008, 0.7.3\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_9501.HW]\r
+AddReg=PCI_9501.HW.AddReg\r
+\r
+[PCI_9501.HW.AddReg]\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+\r
+[PCI_9501.NT]\r
+CopyFiles=uLanComPort.Copy, uLanDll.Copy\r
+;CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg, uLanDll.AddReg\r
+\r
+[PCI_9501.NT.HW]\r
+AddReg=PCI_9501.NT.HW.AddReg, uLanSettings.AddReg\r
+\r
+[PCI_9501.NT.HW.AddReg]\r
+HKR,,"OxsemiDeviceType",       0x00010001,     0x95010000\r
+\r
+[PCI_9501.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_9501.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+\r
+; ================= OX16PCI954 dual UART =====================\r
+\r
+[PCI_950A]\r
+DriverVer=01/27/2008, 0.7.3\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_950A.HW]\r
+AddReg=PCI_950A.HW.AddReg\r
+\r
+[PCI_950A.HW.AddReg]\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+\r
+[PCI_950A.NT]\r
+CopyFiles=uLanComPort.Copy, uLanDll.Copy\r
+;CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg, uLanDll.AddReg\r
+\r
+[PCI_950A.NT.HW]\r
+AddReg=PCI_950A.NT.HW.AddReg, uLanSettings.AddReg\r
+\r
+[PCI_950A.NT.HW.AddReg]\r
+HKR,, "OxsemiDeviceType",      0x00010001,     0x95010000\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+\r
+[PCI_950A.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_950A.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+\r
+; ================= ISA uLan 82C510 card sections =====================\r
+[uLan82C510Port]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=u45,u35,uaa\r
+\r
+[uLan82C510Port.NT]\r
+CopyFiles=uLanComPort.Copy, uLanDll.Copy\r
+AddReg=uLanComPort.AddReg, uLanDll.AddReg\r
+LogConfig=u45,u35,uaa\r
+\r
+[uLan82C510Port.NT.HW]\r
+AddReg=uLanSettings.AddReg\r
+\r
+[uLan82C510Port.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLan82C510Port.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = u (uLan card port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[u45]                   ; COM4, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[u35]                   ; COM3, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[uaa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+\r
+; ================= uLan2USB convertor =====================\r
+[uLan2USB]\r
+DriverVer=01/27/2008, 0.7.3\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+\r
+[uLan2USB.NT]\r
+CopyFiles=uLanComPort.Copy, uLanDll.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg, uLanDll.AddReg\r
+\r
+[uLan2USB.NT.HW]\r
+AddReg=uLanSettings.AddReg\r
+\r
+[uLan2USB.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+; PropertyPage\r
+;----------------------------------------------------------\r
+[uLanDll.Copy]\r
+ulanpp.dll\r
+\r
+[uLanDll.AddReg]\r
+HKR,,EnumPropPages32,,"ulanpp.dll,PropertyPageProvider"\r
+\r
+\r
+; ================= Default uLan registry settings =====================\r
+[uLanSettings.AddReg]\r
+HKR,,"uLanBaudrate", 0x00010001,0x4b00\r
+HKR,,"uLanMyAddress", 0x00010001,0x02\r
+;HKR,,"uLanMyAddress", 0x00010001,0x3f\r
+\r
+\r
+; ================= User readable strings =====================\r
+[Strings]\r
+ClassName = "uLan adapters"\r
+PROVIDER="Pavel Pisa under GNU GPL license"\r
+Std = "(Standard serial ports)"\r
+OxfordSemi="(Enhanced ports OX16C954)"\r
+PiKRON="PiKRON Ltd."\r
+Tedia="Tedia spol. s r.o."\r
+\r
+*PNP0500.DeviceDesc = "Serial Communication Port - uLan 500"\r
+*PNP0501.DeviceDesc = "Serial Communication Port - uLan 501"\r
+uLan82C510.DeviceDesc= "Serial ISA Card with 82C510 - uLan"\r
+\r
+PCI\VEN_1415&DEV_9501.DeviceDesc="OX16PCI954 PCI UARTs - uLan Mode"\r
+PCI\VEN_1415&DEV_9511.DeviceDesc="OX16PCI954 PCI bridge"\r
+PCI\VEN_1415&DEV_9512.DeviceDesc="OX16PCI954 32-bit PCI bridge"\r
+PCI\VEN_1415&DEV_950A.DeviceDesc="OX16PCI954 Dual PCI UART - uLan Mode"\r
+PCI\VEN_1415&DEV_950B.DeviceDesc="OXCB950 Cardbus UART"\r
+PCI\VEN_1415&DEV_8401.DeviceDesc="OX9162 PCI bridge"\r
+PCI\VEN_1415&DEV_9521.DeviceDesc="OX16PCI952 PCI UARTs"\r
+\r
+PCI\VEN_13FE&DEV_1600.DeviceDesc="OX16PCI954 Advantech PCI UARTs - uLan Mode"\r
+\r
+PCI\VEN_1415&DEV_9500.DeviceDesc="PCI Function"\r
+PCI\VEN_1415&DEV_9510.DeviceDesc="PCI Function"\r
+\r
+PCI\VEN_1760&DEV_8004.DeviceDesc="Tedia PCI-1482 OX16PCI954 UARTs - uLan Mode"\r
+PCI\VEN_1760&DEV_8005.DeviceDesc="Tedia Unused PCI Function"\r
+\r
+USB\VID_DEAD&PID_1001.DeviceDesc="uLan2USB convertor (Unknown)"\r
+USB\VID_1669&PID_1001.DeviceDesc="uLan2USB convertor v1"\r
+USB\VID_1669&PID_1002.DeviceDesc="uLan2USB convertor v2"\r
+USB\VID_1669&PID_1002.DeviceDesc="uLan2USB convertor v3"\r
+\r
+SERVICE_DESCSTRING     = "uL_WDM - uLan WDM Driver"\r
+SPSVCINST_ASSOCSERVICE = 0x00000002\r
+SERVICE_KERNEL_DRIVER  = 1\r
+SERVICE_MANUAL_START   = 3\r
+SERVICE_ERROR_NORMAL   = 1\r
diff --git a/ulan/host/ul_drv/config/winnt/ul_wdm.sys b/ulan/host/ul_drv/config/winnt/ul_wdm.sys
new file mode 100644 (file)
index 0000000..76f509e
Binary files /dev/null and b/ulan/host/ul_drv/config/winnt/ul_wdm.sys differ
diff --git a/ulan/host/ul_drv/config/winnt/ul_wdm9600.ine b/ulan/host/ul_drv/config/winnt/ul_wdm9600.ine
new file mode 100644 (file)
index 0000000..c4f176f
--- /dev/null
@@ -0,0 +1,354 @@
+;*******************************************************************\r
+; uLan Communication - low level and link driver\r
+;\r
+; ul_wdm.inf   - uLan Window Mode Driver for Win2000/98  \r
+;\r
+; (C) Copyright 2001 by Pavel Pisa \r
+;\r
+; The uLan driver is distributed under the Gnu General Public Licence. \r
+; See file COPYING for details.\r
+;\r
+;*******************************************************************/\r
+\r
+[version]\r
+Signature="$CHICAGO$"\r
+Class=Unknown\r
+;Class=Ports\r
+;uLan WDM Driver GUID\r
+;ClassGUID={3EF4F782-AF00-11d5-87B2-00D0595444D7}\r
+;// {3EF4F782-AF00-11d5-87B2-00D0595444D7}\r
+;DEFINE_GUID(GUID_ULAN_WDM_DRIVER1, \r
+; 0x3ef4f782, 0xaf00, 0x11d5, 0x87, 0xb2, 0x0, 0xd0, 0x59, 0x54, 0x44, 0xd7);\r
+Provider=%PROVIDER%\r
+DriverVer=07/16/2002, 0.6.3\r
+\r
+[DestinationDirs]\r
+; 10 Winxx = %windir%\r
+; 11 Win2k = %windir%\system32\r
+; 11 Win98 = %windir%\system\r
+; 12 Win2k = %windir%\system32\drivers \r
+; 12 Win98 = %windir%\system\IoSubsys\r
+DefaultDestDir=11\r
+; Required by Win98 \r
+uLanComPort.Copy=10,system32\drivers\r
+uLanComPort.NT.Copy=12\r
+\r
+[ControlFlags]\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9501\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9511\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9521\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_950A\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_950B\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_8401\r
+;ExcludeFromSelect=PCI\VEN_1415&DEV_9512\r
+ExcludeFromSelect=PCI\VEN_1415&DEV_9510\r
+ExcludeFromSelect=PCI\VEN_13FE&DEV_1600\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8004\r
+ExcludeFromSelect=PCI\VEN_1760&DEV_8005\r
+\r
+\r
+; Drivers\r
+;----------------------------------------------------------\r
+\r
+[Manufacturer]\r
+%OxfordSemi%=OxfordSemi\r
+%PiKRON%=PiKRON\r
+%Std%=Std\r
+%Tedia%=Tedia\r
+\r
+\r
+[Std]\r
+%*PNP0500.DeviceDesc% = uLanComPort, *PNP0500  ; Communications Port\r
+%*PNP0501.DeviceDesc% = uLanComPort, *PNP0501  ; Communications Port\r
+\r
+[OxfordSemi]\r
+%PCI\VEN_1415&DEV_9501.DeviceDesc% = PCI_9501, PCI\VEN_1415&DEV_9501\r
+%PCI\VEN_1415&DEV_950A.DeviceDesc% = PCI_950A, PCI\VEN_1415&DEV_950A\r
+%PCI\VEN_13FE&DEV_1600.DeviceDesc% = PCI_9501, PCI\VEN_13FE&DEV_1600\r
+%PCI\VEN_1415&DEV_9510.DeviceDesc% = NoDrv,    PCI\VEN_1415&DEV_9510\r
+\r
+[Tedia]\r
+%PCI\VEN_1760&DEV_8004.DeviceDesc% = PCI_950A, PCI\VEN_1760&DEV_8004\r
+%PCI\VEN_1760&DEV_8005.DeviceDesc% = NoDrv,    PCI\VEN_1760&DEV_8005\r
+\r
+[PiKRON]\r
+%uLan82C510.DeviceDesc% = uLan82C510Port, ISA_82C510_SIO1  ; ISA uLan CARD\r
+\r
+\r
+; COM sections\r
+;----------------------------------------------------------\r
+\r
+[uLanComPort]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=c14,c1a,c23,c2a,c34,c3a,c43,c4a,caa\r
+\r
+[uLanComPort.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.Copy]\r
+ul_wdm.sys\r
+;serialui.dll\r
+\r
+[uLanComPort.NT.AddReg]\r
+HKR,,PortDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+;HKR,,DCB,3,1C,00,00,00, 80,25,00,00, 11,33,00,00, 00,00, 0a,00, 0a,00, 08, 00, 00, 11, 13, 00, 00, 00\r
+\r
+[uLanComPort.AddReg]\r
+HKR,,DevLoader,,*ntkern\r
+HKR,,NTMPDriver,,ul_wdm.sys\r
+;HKR,,ConfigDialog,,serialui.dll\r
+\r
+[uLanComPort.HW]\r
+AddReg=uLanComPort.HW.AddReg\r
+\r
+[uLanComPort.HW.AddReg]\r
+HKR,,"uLanBaudrate", 0x00010001,       0x2580\r
+\r
+[uLanComPort.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLanComPort.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+[uL_WDM_Service_Inst]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %10%\system32\drivers\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+[uL_WDM_Service_Inst_NT]\r
+DisplayName   = %SERVICE_DESCSTRING%\r
+ServiceType   = %SERVICE_KERNEL_DRIVER%\r
+StartType     = %SERVICE_MANUAL_START%\r
+ErrorControl  = %SERVICE_ERROR_NORMAL%\r
+ServiceBinary = %12%\ul_wdm.sys\r
+;LoadOrderGroup = Extended base\r
+\r
+\r
+\r
+[*pnp0500.det]\r
+AddReg=Ports.AddReg,DevMap.AddReg\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = c (COM port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[c14]                   ; COM1,IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c1a]                   ; COM1, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3f8-3ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c23]                   ; COM2, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3\r
+\r
+[c2a]                   ; COM2, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2f8-2ff(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c34]                   ; COM3, IRQ4\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:4\r
+\r
+[c3a]                   ; COM3, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[c43]                   ; COM4, IRQ3\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,5\r
+\r
+[c4a]                   ; COM4, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+[caa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+; End COM port LogConfig sections\r
+\r
+[uLanComPort.PosDup]\r
+; Note: don't include *PNP051x\r
+*PNP0500,*PNP0501\r
+\r
+\r
+; "NoDrv" section: We do not yet support these port devices.\r
+;----------------------------------------------------------\r
+[NoDrv]\r
+\r
+[NoDrv.Services]\r
+AddService = ,2    ; no value for the service name\r
+\r
+;Install OX16PCI954 quad UART\r
+;----------------------------------------------------------\r
+\r
+[PCI_9501]\r
+DriverVer=09/22/2001, 0.6.3\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_9501.HW]\r
+AddReg=PCI_9501.HW.AddReg\r
+\r
+[PCI_9501.HW.AddReg]\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+HKR,,"uLanBaudrate", 0x00010001,       0x2580\r
+\r
+[PCI_9501.NT]\r
+CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_9501.NT.HW]\r
+AddReg=PCI_9501.NT.HW.AddReg\r
+\r
+[PCI_9501.NT.HW.AddReg]\r
+HKR,,"OxsemiDeviceType",       0x00010001,     0x95010000\r
+HKR,,"uLanBaudrate", 0x00010001,       0x2580\r
+\r
+[PCI_9501.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_9501.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+\r
+;Install OX16PCI954 dual UART\r
+;----------------------------------------------------------\r
+\r
+[PCI_950A]\r
+DriverVer=09/22/2001, 0.6.3\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.Copy, Inf.copy\r
+AddReg=uLanComPort.AddReg\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_950A.HW]\r
+AddReg=PCI_950A.HW.AddReg\r
+\r
+[PCI_950A.HW.AddReg]\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+HKR,,OxfordFlags,1,01,95,00,00\r
+\r
+[PCI_950A.NT]\r
+CopyFiles=uLanComPort.Copy\r
+;CopyFiles=Drv.NT.Copy, dll.NT.Copy\r
+DelReg=DriverVer.DelReg\r
+AddReg=DriverVer.AddReg\r
+\r
+[PCI_950A.NT.HW]\r
+AddReg=PCI_950A.NT.HW.AddReg\r
+[PCI_950A.NT.HW.AddReg]\r
+HKR,, "OxsemiDeviceType",      0x00010001,     0x95010000\r
+HKR,, "OxsemiPortCount",       0x00010001,     2\r
+\r
+[PCI_950A.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+[PCI_950A.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+;AddService = oxmf, 0x00000002, oxmf_Service_Inst\r
+\r
+; ISA uLan 82C510 card sections\r
+;----------------------------------------------------------\r
+[uLan82C510Port]\r
+CopyFiles=uLanComPort.Copy\r
+AddReg=uLanComPort.AddReg\r
+LogConfig=u45,u35,uaa\r
+\r
+[uLan82C510Port.HW]\r
+AddReg=uLan82C510Port.HW.AddReg\r
+\r
+[uLan82C510Port.HW.AddReg]\r
+HKR,,"uLanBaudrate", 0x00010001,       0x2580\r
+\r
+[uLan82C510Port.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst\r
+\r
+[uLan82C510Port.NT.Services]\r
+AddService = ul_wdm,%SPSVCINST_ASSOCSERVICE%,uL_WDM_Service_Inst_NT\r
+\r
+; The following sections are COM port resource configs.\r
+; Section name format means:\r
+; Char 1 = u (uLan card port)\r
+; Char 2 = I/O config: 1 (3f8), 2 (2f8), 3 (3e8), 4 (2e8), a (any)\r
+; Char 3 = IRQ config: #, a (any)\r
+\r
+[u45]                   ; COM4, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=2e8-2ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[u35]                   ; COM3, IRQ5\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=3e8-3ef(3ff::)\r
+IRQConfig=S:5\r
+\r
+[uaa]                   ; Any base, any IRQ\r
+ConfigPriority=HARDRECONFIG\r
+IOConfig=8@100-ffff%fff8(3ff::)\r
+IRQConfig=S:3,4,5,7,9,10,11,12,14,15\r
+\r
+\r
+; User readable strings\r
+;----------------------------------------------------------\r
+\r
+[Strings]\r
+PROVIDER="Pavel Pisa under GNU GPL license"\r
+Std = "(Standard serial ports)"\r
+OxfordSemi="(Enhanced ports OX16C954)"\r
+PiKRON="PiKRON Ltd."\r
+Tedia="Tedia spol. s r.o."\r
+\r
+*PNP0500.DeviceDesc = "Serial Communication Port - uLan 500"\r
+*PNP0501.DeviceDesc = "Serial Communication Port - uLan 501"\r
+uLan82C510.DeviceDesc= "Serial ISA Card with 82C510 - uLan"\r
+\r
+PCI\VEN_1415&DEV_9501.DeviceDesc="OX16PCI954 PCI UARTs - uLan Mode"\r
+PCI\VEN_1415&DEV_9511.DeviceDesc="OX16PCI954 PCI bridge"\r
+PCI\VEN_1415&DEV_9512.DeviceDesc="OX16PCI954 32-bit PCI bridge"\r
+PCI\VEN_1415&DEV_950A.DeviceDesc="OX16PCI954 Dual PCI UART - uLan Mode"\r
+PCI\VEN_1415&DEV_950B.DeviceDesc="OXCB950 Cardbus UART"\r
+PCI\VEN_1415&DEV_8401.DeviceDesc="OX9162 PCI bridge"\r
+PCI\VEN_1415&DEV_9521.DeviceDesc="OX16PCI952 PCI UARTs"\r
+\r
+PCI\VEN_13FE&DEV_1600.DeviceDesc="OX16PCI954 Advantech PCI UARTs - uLan Mode"\r
+\r
+PCI\VEN_1415&DEV_9500.DeviceDesc="PCI Function"\r
+PCI\VEN_1415&DEV_9510.DeviceDesc="PCI Function"\r
+\r
+PCI\VEN_1760&DEV_8004.DeviceDesc="Tedia PCI-1482 OX16PCI954 UARTs - uLan Mode"\r
+PCI\VEN_1760&DEV_8005.DeviceDesc="Tedia Unused PCI Function"\r
+\r
+SERVICE_DESCSTRING     = "uL_WDM - uLan WDM Driver"\r
+SPSVCINST_ASSOCSERVICE = 0x00000002\r
+SERVICE_KERNEL_DRIVER  = 1\r
+SERVICE_MANUAL_START   = 3\r
+SERVICE_ERROR_NORMAL   = 1\r
diff --git a/ulan/host/ul_drv/config/winnt/ulanclass.dll b/ulan/host/ul_drv/config/winnt/ulanclass.dll
new file mode 100644 (file)
index 0000000..2125cc2
Binary files /dev/null and b/ulan/host/ul_drv/config/winnt/ulanclass.dll differ
diff --git a/ulan/host/ul_drv/config/winnt/ulanpp.dll b/ulan/host/ul_drv/config/winnt/ulanpp.dll
new file mode 100644 (file)
index 0000000..ed81629
Binary files /dev/null and b/ulan/host/ul_drv/config/winnt/ulanpp.dll differ
diff --git a/ulan/host/ul_drv/config/winnt/wdfenv.bat b/ulan/host/ul_drv/config/winnt/wdfenv.bat
new file mode 100644 (file)
index 0000000..1ba8f3b
--- /dev/null
@@ -0,0 +1,6 @@
+@ECHO OFF\r
+\r
+SET DDKROOT=C:\WDF\WINDDK\r
+SET DDKARCH=x86\r
+\r
+%DDKROOT%\BIN\setenv.bat %DDKROOT% free W2K\r
diff --git a/ulan/host/ul_drv/lazarus/CVS/Entries b/ulan/host/ul_drv/lazarus/CVS/Entries
new file mode 100644 (file)
index 0000000..0f6e925
--- /dev/null
@@ -0,0 +1,9 @@
+/libulan.dll/1.6/Mon Jan 28 09:29:55 2008//
+/uLan.lrs/1.1/Sun Mar 26 22:34:34 2006//
+/uLan.pas/1.5/Fri Sep 28 22:11:37 2007//
+/uLan.res/1.1/Sun Mar 26 22:34:34 2006//
+/uLan.xpm/1.1/Sun Mar 26 22:34:34 2006//
+/uLanlaz.lpk/1.2/Fri Sep 28 22:11:37 2007//
+/uLanlaz.pas/1.1/Sun Mar 26 22:34:34 2006//
+/ul_drvdef.pas/1.4/Fri Sep 28 22:11:37 2007//
+D
diff --git a/ulan/host/ul_drv/lazarus/CVS/Repository b/ulan/host/ul_drv/lazarus/CVS/Repository
new file mode 100644 (file)
index 0000000..0da6f16
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/lazarus
diff --git a/ulan/host/ul_drv/lazarus/CVS/Root b/ulan/host/ul_drv/lazarus/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/lazarus/libulan.dll b/ulan/host/ul_drv/lazarus/libulan.dll
new file mode 100644 (file)
index 0000000..5bf90ad
Binary files /dev/null and b/ulan/host/ul_drv/lazarus/libulan.dll differ
diff --git a/ulan/host/ul_drv/lazarus/uLan.lrs b/ulan/host/ul_drv/lazarus/uLan.lrs
new file mode 100644 (file)
index 0000000..a4c441f
--- /dev/null
@@ -0,0 +1,17 @@
+LazarusResources.Add('TuLan','XPM',[\r
+  '/* XPM */'#13#10'static char * tulan[] = {'#13#10'"24 24 6 1",'#13#10'" '\r
+  +#9'c None",'#13#10'".'#9'c #FFFFFF",'#13#10'"+'#9'c #0000FF",'#13#10'"@'#9'c'\r
+  +' #800000",'#13#10'"#'#9'c #C0C0C0",'#13#10'"$'#9'c #FF0000",'#13#10'"......'\r
+  +'........++........",'#13#10'"..............++........",'#13#10'"...........'\r
+  +'...++........",'#13#10'"..............++........",'#13#10'"..............++'\r
+  +'........",'#13#10'".++++++++++++++++++++++.",'#13#10'".++++++++++++++++++++'\r
+  +'++.",'#13#10'"...++......++......++...",'#13#10'"...++......++......++...",'\r
+  +#13#10'"...++......++......++...",'#13#10'".@@@@@@..@@@@@@..@@@@@@.",'#13#10\r
+  +'".@##$#@..@#$$#@..@#$$#@.",'#13#10'".@#$$#@..@$##$@..@$##$@.",'#13#10'".@##'\r
+  +'$#@..@##$#@..@##$$@.",'#13#10'".@##$#@..@#$##@..@$##$@.",'#13#10'".@##$#@..'\r
+  +'@$$$$@..@#$$#@.",'#13#10'".@@@@@@..@@@@@@..@@@@@@.",'#13#10'"..............'\r
+  +'..........",'#13#10'"........@...............",'#13#10'"........@..........'\r
+  +'.....",'#13#10'"...@..@.@.....@@..@@@...",'#13#10'"...@..@.@....@..@.@..@..'\r
+  +'",'#13#10'"...@..@.@....@..@.@..@..",'#13#10'"....@@..@@@@..@@@.@..@.."};'\r
+  +#13#10\r
+]);\r
diff --git a/ulan/host/ul_drv/lazarus/uLan.pas b/ulan/host/ul_drv/lazarus/uLan.pas
new file mode 100644 (file)
index 0000000..d4b7d95
--- /dev/null
@@ -0,0 +1,441 @@
+unit ulan;\r
+interface\r
+\r
+uses\r
+{$IFDEF FPC}\r
+  LResources,\r
+{$ELSE}\r
+  Windows,\r
+{$ENDIF}\r
+  SysUtils, Classes, ul_drvdef;\r
+\r
+{$IFDEF FPC}\r
+\r
+{$IFDEF WINDOWS}\r
+  {$DEFINE DYNLINK}\r
+{$ENDIF}\r
+\r
+{$IFDEF DYNLINK}\r
+const\r
+{$IF Defined(WINDOWS)}\r
+  ulanlib = 'libulan.dll';\r
+{$ELSEIF Defined(UNIX)}\r
+  ulanlib = 'libulan.so';\r
+{$ELSE}\r
+  {$MESSAGE ERROR 'DYNLINK not supported'}\r
+{$IFEND}\r
+{$ELSE}\r
+  {$LINKLIB ulan}\r
+{$ENDIF}\r
+\r
+{$PACKRECORDS C}\r
+{$ENDIF}\r
+\r
+type\r
+\r
+{$IFDEF UNIX}\r
+  size_t = longint;\r
+{$ENDIF}\r
+\r
+  uloi_coninfo_t = record\r
+    adr : longint;             { address of target module  }\r
+    cmd : longint;             { service/cmd number for uLOI on target  }\r
+    bcmd : longint;            { service/cmd number for returned messages  }\r
+    sn : longint;              { sequence counter  }\r
+    bsn : longint;             { sequence counter of target module  }\r
+    outflg : longint;          { flags used for outgoing messages  }\r
+    ul_fd : ul_fd_t;           { handle for ul_drv  }\r
+    ul_fd1 : ul_fd_t;          { the auxiliary handle for ULOI direct reply  }\r
+    timeout : longint;         { timeout  }\r
+    error : longint;           { error condition occurred  }\r
+    state : Longword;          { internal state  }\r
+  end;\r
+\r
+  pplongint = ^plongint;\r
+  pul_msginfo  = ^ul_msginfo;\r
+  puloi_coninfo_t  = ^uloi_coninfo_t;\r
+  ppbyte  = ^pbyte;\r
+\r
+{$IFNDEF FPC}\r
+  size_t = longint;\r
+{$ENDIF}\r
+  ssize_t = longint;\r
+\r
+  function ul_open(dev_name:pchar; options:Pchar):ul_fd_t;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_close(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_drv_version(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_read(ul_fd:ul_fd_t; buffer:pointer; size:size_t):ssize_t;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_write(ul_fd:ul_fd_t; buffer:pointer; size:size_t):ssize_t;cdecl;external{$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_newmsg(ul_fd:ul_fd_t; msginfo:pul_msginfo):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_tailmsg(ul_fd:ul_fd_t; msginfo:pul_msginfo):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_freemsg(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_acceptmsg(ul_fd:ul_fd_t; msginfo:pul_msginfo):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_actailmsg(ul_fd:ul_fd_t; msginfo:pul_msginfo):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_addfilt(ul_fd:ul_fd_t; msginfo:pul_msginfo):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_abortmsg(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_rewmsg(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_inepoll(ul_fd:ul_fd_t):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_drv_debflg(ul_fd:ul_fd_t; debug_msk:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_fd_wait(ul_fd:ul_fd_t; wait_sec:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+\r
+  { simple message operations  }\r
+  function ul_send_command(ul_fd:ul_fd_t; dadr:longint; cmd:longint; flg:longint; buf:pointer;\r
+             len:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_send_command_wait(ul_fd:ul_fd_t; dadr:longint; cmd:longint; flg:longint; buf:pointer;\r
+             len:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_send_query(ul_fd:ul_fd_t; dadr:longint; cmd:longint; flg:longint; buf:pointer;\r
+             len:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function ul_send_query_wait(ul_fd:ul_fd_t; dadr:longint; cmd:longint; flg:longint; bufin:pointer;\r
+             lenin:longint; bufout:Ppointer; lenout:Plongint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+\r
+  { basic uLan commands/services  }\r
+\r
+  const\r
+     UL_CMD_OISV = $10;        { Object Interface Service  }\r
+     UL_CMD_LCDABS = $4f;       { Absorbance data block  }\r
+     UL_CMD_LCDMRK = $4e;       { Mark  }\r
+     UL_CMD_NCS = $7f;          { Network Control Service  }\r
+     UL_CMD_GST = $c1;          { Fast module get status  }\r
+\r
+  { definitions of basic uLan OI commands  }\r
+\r
+     ULOI_AOID = 10;           { name is defined in ASCII for DOIx  }\r
+     ULOI_DOII = 12;           { description of input objects  }\r
+     ULOI_DOIO = 14;           { description of output objects  }\r
+     ULOI_QOII = 16;           { ID numbers of recognized input objects  }\r
+     ULOI_QOIO = 18;           { ID numbers of recognized output objects  }\r
+     ULOI_RDRQ = 20;           { object values read request  }\r
+     ULOI_STATUS = 30;          { read instrument status  }\r
+     ULOI_ERRCLR = 31;         { clear error status  }\r
+\r
+\r
+  { definitions of basic uLan OI functions  }\r
+\r
+  function uloi_open(ul_dev_name:Pchar; adr:longint; cmd:longint; bcmd:longint; timeout:longint):puloi_coninfo_t;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  procedure uloi_close(coninfo:puloi_coninfo_t);cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_transfer(coninfo:puloi_coninfo_t; bufin:Pchar; lenin:longint; bufout:PPchar; lenout:Plongint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_set_var(coninfo:puloi_coninfo_t; oid:longint; val:pointer; size:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_get_var(coninfo:puloi_coninfo_t; oid:longint; val:pointer; size:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_set_var_u2(coninfo:puloi_coninfo_t; oid:longint; val:longword):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_get_var_u2(coninfo:puloi_coninfo_t; oid:longint; val:Plongword):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_send_cmd(coninfo:puloi_coninfo_t; oid:longint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_get_oids(coninfo:puloi_coninfo_t; list:longint; oids_list:pplongint):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_get_oiddes(coninfo:puloi_coninfo_t; list:longint; oid:longint; poiddespack:ppbyte):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_get_aoiddes(coninfo:puloi_coninfo_t; list:longint; aoid:pchar; poiddespack:ppbyte):longint;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_oiddespack_getloc(despack:pbyte;strindex:longint):pbyte;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  function uloi_oiddespack_strdup(despack:pbyte;strindex:longint):pchar;cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+  procedure uloi_cfree(p:pointer);cdecl;external {$IFDEF DYNLINK}ulanlib{$ENDIF};\r
+\r
+  { UL_CMD_NCS Network Control Service  }\r
+\r
+const\r
+     ULNCS_ADR_RQ = $C0;       { SN0 SN1 SN2 SN3  }\r
+     ULNCS_SET_ADDR = $C1;      { SN0 SN1 SN2 SN3 NEW_ADR  }\r
+     ULNCS_SID_RQ = $C2;        { send serial num and ID string request  }\r
+     ULNCS_SID_RPLY = $C3;      { SN0 SN1 SN2 SN3 ID ...  }\r
+     ULNCS_ADDR_NVSV = $C4;     { SN0 SN1 SN2 SN3 - save addres to EEPROM  }\r
+     ULNCS_BOOT_ACT = $C5;      { SN0 SN1 SN2 SN3  }\r
+     ULNCS_BOOT_ACK = $C6;      { SN0 SN1 SN2 SN3  }\r
+\r
+  { UL_CMD_RES Reinitialize RS485 or connected module }\r
+\r
+     ULRES_LINK = $10;\r
+     ULRES_BAUD = $12;\r
+     ULRES_CPU = $21;    { password - default 0x55 0xAA }\r
+\r
+type\r
+  TuMsg = procedure(FRcvMessage:ul_msginfo;BuffRx:pchar) of object;\r
+\r
+  TuLan = class;                          //forward declaration\r
+\r
+  TComThread = class (TThread)\r
+    FuLan:TuLan;\r
+    FRcvMessage:ul_msginfo;\r
+    Buffer: Pchar;\r
+  private\r
+  protected\r
+    procedure DispatchComMsg;\r
+    procedure Execute;override;\r
+  public\r
+    constructor Create(uLan:TuLan);\r
+  end;\r
+\r
+  TuLan = class(TComponent)\r
+  private\r
+    FComThread: TComThread;\r
+    FuMsg: TuMsg;\r
+    FD: ul_fd_t;                         { Handle to uULan device driver. }\r
+    FD1: ul_fd_t;                        { Handle to uULan device driver. }\r
+    FOSDeviceName: string;\r
+    procedure FlushMessages;\r
+    function MessageAvailable: boolean;\r
+    function MessageOpen: integer;\r
+  protected\r
+    { Protected declarations }\r
+  public\r
+    FRcvMessage:ul_msginfo;\r
+    FSndMessage:ul_msginfo;\r
+    constructor Create(AOwner: TComponent); override;\r
+    destructor Destroy; override;\r
+    procedure SetActive(OnOff: boolean);\r
+    function GetActive: boolean;\r
+    function GetDrvVersion: integer;\r
+    function FilterAdd(ASrcAddr: integer; ACommand: integer):integer;\r
+    function MessageCreate(ADestAddr: integer; ACommand: integer; AMessageFlags: integer): integer;\r
+    function MessageTailCreate(ADestAddr: integer; ACommand: integer; AMessageFlags: integer): integer;\r
+    function MessageWriteBuf(const ABuf; ABufSize: integer): integer;\r
+    function MessageClose: integer;\r
+    function MessageAbort: integer;\r
+\r
+    function CommandSend(ADestAddr: integer; ACommand: integer;\r
+                 AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+    function CommandSendWait(ADestAddr: integer; ACommand: integer;\r
+                 AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+    function QuerySend(ADestAddr: integer; ACommand: integer;\r
+                 AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+    function QuerySendWait(ADestAddr: integer; ACommand: integer;\r
+                 AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer;\r
+                 var InBuf:pchar; var InBufSize: integer): integer;\r
+  published\r
+    property OnMessage: TuMsg read FuMsg write FuMsg;\r
+    property Active: boolean read GetActive write SetActive default False;\r
+    property OSDeviceName: string read FOSDeviceName write FOSDeviceName;\r
+  end;\r
+\r
+procedure Register;\r
+\r
+implementation\r
+\r
+//Receive messages\r
+constructor TComThread.Create(uLan:TuLan);\r
+begin\r
+  inherited Create(True);\r
+  FuLan:=uLan;\r
+end;\r
+\r
+procedure TComThread.Execute;\r
+var bytes_ret:longint;\r
+    stamp:integer;\r
+begin\r
+  while not Terminated do begin\r
+    if (ul_fd_wait(FuLan.FD1,1)>0) then begin\r
+      ul_acceptmsg(FuLan.FD1,@FRcvMessage);\r
+      stamp:=FRcvMessage.stamp;\r
+      if (FRcvMessage.flg and UL_BFL_TAIL) <> 0 then begin\r
+        ul_actailmsg(FuLan.FD1,@FRcvMessage);\r
+        FRcvMessage.stamp:=stamp;\r
+      end;\r
+      try\r
+        GetMem(Buffer,FRcvMessage.len);\r
+        bytes_ret:=ul_read(FuLan.FD1,Buffer, FRcvMessage.len);\r
+        ul_freemsg(FuLan.FD1);\r
+        if (bytes_ret=FRcvMessage.len) then\r
+{$IFDEF FPC}\r
+          synchronize(@DispatchComMsg);\r
+{$ELSE}\r
+          synchronize(DispatchComMsg);\r
+{$ENDIF}\r
+      finally\r
+        FreeMem(Buffer);\r
+      end;\r
+    end;\r
+  end;\r
+end;\r
+\r
+procedure TComThread.DispatchComMsg;\r
+begin\r
+  if Assigned(FuLan.FuMsg) then\r
+    FuLan.OnMessage(FRcvMessage,Buffer);\r
+end;\r
+\r
+constructor TuLan.Create(AOwner: TComponent);\r
+begin\r
+  inherited Create(AOwner);\r
+  FD := UL_FD_INVALID;\r
+  FOSDeviceName := UL_DEV_NAME;\r
+end;\r
+\r
+destructor TuLan.Destroy;\r
+begin\r
+  Active := false;\r
+  inherited Destroy;\r
+end;\r
+\r
+procedure TuLan.SetActive(OnOff: boolean);\r
+var P : Pchar;\r
+begin\r
+  if OnOff then begin\r
+    if not Active then begin\r
+      p:=StrAlloc (length(FOSDeviceName)+1);\r
+      StrPCopy (P,FOSDeviceName);\r
+      FD := ul_open(p,nil);\r
+      FD1 := ul_open(p,nil);\r
+      StrDispose(P);\r
+      if (FD = UL_FD_INVALID) or (FD1 = UL_FD_INVALID) then begin\r
+        Active:=False;                       //fail\r
+      end else begin\r
+        FComThread := TComThread.Create(Self);\r
+        FComThread.Priority := tpHigher;\r
+        FComThread.Resume;\r
+      end;\r
+    end;\r
+  end else begin\r
+    if Active then begin\r
+      FComThread.Terminate;\r
+      ul_close(FD);\r
+      ul_close(FD1);\r
+      FD:=UL_FD_INVALID;\r
+      FD1:=UL_FD_INVALID;\r
+      Active:=False;\r
+    end;\r
+  end;\r
+end;\r
+\r
+function TuLan.GetActive: boolean;\r
+begin\r
+  Result := (FD <> UL_FD_INVALID);\r
+end;\r
+\r
+function Tulan.GetDrvVersion: integer;\r
+begin\r
+  Result := 0;\r
+  if not Active then exit;\r
+  Result:=ul_drv_version(FD);\r
+end;\r
+\r
+function Tulan.FilterAdd(ASrcAddr: integer; ACommand: integer):integer;\r
+var FFiltMessage: ul_msginfo;\r
+begin\r
+  Result := -1;\r
+  if not Active then exit;\r
+  FillChar(FFiltMessage, sizeof(FFiltMessage), 0);\r
+  FFiltMessage.sadr := ASrcAddr;\r
+  FFiltMessage.cmd := ACommand;\r
+  if not Active then exit;\r
+  Result:=ul_addfilt(FD1,@FFiltMessage);\r
+end;\r
+\r
+procedure TuLan.FlushMessages;\r
+begin\r
+  //free messages from sending\r
+  while MessageAvailable do begin\r
+    MessageOpen;\r
+    MessageClose;\r
+  end;\r
+end;\r
+\r
+function TuLan.MessageAvailable: boolean;\r
+var ret:longint;\r
+begin\r
+  Result := False;\r
+  if not Active then exit;\r
+  ret:=ul_inepoll(FD);\r
+  Result := ret <> 0;\r
+end;\r
+\r
+function TuLan.MessageOpen: integer;\r
+begin\r
+  Result := 0;\r
+  if not Active then exit;\r
+  Result:=ul_acceptmsg(FD,@FRcvMessage);\r
+end;\r
+\r
+function TuLan.MessageCreate(ADestAddr: integer; ACommand: integer; AMessageFlags: integer): integer;\r
+begin\r
+  Result := 0;\r
+  FillChar(FSndMessage, sizeof(FSndMessage), 0);\r
+  FSndMessage.dadr := ADestAddr;\r
+  FSndMessage.cmd := ACommand;\r
+  FSndMessage.flg := AMessageFlags or UL_BFL_M2IN;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  Result:=ul_newmsg(FD,@FSndMessage);\r
+end;\r
+\r
+function TuLan.MessageTailCreate(ADestAddr: integer; ACommand: integer; AMessageFlags: integer): integer;\r
+begin\r
+  Result := 0;\r
+  FillChar(FSndMessage, sizeof(FSndMessage), 0);\r
+  FSndMessage.dadr := ADestAddr;\r
+  FSndMessage.cmd := ACommand;\r
+  FSndMessage.flg := AMessageFlags;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  Result:=ul_tailmsg(FD,@FSndMessage);\r
+end;\r
+\r
+function TuLan.MessageWriteBuf(const ABuf; ABufSize: integer): integer;\r
+var b_ret: DWORD;\r
+begin\r
+  Result := 0;\r
+  if ABufSize = 0 then exit;\r
+  if not Active then exit;\r
+  b_ret:=ul_write(FD,@ABuf,ABufSize);\r
+  if integer(b_ret) <> ABufSize then Result := -1\r
+  else Result:=b_ret;\r
+end;\r
+\r
+function TuLan.MessageClose: integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  Result:=ul_freemsg(FD);\r
+end;\r
+\r
+function TuLan.MessageAbort: integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  Result:=ul_abortmsg(FD);\r
+end;\r
+\r
+function TuLan.CommandSend(ADestAddr: integer; ACommand: integer;\r
+  AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  result:=ul_send_command(FD,ADestAddr,ACommand,AMessageFlags,OutBuf,OutBufSize);\r
+end;\r
+\r
+function TuLan.CommandSendWait(ADestAddr: integer; ACommand: integer;\r
+  AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  result:=ul_send_command_wait(FD,ADestAddr,ACommand,AMessageFlags,OutBuf,OutBufSize);\r
+end;\r
+\r
+function TuLan.QuerySend(ADestAddr: integer; ACommand: integer;\r
+  AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer): integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  result:=ul_send_query(FD,ADestAddr,ACommand,AMessageFlags,OutBuf,OutBufSize);\r
+end;\r
+\r
+function TuLan.QuerySendWait(ADestAddr: integer; ACommand: integer;\r
+   AMessageFlags: integer; OutBuf: pointer; OutBufSize: integer;\r
+   var InBuf:pchar; var InBufSize: integer): integer;\r
+begin\r
+  Result:=-1;\r
+  if not Active then exit;\r
+  FlushMessages;\r
+  result:=ul_send_query_wait(FD,ADestAddr,ACommand,AMessageFlags,\r
+          OutBuf,OutBufSize,@InBuf,@InBufSize);\r
+end;\r
+\r
+procedure Register;\r
+begin\r
+  RegisterComponents('Communication', [TuLan]);\r
+end;\r
+\r
+initialization\r
+{$IFDEF FPC}\r
+  {$i uLan.lrs}\r
+{$ELSE}\r
+  {$R uLan.RES}\r
+{$ENDIF}\r
+end.\r
diff --git a/ulan/host/ul_drv/lazarus/uLan.res b/ulan/host/ul_drv/lazarus/uLan.res
new file mode 100644 (file)
index 0000000..64aa57e
Binary files /dev/null and b/ulan/host/ul_drv/lazarus/uLan.res differ
diff --git a/ulan/host/ul_drv/lazarus/uLan.xpm b/ulan/host/ul_drv/lazarus/uLan.xpm
new file mode 100644 (file)
index 0000000..1c34193
--- /dev/null
@@ -0,0 +1,33 @@
+/* XPM */\r
+static char * ulan_xpm[] = {\r
+"24 24 6 1",\r
+"      c None",\r
+".     c #FFFFFF",\r
+"+     c #0000FF",\r
+"@     c #800000",\r
+"#     c #C0C0C0",\r
+"$     c #FF0000",\r
+"..............++........",\r
+"..............++........",\r
+"..............++........",\r
+"..............++........",\r
+"..............++........",\r
+".++++++++++++++++++++++.",\r
+".++++++++++++++++++++++.",\r
+"...++......++......++...",\r
+"...++......++......++...",\r
+"...++......++......++...",\r
+".@@@@@@..@@@@@@..@@@@@@.",\r
+".@##$#@..@#$$#@..@#$$#@.",\r
+".@#$$#@..@$##$@..@$##$@.",\r
+".@##$#@..@##$#@..@##$$@.",\r
+".@##$#@..@#$##@..@$##$@.",\r
+".@##$#@..@$$$$@..@#$$#@.",\r
+".@@@@@@..@@@@@@..@@@@@@.",\r
+"........................",\r
+"........@...............",\r
+"........@...............",\r
+"...@..@.@.....@@..@@@...",\r
+"...@..@.@....@..@.@..@..",\r
+"...@..@.@....@..@.@..@..",\r
+"....@@..@@@@..@@@.@..@.."};\r
diff --git a/ulan/host/ul_drv/lazarus/uLanlaz.lpk b/ulan/host/ul_drv/lazarus/uLanlaz.lpk
new file mode 100644 (file)
index 0000000..ef518d2
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <Package Version="2">
+    <Name Value="uLanlaz"/>
+    <Author Value="Petr Smolik"/>
+    <CompilerOptions>
+      <Version Value="5"/>
+      <SearchPaths>
+        <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+      </SearchPaths>
+      <CodeGeneration>
+        <Generate Value="Faster"/>
+      </CodeGeneration>
+      <Other>
+        <CompilerPath Value="$(CompPath)"/>
+        <CreateMakefileOnBuild Value="True"/>
+      </Other>
+    </CompilerOptions>
+    <Description Value="uLan package for Lazarus
+"/>
+    <License Value="LGPL
+"/>
+    <Version Minor="1"/>
+    <Files Count="2">
+      <Item1>
+        <Filename Value="uLan.lrs"/>
+        <Type Value="LRS"/>
+      </Item1>
+      <Item2>
+        <Filename Value="uLan.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="uLan"/>
+      </Item2>
+    </Files>
+    <Type Value="RunAndDesignTime"/>
+    <RequiredPkgs Count="2">
+      <Item1>
+        <PackageName Value="IDEIntf"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="LCL"/>
+      </Item2>
+    </RequiredPkgs>
+    <UsageOptions>
+      <CustomOptions Value="-dUseCThreads
+"/>
+      <UnitPath Value="$(PkgOutDir)/"/>
+    </UsageOptions>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IgnoreBinaries Value="False"/>
+    </PublishOptions>
+  </Package>
+</CONFIG>
diff --git a/ulan/host/ul_drv/lazarus/uLanlaz.pas b/ulan/host/ul_drv/lazarus/uLanlaz.pas
new file mode 100644 (file)
index 0000000..5ff42c2
--- /dev/null
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!\r
+This source is only used to compile and install the package.\r
+ }\r
+\r
+unit uLanlaz; \r
+\r
+interface\r
+\r
+uses\r
+  uLan, LazarusPackageIntf; \r
+\r
+implementation\r
+\r
+procedure Register; \r
+begin\r
+  RegisterUnit('uLan', @uLan.Register); \r
+end; \r
+\r
+initialization\r
+  RegisterPackage('uLanlaz', @Register); \r
+end.\r
diff --git a/ulan/host/ul_drv/lazarus/ul_drvdef.pas b/ulan/host/ul_drv/lazarus/ul_drvdef.pas
new file mode 100644 (file)
index 0000000..abdb112
--- /dev/null
@@ -0,0 +1,111 @@
+unit ul_drvdef;
+interface
+
+{$DEFINE UL_INDIR}
+
+{$IFDEF FPC}
+{$PACKRECORDS C}
+{$ENDIF}
+
+//uses
+//  Windows;
+
+
+  const
+     UL_BFL_LOCK = $8000;
+  { Message must be received by some proccess  }
+     UL_BFL_MSST = $4000;
+  { After succesfull proccessing move to proc_bll  }
+     UL_BFL_M2IN = $2000;
+  { Length of received frame must match expected len  }
+     UL_BFL_LNMM = $1000;
+  { Message cannot be proccessed - error  }
+     UL_BFL_FAIL = $0800;
+  { Multiframe message continues by next bll block  }
+     UL_BFL_TAIL = $0400;
+  { Send this frame  }
+     UL_BFL_SND = $0200;
+  { Receive answer frame into this bll block  }
+     UL_BFL_REC = $0100;
+  { Verify free space in buffer of destination station  }
+     UL_BFL_VERL = $0040;
+  { Do not try to repeat if error occurs  }
+     UL_BFL_NORE = $0020;
+  { If error occurs do wait with retry  }
+     UL_BFL_REWA = $0010;
+  { Request imediate proccessing of frame by receiver station  }
+     UL_BFL_PRQ = $0002;
+  { Request imediate acknowledge by receiving station  }
+     UL_BFL_ARQ = $0001;
+
+  type
+     {$IFDEF UL_INDIR}
+       ul_fd_t = Pointer;
+     {$ELSE}
+       ul_fd_t = THandle;
+     {$ENDIF}
+
+     ul_msginfo = record
+          dadr : longint;
+          sadr : longint;
+          cmd : longint;
+          flg : longint;
+          len : longint;
+          stamp : longword;
+       end;
+
+  const
+    {$IFDEF UL_INDIR}
+       UL_FD_INVALID = nil;
+    {$ELSE}
+       UL_FD_INVALID = INVALID_HANDLE_VALUE;
+    {$ENDIF}
+
+
+    {$IF Defined(WINDOWS)}
+       UL_DEV_NAME = '\\.\UL_DRV';
+    {$ELSEIF Defined(UNIX)}
+       UL_DEV_NAME = '/dev/ulan';
+    {$ELSE}
+      {$MESSAGE ERROR 'invalid OS'}
+    {$ENDIF}
+
+  {***************************************************************** }
+  { command definitions  }
+  { standard command codes
+     00H .. 3FH    store to buffer
+     40H .. 7FH    store to buffer without ACK
+     80H .. 9FH    proccess at onece
+     A0H .. BFH    process with additional receive
+     C0H .. FFH    process with additional send
+   }
+
+  { Reinitialize RS485  }
+
+  const
+     UL_CMD_RES = $80;
+  { Test free space in input buffer  }
+     UL_CMD_SFT = $81;
+  { Send identification  }
+     UL_CMD_SID = $F0;
+  { Send amount of free space in IB  }
+     UL_CMD_SFI = $F1;
+  { End of stepping  }
+     UL_CMD_TF0 = $98;
+  { Begin of stepping  }
+     UL_CMD_TF1 = $99;
+  { Do step  }
+     UL_CMD_STP = $9A;
+  { Additional debug commands  }
+     UL_CMD_DEB = $9B;
+  { Send state - for 8051 PCL PCH PSW ACC  }
+     UL_CMD_SPC = $DA;
+  { Read memory   T T B B L L  }
+     UL_CMD_RDM = $F8;
+  { Write mamory  T T B B L L  }
+     UL_CMD_WRM = $B8;
+  { Erase memory T T B B L L  }
+     UL_CMD_ERM = $88;
+
+implementation
+end.
diff --git a/ulan/host/ul_drv/ul_dll/CVS/Entries b/ulan/host/ul_drv/ul_dll/CVS/Entries
new file mode 100644 (file)
index 0000000..bc26c62
--- /dev/null
@@ -0,0 +1,2 @@
+D/class////
+D/pp////
diff --git a/ulan/host/ul_drv/ul_dll/CVS/Repository b/ulan/host/ul_drv/ul_dll/CVS/Repository
new file mode 100644 (file)
index 0000000..6c83e73
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_dll
diff --git a/ulan/host/ul_drv/ul_dll/CVS/Root b/ulan/host/ul_drv/ul_dll/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_dll/class/CVS/Entries b/ulan/host/ul_drv/ul_dll/class/CVS/Entries
new file mode 100644 (file)
index 0000000..f85d953
--- /dev/null
@@ -0,0 +1,9 @@
+/makefile/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/resource.h/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/sources/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/uLan.ico/1.1/Fri Sep 10 19:45:10 2004/-kb/
+/ulanclass.aps/1.1/Fri Sep 10 19:45:10 2004/-kb/
+/ulanclass.c/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/ulanclass.def/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/ulanclass.rc/1.1.1.1/Fri Sep 10 17:46:41 2004//
+D
diff --git a/ulan/host/ul_drv/ul_dll/class/CVS/Repository b/ulan/host/ul_drv/ul_dll/class/CVS/Repository
new file mode 100644 (file)
index 0000000..792becd
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_dll/class
diff --git a/ulan/host/ul_drv/ul_dll/class/CVS/Root b/ulan/host/ul_drv/ul_dll/class/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_dll/class/makefile b/ulan/host/ul_drv/ul_dll/class/makefile
new file mode 100644 (file)
index 0000000..ac8b038
--- /dev/null
@@ -0,0 +1,9 @@
+#\r
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
+# file to this component.  This file merely indirects to the real make file\r
+# that is shared by all the components of NT OS/2\r
+#\r
+!INCLUDE $(NTMAKEENV)\makefile.def\r
+\r
+del:\r
+       rmdir objchk obj /S /Q\r
diff --git a/ulan/host/ul_drv/ul_dll/class/resource.h b/ulan/host/ul_drv/ul_dll/class/resource.h
new file mode 100644 (file)
index 0000000..bfa8a18
--- /dev/null
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Developer Studio generated include file.\r
+// Used by ulanclass.rc\r
+//\r
+#define IDI_ICON1                       102\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NEXT_RESOURCE_VALUE        107\r
+#define _APS_NEXT_COMMAND_VALUE         40001\r
+#define _APS_NEXT_CONTROL_VALUE         1000\r
+#define _APS_NEXT_SYMED_VALUE           101\r
+#endif\r
+#endif\r
diff --git a/ulan/host/ul_drv/ul_dll/class/sources b/ulan/host/ul_drv/ul_dll/class/sources
new file mode 100644 (file)
index 0000000..a2f6acd
--- /dev/null
@@ -0,0 +1,30 @@
+TARGETNAME=ulanclass\r
+TARGETPATH=.\r
+TARGETTYPE=DYNLINK\r
+TARGETEXT=dll\r
+DLLENTRY=LibMain\r
+\r
+TARGETLIBS=$(SDK_LIB_PATH)\setupapi.lib     \\r
+           $(SDK_LIB_PATH)\libc.lib         \\r
+           $(SDK_LIB_PATH)\user32.lib       \\r
+           $(SDK_LIB_PATH)\advapi32.lib     \\r
+           $(SDK_LIB_PATH)\kernel32.lib     \\r
+           $(SDK_LIB_PATH)\gdi32.lib        \\r
+           $(SDK_LIB_PATH)\shell32.lib      \\r
+           $(SDK_LIB_PATH)\comctl32.lib     \\r
+           $(SDK_LIB_PATH)\cfgmgr32.lib     \\r
+           $(SDK_LIB_PATH)\msports.lib      \\r
+           $(SDK_LIB_PATH)\version.lib      \r
+\r
+!IFNDEF MSC_WARNING_LEVEL\r
+MSC_WARNING_LEVEL=/W3\r
+!ENDIF\r
+\r
+MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX\r
+\r
+USE_MAPSYM=0\r
+\r
+C_DEFINES=-DWIN32 -DW3 -DUNICODE -D_UNICODE \r
+\r
+SOURCES=ulanclass.rc \\r
+        ulanclass.c \r
diff --git a/ulan/host/ul_drv/ul_dll/class/uLan.ico b/ulan/host/ul_drv/ul_dll/class/uLan.ico
new file mode 100644 (file)
index 0000000..29fe32b
Binary files /dev/null and b/ulan/host/ul_drv/ul_dll/class/uLan.ico differ
diff --git a/ulan/host/ul_drv/ul_dll/class/ulanclass.aps b/ulan/host/ul_drv/ul_dll/class/ulanclass.aps
new file mode 100644 (file)
index 0000000..339f45e
Binary files /dev/null and b/ulan/host/ul_drv/ul_dll/class/ulanclass.aps differ
diff --git a/ulan/host/ul_drv/ul_dll/class/ulanclass.c b/ulan/host/ul_drv/ul_dll/class/ulanclass.c
new file mode 100644 (file)
index 0000000..6786cca
--- /dev/null
@@ -0,0 +1,28 @@
+#include <windows.h>\r
+#include <tchar.h>\r
+#include <setupapi.h>\r
+/*++\r
+Routine Description:\r
+\r
+    Entry-point a class installer.  This routine is only here\r
+ so that we can use this dll to get the icon for the device\r
+ class.\r
+\r
+Arguments:\r
+\r
+    InstallFunction - identifies the installation request to perform\r
+    DeviceInfoSet - handle to the device information set\r
+    DeviceInfoData - pointer to an SP_DEVINFO_DATA structure\r
+       that contains information about the device to install.\r
+\r
+Return Value:\r
+\r
+    DWORD:  Always returns ERROR_DI_DO_DEFAULT to indicate using the\r
+         default installer.\r
+--*/\r
+DWORD WINAPI ClassInstall(IN DI_FUNCTION InstallFunction,\r
+     IN HDEVINFO DeviceInfoSet,\r
+     IN PSP_DEVINFO_DATA DeviceInfoData)\r
+{\r
+ return ERROR_DI_DO_DEFAULT;\r
+}
\ No newline at end of file
diff --git a/ulan/host/ul_drv/ul_dll/class/ulanclass.def b/ulan/host/ul_drv/ul_dll/class/ulanclass.def
new file mode 100644 (file)
index 0000000..b36cb84
--- /dev/null
@@ -0,0 +1,5 @@
+LIBRARY ULANCLASS.DLL\r
+\r
+EXPORTS\r
+        ClassInstall\r
+\r
diff --git a/ulan/host/ul_drv/ul_dll/class/ulanclass.rc b/ulan/host/ul_drv/ul_dll/class/ulanclass.rc
new file mode 100644 (file)
index 0000000..da53467
--- /dev/null
@@ -0,0 +1,72 @@
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include "afxres.h"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Czech resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_CZECH, SUBLANG_DEFAULT\r
+#pragma code_page(1250)\r
+#endif //_WIN32\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#include ""afxres.h""\r\n"\r
+    "\0"\r
+END\r
+\r
+3 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+101                     ICON    DISCARDABLE     "uLan.ico"\r
+#endif    // Czech resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/CVS/Entries b/ulan/host/ul_drv/ul_dll/pp/CVS/Entries
new file mode 100644 (file)
index 0000000..25a885b
--- /dev/null
@@ -0,0 +1,9 @@
+/makefile/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/proppage.aps/1.1/Fri Sep 10 19:45:10 2004/-kb/
+/proppage.c/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/proppage.h/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/proppage.rc/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/resource.h/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/sources/1.1.1.1/Fri Sep 10 17:46:41 2004//
+/ulanpp.def/1.1.1.1/Fri Sep 10 17:46:41 2004//
+D
diff --git a/ulan/host/ul_drv/ul_dll/pp/CVS/Repository b/ulan/host/ul_drv/ul_dll/pp/CVS/Repository
new file mode 100644 (file)
index 0000000..0e14a91
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_dll/pp
diff --git a/ulan/host/ul_drv/ul_dll/pp/CVS/Root b/ulan/host/ul_drv/ul_dll/pp/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_dll/pp/makefile b/ulan/host/ul_drv/ul_dll/pp/makefile
new file mode 100644 (file)
index 0000000..ac8b038
--- /dev/null
@@ -0,0 +1,9 @@
+#\r
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
+# file to this component.  This file merely indirects to the real make file\r
+# that is shared by all the components of NT OS/2\r
+#\r
+!INCLUDE $(NTMAKEENV)\makefile.def\r
+\r
+del:\r
+       rmdir objchk obj /S /Q\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/proppage.aps b/ulan/host/ul_drv/ul_dll/pp/proppage.aps
new file mode 100644 (file)
index 0000000..9fe424e
Binary files /dev/null and b/ulan/host/ul_drv/ul_dll/pp/proppage.aps differ
diff --git a/ulan/host/ul_drv/ul_dll/pp/proppage.c b/ulan/host/ul_drv/ul_dll/pp/proppage.c
new file mode 100644 (file)
index 0000000..0d07c80
--- /dev/null
@@ -0,0 +1,483 @@
+/********************************************************************/\r
+/* uLan property page - Roman Bartosinski (C)2003               */\r
+/********************************************************************/\r
+\r
+#include "proppage.h"\r
+#include <devioctl.h>\r
+\r
+\r
+  DWORD baud_tbl[] = { 75,110,134,150,300,600,1200,1800,2400,4800,7200,\r
+                      9600,14400,19200,38400,57600,115200,128000,0};  \r
+  LPCTSTR debug_tbl[] = { L"none", L"Lowest", L"Lower", L"Normal", L"Higher", L"Highest", NULL};\r
+\r
+\r
+  HANDLE g_hInst = NULL;\r
+  TCHAR applet_name[]     = TEXT("General Property Page");\r
+\r
+/********************************************************************/\r
+/*\r
+TCHAR sz_evbousb_help[] = _T("evbousb.hlp");\r
+const DWORD HelpIDs[]=\r
+{\r
+    PP_PORT_NAME,       IDH_PORTSET_NAME,       // "" (ComboBox)\r
+    PP_ULAN_BAUD,       IDH_PORTSET_BAUDRATE,   // "" (ComboBox)\r
+    PP_ULAN_ADDR,       IDH_PORTSET_ADDRESS,    // "" (ComboBox)\r
+    PP_ULAN_DEBUG,      IDH_PORTSET_DEBUGLEVEL, // "" (ComboBox)\r
+    PP_ULAN_PMODE,      IDH_PORTSET_PROMODE,    // "" (ComboBox)\r
+    IDC_RESTORE,        IDH_PORTSET_DEFAULTS,   // "&Restore Defaults" (Button)\r
+    IDC_REFRESH,        IDH_PORTSET_DEFAULTS,   // "&Refresh Defaults" (Button)\r
+    IDC_STATIC,         IDH_NONE,               // no help\r
+    0, 0\r
+};\r
+*/\r
+\r
+\r
+\r
+/********************************************************************/\r
+/********************************************************************/\r
+BOOL APIENTRY LibMain( HANDLE hDll, DWORD dwReason, LPVOID lpReserved)\r
+{\r
+  switch( dwReason ) {\r
+    case DLL_PROCESS_ATTACH:\r
+      g_hInst = hDll;\r
+      DisableThreadLibraryCalls(hDll);\r
+      break;\r
+    case DLL_PROCESS_DETACH:\r
+      break;\r
+    default:\r
+      break;\r
+  }\r
+  return TRUE;\r
+}\r
+\r
+/********************************************************************/\r
+void InitPortParams( IN OUT PPORT_PARAMS Params, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)\r
+{\r
+  SP_DEVINFO_LIST_DETAIL_DATA detailData;\r
+\r
+  ZeroMemory( Params, sizeof(PORT_PARAMS));\r
+  Params->DeviceInfoSet = DeviceInfoSet;\r
+  Params->DeviceInfoData = DeviceInfoData;\r
+  Params->ChangesEnabled = TRUE;\r
+  detailData.cbSize = sizeof(SP_DEVINFO_LIST_DETAIL_DATA);\r
+  if ( SetupDiGetDeviceInfoListDetail( DeviceInfoSet, &detailData) &&\r
+       detailData.RemoteMachineHandle != NULL) {\r
+\r
+    Params->ChangesEnabled = FALSE;\r
+  }\r
+}\r
+\r
+/********************************************************************/\r
+HPROPSHEETPAGE InitSettingsPage(PROPSHEETPAGE *psp, OUT PPORT_PARAMS Params)\r
+{\r
+//  debugPrint("InitSetting");\r
+  psp->dwSize      = sizeof( PROPSHEETPAGE);\r
+  psp->dwFlags     = PSP_USECALLBACK; // | PSP_HASHELP;\r
+  psp->hInstance   = g_hInst;\r
+  psp->pszTemplate = MAKEINTRESOURCE(DLG_PPAGE);\r
+  psp->pfnDlgProc = PortSettingsDlgProc;\r
+  psp->lParam     = (LPARAM) Params;\r
+  psp->pfnCallback = PortSettingsDlgCallback;\r
+  return CreatePropertySheetPage( psp);\r
+}\r
+\r
+/********************************************************************/\r
+UINT CALLBACK PortSettingsDlgCallback( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)\r
+{\r
+  PPORT_PARAMS params;\r
+  \r
+  switch (uMsg) {\r
+    case PSPCB_CREATE:\r
+      return TRUE;    // return TRUE to continue with creation of page\r
+    case PSPCB_RELEASE:\r
+      params = (PPORT_PARAMS) ppsp->lParam;\r
+      if ( params)\r
+        LocalFree(params);\r
+      return 0;       // return value ignored\r
+    default:\r
+      break;\r
+  }\r
+  return TRUE;\r
+}\r
+\r
+/********************************************************************/\r
+void Port_OnCommand( HWND hDlg, int ControlId, HWND ControlHwnd, UINT NotifyCode)\r
+{\r
+  PPORT_PARAMS params = (PPORT_PARAMS)GetWindowLongPtr( hDlg, DWLP_USER);\r
+  DWORD i; \r
+  BYTE j;\r
+  TCHAR str[20];\r
+  BYTE changed = 0;\r
+\r
+  switch( ControlId) {\r
+    case PP_ULAN_BAUD:\r
+      if ( NotifyCode == CBN_SELCHANGE) {\r
+        //debugPrint("Select Baudrate");\r
+        GetWindowText( GetDlgItem( hDlg, PP_ULAN_BAUD), str, 20);\r
+        params->PortSettings.BaudRate = (DWORD) myatoi( str);\r
+        changed = 1;\r
+      }\r
+      break;\r
+    case PP_ULAN_DEBUG:    \r
+      if ( NotifyCode == CBN_SELCHANGE) {\r
+        //debugPrint("Select Debug");\r
+        params->PortSettings.Debug = SendMessage( ControlHwnd, CB_GETCURSEL, 0, 0);\r
+        changed = 1;\r
+      }\r
+      break;\r
+    case PP_ULAN_ADDR:\r
+      if ( NotifyCode == EN_KILLFOCUS) {\r
+        //debugPrint("KillFocus");\r
+        GetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str, 20);\r
+        params->PortSettings.Address = (DWORD) myatoi( str);\r
+        if ( params->PortSettings.Address < ULANADDR_MIN || params->PortSettings.Address > ULANADDR_MAX) {\r
+          params->PortSettings.Address = params->PortSettings.DefAddress;\r
+          wsprintf( str, TEXT("%d"), params->PortSettings.Address);\r
+          SetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str);\r
+        }\r
+        changed = 1; // there is some bug, maybe.\r
+      }\r
+      break;\r
+    case PP_ULAN_PMODE:\r
+      if ( NotifyCode == BN_CLICKED) {\r
+        //debugPrint("Clicked");\r
+        if ( IsDlgButtonChecked( hDlg, PP_ULAN_PMODE) == BST_CHECKED)\r
+          params->PortSettings.ProMode = 1;\r
+        else\r
+          params->PortSettings.ProMode = 0;\r
+        changed = 1;\r
+      }\r
+      break;\r
+    case IDC_REFRESH:\r
+      MessageBox( hDlg, TEXT("Here will be IOCTL driver call."), TEXT("uLan Property Page"), MB_OK | MB_ICONINFORMATION);\r
+      break;\r
+    case IDC_RESTORE:\r
+      //debugPrint("ChangeData");\r
+      RestorePortSettings( hDlg, params);\r
+      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);\r
+      PropSheet_Changed( GetParent(hDlg), hDlg);\r
+      break; \r
+    case IDCANCEL: // ??? redundant control\r
+      EndDialog( hDlg, 0); \r
+      return;\r
+    case IDC_APPLY:\r
+      PropSheet_Apply( GetParent( hDlg));\r
+      params->PortSettings.DefBaudRate = params->PortSettings.BaudRate;\r
+      params->PortSettings.DefAddress = params->PortSettings.Address;\r
+      params->PortSettings.DefDebug = params->PortSettings.Debug;\r
+      params->PortSettings.DefProMode = params->PortSettings.ProMode;\r
+      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);\r
+      break;\r
+  }\r
+  if ( changed) {\r
+    if(( params->PortSettings.DefBaudRate != params->PortSettings.BaudRate) ||\r
+       ( params->PortSettings.DefAddress != params->PortSettings.Address) ||\r
+       ( params->PortSettings.DefDebug != params->PortSettings.Debug) ||\r
+       ( params->PortSettings.DefProMode != params->PortSettings.ProMode)) {\r
+      PropSheet_Changed( GetParent( hDlg), hDlg);\r
+      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), TRUE);\r
+    } else {\r
+      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);\r
+    }\r
+  }\r
+}\r
+\r
+/********************************************************************/\r
+BOOL Port_OnInitDialog( HWND hDlg, HWND FocusHwnd, LPARAM Lparam)\r
+{\r
+  PPORT_PARAMS params;\r
+\r
+  if ( Lparam) {\r
+    params = (PPORT_PARAMS) ((LPPROPSHEETPAGE)Lparam)->lParam;\r
+    SetWindowLongPtr(hDlg, DWLP_USER, (ULONG_PTR) params);\r
+    FillSettingCommDlg( hDlg, params);\r
+  }\r
+  return TRUE;  // No need for us to set the focus.\r
+}\r
+\r
+/********************************************************************/\r
+BOOL Port_OnNotify( HWND hDlg, LPNMHDR NmHdr)\r
+{\r
+  PPORT_PARAMS params = (PPORT_PARAMS)GetWindowLongPtr( hDlg, DWLP_USER);\r
+\r
+  switch ( NmHdr->code) { // user click on Apply or OK\r
+    case PSN_APPLY:\r
+      //debugPrint("Apply");\r
+      if ( SetPortSettings( hDlg, params)) {\r
+        //debugPrint( "changed");\r
+//        SetupDiCallClassInstaller( DIF_PROPERTYCHANGE, params->DeviceInfoSet, params->DeviceInfoData);\r
+        PropSheet_Changed( GetParent( hDlg), hDlg);\r
+      }\r
+      SetWindowLongPtr( hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);\r
+      return TRUE;        \r
+    default:\r
+      return FALSE;\r
+  }\r
+}\r
+\r
+\r
+/********************************************************************/\r
+INT_PTR APIENTRY PortSettingsDlgProc( IN HWND hDlg, IN UINT uMessage, IN WPARAM wParam, IN LPARAM lParam)\r
+{\r
+  switch(uMessage) {\r
+    case WM_COMMAND:\r
+      Port_OnCommand(hDlg, (int) LOWORD(wParam), (HWND)lParam, (UINT)HIWORD(wParam));\r
+      break;\r
+//    case WM_CONTEXTMENU:\r
+//      WinHelp( (HWND)wParam, sz_evbousb_help, HELP_CONTEXTMENU, (ULONG_PTR) HelpIDs);\r
+//      return FALSE;\r
+//    case WM_HELP: \r
+//      if ( ((LPHELPINFO)lParam)->iContextType == HELPINFO_WINDOW) {\r
+//        WinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, sz_evbousb_help, HELP_WM_HELP, (ULONG_PTR) HelpIDs);\r
+//      }\r
+//      break;\r
+    case WM_INITDIALOG:\r
+      return Port_OnInitDialog(hDlg, (HWND)wParam, lParam); \r
+    case WM_NOTIFY:\r
+      return Port_OnNotify(hDlg,  (NMHDR *)lParam);\r
+  }\r
+  return FALSE;\r
+} /* PortSettingsDialogProc */\r
+\r
+/********************************************************************/\r
+/********************************************************************/\r
+BOOL APIENTRY PropertyPageProvider(LPVOID Info, LPFNADDPROPSHEETPAGE AddFunc, LPARAM Lparam)\r
+{\r
+  PSP_PROPSHEETPAGE_REQUEST pprPropPageRequest;\r
+  PROPSHEETPAGE             psp, psp_about;\r
+  HPROPSHEETPAGE            hpsp, hpsp_about;\r
+  PPORT_PARAMS              params = NULL; \r
+\r
+  pprPropPageRequest = (PSP_PROPSHEETPAGE_REQUEST) Info;\r
+  if (pprPropPageRequest->PageRequested == SPPSR_ENUM_ADV_DEVICE_PROPERTIES) {\r
+    params = (PPORT_PARAMS) LocalAlloc(LPTR, sizeof(PORT_PARAMS));\r
+    if (!params) {\r
+       MessageBox( GetFocus(), ERROR_MEMORY_STRING, applet_name, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);\r
+       return FALSE;\r
+    }\r
+    InitPortParams( params, pprPropPageRequest->DeviceInfoSet, pprPropPageRequest->DeviceInfoData);\r
+//    if ( IsMyDevice(pprPropPageRequest->DeviceInfoSet, pprPropPageRequest->DeviceInfoData) == MY_DEVICE) {\r
+      hpsp = InitSettingsPage(&psp, params);\r
+      if (!hpsp) {\r
+        return FALSE;\r
+      }    \r
+      if ( !(*AddFunc)( hpsp, Lparam)) {\r
+        DestroyPropertySheetPage(hpsp);\r
+        return FALSE;\r
+      }\r
+//    }\r
+  }\r
+  return TRUE;\r
+}\r
+\r
+\r
+\r
+/********************************************************************/\r
+BOOL FillSettingCommDlg( HWND hDlg, IN PPORT_PARAMS params)\r
+{\r
+\r
+#define DWSIZE sizeof(DWORD)\r
+\r
+//  SHORT shIndex;\r
+  TCHAR str[256]; //, hlp[20];\r
+  DWORD size, i = 0; //, j;\r
+  LONG ret; //, idx;\r
+//  BOOL b;\r
+//  HANDLE hCom;\r
+  HKEY hDeviceKey;\r
+  HWND item;\r
+\r
+  // defualt values\r
+  params->PortSettings.DefBaudRate = 19200;\r
+  params->PortSettings.DefDebug = 0;\r
+  params->PortSettings.DefAddress = 2;\r
+  params->PortSettings.DefProMode = 0;\r
\r
+  hDeviceKey = SetupDiOpenDevRegKey( params->DeviceInfoSet, params->DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);\r
+  if ( hDeviceKey == INVALID_HANDLE_VALUE) {\r
+    goto FillCommDlgError;\r
+  } else {\r
+    size = DWSIZE;\r
+    ret = RegQueryValueEx( hDeviceKey, ULANBAUDRATE, NULL, NULL, (PBYTE) &i, &size);\r
+    if ( ret == ERROR_SUCCESS && size==DWSIZE) {\r
+      params->PortSettings.DefBaudRate = i;\r
+    }\r
+    size = DWSIZE;\r
+    ret = RegQueryValueEx( hDeviceKey, ULANMYADDRESS, NULL, NULL, (PBYTE) &i, &size);\r
+    if ( ret == ERROR_SUCCESS && size==DWSIZE) {\r
+      params->PortSettings.DefAddress = i;\r
+    }\r
+    size = DWSIZE;\r
+    ret = RegQueryValueEx( hDeviceKey, ULANDEBUG, NULL, NULL, (PBYTE) &i, &size);\r
+    if ( ret == ERROR_SUCCESS && size==DWSIZE) {\r
+      params->PortSettings.DefDebug = i;\r
+    }\r
+    size = DWSIZE;\r
+    ret = RegQueryValueEx( hDeviceKey, ULANPROMODE, NULL, NULL, (PBYTE) &i, &size);\r
+    if ( ret == ERROR_SUCCESS && size==DWSIZE) {\r
+      params->PortSettings.DefProMode = i;\r
+    }\r
+    RegCloseKey( hDeviceKey);\r
+  }\r
+\r
+  i = 0; item = GetDlgItem( hDlg, PP_ULAN_BAUD);\r
+  ret = 0; // def.select\r
+  while( baud_tbl[i]) {\r
+    wsprintf( str, L"%d", baud_tbl[i]);\r
+    SendMessage( item, CB_ADDSTRING, 0, (LPARAM)str);\r
+    if ( params->PortSettings.DefBaudRate == baud_tbl[i]) \r
+      ret = i;\r
+         i++;\r
+  }\r
+  SendMessage( item, CB_SETCURSEL, ret, 0);\r
+  params->PortSettings.BaudRate = baud_tbl[ret];\r
+\r
+  item = GetDlgItem( hDlg, PP_ULAN_ADDR);\r
+  wsprintf( str, L"%d", params->PortSettings.DefAddress);\r
+  SetWindowText( item, str);\r
+  SendMessage( item, EM_LIMITTEXT, 3, 0); // limit text length\r
+  params->PortSettings.Address = params->PortSettings.DefAddress;\r
+\r
+  i = 0; item = GetDlgItem( hDlg, PP_ULAN_DEBUG);\r
+  ret = 0; // def.select\r
+  while( debug_tbl[i]) {\r
+    SendMessage( item, CB_ADDSTRING, 0, (LPARAM)debug_tbl[i]);\r
+         i++;\r
+  }\r
+  SendMessage( item, CB_SETCURSEL, params->PortSettings.DefDebug, 0);\r
+  params->PortSettings.Debug = params->PortSettings.DefDebug;\r
+\r
+  \r
+  CheckDlgButton( hDlg, PP_ULAN_PMODE, ( params->PortSettings.DefProMode) ? BST_CHECKED : BST_UNCHECKED);\r
+  params->PortSettings.ProMode = params->PortSettings.DefProMode;\r
+\r
+  EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);\r
+//  ShowWindow( GetDlgItem( hDlg, IDC_BOK), SW_HIDE);\r
+  return TRUE;\r
+ FillCommDlgError:\r
+  SetVisibleAndEnable( hDlg, FALSE, FALSE);\r
+  return FALSE;\r
+} /* FillCommDlg */\r
+\r
+\r
+/********************************************************************/\r
+void RestorePortSettings( HWND hDlg, PPORT_PARAMS params)\r
+{\r
+  TCHAR str[20];\r
+  int ret;\r
+\r
+  // Baudrate\r
+  wsprintf( str, L"%d", params->PortSettings.DefBaudRate);\r
+  ret = SendDlgItemMessage( hDlg, PP_ULAN_BAUD, CB_FINDSTRING, -1, (LPARAM) str);\r
+  SendDlgItemMessage( hDlg, PP_ULAN_BAUD, CB_SETCURSEL, ret, 0L);\r
+  params->PortSettings.BaudRate = params->PortSettings.DefBaudRate;\r
+  // Address\r
+  wsprintf( str, L"%d", params->PortSettings.DefAddress);\r
+  SetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str);\r
+  params->PortSettings.Address = params->PortSettings.DefAddress;\r
+  // Debug\r
+  SendDlgItemMessage( hDlg, PP_ULAN_DEBUG, CB_SETCURSEL, params->PortSettings.DefDebug, 0L);\r
+  params->PortSettings.Debug = params->PortSettings.DefDebug;\r
+  // ProMode\r
+  CheckDlgButton( hDlg, PP_ULAN_PMODE, ( params->PortSettings.DefProMode) ? BST_CHECKED : BST_UNCHECKED);\r
+  params->PortSettings.ProMode = params->PortSettings.DefProMode;\r
+}\r
+\r
+/********************************************************************/\r
+BOOL SetPortSettings( IN HWND hDlg, IN PPORT_PARAMS params)\r
+{\r
+  TCHAR  str[20];\r
+  DWORD  size, val;\r
+  HKEY   hDeviceKey = NULL;\r
+  LONG   ret;\r
+/*\r
+wsprintf( str,L"D:0x%X,%d,%d,%d -> N:0x%X,%d,%d,%d", params->PortSettings.DefBaudRate, params->PortSettings.DefDataBits,\r
+          params->PortSettings.DefParity,params->PortSettings.DefStopBits,params->PortSettings.BaudRate,\r
+          params->PortSettings.DataBits,params->PortSettings.Parity,params->PortSettings.StopBits);\r
+MessageBox( hDlg, str,L"TEST - parm",MB_OK);\r
+*/\r
+  // quick return - no change\r
+  if (( params->PortSettings.DefBaudRate == params->PortSettings.BaudRate) &&\r
+      ( params->PortSettings.DefAddress  == params->PortSettings.Address) &&\r
+      ( params->PortSettings.DefDebug    == params->PortSettings.Debug) &&\r
+      ( params->PortSettings.DefProMode  == params->PortSettings.ProMode)) {\r
+    return FALSE;\r
+  }\r
+\r
+  hDeviceKey = SetupDiOpenDevRegKey( params->DeviceInfoSet, params->DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_WRITE);\r
+  if ( hDeviceKey == INVALID_HANDLE_VALUE) {\r
+    goto SetPortSettingsError;\r
+  }\r
+  // BaudRate\r
+//  if ( params->PortSettings.DefBaudRate != params->PortSettings.BaudRate) {\r
+    GetWindowText( GetDlgItem( hDlg, PP_ULAN_BAUD), str, 20);\r
+    val = myatoi( str);\r
+    ret = RegSetValueEx( hDeviceKey, ULANBAUDRATE, 0, REG_DWORD, (BYTE *) &val, sizeof(val));\r
+    if ( ret != ERROR_SUCCESS) goto SetPortSettingsError;      \r
+//  }\r
+  // Address\r
+//  if ( params->PortSettings.DefAddress != params->PortSettings.Address) {\r
+    GetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str, 20);\r
+    val = myatoi( str);\r
+    ret = RegSetValueEx( hDeviceKey, ULANMYADDRESS, 0, REG_DWORD, (BYTE *) &val, sizeof(val));\r
+    if ( ret != ERROR_SUCCESS) goto SetPortSettingsError;      \r
+//  }\r
+  // Debug\r
+//  if ( params->PortSettings.DefDebug != params->PortSettings.Debug) {\r
+    val = SendDlgItemMessage( hDlg, PP_ULAN_DEBUG, CB_GETCURSEL, 0 ,0);\r
+    ret = RegSetValueEx( hDeviceKey, ULANDEBUG, 0, REG_DWORD, (BYTE *) &val, sizeof(val));\r
+    if ( ret != ERROR_SUCCESS) goto SetPortSettingsError;      \r
+//  }\r
+  // ProMode\r
+//  if ( params->PortSettings.DefProMode != params->PortSettings.ProMode) {\r
+    if( IsDlgButtonChecked( hDlg, PP_ULAN_PMODE) == BST_CHECKED)\r
+      val = 1;\r
+    else\r
+      val = 0;\r
+    ret = RegSetValueEx( hDeviceKey, ULANPROMODE, 0, REG_DWORD, (BYTE *) &val, sizeof(val));\r
+    if ( ret != ERROR_SUCCESS) goto SetPortSettingsError;      \r
+//  }\r
+\r
+  RegCloseKey( hDeviceKey);\r
+  return TRUE;\r
+ SetPortSettingsError:\r
+  if ( hDeviceKey) RegCloseKey( hDeviceKey);\r
+  return FALSE;\r
+}\r
+\r
+/********************************************************************/\r
+VOID SetVisibleAndEnable( HWND hDlg, BOOL chng, BOOL ok) {\r
+  if ( !chng) {\r
+    EnableWindow( GetDlgItem( hDlg, PP_ULAN_BAUD), FALSE);\r
+    EnableWindow( GetDlgItem( hDlg, PP_ULAN_ADDR), FALSE);\r
+    EnableWindow( GetDlgItem( hDlg, PP_ULAN_DEBUG), FALSE);\r
+    EnableWindow( GetDlgItem( hDlg, PP_ULAN_PMODE), FALSE);\r
+\r
+    EnableWindow( GetDlgItem( hDlg, IDC_LBAUD), FALSE);\r
+    EnableWindow( GetDlgItem( hDlg, IDC_LADDR), FALSE);\r
+    EnableWindow( GetDlgItem( hDlg, IDC_LDEBUG), FALSE);\r
+\r
+    EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);\r
+    EnableWindow( GetDlgItem(  hDlg, IDC_GSET), FALSE);\r
+  }\r
+//  if ( !ok) {\r
+//    ShowWindow( GetDlgItem( hDlg, IDC_BOK), SW_HIDE);\r
+//  }\r
+}\r
+\r
+\r
+\r
+/********************************************************************/\r
+int myatoi(LPTSTR pszInt)\r
+{\r
+  int retval = 0;\r
+  if ( pszInt) {\r
+    while ( *pszInt) {\r
+      if (( *pszInt >= TEXT('0')) && ( *pszInt <= TEXT('9'))) {\r
+        retval = retval * 10 + (int)(*pszInt-TEXT('0'));\r
+      }\r
+      pszInt++;\r
+    }\r
+  }\r
+  return (retval);\r
+}\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/proppage.h b/ulan/host/ul_drv/ul_dll/pp/proppage.h
new file mode 100644 (file)
index 0000000..1f1d48e
--- /dev/null
@@ -0,0 +1,71 @@
+/**************************************************/\r
+/* uLan property page - Roman Bartosinski (C)2003 */\r
+/**************************************************/\r
+#ifndef PROPERTY_PAGE_H\r
+  #define PROPERTY_PAGE_H\r
+\r
+  #include <windows.h>\r
+  #include <tchar.h>\r
+  #include <setupapi.h>\r
+\r
+  #include "resource.h"\r
+\r
+/********************************************************************/\r
+\r
+  #define ERROR_MEMORY_STRING       TEXT("Insufficient memory for this operation;\r\rclose one or more Windows applications to increase available memory.")\r
+\r
+  #if DBG\r
+    #define debugPrint(_x_) MessageBox(NULL,TEXT(_x_),TEXT("PROPPAGE CI - DebugInfo"),MB_OK | MB_ICONINFORMATION)\r
+    #define debugPrintP(_x_) MessageBox(NULL,_x_,TEXT("PROPPAGE CI - DebugInfo"),MB_OK | MB_ICONINFORMATION)\r
+    //DbgPrint _x_\r
+  #else\r
+    #define debugPrint(_x_)\r
+    #define debugPrintP(_x_)\r
+  #endif\r
+\r
+/********************************************************************/\r
+\r
+  #define ULANBAUDRATE  TEXT("uLanBaudrate")\r
+  #define ULANMYADDRESS TEXT("uLanMyAddress")\r
+  #define ULANDEBUG     TEXT("uLanDebugLevel")\r
+  #define ULANPROMODE   TEXT("uLanProMode")\r
+\r
+  #define ULANADDR_MIN  1\r
+  #define ULANADDR_MAX  100\r
+\r
+/********************************************************************/\r
+\r
+  typedef struct {\r
+    DWORD  DefBaudRate;\r
+    DWORD  DefAddress;  \r
+    DWORD  DefDebug;\r
+    DWORD  DefProMode;\r
+    DWORD  BaudRate;\r
+    DWORD  Address;  \r
+    DWORD  Debug;\r
+    DWORD  ProMode;\r
+  } PP_PORTSETTINGS, *PPP_PORTSETTINGS;\r
+\r
+  typedef struct _PORT_PARAMS {\r
+    PP_PORTSETTINGS              PortSettings;\r
+    HDEVINFO                     DeviceInfoSet;\r
+    PSP_DEVINFO_DATA             DeviceInfoData;\r
+    BOOL                         ChangesEnabled;\r
+    BOOL                         SomethingWasChanged;\r
+  } PORT_PARAMS, *PPORT_PARAMS;\r
+\r
+\r
+/********************************************************************/\r
+\r
+  HPROPSHEETPAGE InitSettingsPage( PROPSHEETPAGE *Psp, OUT PPORT_PARAMS Params);\r
+  UINT CALLBACK PortSettingsDlgCallback( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp);\r
+  INT_PTR APIENTRY PortSettingsDlgProc( IN HWND   hDlg, IN UINT   uMessage, IN WPARAM wParam, IN LPARAM lParam);\r
+  BOOL FillSettingCommDlg( IN HWND hDlg, IN PPORT_PARAMS params);\r
+  BOOL SetPortSettings( IN HWND hDlg, IN PPORT_PARAMS params);\r
+  void RestorePortSettings( HWND hDlg, PPORT_PARAMS Params);\r
+  VOID SetVisibleAndEnable( HWND hDlg, BOOL chng, BOOL ok);\r
+\r
+  int myatoi(LPTSTR pszInt);\r
+\r
+#endif\r
+\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/proppage.rc b/ulan/host/ul_drv/ul_dll/pp/proppage.rc
new file mode 100644 (file)
index 0000000..1cae148
--- /dev/null
@@ -0,0 +1,184 @@
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#define APSTUDIO_HIDDEN_SYMBOLS\r
+#include "windows.h"\r
+#undef APSTUDIO_HIDDEN_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Czech resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_CZECH, SUBLANG_DEFAULT\r
+#pragma code_page(1250)\r
+#endif //_WIN32\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+3 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+#endif    // Czech resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// English (U.S.) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "#include ""windows.h""\r\n"\r
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+DLG_PPAGE DIALOGEX 0, 0, 253, 193\r
+STYLE DS_3DLOOK | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | \r
+    WS_CAPTION | WS_SYSMENU\r
+EXSTYLE WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_STATICEDGE\r
+CAPTION "Properties"\r
+FONT 8, "MS Shell Dlg", 0, 0, 0x1\r
+BEGIN\r
+    GROUPBOX        " uLan device settings ",IDC_GSET,10,10,230,135,\r
+                    BS_CENTER\r
+    RTEXT           "uLan &Baud rate:",IDC_LBAUD,25,20,54,8\r
+    COMBOBOX        PP_ULAN_BAUD,85,25,60,80,CBS_DROPDOWNLIST | WS_VSCROLL | \r
+                    WS_TABSTOP\r
+    RTEXT           "uLan &Address:",IDC_LADDR,25,50,54,8\r
+    EDITTEXT        PP_ULAN_ADDR,85,55,30,14,ES_NUMBER\r
+    RTEXT           "&Debug level:",IDC_LDEBUG,35,80,44,8\r
+    COMBOBOX        PP_ULAN_DEBUG,85,85,60,60,CBS_DROPDOWNLIST | WS_VSCROLL | \r
+                    WS_TABSTOP\r
+    CONTROL         "&Prosp.mode:",PP_ULAN_PMODE,"Button",BS_AUTOCHECKBOX | \r
+                    BS_LEFTTEXT | WS_TABSTOP,40,110,54,10\r
+    PUSHBUTTON      "Re&fresh device",IDC_REFRESH,170,105,55,14\r
+    PUSHBUTTON      "&Restore",IDC_RESTORE,170,50,55,14,WS_DISABLED | \r
+                    WS_GROUP\r
+    PUSHBUTTON      "&OK",IDC_OK,125,148,50,14,NOT WS_VISIBLE | WS_DISABLED\r
+    DEFPUSHBUTTON   "&Apply",IDC_APPLY,170,25,55,14\r
+    LTEXT           "(1-100)",IDC_STATIC,55,60,23,8,WS_DISABLED\r
+END\r
+\r
+\r
+#ifndef _MAC\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION 1,0,0,0\r
+ PRODUCTVERSION 1,0,0,0\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x40004L\r
+ FILETYPE 0x2L\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "080904b0"\r
+        BEGIN\r
+            VALUE "Comments", "\0"\r
+            VALUE "CompanyName", "Roman Bartosinski\0"\r
+            VALUE "FileDescription", "uLan Property page\0"\r
+            VALUE "FileVersion", "1, 0, 0, 0\0"\r
+            VALUE "InternalName", "proppage\0"\r
+            VALUE "LegalCopyright", "Copyright © 2003\0"\r
+            VALUE "LegalTrademarks", "\0"\r
+            VALUE "OriginalFilename", "proppage.rc\0"\r
+            VALUE "PrivateBuild", "\0"\r
+            VALUE "ProductName", "uLan Property page provider\0"\r
+            VALUE "ProductVersion", "1, 0, 0, 0\0"\r
+            VALUE "SpecialBuild", "\0"\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x809, 1200\r
+    END\r
+END\r
+\r
+#endif    // !_MAC\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// DESIGNINFO\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+GUIDELINES DESIGNINFO DISCARDABLE \r
+BEGIN\r
+    DLG_PPAGE, DIALOG\r
+    BEGIN\r
+        RIGHTMARGIN, 208\r
+        BOTTOMMARGIN, 155\r
+    END\r
+END\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+#endif    // English (U.S.) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/resource.h b/ulan/host/ul_drv/ul_dll/pp/resource.h
new file mode 100644 (file)
index 0000000..8054e72
--- /dev/null
@@ -0,0 +1,31 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Developer Studio generated include file.\r
+// Used by proppage.rc\r
+//\r
+#define DLG_PPAGE                       17\r
+#define IDI_ICON1                       109\r
+#define PP_ULAN_BAUD                    841\r
+#define PP_ULAN_DEBUG                   843\r
+#define IDC_RESTORE                     844\r
+#define IDC_OK                          1044\r
+#define IDC_LBAUD                       1045\r
+#define IDC_LADDR                       1046\r
+#define IDC_LDEBUG                      1047\r
+#define IDC_GSET                        1049\r
+#define PP_ULAN_ADDR                    1056\r
+#define PP_ULAN_PMODE                   1057\r
+#define IDC_REFRESH                     1058\r
+#define IDC_APPLY                       1059\r
+#define IDC_STATIC                      -1\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NO_MFC                     1\r
+#define _APS_NEXT_RESOURCE_VALUE        110\r
+#define _APS_NEXT_COMMAND_VALUE         40001\r
+#define _APS_NEXT_CONTROL_VALUE         1060\r
+#define _APS_NEXT_SYMED_VALUE           101\r
+#endif\r
+#endif\r
diff --git a/ulan/host/ul_drv/ul_dll/pp/sources b/ulan/host/ul_drv/ul_dll/pp/sources
new file mode 100644 (file)
index 0000000..7269498
--- /dev/null
@@ -0,0 +1,30 @@
+TARGETNAME=ulanpp\r
+TARGETPATH=.\r
+TARGETTYPE=DYNLINK\r
+TARGETEXT=dll\r
+DLLENTRY=LibMain\r
+\r
+TARGETLIBS=$(SDK_LIB_PATH)\setupapi.lib     \\r
+           $(SDK_LIB_PATH)\libc.lib         \\r
+           $(SDK_LIB_PATH)\user32.lib       \\r
+           $(SDK_LIB_PATH)\advapi32.lib     \\r
+           $(SDK_LIB_PATH)\kernel32.lib     \\r
+           $(SDK_LIB_PATH)\gdi32.lib        \\r
+           $(SDK_LIB_PATH)\shell32.lib      \\r
+           $(SDK_LIB_PATH)\comctl32.lib     \\r
+           $(SDK_LIB_PATH)\cfgmgr32.lib     \\r
+           $(SDK_LIB_PATH)\msports.lib      \\r
+           $(SDK_LIB_PATH)\version.lib      \r
+\r
+!IFNDEF MSC_WARNING_LEVEL\r
+MSC_WARNING_LEVEL=/W3\r
+!ENDIF\r
+\r
+MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX\r
+\r
+USE_MAPSYM=0\r
+\r
+C_DEFINES=-DWIN32 -DW3 -DUNICODE -D_UNICODE \r
+\r
+SOURCES=proppage.rc \\r
+        proppage.c \r
diff --git a/ulan/host/ul_drv/ul_dll/pp/ulanpp.def b/ulan/host/ul_drv/ul_dll/pp/ulanpp.def
new file mode 100644 (file)
index 0000000..ae0f49b
--- /dev/null
@@ -0,0 +1,6 @@
+LIBRARY ULANPP.DLL\r
+\r
+EXPORTS\r
+        LibMain\r
+       PropertyPageProvider\r
+\r
diff --git a/ulan/host/ul_drv/ul_drv.lsm b/ulan/host/ul_drv/ul_drv.lsm
new file mode 100644 (file)
index 0000000..1ec8898
--- /dev/null
@@ -0,0 +1,28 @@
+Begin4
+Title:         ul_drv
+Version:       0.7.3
+Entered-date:  2008-01-27
+Description:   + uLan provides 9-bit character message
+                  oriented communication protocol, 
+                  which is transfered over RS-485 link.
+                  Physical layer consist of one twisted 
+                  pair of leads and RS-485 transceivers.
+                + ul_drv is Linux and Windows device driver
+                 designed to access uLan network.
+                  supported hardware is i82510 RS-485 card 
+                  or simple active converter dongle
+                  for standard PC RS-232 ports.
+               + more informations can be found at
+                   http://ulan.sourceforge.net/
+                   http://cmp.felk.cvut.cz/~pisa/ulan
+Keywords:      RS-485 9-bit uLan fieldbus
+Author:        pisa@cmp.felk.cvut.cz (Pavel Pisa)
+Maintained-by: pisa@cmp.felk.cvut.cz (Pavel Pisa)
+Primary-site:  http://prdownloads.sourceforge.net/ulan/
+                273 kB ul_drv-0.7.2.tar.gz
+Alternate-site: http://cmp.felk.cvut.cz/~pisa/ulan
+                273 kB ul_drv-0.7.2.tar.gz
+Original-site:
+Platforms:     Linux 2.4.x, 2.6.x, DOS, Windows NT/XP/2000/98
+Copying-policy:        GPL
+End
diff --git a/ulan/host/ul_drv/ul_drv/.cvsignore b/ulan/host/ul_drv/ul_drv/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/ul_drv/ul_drv/CVS/Entries b/ulan/host/ul_drv/ul_drv/CVS/Entries
new file mode 100644 (file)
index 0000000..f095015
--- /dev/null
@@ -0,0 +1,54 @@
+/.cvsignore/1.2/Wed Sep 22 22:13:11 2004//
+/Makefile.omk/1.10/Thu Jan  3 00:37:28 2008//
+/Makefile.std/1.2/Sun Jan  7 15:30:57 2007//
+/Makefile.wdf/1.1/Sun Oct 29 11:23:37 2006//
+/README/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/emu_irq.c/1.1/Sat Mar 26 15:12:38 2005//
+/emu_irq.h/1.1/Sat Mar 26 15:12:38 2005//
+/k_compat.h/1.8/Sat Mar  1 23:00:50 2008//
+/serial_reg.h/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/sources/1.1/Sun Oct 29 11:23:37 2006//
+/ul_82510.h/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/ul_base.c/1.9/Wed Jan 16 19:53:19 2008//
+/ul_c450.c/1.14/Thu Jan  3 00:37:28 2008//
+/ul_c510.c/1.2/Thu Jan 26 01:55:58 2006//
+/ul_c950pci.c/1.2/Thu Jan 26 01:55:58 2006//
+/ul_cps1.c/1.6/Tue Jun  5 11:41:39 2007//
+/ul_debug.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_devtab.c/1.7/Wed Nov 28 22:31:45 2007//
+/ul_di.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_djgpp.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_drv.c/1.10/Thu Dec 28 14:35:04 2006//
+/ul_drv.dsp/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_drv.dsw/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_drv.h/1.10/Sun Jan 27 19:09:38 2008//
+/ul_drv.lnd/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/ul_drv.lnr/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/ul_drv.mak/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/ul_drv_iac.h/1.4/Mon Jul 31 19:51:12 2006//
+/ul_drv_init.h/1.2/Wed Jul 26 11:56:51 2006//
+/ul_frame.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_hdep.h/1.19/Sat Mar  1 23:00:50 2008//
+/ul_iac.c/1.4/Mon Jul 31 19:51:12 2006//
+/ul_inlib.c/1.9/Tue Jun  5 11:41:39 2007//
+/ul_kdmnt.c/1.2/Thu Jan 26 01:55:58 2006//
+/ul_linpci.c/1.6/Thu Jan 26 01:55:58 2006//
+/ul_linusb.c/1.4/Thu Jan 26 01:55:58 2006//
+/ul_linux.c/1.11/Sun Nov 25 09:12:19 2007//
+/ul_mem.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_sysless.c/1.3/Sun Oct 29 21:39:23 2006//
+/ul_tors.c/1.4/Sat Mar  1 23:00:50 2008//
+/ul_tst.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_ufsm.c/1.8/Thu Dec 28 14:35:05 2006//
+/ul_wdbase.c/1.7/Wed Jan 16 19:55:01 2008//
+/ul_wdbase.h/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_wdent.c/1.2/Wed Dec 22 15:51:23 2004//
+/ul_wdinc.h/1.2/Wed Dec 22 15:51:23 2004//
+/ul_wdm.dsp/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_wdm.lnr/1.1.1.1/Fri Sep 10 17:46:33 2004//
+/ul_wdm.mak/1.2/Wed Dec 22 15:51:23 2004//
+/ul_wdpnp.c/1.7/Wed Jan 16 19:56:30 2008//
+/ul_wdpwr.c/1.1/Thu Jan 13 20:13:04 2005//
+/ul_wdusb.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_wdusb.h/1.1.1.1/Fri Sep 10 17:46:40 2004//
+D
diff --git a/ulan/host/ul_drv/ul_drv/CVS/Repository b/ulan/host/ul_drv/ul_drv/CVS/Repository
new file mode 100644 (file)
index 0000000..fcd05dd
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_drv
diff --git a/ulan/host/ul_drv/ul_drv/CVS/Root b/ulan/host/ul_drv/ul_drv/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_drv/Makefile.omk b/ulan/host/ul_drv/ul_drv/Makefile.omk
new file mode 100644 (file)
index 0000000..78b4fce
--- /dev/null
@@ -0,0 +1,31 @@
+default_CONFIG += CONFIG_OC_UL_DRV_USLIB=x CONFIG_OC_UL_DRV_SYSLESS=x
+default_CONFIG += CONFIG_OC_UL_DRV_U450_VARPINS=n
+default_CONFIG += CONFIG_OC_UL_DRV_U450_LOOPBACK=n
+default_CONFIG += CONFIG_OC_UL_DRV_U450_TMELATE=n
+
+LOCAL_CONFIG_H = ul_drv_config.h
+
+INCLUDES += -I . 
+
+# Driver compiled into userspace library
+ifeq ($(CONFIG_OC_UL_DRV_USLIB),y)
+FLAG_UL_DRV_IN_LIB=y
+lib_LIBRARIES = ul_drv
+ul_drv_SOURCES = ul_drv.c emu_irq.c
+CFLAGS += -D CONFIG_OC_UL_DRV_USLIB
+endif
+
+# Driver compiled for sysless
+ifeq ($(CONFIG_OC_UL_DRV_SYSLESS),y)
+FLAG_UL_DRV_IN_LIB=y
+nobase_include_HEADERS = ul_drv_init.h ul_drv_iac.h
+lib_LIBRARIES = ul_drv
+ul_drv_SOURCES = ul_drv.c
+CFLAGS += -D CONFIG_OC_UL_DRV_SYSLESS
+endif
+
+# Linux-kernel version of build
+ifneq ($(FLAG_UL_DRV_IN_LIB),y)
+kernel_MODULES = ul_drv
+ul_drv_SOURCES = ul_drv.c
+endif
diff --git a/ulan/host/ul_drv/ul_drv/Makefile.std b/ulan/host/ul_drv/ul_drv/Makefile.std
new file mode 100644 (file)
index 0000000..5bb3029
--- /dev/null
@@ -0,0 +1,102 @@
+#*******************************************************************
+# uLan Communication - Makefile for regular compilation 
+#                      through Linux kernel rules
+#
+# Makefile-mod - driver definitions and types
+#
+# (C) Copyright 1999 by Pavel Pisa 
+#
+# The uLan driver is distributed under the Gnu General Public Licence. 
+# See file COPYING for details.
+#
+# Author reserves right to use and publish sources for embedded 
+# applications under different conditions too.
+#*******************************************************************/
+
+# currently running kernel
+CURRENT=$(shell uname -r)
+KERNEL_NEW=$(shell if [ -d /lib/modules/$(CURRENT)/build ] ; \
+               then echo yes ; else echo no ; fi )
+
+# Where to look for kernel
+#KERNEL_LOCATION=/usr/src/linux
+#KERNEL_LOCATION=/usr/src/linux-2.4.22
+#KERNEL_LOCATION=/usr/src/linux-2.5.69
+#KERNEL_LOCATION=/usr/src/kernel/$(CURRENT)
+#KERNEL_LOCATION=/lib/modules/$(CURRENT)/build
+
+ifndef KERNEL_LOCATION
+ifeq ($(KERNEL_NEW),yes)
+KERNEL_LOCATION=/lib/modules/$(CURRENT)/build
+MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/kernel/drivers/char
+else
+KERNEL_LOCATION=/usr/src/linux
+MODULE_CHAR_LOC=/lib/modules/$(CURRENT)/misc
+endif
+endif
+
+# Test for latest 2.5.xx and future 2.6.xx kernels
+KERNEL_VERSION := $(shell awk -F\" '/REL/ {print $$2}' \
+       $(KERNEL_LOCATION)/include/linux/version.h | awk -F\- '{print $$1}')
+
+ifeq ($(KERNEL_VERSION),)
+KERNEL_VERSION=$(shell grep UTS_RELEASE ${KERNEL_LOCATION}/include/linux/utsrelease.h | \
+                 sed 's/[^"]*"\(.*\)\{1\}"/\1/')
+endif
+
+KERNEL_MODULE_V26 := $(shell echo $(KERNEL_VERSION) \
+       | sed -n 's/^.*2\.[5-9]\..*$$/yes/p')
+
+# Target object file if any
+O_TARGET     :=
+# Regular object files
+O_OBJS       = ul_drv.o
+# Objects with exported symbols (-DEXPORT_SYMTAB)
+OX_OBJS      =
+# Module objects 
+M_OBJS       = $(O_OBJS)
+# Module only objects with exported symbols (-DEXPORT_SYMTAB)
+MX_OBJS      = 
+# Kernel only objects 
+L_OBJS       = 
+# Kernel only objects with exported symbols (-DEXPORT_SYMTAB)
+LX_OBJS      = 
+# Additional CFLAGS
+EXTRA_CFLAGS =
+#EXTRA_CFLAGS += -ggdb
+
+# Linux 2.4.2 build system needs next
+obj-m += $(O_OBJS)
+
+ifndef KERNEL_MODULE_V26
+FINAL_MODULE_OBJS=$(obj-m)
+else
+FINAL_MODULE_OBJS=$(obj-m:%.o=%.ko)
+endif
+
+########## Source/target independent buil of module #############
+
+all : default
+
+default : make_this_module
+
+dep: make_this_module_dep
+
+install : install_this_module
+
+make_this_module:
+       DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR modules)
+
+make_this_module_dep:
+       DIR=`pwd`; (cd $(KERNEL_LOCATION); make SUBDIRS=$$DIR dep)
+
+install_this_module: make_this_module
+       su -c "mkdir -v -p $(MODULE_CHAR_LOC) && cp -v $(FINAL_MODULE_OBJS) $(MODULE_CHAR_LOC)"
+
+clean:
+       rm -f $(M_OBJS) $(MX_OBJS) *.ko .*.o.flags .*.o.cmd .*.ko.cmd .depend *~ \
+           *.mod.c *.mod.o
+
+ifndef KERNEL_MODULE_V26
+include $(KERNEL_LOCATION)/Rules.make
+endif
diff --git a/ulan/host/ul_drv/ul_drv/Makefile.wdf b/ulan/host/ul_drv/ul_drv/Makefile.wdf
new file mode 100644 (file)
index 0000000..8881d45
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the components of Windows
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
+
diff --git a/ulan/host/ul_drv/ul_drv/README b/ulan/host/ul_drv/ul_drv/README
new file mode 100644 (file)
index 0000000..9edf318
--- /dev/null
@@ -0,0 +1,89 @@
+ul_drv - uLan RS-485 communication driver
+
+Copyright (C) 1999 Pavel Pisa  (pisa@cmp.felk.cvut.cz)
+
+uLan provides 9-bit message oriented communication protocol,
+which is transfered over RS-485 link. Characters are transfered
+same way as for RS-232 asynchronous transfer except parity
+bit, which is used to distinguish between data characters
+and protocol control information. Physical layer consist
+of one twisted pair of leads and RS-485 transceivers.
+
+ul_drv is Linux device driver designed to access uLan network. 
+Latest versions of the ul_drv can be compiled from same 
+source into Windows NT KMD driver too (try to use ul_drv.mak).
+Today supported hardware is i82510 RS-485 card or simple
+active converter dongle for standard PC RS-232 ports.
+This version of driver was compiled and tested with 
+Linux 2.2.4 kernel. Header file k_compat.h should enable
+compilation for most of 2.0.xx, 2.1.xx and 2.2.xx kernels,
+but tweaking of k_compat.h may be necessary for some
+2.1.xx kernel versions.
+
+Makefile is link to Makefile-mod to compile driver with
+your kernel configuration. Makefile-mod expect, that
+kernel sources are in "/usr/src/linux" directory
+and that kernel sources and its configuration 
+are of same version as current running kernel.
+Enter next command in ul_drv directory to compile and
+install the module
+
+    make install
+
+Module is installed into "/lib/modules/x.y.z/misc" directory.
+
+Driver can control up to four devices, but only check
+for 0x3e8 port number is default behavior after "insmod ul_drv".
+Because of driver controls same hardware as Linux serial
+driver, it is necessary to disable default kernel driver
+for same port in case of conflict. It can be done for example by
+
+    setserial /dev/ttyS2 uart none
+
+Port numbers and others parameters can be defined by module 
+parameters. To access driver from programs special character
+device files must be created. Suggested names are
+
+    mknod /dev/ulan0 c 248 0
+    mknod /dev/ulan1 c 248 1
+    ln -sf /dev/ulan0 /dev/ulan
+
+"/dev/ulan" is default name for client programs.
+Major number 248 is in experimental range and will
+be changed in future. Number is defined in ul_hdep.h.
+If defined as zero, dynamic number is assigned after insmod.
+
+ul_drv module parameters
+
+  port=<iop>{,<iop> ...}
+       up to four IO port numbers separated by comas
+        for up to four uLan devices
+
+  irq=<int>{,<int> ...}
+       select for every defined device corresponding
+       IRQ number. Value 0 means autoprobe.
+
+  baud=<spd>{,<spd> ...}
+       defines transfer baud-rate for every device
+       default value is 9600
+
+  my_adr=<adr>{,<adr> ...}
+       address of every computer interface as seen
+       from uLan network 
+       range is from 1 to 64
+       default value is 2 for all interfaces
+
+
+Bellow are example parameters for dongle converter plugged
+to regular COM2 port.
+
+    setserial /dev/ttyS1 uart none
+    insmod ul_drv port=0x2f8 irq=3 baud=9600 my_adr=2
+
+Add next lines to /etc/modules.conf to enable on-demand
+module loading
+
+    alias    char-major-248 ul_drv
+    options    ul_drv port=0x2f8 irq=3 baud=9600 my_adr=2
+    pre-install ul_drv /sbin/setserial /dev/ttyS1 uart none
+
diff --git a/ulan/host/ul_drv/ul_drv/emu_irq.c b/ulan/host/ul_drv/ul_drv/emu_irq.c
new file mode 100644 (file)
index 0000000..80bd358
--- /dev/null
@@ -0,0 +1,215 @@
+/*******************************************************************
+  User space IRQ handling emulator for i386 Linux based PCs
+  It uses VM86_PLUS services developed for DOSEMU
+
+  emu_irq.c
+
+  (C) Copyright 1998 by Pavel Pisa 
+
+  This code is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+
+#include <asm/vm86.h>
+#include <sys/syscall.h>
+
+#include "emu_irq.h"
+
+#define NEW_SYS_vm86  166
+
+static inline int vm86_plus(int function, int param)
+{
+       int __res;
+       __asm__ __volatile__("int $0x80\n"
+       :"=a" (__res):"a" ((int)NEW_SYS_vm86), "b" (function), "c" (param));
+       return __res;
+} 
+
+int emu_irq_initialized=0;
+
+struct emu_irq {
+    emu_irq_handler *handler;
+    void   *dev_id;
+  } emu_irq_arr[16]={{0,},};
+
+void emu_irq_hanle_sig(int signo)
+{ unsigned emu_irq_set;
+  int intno;
+  int ret;
+  if(!emu_irq_initialized) return;
+  emu_irq_set = vm86_plus(VM86_GET_IRQ_BITS,0);
+  intno=0;
+  while (emu_irq_set)
+  {
+    if((emu_irq_set&1)&&emu_irq_arr[intno].handler)
+    { ret = vm86_plus(VM86_GET_AND_RESET_IRQ,intno);
+      emu_irq_arr[intno].handler(intno,emu_irq_arr[intno].dev_id,NULL);
+    };
+    emu_irq_set>>=1;
+    intno++;
+  }
+};
+
+void release_all_emu_irq(void);
+
+int request_emu_irq(unsigned int intno, emu_irq_handler *handler,
+                    unsigned long flags, const char *device, void *dev_id)
+{ int ret;
+
+  if(!emu_irq_initialized)
+  { struct sigaction emu_irq_sig;
+    struct sigaction old_sig;
+    memset(&emu_irq_sig,0,sizeof(emu_irq_sig));
+    emu_irq_initialized=1;
+    emu_irq_sig.sa_handler=emu_irq_hanle_sig;
+    sigemptyset(&emu_irq_sig.sa_mask);
+    emu_irq_sig.sa_flags=SA_RESTART;
+    emu_irq_sig.sa_restorer=0;
+    sigaction(EMU_IRQ_SIG,&emu_irq_sig,&old_sig);
+    atexit(&release_all_emu_irq);
+  };
+
+  if (intno>=16) return -EINVAL;
+  if (emu_irq_arr[intno].handler) return -EINVAL;
+  emu_irq_arr[intno].handler=handler;
+  emu_irq_arr[intno].dev_id=dev_id;
+  ret = vm86_plus(VM86_REQUEST_IRQ,(EMU_IRQ_SIG<<8)| intno);
+  if (ret!=intno)
+  { emu_irq_arr[intno].handler=NULL;
+    return -EPERM;
+  };
+  return ret;
+};
+
+int  release_emu_irq(int intno, void *dev_id)
+{ int ret;
+  ret = vm86_plus(VM86_FREE_IRQ,intno);
+  emu_irq_arr[intno].handler=NULL;
+  return ret;
+};
+
+void release_all_emu_irq(void)
+{
+ int intno;
+ if(emu_irq_initialized)
+ {
+  for(intno=0;intno<16;intno++)
+   if(emu_irq_arr[intno].handler!=NULL) 
+    release_emu_irq(intno,emu_irq_arr[intno].dev_id);
+  emu_irq_initialized=0;
+ };
+};
+
+/*******************************************************************/
+/* usage example */
+
+#if 0
+
+#include <asm/io.h>
+#include <linux/serial_reg.h>
+
+void my_irq_handler(int intno, void *dev_id, void *regs)
+{
+  int irq_src;
+  int rec_chr;
+  unsigned long ser_port_base=*(int *)dev_id;
+
+  printf("Emulated irq %d!\n",intno);
+  while(!((irq_src=inb(ser_port_base+UART_IIR))&UART_IIR_NO_INT))
+  { 
+    switch (irq_src & UART_IIR_ID)
+    {
+      case UART_IIR_RDI:
+        printf("RI : ");
+        rec_chr=inb(ser_port_base+UART_RX);
+        printf("rec  0x%02x ",rec_chr);
+        if (rec_chr>=' ')printf("'%c'",rec_chr);
+        break;
+      case UART_IIR_THRI:
+        printf("TI : ");
+        break;
+      case UART_IIR_RLSI:
+        printf("RM : ");
+        printf("lsr  0x%02x",inb(ser_port_base+UART_LSR));
+        break;
+      case UART_IIR_MSI:
+        printf("MI : ");
+        printf("msr  0x%02x",inb(ser_port_base+UART_MSR));
+        break;
+    };
+    printf("\n");
+  };
+};
+
+int main(int argc, char **argv)
+{ int ret;
+  unsigned long ser_port_base=0x2F8;
+  unsigned ser_irq=3;
+  int key;
+  int lcr_mode;
+  int ier_enable;
+  int baud_div;
+  ret=ioperm(ser_port_base,8l,1);
+  if (ret<0) { perror("cannot request ioports"); return 4;};
+
+  ret = request_emu_irq(ser_irq, my_irq_handler, 0, "test", &ser_port_base);
+  if (ret<0) { perror("cannot request interrupt"); return 4;};
+
+  outb(0x00,ser_port_base+UART_MCR);
+  outb(UART_LCR_DLAB,ser_port_base+UART_LCR);
+
+  baud_div=12;
+  outb(baud_div,ser_port_base+UART_DLL);
+  outb(baud_div>>8,ser_port_base+UART_DLM);
+
+  /* UART_LCR_SPAR,UART_LCR_EPAR,UART_LCR_PARITY,UART_LCR_STOP */
+  /* UART_LCR_WLEN8 */
+  lcr_mode=UART_LCR_WLEN8;
+  outb(lcr_mode,ser_port_base+UART_LCR);
+
+  ier_enable=UART_IER_MSI | UART_IER_THRI | UART_IER_RDI | UART_IER_RLSI;
+  outb(ier_enable,ser_port_base+UART_IER);
+
+  outb(UART_IIR_NO_INT,ser_port_base+UART_IIR);
+  inb(ser_port_base+UART_LSR);
+  inb(ser_port_base+UART_MSR);
+  inb(ser_port_base+UART_IIR);
+  inb(ser_port_base);
+  outb(0x0F,ser_port_base+UART_MCR);
+
+  outb(0x55,ser_port_base);
+
+  do {
+    key=getchar();
+    switch (key)
+    {
+      case 'c': outb(0x01,ser_port_base+UART_IIR); break;
+      case 's': if(!(inb(ser_port_base+UART_IIR)&UART_IIR_NO_INT)) printf("#");
+                inb(ser_port_base+UART_LSR); break;
+      case 'm': inb(ser_port_base+UART_MSR); break;
+      case 'r': inb(ser_port_base+UART_RX); break;
+      case 't': outb(0x55,ser_port_base+UART_TX); break;
+      case 'l': outb(0x0D,ser_port_base+UART_TX); break;
+    };
+  } while(key!='q');
+  // getchar();
+
+  outb(0x00,ser_port_base+UART_IER);
+  outb(0x00,ser_port_base+UART_MCR);
+
+  release_emu_irq(ser_irq, &ser_port_base);
+  ioperm(ser_port_base,8l,0);
+  
+  return 0;
+};
+
+#endif
diff --git a/ulan/host/ul_drv/ul_drv/emu_irq.h b/ulan/host/ul_drv/ul_drv/emu_irq.h
new file mode 100644 (file)
index 0000000..edc899a
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef EMU_IRQ_H
+#define EMU_IRQ_H
+
+/*******************************************************************
+  User space IRQ handling emulator for i386 Linux based PCs
+  It uses VM86_PLUS services developed for DOSEMU
+
+  emu_irq.h
+
+  (C) Copyright 1998 by Pavel Pisa 
+
+  This code is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <signal.h>
+
+#define USER_SPACE_EMU_IRQ
+
+#define EMU_IRQ_SIG SIGIO
+
+static inline void emu_irq_cli(void)
+{sigset_t my_set;
+ sigemptyset(&my_set);
+ sigaddset(&my_set,EMU_IRQ_SIG);
+ sigprocmask(SIG_BLOCK,&my_set,NULL);
+};
+
+static inline void emu_irq_sti(void)
+{sigset_t my_set;
+ sigemptyset(&my_set);
+ sigaddset(&my_set,EMU_IRQ_SIG);
+ sigprocmask(SIG_UNBLOCK,&my_set,NULL);
+};
+
+typedef  void (emu_irq_handler)(int intno, void *dev_id, void *regs);
+
+int  request_emu_irq(unsigned int intno, 
+                     emu_irq_handler *handler,
+                     unsigned long flags, 
+                     const char *device,
+                     void *dev_id);
+int  release_emu_irq(int intno, void *dev_id);
+
+#endif /* EMU_IRQ_H */
diff --git a/ulan/host/ul_drv/ul_drv/k_compat.h b/ulan/host/ul_drv/ul_drv/k_compat.h
new file mode 100644 (file)
index 0000000..6bc37b8
--- /dev/null
@@ -0,0 +1,441 @@
+/*
+ * k_compat.h 1.8 1995/12/03 01:26:43 (David Hinds)
+ *                1998/07/12 modified by Pavel Pisa pisa@CMP.felk.cvut.cz
+ */
+
+#ifndef _LINUX_K_COMPAT_H
+#define _LINUX_K_COMPAT_H
+
+#define VERSION(v,p,s) (((v)<<16)+(p<<8)+s)
+
+#ifndef LINUX_VERSION_CODE
+  #error LINUX_VERSION_CODE not defined
+#endif
+
+#if (LINUX_VERSION_CODE < VERSION(1,3,38))
+
+#ifdef MODULE
+#include <linux/module.h>
+#if !defined(CONFIG_MODVERSIONS) && !defined(__NO_VERSION__)
+char kernel_version[] = UTS_RELEASE;
+#endif
+#else
+#define MOD_DEC_USE_COUNT
+#define MOD_INC_USE_COUNT
+#endif
+
+#else /* 1.3.38 */
+
+#if (LINUX_VERSION_CODE <= VERSION(2,5,60))
+#ifdef CONFIG_MODVERSIONS
+#define MODVERSIONS 1
+#if (LINUX_VERSION_CODE >= VERSION(1,3,40)) 
+#include <linux/modversions.h>
+#endif /* >=1.3.40 */
+#endif /* CONFIG_MODVERSIONS */
+#endif /* <=2.5.60 */
+
+#include <linux/module.h>
+
+#endif /* 1.3.38 */
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,50))
+#define kc_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT
+#define kc_MOD_INC_USE_COUNT MOD_INC_USE_COUNT
+#else /* 2.5.50 */
+#define kc_MOD_DEC_USE_COUNT
+#define kc_MOD_INC_USE_COUNT
+#endif /* 2.5.50 */
+
+#if ((LINUX_VERSION_CODE < VERSION(2,2,0)) || (LINUX_VERSION_CODE >= VERSION(2,6,0)))
+  #ifndef EXPORT_NO_SYMBOLS
+    #define EXPORT_NO_SYMBOLS
+  #endif /*EXPORT_NO_SYMBOLS*/
+#endif /* 2.2.0 */
+
+/*** user memory access ***/
+
+/* I do not know exactly all dates of changes */
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,5))
+  #define kc_copy_from_user(dst,src,len) ({ \
+    if(!(verify_area(VERIFY_READ, src, len))) \
+      {memcpy_fromfs(dst,src,len);0;} else len; })
+  #define kc_copy_to_user(dst,src,len) ({ \
+    if(!(verify_area(VERIFY_WRITE, dst, len))) \
+      {memcpy_tofs(dst,src,len);0;} else len; })
+  #define kc_get_user_long(x,ptr) \
+    (if(!verify_area(VERIFY_READ, (ptr), sizeof(long)))  {(x)=get_fs_long((ptr));0;} else 1; })
+  #define kc_get_user_word(x,ptr) \
+    (if(!verify_area(VERIFY_READ, (ptr), sizeof(short))) {(x)=get_fs_word((ptr));0;} else 1; })
+  #define kc_get_user_byte(x,ptr) \
+    (if(!verify_area(VERIFY_READ, (ptr), sizeof(char)))  {(x)=get_fs_byte((ptr));0;} else 1; })
+  #define kc_put_user_long(x,ptr) \
+    (if(!verify_area(VERIFY_WRITE, (ptr), sizeof(long))) {put_fs_long((x),(ptr));0;} else 1; })
+  #define kc_put_user_word(x,ptr) \
+    (if(!verify_area(VERIFY_WRITE, (ptr), sizeof(short))){put_fs_word((x),(ptr));0;} else 1; })
+  #define kc_put_user_byte(x,ptr) \
+    (if(!verify_area(VERIFY_WRITE, (ptr), sizeof(char))) {put_fs_byte((x),(ptr));0;} else 1; })
+#elif (LINUX_VERSION_CODE < VERSION(2,1,100)) /* may need correction */
+  #include  <asm/uaccess.h>
+  #define kc_copy_from_user copy_from_user
+  #define kc_copy_to_user   copy_to_user
+  #define kc_get_user(x,ptr) \
+    (__get_user_check((x),(ptr),sizeof(*(ptr))))
+  #define kc_put_user(x,ptr) \
+    (__put_user_check((x),(ptr),sizeof(*(ptr))))
+#else /* >= 2.1.100 */
+  #include  <asm/uaccess.h>
+  #define kc_copy_from_user copy_from_user
+  #define kc_copy_to_user   copy_to_user
+  #define kc_get_user(x,ptr) \
+    (get_user((x),(ptr)))
+  #define kc_put_user(x,ptr) \
+    (put_user((x),(ptr)))
+#endif /* < 2.1.100 */
+
+#if (LINUX_VERSION_CODE >= VERSION(2,1,5))
+  #define kc_get_user_long(x,ptr) (kc_get_user((x),(long*)(ptr)))
+  #define kc_get_user_word(x,ptr) (kc_get_user((x),(unsigned short*)(ptr)))
+  #define kc_get_user_byte(x,ptr) (kc_get_user((x),(unsigned char*)(ptr)))
+  #define kc_put_user_long(x,ptr) (kc_put_user((x),(long *)(ptr)))
+  #define kc_put_user_word(x,ptr) (kc_put_user((x),(unsigned short*)(ptr)))
+  #define kc_put_user_byte(x,ptr) (kc_put_user((x),(unsigned char*)(ptr)))
+#endif /* >= 2.1.5 */
+
+/*** resource manipulation changes ***/
+
+#if (LINUX_VERSION_CODE >= VERSION(2,4,0))
+  #define kc_request_region request_region
+  #define kc_release_region release_region
+#else /* < 2.6.0 */
+  #define kc_request_region(start,len,name) \
+    ({ unsigned long kc_t_start=(start), kc_t_len=(len); \
+       int kc_t_res=!check_region(kc_t_start,kc_t_len); \
+       if(kc_t_res) request_region(kc_t_start,kc_t_len,name); \
+       kc_t_res; \
+    })
+  #define kc_release_region release_region
+#endif /* < 2.6.0 */
+
+/*** bitops changes ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,36)) /* may need correction */
+   #define test_and_set_bit set_bit
+#endif
+
+/*** interrupt related stuff ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,36)) /* may need correction */
+   #define kc_synchronize_irq(irqnum) do{cli();sti();}while(0)
+#elif (LINUX_VERSION_CODE < VERSION(2,5,33)) /* may need correction */
+   #define kc_synchronize_irq(irqnum) synchronize_irq()
+#else /* >=2.5.33 */
+   #define kc_synchronize_irq synchronize_irq
+#endif
+
+#if (LINUX_VERSION_CODE <= VERSION(2,5,67)) && !defined(IRQ_RETVAL)
+   typedef void irqreturn_t;
+   #define IRQ_NONE
+   #define IRQ_HANDLED
+   #define IRQ_RETVAL(x)
+#endif /* <=2.5.67 */
+
+#if (LINUX_VERSION_CODE <= VERSION(2,6,18))
+   #define KC_IRQ_HANDLER_ARGS(intno, dev_id) \
+       int intno, void *dev_id, struct pt_regs *regs
+#else /* <=2.6.18 */
+   #define KC_IRQ_HANDLER_ARGS(intno, dev_id) \
+       int intno, void *dev_id
+#endif /* <=2.6.18 */
+
+#if (LINUX_VERSION_CODE < VERSION(2,6,18)) && !defined(IRQF_SHARED)
+   #define IRQF_SHARED    SA_SHIRQ
+   #define IRQF_DISABLED  SA_INTERRUPT
+#endif
+
+/*** timming related stuff ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,100)) /* needs correction */
+   #define schedule_timeout(timeout_jif) ({ \
+       current->timeout = jiffies + (timeout_jif); \
+       schedule(); \
+       current->timeout = 0; \
+   })
+   
+   #ifndef set_current_state
+      #define set_current_state(state_value)        do { current->state = state_value; } while (0) 
+   #endif
+#endif
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,36)) /* needs correction */
+   #define mod_timer(timer,expires) ({\
+       del_timer(timer); \
+       timer->expires=expires; \
+       add_timer(timer); \
+   })
+#endif
+
+/*** file_operations changes ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,5))
+   #define CLOSERET   void
+   #define RWRET      int
+   #define RWCOUNT_T  int
+   #define RWINODE_P  struct inode *inode,
+   #define RWPPOS_P
+   #define RWINODE    inode
+   #define KC_FOPS_FLUSH(ptr)
+   #define kc_dev2minor MINOR
+#elif (LINUX_VERSION_CODE < VERSION(2,1,36))
+   #define CLOSERET   void
+   #define RWRET      long
+   #define RWCOUNT_T  unsigned long
+   #define RWINODE_P  struct inode *inode,
+   #define RWPPOS_P
+   #define RWINODE    inode
+   #define KC_FOPS_FLUSH(ptr)
+   #define kc_dev2minor MINOR
+#elif (LINUX_VERSION_CODE < VERSION(2,1,76)) /* may need correction */
+   #define CLOSERET   int
+   #define RWRET      long
+   #define RWCOUNT_T  unsigned long
+   #define RWINODE_P  struct inode *inode,
+   #define RWPPOS_P
+   #define RWINODE    inode
+   #define KC_FOPS_FLUSH(ptr)
+   #define kc_dev2minor MINOR
+#elif (LINUX_VERSION_CODE < VERSION(2,1,117)) /* may need correction */
+   #define CLOSERET   int
+   #define RWRET      ssize_t
+   #define RWCOUNT_T  size_t
+   #define RWINODE_P
+   #define RWPPOS_P   ,loff_t *ppos
+   #define RWINODE    file->f_dentry->d_inode
+   #define KC_FOPS_FLUSH(ptr)
+   #define kc_dev2minor MINOR
+#elif ((LINUX_VERSION_CODE >= VERSION(2,5,7)) && (LINUX_VERSION_CODE < VERSION(2,6,0)))
+   #define CLOSERET   int
+   #define RWRET      ssize_t
+   #define RWCOUNT_T  size_t
+   #define RWINODE_P
+   #define RWPPOS_P   ,loff_t *ppos
+   #define RWINODE    file->f_dentry->d_inode
+   #define KC_FOPS_FLUSH(ptr)  flush:(ptr),
+   #define kc_dev2minor minor
+#else /* <2.5.7 >=2.6.0 */ /* may need correction */
+   #define CLOSERET   int
+   #define RWRET      ssize_t
+   #define RWCOUNT_T  size_t
+   #define RWINODE_P
+   #define RWPPOS_P   ,loff_t *ppos
+   #define RWINODE    file->f_dentry->d_inode
+   #define KC_FOPS_FLUSH(ptr)  flush:(ptr),
+   #define kc_dev2minor MINOR
+#endif /* 2.1.36 */
+
+#if (LINUX_VERSION_CODE < VERSION(2,1,50)) /* may need correction */
+  #define kc_poll_wait(file,address,wait) poll_wait(address,wait)
+#else /* >= 2.1.50 */
+  #define kc_poll_wait poll_wait
+#endif /* 2.1.50 */
+
+/* definition of standard parameters for read/write file functions */
+#define READ_PARAMETERS \
+       RWINODE_P struct file *file, char *buf, RWCOUNT_T count RWPPOS_P
+
+#define WRITE_PARAMETERS \
+       RWINODE_P struct file *file, const char *buf, RWCOUNT_T count RWPPOS_P
+
+#define LSEEK_PARAMETERS \
+       RWINODE_P struct file *file, loff_t pos, int whence
+
+#if (LINUX_VERSION_CODE < VERSION(2,2,0)) /* may need correction */
+  #define KC_CHRDEV_FOPS_BEG(fops_var) \
+        static struct file_operations fops_var =\
+        {
+  #define KC_CHRDEV_FOPS_END \
+        }
+  #define KC_FOPS_LSEEK(ptr)   lseek:(ptr),
+  #define KC_FOPS_RELEASE(ptr) close:(ptr),
+#elif (LINUX_VERSION_CODE < VERSION(2,4,0)) /* may need correction */
+  #define KC_CHRDEV_FOPS_BEG(fops_var) \
+        static struct file_operations fops_var =\
+        {
+  #define KC_CHRDEV_FOPS_END \
+        }
+  #define KC_FOPS_LSEEK(ptr)   llseek:(ptr),
+  #define KC_FOPS_RELEASE(ptr) release:(ptr),
+#else /* >= 2.4.0 */
+  #define KC_CHRDEV_FOPS_BEG(fops_var) \
+        static struct file_operations fops_var = {\
+            owner:THIS_MODULE,
+  #define KC_CHRDEV_FOPS_END \
+        }
+  #define KC_FOPS_LSEEK(ptr)   llseek:(ptr),
+  #define KC_FOPS_RELEASE(ptr) release:(ptr),
+#endif /* 2.4.0 */
+
+/*** devices and drivers registration ***/
+
+#if (LINUX_VERSION_CODE >= VERSION(2,5,41)) /* may need correction */
+  #define devfs_register_chrdev register_chrdev
+  #define devfs_unregister_chrdev unregister_chrdev
+#endif /* 2.5.40 */
+
+#if (LINUX_VERSION_CODE >= VERSION(2,5,60)) /* may need correction */
+  #define kc_devfs_handle_t char *
+  #define kc_devfs_delete(handle) ({ devfs_remove(handle); kfree(handle); })
+
+  #define kc_devfs_new_cdev(dir_handle, dev_num, dev_mode, dev_ops, dev_info, dev_name) ({ \
+         char *kc_t_name; \
+         const char *kc_t_dev=(dev_name); \
+         const char *kc_t_dir=(dir_handle); \
+         const int kc_t_d=kc_t_dir?strlen(kc_t_dir)+1:0; \
+         int kc_t_n=strlen(kc_t_dev)+1+kc_t_d; \
+         if ((kc_t_name=kmalloc(kc_t_n,GFP_KERNEL))) { \
+           if(kc_t_d) {memcpy(kc_t_name,kc_t_dir,kc_t_d-1); kc_t_name[kc_t_d-1]='/';} \
+           strcpy(kc_t_name+kc_t_d,kc_t_dev); \
+           if(devfs_mk_cdev((dev_num), (dev_mode), kc_t_name)<0) { \
+             kfree(kc_t_name); \
+             kc_t_name = NULL ; \
+           } \
+         } \
+         kc_t_name; \
+       })
+
+  #define kc_devfs_mk_dir devfs_mk_dir
+#else /* 2.5.60 */
+  #define kc_devfs_handle_t devfs_handle_t
+  #define kc_devfs_delete devfs_unregister
+
+  #define kc_devfs_new_cdev(dir_handle, dev_num, dev_mode, dev_ops, dev_info, dev_name) ({ \
+         devfs_register((dir_handle), (dev_name), DEVFS_FL_DEFAULT, \
+           MAJOR(dev_num), MINOR(dev_num), (dev_mode), (dev_ops), (dev_info)); \
+       })
+
+  #define kc_devfs_mk_dir(dirname...) ({ \
+         char kc_buf[64]; int kc_n; \
+         kc_n = snprintf(buf, 64, ##dirname); \
+         (kc_n >= 64 || !buf[0])? NULL: devfs_mk_dir(NULL, kc_buf, NULL); \
+       })
+
+#endif /* 2.5.60 */
+
+#if (LINUX_VERSION_CODE <= VERSION(2,6,0))
+ typedef struct {int dummy;} kc_class;
+ #define kc_class_create(...) (NULL)
+ #define kc_class_device_create(...)
+ #define kc_class_device_destroy(...)
+ #define kc_class_destroy(...)
+#else /* 2.6.0 */
+ #define KC_WITH
+ #include <linux/device.h>
+ #if LINUX_VERSION_CODE >= VERSION(2,6,15)
+  #define kc_class class
+  #define kc_class_create class_create
+  #define kc_class_device_create class_device_create
+  #define kc_class_device_destroy class_device_destroy
+  #define kc_class_destroy class_destroy
+ #elif LINUX_VERSION_CODE >= VERSION(2,6,13)
+  #define kc_class class
+  #define kc_class_create class_create
+  #define kc_class_device_create(cls, parent, devt, device, fmt...) \
+               class_device_create(cls, devt, device, ##fmt)
+  #define kc_class_device_destroy class_device_destroy
+  #define kc_class_destroy class_destroy
+ #else /* 2.6.0 ... 2.6.12 */
+  #define kc_class class_simple
+  #define kc_class_create class_simple_create
+  #define kc_class_device_create(cls, parent, devt, device, fmt...) \
+               class_simple_device_add(cls, devt, device, ##fmt)
+  #define kc_class_device_destroy(a,b) class_simple_device_remove(b)
+  #define kc_class_destroy class_simple_destroy
+ #endif
+ #define kc_pci_dev_to_dev(pdev) (&(pdev)->dev)
+ #define kc_usb_dev_to_dev(pdev) (&(pdev)->dev)
+#endif
+
+
+/*** tasklet declaration and processing ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,0)) /* may need correction */
+  #define kc_tasklet_struct tq_struct
+  #define kc_tasklet_data_type void *
+  #define KC_DECLARE_TASKLET(_name, _func, _data) \
+               struct tq_struct _name = { sync: 0, routine: _func, data: (void*)_data }
+               
+  /* void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); */
+  #define kc_tasklet_init(_tasklet, _func, _data) \
+    do{ \
+       /* (_tasklet)->next=NULL; */ \
+       /* Above not needed for 2.2.x and buggy for 2.4.x */ \
+       (_tasklet)->sync=0; \
+       (_tasklet)->routine=_func; \
+       (_tasklet)->data=(void*)_data; \
+    }while(0)
+    
+  /* void tasklet_schedule(struct tasklet_struct *t) */
+  #define kc_tasklet_schedule(_tasklet) \
+    do{ \
+       queue_task(_tasklet,&tq_immediate); \
+       mark_bh(IMMEDIATE_BH); \
+    }while(0)
+
+  /* void tasklet_kill(struct tasklet_struct *t); */
+  #define kc_tasklet_kill(_tasklet) \
+               synchronize_irq()
+
+#else /* 2.5.40 */
+  /* struct tasklet_struct */
+  #define  kc_tasklet_struct tasklet_struct
+  /* DECLARE_TASKLET(name, func, data) */
+  #define kc_tasklet_data_type unsigned long
+  #define KC_DECLARE_TASKLET DECLARE_TASKLET
+  /* void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); */
+  #define kc_tasklet_init tasklet_init
+  /* void tasklet_schedule(struct tasklet_struct *t) */
+  #define kc_tasklet_schedule tasklet_schedule
+  /* void tasklet_kill(struct tasklet_struct *t); */
+  #define kc_tasklet_kill tasklet_kill
+#endif /* 2.5.40 */
+
+/*** scheduler changes ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,3,0)) /* may need correction */
+  #define kc_yield schedule
+#else /* 2.3.0 */
+  #define kc_yield yield
+#endif /* 2.3.0 */
+
+/*** PCI changes ***/
+
+#if (LINUX_VERSION_CODE < VERSION(2,6,11)) /* may need correction */
+  #define kc_pci_name(pdev) (pdev->slot_name)
+#else /* 2.6.11 */
+  #define kc_pci_name pci_name
+#endif /* 2.6.11 */
+
+/*** wait queues changes ***/
+
+/* Next is not sctrictly correct, because of 2.3.0, 2.3.1, 2.3.2
+   probably need next definitions */
+#if (LINUX_VERSION_CODE < VERSION(2,2,19)) /* may need correction */
+  #define wait_queue_head_t struct wait_queue *
+  #define wait_queue_t      struct wait_queue
+  #define init_waitqueue_head(queue_head) (*queue_head=NULL)
+  #define init_waitqueue_entry(qentry,qtask) \
+                       (qentry->next=NULL,qentry->task=qtask) 
+  #define DECLARE_WAIT_QUEUE_HEAD(name) \
+       struct wait_queue * name=NULL
+  #define DECLARE_WAITQUEUE(wait, current) \
+       struct wait_queue wait = { current, NULL }
+  #define init_MUTEX(sem) (*sem=MUTEX)
+  #define DECLARE_MUTEX(name) struct semaphore name=MUTEX
+#endif /* 2.2.19 */
+
+#ifndef MODULE_LICENSE
+  #define MODULE_LICENSE(dummy)
+#endif /* MODULE_LICENSE */
+
+#endif /* _LINUX_K_COMPAT_H */
diff --git a/ulan/host/ul_drv/ul_drv/serial_reg.h b/ulan/host/ul_drv/ul_drv/serial_reg.h
new file mode 100644 (file)
index 0000000..09feb95
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * include/linux/serial_reg.h
+ *
+ * Copyright (C) 1992, 1994 by Theodore Ts'o.
+ * 
+ * Redistribution of this file is permitted under the terms of the GNU 
+ * Public License (GPL)
+ * 
+ * These are the UART port assignments, expressed as offsets from the base
+ * register.  These assignments should hold for any serial port based on
+ * a 8250, 16450, or 16550(A).
+ */
+
+#ifndef _LINUX_SERIAL_REG_H
+#define _LINUX_SERIAL_REG_H
+
+#define UART_RX                0       /* In:  Receive buffer (DLAB=0) */
+#define UART_TX                0       /* Out: Transmit buffer (DLAB=0) */
+#define UART_DLL       0       /* Out: Divisor Latch Low (DLAB=1) */
+#define UART_TRG       0       /* (LCR=BF) FCTR bit 7 selects Rx or Tx
+                                * In: Fifo count
+                                * Out: Fifo custom trigger levels
+                                * XR16C85x only */
+
+#define UART_DLM       1       /* Out: Divisor Latch High (DLAB=1) */
+#define UART_IER       1       /* Out: Interrupt Enable Register */
+#define UART_FCTR      1       /* (LCR=BF) Feature Control Register
+                                * XR16C85x only */
+
+#define UART_IIR       2       /* In:  Interrupt ID Register */
+#define UART_FCR       2       /* Out: FIFO Control Register */
+#define UART_EFR       2       /* I/O: Extended Features Register */
+                               /* (DLAB=1, 16C660 only) */
+
+#define UART_LCR       3       /* Out: Line Control Register */
+#define UART_MCR       4       /* Out: Modem Control Register */
+#define UART_LSR       5       /* In:  Line Status Register */
+#define UART_MSR       6       /* In:  Modem Status Register */
+#define UART_SCR       7       /* I/O: Scratch Register */
+#define UART_EMSR      7       /* (LCR=BF) Extended Mode Select Register 
+                                * FCTR bit 6 selects SCR or EMSR
+                                * XR16c85x only */
+
+/*
+ * These are the definitions for the FIFO Control Register
+ * (16650 only)
+ */
+#define UART_FCR_ENABLE_FIFO   0x01 /* Enable the FIFO */
+#define UART_FCR_CLEAR_RCVR    0x02 /* Clear the RCVR FIFO */
+#define UART_FCR_CLEAR_XMIT    0x04 /* Clear the XMIT FIFO */
+#define UART_FCR_DMA_SELECT    0x08 /* For DMA applications */
+#define UART_FCR_TRIGGER_MASK  0xC0 /* Mask for the FIFO trigger range */
+#define UART_FCR_TRIGGER_1     0x00 /* Mask for trigger set at 1 */
+#define UART_FCR_TRIGGER_4     0x40 /* Mask for trigger set at 4 */
+#define UART_FCR_TRIGGER_8     0x80 /* Mask for trigger set at 8 */
+#define UART_FCR_TRIGGER_14    0xC0 /* Mask for trigger set at 14 */
+/* 16650 redefinitions */
+#define UART_FCR6_R_TRIGGER_8  0x00 /* Mask for receive trigger set at 1 */
+#define UART_FCR6_R_TRIGGER_16 0x40 /* Mask for receive trigger set at 4 */
+#define UART_FCR6_R_TRIGGER_24  0x80 /* Mask for receive trigger set at 8 */
+#define UART_FCR6_R_TRIGGER_28 0xC0 /* Mask for receive trigger set at 14 */
+#define UART_FCR6_T_TRIGGER_16 0x00 /* Mask for transmit trigger set at 16 */
+#define UART_FCR6_T_TRIGGER_8  0x10 /* Mask for transmit trigger set at 8 */
+#define UART_FCR6_T_TRIGGER_24  0x20 /* Mask for transmit trigger set at 24 */
+#define UART_FCR6_T_TRIGGER_30 0x30 /* Mask for transmit trigger set at 30 */
+/* TI 16750 definitions */
+#define UART_FCR7_64BYTE       0x20 /* Go into 64 byte mode */
+
+/*
+ * These are the definitions for the Line Control Register
+ * 
+ * Note: if the word length is 5 bits (UART_LCR_WLEN5), then setting 
+ * UART_LCR_STOP will select 1.5 stop bits, not 2 stop bits.
+ */
+#define UART_LCR_DLAB  0x80    /* Divisor latch access bit */
+#define UART_LCR_SBC   0x40    /* Set break control */
+#define UART_LCR_SPAR  0x20    /* Stick parity (?) */
+#define UART_LCR_EPAR  0x10    /* Even parity select */
+#define UART_LCR_PARITY        0x08    /* Parity Enable */
+#define UART_LCR_STOP  0x04    /* Stop bits: 0=1 stop bit, 1= 2 stop bits */
+#define UART_LCR_WLEN5  0x00   /* Wordlength: 5 bits */
+#define UART_LCR_WLEN6  0x01   /* Wordlength: 6 bits */
+#define UART_LCR_WLEN7  0x02   /* Wordlength: 7 bits */
+#define UART_LCR_WLEN8  0x03   /* Wordlength: 8 bits */
+
+/*
+ * These are the definitions for the Line Status Register
+ */
+#define UART_LSR_TEMT  0x40    /* Transmitter empty */
+#define UART_LSR_THRE  0x20    /* Transmit-hold-register empty */
+#define UART_LSR_BI    0x10    /* Break interrupt indicator */
+#define UART_LSR_FE    0x08    /* Frame error indicator */
+#define UART_LSR_PE    0x04    /* Parity error indicator */
+#define UART_LSR_OE    0x02    /* Overrun error indicator */
+#define UART_LSR_DR    0x01    /* Receiver data ready */
+
+/*
+ * These are the definitions for the Interrupt Identification Register
+ */
+#define UART_IIR_NO_INT        0x01    /* No interrupts pending */
+#define UART_IIR_ID    0x06    /* Mask for the interrupt ID */
+
+#define UART_IIR_MSI   0x00    /* Modem status interrupt */
+#define UART_IIR_THRI  0x02    /* Transmitter holding register empty */
+#define UART_IIR_RDI   0x04    /* Receiver data interrupt */
+#define UART_IIR_RLSI  0x06    /* Receiver line status interrupt */
+
+/*
+ * These are the definitions for the Interrupt Enable Register
+ */
+#define UART_IER_MSI   0x08    /* Enable Modem status interrupt */
+#define UART_IER_RLSI  0x04    /* Enable receiver line status interrupt */
+#define UART_IER_THRI  0x02    /* Enable Transmitter holding register int. */
+#define UART_IER_RDI   0x01    /* Enable receiver data interrupt */
+/*
+ * Sleep mode for ST16650 and TI16750.
+ * Note that for 16650, EFR-bit 4 must be selected as well.
+ */
+#define UART_IERX_SLEEP  0x10  /* Enable sleep mode */
+
+/*
+ * These are the definitions for the Modem Control Register
+ */
+#define UART_MCR_LOOP  0x10    /* Enable loopback test mode */
+#define UART_MCR_OUT2  0x08    /* Out2 complement */
+#define UART_MCR_OUT1  0x04    /* Out1 complement */
+#define UART_MCR_RTS   0x02    /* RTS complement */
+#define UART_MCR_DTR   0x01    /* DTR complement */
+
+/*
+ * These are the definitions for the Modem Status Register
+ */
+#define UART_MSR_DCD   0x80    /* Data Carrier Detect */
+#define UART_MSR_RI    0x40    /* Ring Indicator */
+#define UART_MSR_DSR   0x20    /* Data Set Ready */
+#define UART_MSR_CTS   0x10    /* Clear to Send */
+#define UART_MSR_DDCD  0x08    /* Delta DCD */
+#define UART_MSR_TERI  0x04    /* Trailing edge ring indicator */
+#define UART_MSR_DDSR  0x02    /* Delta DSR */
+#define UART_MSR_DCTS  0x01    /* Delta CTS */
+#define UART_MSR_ANY_DELTA 0x0F        /* Any of the delta bits! */
+
+/*
+ * These are the definitions for the Extended Features Register
+ * (StarTech 16C660 only, when DLAB=1)
+ */
+#define UART_EFR_CTS   0x80    /* CTS flow control */
+#define UART_EFR_RTS   0x40    /* RTS flow control */
+#define UART_EFR_SCD   0x20    /* Special character detect */
+#define UART_EFR_ECB   0x10    /* Enhanced control bit */
+/*
+ * the low four bits control software flow control
+ */
+
+/*
+ * These register definitions are for the 16C950
+ */
+#define UART_ASR       0x01    /* Additional Status Register */
+#define UART_RFL       0x03    /* Transmitter FIFO level */
+#define UART_TFL       0x04    /* Receiver FIFO level */
+#define UART_ICR       0x05    /* Index Control Register */
+
+/* The 16950 ICR registers */
+#define UART_ACR       0x00    /* Additional Control Register */
+#define UART_CPR       0x01    /* Clock Prescalar Register */
+#define UART_TCR       0x02    /* Times Clock Register */
+#define UART_CKS       0x03    /* Clock Select Register */
+#define UART_TTL       0x04    /* Transmitter Interrupt Trigger Level */
+#define UART_RTL       0x05    /* Receiver Interrupt Trigger Level */
+#define UART_FCL       0x06    /* Flow Control Level Lower */
+#define UART_FCH       0x07    /* Flow Control Level Higher */
+#define UART_ID1       0x08    /* ID #1 */
+#define UART_ID2       0x09    /* ID #2 */
+#define UART_ID3       0x0A    /* ID #3 */
+#define UART_REV       0x0B    /* Revision */
+#define UART_CSR       0x0C    /* Channel Software Reset */
+#define UART_NMR       0x0D    /* Nine-bit Mode Register */
+#define UART_CTR       0xFF
+
+/*
+ * The 16C950 Additional Control Reigster
+ */
+#define UART_ACR_RXDIS 0x01    /* Receiver disable */
+#define UART_ACR_TXDIS 0x02    /* Receiver disable */
+#define UART_ACR_DSRFC 0x04    /* DSR Flow Control */
+#define UART_ACR_TLENB 0x20    /* 950 trigger levels enable */
+#define UART_ACR_ICRRD 0x40    /* ICR Read enable */
+#define UART_ACR_ASREN 0x80    /* Additional status enable */
+
+/*
+ * These are the definitions for the Feature Control Register
+ * (XR16C85x only, when LCR=bf; doubles with the Interrupt Enable
+ * Register, UART register #1)
+ */
+#define UART_FCTR_RTS_NODELAY  0x00  /* RTS flow control delay */
+#define UART_FCTR_RTS_4DELAY   0x01
+#define UART_FCTR_RTS_6DELAY   0x02
+#define UART_FCTR_RTS_8DELAY   0x03
+#define UART_FCTR_IRDA 0x04  /* IrDa data encode select */
+#define UART_FCTR_TX_INT       0x08  /* Tx interrupt type select */
+#define UART_FCTR_TRGA 0x00  /* Tx/Rx 550 trigger table select */
+#define UART_FCTR_TRGB 0x10  /* Tx/Rx 650 trigger table select */
+#define UART_FCTR_TRGC 0x20  /* Tx/Rx 654 trigger table select */
+#define UART_FCTR_TRGD 0x30  /* Tx/Rx 850 programmable trigger select */
+#define UART_FCTR_SCR_SWAP     0x40  /* Scratch pad register swap */
+#define UART_FCTR_RX   0x00  /* Programmable trigger mode select */
+#define UART_FCTR_TX   0x80  /* Programmable trigger mode select */
+
+/*
+ * These are the definitions for the Enhanced Mode Select Register
+ * (XR16C85x only, when LCR=bf and FCTR bit 6=1; doubles with the
+ * Scratch register, UART register #7)
+ */
+#define UART_EMSR_FIFO_COUNT   0x01  /* Rx/Tx select */
+#define UART_EMSR_ALT_COUNT    0x02  /* Alternating count select */
+
+/*
+ * These are the definitions for the Programmable Trigger
+ * Register (XR16C85x only, when LCR=bf; doubles with the UART RX/TX
+ * register, UART register #0)
+ */
+#define UART_TRG_1     0x01
+#define UART_TRG_4     0x04
+#define UART_TRG_8     0x08
+#define UART_TRG_16    0x10
+#define UART_TRG_32    0x20
+#define UART_TRG_64    0x40
+#define UART_TRG_96    0x60
+#define UART_TRG_120   0x78
+#define UART_TRG_128   0x80
+
+/*
+ * These definitions are for the RSA-DV II/S card, from
+ *
+ * Kiyokazu SUTO <suto@ks-and-ks.ne.jp>
+ */
+
+#define UART_RSA_BASE (-8)
+
+#define UART_RSA_MSR ((UART_RSA_BASE) + 0) /* I/O: Mode Select Register */
+
+#define UART_RSA_MSR_SWAP (1 << 0) /* Swap low/high 8 bytes in I/O port addr */
+#define UART_RSA_MSR_FIFO (1 << 2) /* Enable the external FIFO */
+#define UART_RSA_MSR_FLOW (1 << 3) /* Enable the auto RTS/CTS flow control */
+#define UART_RSA_MSR_ITYP (1 << 4) /* Level (1) / Edge triger (0) */
+
+#define UART_RSA_IER ((UART_RSA_BASE) + 1) /* I/O: Interrupt Enable Register */
+
+#define UART_RSA_IER_Rx_FIFO_H (1 << 0) /* Enable Rx FIFO half full int. */
+#define UART_RSA_IER_Tx_FIFO_H (1 << 1) /* Enable Tx FIFO half full int. */
+#define UART_RSA_IER_Tx_FIFO_E (1 << 2) /* Enable Tx FIFO empty int. */
+#define UART_RSA_IER_Rx_TOUT (1 << 3) /* Enable char receive timeout int */
+#define UART_RSA_IER_TIMER (1 << 4) /* Enable timer interrupt */
+
+#define UART_RSA_SRR ((UART_RSA_BASE) + 2) /* IN: Status Read Register */
+
+#define UART_RSA_SRR_Tx_FIFO_NEMP (1 << 0) /* Tx FIFO is not empty (1) */
+#define UART_RSA_SRR_Tx_FIFO_NHFL (1 << 1) /* Tx FIFO is not half full (1) */
+#define UART_RSA_SRR_Tx_FIFO_NFUL (1 << 2) /* Tx FIFO is not full (1) */
+#define UART_RSA_SRR_Rx_FIFO_NEMP (1 << 3) /* Rx FIFO is not empty (1) */
+#define UART_RSA_SRR_Rx_FIFO_NHFL (1 << 4) /* Rx FIFO is not half full (1) */
+#define UART_RSA_SRR_Rx_FIFO_NFUL (1 << 5) /* Rx FIFO is not full (1) */
+#define UART_RSA_SRR_Rx_TOUT (1 << 6) /* Character reception timeout occured (1) */
+#define UART_RSA_SRR_TIMER (1 << 7) /* Timer interrupt occured */
+
+#define UART_RSA_FRR ((UART_RSA_BASE) + 2) /* OUT: FIFO Reset Register */
+
+#define UART_RSA_TIVSR ((UART_RSA_BASE) + 3) /* I/O: Timer Interval Value Set Register */
+
+#define UART_RSA_TCR ((UART_RSA_BASE) + 4) /* OUT: Timer Control Register */
+
+#define UART_RSA_TCR_SWITCH (1 << 0) /* Timer on */
+
+/*
+ * The RSA DSV/II board has two fixed clock frequencies.  One is the
+ * standard rate, and the other is 8 times faster.
+ */
+#define SERIAL_RSA_BAUD_BASE (921600)
+#define SERIAL_RSA_BAUD_BASE_LO (SERIAL_RSA_BAUD_BASE / 8)
+
+#endif /* _LINUX_SERIAL_REG_H */
+
diff --git a/ulan/host/ul_drv/ul_drv/sources b/ulan/host/ul_drv/ul_drv/sources
new file mode 100644 (file)
index 0000000..be01a34
--- /dev/null
@@ -0,0 +1,17 @@
+TARGETNAME=ul_wdm
+TARGETPATH=obj
+TARGETTYPE=DRIVER
+
+
+MSC_WARNING_LEVEL=/W3
+
+SOURCES=ul_drv.c
+C_DEFINES=-DFOR_WIN_WDM
+#C_DEFINES=-DFOR_WIN_KDM
+
+TARGETLIBS=$(DDK_LIB_PATH)\usbd.lib
+
+#PRECOMPILED_INCLUDE=precomp.h
+#PRECOMPILED_PCH=precomp.pch
+#PRECOMPILED_OBJ=precomp.obj
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_82510.h b/ulan/host/ul_drv/ul_drv/ul_82510.h
new file mode 100644 (file)
index 0000000..b055277
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * include/linux/ul_82510.h
+ *
+ */
+
+#ifndef _LINUX_U510_REG_H
+#define _LINUX_U510_REG_H
+
+/*
+ *  For Intel 82510 serial port
+ */
+
+/*
+ *  Port Address
+ */
+
+
+#define        U510_BAL        0x0000  /* Pokud DLAB =1 */
+#define        U510_BAH        0x0001  /* Pokud DLAB =1 */
+#define U510_GER       0x0001
+#define U510_GIR       0x0002  /* 0x2002 */
+#define U510_LCR       0x0003
+#define U510_MCR       0x0004
+#define U510_LSR       0x0005
+#define U510_MSR       0x0006  /* 0x2006 */
+#define U510_ACR0      0x0007
+#define U510_RXD       0x2000
+#define U510_RXF       0x2001
+#define U510_TXD       0x2000
+#define U510_TXF       0x2001
+#define U510_TMST      0x2003
+#define U510_TMCR      0x2003
+#define U510_FLR       0x2004
+#define U510_RST       0x2005
+#define U510_RCM       0x2005
+#define U510_GSR       0x2007
+#define U510_ICM       0x2007
+#define U510_FMD       0x4001
+#define U510_TMD       0x4003
+#define U510_IMD       0x4004
+#define U510_ACR1      0x4005
+#define U510_RIE       0x4006
+#define U510_RMD       0x4007
+#define U510_CLCF      0x6000
+#define U510_BACF      0x6001
+#define U510_BBL       0x6000  /* Pokud DLAB =1 */
+#define U510_BBH       0x6001  /* Pokud DLAB =1 */
+#define U510_BBCF      0x6003
+#define U510_PMD       0x6004
+#define U510_MIE       0x6005
+#define U510_TMIE      0x6006
+
+/*
+ *  Register masks
+ */
+
+#define U510_MCR_OEQ   0x02
+#define U510_MCR_OE    0x06
+#define U510_MCR_IE    0x04
+
+#define U510_GIR_NO_INT        0x01    /* No interrupts pending */
+#define U510_GIR_ID    0x0E    /* Mask for the interrupt ID */
+
+#define U510_GER_RI    0x01    /* RxFIFO int enable */
+#define U510_GER_TI    0x02    /* TxFIFO int enable */
+#define U510_GER_RM    0x04    /* Rx machine int enable */
+#define U510_GER_MI    0x08    /* modem interrupt enable */
+#define U510_GER_TM    0x10    /* Tx machine int enable */
+#define U510_GER_TIE   0x20    /* Timer int enable */
+
+#define U510_LCR_C     0x03    /* vysilani nebo prijem */
+#define U510_LCR_B     0x40    /* vysilani pretrzeni */
+#define U510_LCR_DLAB  0x80    /* zadavani BA a BB */
+
+#define U510_LSR_RI    0x01    /* data prijata */
+#define U510_LSR_C     0x04    /* prijata ridici instrukce */
+#define U510_LSR_ERR   0x1A    /* chyba v prijmu */
+#define U510_LSR_TRE   0x20    /* vystupni registr prazdny */
+#define U510_LSR_TME   0x40    /* vystup ukoncen */
+
+#define U510_RCM_FLUSH 0xB4    /* vymazani zbytku a prijem */
+
+#define U510_MSR_TxD   0x20    /* TxD = 0 ? */
+#define U510_MSR_RxD   0x40    /* RxD = 0 ? */
+
+
+#ifndef _WIN32
+
+/*
+ *  82510 bank switching, if _U510_SBANK_SHADOW_VAR defines variable name
+ *  bank switching is used only when necessary
+ */
+
+
+ #ifndef _U510_SBANK_SHADOW_VAR
+  #define u510_sbank(base,port) \
+       (ul_outb(base+U510_GIR,(unsigned)(port)>>8),(base+((port)&0xFF)))
+ #else
+  #define u510_sbank(base,port) \
+       ({\
+        if (/*(!__builtin_constant_p(_U510_SBANK_SHADOW_VAR))||*/\
+           ((unsigned)(port)>>8!=_U510_SBANK_SHADOW_VAR))\
+         ul_outb((base)+U510_GIR,(unsigned)(port)>>8);\
+        _U510_SBANK_SHADOW_VAR=(unsigned)(port)>>8;\
+        ((base)+((port)&0xFF));\
+       })
+ #endif 
+
+ /* Input output routines */
+
+ #define u510_inb(base,port)   (ul_inb(u510_sbank(base,port)))
+ #define u510_outb(base,port,val) (ul_outb(u510_sbank(base,port),val))
+ #define u510_pool_gir(base)   (!(ul_inb((base)+U510_GIR)&U510_GIR_NO_INT))
+
+#else
+
+/*
+ *  82510 bank switching, if _U510_SBANK_SHADOW_VAR defines variable name
+ *  bank switching is used only when necessary
+ */
+
+
+ #ifndef _U510_SBANK_SHADOW_VAR
+  #define u510_sbank(base,port) \
+       (ul_outb((base+U510_GIR),(unsigned)(port)>>8),\
+        base+(port&0xFF))
+ #else
+  #define u510_sbank(base,port) \
+       ((\
+         ((unsigned)(port)>>8!=_U510_SBANK_SHADOW_VAR)?\
+         ul_outb((base)+U510_GIR,(unsigned)(port)>>8):0,\
+        _U510_SBANK_SHADOW_VAR=(unsigned)(port)>>8,\
+        ((base)+((port)&0xFF))\
+       ))
+ #endif 
+
+ /* Input output routines */
+
+ #define u510_inb(base,port)   (ul_inb(u510_sbank(base,port)))
+ #define u510_outb(base,port,val) (ul_outb(u510_sbank(base,port),val))
+ #define u510_pool_gir(base)   (!(ul_inb((base)+U510_GIR)&U510_GIR_NO_INT))
+
+#endif
+
+
+#endif /* _LINUX_U510_REG_H */
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_base.c b/ulan/host/ul_drv/ul_drv/ul_base.c
new file mode 100644 (file)
index 0000000..7c74961
--- /dev/null
@@ -0,0 +1,501 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_base.c    - functions common for all kinds of the driver
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+void ulan_stroke(ul_drv *udrv, int force)
+{
+  UL_DRV_LOCK_FINI
+  if(!uld_test_dfl(udrv,CHIPOK)) return;
+  if(force)
+    uld_set_dfl(udrv,WDFORCED);
+  else
+    if(udrv->prep_bll.first==NULL) return;
+  if(udrv->fnc_stroke)
+  { udrv->fnc_stroke(udrv);
+    return;
+  }
+  UL_DRV_LOCK;
+  #ifndef _WIN32
+  { int delay;
+    delay=udrv->last_ctrl&0x80?0:ULD_HZ/100+2;
+    SCHEDULE_UDRV_WDTIM(udrv,jiffies+delay);
+  }
+  #else /* _WIN32 */
+  { LARGE_INTEGER delay;
+    delay=udrv->last_ctrl&0x80?RtlConvertLongToLargeInteger(-1):
+                             RtlConvertLongToLargeInteger(-40*10000);
+    KeSetTimer(&udrv->wd_timer,delay,&udrv->wd_timer_dpc);
+  } 
+  #endif /* _WIN32 */
+  UL_DRV_UNLOCK;
+};
+
+
+static void add_to_opchain(ul_opchain **chain,ul_opchain *member)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  if(!*chain) *chain=member->next=member->prev=member;
+  else {
+    ((volatile ul_opchain*)member)->next=*chain;
+    ((volatile ul_opchain*)member)->prev=(*chain)->prev;
+    UL_MB();
+    ((volatile ul_opchain*)(*chain))->prev->next=member;
+    ((volatile ul_opchain*)(*chain))->prev=member;
+  };
+  UL_DRV_UNLOCK;
+};
+
+static void add_to_opchain_front(ul_opchain **chain,ul_opchain *member)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  if(!*chain) *chain=member->next=member->prev=member;
+  else {
+    ((volatile ul_opchain*)member)->next=*chain;
+    ((volatile ul_opchain*)member)->prev=(*chain)->prev;
+    UL_MB();
+    ((volatile ul_opchain*)(*chain))->prev->next=member;
+    ((volatile ul_opchain*)(*chain))->prev=member;
+    *(volatile ul_opchain**)chain=member;
+  };
+  UL_DRV_UNLOCK;
+};
+
+static void del_from_opchain(ul_opchain **chain,ul_opchain *member)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  member->next->prev=member->prev;
+  member->prev->next=member->next;
+  if(*chain==member) 
+  { if(member->next==member) *chain=NULL;
+    else *chain=member->next;
+  };
+  UL_DRV_UNLOCK;
+};
+
+/* free message form ulan operator */
+static int ulan_freemsg(ul_opdata* opdata)
+{
+  int stamp;
+  ul_mem_blk *mes;
+  ul_opchain *opmember;
+
+  if(!opdata->udrv) return -ENODEV;
+  if(!(mes=opdata->message)) return -ENOMSG;
+
+  if(!UL_BLK_HEAD(mes).stamp)
+  {
+    opdata->message=NULL;
+    stamp=ul_gen_stamp();
+    UL_BLK_HEAD(mes).stamp=stamp;
+    if(UL_BLK_HEAD(mes).flg&UL_BFL_M2IN)
+    {
+      opmember=(ul_opchain*)MALLOC(sizeof(ul_opchain));
+      if(opmember)
+      {
+       memset(opmember,0,sizeof(ul_opchain));
+       opmember->stamp=stamp;
+       opmember->state=UL_OPST_ONCE;
+       add_to_opchain_front(&opdata->filtchain,opmember);
+      };
+    };
+    ul_bll_move_mes(&opdata->udrv->prep_bll,mes);
+    ulan_stroke(opdata->udrv, 0);
+    return stamp;
+  }else{
+    ul_dec_ref_cnt(mes);
+    opdata->message=NULL;
+    return 0;
+  };
+};
+
+/* abort preparation of message */
+static int ulan_abortmsg(ul_opdata* opdata)
+{
+  ul_mem_blk *mes;
+
+  if(!opdata->udrv) return -ENODEV;
+  if(!(mes=opdata->message)) return -ENOMSG;
+  opdata->message=NULL;
+
+  if(!UL_BLK_HEAD(mes).stamp)
+  {
+    ul_free_mes(opdata->udrv,mes);
+    return 1;
+  }else{
+    ul_dec_ref_cnt(mes);
+    return 0;
+  };
+};
+
+/* rewind of message */
+static int ulan_rewmsg(ul_opdata* opdata)
+{
+  ul_mem_blk *mes;
+  if(!opdata->udrv) return -ENODEV;
+  if(!(mes=opdata->message)) return -ENOMSG;
+  opdata->message=NULL;
+  ul_di_init(&opdata->data,opdata->message);
+  return 0;
+};
+
+/* create new outgoing message */
+static int ulan_newmsg(ul_opdata* opdata,const ul_msginfo *msginfo)
+{
+  int flg=msginfo->flg;
+  flg &= ~(UL_BFL_LOCK | UL_BFL_FAIL | UL_BFL_TAIL | UL_BFL_REC);
+  flg |= UL_BFL_SND;
+  if(!opdata->udrv) return -ENODEV;
+  if (opdata->message) ulan_freemsg(opdata);
+  opdata->message=ul_new_frame_head(opdata->udrv, msginfo->dadr,
+                     opdata->udrv->my_adr, msginfo->cmd,flg);
+  if(!opdata->message) return -ENOMEM;
+  memset(UL_BLK_FDATA(opdata->message),0,UL_BLK_FSIZE);
+  ul_di_init(&opdata->data,opdata->message);
+  return 0;
+}
+
+static int ulan_tailmsg(ul_opdata* opdata,const ul_msginfo *msginfo)
+{
+  ul_mem_blk *mes;
+  ul_mem_blk *tail;
+  int flg=msginfo->flg;
+  if(!opdata->udrv) return -ENODEV;
+  if(!(mes=opdata->message)) return -ENOMSG;
+  if(UL_BLK_HEAD(mes).stamp) return -EPERM;
+
+  flg &= ~(UL_BFL_LOCK | UL_BFL_FAIL | UL_BFL_TAIL);
+  if(!flg&UL_BFL_REC) flg|=UL_BFL_SND;
+  tail=ul_new_frame_head(opdata->udrv, msginfo->dadr,
+       opdata->udrv->my_adr, msginfo->cmd,flg);
+  if(!tail) return -ENOMEM;
+  memset(UL_BLK_FDATA(tail),0,UL_BLK_FSIZE);
+  UL_BLK_HEAD(tail).len=msginfo->len;
+  ul_tail_frame_head(mes,tail);
+  ul_di_init(&opdata->data,tail);
+  return 0;
+}
+
+static int ulan_acceptmsg(ul_opdata* opdata,ul_msginfo *msginfo)
+{
+  ul_mem_blk *mes;
+  ul_opchain *opmember;
+
+  if(!opdata->udrv) return -ENODEV;
+  if (opdata->message) ulan_freemsg(opdata);
+  memset(msginfo,0,sizeof(ul_msginfo));
+  if(!(opmember=opdata->recchain)) return -ENOMSG;
+  del_from_opchain(&opdata->recchain,opmember);
+  mes=opmember->message;
+  if(opmember->state==UL_OPST_MES) FREE(opmember);
+  opdata->message=mes;
+  ul_di_init(&opdata->data,mes);
+  msginfo->flg=UL_BLK_HEAD(mes).flg;
+  msginfo->dadr=UL_BLK_HEAD(mes).dadr;
+  msginfo->sadr=UL_BLK_HEAD(mes).sadr;
+  msginfo->cmd=UL_BLK_HEAD(mes).cmd;
+  msginfo->len=UL_BLK_HEAD(mes).len;
+  msginfo->stamp=UL_BLK_HEAD(mes).stamp;
+  return 0;
+}
+
+static int ulan_actailmsg(ul_opdata* opdata,ul_msginfo *msginfo)
+{
+  ul_mem_blk *mes;
+  ul_mem_blk *tail;
+
+  if(!opdata->udrv) return -ENODEV;
+  memset(msginfo,0,sizeof(ul_msginfo));
+  if(!(mes=opdata->message)) return -ENOMSG;
+  if(!UL_BLK_HEAD(mes).stamp) return -EPERM;
+  tail=UL_BLK_HEAD(opdata->data.head_blk).next;
+  if(!tail) return -ENOMSG;
+  ul_di_init(&opdata->data,tail);
+  msginfo->flg=UL_BLK_HEAD(tail).flg;
+  msginfo->dadr=UL_BLK_HEAD(tail).dadr;
+  msginfo->sadr=UL_BLK_HEAD(tail).sadr;
+  msginfo->cmd=UL_BLK_HEAD(tail).cmd;
+  msginfo->len=UL_BLK_HEAD(tail).len;
+  msginfo->stamp=UL_BLK_HEAD(tail).stamp;
+  return 0;
+}
+
+/* create new outgoing message */
+static int ulan_addfilt(ul_opdata* opdata,const ul_msginfo *msginfo)
+{
+  ul_drv *udrv;
+  ul_opchain *opmember;
+  int filtonce;
+  if(!opdata->udrv) return -ENODEV;
+  opmember=(ul_opchain*)MALLOC(sizeof(ul_opchain));
+  udrv=opdata->udrv;
+  if(!opmember) return -ENOMEM;
+  memset(opmember,0,sizeof(ul_opchain));
+  opmember->dadr=msginfo->dadr;
+  opmember->sadr=msginfo->sadr;
+  opmember->cmd=msginfo->cmd;
+  filtonce=msginfo->flg&UL_BFL_NORE;
+  opmember->state=filtonce?UL_OPST_FILTNEW:UL_OPST_FILT;
+  add_to_opchain(&opdata->filtchain,opmember);
+  if(filtonce){
+    uld_set_dfl(udrv,CHECK_FILT);
+    SCHEDULE_BH(udrv);
+  }
+  LOG_FILTS("ulan_addfilt : filter %d %d %d %s\n",
+        opmember->dadr,opmember->sadr,opmember->cmd,filtonce?"once":"");
+  return 0;
+}
+
+static int ulan_inepoll(ul_opdata* opdata)
+{
+  return opdata->recchain!=NULL?1:0;
+}
+
+static int ulan_hwtest(ul_opdata* opdata,unsigned long fnc)
+{
+  int ret;
+  ul_drv *udrv;
+  UL_DRV_LOCK_FINI
+  if(!opdata->udrv) return -ENODEV;
+  udrv=opdata->udrv;
+  UL_DRV_LOCK;
+  ret=udrv->fnc_cctrl(udrv,UL_CC_HWTEST,fnc);
+  if(ret<0) ret=-EINVAL;
+  UL_DRV_UNLOCK;
+  return ret;
+}
+
+static int ulan_setmyadr(ul_opdata* opdata, int newadr)
+{
+  int ret;
+  ul_drv *udrv;
+  if(!opdata->udrv) return -ENODEV;
+  udrv=opdata->udrv;
+  ret=udrv->fnc_cctrl(udrv,UL_CC_SETMYADR,newadr);
+  if(ret==UL_RC_ENOFNC){
+    if(newadr)
+      udrv->my_adr=newadr;
+    ret=udrv->my_adr;
+  }else if(ret<0) ret=-EINVAL;
+  return ret;
+}
+
+static int ulan_setidstr(ul_opdata* opdata, const char *idstr)
+{
+#ifdef UL_WITH_IAC
+  #define UL_CMD_SID   0xF0    /* Send identification */
+  ul_drv *udrv;
+  char *cidstr;
+  int len;
+  if(!opdata->udrv) return -ENODEV;
+  udrv=opdata->udrv;
+  len=strlen(idstr);
+  if(!(cidstr=MALLOC(len))) return ENOMEM;
+  memcpy(cidstr,idstr,len);   
+  ul_drv_del_iac(udrv,UL_CMD_SID);
+  ul_drv_add_iac(udrv,UL_CMD_SID,UL_IAC_OP_SNDBUFF,NULL,cidstr,len,UL_IAC_BFL_FREEBUFF,NULL);
+  return 0;
+#else /*UL_WITH_IAC*/
+  return -EINVAL;
+#endif /*UL_WITH_IAC*/
+}
+
+static int ulan_setbaudrate(ul_opdata* opdata, int baudrate)
+{
+  int ret;
+  ul_drv *udrv;
+  UL_DRV_LOCK_FINI
+  if(!opdata->udrv) return -ENODEV;
+  udrv=opdata->udrv;
+  UL_DRV_LOCK;
+  udrv->baud_val=baudrate;
+  ret=udrv->fnc_cctrl(udrv,UL_CC_PINIT,0);
+  if(ret<0) ret=-EINVAL;
+  UL_DRV_UNLOCK;
+  return ret;
+}
+
+/* this function is responsible to inform all ulan client operators
+   about message of waited type -- !!!!! it is not SMP clean still */
+static int ulan_proc_arrived(ul_drv *udrv, ul_mem_blk *message)
+{
+  ul_opdata *opdata;
+  ul_opchain **opchain;
+  ul_opchain *opmember;
+  ul_opchain *opmember2;
+  UL_DRV_LOCK_FINI
+
+  ul_inc_ref_cnt(message);
+  UL_DRV_LOCK;
+  opdata=udrv->operators;
+  UL_DRV_UNLOCK;
+  while(opdata)
+  {
+    opchain=&opdata->filtchain;
+    opmember=*opchain;
+    if(opmember) do
+    {
+      if((!opmember->stamp||opmember->stamp==UL_BLK_HEAD(message).stamp)&&
+        (!opmember->cmd||opmember->cmd==UL_BLK_HEAD(message).cmd)&&
+        (!opmember->dadr||opmember->dadr==UL_BLK_HEAD(message).dadr)&&
+        (!opmember->sadr||opmember->sadr==UL_BLK_HEAD(message).sadr))
+      {
+       if(opmember->state==UL_OPST_ONCE)
+       {
+         del_from_opchain(opchain,opmember);
+         opmember->state=UL_OPST_MES;
+         ul_inc_ref_cnt(message);
+         opmember->message=message;
+         add_to_opchain(&opdata->recchain,opmember);
+       }else if(opmember->state==UL_OPST_FILT){
+        #ifdef FOR_LINUX_KERNEL
+         #ifdef ENABLE_UL_MEM_CHECK
+         atomic_inc(&ul_mem_check_counter);
+         #endif
+         opmember2=(ul_opchain*)kmalloc(sizeof(ul_opchain),GFP_ATOMIC);
+        #else /* FOR_LINUX_KERNEL */
+         opmember2=(ul_opchain*)MALLOC(sizeof(ul_opchain));
+        #endif /* FOR_LINUX_KERNEL */
+         if(opmember2)
+         { 
+           memset(opmember2,0,sizeof(ul_opchain));
+           opmember2->state=UL_OPST_MES;
+           ul_inc_ref_cnt(message);
+           opmember2->message=message;
+           add_to_opchain(&opdata->recchain,opmember2);
+         } else  UL_PRINTF(KERN_CRIT "ulan_proc_arrived : no kernel memory : FIXME handling\n");
+       };
+       #ifdef FOR_LINUX_KERNEL
+       wake_up_interruptible(&opdata->wqrec);
+       #elif defined(_WIN32)
+           abort_pending_irp(&opdata->wait_irp,STATUS_SUCCESS);
+       #endif /* FOR_LINUX_KERNEL */
+       break;
+      };
+    } while((opmember=opmember->next)!=*opchain);
+    opdata=opdata->opnext;
+  };
+
+  /* if no one interested in message, it is discarded */
+  return  ul_dec_ref_cnt(message);
+};
+
+/* check for UL_OPST_FILTNEW and change them to single instance
+   of UL_OPST_FILT */
+void check_for_filtnew(ul_drv *udrv)
+{
+  ul_opdata *opdata;
+  ul_opchain **opchain;
+  ul_opchain *opmember;
+  ul_opchain *opmember2;
+  ul_opchain *opnext;
+  UL_DRV_LOCK_FINI
+
+  LOG_FILTS("check_for_filtnew : called\n");
+  UL_DRV_LOCK;
+  opdata=udrv->operators;
+  UL_DRV_UNLOCK;
+  for(;opdata;opdata=opdata->opnext)
+  {
+    opchain=&opdata->filtchain;
+    opmember=*opchain;
+    if(opmember) do
+    { opnext=opmember->next;
+      if(opnext==*opchain) opnext=NULL;
+      if(opmember->state==UL_OPST_FILTNEW){
+       LOG_FILTS("check_for_filtnew : processing UL_OPST_FILTNEW\n");
+       opmember2=*opchain;
+       while(opmember2){
+         if((opmember->cmd==opmember2->cmd)&&
+             (opmember->sadr==opmember2->sadr)&&
+            (opmember->dadr==opmember2->dadr)&&
+            (opmember->stamp==opmember2->stamp)&&
+            (opmember2->state==UL_OPST_FILT)) break;
+         opmember2=opmember2->next;
+         if(opmember2==*opchain){
+           opmember2=NULL;
+         }
+        };
+       if(opmember2){
+         LOG_FILTS("check_for_filtnew : deletting UL_OPST_FILTNEW\n");
+         del_from_opchain(opchain,opmember);
+         FREE(opmember);
+       }else{
+         LOG_FILTS("check_for_filtnew : changing to UL_OPST_FILT\n");
+         opmember->state=UL_OPST_FILT;
+       }
+      }
+    } while((opmember=opnext)!=NULL);
+  };
+};
+
+#ifndef _WIN32
+
+/* notice about new message in udrv->proc_bll */
+void ulan_do_bh(ulan_do_bh_data_type data)
+{
+  ul_mem_blk *message;
+  ul_drv *udrv=(ul_drv *)data;
+
+  #ifdef ENABLE_UL_IRQ_STALE_WDG
+  ul_irq_stale_wdg_cnt=0;
+  #endif /* ENABLE_UL_IRQ_STALE_WDG */
+
+  if(udrv->magic!=UL_DRV_MAGIC)
+  {
+    #ifdef FOR_LINUX_KERNEL
+     panic("ulan_do_bh : BAD udrv magic !!!");
+    #else /* FOR_LINUX_KERNEL */
+     return;
+    #endif /* FOR_LINUX_KERNEL */
+  }
+
+  LOG_MESSAGES("ulan_do_bh : announcing messages\n");
+  while(udrv->proc_bll.first||uld_test_dfl(udrv,ASK_BOTTOM))
+  {
+    if(uld_test_and_set_dfl(udrv,IN_BOTTOM))
+    { LOG_MESSAGES("ulan_do_bh : else is already in");
+         return;
+    }
+    uld_clear_dfl(udrv,ASK_BOTTOM);
+    if(uld_test_dfl(udrv,CHECK_FILT)){
+      uld_clear_dfl(udrv,CHECK_FILT);
+      check_for_filtnew(udrv);
+    }
+    while((message=udrv->proc_bll.first))
+    {
+      int i;
+      ul_bll_move_mes(&udrv->opan_bll,message);
+      i=ulan_proc_arrived(udrv,message);
+      LOG_MESSAGES("ulan_do_bh : message sent to %d recchains\n",i);
+    };
+    uld_atomic_clear_dfl(udrv,IN_BOTTOM);
+  };
+};
+
+#endif /* _WIN32 */
diff --git a/ulan/host/ul_drv/ul_drv/ul_c450.c b/ulan/host/ul_drv/ul_drv/ul_c450.c
new file mode 100644 (file)
index 0000000..f71c05b
--- /dev/null
@@ -0,0 +1,753 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_c450.c    - chip driver for 16450
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Chip driver for 16450 */
+
+#include "serial_reg.h"
+
+#define u450_inb(base,port)     ul_inb(base+port*U450_BYTES_PER_REGS)
+#define u450_outb(base,port,val) ul_outb(base+port*U450_BYTES_PER_REGS,val)
+
+#define U450_MCR_IE_C  0x0D    /* receive */
+#define U450_MCR_OE_C  0x0E    /* transmit */
+#define U450_MCR_OEQ_C 0x02    /* transmit ? */
+
+#define U450_MSR_RxD_C UART_MSR_CTS /* RxD line readback */
+#define U450_MSR_TxD_C UART_MSR_DSR /* TxD line readback */
+#define U450_MSR_DTxD_C        UART_MSR_DDSR /* TxD line changed */
+
+#define U450_LCR_UL    0x3B    /* receive/transmit */
+#define U450_LCR_ULC   0x2B    /* transmit control character */
+#define U450_LCR_ULB   0x7B    /* transmit line break */
+
+#define U450_LSR_C     0x04    /* controll character received */
+#define U450_LSR_ERR   0x1A    /* error in receiver */
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+ #define U450_FIX_RDI_GARBAGE(udrv,ret_code) \
+ do { if(ret_code==5) u450_inb(udrv->port,UART_RX); } while(0) 
+#else /* CONFIG_OC_UL_DRV_SYSLESS */
+#define U450_FIX_RDI_GARBAGE(udrv,ret_code) do{;}while(0)
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+/*Definitions to allow support converters with different pins routing*/
+#ifdef CONFIG_OC_UL_DRV_U450_VARPINS
+#define U450_CHOPT_MSRSWAP     0x2000
+#define U450_CHOPT_DIRNEG      0x4000
+#define U450_MCR_CODES chip_buff[4]
+#define U450_MSR_CODES chip_buff[5]
+#define U450_MCR_IE(udrv)      ((uchar)(udrv->U450_MCR_CODES>>0))
+#define U450_MCR_OE(udrv)      ((uchar)(udrv->U450_MCR_CODES>>8))
+#define U450_MCR_OEQ(udrv)     ((uchar)(udrv->U450_MCR_CODES>>16))
+#define U450_MSR_RxD(udrv)     ((uchar)(udrv->U450_MSR_CODES>>0))
+#define U450_MSR_TxD(udrv)     ((uchar)(udrv->U450_MSR_CODES>>8))
+#define U450_MSR_DTxD(udrv)    ((uchar)(udrv->U450_MSR_CODES>>16))
+#define U450_SET_MCR_CODES(udrv,ie,oe,oeq) \
+       (udrv->U450_MCR_CODES=(ie)<<0|(oe)<<8|(oeq)<<16)
+#define U450_SET_MSR_CODES(udrv,rxd,txd,dtxd) \
+       (udrv->U450_MSR_CODES=(rxd)<<0|(txd)<<8|(dtxd)<<16)
+#else /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+#define U450_MCR_IE(udrv)      U450_MCR_IE_C
+#define U450_MCR_OE(udrv)      U450_MCR_OE_C
+#define U450_MCR_OEQ(udrv)     U450_MCR_OEQ_C
+#define U450_MSR_RxD(udrv)     U450_MSR_RxD_C
+#define U450_MSR_TxD(udrv)     U450_MSR_TxD_C
+#define U450_MSR_DTxD(udrv)    U450_MSR_DTxD_C
+#endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+
+
+/*** Test interrupt request state ***/
+int u450_pool(ul_drv *udrv)
+{
+  unsigned u;
+  u=u450_inb(udrv->port,UART_IIR);
+  return (u&UART_IIR_NO_INT)?0:((u&UART_IIR_ID)|1);
+};
+
+/*** Wait end of transmit ***/
+int u450_weot(ul_drv *udrv, int ret_code)
+{
+  int ret;
+  unsigned u;
+  uchar lsr_val;
+  uchar uc;
+  if(!udrv->chip_buff[0]||
+     !(u450_inb(udrv->port,UART_MCR)&U450_MCR_OEQ(udrv))) 
+  {
+    UL_FRET;
+    u450_outb(udrv->port,UART_LCR,U450_LCR_UL);
+    return UL_RC_PROC;
+  };
+  u450_outb(udrv->port,UART_IER,UART_IER_RDI);
+  lsr_val=u450_inb(udrv->port,UART_LSR);
+  ret=UL_RC_WIRQ;
+  if(!(~lsr_val&(UART_LSR_THRE|UART_LSR_TEMT)))
+  {
+    LOG_CHIO(" TMI");
+//    ret=UL_RC_PROC; /* was commented out */
+  }
+  if(lsr_val&U450_LSR_ERR) 
+    ret=UL_RC_EFRAME;  /* frame error */
+  if(lsr_val&UART_LSR_DR)
+  {
+    if((u=udrv->chip_buff[1])) udrv->chip_buff[1]=0;
+     else if((u=udrv->chip_buff[0])) udrv->chip_buff[0]=0;
+    uc=u450_inb(udrv->port,UART_RX);
+    if((u^uc)&0xff||!u)
+    {
+      LOG_CHIO(" TE%c!",u?'0':'1');
+      ret=UL_RC_EBADCHR;
+    }else{
+      LOG_CHIO(".");
+      if(ret>=0&&!udrv->chip_buff[0])
+       ret=UL_RC_PROC;
+    }; 
+  } else {
+    U450_FIX_RDI_GARBAGE(udrv,ret_code);
+  }
+  if(ret!=UL_RC_WIRQ)
+  {
+    u450_outb(udrv->port,UART_LCR,U450_LCR_UL);
+    UL_FRET;
+  };
+  LOG_CHIO(" weot ret %d ",ret);
+  return ret;
+};
+
+  
+#ifndef CONFIG_OC_UL_DRV_U450_LOOPBACK
+
+/*** Switch from receive to transmit ***/
+  int u450_sw_R2T_1(ul_drv *udrv, int ret_code);
+  int u450_sw_R2T_2(ul_drv *udrv, int ret_code);
+  int u450_sw_R2T_3(ul_drv *udrv, int ret_code);
+
+int u450_sw_R2T(ul_drv *udrv, int ret_code)
+{
+  udrv->chip_buff[0]=udrv->chip_buff[1]=0;
+ /* A_wait */
+  UL_FCALL2(u450_weot,u450_sw_R2T_1);
+  return UL_RC_PROC;
+};
+
+int u450_sw_R2T_1(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv));
+  u450_outb(udrv->port,UART_IER,UART_IER_THRI);
+  uc=u450_inb(udrv->port,UART_LSR);
+  if(uc&UART_LSR_THRE)
+    u450_outb(udrv->port,UART_TX,0);
+  UL_FNEXT(u450_sw_R2T_2);
+  uc=u450_inb(udrv->port,UART_LSR);
+  if(uc&UART_LSR_THRE) return UL_RC_PROC;
+    else return UL_RC_WIRQ;
+}; 
+
+int u450_sw_R2T_2(ul_drv *udrv, int ret_code)
+{
+  uchar uc, uc1;
+
+ /* A_wait1: */
+  uc=u450_inb(udrv->port,UART_MSR);
+  if(uc&U450_MSR_TxD(udrv))
+    udrv->chip_temp&=~0x400;
+  else
+    udrv->chip_temp|=0x400;
+  u450_outb(udrv->port,UART_IER,UART_IER_MSI);
+  uc1=u450_inb(udrv->port,UART_LSR);
+  if (!(~uc1&(UART_LSR_TEMT|UART_LSR_THRE))) {
+    UL_FRET;
+    return UL_RC_PROC;
+  }
+ #ifdef CONFIG_OC_UL_DRV_U450_TMELATE
+  /* The next code seems to be required for LPC2148 UART */
+  if((!(uc&U450_MSR_TxD(udrv)))&&(uc1&UART_LSR_THRE)) {
+    UL_FRET;
+    return UL_RC_PROC;
+  }
+ #endif /* CONFIG_OC_UL_DRV_U450_TMELATE */
+  UL_FNEXT(u450_sw_R2T_3);
+  return UL_RC_WIRQ;
+}; 
+
+int u450_sw_R2T_3(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+ #if 0
+  static int reported_bad_chip=0;
+ #endif
+ /* A_wait2: */
+  uc=u450_inb(udrv->port,UART_MSR);
+  if(uc&U450_MSR_DTxD(udrv))
+    udrv->chip_temp&=~0x400;
+  if((uc&U450_MSR_TxD(udrv))&&(udrv->chip_temp&0x400))
+    return UL_RC_WIRQ;
+ #if 0
+  while(~u450_inb(udrv->port,UART_LSR)&
+       (UART_LSR_TEMT|UART_LSR_THRE))
+   if(!reported_bad_chip++)
+     LOG_FATAL(KERN_CRIT "uLan u450_sw_R2T_3 : problematic IC => looping in ISR\n");
+ #endif
+  UL_FRET;
+  return UL_RC_PROC;
+}; 
+#else /* CONFIG_OC_UL_DRV_U450_LOOPBACK */
+
+/*** Switch from receive to transmit ***/
+  int u450_sw_R2T_1(ul_drv *udrv, int ret_code);
+  int u450_sw_R2T_2(ul_drv *udrv, int ret_code);
+
+int u450_sw_R2T(ul_drv *udrv, int ret_code)
+{
+  udrv->chip_buff[0]=udrv->chip_buff[1]=0;
+ /* A_wait */
+  UL_FCALL2(u450_weot,u450_sw_R2T_1);
+  return UL_RC_PROC;
+};
+
+int u450_sw_R2T_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv)|UART_MCR_LOOP);
+  u450_outb(udrv->port,UART_IER,UART_IER_RDI);
+  u450_outb(udrv->port,UART_TX,0);
+  UL_FNEXT(u450_sw_R2T_2);
+  return UL_RC_WIRQ;
+}; 
+
+int u450_sw_R2T_2(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+  uc=u450_inb(udrv->port,UART_LSR);
+  u450_inb(udrv->port,UART_RX);
+  if (!(~uc&(UART_LSR_TEMT|UART_LSR_THRE))) {
+    u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv));
+    UL_FRET;
+    return UL_RC_PROC;
+  }
+  return UL_RC_WIRQ;
+}; 
+
+#endif /* CONFIG_OC_UL_DRV_U450_LOOPBACK */
+
+
+/*** Receive character into char_buff ***/
+  int u450_recch_1(ul_drv *udrv, int ret_code);
+  int u450_recch_2(ul_drv *udrv, int ret_code);
+
+int u450_recch(ul_drv *udrv, int ret_code)
+{
+  udrv->char_buff=0;
+  if(u450_inb(udrv->port,UART_MCR)&U450_MCR_OEQ(udrv))
+  {
+    UL_FCALL2(u450_weot,u450_recch_1);
+    return UL_RC_PROC;
+  };
+  UL_FNEXT(u450_recch_2);
+  return UL_RC_PROC;
+};
+int u450_recch_1(ul_drv *udrv, int ret_code)
+{
+  u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv));
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  UL_FNEXT(u450_recch_2);
+  return UL_RC_PROC;
+};
+
+INLINE int u450_recch_sub(ul_drv *udrv,int lsr_val,int rec_char)
+{ /* helper function to process received character */
+  if(lsr_val&U450_LSR_C) udrv->last_ctrl=rec_char|=0x100; 
+   else udrv->last_ctrl&=0x7F; 
+  udrv->char_buff=rec_char;
+  udrv->xor_sum^=rec_char;udrv->xor_sum++;
+  if(lsr_val&U450_LSR_ERR)
+  {
+    LOG_CHIO(" ER:%03X",udrv->char_buff);
+    return UL_RC_EFRAME; /* frame error */
+  };
+  LOG_CHIO(" R:%03X",udrv->char_buff);
+  return UL_RC_PROC;
+};
+int u450_recch_2(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  u450_outb(udrv->port,UART_IER,UART_IER_RDI);
+  lsr_val=u450_inb(udrv->port,UART_LSR);
+  if(!(lsr_val&UART_LSR_DR)) {
+    U450_FIX_RDI_GARBAGE(udrv,ret_code);
+    return UL_RC_WIRQ;
+  }
+  UL_FRET;
+  return u450_recch_sub(udrv,lsr_val,u450_inb(udrv->port,UART_RX));
+};
+
+/*** Send character from char_buff ***/
+  int u450_sndch_1(ul_drv *udrv, int ret_code);
+  int u450_sndch_2(ul_drv *udrv, int ret_code);
+
+int u450_sndch(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+  uc=(udrv->char_buff&0x100)?U450_LCR_ULC:U450_LCR_UL;
+  if(u450_inb(udrv->port,UART_LCR)!=uc)
+  { /* change between control and data character format */
+   if((u450_inb(udrv->port,UART_MCR)&U450_MCR_OEQ(udrv)))
+   { /* wait to end of transmit */
+     UL_FCALL2(u450_weot,u450_sndch_1);
+     return UL_RC_PROC;
+   }else{ /* direction switch necessary */
+     udrv->chip_buff[0]=udrv->chip_buff[1]=0;
+     UL_FCALL2(u450_sw_R2T_1,u450_sndch_1);
+     UL_FCALL2(u450_weot,u450_sw_R2T_1);
+     return UL_RC_PROC;
+   };
+  };
+  if(!(u450_inb(udrv->port,UART_MCR)&U450_MCR_OEQ(udrv)))
+  { /* direction switch necessary */
+    udrv->chip_buff[0]=udrv->chip_buff[1]=0;
+    UL_FCALL2(u450_sw_R2T_1,u450_sndch_1);
+    UL_FCALL2(u450_weot,u450_sw_R2T_1);
+  } else UL_FNEXT(u450_sndch_1);
+  return UL_RC_PROC;
+};
+
+int u450_sndch_1(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  u450_outb(udrv->port,UART_MCR,U450_MCR_OE(udrv));
+  if(udrv->char_buff&0x100)
+  { /* store last ctrl for connect line busy/ready */
+    udrv->last_ctrl=udrv->char_buff;
+    uc=U450_LCR_ULC;
+  }else{ 
+    uc=U450_LCR_UL;
+  };
+  udrv->chip_buff[1]=udrv->chip_buff[0];
+  udrv->chip_buff[0]=udrv->char_buff|0x1000; 
+  udrv->xor_sum^=udrv->char_buff;udrv->xor_sum++;
+  u450_outb(udrv->port,UART_IER,UART_IER_THRI);
+  u450_outb(udrv->port,UART_LCR,uc);  /* control/data character */
+  u450_outb(udrv->port,UART_TX,(uchar)udrv->char_buff);
+  LOG_CHIO(" T:%03X",udrv->char_buff);
+  UL_FNEXT(u450_sndch_2);
+  return UL_RC_WIRQ;
+}; 
+
+int u450_sndch_2(ul_drv *udrv, int ret_code)
+{
+  uchar uc;
+  unsigned u;
+  uc=u450_inb(udrv->port,UART_LSR);
+  UL_FRET;
+  if(uc&U450_LSR_ERR)
+      return UL_RC_EFRAME;     /* frame error */
+  if(!(uc&UART_LSR_DR)) {
+      U450_FIX_RDI_GARBAGE(udrv,ret_code);
+      return UL_RC_PROC;               /* no char */ 
+  }
+  if((u=udrv->chip_buff[1])) udrv->chip_buff[1]=0;
+    else if((u=udrv->chip_buff[0])) udrv->chip_buff[0]=0;
+      else return UL_RC_PROC;
+  uc=u450_inb(udrv->port,UART_RX);
+  if((u^uc)&0xff||!u)
+  {
+    LOG_CHIO(" TE%c!",u?'2':'3');
+    return UL_RC_EBADCHR;
+  };
+  LOG_CHIO(".");
+  return UL_RC_PROC;
+};
+/*** Wait for time or received character ***/
+  int u450_wait_1(ul_drv *udrv, int ret_code);
+  int u450_wait_2(ul_drv *udrv, int ret_code);
+
+int u450_wait(ul_drv *udrv, int ret_code)
+{
+  udrv->char_buff=0;
+  if(u450_inb(udrv->port,UART_MCR)&U450_MCR_OEQ(udrv))
+  {
+    UL_FCALL2(u450_weot,u450_wait_1);
+  } else UL_FNEXT(u450_wait_1);
+  return UL_RC_PROC;
+};
+
+int u450_wait_1(ul_drv *udrv, int ret_code)
+{
+ uchar lsr_val;
+ if(ret_code<0) {UL_FRET;return ret_code;};
+ lsr_val=u450_inb(udrv->port,UART_LSR);
+ u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv));
+ u450_outb(udrv->port,UART_IER,UART_IER_THRI|UART_IER_RDI);
+ if(lsr_val&UART_LSR_DR)
+ {
+   UL_FRET;
+   return u450_recch_sub(udrv,lsr_val,u450_inb(udrv->port,UART_RX));
+ };
+ U450_FIX_RDI_GARBAGE(udrv,ret_code);
+ if(!(lsr_val&UART_LSR_THRE)) return UL_RC_WIRQ;
+ if(!udrv->wait_time)
+ {
+   UL_FRET;
+   LOG_CHIO(" Timeout!");
+   return UL_RC_ETIMEOUT;
+ };
+ UL_FNEXT(u450_wait_2);
+ u450_outb(udrv->port,UART_TX,0);
+ return UL_RC_WIRQ;
+};
+
+int u450_wait_2(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  lsr_val=u450_inb(udrv->port,UART_LSR);
+  if(lsr_val&UART_LSR_DR)
+  {
+    UL_FRET;
+    return u450_recch_sub(udrv,lsr_val,u450_inb(udrv->port,UART_RX));
+  };
+  U450_FIX_RDI_GARBAGE(udrv,ret_code);
+  if(!(lsr_val&UART_LSR_THRE)) return UL_RC_WIRQ;
+  if(!udrv->wait_time--)
+  {
+    UL_FRET;
+    LOG_CHIO(" Timeout!");
+    return UL_RC_ETIMEOUT;
+  };
+  u450_outb(udrv->port,UART_TX,0);
+  return UL_RC_WIRQ;
+};
+
+/*** Connect to RS485 bus ***/
+  int u450_connect_1(ul_drv *udrv, int ret_code);
+  int u450_connect_2(ul_drv *udrv, int ret_code);
+
+int u450_connect(ul_drv *udrv, int ret_code)
+{
+  unsigned u;
+  LOG_CHIO(" C_0 ");
+  u=udrv->last_ctrl;
+  udrv->wait_time=((udrv->my_adr-u-1)&0xF)+4; 
+  if(((u&0x180)!=0x180)||
+     (u==0x1FF)) udrv->wait_time+=0x10;
+  udrv->last_ctrl=0;
+  udrv->char_buff=0;
+  udrv->chip_temp=(udrv->my_adr&0x3F)|0x40;
+  u450_inb(udrv->port,UART_MSR);
+  UL_FCALL2(*udrv->fnc_wait,u450_connect_1);
+  return UL_RC_PROC;
+};
+
+int u450_connect_1(ul_drv *udrv, int ret_code)
+{
+  LOG_CHIO(" C_1 ");
+
+  if(ret_code!=UL_RC_ETIMEOUT)
+  { UL_FRET;
+    LOG_CHIO(" EARBIT1!");
+    return UL_RC_EARBIT;
+  };
+  /* check for RxD low */
+  if(u450_inb(udrv->port,UART_MSR)&U450_MSR_RxD(udrv))
+  { UL_FRET;
+    LOG_CHIO(" EARBIT2!");
+    return UL_RC_EARBIT;
+  };
+  u450_outb(udrv->port,UART_LCR,U450_LCR_ULB);
+  u450_inb(udrv->port,UART_LSR);
+  udrv->chip_temp|=0x300;
+  u450_outb(udrv->port,UART_IER, (UART_IER_RLSI|UART_IER_RDI));
+  u450_outb(udrv->port,UART_MCR,U450_MCR_OE(udrv));
+  UL_FNEXT(u450_connect_2);
+  /* wait for break condition now */
+  return UL_RC_WIRQ;
+};
+
+int u450_connect_2(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  LOG_CHIO(" C_2 ");
+  lsr_val=u450_inb(udrv->port,UART_LSR);
+  if(lsr_val&UART_LSR_BI) udrv->chip_temp&=~0x100;
+  if(lsr_val&UART_LSR_DR) {
+    udrv->chip_temp&=~0x200;
+    u450_inb(udrv->port,UART_RX);
+  }
+  if (udrv->chip_temp&0x300) {
+    return UL_RC_WIRQ;
+  }
+  u450_outb(udrv->port,UART_LCR,U450_LCR_ULC);
+  u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv));
+  u450_inb(udrv->port,UART_LSR);
+  u450_inb(udrv->port,UART_RX);
+  if(udrv->chip_temp==1)
+  {LOG_CHIO(" Connected");
+    UL_FRET;
+  }else{ 
+    udrv->wait_time=(udrv->chip_temp&3)+1; 
+    udrv->chip_temp>>=2;
+    UL_FCALL2(*udrv->fnc_wait,u450_connect_1);
+  };
+  return UL_RC_PROC;
+};
+
+/*
+ UL_FNEXT(u450_recch);
+ UL_FCALL(u450_recch);
+ UL_FCALL2(u450_recch,u450_recch);
+ UL_FRET;
+*/
+
+#ifdef FOR_LINUX_KERNEL
+static char *u450_port_name="ulan_u450";
+#endif
+
+/*** 16450 initialize ports ***/
+int u450_pinit(ul_drv *udrv)
+{
+  unsigned u;
+  int baud=udrv->baud_val;
+  if (UL_REQ_IOS(udrv->port,8,u450_port_name)<0) 
+  { LOG_FATAL(KERN_CRIT "uLan u450_pinit : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  };
+  if (!baud) baud=19200;
+  u=(udrv->baud_base+baud/2)/baud;
+  if (u>0xFFFF) u=0xFFFF;
+  udrv->baud_div=u;
+
+  udrv->chip_buff[0]=udrv->chip_buff[1]=0;
+  u450_outb(udrv->port,UART_MCR,UART_MCR_OUT1|UART_MCR_DTR);
+  u450_outb(udrv->port,UART_LCR,UART_LCR_DLAB);
+  u450_outb(udrv->port,(uchar)UART_DLL,(uchar)udrv->baud_div);
+  u450_outb(udrv->port,(uchar)UART_DLM,(uchar)(udrv->baud_div>>8));
+  u450_outb(udrv->port,UART_LCR,U450_LCR_UL);
+  u450_outb(udrv->port,UART_IER,0);
+  u450_outb(udrv->port,UART_FCR,0);    /* disable FIFOs */
+  u450_inb(udrv->port,UART_LSR);               /* reset errors */
+  u450_inb(udrv->port,UART_RX);                /* and other irq */
+  u450_outb(udrv->port,UART_MCR,U450_MCR_IE(udrv)); /* connect irq */
+  return UL_RC_PROC;
+};
+
+/*** 16450 deinitialize ports ***/
+int u450_pdone(ul_drv *udrv)
+{
+  u450_outb(udrv->port,UART_IER, 0);   /* disable interrupts */
+  u450_outb(udrv->port,UART_MCR, U450_MCR_IE(udrv)&3);  /* transmitter off */
+  u450_inb(udrv->port,UART_IIR);               /* flush irq */
+  u450_inb(udrv->port,UART_LSR);               /* flush irq */
+  UL_REL_IOS(udrv->port,8);
+  return UL_RC_PROC;
+};
+
+/*** 16450 generate irq for irq_probe */
+int u450_genirq(ul_drv *udrv,int param)
+{
+  if(param) 
+  {
+    u450_outb(udrv->port,UART_MCR, U450_MCR_IE(udrv));  /* transmitter off */
+    u450_outb(udrv->port,UART_IER, UART_IER_MSI);      /* enable interrupts */
+    u450_outb(udrv->port,UART_LCR, U450_LCR_ULB);      /* trig break */
+  }else{
+    u450_outb(udrv->port,UART_IER, 0);         /* disable interrupts */
+    u450_outb(udrv->port,UART_MCR, U450_MCR_IE(udrv)); /* transmitter off */
+    u450_inb(udrv->port,UART_MSR);             /* flush irq */
+  };
+  return UL_RC_PROC;
+};
+
+/* support for hardware tests */
+int u450_hwtest(ul_drv *udrv,int param)
+{
+  unsigned u;
+  switch(param)
+  {
+   case 0x10:
+   case 0x11:
+       u450_outb(udrv->port,UART_IER, 0); /* disable interrupts */
+       u450_outb(udrv->port,UART_MCR, U450_MCR_OE(udrv)); /* transmitter on */
+       u450_outb(udrv->port,UART_LCR, param&1?
+                    U450_LCR_UL:U450_LCR_ULB); /* set TD lines */
+   case 0x12:
+        u=u450_inb(udrv->port,UART_MSR);
+       return u450_inb(udrv->port,UART_LSR)|(u<<8)|
+                       (u&(U450_MSR_TxD(udrv))?0:0x100000)|
+                       (u&(U450_MSR_RxD(udrv))?0:0x10000);
+   case 0x13:
+       u450_outb(udrv->port,UART_MCR, U450_MCR_IE(udrv)); /* transmitter off */
+        u=u450_inb(udrv->port,UART_MSR);
+       return u450_inb(udrv->port,UART_LSR)|(u<<8)|
+                       (u&(U450_MSR_TxD(udrv))?0:0x100000)|
+                       (u&(U450_MSR_RxD(udrv))?0:0x10000);
+  }
+  return UL_RC_ENOFNC;
+};
+
+/*** Control functions of chip driver  ***/
+int u450_cctrl(ul_drv *udrv, int ctrl_fnc, int param)
+{
+  switch (ctrl_fnc)
+  {
+   case UL_CC_DIN:     /* switch off line transmitter */
+       { u450_outb(udrv->port,UART_MCR, U450_MCR_IE(udrv)); 
+         u450_outb(udrv->port,UART_LCR, U450_LCR_UL); 
+         return UL_RC_PROC;
+       };
+   case UL_CC_DOUT:    /* switch on line transmitter */
+       { u450_outb(udrv->port,UART_MCR, U450_MCR_OE(udrv));
+         u450_outb(udrv->port,UART_LCR, U450_LCR_UL); 
+         return UL_RC_PROC;
+       };
+   case UL_CC_PINIT:   /* initialize ports (parameter baud)*/
+       { return u450_pinit(udrv);
+       };
+   case UL_CC_PDONE:   /* deinitialize ports */
+       { return u450_pdone(udrv);
+       };
+   case UL_CC_GENIRQ:  /* generate irq for irq_probe */
+       {return u450_genirq(udrv,param);
+       };
+   case UL_CC_HWTEST:  /* support for hardware testing */
+       {return u450_hwtest(udrv,param);
+       };
+  };
+  return UL_RC_ENOFNC;
+};
+
+/*** 16450 chip driver initialize ***/
+int u450_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options)
+{
+  unsigned u;
+  unsigned old_mcr;
+  unsigned old_lcr;
+  if (UL_REQ_IOS(port,8,u450_port_name)<0)
+  { LOG_FATAL(KERN_CRIT "uLan u450_init : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  };
+  
+ #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
+  if(!(options&U450_CHOPT_DIRNEG))
+    U450_SET_MCR_CODES(udrv,U450_MCR_IE_C,U450_MCR_OE_C,U450_MCR_OEQ_C);
+  else
+    U450_SET_MCR_CODES(udrv,U450_MCR_OE_C,U450_MCR_IE_C,U450_MCR_OEQ_C>>1);
+  if(!(options&U450_CHOPT_MSRSWAP))
+    U450_SET_MSR_CODES(udrv,U450_MSR_RxD_C,U450_MSR_TxD_C,U450_MSR_DTxD_C);
+  else
+    U450_SET_MSR_CODES(udrv,UART_MSR_DSR,UART_MSR_CTS,UART_MSR_DCTS);
+ #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+
+  LOG_PORTS("uLan u450_init : probe MCR\n");
+  old_mcr=u450_inb(port,UART_MCR);
+  LOG_PORTS("uLan u450_init : MCR = 0x%02X\n",old_mcr);
+
+  u450_outb(port,UART_MCR,UART_MCR_OUT1|UART_MCR_DTR);
+  #ifdef FOR_LINUX_KERNEL
+   set_current_state(TASK_INTERRUPTIBLE);
+   schedule_timeout(ULD_HZ/10);
+  #elif defined(_WIN32)
+   /* !!!!!!!!!!!!!! */
+   /* KeStallExecutionProcessor(20000); */
+   { LARGE_INTEGER delay;
+     delay=RtlConvertLongToLargeInteger(-30*10000);
+     KeDelayExecutionThread(KernelMode,FALSE,&delay);
+   }
+  #else
+   sleep(1);
+  #endif
+  old_lcr=u450_inb(port,UART_LCR);
+  u450_outb(port,UART_LCR,UART_LCR_SBC);
+  #ifdef FOR_LINUX_KERNEL
+   set_current_state(TASK_INTERRUPTIBLE);
+   schedule_timeout(ULD_HZ/10);
+  #elif defined(_WIN32)
+   /* !!!!!!!!!!!!!! */
+   /* KeStallExecutionProcessor(2000); */
+   { LARGE_INTEGER delay;
+     delay=RtlConvertLongToLargeInteger(-10*10000);
+     KeDelayExecutionThread(KernelMode,FALSE,&delay);
+   }
+  #else
+   sleep(1);
+  #endif
+  if(u450_inb(port,UART_MSR)&U450_MSR_TxD(udrv))
+  { u450_outb(port,UART_LCR,U450_LCR_UL);
+    LOG_PORTS("uLan u450_init : MCR test 1 OK\n");
+    #ifdef FOR_LINUX_KERNEL
+     set_current_state(TASK_INTERRUPTIBLE);
+     schedule_timeout(ULD_HZ/10);
+    #elif defined(_WIN32)
+     /* !!!!!!!!!!!!!! */
+     /* KeStallExecutionProcessor(2000); */
+     { LARGE_INTEGER delay;
+       delay=RtlConvertLongToLargeInteger(-10*10000);
+       KeDelayExecutionThread(KernelMode,FALSE,&delay);
+     }
+    #else
+     sleep(1);
+    #endif
+    if(!(u450_inb(port,UART_MSR)&U450_MSR_TxD(udrv)))
+    { LOG_PORTS("uLan u450_init : MCR test 2 OK\n");
+      udrv->chip_options=options;
+      udrv->baud_base=baudbase;
+     /* check and setup baud base oscilator frequency */
+      if(!udrv->baud_base){
+        udrv->baud_base=U450_BAUD_BASE_DEFAULT;
+      }
+      if(!baud) baud=19200;
+      udrv->baud_val=baud;
+      u=(udrv->baud_base+baud/2)/baud;
+      if (u>0xFFFF) u=0xFFFF;
+      udrv->baud_div=u;
+      udrv->port=port;
+      udrv->irq=irq; 
+      udrv->fnc_recch=&u450_recch;
+      udrv->fnc_sndch=&u450_sndch;
+      udrv->fnc_wait=&u450_wait;
+      udrv->fnc_pool=&u450_pool;
+      udrv->fnc_connect=&u450_connect;
+      udrv->fnc_cctrl=&u450_cctrl;
+      UL_REL_IOS(port,8);
+      return 0;
+    };
+    LOG_PORTS("uLan u450_init : MCR test 2 Error\n");
+  };
+  u450_outb(port,UART_LCR,(uchar)old_lcr);
+  u450_outb(port,UART_MCR,(uchar)old_mcr);
+  LOG_PORTS("uLan u450_init : MCR test Error\n");
+  UL_REL_IOS(port,8);
+  return UL_RC_EPORT;
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_c510.c b/ulan/host/ul_drv/ul_drv/ul_c510.c
new file mode 100644 (file)
index 0000000..04b82df
--- /dev/null
@@ -0,0 +1,463 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_c510.c    - chip driver for Intel 82C510
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Chip driver for 82510 */
+
+#if 1
+ /* this enables use of shadow 82510 bank switch */
+ /* be !!! carefull !!!, use U510_SBANK_FINI at begin of every */
+ /* function containing u510_outb, u510_inb */
+ /* such function must not call another such function */
+ #define _U510_SBANK_SHADOW_VAR sbank_sv
+ #define U510_SBANK_FINI int sbank_sv=-1;
+#else
+ #define U510_SBANK_FINI
+#endif
+
+#include "ul_82510.h"
+
+/*** Test interrupt request state ***/
+int u510_pool(ul_drv *udrv)
+{
+ return u510_pool_gir(udrv->port);
+};
+
+/*** Receive character into char_buff ***/
+int u510_recch(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  uchar uc;
+  udrv->char_buff=0;
+  if(u510_inb(udrv->port,U510_MCR)&U510_MCR_OEQ)
+  { /* direction switch necessary */
+    if(!(u510_inb(udrv->port,U510_GSR)&U510_GER_TM))
+    { /* wait to end of previous transfer */
+     u510_outb(udrv->port,U510_GER, U510_GER_TM);
+     return UL_RC_WIRQ;
+    }
+    u510_outb(udrv->port,U510_MCR, U510_MCR_IE);
+    u510_outb(udrv->port,U510_RCM, U510_RCM_FLUSH);
+  };
+
+  u510_outb(udrv->port,U510_GER,U510_GER_RI);
+  uc=u510_inb(udrv->port,U510_RST);
+  if(!(uc&0x01)) return UL_RC_WIRQ;
+
+  uc=u510_inb(udrv->port,U510_RXF);
+  udrv->char_buff=u510_inb(udrv->port,U510_RXD);
+  if(uc&0x08)
+  { /* store last ctrl for connect line busy/ready */
+    udrv->char_buff|=0x100; /* controll char */
+    udrv->last_ctrl=udrv->char_buff;
+  } else udrv->last_ctrl&=0x7F;
+  udrv->xor_sum^=udrv->char_buff;udrv->xor_sum++;
+
+  UL_FRET;
+  if(uc&0x02) 
+  {
+    LOG_CHIO(" ER:%03X",udrv->char_buff);
+    return UL_RC_EFRAME; /* frame error */
+  };
+  LOG_CHIO(" R:%03X",udrv->char_buff);
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for sndchar --*/
+
+int u510_sndch(ul_drv *udrv, int ret_code);
+
+int u510_sndch_w2(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  u510_outb(udrv->port,U510_MCR, U510_MCR_OE);
+  UL_FNEXT(u510_sndch);
+  return UL_RC_PROC;
+}
+
+int u510_sndch_w1(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  unsigned u;
+  u=udrv->baud_div*11*16;
+  u510_outb(udrv->port,U510_TMCR,0);
+  u510_inb(udrv->port,U510_TMST);
+  u510_outb(udrv->port,U510_GER,U510_GER_TIE);
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C|U510_LCR_DLAB);
+  u510_outb(udrv->port,U510_BBL,(uchar)u);
+  u510_outb(udrv->port,U510_BBH,(uchar)(u>>8));
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C);
+  u510_outb(udrv->port,U510_TMIE,2);
+  u510_outb(udrv->port,U510_TMCR,0x22);
+  UL_FNEXT(u510_sndch_w2);
+  return UL_RC_WIRQ;
+}
+
+/*** Send character from char_buff ***/
+int u510_sndch(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  if(!(u510_inb(udrv->port,U510_MCR)&U510_MCR_OEQ))
+  { /* direction switch necessary */
+    UL_FNEXT(u510_sndch_w1);
+    if(!(u510_inb(udrv->port,U510_GSR)&U510_GER_TM))
+    { /* wait to end of previous transfer */
+      u510_outb(udrv->port,U510_GER, U510_GER_TM);
+      return UL_RC_WIRQ;
+    }
+    return UL_RC_PROC;
+  };
+
+  u510_outb(udrv->port,U510_GER,U510_GER_TI);
+  if(!(u510_inb(udrv->port,U510_LSR)&U510_LSR_TRE)) return UL_RC_WIRQ;
+
+  if(udrv->char_buff&0x100)
+  { /* store last ctrl for connect line busy/ready */
+    udrv->last_ctrl=udrv->char_buff;
+    u510_outb(udrv->port,U510_TXF, 0x80); /* controll char */
+  } else u510_outb(udrv->port,U510_TXF, 0x00); /* regular char */;
+  u510_outb(udrv->port,U510_TXD,(uchar)udrv->char_buff); /* char code */
+  udrv->xor_sum^=udrv->char_buff;udrv->xor_sum++;
+
+  LOG_CHIO(" T:%03X",udrv->char_buff);
+  UL_FRET;
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for wait --*/
+
+int u510_wait(ul_drv *udrv, int ret_code);
+
+int u510_wait_1(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  if(u510_inb(udrv->port,U510_RST)&1)
+  {
+    UL_FNEXT(u510_recch);
+    return UL_RC_PROC;
+  };
+
+  if(!udrv->wait_time--)
+  {
+    LOG_CHIO(" Timeout!");
+    UL_FRET;
+    return UL_RC_ETIMEOUT;
+  };
+
+  u510_outb(udrv->port,U510_TMCR,0);
+  u510_inb(udrv->port,U510_TMST);
+
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C|U510_LCR_DLAB);
+  u510_outb(udrv->port,U510_BBL,0xFF);
+  u510_outb(udrv->port,U510_BBH,0xFF);
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C);
+  u510_outb(udrv->port,U510_TMIE,2);
+  u510_outb(udrv->port,U510_TMCR,0x22);
+
+  return UL_RC_WIRQ;
+};
+
+/*** Wait for time or received character ***/
+int u510_wait(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  unsigned u;
+
+  udrv->char_buff=0;
+  if(!(u510_inb(udrv->port,U510_GSR)&U510_GER_TM))
+  { /* wait to end of previous transfer */
+    u510_outb(udrv->port,U510_GER, U510_GER_TM);
+    return UL_RC_WIRQ;
+  };
+  if(u510_inb(udrv->port,U510_MCR)&U510_MCR_OEQ)
+  { /* direction switch necessary */
+    u510_outb(udrv->port,U510_MCR, U510_MCR_IE);
+    u510_outb(udrv->port,U510_RCM, U510_RCM_FLUSH);
+  };
+
+  UL_FNEXT(u510_wait_1);
+
+  u=udrv->wait_time*11*16*udrv->baud_div;
+  udrv->wait_time=u>>16;
+  u510_outb(udrv->port,U510_TMCR,0);
+  u510_inb(udrv->port,U510_TMST);
+  u510_outb(udrv->port,U510_GER,U510_GER_TIE+U510_GER_RI);
+  if((u&0xFFFF)<=2) return UL_RC_PROC;
+
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C|U510_LCR_DLAB);
+  u510_outb(udrv->port,U510_BBL,(uchar)u);
+  u510_outb(udrv->port,U510_BBH,(uchar)(u>>8));
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C);
+  u510_outb(udrv->port,U510_TMIE,2);
+  u510_outb(udrv->port,U510_TMCR,0x22);
+
+  return UL_RC_WIRQ;
+};
+
+/*-- Helper functions for connect --*/
+
+int u510_connect_1(ul_drv *udrv, int ret_code);
+
+int u510_connect_2(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  u510_inb(udrv->port,U510_GSR);
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C);
+  u510_outb(udrv->port,U510_MCR,U510_MCR_IE);
+  u510_outb(udrv->port,U510_RCM, U510_RCM_FLUSH);
+  u510_inb(udrv->port,U510_RST);
+  if(udrv->chip_temp==1)
+  {LOG_CHIO(" Connected");
+    UL_FRET;
+  }else{ 
+    udrv->wait_time=(udrv->chip_temp&3)+1; 
+    udrv->chip_temp>>=2;
+    UL_FCALL2(*udrv->fnc_wait,u510_connect_1);
+  };
+  return UL_RC_PROC;
+};
+
+int u510_connect_1(ul_drv *udrv, int ret_code)
+{
+  U510_SBANK_FINI
+  if(ret_code!=UL_RC_ETIMEOUT)
+    { UL_FRET; return UL_RC_EARBIT;};
+  if((u510_inb(udrv->port,U510_MSR)&U510_MSR_RxD)||
+     (u510_inb(udrv->port,U510_RST)&1))
+  { UL_FRET;
+    LOG_CHIO(" EARBIT!");
+    return UL_RC_EARBIT;
+  };
+  u510_outb(udrv->port,U510_LCR,U510_LCR_C|U510_LCR_B);
+  u510_outb(udrv->port,U510_MCR,U510_MCR_OE);
+  UL_FNEXT(u510_connect_2);
+  /* wait to end of transfer */
+  u510_inb(udrv->port,U510_GSR);
+  u510_outb(udrv->port,U510_GER, U510_GER_TM);
+  u510_outb(udrv->port,U510_TXF, 0x00);
+  u510_outb(udrv->port,U510_TXD, 0x00); 
+  return UL_RC_WIRQ;
+};
+
+/*** Connect to RS485 bus ***/
+int u510_connect(ul_drv *udrv, int ret_code)
+{
+  unsigned u;
+  u=udrv->last_ctrl;
+  udrv->wait_time=((udrv->my_adr-u-1)&0xF)+4; 
+  if(((u&0x180)!=0x180)||
+     (u==0x1FF)) udrv->wait_time+=0x10;
+  udrv->last_ctrl=0;
+  udrv->char_buff=0;
+  udrv->chip_temp=(udrv->my_adr&0x3F)|0x40;
+  UL_FCALL2(*udrv->fnc_wait,u510_connect_1);
+  return UL_RC_PROC;
+};
+
+/*
+ UL_FNEXT(u510_recch);
+ UL_FCALL(u510_recch);
+ UL_FCALL2(u510_recch,u510_recch);
+ UL_FRET;
+*/
+
+static char *u510_port_name="ulan_u510";
+
+/*** 82510 initialize ports ***/
+int u510_pinit(ul_drv *udrv)
+{
+  U510_SBANK_FINI
+  unsigned u;
+  int baud=udrv->baud_val;
+  if (UL_REQ_IOS(udrv->port,8,u510_port_name)<0) 
+  { LOG_FATAL(KERN_CRIT "uLan u510_pinit : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  };
+  
+  for(u=0;u<0x80;u+=0x20) 
+  {
+    ul_outb(udrv->port+U510_GIR,u);
+    if((ul_inb(udrv->port+U510_GIR)^u)&0x60)
+    {
+      ul_outb(udrv->port+U510_GIR,0);
+      UL_REL_IOS(udrv->port,8);
+      return UL_RC_EPORT;
+    };
+  };
+  if (!baud) baud=19200;
+  u=(udrv->baud_base+baud/2)/baud;
+  if (u>0xFFFF) u=0xFFFF;
+  udrv->baud_div=u;
+  u510_outb(udrv->port,U510_ICM, 0x10);
+  u510_outb(udrv->port,U510_GER, 0);
+  u510_outb(udrv->port,U510_LCR, U510_LCR_C);
+  u510_outb(udrv->port,U510_IMD, 0xB);
+  u510_outb(udrv->port,U510_TMD, 0);   /* 0x18 -> RTS */
+  u510_outb(udrv->port,U510_FMD, 0);
+  u510_outb(udrv->port,U510_RMD, 0x40);        /* Addresss opens RxFIFO */
+  u510_outb(udrv->port,U510_CLCF,0x50);        /* RxC a TxC are 16x from BRGA */
+  u510_outb(udrv->port,U510_BACF,0x04);        /* Baud gen system clock */
+  u510_outb(udrv->port,U510_BBCF,0x00);        /* Timer system clock */
+  u510_outb(udrv->port,U510_PMD, 0x7C);        /* Configure pins */
+
+  u510_outb(udrv->port,U510_LCR, U510_LCR_C|U510_LCR_DLAB);
+  u510_outb(udrv->port,U510_BAL, (uchar)udrv->baud_div);
+  u510_outb(udrv->port,U510_BAH, (uchar)(udrv->baud_div>>8));
+  u510_outb(udrv->port,U510_LCR, U510_LCR_C);
+
+  u510_outb(udrv->port,U510_LCR, U510_LCR_C|U510_LCR_C);
+  u510_outb(udrv->port,U510_LCR, U510_LCR_C);
+  u510_outb(udrv->port,U510_GER, U510_GER_MI);
+  return UL_RC_PROC;
+};
+
+/*** 82510 deinitialize ports ***/
+int u510_pdone(ul_drv *udrv)
+{
+  U510_SBANK_FINI
+  u510_outb(udrv->port,U510_GER, 0);   /* disable interrupts */
+  u510_outb(udrv->port,U510_MCR, U510_MCR_IE);  /* transmitter off */
+  u510_outb(udrv->port,U510_GIR, U510_GIR_NO_INT); /* flush irq */
+  UL_REL_IOS(udrv->port,8);
+  return UL_RC_PROC;
+};
+
+/*** 82510 generate irq for irq_probe */
+int u510_genirq(ul_drv *udrv,int param)
+{
+  U510_SBANK_FINI
+  if(param) 
+  {
+    u510_outb(udrv->port,U510_MCR, U510_MCR_IE);  /* transmitter off */
+    u510_outb(udrv->port,U510_GER, U510_GER_TI);  /* enable interrupts */
+    u510_outb(udrv->port,U510_TXD, 0xFF);        /* trig TxFIFO int */
+  }else{
+    u510_outb(udrv->port,U510_GER, 0); /* disable interrupts */
+    u510_outb(udrv->port,U510_MCR, U510_MCR_IE);  /* transmitter off */
+    u510_outb(udrv->port,U510_GIR, U510_GIR_NO_INT); /* flush irq */
+  };
+  return UL_RC_PROC;
+};
+
+/* support for hardware tests */
+int u510_hwtest(ul_drv *udrv,int param)
+{
+  unsigned u;
+  U510_SBANK_FINI
+  switch(param)
+  {
+   case 0x10:
+   case 0x11:
+       u510_outb(udrv->port,U510_GER, 0); /* disable interrupts */
+       u510_outb(udrv->port,U510_MCR, U510_MCR_OE); /* transmitter on */
+       u510_outb(udrv->port,U510_LCR, param&1?
+                     U510_LCR_C:U510_LCR_B); /* set TD lines */
+   case 0x12:
+        u=u510_inb(udrv->port,U510_MSR);
+       return u510_inb(udrv->port,U510_LSR)|(u<<8)|
+                        (u&U510_MSR_TxD?0:0x100000)|
+                        (u&U510_MSR_RxD?0:0x10000);
+   case 0x13:
+       u510_outb(udrv->port,U510_MCR, U510_MCR_IE); /* transmitter off */
+        u=u510_inb(udrv->port,U510_MSR);
+       return u510_inb(udrv->port,U510_LSR)|(u<<8)|
+                        (u&U510_MSR_TxD?0:0x100000)|
+                        (u&U510_MSR_RxD?0:0x10000);
+  }
+  return UL_RC_ENOFNC;
+};
+
+/*** Control functions of chip driver  ***/
+int u510_cctrl(ul_drv *udrv, int ctrl_fnc, int param)
+{
+  U510_SBANK_FINI
+  switch (ctrl_fnc)
+  {
+   case UL_CC_DIN:     /* switch off line transmitter */
+       { u510_outb(udrv->port,U510_MCR, U510_MCR_IE); 
+         return UL_RC_PROC;
+       };
+   case UL_CC_DOUT:    /* switch on line transmitter */
+       { u510_outb(udrv->port,U510_MCR, U510_MCR_OE);
+         return UL_RC_PROC;
+       };
+   case UL_CC_PINIT:   /* initialize ports (parameter baud)*/
+       { return u510_pinit(udrv);
+       };
+   case UL_CC_PDONE:   /* deinitialize ports */
+       { return u510_pdone(udrv);
+       };
+   case UL_CC_GENIRQ:  /* generate irq for irq_probe */
+       {return u510_genirq(udrv,param);
+       };
+   case UL_CC_HWTEST:  /* support for hardware testing */
+       {return u510_hwtest(udrv,param);
+       };
+  };
+  return UL_RC_ENOFNC;
+};
+
+/*** 82510 chip driver initialize ***/
+int u510_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options)
+{
+  unsigned u;
+  if (UL_REQ_IOS(port,8,u510_port_name)<0) 
+  { LOG_FATAL(KERN_CRIT "uLan u510_init : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  };
+  
+  for(u=0;u<0x80;u+=0x20) 
+  {
+    ul_outb(port+U510_GIR,u);
+    if((ul_inb(port+U510_GIR)^u)&0x60)
+    {
+      ul_outb(port+U510_GIR,0);
+      UL_REL_IOS(port,8);
+      return UL_RC_EPORT;
+    };
+  };
+  udrv->chip_options=options;
+  if(!baudbase)
+    baudbase=0x8CA00;
+  udrv->baud_base=baudbase;
+  if(!baud) baud=19200;
+  udrv->baud_val=baud;
+  u=(udrv->baud_base+baud/2)/baud;
+  if (u>0xFFFF) u=0xFFFF;
+  udrv->baud_div=u;
+  udrv->port=port;
+  udrv->irq=irq; 
+  udrv->fnc_recch=&u510_recch;
+  udrv->fnc_sndch=&u510_sndch;
+  udrv->fnc_wait=&u510_wait;
+  udrv->fnc_pool=&u510_pool;
+  udrv->fnc_connect=&u510_connect;
+  udrv->fnc_cctrl=&u510_cctrl;
+  UL_REL_IOS(port,8);
+  return 0;
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_c950pci.c b/ulan/host/ul_drv/ul_drv/ul_c950pci.c
new file mode 100644 (file)
index 0000000..0e07b97
--- /dev/null
@@ -0,0 +1,660 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_c950pci.c - chip driver for Oxford Semiconductor's 
+                  OX16950 based pCI acards
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Chip driver for OX16950-pci */
+
+#include "serial_reg.h"
+
+#define u950pci_inb(base,port)  ul_inb(base+port)
+#define u950pci_outb(base,port,val) ul_outb(base+port,val)
+
+#define U950PCI_MCR_IE 0x08    /* receive  0x09 for Advantech */
+#define U950PCI_MCR_OE 0x09    /* transmit 0x08 for Advantech */
+#define U950PCI_MCR_TXDTRPOL 0x01
+
+#define U950PCI_LCR_UL 0x03    /* receive/transmit */
+#define U950PCI_LCR_ULB        0x43    /* transmit line break */
+#define U950PCI_LCR_EFR        0xBF    /* enable access to EFR, XONx */
+
+#define U950PCI_LSR_C  0x04    /* controll character received */
+#define U950PCI_LSR_ERR        0x1A    /* error in receiver */
+
+#define U950PCI_NMR_EN 0x03    /* 9-bit communication settings */
+
+#define U950PCI_IIR_ID 0x3f    /* more IRQ levels */
+
+#define U950pci_MSR_RxD UART_MSR_RI /* Pin for RxD level sense */
+
+/* flags of chip options used in u950pci_init */
+/* unfortunate random DTR polarity over different vendors  !!! */
+#define U950PCI_CHOPT_TXDTRNEG 1       /* negated polarity (Advantech) */
+#define U950PCI_CHOPT_HSPDOSC  2       /* oscilator 14.7456MHz/1.8432MHz */
+#define U950PCI_CHOPT_RXDONRI  4       /* RxD signal connected to RI */
+
+#define U950PCI_ACR_VAL chip_buff[2] /* shaddow buffer of ACR */
+/* default ACR value : DTR=1 when Tx, 950 trigger levels enable  */
+#define U950PCI_ACR_UL (UART_ACR_TLENB)
+#define U950PCI_ACR_ULTX (U950PCI_ACR_UL|0x10|UART_ACR_RXDIS)/**/
+#define U950PCI_ACR_TXDTRPOL 0x08      /* ^- 0x18 for Advantech */
+
+#define U950PCI_STATE chip_buff[3] /* chip state information */
+#define U950PCI_STATE_TX    1
+#define U950PCI_STATE_FLUSH 2
+
+#define U950PCI_RX_ACRMCR chip_buff[4] /* set this for RX - LSB=ACR, MSB=MCR */
+  #define U950PCI_RX_ACR(udrv) ((uchar)udrv->U950PCI_RX_ACRMCR)
+  #define U950PCI_RX_MCR(udrv) ((uchar)(udrv->U950PCI_RX_ACRMCR>>8))
+#define U950PCI_TX_ACRMCR chip_buff[5] /* set this for TX - LSB=ACR, MSB=MCR */
+  #define U950PCI_TX_ACR(udrv) ((uchar)udrv->U950PCI_TX_ACRMCR)
+  #define U950PCI_TX_MCR(udrv) ((uchar)(udrv->U950PCI_TX_ACRMCR>>8))
+
+INLINE void u950pci_icr_write(ul_drv *udrv, int index, int val)
+{
+  u950pci_outb(udrv->port,UART_SCR,(uchar)index);
+  u950pci_outb(udrv->port,UART_ICR,(uchar)val);
+}
+
+unsigned u950pci_icr_read(ul_drv *udrv, int index)
+{
+  unsigned val;
+  u950pci_icr_write(udrv,UART_ACR,udrv->U950PCI_ACR_VAL|UART_ACR_ICRRD);
+  u950pci_outb(udrv->port,UART_SCR,(uchar)index);
+  val=u950pci_inb(udrv->port,UART_ICR);
+  u950pci_icr_write(udrv,UART_ACR,udrv->U950PCI_ACR_VAL);
+  return val;
+}
+
+unsigned u950pci_xfl_read(ul_drv *udrv, int reg)
+{
+  unsigned val;
+  u950pci_icr_write(udrv,UART_ACR,udrv->U950PCI_ACR_VAL|UART_ACR_ASREN);
+  val=u950pci_inb(udrv->port,reg);
+  /* no need to set ACR index - SCR not changed */
+  u950pci_outb(udrv->port,UART_ICR,(uchar)(udrv->U950PCI_ACR_VAL));
+  return val;
+}
+
+INLINE void u950pci_acr_write(ul_drv *udrv, int val)
+{
+  udrv->U950PCI_ACR_VAL=val;
+  u950pci_icr_write(udrv,UART_ACR,val); 
+}
+
+int u950pci_rxd_cs(ul_drv *udrv)
+{ /* returns 1 if active level detected */
+  
+  if(!(udrv->chip_options&U950PCI_CHOPT_RXDONRI))
+    return 0;
+  if(!(u950pci_inb(udrv->port,UART_MSR)&U950pci_MSR_RxD));
+    return 0;
+  LOG_CHIO(" CSCD");
+  return 1;
+}
+
+/*** Test interrupt request state ***/
+int u950pci_pool(ul_drv *udrv)
+{
+  unsigned u;
+  u=u950pci_inb(udrv->port,UART_IIR);
+  return (u&UART_IIR_NO_INT)?0:((u&U950PCI_IIR_ID)|1);
+};
+
+/*** Wait end of transmit ***/
+int u950pci_weot(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  if(lsr_val&UART_LSR_TEMT){
+    UL_FRET;
+    return UL_RC_PROC;
+  }
+  u950pci_icr_write(udrv,UART_TTL,0);  /* transmittion FIFO treshold */
+  u950pci_outb(udrv->port,UART_IER,UART_IER_THRI);
+  LOG_CHIO(".weot");
+  return UL_RC_WIRQ;
+};
+
+/* Help subroutine for switch from transmit to receive */
+int u950pci_recch_sub_tx2rx(ul_drv *udrv, int lsr_val)
+{
+  if(lsr_val&UART_LSR_TEMT){
+    udrv->U950PCI_STATE&=~(U950PCI_STATE_TX|U950PCI_STATE_FLUSH);
+    u950pci_outb(udrv->port,UART_FCR,UART_FCR_ENABLE_FIFO|
+                UART_FCR_CLEAR_RCVR); /**/
+    u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+    return UL_RC_PROC;
+  }
+  u950pci_icr_write(udrv,UART_TTL,0);  /* wait for TEMT */
+  u950pci_outb(udrv->port,UART_IER,UART_IER_THRI);
+  LOG_CHIO(".t2r");
+  return UL_RC_WIRQ;
+}
+
+/* Help subroutine for reading 9-bit character */
+int u950pci_recch_sub_rec9bit(ul_drv *udrv, int lsr_val)
+{
+  udrv->char_buff=u950pci_inb(udrv->port,UART_RX);
+  if(lsr_val&U950PCI_LSR_C){
+    udrv->last_ctrl=udrv->char_buff|=0x100; /* last char for ready/busy */
+  } else udrv->last_ctrl&=0x7f; /* somebody other has line */
+  udrv->xor_sum^=udrv->char_buff;udrv->xor_sum++;
+  if(lsr_val&U950PCI_LSR_ERR){
+    LOG_CHIO(" ER:%03X",udrv->char_buff);
+    return UL_RC_EFRAME; /* frame error */
+  }else{
+    LOG_CHIO(" R:%03X",udrv->char_buff);
+    return UL_RC_PROC;
+  }
+}
+
+/*** Receive character into char_buff ***/
+int u950pci_recch(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  uchar rfl_val;
+  udrv->char_buff=0;
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  LOG_CHIO(" lsr%02X",lsr_val);
+  if(udrv->U950PCI_STATE&
+     (U950PCI_STATE_TX|U950PCI_STATE_FLUSH)){
+    /* Manage all necessary for TX/RX switch */
+    return u950pci_recch_sub_tx2rx(udrv,lsr_val);
+  }
+  rfl_val=(uchar)u950pci_xfl_read(udrv,UART_RFL);
+  LOG_CHIO(" rfl%02X",rfl_val);
+  /*if(lsr_val&UART_LSR_DR){*/
+  if(rfl_val>0){
+    /* Construct and return 9-bit character */
+    UL_FRET;
+    return u950pci_recch_sub_rec9bit(udrv,lsr_val);
+  }
+  LOG_CHIO("-");
+  u950pci_outb(udrv->port,UART_IER,UART_IER_RDI|UART_IER_RLSI);
+  u950pci_icr_write(udrv,UART_RTL,6);  /* receive FIFO treshold */
+  return UL_RC_WIRQ;                   /**/
+}
+
+/*** Send character from char_buff ***/
+  int u950pci_sndch_1(ul_drv *udrv, int ret_code);
+
+int u950pci_sndch(ul_drv *udrv, int ret_code)
+{
+  unsigned u;
+  uchar lsr_val;
+  uchar tfl_val;
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  if(udrv->U950PCI_STATE&U950PCI_STATE_TX){
+    LOG_CHIO(" lsr%02X",lsr_val);
+    /*if(lsr_val&UART_LSR_THRE){*/
+    tfl_val=(uchar)u950pci_xfl_read(udrv,UART_TFL);
+    LOG_CHIO(" tfl%02X",tfl_val);
+    if(tfl_val<0x08){
+      u=udrv->char_buff;
+      udrv->xor_sum^=udrv->char_buff;udrv->xor_sum++;
+      if(u&0x100){
+       udrv->last_ctrl=u; /* store last control char */
+       u950pci_outb(udrv->port,UART_SCR,1);
+     } else u950pci_outb(udrv->port,UART_SCR,0);
+     u950pci_outb(udrv->port,UART_TX,(uchar)u);
+     UL_FRET;
+     LOG_CHIO(" T:%03X",u);
+     return UL_RC_PROC;
+   }
+   LOG_CHIO("-");
+   u950pci_outb(udrv->port,UART_IER,UART_IER_THRI);
+   return UL_RC_WIRQ;
+ }
+
+ /* flush timing dummy transmit chars and manage 1 char switch delay*/
+ u950pci_outb(udrv->port,UART_FCR,UART_FCR_ENABLE_FIFO|
+              UART_FCR_CLEAR_RCVR|UART_FCR_CLEAR_XMIT);
+ u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+ u950pci_icr_write(udrv,UART_TTL,0);   /* wait for TEMT */
+ u950pci_outb(udrv->port,UART_TX,0);
+ u950pci_outb(udrv->port,UART_IER,UART_IER_THRI);
+ UL_FNEXT(u950pci_sndch_1); 
+ LOG_CHIO(".r2t");
+ return UL_RC_WIRQ;
+}
+             
+int u950pci_sndch_1(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  if(~lsr_val&UART_LSR_TEMT) return UL_RC_WIRQ;
+
+  /* finally setup for transmit */
+  udrv->U950PCI_STATE|=U950PCI_STATE_TX;
+  u950pci_icr_write(udrv,UART_TTL,4);  /* min 4 bytes in Tx FIFO */
+  u950pci_acr_write(udrv,U950PCI_TX_ACR(udrv));
+  UL_FNEXT(u950pci_sndch); 
+  return UL_RC_PROC;
+}
+
+/*** Wait for time or received character ***/
+  int u950pci_wait_1(ul_drv *udrv, int ret_code);
+
+int u950pci_wait(ul_drv *udrv, int ret_code)
+{
+  int i;
+  uchar lsr_val;
+  uchar rfl_val;
+  udrv->char_buff=0;
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  if(udrv->U950PCI_STATE&
+     (U950PCI_STATE_TX|U950PCI_STATE_FLUSH)){
+    /* Manage all necessary for TX/RX switch */
+    return u950pci_recch_sub_tx2rx(udrv,lsr_val);
+  }
+  rfl_val=(uchar)u950pci_xfl_read(udrv,UART_RFL);
+  LOG_CHIO(" w1rfl%02X",rfl_val);
+  /*if(lsr_val&UART_LSR_DR){*/
+  if(rfl_val>0){
+    /* Construct and return 9-bit character */
+    UL_FRET;
+    return u950pci_recch_sub_rec9bit(udrv,lsr_val);
+  }
+  /* flush Tx FIFO */
+  u950pci_outb(udrv->port,UART_FCR,UART_FCR_ENABLE_FIFO|
+               UART_FCR_CLEAR_XMIT);
+  u950pci_icr_write(udrv,UART_RTL,1);  /* receive FIFO treshold */
+  u950pci_icr_write(udrv,UART_TTL,0);  /* wait TEMT */
+  for(i=udrv->wait_time;i--;){
+    u950pci_outb(udrv->port,UART_TX,0);                /* wait timed by dummy TX */
+  }
+  u950pci_outb(udrv->port,UART_IER,UART_IER_RDI|
+               UART_IER_RLSI|UART_IER_THRI);
+  UL_FNEXT(u950pci_wait_1);
+  LOG_CHIO("=");
+  return UL_RC_WIRQ;
+}
+
+int u950pci_wait_1(ul_drv *udrv, int ret_code)
+{
+  uchar lsr_val;
+  uchar rfl_val;
+  uchar tfl_val;
+  lsr_val=u950pci_inb(udrv->port,UART_LSR);
+  rfl_val=(uchar)u950pci_xfl_read(udrv,UART_RFL);
+  LOG_CHIO(" w2rfl%02X",rfl_val);
+  /*if(lsr_val&UART_LSR_DR){*/
+  if(rfl_val>0){
+    /* Construct and return 9-bit character */
+    UL_FRET;
+    return u950pci_recch_sub_rec9bit(udrv,lsr_val);
+  }
+  tfl_val=(uchar)u950pci_xfl_read(udrv,UART_TFL);
+  LOG_CHIO(" w3tfl%02X",tfl_val);
+  if(tfl_val>0)
+    return UL_RC_WIRQ;
+  u950pci_outb(udrv->port,UART_FCR,UART_FCR_ENABLE_FIFO|
+               UART_FCR_CLEAR_XMIT);
+  UL_FRET;
+  LOG_CHIO(" Timeout!");
+  return UL_RC_ETIMEOUT;
+};
+
+/*** Connect to RS485 bus ***/
+  int u950pci_connect_1(ul_drv *udrv, int ret_code);
+  int u950pci_connect_2(ul_drv *udrv, int ret_code);
+
+int u950pci_connect(ul_drv *udrv, int ret_code)
+{
+ unsigned u;
+ u=udrv->last_ctrl;
+ udrv->wait_time=((udrv->my_adr-u-1)&0xF)+4; 
+ if(((u&0x180)!=0x180)||
+    (u==0x1FF)) udrv->wait_time+=0x10;
+ udrv->last_ctrl=0;
+ udrv->char_buff=0;
+ udrv->chip_temp=(udrv->my_adr&0x3F)|0x40;
+ UL_FCALL2(*udrv->fnc_wait,u950pci_connect_1);
+ return UL_RC_PROC;
+};
+
+int u950pci_connect_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code!=UL_RC_ETIMEOUT)
+    { UL_FRET; return UL_RC_EARBIT;}
+  if(u950pci_rxd_cs(udrv)|| /* check for possible collision */
+     (u950pci_inb(udrv->port,UART_LSR)&UART_LSR_DR))
+  { UL_FRET;
+    LOG_CHIO(" EARBIT!");
+    return UL_RC_EARBIT;
+  }
+  udrv->U950PCI_STATE|=U950PCI_STATE_TX;
+  u950pci_acr_write(udrv,U950PCI_TX_ACR(udrv));
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_ULB);
+  u950pci_outb(udrv->port,UART_MCR,U950PCI_TX_MCR(udrv));
+  UL_FNEXT(u950pci_connect_2);
+  /* wait to end of transfer */
+  u950pci_icr_write(udrv,UART_TTL,0);  /* wait for TEMT */
+  u950pci_outb(udrv->port,UART_TX,0);
+  u950pci_outb(udrv->port,UART_IER,UART_IER_THRI|UART_IER_RDI);
+  return UL_RC_WIRQ;
+};
+
+int u950pci_connect_2(ul_drv *udrv, int ret_code)
+{
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_UL);
+  u950pci_outb(udrv->port,UART_MCR,U950PCI_RX_MCR(udrv));
+  udrv->U950PCI_STATE&=~U950PCI_STATE_TX;
+  u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+  if(u950pci_xfl_read(udrv,UART_RFL)>0)
+  { UL_FRET;
+    LOG_CHIO(" EARBIT1!");
+    return UL_RC_EARBIT;
+  }
+  if(udrv->chip_temp==1)
+  { LOG_CHIO(" Connected");
+    UL_FRET;
+  }else{ 
+    udrv->wait_time=(udrv->chip_temp&3)+1;
+    udrv->chip_temp>>=2;
+    UL_FCALL2(*udrv->fnc_wait,u950pci_connect_1);
+  }
+  return UL_RC_PROC;
+};
+
+/*
+ UL_FNEXT(u950pci_recch);
+ UL_FCALL(u950pci_recch);
+ UL_FCALL2(u950pci_recch,u950pci_recch);
+ UL_FRET;
+*/
+
+static char *u950pci_port_name="ulan_u950pci";
+
+/*** 16950pci initialize ports ***/
+int u950pci_pinit(ul_drv *udrv)
+{
+  unsigned u;
+  int baud=udrv->baud_val;
+  int cpr, tcr, dl;
+  if (UL_REQ_IOS(udrv->port,8,u950pci_port_name)<0) 
+  { LOG_FATAL(KERN_CRIT "uLan u950pci_pinit : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  }
+
+  /* Switch to enhanced mode */
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_EFR);
+  u950pci_outb(udrv->port,UART_EFR,UART_EFR_ECB);
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_UL);
+  /* Disable transmitter output  */
+  u950pci_outb(udrv->port,UART_MCR,U950PCI_RX_MCR(udrv)&3);
+  /* Set up ACR and state */
+  u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+  udrv->U950PCI_STATE=U950PCI_STATE_FLUSH;
+  #if 0
+  /* Read chip ID */
+  chip_id=u950pci_icr_read(udrv,UART_ID1)<<16;
+  chip_id|=u950pci_icr_read(udrv,UART_ID2)<<8;
+  chip_id|=u950pci_icr_read(udrv,UART_ID3);
+  chip_rev=u950pci_icr_read(udrv,UART_REV);
+  LOG_PORTS(KERN_INFO "uLan u950pci : chip ID %06X. rev %02x\n",chip_id,chip_rev);
+  #endif
+
+  udrv->chip_buff[0]=0;
+
+  /* setup baud rate */
+  if(!baud) baud=19200;
+  u=(udrv->baud_base*8+baud/2)/baud;
+  if (u>0xFFFFFFF) u=0xFFFFFFF;
+  udrv->baud_div=u;
+  /*{long e, tcr_err=0xFFFFFFF;
+    int i;
+    tcr=-1;
+    for(i=16;i>=4;i--){
+      if(i*0xFFFFFF<u) break;
+      e=u%i;
+      if(e<tcr_err){tcr=i;tcr_err=e;}
+    }
+  }*/
+  tcr=16; cpr=8;
+  dl=(udrv->baud_div+(cpr*tcr)/2)/(cpr*tcr);
+  /*LOG_PORTS*/
+  UL_PRINTF(KERN_INFO "uLan u950pci : baud setup TCR=%d CPR=%d DL=%d baud=%ld\n",
+            tcr,cpr,dl,udrv->baud_base*8/(tcr*cpr*dl));
+  UL_PRINTF(KERN_INFO "uLan u950pci : baud=%d baud_base=%ld baud_div=%d\n",
+            baud,udrv->baud_base,udrv->baud_div);
+  u950pci_icr_write(udrv,UART_CPR,cpr);        /* prescaller 1 to 31.875 step 0.125*/
+  u950pci_icr_write(udrv,UART_TCR,tcr);        /* 4 to 16 times per clock */
+  u950pci_outb(udrv->port,UART_LCR,UART_LCR_DLAB);
+  u950pci_outb(udrv->port,(uchar)UART_DLL,(uchar)dl);
+  u950pci_outb(udrv->port,(uchar)UART_DLM,(uchar)(dl>>8));
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_UL);
+
+  /* setup initial FIFO levels */
+  u950pci_icr_write(udrv,UART_NMR,U950PCI_NMR_EN); /* 9-bit mode enable */
+  u950pci_outb(udrv->port,UART_IER,0); /* disable interrupt sources */
+  u950pci_outb(udrv->port,UART_FCR,UART_FCR_ENABLE_FIFO|
+        UART_FCR_CLEAR_RCVR|UART_FCR_CLEAR_XMIT); /* enable and clear FIFOs */
+  u950pci_icr_write(udrv,UART_TTL,1);  /* transmittion FIFO treshold */
+  u950pci_icr_write(udrv,UART_RTL,1);  /* receive FIFO treshold */
+  u950pci_inb(udrv->port,UART_LSR);    /* reset errors */
+  u950pci_inb(udrv->port,UART_RX);     /* and other irq */
+  u950pci_outb(udrv->port,UART_MCR,U950PCI_RX_MCR(udrv)); /* Enable interrupts */
+  return UL_RC_PROC;
+};
+
+/*** 16950pci deinitialize ports ***/
+int u950pci_pdone(ul_drv *udrv)
+{
+  u950pci_outb(udrv->port,UART_IER, 0);        /* disable interrupts */
+  /* Switch enhanced mode off */
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_EFR);
+  u950pci_outb(udrv->port,UART_EFR,0);
+  u950pci_outb(udrv->port,UART_LCR,U950PCI_LCR_UL);
+  /* clean up */
+  u950pci_outb(udrv->port,UART_IER,0); /* disable interrupts */
+  u950pci_outb(udrv->port,UART_MCR,U950PCI_RX_MCR(udrv)&3); /* transmitter off */
+  u950pci_inb(udrv->port,UART_IIR);    /* flush irq */
+  u950pci_inb(udrv->port,UART_LSR);    /* flush irq */
+  UL_REL_IOS(udrv->port,8);
+  return UL_RC_PROC;
+};
+
+/*** 16950pci generate irq for irq_probe */
+int u950pci_genirq(ul_drv *udrv,int param)
+{
+  if(param){
+    u950pci_outb(udrv->port,UART_MCR, U950PCI_RX_MCR(udrv)); /* transmitter off */
+    u950pci_outb(udrv->port,UART_IER, UART_IER_MSI);   /* enable interrupts */
+    u950pci_outb(udrv->port,UART_LCR, U950PCI_LCR_ULB);        /* trig break */
+  }else{
+    u950pci_outb(udrv->port,UART_IER, 0);              /* disable interrupts */
+    u950pci_outb(udrv->port,UART_MCR, U950PCI_RX_MCR(udrv)&3); /* transmitter off */
+    u950pci_outb(udrv->port,UART_LCR, U950PCI_LCR_UL); /* no break */
+    u950pci_inb(udrv->port,UART_MSR);          /* flush irq */
+  }
+  return UL_RC_PROC;
+};
+
+#if 0
+/*** 16950pci request IRQ handling */
+int u950pci_rqirq(ul_drv *udrv,int param)
+{
+  return UL_RC_PROC;
+};
+
+/*** 16950pci release IRQ handling */
+int u950pci_freeirq(ul_drv *udrv,int param)
+{
+  if(uldrv->irq)
+    free_irq(udrv->irq, udrv);
+  return UL_RC_PROC;
+};
+#endif
+
+/* support for hardware tests */
+int u950pci_hwtest(ul_drv *udrv,int param)
+{
+  unsigned char uc;
+  switch(param)
+  {
+    case 0x10:
+    case 0x11:
+         u950pci_outb(udrv->port,UART_IER, 0); /* disable interrupts */
+         u950pci_outb(udrv->port,UART_MCR, U950PCI_TX_MCR(udrv)); /* transmitter on */
+         u950pci_outb(udrv->port,UART_LCR, param&1?
+                      U950PCI_LCR_UL:U950PCI_LCR_ULB); /* set TD lines */
+    case 0x12:
+         uc=u950pci_inb(udrv->port,UART_MSR);
+         return u950pci_inb(udrv->port,UART_LSR)|(uc<<8)|
+                (uc&(U950pci_MSR_RxD)?0:0x10000);
+
+    case 0x13:
+         u950pci_outb(udrv->port,UART_MCR, U950PCI_RX_MCR(udrv)); /* transmitter off */
+         uc=u950pci_inb(udrv->port,UART_MSR);
+         return u950pci_inb(udrv->port,UART_LSR)|(uc<<8)|
+                (uc&(U950pci_MSR_RxD)?0:0x10000);
+  }
+  return UL_RC_ENOFNC;
+};
+
+/*** Control functions of chip driver  ***/
+int u950pci_cctrl(ul_drv *udrv, int ctrl_fnc, int param)
+{
+  switch (ctrl_fnc)
+  {
+    case UL_CC_DIN:    /* switch off line transmitter */
+         u950pci_outb(udrv->port,UART_MCR, U950PCI_RX_MCR(udrv)); 
+         u950pci_outb(udrv->port,UART_LCR, U950PCI_LCR_UL);
+         u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+         return UL_RC_PROC;
+    case UL_CC_DOUT:   /* switch on line transmitter */
+         u950pci_outb(udrv->port,UART_MCR, U950PCI_TX_MCR(udrv));
+         u950pci_outb(udrv->port,UART_LCR, U950PCI_LCR_UL);
+         u950pci_acr_write(udrv,U950PCI_RX_ACR(udrv));
+         return UL_RC_PROC;
+    case UL_CC_PINIT:  /* initialize ports (parameter baud)*/
+         return u950pci_pinit(udrv);
+    case UL_CC_PDONE:  /* deinitialize ports */
+         return u950pci_pdone(udrv);
+    case UL_CC_GENIRQ: /* generate irq for irq_probe */
+         return u950pci_genirq(udrv,param);
+   #if 0
+    case UL_CC_RQIRQ:  /* request IRQ handling */
+         return u950pci_rqirq(udrv,param);
+    case UL_CC_FREEIRQ:        /* release IRQ handling */
+         return u950pci_freeirq(udrv,param);
+   #endif
+    case UL_CC_HWTEST: /* support for hardware testing */
+         return u950pci_hwtest(udrv,param);
+  };
+  return UL_RC_ENOFNC;
+};
+
+/*** 16950pci chip driver initialize ***/
+int u950pci_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options)
+{
+  unsigned u;
+  unsigned old_mcr, mcr_ie;
+  unsigned chip_id, chip_rev;
+  if(!irq||!port){
+    LOG_FATAL(KERN_CRIT "uLan u950pci_init : port or irq unknown\n");
+    return UL_RC_EPORT;
+  }
+  UL_PRINTF(KERN_INFO "uLan u950pci_init : irq %d port 0x%x\n",irq,port);
+
+  if (UL_REQ_IOS(port,8,u950pci_port_name)<0) 
+  { LOG_FATAL(KERN_CRIT "uLan u950pci_init : cannot reguest ports !\n");
+    return UL_RC_EPORT;
+  }
+
+  old_mcr=u950pci_inb(port,UART_MCR);
+  /* find right value for mcr_ie */
+  mcr_ie=U950PCI_MCR_IE;
+  if(options&U950PCI_CHOPT_TXDTRNEG)
+    mcr_ie^=U950PCI_MCR_TXDTRPOL;
+  /* Disable output buffer */
+  u950pci_outb(port,UART_MCR,mcr_ie&3);
+  /* Switch to enhanced mode */
+  u950pci_outb(port,UART_LCR,U950PCI_LCR_EFR);
+  u950pci_outb(port,UART_EFR,UART_EFR_ECB);
+  u950pci_outb(port,UART_LCR,U950PCI_LCR_UL);
+  /* Disable transmitter output  */
+  u950pci_outb(port,UART_MCR,mcr_ie&3);
+  /* Set up ACR and state */
+  u950pci_outb(port,UART_SCR,UART_ACR);
+  u950pci_outb(port,UART_ICR,U950PCI_ACR_UL|UART_ACR_ICRRD);
+  /* Read chip ID */
+  u950pci_outb(port,UART_SCR,UART_ID1);
+  chip_id=u950pci_inb(port,UART_ICR)<<16;
+  u950pci_outb(port,UART_SCR,UART_ID2);
+  chip_id|=u950pci_inb(port,UART_ICR)<<8;
+  u950pci_outb(port,UART_SCR,UART_ID3);
+  chip_id|=u950pci_inb(port,UART_ICR);
+  u950pci_outb(port,UART_SCR,UART_REV);
+  chip_rev=u950pci_inb(port,UART_ICR);
+  LOG_PORTS(KERN_INFO "uLan u950pci : chip ID %06X. rev %02x\n",chip_id,chip_rev);
+  /* Switch enhancements off */
+  u950pci_outb(port,UART_LCR,U950PCI_LCR_EFR);
+  u950pci_outb(port,UART_EFR,0);
+  u950pci_outb(port,UART_LCR,U950PCI_LCR_UL);
+
+  { LOG_PORTS(KERN_INFO "uLan u950pci_init : init OK\n");
+    udrv->chip_options=options;
+    udrv->baud_base=baudbase;
+    /* setup configurations for RX/TX */
+    udrv->U950PCI_RX_ACRMCR=U950PCI_ACR_UL|(U950PCI_MCR_IE<<8);
+    udrv->U950PCI_TX_ACRMCR=U950PCI_ACR_ULTX|(U950PCI_MCR_OE<<8);
+    if(udrv->chip_options&U950PCI_CHOPT_TXDTRNEG){
+      udrv->U950PCI_RX_ACRMCR^=U950PCI_MCR_TXDTRPOL<<8;
+      udrv->U950PCI_TX_ACRMCR^=U950PCI_ACR_TXDTRPOL|(U950PCI_MCR_TXDTRPOL<<8);
+    }
+    /* check and setup baud base oscilator frequency */
+    if(!udrv->baud_base){
+     if(udrv->chip_options&U950PCI_CHOPT_HSPDOSC)
+       udrv->baud_base=14745600;
+     else
+       udrv->baud_base=1843200;
+    }
+    if(!baud) baud=19200;
+    udrv->baud_val=baud;
+    u=(udrv->baud_base*8+baud/2)/baud;
+    if (u>0xFFFFFFF) u=0xFFFFFFF;
+    udrv->baud_div=u;
+    udrv->port=port;
+    udrv->irq=irq; 
+    udrv->fnc_recch=&u950pci_recch;
+    udrv->fnc_sndch=&u950pci_sndch;
+    udrv->fnc_wait=&u950pci_wait;
+    udrv->fnc_pool=&u950pci_pool;
+    udrv->fnc_connect=&u950pci_connect;
+    udrv->fnc_cctrl=&u950pci_cctrl;
+    UL_REL_IOS(port,8);
+    return 0;
+  }
+  LOG_PORTS(KERN_ERR "uLan u950pci_init : MCR test Error\n");
+  UL_REL_IOS(port,8);
+  return UL_RC_EPORT;
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_cps1.c b/ulan/host/ul_drv/ul_drv/ul_cps1.c
new file mode 100644 (file)
index 0000000..ebfc6c4
--- /dev/null
@@ -0,0 +1,729 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_cps1.c    - chip driver for USB2uLan device developed
+                  by Petr Smolik
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* usb2ulan device requests */
+
+#define U2U_PKT_BUF_SIZE       32     /* driver maximal supported packed size */
+#define U2U_MAX_MSG_INPR        4     /* maximal number of messages in progress */
+
+#define VENDOR_START_ULAN       0     /* Inform converter about uLan driver ready */
+#define VENDOR_STOP_ULAN        1     /* Inform about uLan driver stopping  */
+#define VENDOR_IS_RUNNING_ULAN  2
+#define VENDOR_ARC_ON_ULAN      3     /* Set promiscuous monitoring mode */
+#define VENDOR_ARC_OFF_ULAN     4     /* Return to std. adress recognition mode */
+
+#define U2UBFL_NORE     0x040         /* Do not try to repeat if error occurs */ 
+#define U2UBFL_TAIL     0x020         /* Message has tail frame */
+#define U2UBFL_REC      0x010         /* Request receiption of block */
+#define U2UBFL_FAIL     0x008         /* Message cannot be send - error */
+#define U2UBFL_PROC    0x004         /* Message succesfull send */
+#define U2UBFL_AAP     0x003         /* Request imediate proccessing of frame by receiver station with acknowledge */
+#define U2UBFL_PRQ     0x002         /* Request imediate proccessing of frame by receiver station */
+#define U2UBFL_ARQ     0x001         /* Request imediate acknowledge by receiving station */
+
+/* Definition of chip_buff usage */
+#define ul_usb_in_urb_st chip_buff[0] /* completion status of  ?_complete_in */
+#define ul_usb_max_pkt_size chip_buff[1] /* maximal USB packet size */
+#define ul_usb_max_msg_inpr chip_buff[2] /* maximal number of messages in progress */
+#define ul_usb_outpipe_nr   chip_buff[3] /* OUT pipe number */
+#define ul_usb_inpipe_nr    chip_buff[4] /* IN pipe number */
+
+
+#ifdef FOR_LINUX_KERNEL
+#if (LINUX_VERSION_CODE <= VERSION(2,4,10))
+  #define usb_fill_bulk_urb FILL_BULK_URB
+#endif
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,0))
+  #define kc_usb_alloc_urb(urb, gfp) usb_alloc_urb(urb) 
+  #define kc_usb_submit_urb(urb, gfp) usb_submit_urb(urb) 
+#else
+  #define kc_usb_alloc_urb usb_alloc_urb
+  #define kc_usb_submit_urb usb_submit_urb
+#endif
+#endif /*FOR_LINUX_KERNEL*/
+
+
+#ifdef _WIN32
+int ul_usb_msg_inpr=0; /* number of concurrent messages sent over USB */
+#else
+extern int ul_usb_msg_inpr;    /* number of concurrent messages sent over USB */
+#endif /* _WIN32 */
+
+
+/* Support for multiple submitted messages */
+
+typedef struct ul_usb_tx_fifo_slot{
+  ul_mem_blk    *msg;
+  unsigned char ustamp;
+}ul_usb_tx_fifo_slot;
+
+typedef struct ul_usb_tx_fifo{
+  ul_usb_tx_fifo_slot slot[U2U_MAX_MSG_INPR];
+  int size;
+  int used;
+  int idxin;
+  int idxout;
+}ul_usb_tx_fifo;
+
+static int ul_usb_tx_fifo_empty(const ul_usb_tx_fifo *fifo)
+{
+  return fifo->slot[fifo->idxout].msg==NULL;
+}
+
+static int ul_usb_tx_fifo_full(const ul_usb_tx_fifo *fifo)
+{
+  return fifo->slot[fifo->idxin].msg!=NULL;
+}
+
+static int ul_usb_tx_fifo_incidx(const ul_usb_tx_fifo *fifo, int idx)
+{
+  if(++idx>=fifo->size) idx=0;
+  return idx;
+}
+
+static void ul_usb_tx_fifo_print(const ul_usb_tx_fifo *fifo)
+{
+  int i;
+  LOG_MESSAGES("ul_usb: tx_fifo: idxin=%d idxout=%d [",
+            fifo->idxin,fifo->idxout);
+  for(i=0;i<fifo->size;i++){
+    if(i) LOG_MESSAGES(",");
+    if(!fifo->slot[i].msg){
+      LOG_MESSAGES("Empty");
+    }else{
+      LOG_MESSAGES("%d",fifo->slot[i].ustamp);
+    }
+  }
+  LOG_MESSAGES("]\n");
+}
+
+/*** Input completion for Petr Smolik's USB2uLan converter ***/
+#ifdef FOR_LINUX_KERNEL
+#if (LINUX_VERSION_CODE >= VERSION(2,6,0))
+  void ul_usb_ps1_complete_in(struct urb *urb,struct pt_regs *regs)
+#else
+  void ul_usb_ps1_complete_in(struct urb *urb)
+#endif
+#else /*FOR_LINUX_KERNEL*/
+  NTSTATUS ul_usb_ps1_complete_in( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+#endif /*FOR_LINUX_KERNEL*/
+{
+  ul_drv *udrv;
+  int st;
+  
+  #ifdef FOR_LINUX_KERNEL
+    udrv=urb->context;
+  #else /*FOR_LINUX_KERNEL*/
+    udrv=(ul_drv*)Context;
+  #endif /*FOR_LINUX_KERNEL*/
+  if(udrv->magic!=UL_DRV_MAGIC){
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_complete_in: Wrong uLan MAGIC number!!!\n");
+    #ifdef _WIN32
+      return STATUS_INVALID_PARAMETER;
+    #else /* _WIN32 */
+      return;
+    #endif /* _WIN32 */
+  }
+  #ifdef FOR_LINUX_KERNEL
+  if(urb->status<0) 
+    st=16-urb->status;
+   else st=2;
+  #else
+    st=2;
+  #endif
+
+  LOG_IRQ(KERN_CRIT "ul_usb_ps1_complete_in\n");
+  UL_MB();
+  udrv->ul_usb_in_urb_st=st;
+  uld_kwt_wake(udrv);
+  
+  #ifdef _WIN32
+      return STATUS_SUCCESS;
+  #endif /* _WIN32 */
+}
+
+
+/*** Send one frame to USB2uLan converter ***/
+int ul_usb_ps1_send_frame(ul_drv *udrv, ul_mem_blk *frame,
+                           unsigned char ustamp)
+{
+  unsigned char buf[U2U_PKT_BUF_SIZE];
+  int i, len, ret;
+  ul_data_it di;
+  struct usb_device *dev=(struct usb_device *)udrv->dev;
+    int max_pkt=udrv->ul_usb_max_pkt_size;
+
+  buf[0]=UL_BLK_HEAD(frame).dadr;
+  buf[1]=UL_BLK_HEAD(frame).sadr;
+  buf[2]=UL_BLK_HEAD(frame).cmd;
+  i=UL_BLK_HEAD(frame).flg; buf[3]=0;
+  if(i&UL_BFL_ARQ) buf[3]|=U2UBFL_ARQ;
+  if(i&UL_BFL_PRQ) buf[3]|=U2UBFL_PRQ;
+  if(i&UL_BFL_NORE) buf[3]|=U2UBFL_NORE;
+  if(i&UL_BFL_TAIL) buf[3]|=U2UBFL_TAIL;
+  if(i&UL_BFL_REC) buf[3]|=U2UBFL_REC;
+  buf[4]=ustamp;
+  buf[5]=0;
+  len=UL_BLK_HEAD(frame).len;
+  if(i&UL_BFL_REC){    /* Placeholder message for receive does not */
+    len=0;             /* need data, but should check UL_BFL_LNMM !!! */
+  }
+  buf[6]=(unsigned char)len; buf[7]=(unsigned char)(len/0x100);
+
+  LOG_IRQ(KERN_CRIT "ul_usb : sending head URB (d:%d,s:%d,c:%X,f:%X,l:%d) stmp %d\n",
+               buf[0],buf[1],buf[2],buf[3],
+               buf[6]+0x100*buf[7],buf[4]);
+
+  ret=usb_bulk_msg(dev, usb_sndbulkpipe(dev, udrv->ul_usb_outpipe_nr), buf, 8, &i, ULD_HZ);
+  if(ret<0) {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_send_frame: usb_bulk_write head error %d returned\n",ret);
+    return ret;
+  }
+
+  ul_di_init(&di,frame);
+  while(len>0) {
+    i=len<max_pkt?len:max_pkt; len-=i;
+    ul_di_read(&di, buf, i);
+    ret=usb_bulk_msg(dev, usb_sndbulkpipe(dev, udrv->ul_usb_outpipe_nr), buf, i, &i, ULD_HZ);
+    if(ret<0) {
+      LOG_FATAL(KERN_CRIT "ul_usb_ps1_send_frame: usb_bulk_write data error %d returned\n",ret);
+      return ret;
+    }
+  }
+  return di.pos;
+}
+
+/*** Receive data of one frame from USB2uLan converter ***/
+int ul_usb_ps1_receive_data(ul_drv *udrv, ul_mem_blk *frame, int len)
+{
+  unsigned char buf[U2U_PKT_BUF_SIZE];
+  int i, ret;
+  ul_data_it di;
+  struct usb_device *dev=(struct usb_device *)udrv->dev;
+  int max_pkt=udrv->ul_usb_max_pkt_size;
+  
+  ul_di_init(&di,frame);
+  while(len>0) {
+    i=len<max_pkt?len:max_pkt; len-=i;
+    ret=usb_bulk_msg(dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr), buf, i, &i, ULD_HZ);
+    if(ret<0) {
+      LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: usb_bulk_read data error %d returned\n",ret);
+      return ret;
+      break;
+    } else {
+      if(i!=ul_di_write(&di, buf, i)){
+        #ifdef FOR_LINUX_KERNEL
+         return -EIO;
+        #else
+          return -1;
+        #endif /* FOR_LINUX_KERNEL */
+      }
+    }
+  }
+  return di.pos;
+}
+
+
+/*** Worker thread for Petr Smolik's USB2uLan converter ***/
+int ul_usb_ps1_thread(void *ptr)
+{
+  ul_drv *udrv=(ul_drv *)ptr;
+  struct usb_device *dev;
+  int ret;
+  int i, len;
+  int fatal_err=0;
+  volatile unsigned char in_buf[8];
+  unsigned char ustamp=0;
+  ul_mem_blk *tx_mes=NULL;
+  ul_mem_blk *rx_mes=NULL;
+  ul_mem_blk *frame;
+  ul_mem_blk *tail_frame=NULL;
+  long tx_sta_time;
+  ul_usb_tx_fifo tx_fifo;
+  #ifdef FOR_LINUX_KERNEL
+    struct urb *in_urb;
+  #else
+    PURB in_urb=NULL;
+    PIRP in_irp=NULL;
+  #endif /* FOR_LINUX_KERNEL */
+  volatile unsigned in_urb_st;
+
+  if(udrv->magic!=UL_DRV_MAGIC)
+  {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: Wrong uLan MAGIC number!!!\n");
+    uld_kwt_set_stopped(udrv);
+    return -ENODEV;
+  }
+  dev=(struct usb_device *)udrv->dev;
+  if(udrv->ul_usb_max_pkt_size>U2U_PKT_BUF_SIZE)
+    udrv->ul_usb_max_pkt_size=U2U_PKT_BUF_SIZE;
+
+  if(udrv->ul_usb_max_msg_inpr>U2U_MAX_MSG_INPR)
+    udrv->ul_usb_max_msg_inpr=U2U_MAX_MSG_INPR;
+  memset(&tx_fifo,0,sizeof(tx_fifo));
+  tx_fifo.size=udrv->ul_usb_max_msg_inpr;
+
+#ifdef FOR_LINUX_KERNEL
+#if (LINUX_VERSION_CODE >= VERSION(2,6,0))
+  daemonize("kulusbps1d");
+  /*allow_signal(SIGKILL);*/
+#else /* <2.6.0 */
+  lock_kernel();
+  daemonize();
+
+ #if (LINUX_VERSION_CODE >= VERSION(2,4,10))
+  exit_files(current);
+  current->files = init_task.files;
+  atomic_inc(&current->files->count);
+  daemonize();
+  reparent_to_init();
+ #endif /* >=2.4.10 */
+
+  /* avoid getting signals */
+  spin_lock_irq(&current->sigmask_lock);
+  flush_signals(current);
+  sigfillset(&current->blocked);
+  recalc_sigpending(current);
+  spin_unlock_irq(&current->sigmask_lock);
+
+  set_fs(KERNEL_DS);
+  strcpy(current->comm, "kulusbps1d");
+  unlock_kernel();
+#endif /* <2.6.0 */
+#endif /*FOR_LINUX_KERNEL*/
+
+ #ifdef FOR_LINUX_KERNEL
+  if((in_urb=kc_usb_alloc_urb(0, GFP_KERNEL))) {
+    /* URB allocated OK */
+  }else{
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: KWT cannot alloc in_urb\n");
+    fatal_err=1;
+  }
+ #else
+  in_urb = MALLOC(sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+  if ( !in_urb) {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: KWT cannot alloc in_urb\n");
+    fatal_err=1;
+  }
+ #endif /* FOR_LINUX_KERNEL */
+
+  usb_clear_halt(dev, usb_sndbulkpipe(dev, udrv->ul_usb_outpipe_nr));
+  usb_clear_halt(dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr));
+  udrv->ul_usb_in_urb_st=0;
+
+  while(!uld_atomic_test_dfl(udrv,KWTKILL) && !fatal_err){
+    uld_kwt_confirm(udrv);
+    
+    while(!ul_usb_tx_fifo_full(&tx_fifo)){ /* when free Tx slot */
+
+      /* Initiate sending of message from the prep_bll queue */
+      if(!(tx_mes=udrv->con_message=udrv->prep_bll.first)) break;
+
+      /* printudrvbll(udrv); */
+      ul_bll_move_mes(&udrv->work_bll,tx_mes);
+      LOG_MESSAGES(KERN_INFO "ul_usb: KWT processing message\n");
+      
+      if(!++ustamp) ustamp=1;
+
+      /* send frames of message */
+      for(frame=tx_mes;frame;frame=UL_BLK_HEAD(frame).next){
+       ret=ul_usb_ps1_send_frame(udrv, frame, ustamp);
+       if(ret<0) {
+          usb_clear_halt(dev, usb_sndbulkpipe(dev, udrv->ul_usb_outpipe_nr));
+          UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+          ul_bll_move_mes(&udrv->proc_bll,tx_mes);
+          SCHEDULE_BH(udrv);
+          /* ulan_do_bh(udrv); */
+         tx_mes=udrv->con_message=NULL;
+          break;
+       }
+       /* Message has no more frames */
+       if(!(UL_BLK_HEAD(frame).flg&UL_BFL_TAIL)||
+          (UL_BLK_HEAD(frame).next==NULL)){
+         tx_fifo.slot[tx_fifo.idxin].ustamp=ustamp;
+         tx_fifo.slot[tx_fifo.idxin].msg=tx_mes;
+          tx_fifo.idxin=ul_usb_tx_fifo_incidx(&tx_fifo,tx_fifo.idxin);
+          #ifdef FOR_LINUX_KERNEL
+            tx_sta_time=jiffies;
+          #endif /* FOR_LINUX_KERNEL */
+          ul_usb_tx_fifo_print(&tx_fifo);
+       }
+      }
+    }
+    
+    UL_MB();
+    in_urb_st=*(volatile unsigned *)&(udrv->ul_usb_in_urb_st);
+    UL_MB();
+    if(in_urb_st==2) {
+      UL_MB();
+      LOG_IRQ(KERN_CRIT "ul_usb : received head URB (d:%d,s:%d,c:%X,f:%X,l:%d) stmp %d\n",
+                   in_buf[0],in_buf[1],in_buf[2],in_buf[3],
+                   in_buf[6]+0x100*in_buf[7],in_buf[4]);
+      if(in_buf[3]&(U2UBFL_PROC|U2UBFL_FAIL)){
+        tx_mes=NULL;
+        ul_usb_tx_fifo_print(&tx_fifo);
+        if(!ul_usb_tx_fifo_empty(&tx_fifo)){
+          if(in_buf[4]==tx_fifo.slot[tx_fifo.idxout].ustamp){
+           tx_mes=tx_fifo.slot[tx_fifo.idxout].msg;
+         }else{
+            i=ul_usb_tx_fifo_incidx(&tx_fifo,tx_fifo.idxout);
+           while((i!=tx_fifo.idxout)&&(tx_fifo.slot[i].msg!=NULL)){
+             if(in_buf[4]==tx_fifo.slot[i].ustamp){
+               do{
+                  tx_mes=tx_fifo.slot[tx_fifo.idxout].msg;
+                 UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+                  ul_bll_move_mes(&udrv->proc_bll,tx_mes);
+                 tx_fifo.slot[tx_fifo.idxout].msg=NULL;
+                 tx_fifo.idxout=ul_usb_tx_fifo_incidx(&tx_fifo,tx_fifo.idxout);
+                }while(tx_fifo.idxout!=i);
+                SCHEDULE_BH(udrv);
+               tx_mes=tx_fifo.slot[tx_fifo.idxout].msg;
+              }
+              i=ul_usb_tx_fifo_incidx(&tx_fifo,i);
+            }
+           if(!tx_mes){
+              LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: incorrect ustamp of returned message\n");
+           }else{
+              LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: some lost ustamp messages\n");
+           }
+          }
+       }else{
+         LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: tx_mes for returned message\n");
+       }
+
+       if(!tx_mes){
+          usb_clear_halt(dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr));
+       }else{
+         if(tail_frame&&(UL_BLK_HEAD(tx_mes).flg&UL_BFL_TAIL)){
+           frame=tail_frame;
+           LOG_MESSAGES("ul_usb_ps1_thread: tail receiption\n");
+         }else{
+           frame=tx_mes;
+         }
+
+          if(in_buf[3]&U2UBFL_FAIL){
+           UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+         }else if(in_buf[3]&U2UBFL_REC) {
+           if(!(UL_BLK_HEAD(frame).flg&UL_BFL_REC)){
+             UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+              LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: tail rec mitchmatch\n");
+           }else{
+             len=in_buf[6]+in_buf[7]*0x100;
+             UL_BLK_HEAD(frame).dadr=in_buf[0];
+             UL_BLK_HEAD(frame).sadr=in_buf[1];
+             UL_BLK_HEAD(frame).cmd=in_buf[2];
+             UL_BLK_HEAD(frame).len=len;
+              ret=ul_usb_ps1_receive_data(udrv, frame, len);
+             if(ret<0) {
+               UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+               LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: tail receive problem\n");
+             }
+           }
+         }
+           
+         if((in_buf[3]&U2UBFL_TAIL)&&(UL_BLK_HEAD(frame).flg&UL_BFL_TAIL)
+             &&!(UL_BLK_HEAD(tx_mes).flg&UL_BFL_FAIL)){
+           tail_frame=UL_BLK_HEAD(frame).next;
+           LOG_MESSAGES("ul_usb_ps1_thread: preparing for tail receive\n");
+          }else{
+           if(UL_BLK_HEAD(tx_mes).flg&UL_BFL_M2IN || UL_BLK_HEAD(tx_mes).flg&UL_BFL_FAIL ||
+            UL_BLK_HEAD(tx_mes).dadr==udrv->my_adr || !UL_BLK_HEAD(tx_mes).dadr){
+              ul_bll_move_mes(&udrv->proc_bll,tx_mes);
+              SCHEDULE_BH(udrv);
+              /* ulan_do_bh(udrv); */
+           }else{
+              ul_bll_free_mes(tx_mes);
+           }
+           tx_mes=NULL;
+           tail_frame=NULL;
+           tx_fifo.slot[tx_fifo.idxout].msg=NULL;
+           tx_fifo.idxout=ul_usb_tx_fifo_incidx(&tx_fifo,tx_fifo.idxout);
+           ul_usb_tx_fifo_print(&tx_fifo);
+         }
+       }
+      } else {
+       LOG_MESSAGES("uLan : begin of receive message\n");
+       i=0;
+        /* if(in_buf[3]&U2UBFL_TAIL ) i|=UL_BFL_TAIL; */
+        /* if(in_buf[3]&U2UBFL_REC) i|=UL_BFL_REC; */
+        rx_mes=ul_new_frame_head(udrv,in_buf[0]/*dadr*/,in_buf[1]/*sadr*/, 
+                                in_buf[2]/*cmd*/, i/*flg*/);
+       if(rx_mes==NULL){ 
+         LOG_FAILS(KERN_ERR "uLan : NO memory for receive\n");
+          usb_clear_halt(dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr));
+       }else{
+         ul_bll_ins(&udrv->work_bll,rx_mes);
+         len=in_buf[6]+in_buf[7]*0x100;
+
+          ret=ul_usb_ps1_receive_data(udrv, rx_mes, len);
+
+         if(ret<0) {
+            LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: message receive problem\n");
+            ul_bll_free_mes(rx_mes);
+         }else{
+           UL_BLK_HEAD(rx_mes).len=len;
+            UL_BLK_HEAD(rx_mes).stamp=ul_gen_stamp();
+            ul_bll_move_mes(&udrv->proc_bll,rx_mes);
+         }
+
+          rx_mes=NULL;
+          SCHEDULE_BH(udrv);
+          /* ulan_do_bh(udrv); */
+          /* printudrvbll(udrv); */
+       }
+      }
+    }
+    
+    if(in_urb_st!=1)
+    {
+      #ifdef FOR_LINUX_KERNEL
+        ret=16-udrv->ul_usb_in_urb_st;
+        if((ret==-ENODEV)||(ret==-EILSEQ)||(ret==-EPROTO)){
+          LOG_FATAL(KERN_INFO "ul_usb: usb2ulan device problem detected\n");
+          fatal_err=1;
+          continue;
+        }
+      #endif /* FOR_LINUX_KERNEL */
+      *(volatile unsigned *)&(udrv->ul_usb_in_urb_st)=1;
+      UL_MB();
+      if(uld_atomic_test_dfl(udrv,KWTKILL)) break;
+      LOG_IRQ(KERN_INFO "ul_usb: submitting URB\n");
+      #ifdef FOR_LINUX_KERNEL
+        usb_fill_bulk_urb (in_urb, dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr),
+            (void*)in_buf, 8, ul_usb_ps1_complete_in, udrv);
+        ret=kc_usb_submit_urb(in_urb, GFP_KERNEL);
+        if (ret==-EPIPE) {
+          usb_clear_halt(dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr));
+          ret=kc_usb_submit_urb(in_urb, GFP_KERNEL);
+        }  
+        if(ret<0) {
+          LOG_FATAL(KERN_INFO "ul_usb: KWT usb_submit_urb fatal error %d\n",ret);
+          fatal_err=1;
+        }
+      #else
+        _usb_fill_bulk_urb (in_urb, dev, usb_rcvbulkpipe(dev, udrv->ul_usb_inpipe_nr),
+          (void*)in_buf, 8);
+        ret=_usb_submit_urb(dev,in_urb, NULL,ul_usb_ps1_complete_in,udrv,&in_irp);
+        if ( !NT_SUCCESS(ret)) {
+          LOG_FATAL(KERN_INFO "ul_usb: KWT usb_submit_urb fatal error %d\n",ret);
+          fatal_err=1;
+        }      
+      #endif /* FOR_LINUX_KERNEL */
+
+    } else {
+      LOG_IRQ(KERN_INFO "ul_usb: KWT sleeping\n");
+      uld_kwt_wait(udrv);
+      LOG_IRQ(KERN_INFO "ul_usb: KWT wakeup\n");
+    }
+  }
+  ul_usb_tx_fifo_print(&tx_fifo);
+  while(!ul_usb_tx_fifo_empty(&tx_fifo)){
+//    ul_bll_free_mes(tx_fifo.slot[tx_fifo.idxout].msg);
+    tx_mes=tx_fifo.slot[tx_fifo.idxout].msg;
+    UL_BLK_HEAD(tx_mes).flg|=UL_BFL_FAIL;
+    ul_bll_move_mes(&udrv->proc_bll,tx_mes);
+    tx_fifo.slot[tx_fifo.idxout].msg=NULL;
+    tx_fifo.idxout=ul_usb_tx_fifo_incidx(&tx_fifo,tx_fifo.idxout);
+  }
+  
+  if(in_urb) {
+    #ifdef FOR_LINUX_KERNEL
+     #if (LINUX_VERSION_CODE >= VERSION(2,6,9))
+      usb_kill_urb(in_urb);
+     #else
+      usb_unlink_urb(in_urb);
+     #endif
+      usb_free_urb(in_urb);
+    #else
+      if (in_irp) 
+        IoCancelIrp( in_irp);
+      FREE( in_urb);
+    #endif /* FOR_LINUX_KERNEL */  
+  }
+  
+  #ifdef FOR_LINUX_KERNEL
+    lock_kernel();
+  #endif /* FOR_LINUX_KERNEL */
+
+  LOG_IRQ(KERN_INFO "ul_usb: KWT finished\n");
+  uld_kwt_set_stopped(udrv);
+
+  #ifdef FOR_LINUX_KERNEL
+    unlock_kernel();
+  #else
+    PsTerminateSystemThread( STATUS_SUCCESS);
+  #endif /* FOR_LINUX_KERNEL */
+  return 0;
+}
+
+/*** Wake up worker thread  ***/
+int ul_usb_ps1_stroke(ul_drv *udrv)
+{
+  uld_kwt_wake(udrv);
+  return 0;
+}
+
+/*** ps1 initialize ports ***/
+int ul_usb_ps1_pinit(ul_drv *udrv)
+{
+  struct usb_device *dev;
+  unsigned char u2u_ret[2];
+  int ret;
+  dev=(struct usb_device *)udrv->dev;
+  /* Set converter parameters */
+  LOG_IRQ("ul_usb_ps1_pinit: baudrate:%d\n",udrv->baud_val);
+  ret=usb_control_msg(dev, usb_rcvctrlpipe(dev,0), 
+              VENDOR_START_ULAN, USB_TYPE_VENDOR,
+              /*value*/ (short)udrv->baud_val, /*index*/ (short)udrv->my_adr, u2u_ret, 1, 2*ULD_HZ);
+  if(ret<0) {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: KWT usb_control_msg error %d returned\n",ret);
+    return UL_RC_EUSB;
+  }
+  if(!u2u_ret[0]) {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: not supported baudrate (%d)\n",udrv->baud_val);
+    return UL_RC_EBAUD;
+  }
+  return UL_RC_PROC;
+};
+
+/*** ps1 deinitialize ports ***/
+int ul_usb_ps1_pdone(ul_drv *udrv)
+{
+  struct usb_device *dev;
+  int ret;
+  dev=(struct usb_device *)udrv->dev;
+  /* Set converter parameters */
+  LOG_IRQ("ul_usb_ps1_pdone:\n");
+  ret=usb_control_msg(dev, usb_rcvctrlpipe(dev,0),
+                      VENDOR_STOP_ULAN, USB_TYPE_VENDOR,
+                      /*value*/ 0, /*index*/ 0, NULL, 0, ULD_HZ);
+  if(ret<0) {
+    LOG_FATAL(KERN_CRIT "ul_usb_ps1_thread: KWT usb_control_msg error %d returned\n",ret);
+    return UL_RC_EUSB;
+  }
+  return UL_RC_PROC;
+}
+
+/*** Control functions of chip driver  ***/
+int ul_usb_ps1_cctrl(ul_drv *udrv, int ctrl_fnc, int param)
+{
+  switch (ctrl_fnc)
+  {
+   case UL_CC_PINIT:   /* initialize ports (parameter baud)*/
+       { return ul_usb_ps1_pinit(udrv);
+       };
+   case UL_CC_PDONE:   /* deinitialize ports */
+       { return ul_usb_ps1_pdone(udrv);
+       };
+   case UL_CC_RQIRQ:   /* request IRQ handling - kernel worker thread*/
+        { 
+        if(uld_kwt_test_and_set_prepared(udrv)) { 
+          LOG_IRQ("ul_usb_ps1_cctrl: KWT already running\n");
+          return 0;
+        };
+       uld_atomic_clear_dfl(udrv,KWTKILL);
+
+        #ifdef FOR_LINUX_KERNEL
+        if(kernel_thread(ul_usb_ps1_thread, udrv,
+             #if (LINUX_VERSION_CODE < VERSION(2,5,41))
+              CLONE_FS | CLONE_FILES | CLONE_SIGNAL
+             #else /* 2.5.41 */
+              CLONE_KERNEL
+             #endif /* 2.5.41 */
+            )<0){
+             LOG_FATAL(KERN_CRIT "ul_usb_ps1_cctrl: Cannot fork KWT thread!!!\n");
+             /*uld_atomic_clear_dfl(udrv,KWTRUN);*/
+             uld_kwt_set_stopped(udrv);
+             return UL_RC_EKWT;
+          }
+        #endif /*FOR_LINUX_KERNEL*/
+        #ifdef _WIN32
+        {
+          NTSTATUS ntStatus;
+          ntStatus = PsCreateSystemThread( &udrv->kwt, 
+                         THREAD_ALL_ACCESS, NULL, NULL, NULL, ul_usb_ps1_thread, udrv);
+          if (!NT_SUCCESS(ntStatus)) { 
+           LOG_FATAL(KERN_CRIT "ul_usb_ps1_cctrl: Cannot fork KWT thread!!!\n");
+
+           /*uld_atomic_clear_dfl(udrv,KWTRUN);*/
+           uld_kwt_set_stopped(udrv);
+           return UL_RC_EKWT;
+          }
+        }
+        #endif /* _WIN32 */
+        LOG_IRQ("ul_usb_ps1_cctrl: KWT forked\n");
+        return 0;
+        };
+   case UL_CC_FREEIRQ: /* release IRQ handling - kernel worker thread*/
+       { 
+        if(!uld_kwt_is_running(udrv)) { 
+          LOG_IRQ("ul_usb_ps1_cctrl: KWT already stopped\n");
+          return 0;
+       };
+       uld_kwt_kill(udrv);
+       uld_kwt_wait_stopped(udrv);
+       LOG_IRQ("ul_usb_ps1_cctrl: KWT stopped\n");
+       return 0;
+       };
+  };
+  return UL_RC_ENOFNC;
+};
+
+/*** Petr Smolik's USB2ULAN version 1 initialize ***/
+int ul_usb_ps1_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options)
+{
+  udrv->chip_options=options;
+  if(!baud) baud=19200;
+  udrv->baud_val=baud;
+  if(!baudbase)
+    baudbase=57600;
+  udrv->baud_base=baudbase;
+  udrv->baud_div=(udrv->baud_base+baud/2)/baud;
+  udrv->port=port;
+  udrv->irq=0; 
+  udrv->fnc_recch=NULL;
+  udrv->fnc_sndch=NULL;
+  udrv->fnc_wait=NULL;
+  udrv->fnc_pool=NULL;
+  udrv->fnc_connect=NULL;
+  udrv->fnc_cctrl=&ul_usb_ps1_cctrl;
+  udrv->fnc_stroke=&ul_usb_ps1_stroke;
+  udrv->ul_usb_max_pkt_size=8; /* <= U2U_PKT_BUF_SIZE */
+  udrv->ul_usb_max_msg_inpr=ul_usb_msg_inpr;
+  if(!udrv->ul_usb_max_msg_inpr)
+    udrv->ul_usb_max_msg_inpr=1; /* <= U2U_MAX_MSG_INPR */
+  udrv->ul_usb_outpipe_nr=1;     /* OUT pipe number */
+  udrv->ul_usb_inpipe_nr=1;      /* IN pipe number */
+
+  return 0;
+};
+
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_debug.c b/ulan/host/ul_drv/ul_drv/ul_debug.c
new file mode 100644 (file)
index 0000000..99f6dee
--- /dev/null
@@ -0,0 +1,121 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_debug.c   - common debugging routines
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+void printblk(ul_mem_blk *blk)
+{
+  ul_mem_blk *prev_blk=NULL;
+  while(blk)
+  {
+    if(prev_blk) if(UL_BLK_HEAD(blk).prev!=prev_blk)
+       UL_PRINTF(KERN_CRIT "Inconsistency in BLL list !!!\n");
+
+    UL_PRINTF("BLK : dadr=%02X sadr=%02X cmd=%02X flg=%04X retry=%02X len=%04X\n",
+     UL_BLK_HEAD(blk).dadr,
+     UL_BLK_HEAD(blk).sadr,
+     UL_BLK_HEAD(blk).cmd,
+     UL_BLK_HEAD(blk).flg,
+     UL_BLK_HEAD(blk).retry_cnt,
+     UL_BLK_HEAD(blk).len
+    );
+    {
+      ul_data_it di;
+      uchar ch;
+      int cnt=128;
+      UL_PRINTF("      |");
+      ul_di_init(&di,blk);
+      di.trans_len=UL_BLK_HEAD(blk).len;
+      while((di.pos<di.trans_len)&& --cnt)
+      {
+       ch=ul_di_read1(&di);
+       if(ch>=0x20&&ch<0x7F) UL_PRINTF("%c",ch);
+       else UL_PRINTF("<%X>",ch);
+      };
+      if(!cnt) UL_PRINTF("<...>...");
+      UL_PRINTF("|\n");
+    };
+    prev_blk=blk;
+    blk=UL_BLK_HEAD(blk).next;
+  };
+};
+
+void printudrvbll(ul_drv *udrv)
+{
+  UL_PRINTF("\nprep_bll : frames = %d\n",udrv->prep_bll.cnt);
+  printblk(udrv->prep_bll.first);
+
+  UL_PRINTF("\nwork_bll : frames = %d\n",udrv->work_bll.cnt);
+  printblk(udrv->work_bll.first);
+
+  UL_PRINTF("\nproc_bll : frames = %d\n",udrv->proc_bll.cnt);
+  printblk(udrv->proc_bll.first);
+  UL_PRINTF("\nopan_bll : frames = %d\n",udrv->opan_bll.cnt);
+  printblk(udrv->opan_bll.first);
+  UL_PRINTF("\nfree_blk = %d",udrv->free_blk_cnt);
+  UL_PRINTF("\n");
+ #ifdef ENABLE_UL_MEM_CHECK
+  UL_PRINTF("MEM_CHECK: malloc-free=%d\n",
+                (int)atomic_read(&ul_mem_check_counter));
+ #endif /* ENABLE_UL_MEM_CHECK */
+};
+
+void printudrvoperators(ul_drv *udrv)
+{
+  UL_DRV_LOCK_FINI
+  ul_opdata *opdata;
+  ul_opchain *opmember,**opchain;
+  int reccnt,filtcnt,opcnt;
+  UL_PRINTF("\nul_drv operators (open handles)\n");
+  UL_DRV_LOCK;
+  opcnt=0;
+  for(opdata=udrv->operators;opdata;opdata=opdata->opnext)
+  { opchain=&opdata->recchain;reccnt=0;
+    if((opmember=*opchain)!=NULL)do{
+      reccnt++; if(reccnt>1000) break;
+    }while((opmember=opmember->next)!=*opchain);
+    opchain=&opdata->filtchain;filtcnt=0;
+    if((opmember=*opchain)!=NULL)do{
+      filtcnt++; if(filtcnt>1000) break;
+    }while((opmember=opmember->next)!=*opchain);
+    UL_PRINTF("  operator %d, in recchain %d, in filtchain %d\n",
+                   opcnt,reccnt,filtcnt);
+    opcnt++;if(opcnt>100) break;
+  }
+  UL_DRV_UNLOCK;
+}
+
+void printudrvfncstack(ul_drv *udrv)
+{
+  ul_call_fnc **p;
+  UL_PRINTF("ul_drv: fnc_act:%08lx fnc_stack:",(long)udrv->fnc_act);
+  p=udrv->fnc_sp;
+  while(p!=&udrv->fnc_stack[0]){
+    p--;
+    UL_PRINTF("%08lx ",(long)*p);
+  };
+  UL_PRINTF("\n");
+}
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_devtab.c b/ulan/host/ul_drv/ul_drv/ul_devtab.c
new file mode 100644 (file)
index 0000000..4533145
--- /dev/null
@@ -0,0 +1,103 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_devtab.c  - Linux and Windows PnP PCI and USB device tables
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Supported devices table */ 
+
+static ul_chip_type_ent ul_chip_types[]={
+    #ifdef UL_WITH_UART_510
+       {"82510",u510_init,UL_CHIPT_RQPORT,1,0},
+    #endif /*UL_WITH_UART_450*/
+    #ifdef UL_WITH_UART_450
+       {"16450",u450_init,UL_CHIPT_RQPORT,1,0},
+     #ifdef CONFIG_OC_UL_DRV_U450_VARPINS
+       {"16450-dirneg",u450_init,UL_CHIPT_RQPORT,1,U450_CHOPT_DIRNEG},
+       {"16450-msrswap",u450_init,UL_CHIPT_RQPORT,1,U450_CHOPT_MSRSWAP},
+     #endif /*CONFIG_OC_UL_DRV_U450_VARPINS*/
+    #endif /*UL_WITH_UART_450*/
+    #ifdef UL_WITH_PCI
+       {"16950-adv",u950pci_init,UL_CHIPT_PCI|UL_CHIPT_NOPROBE,4,
+               0x16954000|U950PCI_CHOPT_TXDTRNEG|U950PCI_CHOPT_HSPDOSC},
+       {"16950-pci",u950pci_init,UL_CHIPT_PCI|UL_CHIPT_NOPROBE,4,
+               0x16954000|U950PCI_CHOPT_RXDONRI},
+    #endif  /* UL_WITH_PCI */
+       {NULL,NULL},
+};
+
+#ifdef UL_WITH_PCI
+
+static struct pci_device_id ulan_pci_tbl[] /*__devinitdata*/ = {
+       /* Advantech PCI-1602A, negated DTR */
+       { /* PCI_VENDOR_ID */ 0x13fe, /* PCI_DEVICE_ID */ 0x1600,
+         /* PCI_VENDOR_ID */ PCI_ANY_ID, /* PCI_SUBDEVICE_ID */ PCI_ANY_ID,
+         0, 0, 0x16954000|U950PCI_CHOPT_TXDTRNEG|U950PCI_CHOPT_HSPDOSC},
+       /* Tedia PCI-1482 */
+       { /* PCI_VENDOR_ID */ 0x1415, /* PCI_DEVICE_ID */ 0x950A,
+         /* PCI_VENDOR_ID */ PCI_ANY_ID, /* PCI_SUBDEVICE_ID */ PCI_ANY_ID,
+         0, 0, 0x16954000|U950PCI_CHOPT_RXDONRI},
+       /* Tedia PCI-1482 with PiKRON signature */
+       { /* PCI_VENDOR_ID */ 0x1760, /* PCI_DEVICE_ID */ 0x8004,
+         /* PCI_VENDOR_ID */ PCI_ANY_ID, /* PCI_SUBDEVICE_ID */ PCI_ANY_ID,
+         0, 0, 0x16954000|U950PCI_CHOPT_RXDONRI},
+       { 0, } /* terminate list */
+};
+
+#endif /*UL_WITH_PCI*/
+
+
+#ifdef UL_WITH_USB
+
+/* Define these values to match your device */
+#define UL_USB_PS1_VENDOR_ID   0xDEAD
+#define UL_USB_PS1_PRODUCT_ID  0x1001
+#define UL_USB_HW_PS1          (0x1234<<8)  
+
+#ifndef USB_VENDOR_PIKRON
+#define USB_VENDOR_PIKRON      0x1669
+#endif
+
+#ifdef FOR_LINUX_KERNEL
+/* table of devices that work with this driver */
+static struct usb_device_id ulan_usb_tbl [] = {
+       { USB_DEVICE(UL_USB_PS1_VENDOR_ID, UL_USB_PS1_PRODUCT_ID), driver_info:UL_USB_HW_PS1 },
+       { USB_DEVICE(USB_VENDOR_PIKRON, UL_USB_PS1_PRODUCT_ID), driver_info:UL_USB_HW_PS1 },
+       { USB_DEVICE(USB_VENDOR_PIKRON, 0x1002), driver_info:UL_USB_HW_PS1 },
+       { USB_DEVICE(USB_VENDOR_PIKRON, 0x1003), driver_info:UL_USB_HW_PS1 },
+       { }                                     /* Terminating entry */
+};
+#else
+static struct usb_device_id ulan_usb_tbl [] = {
+       { UL_USB_PS1_VENDOR_ID, UL_USB_PS1_PRODUCT_ID, UL_USB_HW_PS1 },
+       { USB_VENDOR_PIKRON, UL_USB_PS1_PRODUCT_ID, UL_USB_HW_PS1 },
+       { USB_VENDOR_PIKRON, 0x1002, UL_USB_HW_PS1 },
+       { USB_VENDOR_PIKRON, 0x1003, UL_USB_HW_PS1 },
+       { 0, }                                  /* Terminating entry */ 
+};
+#endif /* FOR_LINUX_KERNEL */
+
+#endif /* UL_WITH_USB */
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_di.c b/ulan/host/ul_drv/ul_drv/ul_di.c
new file mode 100644 (file)
index 0000000..ba86c88
--- /dev/null
@@ -0,0 +1,181 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_di.c      - message data iterators routines
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Data iterator */
+
+long ul_di_seek(ul_data_it *di,long pos, int whence)
+{
+  switch(whence)
+  {
+    case 1: pos+=di->pos; break;
+    case 2: pos+=UL_BLK_HEAD(di->head_blk).len; break;
+  };
+  if(pos<di->pos)
+  {
+    di->blk=di->head_blk;
+    di->pos=0;
+    di->ptr=UL_BLK_HEAD(di->head_blk).fdata;
+    if(pos<0) return 0;
+  };
+  di->ptr+=pos-di->pos;
+  di->pos=pos;
+  return pos;
+};
+
+uchar ul_di_read1(ul_data_it *di)
+{
+  uchar ch;
+  if(ul_di_adjust(di))
+    ch=*ul_di_byte(di);
+  else ch=0;
+  ul_di_inc(di);
+  return ch;
+};
+
+uchar ul_di_write1(ul_data_it *di, uchar ch)
+{
+  ul_mem_blk *blk;
+  while(!ul_di_adjust(di))
+  {
+    if(!(blk=ul_alloc_blk(UL_BLK_HEAD(di->head_blk).bll->udrv))) return 0;
+    di->blk->next=blk;
+  };
+  *ul_di_byte(di)=ch;
+  ul_di_inc(di);
+  return 1;
+};
+
+int ul_di_read(ul_data_it *di, char *buf, int count)
+{
+  int cn;
+  int len;
+
+  cn=count;
+  while(cn>0)
+  {
+    if(!ul_di_adjust(di))
+    {
+      memset(buf,0,cn);
+      cn=0;
+      break;
+    };
+    len=ul_di_atonce(di);
+    if(len>cn) len=cn;
+    memcpy(buf,ul_di_byte(di),len);
+    ul_di_add(di,len);
+    buf+=len;
+    cn-=len;
+  };
+  return count-cn;
+}
+
+int ul_di_write(ul_data_it *di, const char *buf, int count)
+{
+  int cn;
+  int len;
+  ul_mem_blk *blk;
+
+  cn=count;
+  while(cn>0)
+  {
+    while(!ul_di_adjust(di))
+    {
+      if(!(blk=ul_alloc_blk(UL_BLK_HEAD(di->head_blk).bll->udrv))) 
+       {count-=cn; break;};
+      memset(UL_BLK_NDATA(blk),0,UL_BLK_SIZE);
+      di->blk->next=blk;
+    };
+    len=ul_di_atonce(di);
+    if(len>cn) len=cn;
+    memcpy(ul_di_byte(di),buf,len);
+    ul_di_add(di,len);
+    buf+=len;
+    cn-=len;
+  };
+  return count;
+}
+
+#ifdef UL_WITH_FRAME_FSM
+
+/*-- Helper functions for snddata --*/
+int uld_snddata_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(udrv->con_di.trans_len--)
+  {
+    udrv->char_buff=ul_di_read1(&udrv->con_di);
+    UL_FCALL(*udrv->fnc_sndch);
+  } else UL_FRET;
+  return UL_RC_PROC;
+};
+
+/*** Send data ***/
+int uld_snddata(ul_drv *udrv, int ret_code)
+{
+  ul_di_init(&udrv->con_di,udrv->con_frame);
+  udrv->con_di.trans_len=UL_BLK_HEAD(udrv->con_frame).len;
+  if(!udrv->con_di.trans_len) 
+    {UL_FRET; return UL_RC_PROC;};
+  UL_FNEXT(uld_snddata_1);
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for recdata --*/
+int uld_recdata_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(!(udrv->char_buff&0xFF00))
+  {
+    ret_code=ul_di_write1(&udrv->con_di,(uchar)udrv->char_buff);
+    if(!ret_code) return UL_RC_ENOMEM;
+    if(--udrv->con_di.trans_len)
+    {
+      UL_FCALL(*udrv->fnc_recch);
+      return UL_RC_PROC;
+    };
+  };
+  if(!(UL_BLK_HEAD(udrv->con_frame).flg&UL_BFL_LNMM))
+    UL_BLK_HEAD(udrv->con_frame).len=udrv->con_di.pos;
+  UL_FRET;
+  return UL_RC_PROC;
+};
+
+/*** Receive data ***/
+int uld_recdata(ul_drv *udrv, int ret_code)
+{
+  ul_di_init(&udrv->con_di,udrv->con_frame);
+  if(UL_BLK_HEAD(udrv->con_frame).flg&UL_BFL_LNMM)
+    udrv->con_di.trans_len=UL_BLK_HEAD(udrv->con_frame).len;
+  else
+    udrv->con_di.trans_len=-1;
+  if(!udrv->con_di.trans_len) {UL_FRET; return UL_RC_PROC;};
+  UL_FCALL2(*udrv->fnc_recch,uld_recdata_1);
+  return UL_RC_PROC;
+};
+
+#endif /*UL_WITH_FRAME_FSM*/
diff --git a/ulan/host/ul_drv/ul_drv/ul_djgpp.c b/ulan/host/ul_drv/ul_drv/ul_djgpp.c
new file mode 100644 (file)
index 0000000..9b64b47
--- /dev/null
@@ -0,0 +1,192 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_djgpp.c   - DOS DJGPP specific routines
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#include <go32.h>
+
+#ifdef ENABLE_UL_MEM_CHECK
+void * ul_mem_check_malloc(size_t size)
+{ void *ptr;
+  ptr=malloc(size);
+  if(ptr){
+    ul_mem_check_counter++;
+    _go32_dpmi_lock_data(ptr,size);
+  }
+  return ptr;
+}
+
+void ul_mem_check_free(void *ptr)
+{
+  if(!ptr) {
+    LOG_FATAL(KERN_CRIT "ul_mem_check_free : triing to free NULL ptr\n");
+  }else{
+    ul_mem_check_counter--;
+    free(ptr);
+  }
+}
+#endif /* ENABLE_UL_MEM_CHECK */
+
+static _go32_dpmi_seginfo wrapper;
+static __dpmi_paddr old_handler, new_handler;
+uchar pic1_old, pic2_old, pic_mask;
+int pm_irq;
+
+void *uld_djgpp_dev_id=NULL;
+
+int uld_djgpp_irq_mask_set(int irqline, int enable)
+{
+  unsigned long irq_flags;
+  unsigned mask;
+  if(irqline>=16) return -1;
+  __save_flags(irq_flags);__cli();
+  if(irqline<8){
+    mask=inportb(0x21);
+    mask=enable?mask&~(1<<irqline):mask|(1<<irqline);
+    outportb(0x21,mask);                /* Change IRQ mask */
+  }else{
+    outportb(0x21,inportb(0x21)&0xFB);  /* Enable IRQ2 */
+    mask=inportb(0xA1);
+    mask=enable?mask&~(1<<(irqline-8)):mask|(1<<(irqline-8));
+    outportb(0xA1,mask);                /* Change IRQ mask */
+  }
+  __restore_flags(irq_flags);
+  return 0;
+}
+
+void uld_djgpp_irq_eoi(int irqline)
+{
+  if(irqline<8){
+    outportb(0x20,0x20|0x40|irqline);
+  }else{
+    outportb(0xA0,0x20|0x40|(irqline&7));
+    outportb(0x20,0x20|0x40|0x2);
+  }
+}
+
+
+/* !!!!!!!!!!!! */
+void uld_djgpp_call_irq(void)
+{
+  return;
+  if(ul_drv_arr[0])
+    uld_irq_handler(0, ul_drv_arr[0], NULL);
+}
+
+void uld_djgpp_proc_irq(void)
+{
+  if(uld_djgpp_dev_id){
+    uld_irq_handler(0, uld_djgpp_dev_id, NULL);
+    uld_djgpp_irq_eoi(((ul_drv*)uld_djgpp_dev_id)->irq);
+  }else{
+    outportb(0xA0,0x20);
+    outportb(0x20,0x20);
+  }
+}
+
+int request_irq(int irq,void *handler,int flags,char *name,void *dev_id)
+{
+ #if 1
+  /* !!!!!!!!!!!! */
+  handler=uld_djgpp_proc_irq;
+  uld_djgpp_dev_id=dev_id;
+
+  pic1_old=inportb(0x21);
+  pic2_old=inportb(0xA1);
+
+  if(irq<8) {
+    pm_irq=irq+0x08;
+  } else {
+    pm_irq=irq+0x68;
+  }
+  uld_djgpp_irq_mask_set(irq,0);
+
+  wrapper.pm_offset=(int)handler;
+  wrapper.pm_selector=_my_cs();
+  _go32_dpmi_allocate_iret_wrapper(&wrapper);
+  new_handler.offset32=wrapper.pm_offset;
+  new_handler.selector=wrapper.pm_selector;
+  __dpmi_get_protected_mode_interrupt_vector(pm_irq,&old_handler);
+  if(__dpmi_set_protected_mode_interrupt_vector(pm_irq,&new_handler)<0)
+  { LOG_FATAL("uLan request_irq: DPMI set interrupt failed\n");
+    return -1;
+  };
+  uld_djgpp_irq_mask_set(irq,1);
+
+ #endif
+  return irq;
+}
+
+int free_irq(int irq,void *ctx)
+{
+  uld_djgpp_irq_mask_set(irq,0);
+  __dpmi_set_protected_mode_interrupt_vector(irq,&old_handler);
+
+  outportb(0x21,pic1_old);
+  outportb(0xA1,pic2_old);
+  _go32_dpmi_free_iret_wrapper(&wrapper);
+  return 0;
+}
+
+
+#include <crt0.h>
+int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY;
+int uld_djgpp_data_end;
+void uld_djgpp_code_end(void) {;};
+
+void uld_djgpp_do_atexit(void)
+{ int i;
+  for(i=0;i<UL_MINORS;i++)
+  {
+    if(ul_drv_arr[i])
+    {
+      ul_drv_free(ul_drv_arr[i]);
+      ul_drv_arr[i]=NULL;
+    }
+  }
+  UL_PRINTF("ulan_driver : atexit finished driver\n");
+  #ifdef ENABLE_UL_MEM_CHECK
+    UL_PRINTF("              mem_check_counter = %ld\n",ul_mem_check_counter);
+  #endif /* ENABLE_UL_MEM_CHECK */
+  uld_printk_flush();
+}
+
+void uld_djgpp_do_atinit(void) __attribute__((constructor));
+
+void uld_djgpp_do_atinit(void)
+{
+  if(!uld_debug_flg) uld_debug_flg=ULD_DEBUG_DEFAULT;
+  if((_go32_dpmi_lock_code(&uld_djgpp_code_beg,(char*)&uld_djgpp_code_end-(char*)&uld_djgpp_code_beg))||
+     (_go32_dpmi_lock_data(&uld_djgpp_data_beg,(char*)&uld_djgpp_data_end-(char*)&uld_djgpp_data_beg)))
+  {
+    UL_PRINTF("ulan_driver : Cannot lock code and data in memory !\n");
+  }
+  atexit(uld_djgpp_do_atexit);
+  uld_check_timeout();
+
+  UL_PRINTF("ulan_driver : atinit finished\n");
+  uld_printk_flush();
+}
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.c b/ulan/host/ul_drv/ul_drv/ul_drv.c
new file mode 100644 (file)
index 0000000..181a901
--- /dev/null
@@ -0,0 +1,343 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_drv.c     - uLan driver main source file
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+  #include "ul_drv_config.h"
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+#define UL_WITH_UART_450
+#define UL_WITH_UART_510
+#ifdef CONFIG_OC_UL_DRV_USLIB
+  #define  UL_DRV_IN_LIB
+  #include <stdio.h>
+  #include <unistd.h>
+  #include <time.h>
+  #include <errno.h>
+  #include <asm/io.h>
+  #include <asm/bitops.h>
+  #include <asm/atomic.h>
+  #include <sys/perm.h>
+  /*#include <sys/io.h>*/
+  #include <string.h>
+  #include "emu_irq.h"
+#elif defined(_WIN32)
+  #ifdef FOR_WIN_KMD
+    #ifndef FOR_WIN_KMD
+      #define FOR_WIN_KMD
+    #endif
+    #define UL_WITH_PCI
+    #include "ntddk.h"
+  #else
+    #ifndef FOR_WIN_WDM
+      #define FOR_WIN_WDM
+    #endif
+    #pragma warning(disable:4242)
+    #define DBG 1
+    #define DBG_USB 0
+    #define ULD_DEBUG_DEFAULT (0x01|0x08|0x10|0x40|0x80)
+    #define UL_WITH_PCI
+    #define UL_WITH_USB
+    #include "wdm.h"
+    //#include "ntddk.h"       /*KeReadStateEvent is missing in WDM*/
+    //NTKERNELAPI LONG KeReadStateEvent (IN PRKEVENT Event);
+
+    #include "ul_wdinc.h"
+    #ifdef UL_WITH_USB
+      #include "usbdi.h"
+      #include "usbdlib.h"
+      #include "ul_wdusb.h"
+    #endif
+    #define UL_WITH_WIN_PWR
+  #endif
+#elif defined(__DJGPP__)
+  int uld_djgpp_data_beg;
+  void uld_djgpp_code_beg(void) {;};
+  #include <unistd.h>
+  #include <errno.h>
+  #include <stdio.h>
+  #include <time.h>
+  #include <string.h>
+#elif defined(CONFIG_OC_UL_DRV_SYSLESS)
+  #include <unistd.h>
+  #include <errno.h>
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <string.h>
+  #include <sys/time.h>
+  #include <time.h>
+  #include <cpu_def.h>
+  #undef UL_WITH_UART_510
+  #define UL_WITH_IAC
+#else
+  #include <linux/version.h>
+  #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17))
+    #include <linux/config.h>
+  #endif
+  #include <linux/module.h>
+  #include <linux/errno.h>
+  #include <linux/kernel.h>
+  #include <linux/sched.h>
+  #include <linux/ioport.h>
+  #include <linux/sys.h>
+  #include <linux/fs.h>
+  #include <linux/interrupt.h>
+  #include <linux/poll.h>
+  #include <linux/delay.h>
+  #include <asm/bitops.h>
+  #include <asm/segment.h>
+  #include <asm/system.h>
+  #include <asm/io.h>
+  #include <asm/irq.h>
+
+  #ifdef __KERNEL__
+    #ifndef KERNEL
+      #define KERNEL
+    #endif
+  #endif
+
+  #include "k_compat.h"
+
+  #if (LINUX_VERSION_CODE < VERSION(2,5,50))
+    #include <linux/modversions.h>
+  #endif /* 2.5.50 */
+
+  #if (LINUX_VERSION_CODE < VERSION(2,4,10))
+    #include <linux/malloc.h>
+  #else
+    #include <linux/slab.h>
+  #endif /* 2.4.10 */
+
+  #if (LINUX_VERSION_CODE < VERSION(2,3,20))
+    #include <asm/spinlock.h>
+  #else
+    #include <linux/spinlock.h>
+  #endif
+
+  #if (LINUX_VERSION_CODE >= VERSION(2,4,0))
+    #if (LINUX_VERSION_CODE <= VERSION(2,6,17))
+      #define UL_WITH_DEVFS
+    #endif /*2.6.17*/
+    #define UL_WITH_PCI
+    #define UL_WITH_USB
+    #include <linux/miscdevice.h>
+    #include <linux/init.h>
+  #endif 
+
+  #if (LINUX_VERSION_CODE < VERSION(2,5,40))
+    #include <linux/tqueue.h>
+  #else /* 2.5.40 */
+    #ifdef UL_WITH_DEVFS
+      #include <linux/devfs_fs_kernel.h>
+    #endif /*UL_WITH_DEVFS*/
+  #endif /* 2.5.40 */
+
+  #ifdef UL_WITH_PCI
+    #include <linux/pci.h>
+  #endif
+
+  #ifdef UL_WITH_USB
+    #include <linux/usb.h>
+    #include <linux/smp_lock.h>
+  #endif
+
+#endif
+
+#if defined(UL_WITH_UART_450) || defined(UL_WITH_UART_510)
+  #define UL_WITH_UARTS
+#endif
+
+#if defined(UL_WITH_UARTS) || defined(UL_WITH_PCI)
+  #define UL_WITH_FRAME_FSM
+  #define ENABLE_UL_IRQ_STALE_WDG
+#endif /*defined(UL_WITH_UARTS) || defined(UL_WITH_PCI)*/
+
+#define ULD_DEFAULT_BUFFER_SIZE 0x8000
+
+#include "ul_drv.h"
+#include "ul_hdep.h"
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+  /* for check prototypes */
+  #include "ul_drv_init.h"  
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+#ifndef UL_DRV_IN_LIB
+unsigned uld_debug_flg=ULD_DEBUG_DEFAULT;
+#else
+unsigned uld_debug_flg; /* Left application  set defaults */
+#endif
+int ulbuffer=ULD_DEFAULT_BUFFER_SIZE;  /* default communication buffer size */
+
+#ifdef UL_IRQ_LOCK_GINI
+ UL_IRQ_LOCK_GINI      /* Inicialize global uLan spinlock */
+#endif
+
+#ifdef UL_GLOBAL_IRQ_LOCK_GINI
+ UL_GLOBAL_IRQ_LOCK_GINI /* Initialize global IRQ lock,
+                           very bad if needed */
+#endif
+
+#ifdef ENABLE_UL_MEM_CHECK
+atomic_t ul_mem_check_counter=ATOMIC_INIT(0);
+#endif /* ENABLE_UL_MEM_CHECK */
+
+int uld_null_fnc(ul_drv *udrv, int ret_code)
+{
+  return 0;
+}
+
+#ifndef UL_WITH_FRAME_FSM
+  /* empty watchdog timer function */
+  #ifdef _WIN32
+  VOID  ulan_wd_dpc(IN PKDPC Dpc,IN PVOID data,
+                    IN PVOID arg1,IN PVOID arg2) {;}
+  #else /* _WIN32 */
+   void ulan_do_wd_timer(unsigned long data) {;}
+  #endif /* _WIN32 */
+#endif /*UL_WITH_FRAME_FSM*/
+
+/* Data iterator */
+#include "ul_di.c"
+
+/* uLan memory management and bidirection linked lists */
+#include "ul_mem.c"
+
+#ifdef UL_WITH_UART_450
+  /* Chip driver for 16450 */
+  #include "ul_c450.c"
+#endif /*UL_WITH_UART_450*/
+
+#ifdef UL_WITH_UART_510
+  /* Chip driver for 82510 */
+  #include "ul_c510.c"
+#endif /*UL_WITH_UART_510*/
+
+#ifdef UL_WITH_PCI
+  #include "ul_c950pci.c"
+#endif
+
+#ifdef UL_WITH_USB
+  /* Petr Smolik 1 */ 
+  #include "ul_cps1.c"
+#endif /*UL_WITH_USB*/
+
+#ifdef UL_WITH_FRAME_FSM
+  /* Frame begin/end */
+  #include "ul_frame.c"
+#endif /*UL_WITH_FRAME_FSM*/
+
+#ifdef UL_WITH_IAC
+  #include "ul_iac.c"
+#endif /*UL_WITH_IAC*/
+
+#ifdef UL_WITH_FRAME_FSM
+  /* uLan main driver automata loop */
+  #include "ul_ufsm.c"
+#endif /*UL_WITH_FRAME_FSM*/
+
+/* Supported devices table */ 
+#include "ul_devtab.c"
+
+/* initialize and free of one driver */ 
+#include "ul_tors.c"
+
+#undef UL_INT_TST
+
+#ifdef UL_INT_TST
+  /* Some internal test routines */
+  #include "ul_tst.c"
+#endif /* UL_INT_TST */
+
+#include "ul_debug.c"
+
+#include "ul_base.c"
+
+/*******************************************************************/
+/* Linux kernel and module specific part */ 
+
+#ifdef FOR_LINUX_KERNEL
+  #include "ul_linux.c"
+  
+  #ifdef UL_WITH_PCI
+    /* Linux kernel PCI device support */ 
+    #include "ul_linpci.c"
+  #endif /*UL_WITH_PCI*/
+  
+  #ifdef UL_WITH_USB
+    /* Linux kernel PCI device support */ 
+    #include "ul_linusb.c"
+  #endif /*UL_WITH_USB*/
+  
+#endif /* FOR_LINUX_KERNEL */
+
+#ifdef UL_DRV_IN_LIB
+  /* Interface for driver in library */
+  #include "ul_inlib.c"
+#endif /* UL_DRV_IN_LIB */
+
+#ifdef __DJGPP__
+  /* Interface for driver in library for DJGPP environment */
+  #include "ul_djgpp.c"
+#endif /* __DJGPP__ */
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+  /* Interface for driver in library for SYSLESS environment */
+  #include "ul_sysless.c"
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+/*******************************************************************/
+/* NT Kernel Mode Driver specific code */ 
+
+#ifdef _WIN32
+
+#include "ul_wdbase.h"
+
+#include "ul_wdbase.c"
+
+#ifndef FOR_WIN_WDM
+  #include "ul_kdmnt.c"
+#endif /* !FOR_WIN_WDM */
+
+
+#ifdef FOR_WIN_WDM
+
+#ifdef UL_WITH_USB
+  #include "ul_wdusb.c"
+#endif /*UL_WITH_USB*/
+
+#include "ul_wdent.c"
+
+#include "ul_wdpnp.c"
+
+#ifdef UL_WITH_WIN_PWR
+  #include "ul_wdpwr.c"
+#endif /* UL_WITH_WIN_PWR */
+
+#endif /* FOR_WIN_WDM */
+
+
+#endif /* _WIN32 */
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.dsp b/ulan/host/ul_drv/ul_drv/ul_drv.dsp
new file mode 100644 (file)
index 0000000..7595e69
--- /dev/null
@@ -0,0 +1,141 @@
+# Microsoft Developer Studio Project File - Name="ul_drv" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) External Target" 0x0106\r
+\r
+CFG=ul_drv - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_drv.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_drv.mak" CFG="ul_drv - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "ul_drv - Win32 Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE "ul_drv - Win32 Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+\r
+!IF  "$(CFG)" == "ul_drv - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Cmd_Line "NMAKE /f ul_drv.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "ul_drv.exe"\r
+# PROP BASE Bsc_Name "ul_drv.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Cmd_Line "nmake /f "ul_drv.mak""\r
+# PROP Rebuild_Opt "/a"\r
+# PROP Target_File "ul_drv.sys"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF  "$(CFG)" == "ul_drv - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "NMAKE /f ul_drv.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "ul_drv.exe"\r
+# PROP BASE Bsc_Name "ul_drv.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "nmake /f "ul_drv.mak""\r
+# PROP Rebuild_Opt "/a"\r
+# PROP Target_File "ul_drv.sys"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "ul_drv - Win32 Release"\r
+# Name "ul_drv - Win32 Debug"\r
+\r
+!IF  "$(CFG)" == "ul_drv - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "ul_drv - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_16950pci.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdent.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdpnp.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\serial_reg.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_82510.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_hdep.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# Begin Group "Additional Files"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.err\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.mak\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.dsw b/ulan/host/ul_drv/ul_drv/ul_drv.dsw
new file mode 100644 (file)
index 0000000..d20bcbb
--- /dev/null
@@ -0,0 +1,41 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "ul_drv"=".\ul_drv.dsp" - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "ul_wdm"=".\ul_wdm.dsp" - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.h b/ulan/host/ul_drv/ul_drv/ul_drv.h
new file mode 100644 (file)
index 0000000..f3b4fd0
--- /dev/null
@@ -0,0 +1,367 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_drv.h     - driver definitions and types
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifndef _LINUX_UL_DRV_H
+#define _LINUX_UL_DRV_H
+
+#define UL_DRV_VERSION "0.7.3"
+#define UL_DRV_VERCODE 0x000703
+
+#if !defined(_WIN32)||defined(__GNUC__)
+  #ifndef INLINE
+    #define INLINE extern inline
+  #endif
+#else
+  #ifndef INLINE
+    #define INLINE _inline
+  #endif
+#endif
+
+#ifndef uchar
+ #define uchar unsigned char
+#endif
+
+/* Transfer controll byte with B8=1 */
+
+#define        UL_ERR  0x17F
+#define        UL_ARQ  0x17A
+#define        UL_PRQ  0x179
+#define        UL_AAP  0x176
+#define        UL_BEG  0x175
+#define        UL_END  0x17C
+
+/* Transfer acknowledge byte with B8=0 */
+
+#define        UL_ACK  0x19
+#define        UL_NAK  0x7F
+#define        UL_WAK  0x25
+
+/* Memory structures */
+
+#define UL_BLK_SIZE 64
+#define UL_BLK_FSIZE (UL_BLK_SIZE-sizeof(ul_mess_head))
+#define UL_BLK_FDATA(mem_blk) (mem_blk->blk.head.fdata)
+#define UL_BLK_NDATA(mem_blk) (mem_blk->blk.ndata)
+#define UL_BLK_HEAD(mem_blk) (mem_blk->blk.head)
+
+/* ul_mess_head flags definition defines proccessing 
+   of message or its frames stored in bll */
+#define UL_BFL_LOCK 0x8000     /* locked message is pointed only once */
+#define UL_BFL_MSST 0x4000      /* Message must be received by some proccess */
+#define UL_BFL_M2IN 0x2000      /* After succesfull proccessing move to proc_bll */
+#define UL_BFL_LNMM 0x1000      /* Length of received frame must match expected len */
+#define UL_BFL_FAIL 0x0800      /* Message cannot be proccessed - error */
+#define UL_BFL_TAIL 0x0400      /* Multiframe message continues by next bll block */
+#define UL_BFL_SND  0x0200      /* Send this frame */
+#define UL_BFL_REC  0x0100      /* Receive answer frame into this bll block */
+#define UL_BFL_VERL 0x0040      /* Verify free space in buffer of destination station */
+#define UL_BFL_NORE 0x0020      /* Do not try to repeat if error occurs */
+#define UL_BFL_REWA 0x0010      /* If error occurs do wait with retry */
+#define UL_BFL_PRQ  0x0002      /* Request imediate proccessing of frame by receiver station */
+#define UL_BFL_ARQ  0x0001      /* Request imediate acknowledge by receiving station */
+
+/* error handling */
+#define UL_RETRY_CNT 4         /* number of retries of messages */
+typedef struct ul_mess_head {  /* head of frame */
+       struct ul_mem_blk *next;/* BLL of frames */
+       struct ul_mem_blk *prev;
+       struct ul_blk_bll *bll; /* BLL in which is head */
+       int      ref_cnt;       /* usage count */
+       unsigned flg;           /* frame flags */
+       unsigned len;           /* length of message in bytes */
+       uchar    cmd;           /* command or service */
+       uchar    dadr;          /* destination address */
+       uchar    sadr;          /* source address */
+       uchar    retry_cnt;     /* actual number of retries */
+       unsigned stamp;         /* unigue message number */
+       uchar    fdata[0];      /* data in first block */
+} ul_mess_head;
+
+typedef struct ul_mem_blk {
+       struct ul_mem_blk *next; /* next relating memory block */
+       union { ul_mess_head head;
+               uchar   ndata[UL_BLK_SIZE];
+       } blk;
+} ul_mem_blk;
+
+typedef struct ul_blk_bll {    /* bidir linked list of frames */
+       ul_mem_blk *first;
+       ul_mem_blk *last;
+       int cnt;
+       struct ul_drv *udrv;    /* owener of bll list */
+} ul_blk_bll;
+
+/* Data iterator structure */
+
+typedef struct ul_data_it {
+       ul_mem_blk *blk;        /* actual proccessed memory block */
+       uchar   *ptr;           /* pointer to actual data byte */
+       int     pos;            /* actual position for seek operations */
+       ul_mem_blk *head_blk;   /* first memory block of message */
+       int     trans_len;      /* for send/rec routines */
+} ul_data_it;
+
+INLINE void ul_di_init(ul_data_it *di,ul_mem_blk *head_blk)
+{
+  di->blk=di->head_blk=head_blk;
+  di->pos=0;
+  di->ptr=UL_BLK_HEAD(head_blk).fdata;
+};
+
+INLINE void ul_di_inc(ul_data_it *di)
+{
+  di->ptr++;
+  di->pos++;
+};
+
+INLINE void ul_di_add(ul_data_it *di,int len)
+{
+  di->ptr+=len;
+  di->pos+=len;
+};
+
+INLINE int ul_di_adjust(ul_data_it *di)
+{
+  int offs;
+  while((offs=di->ptr-UL_BLK_NDATA(di->blk)-UL_BLK_SIZE)>=0)
+  {
+    if(!di->blk->next) return 0;
+    di->blk=di->blk->next;
+    di->ptr=UL_BLK_NDATA(di->blk)+offs;
+  };
+  return 1;
+};
+
+INLINE uchar *ul_di_byte(ul_data_it *di)
+{
+  return di->ptr;
+};
+
+INLINE int ul_di_atonce(ul_data_it *di)
+{
+  return UL_BLK_SIZE-(di->ptr-UL_BLK_NDATA(di->blk));
+};
+
+/* Chip driver ctrl functions */
+
+#define        UL_CC_DIN       1       /* switch off line transmitter */
+#define        UL_CC_DOUT      2       /* switch on line transmitter */
+#define        UL_CC_PINIT     3       /* initialize ports */
+#define        UL_CC_PDONE     4       /* deinitialize ports */
+#define        UL_CC_GENIRQ    5       /* generate irq for irq_probe */
+#define        UL_CC_RQIRQ     6       /* request IRQ handling */
+#define        UL_CC_FREEIRQ   7       /* release IRQ handling */
+#define        UL_CC_HWTEST    8       /* hardware testings */
+#define        UL_CC_SETMYADR  9       /* station address changed */
+
+/* driver subfunctions return codes */
+
+#define UL_RC_WIRQ     0       /* process fnc_act at next IRQ */
+#define UL_RC_PROC     1       /* imediately proccess fnc_act */
+#define UL_RC_ACTIVATE 2       /* timeout or stroke activation */
+#define UL_RC_FREEMSG   3       /* free message after receive processing */
+#define UL_RC_EFRAME   -1      /* received char frame error */
+#define UL_RC_ETIMEOUT -2      /* wait for char timeout */
+#define UL_RC_EBADCHR  -3      /* bad character received */
+#define UL_RC_EARBIT   -4      /* connect arbit. proc. lose */
+#define UL_RC_ENOFNC   -5      /* bad function code */
+#define UL_RC_EPORT    -6      /* port access error */
+#define UL_RC_ENAK     -7      /* slave sends NAK */
+#define UL_RC_EWAK     -8      /* slave bussy now and sends WAK */
+#define UL_RC_EREPLY   -9      /* bad reply from slave */
+#define UL_RC_ERECBEG  -10     /* bad char received */
+#define UL_RC_ERECADR  -11     /* bad address in imediate reply */
+#define UL_RC_ERECEND  -12     /* bad char or xorsum received */
+#define UL_RC_ERECPROT -13     /* nonrecoverable protocol error */
+#define UL_RC_ENOMEM   -14     /* no memory for data */
+#define UL_RC_ENOTAIL  -15     /* no frame tail when flag set */
+#define UL_RC_EPRMESS  -16     /* message processor error */
+#define UL_RC_EKWT     -17     /* error related to kernel worker thread */
+#define UL_RC_EBAUD    -18     /* error baudrate value */
+#define UL_RC_EUSB     -19     /* error related to usb */
+
+/* uLan driver flags stored in ul_drv.flags */
+
+#ifndef _WIN32
+#define UL_DFL_CHIPOK    0x10  /* chip driver initialized OK   */
+#define UL_DFLB_CHIPOK     4   /*              bit num.        */
+#define UL_DFL_IN_ISR    0x20  /* some CPU is running in ISR   */
+#define UL_DFLB_IN_ISR     5   /*              bit num.        */
+#define UL_DFL_ASK_ISR   0x40  /* some CPU likes but can't get ISR */
+#define UL_DFLB_ASK_ISR            6   /*              bit num.        */
+#define UL_DFL_NACTIV     0x80 /* no activity of driver - timeout ? */
+#define UL_DFLB_NACTIV     7   /*              bit num.        */
+#define UL_DFL_IN_BOTTOM  0x100        /* some CPU is running in ulan_do_bh */
+#define UL_DFLB_IN_BOTTOM   8  /*              bit num.        */
+#define UL_DFL_ASK_BOTTOM 0x200        /* request for ulan_do_bh       */
+#define UL_DFLB_ASK_BOTTOM  9  /*              bit num.        */
+#define UL_DFL_CHECK_FILT 0x400        /* check filters for UL_OPST_FILTNEW */
+#define UL_DFLB_CHECK_FILT  10 /*              bit num.        */
+#define UL_DFL_WDSCHED    0x800        /* SCHEDULE_UDRV_WDTIM expires  */
+#define UL_DFLB_WDSCHED     11         /*              bit num.        */
+#define UL_DFL_KWTRUN    0x1000        /* kernel worker thread running */
+#define UL_DFLB_KWTRUN      12         /*              bit num.        */
+#define UL_DFL_KWTKILL   0x2000        /* stop kernel worker thread    */
+#define UL_DFLB_KWTKILL     13         /*              bit num.        */
+#define UL_DFL_WDFORCED  0x4000        /* forced ativation of timeout  */
+#define UL_DFLB_WDFORCED    14         /*              bit num.        */
+#endif  /* _WIN32 */
+
+/* Driver controll structure */
+
+#define UL_DRV_MAGIC 0x754c1122
+
+typedef int(ul_call_fnc)(struct ul_drv *udrv, int ret_code);
+struct ul_opdata;
+struct ul_bottom;
+struct ul_iac_chain;
+
+typedef struct ul_drv {
+       int     magic;          /* magic number */
+       /*** parameters used by chip driver ***/
+  #ifndef _WIN32
+       volatile unsigned long flags;   /* flags */
+  #else /* _WIN32 */
+       PDEVICE_OBJECT  DeviceObject; /* Functional Device Object for WDM  */
+       PKINTERRUPT     InterruptObject;
+       KIRQL           Irql;
+       LONG    flag_IN_ISR;    /* some CPU is running in ISR   */
+       LONG    flag_NACTIV;    /* no activity of driver - timeout ? */
+       volatile LONG flag_ASK_ISR; /* some CPU likes but can't get ISR */
+       volatile LONG flag_CHIPOK; /* chip driver initialized OK        */
+       BOOLEAN  MappedPorts;   /* Ports mapped into memory space */
+  #endif /* _WIN32 */
+       long    port;           /* base port number */
+       int     irq;            /* irq number */
+       int     baud_div;       /* used baud divisor */
+       int     baud_val;       /* selected speed */
+       long    baud_base;      /* XTAL base clocks */
+       int     chip_options;   /* additional chip minor diferences */
+       void    *chip_info;     /* additional info for chip */
+       /*** function sequencer ***/
+       ul_call_fnc *fnc_act;   /* actual state call function */
+       ul_call_fnc *fnc_stack[10]; /* stack of interupted calls */
+       ul_call_fnc **fnc_sp;   /* pointer into stack */
+       ul_call_fnc *fnc_recch; /* character receive function */
+       ul_call_fnc *fnc_sndch; /* character send function */
+       ul_call_fnc *fnc_wait;  /* waits for time or receive */
+       ul_call_fnc *fnc_connect;/* connect to line */
+       int (*fnc_pool)(struct ul_drv *udrv);/* test interrupt flags state */
+       int (*fnc_cctrl)(struct ul_drv *udrv,int ctrl_fnc,int param);/* chip drv ctrl */
+       int (*fnc_stroke)(struct ul_drv *udrv);/* stroke for nonstandard targets */
+       unsigned char_buff;     /* rec/snd char buffer */
+       unsigned wait_time;     /* time limit for fnc_wait */
+       unsigned xor_sum;       /* xor+1 checksum */
+       unsigned last_ctrl;     /* last snd/rec controll char */
+       unsigned chip_temp;     /* temporary variable for chip driver */
+       unsigned chip_buff[6];  /* buffer for chip driver */
+       /*** message and frame proccessor ***/
+       int (*fnc_timeout)(struct ul_drv *udrv);/* timeout or error function */
+       ul_mem_blk *con_message;/* proccessed message chain */
+       ul_mem_blk *con_frame;  /* actual proccessed frame */
+       uchar      my_adr;      /* addres of this computer */
+       uchar      con_dadr;    /* connection destination address */
+       uchar      con_sadr;    /* connection sender address */
+       uchar      con_cmd;     /* connection command */
+       uchar      con_flg;     /* connection frame flags */
+       ul_data_it con_di;      /* data iterator for transmit/receive */
+       /*** memory management ***/
+       void       *mem_ptr;    /* pointer to allocated memory */
+       ul_mem_blk *free_blk;   /* single linked list of free blks */
+       int     free_blk_cnt;   /* number of block on free list */
+       ul_blk_bll prep_bll;    /* list of frames prepared for output */
+       ul_blk_bll work_bll;    /* list for receive operation */
+       ul_blk_bll proc_bll;    /* list of proccessed frames */
+       ul_blk_bll opan_bll;    /* list of announced frames */
+       /*** operators - clients ***/
+       struct ul_opdata *operators; /* double linked list of clients */
+       /*** kernel integration ***/
+       struct ul_drv *next_chan; /* used for multichanel PCI and PnP devices */
+       /*** immediately action commands ***/
+      #ifdef UL_WITH_IAC
+       struct ul_iac_chain *iac_chain;
+       struct ul_iac_chain *iac_act;
+       int        iac_ret_code;
+      #endif /* UL_WITH_IAC */
+  #ifdef KERNEL
+       struct kc_tasklet_struct bottom; /* deferring of time consumptive tasks */
+       struct timer_list wd_timer; /* link protecting timeout timer */
+    #ifdef UL_WITH_DEVFS
+       kc_devfs_handle_t devfs_handle; /* for devfs */
+    #endif /* UL_WITH_DEVFS */
+       struct pci_dev *dev;    /* kernel PCI device information */
+       wait_queue_head_t kwt_wq; /* wait queue for kernel worker thread */
+  #elif defined(_WIN32)
+       LONG flag_IN_BOTTOM;    /* some CPU is running in bottom Dpc    */
+       LONG flag_ASK_BOTTOM;   /* need to run of bottom Dpc */
+       LONG flag_CHECK_FILT;   /* check for UL_OPST_FILTNEW */
+       LONG flag_KWTKILL;      /* stop kernel worker thread    */
+       LONG flag_WDFORCED;     /* forced watchdog activation */
+       KDPC bottom_dpc;
+       KDPC wd_timer_dpc;
+       KTIMER wd_timer;
+       HANDLE          kwt;  /* thread */
+       KEVENT          kwt_wake;       /* event for wakeup kwt */
+       KEVENT          kwt_stopped;    /* event for wakeup kwt */
+        int             usb_bus;        /* set for usb bus */
+    #ifdef FOR_WIN_WDM
+       void            *dev;   /* kernel USB device information */
+        UNICODE_STRING ntdev_name; /* NT Device Name */
+        UNICODE_STRING link_name;  /* DOS Link Name */
+       PDEVICE_OBJECT  PhysicalDeviceObject;
+       PDEVICE_OBJECT  DeviceToSendIrpsTo;
+       ULONG           State;    /* State for PnP Purposes */
+       LONG            OutstandingIO; /* Number of unfinished IRPs */
+       KEVENT          RemoveEvent;   /* Set when no PnP IRP pending */
+       ULONG           InterruptAffinity;
+       ULONG           InterruptMode;
+       /*LONG flag_INITIALIZED;*/      /* DriverObject already initialized */
+    #endif /* FOR_WIN_WDM */
+    #ifdef UL_WITH_WIN_PWR
+        DEVICE_CAPABILITIES DeviceCapabilities;
+        DEVICE_POWER_STATE CurrentDevicePowerState;
+        BOOLEAN         EnabledForWakeup; 
+       ULONG           PowerDownLevel; 
+        PIRP            PowerIrp;
+        BOOLEAN         SelfPowerIrp; 
+        BOOLEAN         SystemPowerStatePending;
+        KEVENT          SelfRequestedPowerIrpEvent;
+    #endif /* UL_WITH_WIN_PWR */
+  #else
+        long int wd_timer_expires; /* helper variable for odd systems */
+  #endif
+} ul_drv;
+
+#define UL_FNEXT(FNEXT)        do{udrv->fnc_act=&FNEXT;}while(0)
+#define UL_FCALL(FCALL)        do{*(udrv->fnc_sp++)=udrv->fnc_act;\
+                          udrv->fnc_act=&FCALL;}while(0)
+#define UL_FCALL2(FCALL,FNEXT) \
+                       do{*(udrv->fnc_sp++)=FNEXT;\
+                          udrv->fnc_act=&FCALL;}while(0)
+#define UL_FRET                do{udrv->fnc_act=*(--udrv->fnc_sp);}while(0)
+
+#endif /* _LINUX_UL_DRV_H */
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.lnd b/ulan/host/ul_drv/ul_drv/ul_drv.lnd
new file mode 100644 (file)
index 0000000..7801029
--- /dev/null
@@ -0,0 +1,25 @@
+-OUT:UL_DRV.SYS\r
+-OPT:REF \r
+-INCREMENTAL:NO \r
+-FORCE:MULTIPLE \r
+-RELEASE \r
+-FULLBUILD \r
+-IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096 \r
+-NODEFAULTLIB \r
+-DEBUG:notmapped,FULL \r
+-DEBUGTYPE:both \r
+-VERSION:4.00 \r
+-OSVERSION:4.00 \r
+-PDB:NONE \r
+-OPTIDATA\r
+-DRIVER:UPONLY\r
+-ALIGN:0x20 \r
+-SUBSYSTEM:native,4.00 \r
+-BASE:0x10000 \r
+-ENTRY:DriverEntry@8\r
+UL_DRV.OBJ\r
+HAL.LIB\r
+INT64.LIB\r
+NTOSKRNL.LIB\r
+\r
+\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.lnr b/ulan/host/ul_drv/ul_drv/ul_drv.lnr
new file mode 100644 (file)
index 0000000..4cacb3a
--- /dev/null
@@ -0,0 +1,20 @@
+-OUT:UL_DRV.SYS\r
+-INCREMENTAL:NO \r
+-RELEASE \r
+-FULLBUILD \r
+-NODEFAULTLIB \r
+-VERSION:4.00 \r
+-OSVERSION:4.00 \r
+-PDB:NONE \r
+-OPTIDATA\r
+-DRIVER:UPONLY\r
+-ALIGN:0x100\r
+-SUBSYSTEM:native,4.00 \r
+-BASE:0x10000 \r
+-ENTRY:DriverEntry@8\r
+UL_DRV.OBJ\r
+HAL.LIB\r
+INT64.LIB\r
+NTOSKRNL.LIB\r
+\r
+\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv.mak b/ulan/host/ul_drv/ul_drv/ul_drv.mak
new file mode 100644 (file)
index 0000000..964de42
--- /dev/null
@@ -0,0 +1,108 @@
+#----------------------------------------------------------------------------\r
+#\r
+# Device Driver MAKEFILE\r
+#\r
+# uLan Communication Driver\r
+#\r
+#\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+# Compile flags for the Kernel Mode Driver\r
+#\r
+\r
+# general flags, \r
+\r
+CFLAGS1 = /c /Gs /W3 /GF /Gz\r
+\r
+# The following flags handle Pentium chip bugs\r
+\r
+CFLAGS2 = /QIfdiv- /QI0f\r
+\r
+# /Z7=Debug info flags, /Zel=Use MS extension-omit default library\r
+\r
+CFLAGS3 = /Z7 /Zel\r
+\r
+# /Od=Turn off ALL optimizations, /Oi=Inline functions\r
+\r
+CFLAGS4 = /Od /Oi\r
+\r
+# defines used by .H files and the like\r
+\r
+CFLAGS5 = -cbstring -FIwarning.h -D_X86_=1 -Di386=1\r
+\r
+# try compile with PCI \r
+\r
+CFLAGS6 = -D UL_WITH_PCI\r
+\r
+#----------------------------------------------------------------------------\r
+#****************************************************************************\r
+\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+# Flags for the User Mode EXE\r
+#\r
+\r
+#----------------------------------------------------------------------------\r
+# COMPILE flags\r
+\r
+ccommon = -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo\r
+cflags = $(ccommon) -D_X86_=1\r
+cvars      = -DWIN32 $(noansi) -D_WIN32\r
+cdebug = -Z7 -Od\r
+\r
+CCFLAGS = $(cflags) $(cvars) $(cdebug)\r
+\r
+\r
+#----------------------------------------------------------------------------\r
+# LINK Flags\r
+\r
+libcmt = libcmt.lib oldnames.lib\r
+baselibs = kernel32.lib advapi32.lib\r
+libc = libc.lib oldnames.lib\r
+linklibs = $(libc) $(baselibs)\r
+\r
+linkdebug = -debug:full -debugtype:cv\r
+\r
+lflags = /NODEFAULTLIB /INCREMENTAL:NO /PDB:NONE /RELEASE /NOLOGO\r
+conlflags = $(lflags) -subsystem:console,4.0 -entry:mainCRTStartup\r
+\r
+#----------------------------------------------------------------------------\r
+#****************************************************************************\r
+\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+#\r
+# The dependency list and build rules follows\r
+\r
+whole_enchilada : ul_drv.sys\r
+\r
+ul_drv.sym : ul_drv.map\r
+        MSYM ul_drv.MAP\r
+\r
+ul_drv.map : ul_drv.sys\r
+        DBG2MAP ul_drv.sys\r
+\r
+#\r
+# In the following,\r
+# Use: ul_drv.lnr for a release link\r
+# Use: ul_drv.lnd for a debug build\r
+#\r
+ul_drv.sys : ul_drv.obj\r
+        LINK @ul_drv.lnr\r
+\r
+ul_drv.obj : ul_drv.c  \\r
+             ul_drv.h ul_hdep.h ul_82510.h serial_reg.h\r
+        CL $(CFLAGS1) $(CFLAGS2) $(CFLAGS3) $(CFLAGS4)  $(CFLAGS5)  $(CFLAGS6) ul_drv.c\r
+\r
+q_test.obj: q_test.c\r
+        CL $(CCFLAGS) q_test.c\r
+\r
+q_test.exe: q_test.obj\r
+        LINK $(linkdebug) $(conflags) -out:q_test.exe q_test.obj $(linklibs)\r
+\r
+#****************************************************************************\r
+#****************************************************************************\r
+\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv_iac.h b/ulan/host/ul_drv/ul_drv/ul_drv_iac.h
new file mode 100644 (file)
index 0000000..8382a68
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_drv_iac.h - driver definitions and types
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifndef _UL_DRV_IAC_H
+#define _UL_DRV_IAC_H
+
+struct ul_drv;
+
+#define UL_IAC_RC_ERR          -1
+#define UL_IAC_RC_PROC         0
+#define UL_IAC_RC_FREEMSG      1
+
+#define UL_IAC_OP_CALLBACK     0
+#define UL_IAC_OP_SNDBUFF      1
+#define UL_IAC_OP_SND          2
+#define UL_IAC_OP_REC          3
+
+#define UL_IAC_BFL_FREEBUFF    0x01
+
+typedef struct ul_iac_data {
+       char    *buff;          /* buffer */
+       unsigned ptr;           /* buffer ptr */
+       unsigned len;           /* len */
+       void    *ctx;           /* context */
+} ul_iac_data; 
+
+typedef int(ul_iac_call_fnc)(struct ul_drv *udrv,ul_msginfo *msginfo,char *idata,ul_iac_data *iac_data);
+
+int ul_drv_add_iac(struct ul_drv *udrv,int cmd,int op,ul_iac_call_fnc *fnc,char *buff, unsigned len,unsigned flg,void *ctx);
+int ul_drv_del_iac(struct ul_drv *udrv,int cmd);
+
+#endif /* _UL_DRV_INIT_H */
diff --git a/ulan/host/ul_drv/ul_drv/ul_drv_init.h b/ulan/host/ul_drv/ul_drv/ul_drv_init.h
new file mode 100644 (file)
index 0000000..86bb78a
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_drv.h     - driver definitions and types
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifndef _UL_DRV_INIT_H
+#define _UL_DRV_INIT_H
+
+struct ul_drv;
+
+int ul_drv_add_dev(struct ul_drv *udrv);
+struct ul_drv *ul_drv_new(int port, int irq, int baud, int my_adr, char *chip_name, long baudbase);
+
+#endif /* _UL_DRV_INIT_H */
diff --git a/ulan/host/ul_drv/ul_drv/ul_frame.c b/ulan/host/ul_drv/ul_drv/ul_frame.c
new file mode 100644 (file)
index 0000000..2c992ab
--- /dev/null
@@ -0,0 +1,311 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_frame.c   - sending and reception of uLan message frames
+                  for UART chips
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+
+/*******************************************************************/
+/* Frame begin/end */
+
+/*-- Helper functions for sndbeg --*/
+
+int uld_sndbeg_2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  udrv->char_buff=udrv->con_cmd;
+  UL_FNEXT(*udrv->fnc_sndch);
+  return UL_RC_PROC;
+};
+
+int uld_sndbeg_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  udrv->char_buff=udrv->char_buff=udrv->con_sadr;
+  UL_FCALL2(*udrv->fnc_sndch,uld_sndbeg_2);
+  return UL_RC_PROC;
+};
+
+/*** Send frame begin ***/
+int uld_sndbeg(ul_drv *udrv, int ret_code)
+{
+  udrv->xor_sum=0;
+  if(udrv->con_flg&4) udrv->char_buff=UL_BEG;
+  else udrv->char_buff=udrv->con_dadr|0x100;
+  UL_FCALL2(*udrv->fnc_sndch,uld_sndbeg_1);
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for sndend --*/
+
+int uld_sndend_3(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  UL_FRET;
+  if(ret_code<0) return ret_code;
+  if(udrv->char_buff==UL_ACK) return UL_RC_PROC;
+  if(udrv->char_buff==UL_NAK) return UL_RC_ENAK;
+  if(udrv->char_buff==UL_WAK) return UL_RC_EWAK;
+  return UL_RC_EREPLY;
+};
+
+int uld_sndend_2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(!(udrv->con_flg&1))
+  {
+    UL_FRET;
+    return UL_RC_PROC;
+  };
+  udrv->wait_time=4;
+  UL_FCALL2(*udrv->fnc_wait,uld_sndend_3);
+  return UL_RC_PROC;
+};
+
+int uld_sndend_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  udrv->char_buff=udrv->xor_sum&0xFF;
+  UL_FCALL2(*udrv->fnc_sndch,uld_sndend_2);
+  return UL_RC_PROC;
+};
+
+/*** Send frame end ***/
+int uld_sndend(ul_drv *udrv, int ret_code)
+{
+  static int sndend_arr[]={UL_END,UL_ARQ,UL_PRQ,UL_AAP};
+  udrv->char_buff=sndend_arr[udrv->con_flg];
+  UL_FCALL2(*udrv->fnc_sndch,uld_sndend_1);
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for recbeg --*/
+
+int uld_recbeg_3(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(udrv->char_buff&0xFF00) {UL_FRET; return UL_RC_ERECBEG;};
+  udrv->con_cmd=(uchar)udrv->char_buff;
+  UL_FRET;
+  return UL_RC_PROC;
+};
+
+int uld_recbeg_2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(udrv->char_buff&0xFF00) {UL_FRET; return UL_RC_ERECBEG;};
+  udrv->con_sadr=(uchar)udrv->char_buff;
+  udrv->wait_time=4;
+  UL_FCALL2(*udrv->fnc_wait,uld_recbeg_3);
+  return UL_RC_PROC;
+};
+
+int uld_recbeg_1(ul_drv *udrv, int ret_code)
+{
+  if((udrv->char_buff!=(udrv->my_adr|0x100))&&
+     (udrv->char_buff!=0x100)&&
+     ((udrv->char_buff!=UL_BEG)||(!(udrv->con_flg&8))))
+  { UL_FRET;
+    if((udrv->char_buff&0x180)==0x100)
+     return UL_RC_ERECADR;
+    else
+     return UL_RC_ERECBEG;
+  };
+  udrv->con_dadr=udrv->char_buff&0xFF;
+  udrv->con_flg|=8;
+  udrv->wait_time=4;
+  UL_FCALL2(*udrv->fnc_wait,uld_recbeg_2);
+  return UL_RC_PROC;
+};
+
+/*** Receive frame begin ***/
+int uld_recbeg(ul_drv *udrv, int ret_code)
+{
+  udrv->xor_sum=0;
+  udrv->wait_time=4;
+  UL_FCALL2(*udrv->fnc_wait,uld_recbeg_1);
+  return UL_RC_PROC;
+};
+
+/*-- Helper functions for recend --*/
+
+int uld_recend_3(ul_drv *udrv, int ret_code)
+{
+  UL_FRET;
+  if(udrv->con_flg&0xC0) return UL_RC_ERECEND;
+  return UL_RC_PROC;
+};
+
+int uld_recend_2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(udrv->char_buff&0xFF00) {UL_FRET; return UL_RC_ERECPROT;};
+  if((udrv->xor_sum-1)&0xFF) udrv->con_flg|=0x80;
+  if(!(udrv->con_flg&1))
+  {
+    UL_FRET;
+    if(udrv->con_flg&0xC0) return UL_RC_ERECEND;
+    return UL_RC_PROC;
+  };
+  if(udrv->con_flg&0x80) udrv->char_buff=UL_NAK;
+  else if(udrv->con_flg&0x40) udrv->char_buff=UL_WAK;
+  else udrv->char_buff=UL_ACK;
+  UL_FCALL2(*udrv->fnc_sndch,uld_recend_3);
+  return UL_RC_PROC;
+};
+
+int uld_recend_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FRET;return ret_code;};
+  if(!(udrv->char_buff&0x100))
+  {
+    udrv->wait_time=4;
+    UL_FCALL(*udrv->fnc_wait);
+    udrv->con_flg|=0x80;
+    return UL_RC_PROC;
+  };
+  udrv->con_flg&=~3;
+  switch(udrv->char_buff)
+  {
+    case UL_END: break;
+    case UL_ARQ: udrv->con_flg|=1; break;
+    case UL_PRQ: udrv->con_flg|=2; break;
+    case UL_AAP: udrv->con_flg|=3; break;
+    default: UL_FRET; return UL_RC_ERECPROT;
+  };
+  udrv->wait_time=4;
+  UL_FCALL2(*udrv->fnc_wait,uld_recend_2);
+  return UL_RC_PROC;
+};
+
+/*** Receive frame end ***/
+int uld_recend(ul_drv *udrv, int ret_code)
+{
+  if((udrv->char_buff&0xFF00)==0x100) 
+  {
+    UL_FNEXT(uld_recend_1);
+  }else{
+    udrv->wait_time=4;
+    UL_FCALL2(*udrv->fnc_wait,uld_recend_1);
+  };
+  return UL_RC_PROC;
+};
+
+
+/*******************************************************************/
+/* Message and frame proccessor */
+
+int uld_prmess_frame(ul_drv *udrv, int ret_code);
+int uld_prmess(ul_drv *udrv, int ret_code);
+
+/*-- Helper functions for prmess --*/
+int uld_prmess_error(ul_drv *udrv, int ret_code)
+{
+  UL_FRET;
+  return ret_code;
+};
+
+int uld_prmess_next(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  if(UL_BLK_HEAD(udrv->con_frame).flg&UL_BFL_TAIL)
+  {
+    if(UL_BLK_HEAD(udrv->con_frame).next)
+    {
+      udrv->con_frame=UL_BLK_HEAD(udrv->con_frame).next;
+      UL_FNEXT(uld_prmess_frame);
+      return UL_RC_PROC;
+    };
+    UL_FRET;
+    return UL_RC_ENOTAIL;
+  };
+  UL_FRET;
+  return UL_RC_PROC;
+};
+
+int uld_prmess_rec2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_FCALL2(uld_recend,uld_prmess_next);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_rec1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_BLK_HEAD(udrv->con_frame).dadr=udrv->con_dadr;
+  UL_BLK_HEAD(udrv->con_frame).sadr=udrv->con_sadr;
+  UL_BLK_HEAD(udrv->con_frame).cmd=udrv->con_cmd;
+  UL_FCALL2(uld_recdata,uld_prmess_rec2);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_snd2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_FCALL2(uld_sndend,uld_prmess_next);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_snd1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_FCALL2(uld_snddata,uld_prmess_snd2);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_frame(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  if(UL_BLK_HEAD(udrv->con_frame).flg&UL_BFL_SND)
+  {
+    udrv->con_dadr=UL_BLK_HEAD(udrv->con_frame).dadr;
+    udrv->con_sadr=UL_BLK_HEAD(udrv->con_frame).sadr;
+    udrv->con_cmd=UL_BLK_HEAD(udrv->con_frame).cmd;
+    udrv->con_flg=UL_BLK_HEAD(udrv->con_frame).flg&3;
+    UL_FCALL2(uld_sndbeg,uld_prmess_snd1);
+  }
+  else if(UL_BLK_HEAD(udrv->con_frame).flg&UL_BFL_REC)
+  {
+    udrv->con_flg=8;
+    UL_FCALL2(uld_recbeg,uld_prmess_rec1);
+  }
+  else UL_FNEXT(uld_prmess_next);
+  return UL_RC_PROC;
+};
+
+/*** Proccess one outgoing message ***/
+int uld_prmess(ul_drv *udrv, int ret_code)
+{
+  if(!udrv->con_message)
+  {
+    UL_FRET;
+    return UL_RC_PROC;
+  };
+  udrv->con_frame=udrv->con_message;
+  UL_FNEXT(uld_prmess_frame);
+  return UL_RC_PROC;
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_hdep.h b/ulan/host/ul_drv/ul_drv/ul_hdep.h
new file mode 100644 (file)
index 0000000..e27e311
--- /dev/null
@@ -0,0 +1,776 @@
+/*******************************************************************
+  uLan Communication - low level and link driver
+
+  ul_hdep.h    - host system dependant driver routines
+
+  (C) Copyright 1996,1997 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+
+  Author reserves right to use and publish sources for embedded 
+  applications under different conditions too.
+ *******************************************************************/
+
+#ifndef _LINUX_UL_HDEP_H
+#define _LINUX_UL_HDEP_H
+
+#include "ul_drv.h"
+
+#define  ULAN_MAJOR 248
+
+#define  ENABLE_UL_MEM_CHECK
+
+#define UL_LOG_ENABLE
+
+#ifdef KERNEL
+ #ifndef ENABLE_UL_MEM_CHECK
+  #define MALLOC(x) kmalloc(x,GFP_KERNEL)
+  #define FREE(x)   kfree(x)
+ #else
+  #define MALLOC ul_mem_check_malloc
+  #define FREE   ul_mem_check_free
+  void * ul_mem_check_malloc(size_t size);
+  void ul_mem_check_free(void *ptr);
+ #endif
+ #define UL_CHK_IOS(port,cnt)      check_region(port, cnt)
+ #define UL_REQ_IOS(port,cnt,name) (kc_request_region(port, cnt, name)?0:-1)
+ #define UL_REL_IOS(port,cnt)      kc_release_region(port, cnt)
+ #ifndef FOR_LINUX_KERNEL
+  #define FOR_LINUX_KERNEL
+ #endif
+ #define ULD_HZ HZ
+#elif defined(_WIN32)
+ #ifndef ENABLE_UL_MEM_CHECK
+  #define MALLOC(x) ExAllocatePool(NonPagedPool,x)
+  #define FREE(x)   ExFreePool(x)
+ #else
+  #define MALLOC ul_mem_check_malloc
+  #define FREE   ul_mem_check_free
+  void * ul_mem_check_malloc(size_t size);
+  void ul_mem_check_free(void *ptr);
+ #endif
+ #define UL_CHK_IOS(port,cnt)      (0)
+ #define UL_REQ_IOS(port,cnt,name) (0)
+ #define UL_REL_IOS(port,cnt)      (0)
+ #define ULD_HZ 1000000 
+#elif defined(__DJGPP__)
+ #include <malloc.h>
+ #include <dpmi.h>
+ #ifndef ENABLE_UL_MEM_CHECK
+  #define MALLOC(_size) ({void *_p=malloc(_size);\
+                        _go32_dpmi_lock_data(_p,_size);\
+                        _p;})
+  #define FREE   free
+ #else
+  #define MALLOC ul_mem_check_malloc
+  #define FREE   ul_mem_check_free
+  void * ul_mem_check_malloc(size_t size);
+  void ul_mem_check_free(void *ptr);
+ #endif
+ #define UL_CHK_IOS(port,cnt)      ({0;})
+ #define UL_REQ_IOS(port,cnt,name) ({0;})
+ #define UL_REL_IOS(port,cnt)      ({0;})
+ #define UL_DRV_IN_LIB
+ #define error perror
+ #define ULD_HZ UCLOCKS_PER_SEC
+ long int uld_jiffies;
+ #define jiffies uld_jiffies
+ #define JIFFIES_FROM_GETTIMEOFDAY
+#elif defined(CONFIG_OC_UL_DRV_SYSLESS)
+ #include <malloc.h>
+ #include <system_def.h>
+ #include <hal_intr.h>
+ #ifndef ENABLE_UL_MEM_CHECK
+  #define MALLOC(_size) malloc(_size)
+  #define FREE   free
+ #else
+  #define MALLOC ul_mem_check_malloc
+  #define FREE   ul_mem_check_free
+  void * ul_mem_check_malloc(size_t size);
+  void ul_mem_check_free(void *ptr);
+ #endif
+ #define UL_CHK_IOS(port,cnt)      ({0;})
+ #define UL_REQ_IOS(port,cnt,name) ({0;})
+ #define UL_REL_IOS(port,cnt)      ({0;})
+ #define UL_DRV_IN_LIB
+ #define UL_DRV_IN_LIB_WITH_PRINTK
+ #define error perror
+ #define ULD_HZ SYS_TIMER_HZ
+ long int uld_jiffies;
+ #define jiffies uld_jiffies
+ #define sleep(x) {volatile unsigned int s;for(s=0;s<50000;s++);}
+ #define ENABLE_UL_STARTUP_RECEIVE
+#else
+ #include <malloc.h>
+ #include <sys/time.h>
+ #define MALLOC malloc
+ #define FREE   free
+ #define UL_CHK_IOS(port,cnt) \
+       ({int i=ioperm((long)port, (long)cnt, 1);\
+         ioperm((long)port, (long)cnt, 0);\
+         i<0?i:0;\
+       })
+ #define UL_REQ_IOS(port,cnt,name) ioperm((long)port, (long)cnt, 1)
+ #define UL_REL_IOS(port,cnt)      ioperm((long)port, (long)cnt, 0)
+ #define error perror
+ #define ULD_HZ 1000000
+ #define jiffies ({struct timeval tv;gettimeofday(&tv,NULL);\
+                  tv.tv_usec+tv.tv_sec*1000000;})
+#endif
+
+
+#ifndef INLINE
+  #define INLINE extern inline
+#endif
+
+#ifndef uchar
+ #define uchar unsigned char
+#endif
+
+#if defined(__DJGPP__)
+  /* Taken from Linux kernel - Copyright 1992, Linus Torvalds. */
+  #define __sti() __asm__ __volatile__ ("sti": : :"memory")
+  #define __cli() __asm__ __volatile__ ("cli": : :"memory")
+  #define __save_flags(x) \
+  __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */ :"memory")
+  #define __restore_flags(x) \
+  __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
+  INLINE void set_bit(int nr, volatile int * addr)
+    { __asm__ __volatile__("btsl %1,%0":"=m" (*addr):"Ir" (nr));}
+  INLINE void clear_bit(int nr, volatile int * addr)
+    { __asm__ __volatile__("btrl %1,%0":"=m" (*addr):"Ir" (nr));}
+  INLINE int test_and_set_bit(int nr, volatile int * addr)
+    {int oldbit;__asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0"
+      :"=r" (oldbit),"=m" (*addr):"Ir" (nr));return oldbit;}
+  INLINE int test_bit(int nr, volatile int * addr)
+    {int oldbit;__asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
+      :"=r" (oldbit):"m" (*addr),"Ir" (nr));return oldbit;}
+  #define udelay usleep
+  INLINE void schedule(void) {;}
+  int request_irq(int irq,void *handler,int flags,char *name,void *dev_id);
+  int free_irq(int irq,void *ctx);
+  INLINE void synchronize_irq() {asm volatile ("":::"memory");}
+#elif defined(USER_SPACE_EMU_IRQ)
+  INLINE void schedule(void) {;}
+  #define request_irq request_emu_irq
+  #define free_irq release_emu_irq
+  INLINE void synchronize_irq() {asm volatile ("":::"memory");}
+#elif defined(CONFIG_OC_UL_DRV_SYSLESS)
+  #define __cli(x) cli(x)
+  #define __restore_flags(x)  restore_flags(x)
+  #define __save_flags(x) save_flags(x)
+  inline void schedule(void) {;}
+  int request_irq(int irq,void *handler,int flags,char *name,void *dev_id);
+  int free_irq(int irq,void *ctx);
+  inline void synchronize_irq() {asm volatile ("":::"memory");}
+#endif /* USER_SPACE_EMU_IRQ */
+
+#if defined(CONFIG_OC_UL_DRV_SYSLESS)
+  #define U450_BYTES_PER_REGS 4
+  #define U450_BAUD_BASE_DEFAULT ((FOSC*PLL_MUL/PBSD+8)/16)
+#else
+  #define U450_BYTES_PER_REGS 1
+  #define U450_BAUD_BASE_DEFAULT 0x1C200
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+/*******************************************************************/
+/* locking, irq and memory management */
+
+/* disables another IRQ on same CPU when uLan IRQ is handled */
+#ifdef FOR_LINUX_KERNEL
+ #if 1
+  #define UL_IRQF_FLAGS (IRQF_SHARED|IRQF_DISABLED)
+ #else
+  #define UL_IRQF_FLAGS IRQF_SHARED
+ #endif
+#else
+ #define UL_IRQF_FLAGS 0
+#endif
+
+#ifdef USER_SPACE_EMU_IRQ
+ #define UL_IRQ_LOCK_FINI
+ #define ul_synchronize_irq(irqnum) synchronize_irq()
+ int INLINE irq_lock_cnt(int i)
+ {static int lock_counter=0;
+  return lock_counter+=i;
+ };
+ #define UL_IRQ_LOCK   {if(irq_lock_cnt(1)==1) emu_irq_cli();}
+ #define UL_IRQ_UNLOCK {if(irq_lock_cnt(-1)==0)emu_irq_sti();}
+ #define UL_MB()       {asm volatile ("":::"memory");}
+ #define UL_IRQ_HANDLER_ARGS(intno, dev_id) \
+       int intno, void *dev_id, struct pt_regs *regs
+ #define ul_irqreturn_t void
+ #define UL_IRQ_RETVAL(retval)
+ #define UL_IRQ_NONE
+ #define UL_IRQ_HANDLED
+#elif defined(FOR_LINUX_KERNEL)
+ #define ul_synchronize_irq kc_synchronize_irq
+ #if 1
+  spinlock_t ul_irq_lock_spinlock;
+  #define UL_IRQ_LOCK_GINI \
+    spinlock_t ul_irq_lock_spinlock=SPIN_LOCK_UNLOCKED;
+  #define UL_IRQ_LOCK_FINI unsigned long ul_irq_lock_flags;
+  #define UL_IRQ_LOCK \
+    {spin_lock_irqsave(&ul_irq_lock_spinlock,ul_irq_lock_flags);}
+  #define UL_IRQ_UNLOCK \
+    {spin_unlock_irqrestore(&ul_irq_lock_spinlock,ul_irq_lock_flags);}
+ #else
+  #define UL_IRQ_LOCK_FINI
+  #define UL_IRQ_LOCK   {cli();}
+  #define UL_IRQ_UNLOCK {sti();}
+ #endif
+ #define UL_MB()       mb()
+ #define UL_IRQ_HANDLER_ARGS KC_IRQ_HANDLER_ARGS
+ #define ul_irqreturn_t irqreturn_t
+ #define UL_IRQ_RETVAL  IRQ_RETVAL
+ #define UL_IRQ_NONE    IRQ_NONE
+ #define UL_IRQ_HANDLED IRQ_HANDLED
+#elif defined(_WIN32)
+ typedef LONG atomic_t;
+ KIRQL  uL_SpinLock_Irql;
+ LONG   uL_SpinLock_Flag;
+ #ifndef YieldProcessor
+  #define UL_YieldProcessor() do { __asm { rep nop }; } while(0)
+ #else
+  #define UL_YieldProcessor() YieldProcessor()
+ #endif
+ #define UL_IRQ_LOCK_GINI \
+     KIRQL  uL_SpinLock_Irql=0; \
+     LONG   uL_SpinLock_Flag=0;
+ #define UL_IRQ_LOCK_FINI \
+        KIRQL uL_IRQ_OldIrql;
+ #define UL_IRQ_LOCK \
+    {KeRaiseIrql (uL_SpinLock_Irql,&uL_IRQ_OldIrql); \
+     while(InterlockedExchange(&uL_SpinLock_Flag,1)) \
+       UL_YieldProcessor(); \
+    }
+ #define UL_IRQ_UNLOCK \
+    {InterlockedExchange(&uL_SpinLock_Flag,0); \
+     KeLowerIrql(uL_IRQ_OldIrql); \
+    }
+ #define UL_MB()       {/* Flush cache here */;}
+ #define UL_IRQ_HANDLER_ARGS(intno, dev_id) \
+       IN PKINTERRUPT intno, IN PVOID dev_id
+ #define ul_irqreturn_t BOOLEAN
+ #define UL_IRQ_RETVAL(retval)  ((retval)?TRUE:FALSE)
+ #define UL_IRQ_NONE    FALSE
+ #define UL_IRQ_HANDLED TRUE
+#elif defined(__DJGPP__)
+  typedef long atomic_t;
+  #define UL_IRQ_LOCK_FINI unsigned long ul_irq_lock_flags;
+  #define UL_IRQ_LOCK \
+    {__save_flags(ul_irq_lock_flags);__cli();}
+  #define UL_IRQ_UNLOCK \
+    {__restore_flags(ul_irq_lock_flags);}
+  #define UL_MB()       {asm volatile ("":::"memory");}
+  #define ul_synchronize_irq(irqnum) synchronize_irq()
+  #define UL_IRQ_HANDLER_ARGS(intno, dev_id) \
+       int intno, void *dev_id, struct pt_regs *regs
+  #define ul_irqreturn_t void
+  #define UL_IRQ_RETVAL(retval)
+  #define UL_IRQ_NONE
+  #define UL_IRQ_HANDLED
+#elif defined(CONFIG_OC_UL_DRV_SYSLESS)
+  typedef long atomic_t;
+  #define UL_IRQ_LOCK_FINI unsigned long ul_irq_lock_flags=0;
+  #define UL_IRQ_LOCK \
+    {__save_flags(ul_irq_lock_flags);__cli();}
+  #define UL_IRQ_UNLOCK \
+    {__restore_flags(ul_irq_lock_flags);}
+  #define UL_MB()       {asm volatile ("":::"memory");}
+  #define ul_synchronize_irq(irqnum) synchronize_irq()
+  #define UL_IRQ_HANDLER_ARGS(intno, dev_id) \
+       int intno, void *dev_id
+  #define ul_irqreturn_t void
+  #define UL_IRQ_RETVAL(retval)
+  #define UL_IRQ_NONE
+  #define UL_IRQ_HANDLED
+#endif
+
+#ifndef ATOMIC_INIT
+  #define ATOMIC_INIT(i) (i)
+#endif
+#ifndef atomic_read
+  #define atomic_read(v) (*(v))
+#endif
+#ifndef atomic_set
+  #define atomic_set(v,i) (*(v)=(i))
+#endif
+
+#define UL_DRV_LOCK_FINI UL_IRQ_LOCK_FINI
+#define UL_DRV_LOCK {\
+  UL_IRQ_LOCK;\
+ }
+#define UL_DRV_UNLOCK {\
+  UL_IRQ_UNLOCK;\
+ }
+
+/* enable to globaly lock CPU through uLan events handling, bad
+   use only for special test purposes */
+#if 0
+  spinlock_t ul_global_irq_lock_spinlock;
+  #define UL_GLOBAL_IRQ_LOCK_GINI \
+    spinlock_t ul_global_irq_lock_spinlock=SPIN_LOCK_UNLOCKED;
+  #define UL_GLOBAL_IRQ_LOCK_FINI unsigned long ul_global_irq_lock_flags;
+  #define UL_GLOBAL_IRQ_LOCK \
+    {spin_lock_irqsave(&ul_global_irq_lock_spinlock,ul_global_irq_lock_flags);}
+  #define UL_GLOBAL_IRQ_UNLOCK \
+    {spin_unlock_irqrestore(&ul_global_irq_lock_spinlock,ul_global_irq_lock_flags);}
+#endif
+
+
+#ifdef CONFIG_OC_UL_DRV_SYSLESS
+  #define UL_GLOBAL_IRQ_LOCK_GINI 
+  #define UL_GLOBAL_IRQ_LOCK_FINI UL_IRQ_LOCK_FINI;
+  #define UL_GLOBAL_IRQ_LOCK UL_IRQ_LOCK
+  #define UL_GLOBAL_IRQ_UNLOCK UL_IRQ_UNLOCK
+#endif
+
+/* get one free block or NULL */
+INLINE ul_mem_blk *ul_alloc_blk(ul_drv *udrv)
+{
+  UL_DRV_LOCK_FINI
+  ul_mem_blk *p;
+  UL_DRV_LOCK;
+  if((p=udrv->free_blk)!=NULL)
+  {
+    udrv->free_blk_cnt--;
+    udrv->free_blk=p->next;
+    p->next=NULL;
+  };
+  UL_DRV_UNLOCK;
+  return p;
+};
+
+/* free one block */
+INLINE void ul_free_blk(ul_drv *udrv, ul_mem_blk *blk)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  blk->next=udrv->free_blk;
+  udrv->free_blk=blk;
+  udrv->free_blk_cnt++;
+  UL_DRV_UNLOCK;
+};
+
+/* bottom half definitions */
+#ifdef FOR_LINUX_KERNEL
+  void ulan_do_bh(kc_tasklet_data_type data);
+  typedef kc_tasklet_data_type ulan_do_bh_data_type;
+  #define SCHEDULE_BH(udrv) \
+        kc_tasklet_schedule(&(udrv)->bottom)
+  #define INIT_UDRV_BH(udrv) \
+       kc_tasklet_init(&(udrv)->bottom,ulan_do_bh,(long)udrv)
+  #define KILL_UDRV_BH(udrv) \
+       kc_tasklet_kill(&(udrv)->bottom)
+  #define DECLARE_UDRV_BH struct kc_tasklet_struct bottom;
+  #define uld_test_dfl(udrv,_DFL_flag) \
+       test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_set_dfl(udrv,_DFL_flag) \
+       set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_clear_dfl(udrv,_DFL_flag) \
+       clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_test_and_set_dfl(udrv,_DFL_flag) \
+       test_and_set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_test_dfl(udrv,_DFL_flag) \
+       test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_clear_dfl(udrv,_DFL_flag) \
+       clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_set_dfl(udrv,_DFL_flag) \
+       set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+    
+  #define uld_kwt_wq_init(udrv) \
+       do { init_waitqueue_head(&(udrv)->kwt_wq); \
+            uld_atomic_clear_dfl(udrv,KWTKILL); \
+            uld_atomic_clear_dfl(udrv,KWTRUN); \
+            uld_atomic_clear_dfl(udrv,ASK_ISR); } while(0)
+  #define uld_kwt_wake(udrv) \
+       do { uld_atomic_set_dfl(udrv,ASK_ISR); wake_up(&(udrv)->kwt_wq); } while(0)
+  #define uld_kwt_wait(udrv) \
+       wait_event(udrv->kwt_wq, uld_test_dfl(udrv,ASK_ISR))
+  #define uld_kwt_confirm(udrv) \
+       uld_atomic_clear_dfl(udrv,ASK_ISR)
+  #define uld_kwt_test_and_set_prepared(udrv) \
+       uld_test_and_set_dfl(udrv,KWTRUN)
+  #define uld_kwt_kill(udrv) \
+       do { uld_atomic_set_dfl(udrv,KWTKILL); \
+            uld_atomic_set_dfl(udrv,ASK_ISR); wake_up(&(udrv)->kwt_wq); } while(0)
+  #define uld_kwt_set_stopped(udrv) \
+       do { uld_atomic_clear_dfl(udrv,KWTRUN); wake_up(&(udrv)->kwt_wq); } while(0)
+  #define uld_kwt_wait_stopped(udrv) \
+       wait_event(udrv->kwt_wq, !uld_test_dfl(udrv,KWTRUN))
+  #define uld_kwt_is_running(udrv) \
+       uld_test_dfl(udrv,KWTRUN)
+       
+#elif defined(_WIN32)
+                       /* must be used only at IRQL >= DISPATCH_LEVEL */
+  #define SCHEDULE_BH(udrv) \
+    do{ \
+       (udrv)->flag_ASK_BOTTOM=1; \
+       KeInsertQueueDpc(&(udrv)->bottom_dpc,NULL,NULL); \
+    }while(0)
+  #define INIT_UDRV_BH(udrv) /* not used search Dpc */
+  #define KILL_UDRV_BH(udrv)
+  #define DECLARE_UDRV_BH      /* not used search for Dpc */
+  PIRP xch_pending_irp(PIRP *irp_ptr, PIRP new_irp); /* for user app waitting */
+  void abort_pending_irp(PIRP *irp_ptr, NTSTATUS status);
+  #define uld_test_dfl(udrv,_DFL_flag) \
+    ((udrv)->flag_##_DFL_flag)
+  #define uld_set_dfl(udrv,_DFL_flag) \
+    ((udrv)->flag_##_DFL_flag=1)
+  #define uld_clear_dfl(udrv,_DFL_flag) \
+    ((udrv)->flag_##_DFL_flag=0)
+  #define uld_test_and_set_dfl(udrv,_DFL_flag) \
+    (InterlockedExchange(&(udrv)->flag_##_DFL_flag,1))
+  #define uld_atomic_test_dfl(udrv,_DFL_flag) \
+    ((udrv)->flag_##_DFL_flag)
+  #define uld_atomic_clear_dfl(udrv,_DFL_flag) \
+    (InterlockedExchange(&(udrv)->flag_##_DFL_flag,0))
+  #define uld_atomic_set_dfl(udrv,_DFL_flag) \
+    (InterlockedExchange(&(udrv)->flag_##_DFL_flag,1))
+    
+
+  #define uld_kwt_wq_init(udrv) \
+       do { \
+         KeInitializeEvent( &(udrv)->kwt_wake, NotificationEvent, FALSE); \
+          KeInitializeEvent( &(udrv)->kwt_stopped, NotificationEvent, TRUE); \
+         uld_atomic_clear_dfl(udrv,KWTKILL); \
+       } while(0)
+  #define uld_kwt_wake(udrv) \
+       KeSetEvent( &(udrv)->kwt_wake, 1, FALSE)
+  #define uld_kwt_wait(udrv) \
+       KeWaitForSingleObject( &(udrv)->kwt_wake, Executive, KernelMode, FALSE, NULL)
+  #define uld_kwt_confirm(udrv) \
+       KeClearEvent(&(udrv)->kwt_wake)
+  #define uld_kwt_test_and_set_prepared(udrv) \
+       (!KeResetEvent(&(udrv)->kwt_stopped))
+  #define uld_kwt_kill(udrv) \
+       do { uld_atomic_set_dfl(udrv,KWTKILL); \
+            KeSetEvent( &(udrv)->kwt_wake, 1, FALSE); } while(0)
+  #define uld_kwt_set_stopped(udrv) \
+       do { uld_atomic_clear_dfl(udrv,KWTKILL); \
+            KeSetEvent( &(udrv)->kwt_stopped, 1, FALSE) ; } while(0)
+  #define uld_kwt_wait_stopped(udrv) \
+       KeWaitForSingleObject( &(udrv)->kwt_stopped, Executive, KernelMode, FALSE, NULL)
+  /* KeReadStateEvent cannot be used on Win98 */
+  //#define uld_kwt_is_running(udrv) (!KeReadStateEvent(&(udrv)->kwt_stopped))
+  #define uld_kwt_is_running(udrv) \
+       (STATUS_SUCCESS != KeWaitForSingleObject( &(udrv)->kwt_stopped, Executive, KernelMode, FALSE, &ULD_LARGE_INTEGER_0))
+  // This variable has to be initialized by RtlConvertLongToLargeInteger(0) in DriverEntry
+  extern LARGE_INTEGER ULD_LARGE_INTEGER_0;
+#else
+  typedef void * ulan_do_bh_data_type;
+  #define SCHEDULE_BH(udrv) \
+    do{set_bit(UL_DFLB_ASK_BOTTOM,&(udrv->flags));}while(0)
+  #define INIT_UDRV_BH(udrv)
+  #define KILL_UDRV_BH(udrv)
+  #define DECLARE_UDRV_BH
+  #define uld_test_dfl(udrv,_DFL_flag) \
+    test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_set_dfl(udrv,_DFL_flag) \
+    set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_clear_dfl(udrv,_DFL_flag) \
+    clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_test_and_set_dfl(udrv,_DFL_flag) \
+    test_and_set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_test_dfl(udrv,_DFL_flag) \
+    test_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_clear_dfl(udrv,_DFL_flag) \
+    clear_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+  #define uld_atomic_set_dfl(udrv,_DFL_flag) \
+    set_bit(UL_DFLB_##_DFL_flag,&(udrv)->flags)
+#endif
+
+/* link watchdog timer definitions */
+#ifdef FOR_LINUX_KERNEL
+  void ulan_do_wd_timer(unsigned long data);
+  #define SCHEDULE_UDRV_WDTIM(udrv,expires) \
+       mod_timer(&(udrv)->wd_timer,expires);
+  #define INIT_UDRV_WDTIM(udrv) \
+    do{ \
+       init_timer(&(udrv)->wd_timer); \
+       (udrv)->wd_timer.function=ulan_do_wd_timer; \
+       (udrv)->wd_timer.data=(unsigned long)udrv; \
+    }while(0)
+  #define DONE_UDRV_WDTIM(udrv) \
+       del_timer(&(udrv)->wd_timer)
+  #define DECLARE_UDRV_WDTIM struct timer_list wd_timer
+#elif defined(_WIN32)
+  #define SCHEDULE_UDRV_WDTIM(udrv,expires)
+  #define INIT_UDRV_WDTIM(udrv)
+  #define DONE_UDRV_WDTIM(udrv)
+  #define DECLARE_UDRV_WDTIM
+#else
+  #define SCHEDULE_UDRV_WDTIM(udrv,expires) \
+    (udrv->wd_timer_expires=expires,\
+     set_bit(UL_DFLB_WDSCHED,&(udrv->flags)))
+  #define INIT_UDRV_WDTIM(udrv) \
+    (clear_bit(UL_DFLB_WDSCHED,&(udrv->flags)))
+  #define DONE_UDRV_WDTIM(udrv) \
+    (clear_bit(UL_DFLB_WDSCHED,&(udrv->flags)))
+  #define DECLARE_UDRV_WDTIM
+#endif
+
+/* compatible generic io-ports access */
+#ifdef _WIN32
+ #define ul_inb(port)   READ_PORT_UCHAR((PVOID)(port))
+ #define ul_outb(port,val) WRITE_PORT_UCHAR((PVOID)(port),val)
+#elif defined(__DJGPP__)
+ #include <pc.h>
+ #define ul_inb(port)   inportb(port)
+ #define ul_outb(port,val) outportb(port,val)
+#elif defined(CONFIG_OC_UL_DRV_SYSLESS)
+ #define ul_inb(port)   inb(port)
+ #define ul_outb(port,val) outb(port,val)
+#else
+ #define ul_inb(port)   inb(port)
+ #define ul_outb(port,val) outb(val,port)
+#endif
+
+/*******************************************************************/
+/* PCI support types */
+
+#if !defined(FOR_LINUX_KERNEL) && defined(UL_WITH_PCI)
+
+#ifndef PCI_ANY_ID
+#define PCI_ANY_ID 0xffff
+typedef struct pci_device_id {
+  USHORT vendor;
+  USHORT device;
+  USHORT subvendor;
+  USHORT subdevice;
+  USHORT class_val,clask_mask;
+  ULONG  driver_data;
+} pci_device_id_t;
+#endif /*PCI_ANY_ID*/
+
+typedef struct usb_device_id {
+  USHORT idVendor;
+  USHORT idProduct;
+  ULONG  driver_info;
+} usb_device_id_t;
+       
+       
+
+#endif /*!FOR_LINUX_KERNEL && UL_WITH_PCI*/
+
+/*******************************************************************/
+/* ulan file access structure */
+
+#define ULOP_MAGIC 0x754c2233
+
+struct ul_opchain;
+
+/* uLan driver operator/user structure pointed by file private/extension */
+typedef struct ul_opdata {
+       int     magic;          /* magic number */
+       ul_drv  *udrv;          /* uLan driver pointer */
+       struct ul_opdata *opnext, *opprew; /* per udrv clients bll */
+  #ifdef FOR_LINUX_KERNEL
+       struct file *file;      /* back ptr to file */
+  #elif defined(_WIN32)
+       PFILE_OBJECT  file;
+    PIRP   wait_irp;           /* IRP waitting for nonempty recchain */ 
+  #endif /* _WIN32 */
+       ul_mem_blk *message;    /* first block of prepared message */ 
+       ul_data_it data;        /* ul_mem_blk data iterator */
+  #ifdef FOR_LINUX_KERNEL
+       wait_queue_head_t wqrec; /* wait queue for received packet */
+  #endif
+       struct ul_opchain *recchain; /* received messages */
+       struct ul_opchain *filtchain; /* filter for incoming messages */
+} ul_opdata;
+
+/* list of filtered mesage types also used for per operator receive queue */
+typedef struct ul_opchain {
+       struct  ul_opchain *next; /* Cyklic BLL of received mesages */
+       struct  ul_opchain *prev; /* or input filters */
+       ul_mem_blk *message;    /* first block of waiting message */ 
+       unsigned stamp;         /* unigue message number */
+       uchar    cmd;           /* command or service */
+       uchar    dadr;          /* destination address */
+       uchar    sadr;          /* source address */
+       uchar    state;         /* state of filtering */
+} ul_opchain;
+
+#define UL_OPST_FREE   0       /* free ul_opchain block */
+#define UL_OPST_ONCE   1       /* wait for message only once */
+#define UL_OPST_FILT   2       /* filter incomming messages */
+#define UL_OPST_MES    3       /* message on recchain list */
+#define UL_OPST_FILTNEW        4       /* new filter check for repeat */
+
+typedef int ul_chip_init_fnc(ul_drv *udrv, int port, int irq, int baud,
+                             long baudbase, int options);
+
+typedef struct ul_chip_type_ent {
+       char *chip_name;
+       ul_chip_init_fnc *chip_init;
+       int chip_flags;
+       int chip_chans;
+       int chip_options;
+}ul_chip_type_ent;
+
+#define UL_CHIPT_RQPORT        1       /* port number requested */
+#define UL_CHIPT_RQIRQ 2       /* irq umber requested */
+#define UL_CHIPT_PCI   4       /* pci type */
+#define UL_CHIPT_NOPROBE 8     /* do not probe if type undefined */
+
+
+/*******************************************************************/
+/* user space visible structures */
+
+typedef struct ul_msginfo {
+       int     dadr;           /* destignation address */
+       int     sadr;           /* source address */
+       int     cmd;            /* command/socket number */
+       int     flg;            /* message flags */
+       int     len;            /* length of frame */
+       unsigned stamp;         /* unigue message number */
+} ul_msginfo;
+
+/*******************************************************************/
+/* ioctl definitions */
+
+#ifdef _WIN32
+
+/* 32768-65535 are reserved for use by customers.*/
+#define FILE_DEVICE_ULAN  0x0000A000
+
+/* function codes 2048-4095 are reserved for customers. */
+#define UL_IOCTL_INDEX  0xA00
+
+#define UL_IO(function) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define UL_IOR(function,size) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define UL_IOW(function,size) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#else /* _WIN32 */
+
+#define        UL_IOCTL        0x75
+
+#define UL_IO(function)        _IO(UL_IOCTL,function)
+#define UL_IOR(function,size)  _IOR(UL_IOCTL,function,size)
+#define UL_IOW(function,size)  _IOW(UL_IOCTL,function,size)
+
+#endif /* _WIN32 */
+
+#define UL_DRV_VER     UL_IO(0x10)
+#define UL_NEWMSG      UL_IOW(0x11,ul_msginfo)
+#define UL_TAILMSG     UL_IOW(0x12,ul_msginfo)
+#define UL_FREEMSG     UL_IO(0x13)
+#define UL_ACCEPTMSG   UL_IOR(0x14,ul_msginfo)
+#define UL_ACTAILMSG   UL_IOR(0x15,ul_msginfo)
+#define UL_ADDFILT     UL_IOW(0x16,ul_msginfo)
+#define UL_ABORTMSG    UL_IO(0x17)
+#define UL_REWMSG      UL_IO(0x18)
+#define UL_INEPOLL     UL_IO(0x19)
+#define UL_WAITREC     UL_IO(0x1A)
+#define UL_SETMYADR    UL_IO(0x1B)  /* arg = new station address */
+#define UL_SETIDSTR    UL_IO(0x1C)  /* arg = "C" string */
+#define UL_SETBAUDRATE UL_IO(0x1D)  /* arg = new baudrate */
+#define UL_KLOGBLL     UL_IO(0x41)
+#define UL_STROKE      UL_IO(0x42)
+#define UL_DEBFLG      UL_IO(0x43)  /* arg = new debug mask */
+#define UL_HWTEST      UL_IO(0x44)  /* arg = test subcommand */
+
+/*******************************************************************/
+/* define unix error codes */
+
+#ifdef _WIN32
+
+#define ENOMEM (-STATUS_NO_MEMORY)
+#define EPERM  (-STATUS_PRIVILEGE_NOT_HELD)
+#define ENOMSG (-STATUS_END_OF_FILE)
+#define EINVAL (-STATUS_INVALID_PARAMETER)
+#define ENODEV (-STATUS_INVALID_PARAMETER)
+
+#endif /* _WIN32 */
+
+#ifdef __DJGPP__
+
+#define ENOMSG ENOENT
+
+#endif /* _WIN32 */
+
+/*******************************************************************/
+/* debug support */
+
+/* initial value for uld_debug_flg */
+#ifndef ULD_DEBUG_DEFAULT 
+  #ifndef UL_DRV_IN_LIB
+    #define ULD_DEBUG_DEFAULT (0x01|0x10|0x40)
+  #else
+    #define ULD_DEBUG_DEFAULT (0x01|0x40)
+  #endif
+#endif /* ULD_DEBUG_DEFAULT */
+
+#ifdef FOR_LINUX_KERNEL
+ #define UL_PRINTF printk
+#elif defined(_WIN32)
+ #define UL_PRINTF DbgPrint
+#elif defined(UL_DRV_IN_LIB)
+ #ifdef UL_LOG_ENABLE
+   int uld_printk(const char *format, ...) __attribute__((format(printf,1,2)));
+   void uld_printk_flush(void);
+   #define UL_PRINTF uld_printk
+ #else
+   #define uld_printk_flush(x)
+   #define UL_PRINTF(x,args...) 
+ #endif
+#else
+ #define UL_PRINTF printf
+#endif
+
+#ifdef UL_LOG_ENABLE
+ #define LOG_FATAL     if(uld_debug_flg&0x01) UL_PRINTF
+ #define LOG_CHIO      if(uld_debug_flg&0x02) UL_PRINTF
+ #define LOG_IRQ       if(uld_debug_flg&0x04) UL_PRINTF
+ #define LOG_MESSAGES  if(uld_debug_flg&0x08) UL_PRINTF
+ #define LOG_FAILS     if(uld_debug_flg&0x10) UL_PRINTF
+ #define LOG_SEQNUM    if(uld_debug_flg&0x20) UL_PRINTF
+ #define LOG_PORTS     if(uld_debug_flg&0x40) UL_PRINTF
+ #define LOG_FILEIO    if(uld_debug_flg&0x80) UL_PRINTF
+ #define LOG_FILTS     if(uld_debug_flg&0x100) UL_PRINTF
+ #define LOG_IAC       if(uld_debug_flg&0x200) UL_PRINTF
+ #define LOG_MSK_DISABLE  0x10000   /* for use with UL_DRV_IN_LIB */
+#else
+ #define LOG_FATAL(x,args...)
+ #define LOG_CHIO(x,args...)
+ #define LOG_IRQ(x,args...)
+ #define LOG_MESSAGES(x,args...)
+ #define LOG_FAILS(x,args...)
+ #define LOG_SEQNUM(x,args...)
+ #define LOG_PORTS(x,args...)
+ #define LOG_FILEIO(x,args...)
+ #define LOG_FILTS(x,args...)
+ #define LOG_IAC(x,args...)
+#endif
+
+#ifndef KERN_CRIT
+  #define KERN_CRIT
+#endif
+#ifndef KERN_ERR
+  #define KERN_ERR
+#endif
+#ifndef KERN_WARNING
+  #define KERN_WARNING
+#endif
+#ifndef KERN_INFO
+  #define KERN_INFO
+#endif
+
+#if (defined(CPU)&&(CPU>=586)||\
+     defined(CONFIG_X86_TSC))&&!defined(_WIN32)
+ #define RDTSC \
+   ({unsigned long l,h;\
+    asm volatile ("rdtsc" : "=a" (l), "=d" (h));\
+    l;\
+   })
+#else
+ #define RDTSC 0
+#endif
+
+#endif /* _LINUX_UL_HDEP_H */
diff --git a/ulan/host/ul_drv/ul_drv/ul_iac.c b/ulan/host/ul_drv/ul_drv/ul_iac.c
new file mode 100644 (file)
index 0000000..764ec4f
--- /dev/null
@@ -0,0 +1,271 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_iac.c     - ulan immetiately action command
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#include "ul_drv_iac.h"
+
+typedef struct ul_iac_chain {
+       struct ul_iac_chain *prev;
+       struct ul_iac_chain *next;
+       int cmd;
+        int op;
+       unsigned flg;
+       ul_msginfo msginfo;
+       char *ibuff;
+       ul_iac_data iac_data;
+       ul_iac_call_fnc *fnc;
+} ul_iac_chain;
+
+static void add_to_iac_chain(ul_iac_chain **chain,ul_iac_chain *member)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  if(!*chain) *chain=member->next=member->prev=member;
+  else {
+    ((volatile ul_iac_chain*)member)->next=*chain;
+    ((volatile ul_iac_chain*)member)->prev=(*chain)->prev;
+    UL_MB();
+    ((volatile ul_iac_chain*)(*chain))->prev->next=member;
+    ((volatile ul_iac_chain*)(*chain))->prev=member;
+  };
+  UL_DRV_UNLOCK;
+};
+
+static void del_from_iac_chain(ul_iac_chain **chain,ul_iac_chain *member)
+{
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  member->next->prev=member->prev;
+  member->prev->next=member->next;
+  if(*chain==member) 
+  { if(member->next==member) *chain=NULL;
+    else *chain=member->next;
+  };
+  UL_DRV_UNLOCK;
+};
+
+int ul_drv_add_iac(ul_drv *udrv,int cmd,int op,ul_iac_call_fnc *fnc,char *buff, unsigned len,unsigned flg,void *ctx)
+{
+  ul_iac_chain *member;
+  member=(ul_iac_chain*)MALLOC(sizeof(ul_iac_chain));
+  if(!member) return -ENOMEM;
+  memset(member,0,sizeof(ul_iac_chain));
+  member->cmd=cmd;
+  member->op=op;
+  member->flg=flg;
+  member->fnc=fnc;
+  member->iac_data.buff=buff;
+  member->iac_data.len=len;
+  member->iac_data.ctx=ctx;
+  add_to_iac_chain(&udrv->iac_chain,member);
+  LOG_IAC("ulan_add_iac : cmd %d\n", member->cmd);
+  return 0;
+}
+
+int ul_drv_del_iac(ul_drv *udrv,int cmd)
+{
+  ul_iac_chain *member,*next;
+  int r=-1;
+  member=udrv->iac_chain;
+  if(member) do
+  { next=member->next;
+    if(next==udrv->iac_chain) next=NULL;
+    if (member->cmd==cmd) {
+      del_from_iac_chain(&udrv->iac_chain,member);
+      if (member->flg&UL_IAC_BFL_FREEBUFF) FREE(member->iac_data.buff);
+      FREE(member);
+      r=0;
+      break;
+    }
+  } while((member=next)!=NULL);
+  return r;
+}
+
+INLINE int conv_iac_rc(int iac_rc) 
+{
+  if (iac_rc==UL_IAC_RC_PROC) return UL_RC_PROC;
+  if (iac_rc==UL_IAC_RC_FREEMSG) return UL_RC_FREEMSG;
+  return UL_IAC_RC_ERR;
+}
+
+/*******************************************************************/
+/* Message and frame proccessor for user commands */
+
+int uld_prmess_iac_s4(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_FRET;
+  return udrv->iac_ret_code;
+};
+
+int uld_prmess_iac_s3(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  udrv->con_flg=0; /* UL_END */
+  UL_FCALL2(uld_sndend,uld_prmess_iac_s4);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_iac_s2(ul_drv *udrv, int ret_code)
+{
+  ul_iac_data *iac_data;
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  iac_data=&(udrv->iac_act->iac_data);
+  if (iac_data->len!=iac_data->ptr) {
+    udrv->char_buff=iac_data->buff[iac_data->ptr];
+    UL_FCALL(*udrv->fnc_sndch);
+    iac_data->ptr++;
+  } else 
+    UL_FNEXT(uld_prmess_iac_s3);
+  return UL_RC_PROC;
+};
+
+
+int uld_prmess_iac_s1(ul_drv *udrv, int ret_code)
+{
+  udrv->con_sadr=udrv->my_adr; 
+  udrv->con_cmd&=0x7f;
+  udrv->con_flg=4; /* UL_BEG */
+  UL_FCALL2(uld_sndbeg,uld_prmess_iac_s2);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_iac_r5(ul_drv *udrv, int ret_code)
+{
+  ul_iac_data *iac_data;
+  struct ul_iac_chain *iac_act;
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  iac_act=udrv->iac_act;
+  iac_data=&(iac_act->iac_data);
+  UL_FRET;
+  return conv_iac_rc(udrv->iac_act->fnc(udrv,&iac_act->msginfo,iac_act->ibuff,iac_data));
+};
+
+
+int uld_prmess_iac_r4(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  udrv->con_flg=0; /* UL_END */
+  UL_FCALL2(uld_recend,uld_prmess_iac_r5);
+  return UL_RC_PROC;
+};
+
+int uld_prmess_iac_r3(ul_drv *udrv, int ret_code)
+{
+  ul_iac_data *iac_data;
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  iac_data=&(udrv->iac_act->iac_data);
+  if(!(udrv->char_buff&0xFF00)) {
+    iac_data->buff[iac_data->ptr]=udrv->char_buff;
+    iac_data->ptr++; 
+    iac_data->len++;
+    UL_FCALL(*udrv->fnc_recch);
+    return UL_RC_PROC;
+  }
+  UL_FNEXT(uld_prmess_iac_r4);
+  return UL_RC_PROC;
+}
+
+int uld_prmess_iac_r2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_prmess_error);return UL_RC_EPRMESS;};
+  UL_FCALL2(*udrv->fnc_recch,uld_prmess_iac_r3);
+  return UL_RC_PROC;
+}
+
+int uld_prmess_iac_r1(ul_drv *udrv, int ret_code)
+{
+  udrv->con_flg=8; /* UL_BEG */
+  UL_FCALL2(uld_recbeg,uld_prmess_iac_r2);
+  return UL_RC_PROC;
+};
+
+int get_iac_op(ul_drv *udrv, uchar cmd)
+{
+  ul_iac_chain *member,*next;
+  member=udrv->iac_chain;
+  if(member) do
+  { next=member->next;
+    if(next==udrv->iac_chain) next=NULL;
+    if (member->cmd==cmd) {
+      udrv->iac_act=member;
+      return member->op;
+    }
+  } while((member=next)!=NULL);
+  return -1;
+}
+
+int uld_prmess_iac(ul_drv *udrv, int ret_code)
+{
+  ul_iac_data *iac_data;
+  struct ul_iac_chain *iac_act;
+  ul_mem_blk *mes;
+  int r;
+
+  ret_code=UL_RC_PROC;
+  mes=udrv->con_message;
+  r=get_iac_op(udrv,udrv->con_cmd);
+  if (r==-1) {
+    UL_FRET;
+    return ret_code;
+  }
+  iac_act=udrv->iac_act;
+  iac_data=&(iac_act->iac_data);
+  iac_act->msginfo.dadr=UL_BLK_HEAD(mes).dadr;
+  iac_act->msginfo.sadr=UL_BLK_HEAD(mes).sadr;
+  iac_act->msginfo.flg=UL_BLK_HEAD(mes).flg;
+  iac_act->msginfo.len=UL_BLK_HEAD(mes).len;
+  if (iac_act->msginfo.len>UL_BLK_SIZE)
+    iac_act->msginfo.len=UL_BLK_SIZE;
+  iac_act->ibuff=UL_BLK_FDATA(mes);
+  switch (r) {
+    case UL_IAC_OP_CALLBACK:
+      ret_code=conv_iac_rc(udrv->iac_act->fnc(udrv,&iac_act->msginfo,iac_act->ibuff,iac_data));
+      break;
+    case UL_IAC_OP_SNDBUFF:
+    case UL_IAC_OP_SND:
+      if (udrv->con_flg&2) {
+        udrv->iac_ret_code=UL_RC_FREEMSG;
+        iac_data->ptr=0;
+        UL_FNEXT(uld_prmess_iac_s1);
+        if (r==UL_IAC_OP_SND)
+          udrv->iac_ret_code=conv_iac_rc(udrv->iac_act->fnc(udrv,&iac_act->msginfo,iac_act->ibuff,iac_data));
+        return UL_RC_PROC;
+      }
+      break;
+    case UL_IAC_OP_REC:
+      if (udrv->con_flg&2) {
+        iac_data->ptr=0;
+       iac_data->len=0;
+        UL_FNEXT(uld_prmess_iac_r1);
+        return UL_RC_PROC;
+      }
+    default:
+      break;
+  }
+  UL_FRET;
+  return ret_code;
+}
diff --git a/ulan/host/ul_drv/ul_drv/ul_inlib.c b/ulan/host/ul_drv/ul_drv/ul_inlib.c
new file mode 100644 (file)
index 0000000..7b2dc2e
--- /dev/null
@@ -0,0 +1,511 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_inlib.c   - interface for driver compiled into library
+                  linked directly with application
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Interface for driver in library */
+
+/* needs for UL_DEV_NAME */
+#include <ul_lib/ul_fddir.h> 
+
+#define UL_MINORS 4
+ul_drv *ul_drv_arr[UL_MINORS]={[0 ... UL_MINORS-1]=NULL};
+
+void uld_check_timeout(void);
+ul_drv *uld_try_open_new(const char *dev_name,
+                         const char *options, int minor);
+
+ul_opdata *ul_open(const char *dev_name, const char *options)
+{
+  ul_drv *udrv;
+  ul_opdata *opdata;
+  unsigned int minor;
+  const char *p;
+  /*if(dev_name==NULL) { errno=ENODEV; return NULL;} */
+  if(dev_name==NULL) dev_name=UL_DEV_NAME;
+  if(!strncasecmp(dev_name,"COM",3)){  /* strnicmp */
+    p=dev_name+3;
+    if(*p<'1') { errno=ENODEV; return NULL;}
+    minor=*p-'1';
+  }else{ if(!strncmp(dev_name,"/dev/ulan",9)){
+      p=dev_name+9;
+    }else {
+      p=dev_name;
+    }
+    if(!*p||(*p==' ')||(*p==':')) minor=0;
+    else{
+      if(*p<'0') { errno=ENODEV; return NULL;}
+      minor=*p-'0';
+    }
+  }
+  if (minor >= UL_MINORS) { errno=ENODEV; return NULL;}
+ #ifndef CONFIG_OC_UL_DRV_SYSLESS
+  if (!ul_drv_arr[minor]){
+    ul_drv_arr[minor]=uld_try_open_new(dev_name,options,minor);
+  }
+ #endif /* CONFIG_OC_UL_DRV_SYSLESS */
+  if (!ul_drv_arr[minor]){
+    errno=ENODEV; return NULL;
+  }
+  udrv=ul_drv_arr[minor];
+
+  if(!(opdata=MALLOC(sizeof(ul_opdata))))
+  { errno=ENOMEM;
+    return NULL;
+  };
+  memset(opdata,0,sizeof(ul_opdata));
+  /* opdata->file=file; */
+  opdata->magic=ULOP_MAGIC;
+  opdata->message=NULL;
+  opdata->udrv=udrv;
+  /* init_waitqueue_head(&opdata->wqrec); */
+  opdata->opprew=NULL;
+  opdata->opnext=NULL;
+  opdata->recchain=NULL;
+  opdata->filtchain=NULL;
+  { /* add us onto list of clients of udrv */
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    opptr=udrv->operators;
+    if(opptr) {opptr->opprew=opdata;opdata->opnext=opptr;};
+    UL_MB();
+    udrv->operators=opdata;
+    UL_DRV_UNLOCK;
+  };
+  uld_printk_flush();
+  return opdata;
+}
+
+int ul_close(ul_opdata* opdata)
+{
+  ul_opchain *opmember;
+
+  if (opdata->message) ulan_freemsg(opdata);
+  { /* delete us from list of clients of udrv */
+    ul_drv *udrv=opdata->udrv;
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    if((opptr=opdata->opnext)) opptr->opprew=opdata->opprew;
+    if((opptr=opdata->opprew)) opptr->opnext=opdata->opnext;
+    else udrv->operators=opdata->opnext;
+    UL_DRV_UNLOCK;
+    if(udrv->irq>0) ul_synchronize_irq(udrv->irq);
+  };
+  schedule();
+  while((opmember=opdata->recchain))
+  {
+    del_from_opchain(&opdata->recchain,opmember);
+    if(opmember->message) ul_dec_ref_cnt(opmember->message);
+    FREE(opmember);
+  };
+  while((opmember=opdata->filtchain))
+  {
+    del_from_opchain(&opdata->filtchain,opmember);
+    FREE(opmember);
+  };
+  FREE(opdata);
+
+  /* UL_PRINTF("uLan : printudrvbll\n"); */
+  /* printudrvbll(opdata->udrv); */
+  
+  uld_printk_flush();
+  return 0;
+}
+
+ssize_t        ul_read(ul_opdata* opdata, void *buf, size_t count)
+{
+  int cn;
+  int len;
+
+  if(!opdata->message)
+  {
+    errno=ENOMSG;
+    return -1;
+  }
+
+  if(opdata->data.pos+count>UL_BLK_HEAD(opdata->data.head_blk).len)
+   count=UL_BLK_HEAD(opdata->data.head_blk).len-opdata->data.pos;
+
+  cn=count;
+  while(cn>0)
+  {
+    if(!ul_di_adjust(&opdata->data))
+    {
+      memset(buf,0,cn);
+      cn=0;
+      break;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    memcpy(buf,ul_di_byte(&opdata->data),len);
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  return count-cn;
+};
+
+ssize_t        ul_write(ul_opdata* opdata, const void *buf, size_t count)
+{
+  int cn;
+  int len;
+  ul_mem_blk *blk;
+
+  if(!opdata->message)
+  {
+    errno=ENOMSG;
+    return -1;
+  }
+
+  cn=count;
+  while(cn>0)
+  {
+    while(!ul_di_adjust(&opdata->data))
+    {
+      if(!(blk=ul_alloc_blk(opdata->udrv))) 
+        {count-=cn;cn=0;break;};
+      memset(UL_BLK_NDATA(blk),0,UL_BLK_SIZE);
+      opdata->data.blk->next=blk;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    memcpy(ul_di_byte(&opdata->data),buf,len);
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  if(opdata->data.pos>UL_BLK_HEAD(opdata->data.head_blk).len)
+    UL_BLK_HEAD(opdata->data.head_blk).len=opdata->data.pos;
+
+  return count-cn;
+};
+
+int ul_newmsg(ul_opdata* opdata,const ul_msginfo *msginfo)
+{ int ret;
+  ret=ulan_newmsg(opdata,msginfo);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_tailmsg(ul_opdata* opdata,const ul_msginfo *msginfo)
+{ int ret;
+  ret=ulan_tailmsg(opdata,msginfo);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_freemsg(ul_opdata* opdata)
+{ int ret;
+  ret=ulan_freemsg(opdata);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_acceptmsg(ul_opdata* opdata,ul_msginfo *msginfo)
+{ int ret;
+  ret=ulan_acceptmsg(opdata,msginfo);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_actailmsg(ul_opdata* opdata,ul_msginfo *msginfo)
+{ int ret;
+  ret=ulan_actailmsg(opdata,msginfo);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_addfilt(ul_opdata* opdata,const ul_msginfo *msginfo)
+{ int ret;
+  ret=ulan_addfilt(opdata,msginfo);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_abortmsg(ul_opdata* opdata)
+{ int ret;
+  ret=ulan_abortmsg(opdata);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_rewmsg(ul_opdata* opdata)
+{ int ret;
+  ret=ulan_rewmsg(opdata);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_inepoll(ul_opdata* opdata)
+{ int ret;
+ #if 1 /* Processing of arrived or processed messages */
+  uld_check_timeout();
+  if(uld_test_dfl(opdata->udrv,ASK_BOTTOM))
+  {
+    ulan_do_bh(opdata->udrv);
+  }
+ #endif
+  ret=ulan_inepoll(opdata);
+  uld_printk_flush();
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_stroke(ul_opdata* opdata)
+{
+  ul_drv *udrv;
+  if(!opdata->udrv) return -ENODEV;
+  udrv=opdata->udrv;
+  ulan_stroke(udrv, 1);
+  return 0;
+}
+
+int ul_hwtest(ul_opdata* opdata, unsigned int fnc)
+{ int ret;
+  ret=ulan_hwtest(opdata,fnc);
+  if(ret<0) {errno=EINVAL;ret=-1;}
+  return ret;
+}
+
+int ul_setmyadr(ul_opdata* opdata, int newadr)
+{
+  int ret;
+  ret=ulan_setmyadr(opdata, newadr);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_setidstr(ul_opdata* opdata, const char *idstr)
+{
+  int ret;
+  ret=ulan_setidstr(opdata, idstr);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_setbaudrate(ul_opdata* opdata, int baudrate)
+{
+  int ret;
+  ret=ulan_setbaudrate(opdata, baudrate);
+  if(ret<0) {errno=-ret;ret=-1;}
+  return ret;
+}
+
+int ul_drv_debflg(ul_opdata* opdata,int debug_msk)
+  {uld_debug_flg=debug_msk;return uld_debug_flg;};
+
+#ifdef UL_LOG_ENABLE
+
+#include <stdarg.h>
+
+#define ULD_PRINTK_BUF_LEN 4096
+char uld_printk_buf[ULD_PRINTK_BUF_LEN];
+char *uld_printk_pin=uld_printk_buf;
+char *uld_printk_pout=uld_printk_buf;
+
+int uld_printk(const char *format, ...)
+{
+  int len,rest,ret;
+  char buf[255];
+  va_list va=0;
+  UL_IRQ_LOCK_FINI
+  if(uld_debug_flg&LOG_MSK_DISABLE) return 0;
+  va_start(va,format);
+  ret=vsprintf(buf,format,va);
+  va_end(va);
+  len=strlen(buf);
+  UL_IRQ_LOCK;
+  rest=uld_printk_buf+ULD_PRINTK_BUF_LEN-uld_printk_pin;
+  if(len>=rest){
+    memcpy(uld_printk_pin,buf,rest); len-=rest;
+    memcpy(uld_printk_buf,buf,len);
+    uld_printk_pin=uld_printk_buf+len;
+  }else{
+    memcpy(uld_printk_pin,buf,len); uld_printk_pin+=len;
+  }
+  UL_IRQ_UNLOCK;
+  return ret;
+}
+
+void uld_printk_flush(void)
+{
+  char *pout,*pin;
+  UL_IRQ_LOCK_FINI
+  UL_IRQ_LOCK;
+  pin=uld_printk_pin;
+  pout=uld_printk_pout;
+  UL_IRQ_UNLOCK;
+  if(pin==pout) return;
+  if(pin>pout){
+    fwrite(pout,pin-pout,1,stderr); uld_printk_pout=pin;
+  }else{
+    fwrite(pout,uld_printk_buf+ULD_PRINTK_BUF_LEN-pout,1,stderr);
+    fwrite(uld_printk_buf,pin-uld_printk_buf,1,stderr);
+    uld_printk_pout=pin;
+  }
+  fflush(stderr);
+}
+
+#endif /* UL_LOG_ENABLE */
+
+void uld_check_timeout(void)
+{
+  int i;
+  ul_drv *udrv;
+ #ifdef JIFFIES_FROM_GETTIMEOFDAY
+  struct timeval actual;
+  long int new_expires;
+  static long int old_expires;
+ #endif /* JIFFIES_FROM_GETTIMEOFDAY */
+ #ifdef __DJGPP__
+  UL_DRV_LOCK_FINI
+ #endif /* __DJGPP__ */
+ #ifdef JIFFIES_FROM_GETTIMEOFDAY
+  gettimeofday(&actual,NULL);
+  uld_jiffies=actual.tv_usec+actual.tv_sec*ULD_HZ;
+ #endif /* JIFFIES_FROM_GETTIMEOFDAY */
+  for(i=0;i<UL_MINORS;i++)
+  {
+    if((udrv=ul_drv_arr[i])!=NULL)
+    {
+      if(uld_test_dfl(udrv,WDSCHED))
+      { 
+       #ifdef JIFFIES_FROM_GETTIMEOFDAY
+        if(old_expires!=udrv->wd_timer_expires)
+        { UL_DRV_LOCK;
+          new_expires=uld_jiffies+ULD_HZ/18;
+          if((new_expires-udrv->wd_timer_expires)<0)
+            new_expires=udrv->wd_timer_expires;
+          old_expires=udrv->wd_timer_expires=new_expires;
+          UL_DRV_UNLOCK;
+          LOG_IRQ("sched timeout %ld at time %ld\n",new_expires,uld_jiffies);
+        }
+       #elif 1
+        { static long int old_expires;
+          if(old_expires!=udrv->wd_timer_expires)
+            LOG_IRQ("sched timeout %ld at time %ld\n",
+                    old_expires=udrv->wd_timer_expires,jiffies);
+        }
+       #endif /* JIFFIES_FROM_GETTIMEOFDAY */
+        if((udrv->wd_timer_expires-jiffies)<0)
+        { uld_clear_dfl(udrv,WDSCHED);
+          ulan_do_wd_timer((unsigned long)udrv);
+          /* uld_timeout(udrv); */
+          /* printudrvfncstack(udrv) */
+        }
+      }
+      /* Call bottom halves as needed */
+      if(uld_test_dfl(udrv,ASK_BOTTOM))
+      {
+        uld_clear_dfl(udrv,ASK_BOTTOM);
+        ulan_do_bh(udrv);
+      }
+    }
+  }
+ #ifdef __DJGPP__
+  #if 1
+  __save_flags(ul_irq_lock_flags);
+  if(!(ul_irq_lock_flags&0x0200))
+  { LOG_FATAL(KERN_CRIT "Somebody disables IRQ !!!!!\n");
+    __sti();
+  }
+  #endif
+  __dpmi_yield();
+ #endif
+}
+
+#ifndef CONFIG_OC_UL_DRV_SYSLESS
+
+typedef struct uld_dev_params{
+  int  port;
+  int  irq;
+  int  baud;
+  int  my_adr;
+  long baudbase;
+}uld_dev_params_t;
+
+static const uld_dev_params_t
+  uld_dev_params_defaults[4]={
+    {0x3f8,0x4,19200,2,0},
+    {0x2f8,0x3,19200,2,0},
+    {0x3e8,0x5,19200,2,0},
+    {0x2e8,0x5,19200,2,0}
+  };
+
+ul_drv *uld_try_open_new(const char *dev_name,
+                         const char *options, int minor)
+{
+  uld_dev_params_t params;
+  const char *p,*r;
+  char *s;
+  char chip_name[16];
+  if(minor<4) params=uld_dev_params_defaults[minor];
+  else  params=uld_dev_params_defaults[0];
+  chip_name[0]=0;
+  p=dev_name;
+  while(*p){
+    while(*p&&(*p!=' ')&&(*p!=':')) p++;
+    while(*p&&((*p==' ')||(*p==':'))) p++;
+    r=p;
+    while(*r&&(*r!=' ')&&(*r!=':')&&((*r<'0')||(*r>'9'))) r++;
+    switch (*p) {
+      case 'p': params.port=strtol(r,NULL,0); break;
+      case 'i': params.irq=strtol(r,NULL,0); break;
+      case 'b': params.baud=strtol(r,NULL,0); break;
+      case 'a': params.my_adr=strtol(r,NULL,0); break;
+      case 'c': for(s=chip_name,p++;*p&&(*p!=':');p++,s++)
+                   *s=*p;
+               *s=0;
+                break;
+    }
+  }
+  /* printf("port %d irq %d baud %d my_adr %d\n",
+    params.port,params.irq,params.baud,params.my_adr);
+  return NULL; */
+  return ul_drv_new(params.port,params.irq,params.baud,params.my_adr,
+                   chip_name[0]?chip_name:NULL,params.baudbase);
+}
+
+#else /* CONFIG_OC_UL_DRV_SYSLESS */
+
+int ul_drv_add_dev(ul_drv *udrv) 
+{
+  int minor;
+  for(minor=0;minor<UL_MINORS;minor++) {
+    if (ul_drv_arr[minor]==NULL) {
+      ul_drv_arr[minor]=udrv;
+      return 0;
+    }
+  }
+  return -1;
+}
+
+#endif /* CONFIG_OC_UL_DRV_SYSLESS */
diff --git a/ulan/host/ul_drv/ul_drv/ul_kdmnt.c b/ulan/host/ul_drv/ul_drv/ul_kdmnt.c
new file mode 100644 (file)
index 0000000..1b0a30c
--- /dev/null
@@ -0,0 +1,665 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_kdmnt.c   - Windows NT KMD specific support
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+//-------------------------------------------------------------------
+//
+// Declare forward function references
+//
+
+VOID UnloadDriver (IN PDRIVER_OBJECT DriverObject);
+
+BOOLEAN ReportUsage(IN PDRIVER_OBJECT DriverObject,
+                   IN PDEVICE_OBJECT DeviceObject,
+                    IN INTERFACE_TYPE InterfaceType,
+                    IN ULONG BusNumber,
+                    IN PHYSICAL_ADDRESS PortAddress,
+                   IN LONG PortRange,
+                   IN KIRQL IRQLine,
+                    IN BOOLEAN *ConflictDetected);
+
+//---------------------------------------------------------------------------
+// ReportUsage
+//
+// Description:
+//  This routine registers (reports) the I/O and IRQ usage for this driver.
+//
+// Arguments:
+//      DriverObject    - Pointer to the driver object
+//      DeviceObject    - Pointer to the Device object
+//      PortAddress     - Address of I/O port used
+//      ConflictDetected - TRUE if a resource conflict was detected.
+//
+// Return Value:
+//      TRUE    - If a Resource conflict was detected
+//      FALSE   - If no conflict was detected
+//
+BOOLEAN ReportUsage(IN PDRIVER_OBJECT DriverObject,
+                   IN PDEVICE_OBJECT DeviceObject,
+                   IN INTERFACE_TYPE InterfaceType,
+                    IN ULONG BusNumber,
+                    IN PHYSICAL_ADDRESS PortAddress,
+                   IN LONG PortRange,
+                   IN KIRQL IRQLine,
+                    IN BOOLEAN *ConflictDetected)
+{
+  ULONG sizeOfResourceList;
+  PCM_RESOURCE_LIST resourceList;
+  PCM_FULL_RESOURCE_DESCRIPTOR nextFrd;
+  PCM_PARTIAL_RESOURCE_DESCRIPTOR partial;
+
+  //
+  // The size of the resource list is going to be one full descriptor
+  // which already has one partial descriptor included, plus another
+  // partial descriptor. One partial descriptor will be for the
+  // interrupt, and the other for the port addresses.
+  //
+
+  sizeOfResourceList = sizeof(CM_FULL_RESOURCE_DESCRIPTOR);
+
+  //
+  // The full resource descriptor already contains one
+  // partial.  Make room for one more.
+  //
+  // It will hold the irq "prd", and the port "prd".
+  //     ("prd" = partial resource descriptor)
+  //
+
+  sizeOfResourceList += sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
+
+  //
+  // Now we increment the length of the resource list by field offset
+  // of the first frd.   This will give us the length of what preceeds
+  // the first frd in the resource list.
+  //    (frd = full resource descriptor)
+  //
+
+  sizeOfResourceList += FIELD_OFFSET(CM_RESOURCE_LIST, List[0]);
+
+  resourceList = ExAllocatePool(PagedPool, sizeOfResourceList);
+
+  if (!resourceList) {
+    return FALSE;
+  }
+
+  //
+  // Zero out the list
+  //
+
+  RtlZeroMemory(resourceList, sizeOfResourceList);
+
+  resourceList->Count = 1;
+  nextFrd = &resourceList->List[0];
+
+  nextFrd->InterfaceType = InterfaceType;
+  nextFrd->BusNumber = BusNumber;
+
+  //
+  // We are going to report port addresses and interrupt
+  //
+
+  nextFrd->PartialResourceList.Count = 2;
+
+  //
+  // Now fill in the port data.  We don't wish to share
+  // this port range with anyone.
+  //
+  // Note: the port address we pass in is the one we got
+  // back from HalTranslateBusAddress.
+  //
+  // CmResourceShareDriverExclusive
+  // CmResourceShareDeviceExclusive
+  // CmResourceShareShared
+
+  partial = &nextFrd->PartialResourceList.PartialDescriptors[0];
+
+  partial->Type = CmResourceTypePort;
+  partial->ShareDisposition = CmResourceShareDeviceExclusive;
+  partial->Flags = CM_RESOURCE_PORT_IO;
+  partial->u.Port.Start = PortAddress;
+  partial->u.Port.Length = PortRange;
+
+  partial++;
+
+  //
+  // Now fill in the irq stuff.
+  //
+  // Note: for IoReportResourceUsage, the Interrupt.Level and
+  // Interrupt.Vector are bus-specific level and vector, just
+  // as we passed in to HalGetInterruptVector, not the mapped
+  // system vector we got back from HalGetInterruptVector.
+  //
+
+  partial->Type = CmResourceTypeInterrupt;
+  partial->u.Interrupt.Level = IRQLine;
+  partial->u.Interrupt.Vector = IRQLine;
+  partial->ShareDisposition = InterfaceType==Isa? 
+                                 CmResourceShareDeviceExclusive:
+                                 CmResourceShareShared;
+  partial->Flags = InterfaceType==Isa?
+                     CM_RESOURCE_INTERRUPT_LATCHED:
+                    CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
+
+  /* Claim resources for Driver */
+  /*IoReportResourceUsage(
+      NULL,
+      DriverObject,
+      resourceList,
+      sizeOfResourceList,
+      NULL,
+      NULL,
+      0,
+      FALSE,
+      ConflictDetected);*/
+
+  /* Claim resources for individual DeviceObject */
+  IoReportResourceUsage(
+      NULL,
+      DriverObject,
+      NULL,
+      0,
+      DeviceObject,
+      resourceList,
+      sizeOfResourceList,
+      FALSE,
+      ConflictDetected);
+
+  //
+  // The above routine sets the BOOLEAN parameter ConflictDetected
+  // to TRUE if a conflict was detected.
+  //
+
+  ExFreePool(resourceList);
+
+  return (*ConflictDetected);
+}
+
+
+//-------------------------------------------------------------------
+// DriverEntry for WinNT style KMD
+//
+// Description:
+//  NT device Driver Entry point
+//
+// Arguments:
+//      DriverObject    - Pointer to this device's driver object
+//      RegistryPath    - Pointer to the Unicode regsitry path name
+//
+// Return Value:
+//      NTSTATUS
+//
+NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
+{
+    PDEVICE_OBJECT deviceObject = NULL;
+    NTSTATUS status, ioConnectStatus;
+    UNICODE_STRING uniNtNameString;
+    UNICODE_STRING uniWin32NameString;
+    UNICODE_STRING uniRegPath;
+    INTERFACE_TYPE InterfaceType;
+    ULONG BusNumber;
+    PCI_SLOT_NUMBER SlotNumber;
+    KIRQL irql;
+    KIRQL IRQLine;
+    KIRQL IRQLevel;
+    KIRQL OldIrql;
+    KAFFINITY Affinity;
+    LONG TmpLong;
+    LONG PortRange;
+    LONG BaudRate;
+    LONG BaudBase;
+    LONG MyAddr;
+    LONG BufferSize;
+    LONG ScanForPCI;
+    ULONG MappedVector=0, AddressSpace = 1;
+    PULAN_DEVICE_EXTENSION extension;
+    BOOLEAN ResourceConflict;
+    PHYSICAL_ADDRESS InPortAddr, OutPortAddr;
+    int ChipOptions=0;
+
+    ULD_LARGE_INTEGER_0=RtlConvertLongToLargeInteger(0);
+
+    uLan_DbgPrint("uLan v" UL_DRV_VERSION " Enter the driver!\n");
+    uLan_DbgPrint("uLan: " __DATE__ " " __TIME__ "\n");
+
+    //
+    // Create counted string version of our device name.
+    //
+
+    RtlInitUnicodeString(&uniNtNameString, NT_DEVICE_NAME);
+
+    //
+    // Default configuration
+    //
+
+    ScanForPCI=0;
+    InterfaceType = Isa;
+    BusNumber = 0;
+    InPortAddr.LowPart = DEF_PORT_ADDRESS;
+    InPortAddr.HighPart = 0;
+    PortRange = DEF_PORT_RANGE;
+    IRQLine = DEF_IRQ_LINE;
+    BaudRate = DEF_BAUD_RATE;
+    BaudBase = 0;
+    BufferSize=0x8000;
+    MyAddr = DEF_MY_ADDR;
+
+    //
+    // Get the configuration information from the Registry
+    //
+
+    /* RtlInitUnicodeString(&uniRegPath,RegistryPath->Buffer); */
+    /* RtlCopyUnicodeString(&uniRegPath,RegistryPath); */
+
+    status=STATUS_SUCCESS;
+    RtlInitUnicodeString(&uniRegPath, NULL);
+    uniRegPath.MaximumLength = RegistryPath->Length + sizeof(L"\\Parameters")+1;
+    uniRegPath.Buffer = ExAllocatePool(PagedPool, uniRegPath.MaximumLength*sizeof(WCHAR));
+
+    if (!uniRegPath.Buffer) {
+        uLan_DbgPrint("uLan: ExAllocatePool failed for Path in DriverEntry\n");
+        status = STATUS_UNSUCCESSFUL;
+    }
+    else
+    {
+        RtlZeroMemory(uniRegPath.Buffer,uniRegPath.MaximumLength*sizeof(WCHAR));
+        RtlAppendUnicodeStringToString(&uniRegPath, RegistryPath);
+        RtlAppendUnicodeToString(&uniRegPath, L"\\Parameters");
+    }
+
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"ScanForPCI",&ScanForPCI);
+    if (NT_SUCCESS(status))
+       status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Port Address",&InPortAddr.LowPart);
+    if (NT_SUCCESS(status))
+       status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Port Range",&PortRange);
+    TmpLong=IRQLine;
+    if (NT_SUCCESS(status))
+       status=ulan_GetRegistryDword(uniRegPath.Buffer,L"IRQ Line",&TmpLong);
+    IRQLine=(KIRQL)TmpLong;
+    IRQLevel=(KIRQL)TmpLong;
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Baud Rate",&BaudRate);
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Baud Base",&BaudBase);
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"My Addr",&MyAddr);
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Buffer Size",&BufferSize);
+    TmpLong=uld_debug_flg;
+    if (NT_SUCCESS(status))
+        status=ulan_GetRegistryDword(uniRegPath.Buffer,L"Debug",&TmpLong);
+    uld_debug_flg=TmpLong;
+    if(uniRegPath.Buffer)
+       ExFreePool(uniRegPath.Buffer);
+    if (!NT_SUCCESS(status)) {
+        uLan_DbgPrint("uLan: GetConfiguration failed\n");
+        return status;
+    }
+
+   #ifdef UL_WITH_PCI
+    if(ScanForPCI){
+        pci_device_id_t *device_id;
+        uLan_DbgPrint("uLan: Calling ScanForPCICard\n");
+        if(ScanForPCICard(&BusNumber,&SlotNumber,TRUE,&device_id)){
+           /*PCI_COMMON_CONFIG PCIConfig;*/
+            /*HalGetBusData(PCIConfiguration,BusNumber,SlotNumber.u.AsULONG,
+                             PCIConfig,sizeof(PCIConfig));*/
+            uLan_DbgPrint("uLan: ScanForPCICard found slot %02X:%02X.%1X\n",
+                (int)BusNumber,(int)SlotNumber.u.bits.DeviceNumber,
+                (int)SlotNumber.u.bits.FunctionNumber);
+            InterfaceType=PCIBus;
+            ChipOptions=device_id->driver_data; /*0x16954000*/
+        }
+    }
+   #endif /*UL_WITH_PCI*/
+
+    //
+    // Create the device object, multi-thread access (FALSE)
+    //
+
+    status = IoCreateDevice(DriverObject, sizeof(ULAN_DEVICE_EXTENSION),
+                            &uniNtNameString, FILE_DEVICE_UNKNOWN, 0,
+                            /* TRUE */ FALSE, &deviceObject);
+
+    if (!NT_SUCCESS (status) ) {
+        uLan_DbgPrint("uLan: IoCreateDevice failed\n");
+        return status;
+    }
+
+    //
+    // Set the FLAGS field
+    //
+
+    deviceObject->Flags |= DO_BUFFERED_IO;
+
+    extension = (PULAN_DEVICE_EXTENSION) deviceObject->DeviceExtension;
+    extension->flag_CHIPOK=0;
+
+    //
+    // Claim PnP busses resources
+    //
+
+   #ifdef UL_WITH_PCI
+    if(InterfaceType!=Isa){
+        PCM_RESOURCE_LIST  AllocatedResources;
+        PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+        int PartialCount, i;
+        InPortAddr.LowPart=IRQLine=0;
+        status = HalAssignSlotResources(RegistryPath,NULL,DriverObject,
+                     deviceObject,InterfaceType,BusNumber,
+                     SlotNumber.u.AsULONG,&AllocatedResources);
+        
+        if(!AllocatedResources->Count)
+            status = STATUS_INSUFFICIENT_RESOURCES;
+        if(NT_SUCCESS(status)){
+            PartialCount=AllocatedResources->List[0].PartialResourceList.Count;
+            PartialDescriptor=AllocatedResources->List[0].PartialResourceList.PartialDescriptors;
+            for(i=0;i<PartialCount;i++){
+                if((PartialDescriptor[i].Type==CmResourceTypePort)&&
+                  (!InPortAddr.LowPart)){
+                    InPortAddr=PartialDescriptor[i].u.Port.Start;
+                    PortRange=PartialDescriptor[i].u.Port.Length;
+                }
+                if((PartialDescriptor[i].Type==CmResourceTypeInterrupt)&&
+                  (!IRQLine)){
+                    IRQLevel=(KIRQL)PartialDescriptor[i].u.Interrupt.Level;
+                    IRQLine=(KIRQL)PartialDescriptor[i].u.Interrupt.Vector;
+                }
+            }
+        }
+        if(!NT_SUCCESS(status)){
+            uLan_DbgPrint("uLan: HalAssignSlotResources error %X\n",status);
+            ExFreePool(AllocatedResources);
+            IoDeleteDevice(deviceObject);
+            return status;
+        }
+        if(!InPortAddr.LowPart || !IRQLine)
+            status = STATUS_INSUFFICIENT_RESOURCES;
+        uLan_DbgPrint("uLan: Found PCI resources Port=%04X IRQLevel=%02X IRQVector=%02X\n",
+                       InPortAddr.LowPart,IRQLevel,IRQLine);
+        ExFreePool(AllocatedResources);
+    }
+   #endif /*UL_WITH_PCI*/
+
+    //
+    // This call will map our IRQ to a system vector. It will also fill
+    // in the IRQL (the kernel-defined level at which our ISR will run),
+    // and affinity mask (which processors our ISR can run on).
+    //
+    // We need to do this so that when we connect to the interrupt, we
+    // can supply the kernel with this information.
+    //
+
+
+    irql=IRQLevel;
+    MappedVector = HalGetInterruptVector(
+            InterfaceType, // Interface type
+            BusNumber,     // Bus number
+            IRQLevel,     // BusInterruptLevel
+            IRQLine,       // BusInterruptVector
+            &irql,         // IRQ level
+            &Affinity      // Affinity mask
+            );
+    
+
+    //
+    // A little known Windows NT fact,
+    // If MappedVector==0, then HalGetInterruptVector failed.
+    //
+
+    
+    if (MappedVector == 0) {
+        uLan_DbgPrint("uLan: HalGetInterruptVector failed\n");
+        IoDeleteDevice(deviceObject);
+        return (STATUS_INVALID_PARAMETER);
+    }
+
+    //
+    // Save off the Irql
+    //
+
+    extension->Irql = irql;
+
+
+    uLan_DbgPrint("uLan: driver mappedvector=%d irql=%d, dispatch irql=%d\n",
+                  MappedVector,irql,DISPATCH_LEVEL);
+    if(uL_SpinLock_Irql<irql)
+               uL_SpinLock_Irql=irql;
+    uLan_DbgPrint("uLan: spin lock irql=%d\n",uL_SpinLock_Irql);
+
+    //
+    // Translate the base port address to a system mapped address.
+    // This will be saved in the device extension after IoCreateDevice,
+    // because we use the translated port address to access the ports.
+    //
+
+    if (!HalTranslateBusAddress(InterfaceType, BusNumber, InPortAddr,
+                                &AddressSpace, &OutPortAddr)) {
+        uLan_DbgPrint("uLan: HalTranslateBusAddress failed\n");
+        return STATUS_SOME_NOT_MAPPED;
+    }
+
+    if ( NT_SUCCESS(status) ) {
+
+       //
+        // Create dispatch points for create/open, close, unload, and ioctl
+        //
+
+        DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchRoutine;
+        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchRoutine;
+        DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRoutine;
+        DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchRoutine;
+        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchRoutine;
+        DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchRoutine;
+        DriverObject->DriverUnload = UnloadDriver;
+
+        //
+        // check if resources (ports and interrupt) are available
+        //
+
+               
+       #ifdef UL_WITH_PCI
+        if(InterfaceType==Isa)
+       #endif /*UL_WITH_PCI*/
+        {
+           ReportUsage(DriverObject,deviceObject,InterfaceType,BusNumber,
+                        InPortAddr,PortRange,IRQLine,&ResourceConflict);
+
+            if (ResourceConflict) {
+                uLan_DbgPrint("uLan: Couldn't get resources\n");
+                IoDeleteDevice(deviceObject);
+                return STATUS_INSUFFICIENT_RESOURCES;
+            }
+        }
+               
+
+        //
+        // fill in the device extension
+        //
+        extension = (PULAN_DEVICE_EXTENSION) deviceObject->DeviceExtension;
+        extension->DeviceObject = deviceObject;
+        extension->port = OutPortAddr.LowPart;
+               
+
+        status=ul_drv_init_ext(extension,OutPortAddr.LowPart,IRQLine,BaudRate,
+                               BaudBase,ChipOptions,BufferSize,MyAddr);
+
+        if ( !NT_SUCCESS (status) ) {
+            uLan_DbgPrint("uLan: Initialization failed\n");
+            IoDeleteDevice(deviceObject);
+            return status;
+        }
+
+
+        KeInitializeDpc(&extension->bottom_dpc,ulan_bottom_dpc,extension);
+        KeInitializeDpc(&extension->wd_timer_dpc,ulan_wd_dpc,extension);
+       KeInitializeTimer(&extension->wd_timer);
+
+               //
+        // connect the device driver to the IRQ
+        //
+        ioConnectStatus = IoConnectInterrupt(&extension->InterruptObject,
+                                             uld_irq_handler,  // ServiceRoutine 
+                                             extension,                // ServiceContext
+                                             NULL,             // SpinLock
+                                             MappedVector,     // Vector
+                                             irql,             // Irql 
+                                             irql,             // SynchronizeIrql
+                                             InterfaceType==Isa? Latched:
+                                              LevelSensitive,  // InterruptMode
+                                            InterfaceType==Isa? FALSE:
+                                               TRUE,           // ShareVector 
+                                             Affinity,         // ProcessorEnableMask 
+                                             FALSE);           // FloatingSave 
+
+        if ( !NT_SUCCESS (ioConnectStatus) ) {
+            uLan_DbgPrint("uLan: Couldn't connect interrupt\n");
+            IoDeleteDevice(deviceObject);
+            return ioConnectStatus;
+        }
+
+
+        uLan_DbgPrint("uLan: just about ready!\n");
+
+        //
+        // Create counted string version of our Win32 device name.
+        //
+
+        RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME);
+    
+        //
+        // Create a link from our device name to a name in the Win32 namespace.
+        //
+        
+        /* IoDeleteSymbolicLink (&uniWin32NameString); */
+        status = IoCreateSymbolicLink( &uniWin32NameString, &uniNtNameString );
+
+        if (!NT_SUCCESS(status)) {
+            uLan_DbgPrint("uLan: Couldn't create the symbolic link\n");
+            IoDeleteDevice (DriverObject->DeviceObject);
+        } else {
+
+            //
+            // Setup the Dpc for ISR routine
+            //
+                       /*
+
+            IoInitializeDpcRequest (DriverObject->DeviceObject, uLan_Dpc_Routine);
+
+            //
+            // Initialize the device (enable IRQ's, hit the hardware)
+            //
+
+            Initialize_uLan (extension);
+                   */
+
+            uLan_DbgPrint("uLan: All initialized!\n");
+            
+            #ifdef UL_INT_TST
+                       geninfoblk(extension);
+            printudrvbll(extension);
+                       extension->flag_NACTIV=1;
+                       KeRaiseIrql(DISPATCH_LEVEL,&OldIrql);
+            uld_timeout(extension);
+                       KeLowerIrql(OldIrql);
+            #endif  /* UL_INT_TST */
+
+        }
+
+    } else {
+        uLan_DbgPrint("uLan: Couldn't create the device\n");
+    }
+    return status;
+       
+}
+
+
+
+//---------------------------------------------------------------------------
+// UnloadDriver
+//
+// Description:
+//     Free all the allocated resources, etc.
+//
+// Arguments:
+//     DriverObject - pointer to a driver object
+// 
+// Return Value:
+//      None
+// 
+VOID UnloadDriver (IN PDRIVER_OBJECT DriverObject)
+{
+    WCHAR                  deviceLinkBuffer[]  = DOS_DEVICE_NAME;
+    UNICODE_STRING         deviceLinkUnicodeString;
+    PULAN_DEVICE_EXTENSION extension;
+
+    extension = DriverObject->DeviceObject->DeviceExtension;
+
+    #ifdef UL_INT_TST
+    if(extension->flag_CHIPOK);
+      printudrvbll(extension);
+    #endif  /* UL_INT_TST */
+
+    //
+    // Deactivate uLan 
+    //
+
+    ul_drv_done_ext(extension);
+
+    //
+    // Disconnect IRQ and DPC sources
+    //
+       
+    IoDisconnectInterrupt (extension->InterruptObject);
+      
+    KeCancelTimer(&extension->wd_timer);
+    KeRemoveQueueDpc(&extension->wd_timer_dpc);
+    KeRemoveQueueDpc(&extension->bottom_dpc);
+               
+    //
+    // Delete the symbolic link
+    //
+       
+
+    RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer);
+
+    IoDeleteSymbolicLink (&deviceLinkUnicodeString);
+
+    //
+    // Delete the device object
+    //
+
+    IoDeleteDevice (DriverObject->DeviceObject);
+
+   #ifdef ENABLE_UL_MEM_CHECK
+    UL_PRINTF("MEM_CHECK: malloc-free=%d\n",
+                (int)atomic_read(&ul_mem_check_counter));
+   #endif /* ENABLE_UL_MEM_CHECK */
+    uLan_DbgPrint ("uLan: Unloaded\n");
+    return;
+}
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_linpci.c b/ulan/host/ul_drv/ul_drv/ul_linpci.c
new file mode 100644 (file)
index 0000000..804e92f
--- /dev/null
@@ -0,0 +1,187 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_linpci.c  - Linux kernel PCI device support
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Linux kernel PCI device support */ 
+
+/* config space access (byte|word|dword) return to text pcibios_strerror */
+/* pci_read_config_byte(struct pci_dev *dev, int where, u8 *val) */
+/* pci_write_config_byte(struct pci_dev *dev, int where, u8 *val) */
+/* request_region(), request_mem_region() */
+/* void *pci_get_drvdata (struct pci_dev *pdev) */
+/* void pci_set_drvdata (struct pci_dev *pdev, void *data) */
+
+/* default invocation of chip_init for PCI devices */
+static int /*__devinit*/ 
+  ulan_init_chan(struct pci_dev *dev,char *subdev, 
+                char *chip_name, ul_drv **pudrv,
+                 ul_chip_init_fnc *chip_init,
+                 int port, int irq, int options)
+{
+  ul_drv *udrv;
+  int amy_adr=0;
+  int abaud=0;
+  long abaudbase=0;
+  int match;
+  int minor;
+  int ret;
+  int i;
+#ifdef UL_WITH_DEVFS
+  kc_devfs_handle_t devfs_handle;
+  char dev_name[32];
+#endif /* UL_WITH_DEVFS */
+  
+  *pudrv=NULL;
+  /* try to find best minor and parameters */
+  match=ulan_init_find_minor("pci",kc_pci_name(dev),subdev,&minor,&i);
+  if(i>=0){
+    abaud=baud[i];amy_adr=my_adr[i]; abaudbase=baudbase[i];
+  }
+
+  /* mem for ul_drv */
+  if(!(udrv=MALLOC(sizeof(ul_drv)))) return -ENOMEM;
+  /* clear memory */
+  memset(udrv,0,sizeof(ul_drv));
+  /* set initial state */
+  ul_drv_new_init_state(udrv, amy_adr);
+  udrv->dev=dev;
+  /* init chip driver */
+  if((ret=(*chip_init)(udrv, port, irq, abaud, abaudbase, options))<0){
+    printk(KERN_CRIT "ulan_init_chan: ERROR - chip_init returned %d\n",ret);
+    FREE(udrv);
+    return -EIO;
+  }
+  /* setups buffers, ports and irq for sucesfully detected device */
+  if((ret=ul_drv_new_start(udrv,ulbuffer))<0){
+    printk(KERN_CRIT "ulan_init_chan: ERROR - ul_drv_new_start returned %d\n",ret);
+    FREE(udrv);
+    return -EIO;
+  }
+  #ifdef UL_WITH_DEVFS
+  sprintf (dev_name, "ulan%d", minor);
+  devfs_handle=kc_devfs_new_cdev(NULL, MKDEV(ulan_major_dev, minor), 
+                       S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, 
+                       &ulan_fops, udrv, dev_name);
+  udrv->devfs_handle=devfs_handle;
+  #endif /* UL_WITH_DEVFS */
+
+  printk(KERN_INFO "ulan_init_chan: chip=%s minor=%d baud=%d my_adr=%d ready\n",
+        chip_name,/*dev_name*/minor,udrv->baud_val,udrv->my_adr);
+  
+  if(minor>=0) ul_drv_arr[minor]=udrv;
+  *pudrv=udrv;
+  udrv->next_chan=pci_get_drvdata(dev);
+  pci_set_drvdata(dev, udrv);
+  kc_class_device_create(ulan_class, NULL, MKDEV(ulan_major_dev, minor),
+                       kc_pci_dev_to_dev(dev), "ulan%d", minor);
+  return 0;
+}
+
+
+static int /*__devinit*/ ulan_init_one_950pci (struct pci_dev *dev,
+                                  const struct pci_device_id *ent)
+{
+  int chip_options=ent->driver_data;
+  int ret, retall=-ENODEV;
+  char subdev[2];
+  int subno, port, irq;
+  ul_drv *udrv;
+
+  if (pci_enable_device (dev)){
+    printk(KERN_CRIT "ulan_init_one_950pci: Cannot enable device\n");
+    return -EIO;    
+  }
+  port=pci_resource_start(dev,0);
+  irq=dev->irq;
+  if(!irq||!port||!(pci_resource_flags(dev,0)&IORESOURCE_IO)){
+    LOG_FATAL(KERN_CRIT "uLan u950pci_init : bad PCI port or irq !\n");
+    return -ENODEV;
+  }
+  
+  for(subno=0;subno<2;subno++,port+=8){
+    subdev[0]='0'+subno;subdev[1]=0;
+    /* (dev,subdev,chip_name,pudrv,chip_init,port,irq,options) */
+    ret=ulan_init_chan(dev,subdev,"16950-pci",&udrv,&u950pci_init,port,irq,chip_options);
+    if(ret>=0){
+      retall=0;
+    } else {
+      if(retall<0) retall=ret;
+    }
+  }
+  return retall;
+}
+
+static int /*__devinit*/ ulan_pci_init_one (struct pci_dev *dev,
+                                  const struct pci_device_id *ent)
+{
+  unsigned long driver_data=ent->driver_data;
+  printk(KERN_INFO "ulan_init_one: PCI device found at slot : %s\n",
+         kc_pci_name(dev)?kc_pci_name(dev):"unknown");
+  pci_set_drvdata(dev, NULL);
+  switch(driver_data&~0xff){
+    case 0x16954000 :
+      return ulan_init_one_950pci(dev,ent);
+  }
+  printk(KERN_CRIT "ulan_init_one: No device of specified driver_data type\n");
+  return -ENODEV;
+}
+
+static void /*__devexit*/ ulan_pci_remove_one (struct pci_dev *dev)
+{
+  ul_drv *udrv, *next_udrv;
+  int i;
+  udrv=(ul_drv *)pci_get_drvdata(dev);
+  if(!udrv){
+    printk(KERN_CRIT "ulan_remove_one: no uLan drvdata\n");
+    return;
+  }
+  for(;udrv;udrv=next_udrv){
+    if(udrv->magic!=UL_DRV_MAGIC){
+      printk(KERN_CRIT "ulan_remove_one: Wrong uLan MAGIC number!!!\n");
+      return;
+    }
+    next_udrv=udrv->next_chan;
+    if(dev!=udrv->dev){
+      printk(KERN_CRIT "ulan_remove_one: BAD - cross PCI device remove\n");
+    }
+    for(i=0;i<UL_MINORS;i++){
+      if (udrv==ul_drv_arr[i]){
+        kc_class_device_destroy(ulan_class, MKDEV(ulan_major_dev, i));
+        ul_drv_arr[i]=NULL;
+      }
+    }
+
+    #ifdef UL_WITH_DEVFS
+    if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
+    #endif /* UL_WITH_DEVFS */
+    ul_drv_free(udrv);
+  }
+  pci_disable_device(dev);
+  pci_set_drvdata(dev, NULL);
+  printk(KERN_INFO "ulan_remove_one: PCI device removed\n");
+}
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_linusb.c b/ulan/host/ul_drv/ul_drv/ul_linusb.c
new file mode 100644 (file)
index 0000000..1591c63
--- /dev/null
@@ -0,0 +1,202 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_linusb.c  - Linux USB specific support routines
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* USB Devices Support */
+
+int ul_usb_ps1_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options);
+
+
+static int /*__devinit*/ 
+  ul_usb_init_chan(struct usb_device *dev, unsigned int ifnum,
+                 const struct usb_device_id *ent, ul_drv **pudrv,
+                 ul_chip_init_fnc *chip_init, int options)
+{
+  ul_drv *udrv;
+  int amy_adr=0;
+  int abaud=0;
+  long abaudbase=0;
+  int match;
+  int minor;
+  int ret;
+  int i;
+#ifdef UL_WITH_DEVFS
+  kc_devfs_handle_t devfs_handle;
+  char dev_name[32];
+#endif /* UL_WITH_DEVFS */
+  
+  *pudrv=NULL;
+  /* try to find best minor and parameters */
+  match=ulan_init_find_minor("usb","unknown","unknown",&minor,&i);
+  if(i>=0){
+    abaud=baud[i];amy_adr=my_adr[i]; abaudbase=baudbase[i];
+  }
+
+  /* mem for ul_drv */
+  if(!(udrv=MALLOC(sizeof(ul_drv)))) return -ENOMEM;
+  /* clear memory */
+  memset(udrv,0,sizeof(ul_drv));
+  /* set initial state */
+  ul_drv_new_init_state(udrv, amy_adr);
+  udrv->dev=(struct pci_dev *)dev;
+  /* init chip driver */
+  if((ret=(*chip_init)(udrv, ifnum, 0, abaud, abaudbase, options))<0){
+    printk(KERN_CRIT "ul_usb_init_chan: ERROR - chip_init returned %d\n",ret);
+    FREE(udrv);
+    return -EIO;
+  }
+  /* setups buffers, ports and irq for sucesfully detected device */
+  if((ret=ul_drv_new_start(udrv,ulbuffer))<0){
+    printk(KERN_CRIT "ulan_init_chan: ERROR - ul_drv_new_start returned %d\n",ret);
+    FREE(udrv);
+    return -EIO;
+  }
+  #ifdef UL_WITH_DEVFS
+  sprintf (dev_name, "ulan%d", minor);
+  devfs_handle=kc_devfs_new_cdev(NULL, MKDEV(ulan_major_dev, minor), 
+                       S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, 
+                       &ulan_fops, udrv, dev_name);
+  udrv->devfs_handle=devfs_handle;
+  #endif /* UL_WITH_DEVFS */
+
+  printk(KERN_INFO "ul_usb_init_chan: minor=%d baud=%d my_adr=%d ready\n",
+        minor,udrv->baud_val,udrv->my_adr);
+  
+  if(minor>=0){
+    ul_drv_arr[minor]=udrv;
+    kc_class_device_create(ulan_class, NULL, MKDEV(ulan_major_dev, minor),
+                       kc_usb_dev_to_dev(dev), "ulan%d", minor);
+  }
+
+  *pudrv=udrv;
+  return 0;
+}
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,41))
+static void *ul_usb_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
+{
+  unsigned long driver_info=id->driver_info;
+  ul_drv *udrv;
+  printk(KERN_INFO "ulan_init_one: USB device found devnum=%d, ifnum=%d\n",
+         dev->devnum, ifnum);
+  switch(driver_info&~0xff){
+    case  UL_USB_HW_PS1:
+      if(ul_usb_init_chan(dev,ifnum,id,&udrv,ul_usb_ps1_init,driver_info)<0)
+        return NULL;
+      printk(KERN_INFO "ul_usb_probe: data type\n");
+      return udrv;
+  }
+  printk(KERN_CRIT "ul_usb_probe: No device of specified driver_data type\n");
+  return NULL;
+}
+#else /* 2.5.41 */
+static int ul_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
+{
+  struct usb_device *dev = interface_to_usbdev(intf);
+  int ifnum = intf->altsetting->desc.bInterfaceNumber;
+  unsigned long driver_info=id->driver_info;
+  ul_drv *udrv;
+  dev_set_drvdata(&intf->dev,NULL);
+  printk(KERN_INFO "ulan_init_one: USB device found devnum=%d, ifnum=%d\n",
+         dev->devnum, ifnum);
+  switch(driver_info&~0xff){
+    case  UL_USB_HW_PS1:
+      if(ul_usb_init_chan(dev,ifnum,id,&udrv,ul_usb_ps1_init,driver_info)<0)
+        return -EIO;
+      printk(KERN_INFO "ul_usb_probe: data type\n");
+      dev_set_drvdata(&intf->dev,udrv);
+      return 0;
+  }
+  printk(KERN_CRIT "ul_usb_probe: No device of specified driver_data type\n");
+  return -EIO;
+}
+#endif /* 2.5.41 */
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,41))
+static void ul_usb_disconnect(struct usb_device *dev, void *ptr)
+{
+  ul_drv *udrv, *next_udrv;
+  int i;
+  udrv=(ul_drv *)ptr;
+  if(!udrv){
+    printk(KERN_CRIT "ulan_remove_one: no uLan drvdata\n");
+    return;
+  }
+  for(;udrv;udrv=next_udrv){
+    if(udrv->magic!=UL_DRV_MAGIC){
+      printk(KERN_CRIT "ulan_remove_one: Wrong uLan MAGIC number!!!\n");
+      return;
+    }
+    next_udrv=udrv->next_chan;
+    if(dev!=(struct usb_device *)udrv->dev){
+      printk(KERN_CRIT "ul_usb_disconnect: BAD - cross USB device remove\n");
+    }
+    for(i=0;i<UL_MINORS;i++){
+      if (udrv==ul_drv_arr[i]) ul_drv_arr[i]=NULL;
+    }
+    #ifdef UL_WITH_DEVFS
+    if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
+    #endif /* UL_WITH_DEVFS */
+    ul_drv_free(udrv);
+  }
+  printk(KERN_INFO "ul_usb_disconnect: USB device removed\n");
+}
+#else /* 2.5.41 */
+static void ul_usb_disconnect(struct usb_interface *intf)
+{
+  struct usb_device *dev = interface_to_usbdev(intf);
+  ul_drv *udrv, *next_udrv;
+  int i;
+  udrv=(ul_drv *)dev_get_drvdata(&intf->dev);
+  dev_set_drvdata(&intf->dev,NULL);
+  if(!udrv){
+    printk(KERN_CRIT "ulan_remove_one: no uLan drvdata\n");
+    return;
+  }
+  for(;udrv;udrv=next_udrv){
+    if(udrv->magic!=UL_DRV_MAGIC){
+      printk(KERN_CRIT "ulan_remove_one: Wrong uLan MAGIC number!!!\n");
+      return;
+    }
+    next_udrv=udrv->next_chan;
+    if(dev!=(struct usb_device *)udrv->dev){
+      printk(KERN_CRIT "ul_usb_disconnect: BAD - cross USB device remove\n");
+    }
+    for(i=0;i<UL_MINORS;i++){
+      if (udrv==ul_drv_arr[i]){
+        ul_drv_arr[i]=NULL;
+        kc_class_device_destroy(ulan_class, MKDEV(ulan_major_dev, i));
+      }
+    }
+    #ifdef UL_WITH_DEVFS
+    if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
+    #endif /* UL_WITH_DEVFS */
+    ul_drv_free(udrv);
+  }
+  printk(KERN_INFO "ul_usb_disconnect: USB device removed\n");
+}
+#endif /* 2.5.41 */
diff --git a/ulan/host/ul_drv/ul_drv/ul_linux.c b/ulan/host/ul_drv/ul_drv/ul_linux.c
new file mode 100644 (file)
index 0000000..b373503
--- /dev/null
@@ -0,0 +1,732 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_linux.c   - Linux kernel and module specific part
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Linux kernel and module specific part */ 
+
+MODULE_SUPPORTED_DEVICE("ul_drv");
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
+MODULE_DESCRIPTION("\
+uLan communication module ( 9 bit RS-485 protocol )\n\
+for communication with embedded controllers.\n\
+It uses i82510 addon card or RS-232 dongle");
+MODULE_LICENSE("GPL");
+EXPORT_NO_SYMBOLS;
+
+static int ulan_major_dev=ULAN_MAJOR;  /* uLan major device number */
+struct kc_class *ulan_class;
+
+#define UL_MINORS 9
+#ifndef CONFIG_UL_DEFAULT_PORT
+#define CONFIG_UL_DEFAULT_PORT 0
+#endif
+ul_drv *ul_drv_arr[UL_MINORS]={[0 ... UL_MINORS-1]=NULL};
+char *chip[UL_MINORS]={NULL,};
+int chip_specified;
+#if defined(UL_WITH_PCI) || defined(UL_WITH_USB)
+char *slot[UL_MINORS]={NULL,};
+int slot_specified;
+#endif
+int my_adr[UL_MINORS]={[0 ... UL_MINORS-1]=2};
+int my_adr_specified;
+int baud[UL_MINORS]={[0 ... UL_MINORS-1]=19200};
+int baud_specified;
+int baudbase[UL_MINORS]={[0 ... UL_MINORS-1]=0};
+int baudbase_specified;
+int irq[UL_MINORS]={0,};
+int irq_specified;
+int port[UL_MINORS]={CONFIG_UL_DEFAULT_PORT
+       #if (UL_MINORS>1)
+               ,[1 ... UL_MINORS-1]=0
+       #endif
+               };
+int port_specified;
+
+int debug=-1;          /* debug flags */
+int ul_usb_msg_inpr=0; /* number of concurrent messages sent over USB */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+module_param_array(chip, charp, &chip_specified, 0);
+module_param_array(my_adr, int, &my_adr_specified, 0);
+module_param_array(baud, int, &baud_specified, 0);
+module_param_array(irq, int, &irq_specified, 0);
+module_param_array(port, int, &port_specified, 0);
+module_param_array(baudbase, int, &baudbase_specified, 0);
+#if defined(UL_WITH_PCI) || defined(UL_WITH_USB)
+module_param_array(slot, charp, &slot_specified, 0);
+#endif
+module_param(debug, int, 0);
+module_param(ul_usb_msg_inpr, int, 0);
+module_param(ulbuffer, int, 0);
+
+#else /* LINUX_VERSION_CODE < 2,6,0 */
+MODULE_PARM(chip,"1-" __MODULE_STRING(UL_MINORS) "s");
+MODULE_PARM(my_adr,"1-" __MODULE_STRING(UL_MINORS) "i");
+MODULE_PARM(baud,"1-" __MODULE_STRING(UL_MINORS) "i");
+MODULE_PARM(irq,"1-" __MODULE_STRING(UL_MINORS) "i");
+MODULE_PARM(port,"1-" __MODULE_STRING(UL_MINORS) "i");
+MODULE_PARM(baudbase,"1-" __MODULE_STRING(UL_MINORS) "i");
+#if defined(UL_WITH_PCI) || defined(UL_WITH_USB)
+MODULE_PARM(slot,"1-" __MODULE_STRING(UL_MINORS) "s");
+#endif
+MODULE_PARM(debug,"i");
+MODULE_PARM(ul_usb_msg_inpr,"i");
+MODULE_PARM(ulbuffer,"i");
+#endif /* LINUX_VERSION_CODE < 2,6,0 */
+
+MODULE_PARM_DESC(chip,"chip type: auto, 82510, 16450, 16950-pci");
+MODULE_PARM_DESC(my_adr,"uLan address of defined interface");
+MODULE_PARM_DESC(baud,"define baudrates");
+MODULE_PARM_DESC(irq,"define irqs");
+MODULE_PARM_DESC(port,"define ports");
+MODULE_PARM_DESC(baudbase,"define UART base clock");
+#if defined(UL_WITH_PCI) || defined(UL_WITH_USB)
+MODULE_PARM_DESC(slot,"slot type (pci) and specification");
+#endif
+MODULE_PARM_DESC(debug,"debug flags (FATAL,CHIO,IRQ,MSG,FAILS,"\
+                      "SEQ,PORTS,FILE,FILT)");
+MODULE_PARM_DESC(ul_usb_msg_inpr,"used length of Tx fifo in conventor");
+MODULE_PARM_DESC(ulbuffer,"size of per interface buffer");
+
+
+#ifdef UL_WITH_PCI
+
+static int /*__devinit*/ ulan_pci_init_one (struct pci_dev *dev,
+                                   const struct pci_device_id *ent);
+
+static void /*__devexit*/ ulan_pci_remove_one (struct pci_dev *dev);
+
+MODULE_DEVICE_TABLE(pci, ulan_pci_tbl);
+
+static struct pci_driver ulan_pci_driver = {
+       name:           "ul_drv",
+       id_table:       ulan_pci_tbl,
+       probe:          ulan_pci_init_one,
+       remove:         ulan_pci_remove_one,
+};
+#endif /*UL_WITH_PCI*/
+
+#ifdef UL_WITH_USB
+
+#if (LINUX_VERSION_CODE < VERSION(2,5,41))
+static void *ul_usb_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);
+static void ul_usb_disconnect(struct usb_device *dev, void *ptr);
+#else /* 2.5.41 */
+static int ul_usb_probe(struct usb_interface *intf, const struct usb_device_id *id);
+static void ul_usb_disconnect(struct usb_interface *intf);
+#endif /* 2.5.41 */
+
+MODULE_DEVICE_TABLE (usb, ulan_usb_tbl);
+
+#ifdef CONFIG_USB_DYNAMIC_MINORS
+/* 
+ * if the user wants to use dynamic minor numbers, then we can have up to 256
+ * devices
+ */
+#define UL_USB_MINOR_BASE      0
+#define MAX_DEVICES            256
+#else
+/* Get a minor range for your devices from the usb maintainer */
+#define UL_USB_MINOR_BASE      200
+
+/* we can have up to this number of device plugged in at once */
+#define MAX_DEVICES            16
+#endif
+
+/* usb specific object needed to register this driver with the usb subsystem */
+static struct usb_driver ul_usb_driver = {
+       name:           "ulan_usb",
+       probe:          ul_usb_probe,
+       disconnect:     ul_usb_disconnect,
+       /*fops:         &ul_usb_fops,*/
+       /* num_minors:  MAX_DEVICES,*/
+     #if (LINUX_VERSION_CODE < VERSION(2,5,8))
+       minor:          UL_USB_MINOR_BASE,
+     #endif
+       id_table:       ulan_usb_tbl,
+};
+
+#endif /*UL_WITH_USB*/
+
+
+static int ulan_open(struct inode *inode, struct file *file);
+static CLOSERET ulan_close(struct inode *inode, struct file *file);
+static int ulan_ioctl(struct inode *inode, struct file *file, 
+                       unsigned int cmd, unsigned long arg);
+static RWRET ulan_write(WRITE_PARAMETERS);
+static RWRET ulan_read(READ_PARAMETERS);
+static loff_t ulan_lseek(LSEEK_PARAMETERS);
+static unsigned int ulan_poll(struct file *, poll_table *);
+
+/* static struct file_operations ulan_fops */
+KC_CHRDEV_FOPS_BEG(ulan_fops)
+       KC_FOPS_LSEEK(ulan_lseek)/* lseek              */
+       read:ulan_read,         /* read                */
+       write:ulan_write,       /* write               */
+       readdir:NULL,           /* readdir             */
+       poll:ulan_poll,         /* poll                */
+       ioctl:ulan_ioctl,       /* ioctl               */
+       mmap:NULL,              /* mmap                */
+       open:ulan_open,         /* open                */
+       KC_FOPS_FLUSH(NULL)     /* flush               */
+       KC_FOPS_RELEASE(ulan_close)/* close/release    */
+       fsync:NULL,             /* fsync               */
+       fasync:NULL,            /* fasync              */
+       NULL,                   /* check_media_change  */
+       NULL,                   /* revalidate          */
+KC_CHRDEV_FOPS_END;
+
+
+/* open ulan device */
+static int ulan_open(struct inode *inode, struct file *file)
+{ 
+  ul_drv *udrv;
+  ul_opdata *opdata;
+  unsigned int minor = kc_dev2minor(inode->i_rdev);
+  #ifdef UL_WITH_DEVFS
+  if(minor==-1){
+    udrv=file->private_data;
+  }else
+  #endif /* UL_WITH_DEVFS */
+  {
+    if ((minor >= UL_MINORS)||(minor<0)) return -ENODEV;
+    udrv=ul_drv_arr[minor];
+  }
+  if (!udrv) return -ENODEV;
+  if(udrv->magic!=UL_DRV_MAGIC)
+  {
+    printk(KERN_CRIT "ulan_open: Wrong uLan MAGIC number!!!\n");
+    return -ENODEV;
+  }
+
+  kc_MOD_INC_USE_COUNT;
+  if(!(file->private_data=MALLOC(sizeof(ul_opdata))))
+  { kc_MOD_DEC_USE_COUNT;
+    return(-ENOMEM);
+  };
+  opdata=(ul_opdata*)file->private_data;
+  opdata->file=file;
+  opdata->magic=ULOP_MAGIC;
+  opdata->message=NULL;
+  opdata->udrv=udrv;
+  init_waitqueue_head(&opdata->wqrec);
+  opdata->opprew=NULL;
+  opdata->opnext=NULL;
+  opdata->recchain=NULL;
+  opdata->filtchain=NULL;
+  { /* add us onto list of clients of udrv */
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    opptr=udrv->operators;
+    if(opptr) {opptr->opprew=opdata;opdata->opnext=opptr;};
+    UL_MB();
+    udrv->operators=opdata;
+    UL_DRV_UNLOCK;
+  };
+
+  return 0;
+};
+
+static CLOSERET ulan_close(struct inode *inode, struct file *file)
+{
+  ul_opchain *opmember;
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_close : BAD opdata magic !!!");
+
+  if (opdata->message) ulan_freemsg(opdata);
+  { /* delete us from list of clients of udrv */
+    ul_drv *udrv;
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    if((udrv=opdata->udrv)!=NULL){
+      if((opptr=opdata->opnext)) opptr->opprew=opdata->opprew;
+      if((opptr=opdata->opprew)) opptr->opnext=opdata->opnext;
+      else udrv->operators=opdata->opnext;
+    }
+    UL_DRV_UNLOCK;
+    if(udrv)
+      if(udrv->irq>0) ul_synchronize_irq(udrv->irq);
+    while((udrv=opdata->udrv)!=NULL){
+      if(!uld_atomic_test_dfl(udrv,IN_BOTTOM))
+        break;
+      kc_yield();
+    }
+  }
+  schedule();
+  while((opmember=opdata->recchain))
+  {
+    del_from_opchain(&opdata->recchain,opmember);
+    if(opmember->message) ul_dec_ref_cnt(opmember->message);
+    FREE(opmember);
+  };
+  while((opmember=opdata->filtchain))
+  {
+    del_from_opchain(&opdata->filtchain,opmember);
+    FREE(opmember);
+  };
+  FREE(file->private_data);
+  kc_MOD_DEC_USE_COUNT;
+  return (CLOSERET)0;
+};
+
+static int ulan_ioctl(struct inode *inode, struct file *file, 
+                       unsigned int cmd, unsigned long arg)
+{
+  ul_msginfo msginfo;
+  int ret;
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_ioctl : BAD opdata magic !!!");
+
+  switch (cmd) {
+   case UL_DRV_VER :
+       return UL_DRV_VERCODE;
+   case UL_NEWMSG :
+       if(kc_copy_from_user(&msginfo,(void *)arg,sizeof(msginfo)))
+          return -EFAULT;
+       return ulan_newmsg(opdata,&msginfo);
+   case UL_TAILMSG :
+       if(kc_copy_from_user(&msginfo,(void *)arg,sizeof(msginfo)))
+          return -EFAULT;
+       return ulan_tailmsg(opdata,&msginfo);
+   case UL_FREEMSG :
+       return ulan_freemsg(opdata);
+   case UL_ACCEPTMSG :         
+       if(kc_copy_to_user((void *)arg,&msginfo,sizeof(msginfo)))
+          return -EFAULT;
+       ret=ulan_acceptmsg(opdata,&msginfo);
+       if(kc_copy_to_user((void *)arg,&msginfo,sizeof(msginfo)))
+          return -EFAULT;
+       return  ret;
+   case UL_ACTAILMSG :         
+       if(kc_copy_to_user((void *)arg,&msginfo,sizeof(msginfo)))
+          return -EFAULT;
+       ret=ulan_actailmsg(opdata,&msginfo);
+       if(kc_copy_to_user((void *)arg,&msginfo,sizeof(msginfo)))
+          return -EFAULT;
+       return  ret;
+   case UL_ADDFILT :
+       if(kc_copy_from_user(&msginfo,(void *)arg,sizeof(msginfo)))
+          return -EFAULT;
+       return ulan_addfilt(opdata,&msginfo);
+   case UL_ABORTMSG :
+       return ulan_abortmsg(opdata);
+   case UL_REWMSG :
+       return ulan_rewmsg(opdata);
+   case UL_KLOGBLL :
+        if(!opdata->udrv) return -ENODEV;
+       printudrvbll(opdata->udrv);
+    #ifdef ENABLE_UL_MEM_CHECK
+       printudrvoperators(opdata->udrv);
+    #endif /* ENABLE_UL_MEM_CHECK */
+       return 0;
+   case UL_STROKE :
+        if(!opdata->udrv) return -ENODEV;
+       ulan_stroke(opdata->udrv, 1);
+       return 0;
+   case UL_DEBFLG :
+       uld_debug_flg=arg;
+       return 0;
+   case UL_INEPOLL :
+        return ulan_inepoll(opdata);
+   case UL_SETMYADR :
+        return ulan_setmyadr(opdata,arg);
+  #ifdef UL_WITH_IAC
+   case UL_SETIDSTR :{
+         char idstr[41];
+         char ch;
+         int ln=0;
+         do{
+           if(kc_get_user_byte(ch,(char*)arg))
+             return -EFAULT;
+           if(++arg>=sizeof(idstr))
+             return -EINVAL;
+           idstr[ln++]=ch;
+         }while(ch);
+         idstr[ln]=0;
+          return ulan_setidstr(opdata,idstr);
+       }
+  #endif /*UL_WITH_IAC*/
+   case UL_SETBAUDRATE :
+        return ulan_setbaudrate(opdata,arg);
+
+   case UL_HWTEST :
+        if(current->euid!=0) return -EPERM;
+       return ulan_hwtest(opdata,arg);
+  };
+
+
+  return -EINVAL;
+};
+
+/* common parameters (struct file *file, const char *buf, 
+                      size_t count [, loff_t *ppos]) */
+static RWRET ulan_write(WRITE_PARAMETERS)
+{
+  int cn;
+  int len;
+  ul_mem_blk *blk;
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_write : BAD opdata magic !!!");
+
+  if(!opdata->udrv) return -ENODEV;
+  if(!opdata->message) return -ENOMSG;
+
+  cn=count;
+  while(cn>0)
+  {
+    while(!ul_di_adjust(&opdata->data))
+    {
+      if(!(blk=ul_alloc_blk(opdata->udrv))) 
+       {count-=cn;cn=0;break;};
+      memset(UL_BLK_NDATA(blk),0,UL_BLK_SIZE);
+      opdata->data.blk->next=blk;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    if(kc_copy_from_user(ul_di_byte(&opdata->data),buf,len))
+      return -EFAULT;
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  if(opdata->data.pos>UL_BLK_HEAD(opdata->data.head_blk).len)
+    UL_BLK_HEAD(opdata->data.head_blk).len=opdata->data.pos;
+
+  return count-cn;
+};
+
+/* common parameters (struct file *file, char *buf, 
+                      size_t count [, loff_t *ppos]) */
+static RWRET ulan_read(READ_PARAMETERS)
+{
+  int cn;
+  int len;
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_read : BAD opdata magic !!!");
+
+  if(!opdata->udrv) return -ENODEV;
+  if(!opdata->message) return -ENOMSG;
+
+  if(opdata->data.pos+count>UL_BLK_HEAD(opdata->data.head_blk).len)
+   count=UL_BLK_HEAD(opdata->data.head_blk).len-opdata->data.pos;
+
+  cn=count;
+  while(cn>0)
+  {
+    if(!ul_di_adjust(&opdata->data))
+    {
+      while(cn--) kc_put_user(0,buf++);
+      break;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    if(kc_copy_to_user(buf,ul_di_byte(&opdata->data),len))
+      return -EFAULT;
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  return count-cn;
+};
+
+/* common parameters (struct file *file, loff_t pos, int whence) */
+static loff_t ulan_lseek(LSEEK_PARAMETERS)
+{
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_lseek : BAD opdata magic !!!");
+
+  if(!opdata->message) return -ENOMSG;
+
+  return ul_di_seek(&opdata->data,pos,whence);
+};
+
+static unsigned int ulan_poll(struct file *file, poll_table *wait)
+{
+  /* POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM */
+  unsigned int mask = 0;
+  ul_opdata *opdata=(ul_opdata*)file->private_data;
+  if(opdata->magic!=ULOP_MAGIC) panic("ulan_poll : BAD opdata magic !!!");
+
+  kc_poll_wait(file, &opdata->wqrec, wait);
+
+  if (opdata->recchain)
+    mask |= (POLLIN | POLLRDNORM);
+
+  if (!opdata->udrv)
+    mask |= (POLLIN | POLLOUT | POLLERR);
+
+  return mask;
+};
+
+#if defined(UL_WITH_PCI) || defined(UL_WITH_USB)
+
+static int /*__devinit*/ 
+ ulan_init_find_minor(char *abus, char *aslot, char *asubdev,
+                      int *pminor, int *ppar)
+{
+  int i;
+  int abus_len;
+  int aslot_len;
+  int sub_offs;
+  int minor;
+  int par;
+  int match=0;
+  char *islot;
+  abus_len=strlen(abus);
+  aslot_len=strlen(aslot);
+  sub_offs=abus_len+aslot_len;
+  *pminor=*ppar=minor=par=-1;
+  for(i=0;i<UL_MINORS;i++){
+    islot=slot[i];
+    if(islot)
+      if(!*islot) islot=NULL;
+    switch (match){
+      case 0: 
+        if(!ul_drv_arr[i]&&!islot){
+         minor=i;match=1;
+         if(par==-1) par=i;
+       }
+      case 1:
+        if(!islot) continue;
+        if(!strcmp(islot,abus)){
+         par=i;
+         if(!ul_drv_arr[i]){ minor=i; match=2;}
+       }
+      case 2:
+        if(!islot||!aslot) continue;
+        if(!strncmp(islot,abus,abus_len)&&
+          !strcmp(islot+abus_len,aslot)){
+         par=i;
+         if(!ul_drv_arr[i]){ minor=i; match=3;}
+        }
+      case 3:
+        if(!islot||!aslot||!asubdev) continue;
+        if(!strncmp(islot,abus,abus_len)&&
+          !strncmp(islot+abus_len,aslot,aslot_len)&&
+          (islot[sub_offs]=='.')&&!strcmp(islot+sub_offs+1,asubdev)){
+         par=i;
+         if(!ul_drv_arr[i]){ minor=i; match=4;}
+        }
+    }
+  }
+  *pminor=minor;*ppar=par;
+  return match;
+}
+
+#endif /*defined(UL_WITH_PCI)||defined(UL_WITH_USB)*/
+
+
+/*** initialize kernel module ***/
+int init_module(void)
+{
+ #ifdef UL_WITH_DEVFS
+  kc_devfs_handle_t devfs_handle;
+  char devname[32];
+ #endif /* UL_WITH_DEVFS */
+  ul_drv* udrv;
+  int ret;
+  int minor;
+
+  printk(KERN_INFO "uLan v" UL_DRV_VERSION " init_module\n");
+  printk(KERN_INFO "Compiled at %s %s\n",__DATE__, __TIME__);
+
+  if(debug!=-1){
+    uld_debug_flg=debug;
+  }
+
+  ulan_class = kc_class_create(THIS_MODULE, "ulan");
+
+  ret=0;
+ #ifdef UL_WITH_UARTS
+  for(minor=0;minor<UL_MINORS;minor++)
+  {
+    if(port[minor]||chip[minor])
+    { /* get new ul_drv (port, irq, baud, my_adr); */
+      udrv=ul_drv_new(port[minor],irq[minor],
+                     baud[minor],my_adr[minor],chip[minor],baudbase[minor]);
+      ul_drv_arr[minor]=udrv;
+      if(udrv){
+       #ifdef UL_WITH_DEVFS
+         sprintf (devname, "ulan%d", minor);
+          devfs_handle=kc_devfs_new_cdev(NULL, MKDEV(ulan_major_dev, minor), 
+                       S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, 
+                       &ulan_fops, udrv, devname);
+         udrv->devfs_handle=devfs_handle;
+       #endif /* UL_WITH_DEVFS */
+       ret++;
+       kc_class_device_create(ulan_class, NULL, MKDEV(ulan_major_dev, minor), NULL, "ulan%d", minor);
+      };
+    };
+  };
+ #endif /*UL_WITH_UARTS*/
+
+ #ifdef UL_WITH_PCI
+  { int rc;
+    rc=pci_register_driver (&ulan_pci_driver);
+    ret+=rc;
+  }
+ #endif  /* UL_WITH_PCI */
+
+ #ifdef UL_WITH_USB
+  /* register this driver with the USB subsystem */
+  { int rc;
+    rc = usb_register(&ul_usb_driver);
+    if (rc < 0) {
+      printk(KERN_CRIT "usb_register failed for the "__FILE__" driver. Error number %d",
+        rc);
+    } else {
+      ret++;
+    }
+  }
+ #endif  /* UL_WITH_USB */
+
+  if(!ret)
+  { printk(KERN_ERR "uLan module_init : no hardware initialized, aborting !!!\n");
+    #ifdef UL_WITH_USB
+     usb_deregister(&ul_usb_driver);
+    #endif  /* UL_WITH_USB */
+    #ifdef UL_WITH_PCI
+    pci_unregister_driver (&ulan_pci_driver);
+    #endif  /* UL_WITH_PCI */
+    return -ENODEV;
+  };
+
+ #ifdef UL_WITH_DEVFS
+  ret = devfs_register_chrdev(ulan_major_dev, "ulan", &ulan_fops);
+ #else /* UL_WITH_DEVFS */
+  ret = register_chrdev(ulan_major_dev, "ulan", &ulan_fops);
+ #endif /* UL_WITH_DEVFS */
+  printk(KERN_INFO "uLan init : called register dev %d and got %d\n",
+                        ulan_major_dev,ret);
+
+  if (ret < 0) {
+    printk(KERN_ERR "uLan init : unable to grab device #\n");
+    ulan_major_dev=0;
+    #ifdef UL_WITH_PCI
+    pci_unregister_driver (&ulan_pci_driver);
+    #endif  /* UL_WITH_PCI */
+    for(minor=0;minor<UL_MINORS;minor++)
+    { udrv=ul_drv_arr[minor];
+      if(udrv)
+      { ul_drv_arr[minor]=NULL;
+       #ifdef UL_WITH_DEVFS
+       if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
+       #endif /* UL_WITH_DEVFS */
+       kc_class_device_destroy(ulan_class, MKDEV(ulan_major_dev, minor));
+       ul_drv_free(udrv);
+      };
+    };
+    kc_class_destroy(ulan_class);
+    return ret;
+  }
+  if(!ulan_major_dev) ulan_major_dev=ret;
+  printk(KERN_INFO "uLan init : driver succesfully registered as major %d\n",
+                 ulan_major_dev);
+
+  #ifdef UL_INT_TST
+  udrv=ul_drv_arr[0];
+  if(udrv)
+  { printk("uLan : geninfoblk\n");
+    geninfoblk(udrv);
+    printk("uLan : gentestblk\n");
+    gentestblk(udrv);
+    printk("uLan : uld_timeout\n");
+    uld_timeout(udrv);
+  };
+  #endif /* UL_INT_TST */
+
+  return 0;
+}
+
+/*** cleanup kernel module ***/
+void cleanup_module(void)
+{
+  ul_drv* udrv;
+  int i;
+
+  if (ulan_major_dev != 0) {
+   #ifdef UL_WITH_DEVFS
+    devfs_unregister_chrdev(ulan_major_dev, "ulan");
+   #else /* UL_WITH_DEVFS */
+    unregister_chrdev(ulan_major_dev, "ulan");
+   #endif /* UL_WITH_DEVFS */
+  };
+
+  udrv=ul_drv_arr[0];
+  if(udrv)
+  { printk("uLan : printudrvbll\n");
+    printudrvbll(udrv);
+   #ifdef UL_WITH_FRAME_FSM
+    printk("uLan : max cycle cnt  %d\n",ul_max_cycle_cnt);
+    printk("uLan : max cycle time %d\n",ul_max_cycle_time);
+   #endif /*UL_WITH_FRAME_FSM*/
+  }
+
+ #ifdef UL_WITH_USB
+  usb_deregister(&ul_usb_driver);
+ #endif  /* UL_WITH_USB */
+ #ifdef UL_WITH_PCI
+  pci_unregister_driver (&ulan_pci_driver);
+ #endif  /* UL_WITH_PCI */
+  for(i=0;i<UL_MINORS;i++)
+  { udrv=ul_drv_arr[i];
+    ul_drv_arr[i]=NULL;
+    if(udrv){
+     #ifdef UL_WITH_DEVFS
+     if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
+     #endif /* UL_WITH_DEVFS */
+     kc_class_device_destroy(ulan_class, MKDEV(ulan_major_dev, i));
+     ul_drv_free(udrv);
+    }
+  }
+
+  kc_class_destroy(ulan_class);
+
+ #ifdef ENABLE_UL_MEM_CHECK
+  UL_PRINTF("MEM_CHECK: malloc-free=%d\n",
+                (int)atomic_read(&ul_mem_check_counter));
+ #endif /* ENABLE_UL_MEM_CHECK */
+}
+
+#ifdef ENABLE_UL_MEM_CHECK
+void * ul_mem_check_malloc(size_t size)
+{void *ptr;
+ ptr=kmalloc(size,GFP_KERNEL);
+ if(ptr) atomic_inc(&ul_mem_check_counter);
+ return ptr;
+}
+
+void ul_mem_check_free(void *ptr)
+{
+  if(ptr) atomic_dec(&ul_mem_check_counter);
+  kfree(ptr);
+}
+#endif /* ENABLE_UL_MEM_CHECK */
diff --git a/ulan/host/ul_drv/ul_drv/ul_mem.c b/ulan/host/ul_drv/ul_drv/ul_mem.c
new file mode 100644 (file)
index 0000000..7a055f4
--- /dev/null
@@ -0,0 +1,252 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_mem.c     - uLan memory management and linked lists
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* uLan memory management and bidirectional linked lists */
+
+int ul_mem_init(ul_drv *udrv, int req_size)
+{
+  void **pptr;
+  ul_mem_blk *bptr;
+  pptr=(void **)(udrv->mem_ptr=MALLOC(req_size+2*sizeof(void*)));
+  if(!pptr) return -1;
+  *(pptr++)=0;
+  *(pptr++)=(void *)req_size;
+  udrv->free_blk=bptr=(ul_mem_blk *)pptr;
+  udrv->free_blk_cnt=1;
+
+  while((req_size-=sizeof(ul_mem_blk))>=sizeof(ul_mem_blk))
+  {
+    bptr->next=bptr+1;
+    bptr++;
+    udrv->free_blk_cnt++;
+  }; 
+  bptr->next=NULL;
+  udrv->prep_bll.first=udrv->prep_bll.last=NULL;
+  udrv->prep_bll.cnt=0;
+  udrv->prep_bll.udrv=udrv; 
+  udrv->work_bll.first=udrv->work_bll.last=NULL;
+  udrv->work_bll.cnt=0;
+  udrv->work_bll.udrv=udrv; 
+  udrv->proc_bll.first=udrv->proc_bll.last=NULL;
+  udrv->proc_bll.cnt=0;
+  udrv->proc_bll.udrv=udrv;
+  udrv->opan_bll.first=udrv->opan_bll.last=NULL;
+  udrv->opan_bll.cnt=0;
+  udrv->opan_bll.udrv=udrv;
+  udrv->con_message=NULL;
+
+  return 0;
+};
+
+int ul_mem_done(ul_drv *udrv)
+{
+  void *ptr;
+  if(udrv->mem_ptr)
+  { ptr=*(void **)udrv->mem_ptr;
+    FREE(udrv->mem_ptr);
+    udrv->mem_ptr=0;
+  };
+  return 0;
+};
+
+/*** Insert frame blk on list bll ***/
+void ul_bll_ins(ul_blk_bll *bll, ul_mem_blk *blk)
+{
+  UL_DRV_LOCK_FINI
+  /* ul_drv *udrv=bll->udrv; */
+  UL_BLK_HEAD(blk).bll=bll;
+  /* UL_BLK_HEAD(blk).next=NULL; */
+  /* UL_BLK_HEAD(blk).ref_cnt=1; */
+  /* UL_BLK_HEAD(blk).flg|=UL_BFL_LOCK; */
+  UL_DRV_LOCK;
+  if((UL_BLK_HEAD(blk).prev=bll->last)!=NULL)
+    UL_BLK_HEAD(bll->last).next=blk;
+  else bll->first=blk;
+  bll->last=blk;
+  bll->cnt++;
+  UL_DRV_UNLOCK;
+};
+
+/*** Remove frame blk from its bll ***/
+void ul_bll_del(ul_mem_blk *blk)
+{
+  UL_DRV_LOCK_FINI
+  ul_blk_bll *bll;
+  ul_mem_blk *p;
+  bll=UL_BLK_HEAD(blk).bll;
+  UL_DRV_LOCK;
+  bll->cnt--;
+
+  if((p=UL_BLK_HEAD(blk).next)!=NULL) 
+  { UL_BLK_HEAD(p).prev=UL_BLK_HEAD(blk).prev;
+    UL_BLK_HEAD(blk).next=NULL;
+  }else bll->last=UL_BLK_HEAD(blk).prev;
+
+  if((p=UL_BLK_HEAD(blk).prev)!=NULL) 
+  { UL_BLK_HEAD(p).next=UL_BLK_HEAD(blk).next;
+    UL_BLK_HEAD(blk).prev=NULL;
+  }else bll->first=UL_BLK_HEAD(blk).next;
+
+  UL_BLK_HEAD(blk).bll=NULL;
+  UL_DRV_UNLOCK;
+};
+
+/*** Move one message starting at beg_blk to list new_bll ***/
+void ul_bll_move_mes(ul_blk_bll *new_bll, ul_mem_blk *beg_blk)
+{
+  UL_DRV_LOCK_FINI
+  /* ul_drv *udrv=bll->udrv; */
+  ul_mem_blk *end_blk;
+  int         cnt_blk=1;
+  ul_blk_bll *old_bll;
+  ul_mem_blk *p;
+
+  if(beg_blk==NULL) return;
+  end_blk=beg_blk;
+  while((UL_BLK_HEAD(end_blk).flg&UL_BFL_TAIL)&&UL_BLK_HEAD(end_blk).next)
+    { end_blk=UL_BLK_HEAD(end_blk).next; cnt_blk++; };
+  UL_BLK_HEAD(end_blk).flg&=~UL_BFL_TAIL;
+
+  UL_DRV_LOCK;
+  if((old_bll=UL_BLK_HEAD(beg_blk).bll)!=NULL)
+  {
+    old_bll->cnt-=cnt_blk;
+    if((p=UL_BLK_HEAD(beg_blk).prev)!=NULL)
+    { UL_BLK_HEAD(p).next=UL_BLK_HEAD(end_blk).next;
+      UL_BLK_HEAD(beg_blk).prev=NULL;
+    } else old_bll->first=UL_BLK_HEAD(end_blk).next;
+    if((p=UL_BLK_HEAD(end_blk).next)!=NULL)
+    { UL_BLK_HEAD(p).prev=UL_BLK_HEAD(beg_blk).prev;
+      UL_BLK_HEAD(end_blk).next=NULL;
+    } else old_bll->last=UL_BLK_HEAD(beg_blk).prev;
+  };
+  UL_DRV_UNLOCK;
+
+  p=beg_blk;
+  do UL_BLK_HEAD(p).bll=new_bll; 
+  while ((p=UL_BLK_HEAD(p).next)!=NULL);
+
+  if(new_bll)
+  {
+    UL_DRV_LOCK;
+    if((UL_BLK_HEAD(beg_blk).prev=new_bll->last)!=NULL)
+      UL_BLK_HEAD(new_bll->last).next=beg_blk;
+    else new_bll->first=beg_blk;
+    new_bll->last=end_blk;
+    new_bll->cnt+=cnt_blk;
+    UL_DRV_UNLOCK;
+  };
+};
+
+void ul_free_mes(ul_drv *udrv,ul_mem_blk *beg_blk)
+{
+  ul_mem_blk *blk, *next_blk;
+  if(beg_blk==NULL) return;
+  ul_bll_move_mes(NULL,beg_blk);
+  do {
+    next_blk=beg_blk;
+    beg_blk=UL_BLK_HEAD(beg_blk).next;
+    do {
+      blk=next_blk;
+      next_blk=blk->next;
+      ul_free_blk(udrv,blk);
+    } while(next_blk!=NULL);
+  } while(beg_blk!=NULL);
+};
+
+/*** Free one message starting at beg_blk ***/
+INLINE void ul_bll_free_mes(ul_mem_blk *beg_blk)
+{
+  if(beg_blk==NULL) return;
+  ul_free_mes(UL_BLK_HEAD(beg_blk).bll->udrv,beg_blk);
+};
+
+ul_mem_blk *ul_new_frame_head(ul_drv *udrv, uchar dadr,
+                         uchar sadr, uchar cmd,  unsigned flg)
+{ ul_mem_blk *blk;
+  blk=ul_alloc_blk(udrv);
+  if(blk==NULL) return NULL;
+  UL_BLK_HEAD(blk).prev=NULL;
+  UL_BLK_HEAD(blk).next=NULL;
+  UL_BLK_HEAD(blk).bll=NULL;
+  UL_BLK_HEAD(blk).retry_cnt=0;
+  UL_BLK_HEAD(blk).ref_cnt=0;
+  UL_BLK_HEAD(blk).flg=flg;
+  UL_BLK_HEAD(blk).len=0;
+  UL_BLK_HEAD(blk).cmd=cmd;
+  UL_BLK_HEAD(blk).dadr=dadr;
+  UL_BLK_HEAD(blk).sadr=sadr;
+  UL_BLK_HEAD(blk).stamp=0;
+  return blk;
+};
+
+void ul_tail_frame_head(ul_mem_blk *beg_blk, ul_mem_blk *blk)
+{
+  while(UL_BLK_HEAD(beg_blk).next!=NULL) 
+    beg_blk=UL_BLK_HEAD(beg_blk).next;
+  UL_BLK_HEAD(beg_blk).next=blk;
+  UL_BLK_HEAD(blk).prev=beg_blk;
+  UL_BLK_HEAD(beg_blk).flg|=UL_BFL_TAIL;
+};
+
+unsigned ul_gen_stamp(void)
+{
+  UL_DRV_LOCK_FINI
+  static unsigned ul_stamp_cnt=0; 
+  unsigned stamp;
+  UL_DRV_LOCK;
+  ul_stamp_cnt++;
+  ul_stamp_cnt&=0x7fffffff;
+  if(!ul_stamp_cnt)ul_stamp_cnt++;
+  stamp=ul_stamp_cnt;
+  UL_DRV_UNLOCK;
+  return stamp; 
+};
+
+int ul_inc_ref_cnt(ul_mem_blk *mes)
+{
+  int cnt;
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  UL_BLK_HEAD(mes).ref_cnt++;
+  cnt=UL_BLK_HEAD(mes).ref_cnt;
+  UL_DRV_UNLOCK;
+  return cnt;
+};
+
+int ul_dec_ref_cnt(ul_mem_blk *mes)
+{
+  int cnt;
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  if(UL_BLK_HEAD(mes).ref_cnt)UL_BLK_HEAD(mes).ref_cnt--;
+  cnt=UL_BLK_HEAD(mes).ref_cnt;
+  UL_DRV_UNLOCK;
+  if(!cnt)ul_bll_free_mes(mes);
+  return cnt;
+};
diff --git a/ulan/host/ul_drv/ul_drv/ul_sysless.c b/ulan/host/ul_drv/ul_drv/ul_sysless.c
new file mode 100644 (file)
index 0000000..5003d2a
--- /dev/null
@@ -0,0 +1,64 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_djgpp.c   - DOS DJGPP specific routines
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifdef ENABLE_UL_MEM_CHECK
+void * ul_mem_check_malloc(size_t size)
+{ void *ptr;
+  ptr=malloc(size);
+  if(ptr){
+    ul_mem_check_counter++;
+  }
+  return ptr;
+}
+
+void ul_mem_check_free(void *ptr)
+{
+  if(!ptr) {
+    LOG_FATAL(KERN_CRIT "ul_mem_check_free : triing to free NULL ptr\n");
+  }else{
+    ul_mem_check_counter--;
+    free(ptr);
+  }
+}
+#endif /* ENABLE_UL_MEM_CHECK */
+
+
+int request_irq(int irq,void *handler,int flags,char *name,void *dev_id)
+{
+  HAL_INTERRUPT_ATTACH(irq,uld_irq_handler,dev_id);
+  HAL_INTERRUPT_UNMASK(irq);
+  return irq;
+}
+
+int free_irq(int irq,void *ctx)
+{
+  HAL_INTERRUPT_MASK(irq);
+  HAL_INTERRUPT_DETACH(irq,uld_irq_handler);
+  return 0;
+}
+
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_tors.c b/ulan/host/ul_drv/ul_drv/ul_tors.c
new file mode 100644 (file)
index 0000000..ce4df71
--- /dev/null
@@ -0,0 +1,200 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_tors.c    - initialize and free of one driver
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* initialize and free of one driver */ 
+
+/* set initial state */
+void ul_drv_new_init_state(ul_drv* udrv, int my_adr)
+{
+  /* init sequencer */
+  udrv->fnc_sp=&udrv->fnc_stack[0];
+ #ifdef UL_WITH_FRAME_FSM
+  udrv->fnc_act=&uld_drvloop;
+ #else /*UL_WITH_FRAME_FSM*/
+  udrv->fnc_act=&uld_null_fnc;
+ #endif /*UL_WITH_FRAME_FSM*/
+  udrv->my_adr=my_adr;
+ #ifdef uld_kwt_wq_init
+  uld_kwt_wq_init(udrv);
+ #endif
+  udrv->fnc_timeout=NULL;
+  /* udrv->flags=0; */
+  udrv->magic=UL_DRV_MAGIC;
+  udrv->operators=NULL;
+}
+
+/* setups buffers, ports and irq for sucesfully detected device */
+int ul_drv_new_start(ul_drv* udrv, unsigned buffer_size)
+{ int ret;
+  int test_cnt;
+  #ifdef FOR_LINUX_KERNEL
+   unsigned long probe_irqs;
+  #endif /* FOR_LINUX_KERNEL */
+  /* init ports */
+  ret=udrv->fnc_cctrl(udrv,UL_CC_PINIT,0);
+  UL_PRINTF(KERN_INFO "uLan_pinit ret %d\n",ret);
+  if(ret>=0)
+  { /* take buffer memory */
+    ret=ul_mem_init(udrv,buffer_size);
+    UL_PRINTF(KERN_INFO "ul_mem_init ret %d\n",ret);
+    if(ret>=0)
+    { /* request irq */
+      test_cnt=3;
+      ret=udrv->fnc_cctrl(udrv,UL_CC_RQIRQ,0);
+     #ifdef UL_WITH_FRAME_FSM
+      if(ret==UL_RC_ENOFNC){ /* default IRQ handling */
+       ret=0;
+       #ifdef FOR_LINUX_KERNEL
+       while(test_cnt--&&udrv->irq<=0)
+       { /* probe for IRQ */
+         probe_irq_off(probe_irq_on());
+         probe_irqs=probe_irq_on();
+         ret=udrv->fnc_cctrl(udrv,UL_CC_GENIRQ,1);
+         udelay(100);
+         udrv->irq=probe_irq_off(probe_irqs);
+         ret=udrv->fnc_cctrl(udrv,UL_CC_GENIRQ,0);
+         UL_PRINTF(KERN_INFO "uLan ul_drv_new : probed irq %d\n",udrv->irq);
+       };
+       #endif /* FOR_LINUX_KERNEL */
+       if(udrv->irq<=0) ret=-1;
+         #ifndef _WIN32
+         else ret=request_irq(udrv->irq, uld_irq_handler, 
+                              UL_IRQF_FLAGS , "ulan", udrv);
+         #endif /* _WIN32 */
+      }
+     #endif /*UL_WITH_FRAME_FSM*/
+      if (ret>=0)
+      { /* sucessful initialization */
+       INIT_UDRV_WDTIM(udrv);
+       INIT_UDRV_BH(udrv);
+       uld_set_dfl(udrv,CHIPOK);
+       return 0;
+      } else UL_PRINTF(KERN_ERR "uLan ul_drv_new : cannot request irq %d\n",udrv->irq);
+      ul_mem_done(udrv);
+    } else UL_PRINTF(KERN_ERR "uLan ul_drv_new : no memory for buffers\n");
+    ret=udrv->fnc_cctrl(udrv,UL_CC_PDONE,0);
+  } else UL_PRINTF(KERN_ERR "uLan ul_drv_new : port 0x%lx init error\n",
+                   udrv->port);
+  return -1;
+}
+
+#ifndef _WIN32
+
+/* initialize new driver from given parameters */
+ul_drv *ul_drv_new(int port, int irq, int baud, int my_adr, char *chip_name, long baudbase)
+{
+  ul_drv* udrv;
+  int ret;
+  int chipidx=0;
+  int chipprobe=1;
+  /* covert chip name to index */
+  if(chip_name&&strcmp(chip_name,"auto")) {
+    for(chipidx=0;1;chipidx++){
+      if(!ul_chip_types[chipidx].chip_name){
+       UL_PRINTF(KERN_ERR "uLan ul_drv_new : unknown chip type %s\n",chip_name);
+       return NULL;
+      }
+      if(!strcmp(ul_chip_types[chipidx].chip_name,chip_name)){
+       chipprobe=0; break;
+      }
+    }
+  }
+  UL_PRINTF(KERN_INFO "uLan ul_drv_new : chip %s index %d probe %d\n",
+                chip_name?chip_name:"auto",chipidx,chipprobe);
+  /* mem for ul_drv */
+  if(!(udrv=MALLOC(sizeof(ul_drv)))) return NULL;
+  /* clear memory */
+  memset(udrv,0,sizeof(ul_drv));
+  /* set initial state */
+  ul_drv_new_init_state(udrv, my_adr);
+  /* init chip driver */
+  ret=-1;
+  do{
+    ul_chip_init_fnc *chip_init;
+    int chip_flags=ul_chip_types[chipidx].chip_flags;
+    int chip_options=ul_chip_types[chipidx].chip_options;
+    chip_init=ul_chip_types[chipidx].chip_init;
+    if(chipprobe&&(ul_chip_types[chipidx].chip_flags&UL_CHIPT_NOPROBE))
+      continue;
+    /* if(ret=u510_init(udrv, port, irq, baud, baudbase))>=0) */
+    if((chip_flags&UL_CHIPT_RQPORT)&&!port) continue;
+    if((chip_flags&UL_CHIPT_RQIRQ)&&!irq) continue;
+    if((ret=(*chip_init)(udrv, port, irq, baud, baudbase, chip_options))>=0){
+      UL_PRINTF(KERN_INFO "uLan ul_drv_new : %s found at 0x%lx\n",
+                ul_chip_types[chipidx].chip_name,udrv->port);
+      break;
+    }
+  }while(chipprobe&&ul_chip_types[++chipidx].chip_name);
+  if(ret>=0)
+  { /* setups buffers, ports and irq for sucesfully detected device */
+    if(ul_drv_new_start(udrv,ulbuffer)>=0)
+      return udrv;
+  }
+  UL_PRINTF(KERN_ERR "uLan ul_drv_new : failed to init\n");
+  FREE(udrv);
+  return NULL;
+};
+
+/* destroy driver */
+void ul_drv_free(ul_drv *udrv)
+{
+  if(!udrv) return;
+  if(uld_test_dfl(udrv,CHIPOK))
+  { if(udrv->fnc_cctrl(udrv,UL_CC_FREEIRQ,0)==UL_RC_ENOFNC)
+      if(udrv->irq)
+        free_irq(udrv->irq,udrv); 
+  }
+  if(udrv->irq>0) ul_synchronize_irq(udrv->irq);
+  KILL_UDRV_BH(udrv);
+  DONE_UDRV_WDTIM(udrv);
+  schedule();
+  if(uld_test_dfl(udrv,CHIPOK))
+  { uld_clear_dfl(udrv,CHIPOK);
+    udrv->fnc_cctrl(udrv,UL_CC_PDONE,0);
+  };
+  if(udrv->irq>0) ul_synchronize_irq(udrv->irq);
+  KILL_UDRV_BH(udrv);
+  { /* first not complete sanity check of client list */
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    while((opptr=udrv->operators)!=NULL){
+      udrv->operators=opptr->opnext; 
+      if(udrv->operators!=NULL) udrv->operators->opprew=NULL;
+      opptr->udrv=NULL;
+     #ifdef FOR_LINUX_KERNEL
+      wake_up_interruptible(&opptr->wqrec);
+     #endif /*FOR_LINUX_KERNEL*/
+    }
+    UL_DRV_UNLOCK;
+  };
+  ul_mem_done(udrv);
+  FREE(udrv);
+};
+
+#endif /* _WIN32 */
diff --git a/ulan/host/ul_drv/ul_drv/ul_tst.c b/ulan/host/ul_drv/ul_drv/ul_tst.c
new file mode 100644 (file)
index 0000000..c832d3d
--- /dev/null
@@ -0,0 +1,124 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_tst.c     - some routines for kernel internal tests of driver
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* Some internal test routines */
+
+/* standard command codes 
+   00H .. 3FH    store to buffer 
+   40H .. 7FH    store to buffer without ACK
+   80H .. 9FH    proccess at onece
+   A0H .. BFH    process with additional receive
+   C0H .. FFH    process with additional send
+*/
+
+#define UL_CMD_RES     0x80    /* Reinitialize RS485 */
+#define UL_CMD_SFT     0x81    /* Test free space in input buffer */
+#define UL_CMD_SID     0xF0    /* Send identification */
+#define UL_CMD_SFI     0xF1    /* Send amount of free space in IB */
+#define UL_CMD_TF0     0x98    /* End of stepping */
+#define UL_CMD_TF1     0x99    /* Begin of stepping */
+#define UL_CMD_STP     0x9A    /* Do step */
+#define UL_CMD_DEB     0x9B    /* Additional debug commands */
+#define UL_CMD_SPC     0xDA    /* Send state - for 8051 PCL PCH PSW ACC */
+
+#define UL_CMD_RDM     0xF8    /* Read memory   T T B B L L */
+#define UL_CMD_WRM     0xB8    /* Write mamory  T T B B L L */
+
+void genrdmemblk(ul_drv *udrv, uchar dadr, int mtyp, int mbeg, int mlen)
+{
+  ul_mem_blk *blk, *beg_blk;
+  ul_data_it di;
+  blk=ul_new_frame_head(udrv, 3, 2, UL_CMD_RDM,
+       UL_BFL_M2IN|UL_BFL_TAIL|UL_BFL_SND|
+       UL_BFL_PRQ|UL_BFL_ARQ);
+  if(blk==NULL) return;
+  beg_blk=blk;
+  ul_di_init(&di,blk);
+  /* ul_di_write1(&di,0); */
+  ul_di_write1(&di,(uchar)mtyp);
+  ul_di_write1(&di,(uchar)(mtyp>>8));
+  ul_di_write1(&di,(uchar)mbeg);
+  ul_di_write1(&di,(uchar)(mbeg>>8));
+  ul_di_write1(&di,(uchar)mlen);
+  ul_di_write1(&di,(uchar)(mlen>>8));
+  UL_BLK_HEAD(blk).len=di.pos;
+
+  blk=ul_new_frame_head(udrv, 0, 0, 0,
+       UL_BFL_M2IN|UL_BFL_REC|
+       UL_BFL_PRQ|UL_BFL_ARQ /*|UL_BFL_LNMM*/);
+  if(blk==NULL) { ul_free_blk(udrv,beg_blk); return;};
+  /* UL_BLK_HEAD(blk).len=mlen; */
+  ul_tail_frame_head(beg_blk,blk);
+  ul_bll_move_mes(&udrv->prep_bll,beg_blk);
+};
+
+void geninfoblk(ul_drv *udrv)
+{
+  static int seq_num=0;
+  ul_mem_blk *blk, *beg_blk;
+  ul_data_it di;
+  blk=ul_new_frame_head(udrv, 3, 2, UL_CMD_SID,
+       UL_BFL_M2IN|UL_BFL_TAIL|UL_BFL_SND|
+       UL_BFL_PRQ|UL_BFL_ARQ);
+  if(blk==NULL) return;
+  beg_blk=blk;
+  ul_di_init(&di,blk);
+  /* ul_di_write1(&di,0); */
+  ul_di_write1(&di,1);
+  ul_di_write1(&di,2);
+  ul_di_write1(&di,3);
+  ul_di_write1(&di,(uchar)(seq_num++));
+  UL_BLK_HEAD(blk).len=di.pos;
+
+  blk=ul_new_frame_head(udrv, 0, 0, 0,
+       UL_BFL_M2IN|UL_BFL_REC|
+       UL_BFL_PRQ|UL_BFL_ARQ);
+  if(blk==NULL) { ul_free_blk(udrv,beg_blk); return;};
+  ul_tail_frame_head(beg_blk,blk);
+  ul_bll_move_mes(&udrv->prep_bll,beg_blk);
+};
+
+void gentestblk(ul_drv *udrv)
+{
+  static int seq_num=0;
+  ul_mem_blk *blk;
+  ul_data_it di;
+  blk=ul_new_frame_head(udrv, 3, 2, 0x23,
+       UL_BFL_M2IN|UL_BFL_SND|UL_BFL_ARQ);
+  if(blk==NULL) return;
+  ul_di_init(&di,blk);
+  /* ul_di_write1(&di,0); */
+  ul_di_write1(&di,0x11);
+  ul_di_write1(&di,0x12);
+  ul_di_write1(&di,0x13);
+  ul_di_write1(&di,(uchar)(seq_num++));
+  UL_BLK_HEAD(blk).len=di.pos;
+
+  ul_bll_move_mes(&udrv->prep_bll,blk);
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_ufsm.c b/ulan/host/ul_drv/ul_drv/ul_ufsm.c
new file mode 100644 (file)
index 0000000..fa07641
--- /dev/null
@@ -0,0 +1,402 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_ufsm.c    - finite state machine for building and receiving
+                  message frames on UART devices
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+/*******************************************************************/
+/* uLan main driver automata loop */
+
+ul_call_fnc uld_drvloop_proc_1, uld_drvloop_proc_2;
+ul_call_fnc uld_drvloop_rec_1, uld_drvloop_rec_2, uld_drvloop_rec_3, uld_drvloop_rec_4;
+
+int uld_drvloop(ul_drv *udrv, int ret_code)
+{
+  if(((udrv->char_buff==(udrv->my_adr|0x100))||
+      (udrv->char_buff==0x100))&&
+     (udrv->char_buff==udrv->last_ctrl))
+  { /* it seems, that somebody wants us  */
+    udrv->con_flg=0;
+    udrv->xor_sum=udrv->char_buff+1;
+    UL_FCALL2(uld_recbeg_1,uld_drvloop_rec_1);
+    return UL_RC_PROC;
+  };
+
+  if(udrv->prep_bll.first!=NULL) /* we have something to proccess  */
+  {
+    LOG_CHIO(" call connect ");
+    UL_FCALL2(*udrv->fnc_connect,uld_drvloop_proc_1);
+    return UL_RC_PROC;
+  };
+
+  udrv->char_buff=0;
+  UL_FCALL(*udrv->fnc_recch);
+  return UL_RC_PROC;
+};
+
+int uld_drvloop_proc_error(ul_drv *udrv)
+{ ul_mem_blk *mes;
+  udrv->fnc_timeout=NULL;
+  LOG_MESSAGES("uLan : send message ERROR\n");
+  if((mes=udrv->con_message)!=NULL)
+  {udrv->con_message=NULL;
+   if((UL_BLK_HEAD(mes).flg&UL_BFL_NORE)||
+      (++UL_BLK_HEAD(mes).retry_cnt>=UL_RETRY_CNT))
+   { UL_BLK_HEAD(mes).flg|=UL_BFL_FAIL;
+     ul_bll_move_mes(&udrv->proc_bll,mes);
+     LOG_FAILS(KERN_ERR "uLan : send message (d:%d,s:%d,c:%X,f:%X,l:%d) FAILED after %d attempts\n",
+                   UL_BLK_HEAD(mes).dadr,UL_BLK_HEAD(mes).sadr,
+                   UL_BLK_HEAD(mes).cmd,UL_BLK_HEAD(mes).flg,
+                   UL_BLK_HEAD(mes).len,UL_BLK_HEAD(mes).retry_cnt);
+     SCHEDULE_BH(udrv);
+   }else if(UL_BLK_HEAD(mes).flg&UL_BFL_REWA)
+     ul_bll_move_mes(&udrv->prep_bll,mes);
+  };
+  udrv->char_buff=0x1FF; 
+  return 0;
+};
+
+int uld_drvloop_proc_1(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) {UL_FNEXT(uld_drvloop); return UL_RC_PROC;};
+  LOG_MESSAGES("uLan : begin of send message\n");
+  udrv->fnc_timeout=&uld_drvloop_proc_error;
+  udrv->con_message=udrv->prep_bll.first;
+  UL_FCALL2(uld_prmess,uld_drvloop_proc_2);
+  return UL_RC_PROC;
+};
+
+int uld_drvloop_proc_2(ul_drv *udrv, int ret_code)
+{
+  ul_mem_blk *mes;
+  udrv->fnc_timeout=NULL;
+  udrv->char_buff=udrv->my_adr|0x180; 
+  UL_FCALL2(*udrv->fnc_sndch,uld_drvloop);
+  if(udrv->con_message==NULL) return UL_RC_PROC;
+  if(ret_code<0)
+  {uld_drvloop_proc_error(udrv);
+  }else{
+    LOG_MESSAGES("uLan : send message finished OK\n");
+    mes=udrv->con_message;
+    udrv->con_message=NULL;
+    if(UL_BLK_HEAD(mes).flg&UL_BFL_M2IN || 
+       UL_BLK_HEAD(mes).dadr==udrv->my_adr)
+    {
+      ul_bll_move_mes(&udrv->proc_bll,mes);
+      SCHEDULE_BH(udrv);
+    } else
+     ul_bll_free_mes(mes);
+  };
+  return UL_RC_PROC;
+};
+
+int uld_drvloop_rec_error(ul_drv *udrv)
+{ ul_mem_blk *mes;
+  udrv->fnc_timeout=NULL;
+  LOG_MESSAGES("uLan : receive message ERROR\n");
+  if((mes=udrv->con_message)!=NULL)
+  { udrv->con_message=NULL;
+    ul_bll_free_mes(mes);
+  };
+  udrv->char_buff=0x1FF;
+  return 0;
+};
+
+int uld_drvloop_rec_1(ul_drv *udrv, int ret_code)
+{ ul_mem_blk *mes;
+  if(ret_code<0) {UL_FNEXT(uld_drvloop); return UL_RC_PROC;};
+  LOG_MESSAGES("uLan : begin of receive message\n");
+  mes=ul_new_frame_head(udrv,udrv->con_dadr,udrv->con_sadr, 
+                       udrv->con_cmd,0);
+  if(mes==NULL) 
+  { LOG_FAILS(KERN_ERR "uLan : NO memory for receive\n");
+    UL_FNEXT(uld_drvloop); return UL_RC_PROC;
+  };
+  ul_bll_ins(&udrv->work_bll,mes);
+  udrv->con_message=mes;
+  udrv->fnc_timeout=&uld_drvloop_rec_error;
+  udrv->con_frame=mes;
+  UL_FCALL2(uld_recdata,uld_drvloop_rec_2);
+  return UL_RC_PROC;
+};
+
+int uld_drvloop_rec_2(ul_drv *udrv, int ret_code)
+{
+  if(ret_code<0) 
+  { uld_drvloop_rec_error(udrv);
+    UL_FNEXT(uld_drvloop); return UL_RC_PROC;
+  };
+  #ifdef UL_WITH_IAC
+    UL_FCALL2(uld_recend,uld_drvloop_rec_3);
+  #else 
+    UL_FCALL2(uld_recend,uld_drvloop_rec_4);
+  #endif /* UL_WITH_IAC  */
+  return UL_RC_PROC;
+};
+
+#ifdef UL_WITH_IAC
+int uld_drvloop_rec_3(ul_drv *udrv, int ret_code)
+{ 
+  if(ret_code<0) 
+  { uld_drvloop_rec_error(udrv);
+    UL_FNEXT(uld_drvloop); return UL_RC_PROC;
+  };
+  UL_FCALL2(uld_prmess_iac,uld_drvloop_rec_4);
+  return UL_RC_PROC;
+}
+#endif /* UL_WITH_IAC  */
+
+int uld_drvloop_rec_4(ul_drv *udrv, int ret_code)
+{ ul_mem_blk *mes;
+  if(ret_code<0) 
+  { uld_drvloop_rec_error(udrv);
+    UL_FNEXT(uld_drvloop); return UL_RC_PROC;
+  };
+  mes=udrv->con_message;
+  udrv->fnc_timeout=NULL;
+  udrv->con_message=NULL;
+  if (ret_code==UL_RC_FREEMSG) {
+    ul_bll_free_mes(mes);
+    UL_FNEXT(uld_drvloop);
+    LOG_MESSAGES("uLan : receive message was freed\n");
+    return UL_RC_PROC;
+  }
+  UL_BLK_HEAD(mes).stamp=ul_gen_stamp();
+  ul_bll_move_mes(&udrv->proc_bll,mes);
+  SCHEDULE_BH(udrv);
+  UL_FNEXT(uld_drvloop);
+  LOG_MESSAGES("uLan : end of receive message\n");
+  return UL_RC_PROC;
+};
+
+int ul_max_cycle_cnt=0;
+int ul_max_cycle_time=0;
+int ul_irq_seq_num=0;
+#ifdef ENABLE_UL_IRQ_STALE_WDG 
+int ul_irq_stale_wdg_cnt=0;
+#endif /* ENABLE_UL_IRQ_STALE_WDG */
+
+/*** Interrupt entry point ***/
+ul_irqreturn_t uld_irq_handler(UL_IRQ_HANDLER_ARGS(intno, dev_id))
+{
+  #ifdef UL_GLOBAL_IRQ_LOCK_FINI
+   UL_GLOBAL_IRQ_LOCK_FINI
+  #endif
+  int irq_loop_cnt=0;
+  int cycle_cnt=0;
+  int cycle_time;
+  int ret_code;
+  #ifdef UL_LOG_ENABLE
+    int seq_num=++ul_irq_seq_num;
+  #endif
+  ul_drv* udrv=(ul_drv*)dev_id;
+  if(udrv->magic!=UL_DRV_MAGIC)
+  {
+    #ifdef FOR_LINUX_KERNEL
+     panic("uld_irq_handler : BAD udrv magic !!!");
+    #elif defined(_WIN32)
+     UL_PRINTF("uld_irq_handler : BAD udrv magic !!!\n");
+     return FALSE;
+    #elif defined(__DJGPP__)||defined(CONFIG_OC_UL_DRV_SYSLESS)
+     UL_PRINTF("uld_irq_handler : BAD udrv magic !!!\n");
+     return;
+    #else
+     error("uld_irq_handler : BAD udrv magic !!!");
+    #endif
+  }
+  #ifdef UL_GLOBAL_IRQ_LOCK
+   UL_GLOBAL_IRQ_LOCK;
+  #endif
+
+  if(uld_test_dfl(udrv,CHIPOK))
+  do
+  { 
+    #ifdef ENABLE_UL_IRQ_STALE_WDG     
+    /* last rescue code for stale IRQ !!!!!! */
+    if(ul_irq_stale_wdg_cnt++>10000)
+    {
+      SCHEDULE_BH(udrv); /* Test activation of BH */
+      if(ul_irq_stale_wdg_cnt>20000)
+      {
+       LOG_FATAL(KERN_CRIT "Stale IRQ uLan IRQ signal !!!\n");
+       udrv->fnc_cctrl(udrv,UL_CC_GENIRQ,0);
+       if(ul_irq_stale_wdg_cnt<25000) break;
+       #ifdef FOR_LINUX_KERNEL
+        LOG_FATAL(KERN_CRIT "Disabling IRQ %d forever !!!\n",intno);
+        disable_irq_nosync(intno);
+       #endif
+       break;
+      }
+    } 
+    #endif /* ENABLE_UL_IRQ_STALE_WDG */
+    do /* IRQ fully SMP and re-entrant processing */
+    {
+      uld_set_dfl(udrv,ASK_ISR);
+      if(uld_test_and_set_dfl(udrv,IN_ISR))
+      { LOG_IRQ("uLan IRQ %d arrived, but else is in ISR\n",intno);
+        break;
+      };
+
+      /* only one CPU in no nested levels at time */
+      uld_clear_dfl(udrv,ASK_ISR);
+
+      while((ret_code=udrv->fnc_pool(udrv))!=0)
+      {
+       LOG_SEQNUM("\n<<< seq %d ",seq_num);
+       LOG_IRQ("uLan IRQ %d arrived, code = %d\n",intno,ret_code);
+       cycle_time=RDTSC;
+       while((ret_code=udrv->fnc_act(udrv,ret_code))!=0) 
+         if(cycle_cnt++>100) 
+           {LOG_FATAL(KERN_CRIT "Infinite loop in uLan IRQ handler !!!\n");break;};
+       cycle_time=RDTSC-cycle_time;
+       if(cycle_cnt>ul_max_cycle_cnt) ul_max_cycle_cnt=cycle_cnt;
+       if(cycle_time>ul_max_cycle_time) ul_max_cycle_time=cycle_time;
+       LOG_SEQNUM(" seq %d >>>",seq_num);
+       if(irq_loop_cnt++>10)
+       { LOG_FATAL(KERN_CRIT "Stale IRQ - uLan state handlers !!!\n");
+         udrv->fnc_cctrl(udrv,UL_CC_GENIRQ,0);
+         break;
+       };
+       uld_atomic_clear_dfl(udrv,NACTIV);
+      };
+      uld_atomic_clear_dfl(udrv,IN_ISR);
+    }
+    while(uld_atomic_test_dfl(udrv,ASK_ISR));
+
+  }while(0);
+  #ifdef UL_GLOBAL_IRQ_UNLOCK
+   UL_GLOBAL_IRQ_UNLOCK;
+  #endif
+   return UL_IRQ_RETVAL(irq_loop_cnt);
+};
+
+/*** Timeout entry point ***/
+void uld_timeout(ul_drv *udrv)
+{
+  #ifdef UL_GLOBAL_IRQ_LOCK_FINI
+   UL_GLOBAL_IRQ_LOCK_FINI
+  #endif
+  #if defined(_WIN32)&&defined(UL_WITH_PCI)
+   KIRQL old_irql;
+  #endif
+  int cycle_cnt=0;
+  int cycle_time;
+  int ret_code=0;
+  #ifdef UL_GLOBAL_IRQ_LOCK
+   UL_GLOBAL_IRQ_LOCK;
+  #endif
+  LOG_IRQ("uLan timeout activated\n");
+  if(uld_test_dfl(udrv,CHIPOK))
+  {
+    #ifdef FOR_LINUX_KERNEL
+    if(udrv->irq) disable_irq_nosync(udrv->irq);
+    #elif defined(_WIN32)&&defined(UL_WITH_PCI)
+    KeRaiseIrql(uL_SpinLock_Irql,&old_irql);
+    #endif
+    do
+    {
+      if(uld_test_and_set_dfl(udrv,IN_ISR))
+      { LOG_IRQ("uLan timeout, but else is in ISR\n");
+        break;
+      };
+
+      /* only one CPU with no nested levels goes there */
+      uld_clear_dfl(udrv,ASK_ISR);
+      if((ret_code=udrv->fnc_pool(udrv))==0)
+      {/* if first pass check for timeout conditions */
+       if(!cycle_cnt&&(uld_atomic_test_dfl(udrv,NACTIV)||
+            (udrv->last_ctrl&0x80)))
+       { cycle_cnt++;
+         uld_clear_dfl(udrv,WDFORCED);
+         if(udrv->fnc_timeout) ret_code=udrv->fnc_timeout(udrv);
+         if(ret_code==0)
+         {udrv->fnc_sp=&udrv->fnc_stack[0];
+          udrv->fnc_act=&uld_drvloop;
+          ret_code=UL_RC_ACTIVATE;
+         };
+       };
+      };
+      cycle_time=RDTSC;
+      while(ret_code)
+      { ret_code=udrv->fnc_act(udrv,ret_code);
+        if(cycle_cnt++>100) 
+         {LOG_FATAL(KERN_CRIT "Infinite loop in uLan Timeout handler !!!\n");break;};
+      };
+      cycle_time=RDTSC-cycle_time;
+      if(cycle_cnt>ul_max_cycle_cnt) ul_max_cycle_cnt=cycle_cnt;
+      if(cycle_time>ul_max_cycle_time) ul_max_cycle_time=cycle_time;
+      uld_clear_dfl(udrv,NACTIV);
+      uld_atomic_clear_dfl(udrv,IN_ISR);
+    }
+    while(uld_atomic_test_dfl(udrv,ASK_ISR));
+    #ifdef FOR_LINUX_KERNEL
+     if(udrv->irq) enable_irq(udrv->irq);
+    #elif defined(_WIN32)&&defined(UL_WITH_PCI)
+     KeLowerIrql(old_irql);
+    #endif
+  };
+  #ifdef UL_GLOBAL_IRQ_UNLOCK
+   UL_GLOBAL_IRQ_UNLOCK;
+  #endif
+};
+
+/* link watchdog timer function */
+#ifdef _WIN32
+VOID  ulan_wd_dpc(IN PKDPC Dpc,IN PVOID data,
+                 IN PVOID arg1,IN PVOID arg2)
+#else /* _WIN32 */
+ void ulan_do_wd_timer(unsigned long data)
+#endif /* _WIN32 */
+{
+  ul_drv* udrv=(ul_drv*)data;
+  if(udrv->magic!=UL_DRV_MAGIC)
+  {
+    #ifdef FOR_LINUX_KERNEL
+     panic("ulan_do_wd_timer : BAD udrv magic !!!");
+    #elif defined(_WIN32)||defined(__DJGPP__)||defined(CONFIG_OC_UL_DRV_SYSLESS)
+     UL_PRINTF("ulan_do_wd_timer : BAD udrv magic !!!\n");
+     return;
+    #else
+     error("ulan_do_wd_timer : BAD udrv magic !!!");
+    #endif
+  }
+  if(!uld_test_dfl(udrv,CHIPOK)) return;
+
+  if((udrv->prep_bll.first!=NULL)||uld_test_dfl(udrv,WDFORCED))
+  {
+    if(uld_test_and_set_dfl(udrv,NACTIV)||
+      (udrv->last_ctrl&0x80)) uld_timeout(udrv);
+    #ifndef _WIN32  
+     SCHEDULE_UDRV_WDTIM(udrv,jiffies+ULD_HZ/25+1);
+    #else /* _WIN32 */
+     { LARGE_INTEGER delay;
+       delay=RtlConvertLongToLargeInteger(-40*10000);
+       KeSetTimer(&udrv->wd_timer,delay,&udrv->wd_timer_dpc);
+     }
+    #endif /* _WIN32 */
+  };
+};
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdbase.c b/ulan/host/ul_drv/ul_drv/ul_wdbase.c
new file mode 100644 (file)
index 0000000..7006c5c
--- /dev/null
@@ -0,0 +1,1029 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_wdbase.c  - common Windows NT KDM and Win2k WDM driver code
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+// This variable has to be initialized by RtlConvertLongToLargeInteger(0) in DriverEntry
+LARGE_INTEGER ULD_LARGE_INTEGER_0;
+
+//-------------------------------------------------------------------
+// Memory check
+
+#ifdef ENABLE_UL_MEM_CHECK
+void * ul_mem_check_malloc(size_t size)
+{ void *ptr;
+  ptr=ExAllocatePool(NonPagedPool,size);
+  if(ptr) InterlockedIncrement(&ul_mem_check_counter);
+  return ptr;
+}
+
+void ul_mem_check_free(void *ptr)
+{
+  if(ptr) InterlockedDecrement(&ul_mem_check_counter);
+  ExFreePool(ptr);
+}
+#endif /* ENABLE_UL_MEM_CHECK */
+
+//-------------------------------------------------------------------
+//
+//  Begin FUNCTIONS
+//
+
+NTSTATUS
+ulan_GetRegistryDword(
+    IN      PWCHAR    RegPath,
+    IN      PWCHAR    ValueName,
+    IN OUT  PULONG    Value
+    )
+
+/*++
+
+Routine Description:
+
+       Obtain a Dword value from the registry
+
+
+Arguments:
+
+    RegPath  -- supplies absolute registry path
+    ValueName    - Supplies the Value Name.
+    Value      - receives the REG_DWORD value.
+
+Return Value:
+
+    TRUE if successfull, FALSE on fail.
+
+--*/
+
+{
+  UNICODE_STRING path;
+  RTL_QUERY_REGISTRY_TABLE paramTable[2];  //zero'd second table terminates parms
+  ULONG lDef = *Value;                     // default
+  NTSTATUS status;
+  WCHAR wbuf[ MAXIMUM_FILENAME_LENGTH ];
+
+  path.Length = 0;
+  path.MaximumLength = MAXIMUM_FILENAME_LENGTH * sizeof( WCHAR );  // MAXIMUM_FILENAME_LENGTH defined in wdm.h
+  path.Buffer = wbuf;
+
+  RtlZeroMemory(path.Buffer, path.MaximumLength);
+  RtlMoveMemory(path.Buffer, RegPath, wcslen( RegPath) * sizeof( WCHAR ));
+
+  RtlZeroMemory(paramTable, sizeof(paramTable));
+
+  paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+  paramTable[0].Name = ValueName;
+  paramTable[0].EntryContext = Value;
+  paramTable[0].DefaultType = REG_DWORD;
+  paramTable[0].DefaultData = &lDef;
+  paramTable[0].DefaultLength = sizeof(ULONG);
+
+
+  status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
+                                  path.Buffer, paramTable, NULL, NULL);
+
+  return status;
+}
+
+//-------------------------------------------------------------------
+// ScanForPCICard for WinNT KMD
+// WDM uses different technique to query VENDOR_ID and DEVICE_ID
+// for example PCI\VEN_1415&DEV_950A&SUBSYS_00001415&REV_00
+
+#ifdef UL_WITH_PCI
+
+#ifdef FOR_WIN_WDM
+
+BOOLEAN FindPciHWID(PWCHAR HWID,
+                   OUT pci_device_id_t **Ppci_device_id
+                  )
+{
+  PWCHAR pwcH, pwcM;
+  WCHAR  fldName;
+  USHORT vendorID=0;
+  USHORT deviceID=0;
+  USHORT subvendorID=0;
+  USHORT subdeviceID=0;
+  ULONG  val, i, c;
+  static WCHAR PciHWIDMask[]=L"PCI\\VEN_vvvv&DEV_xxxx&SUBSYS_sssswwww";
+  pci_device_id_t *device_id;
+
+  *Ppci_device_id=NULL;
+  if(HWID==NULL) return FALSE;
+
+  pwcH=HWID;
+  pwcM=PciHWIDMask;
+  while(*pwcH&&*pwcM) {
+    if(*pwcH==*pwcM){
+      pwcH++; pwcM++;
+      continue;
+    }
+    fldName=*pwcM;
+    if((fldName!='v')&&(fldName!='x')&&
+       (fldName!='s')&&(fldName!='w')) break;
+    val=0;
+    for(i=4;i--;){
+      c=*(pwcH++); pwcM++;
+      if(c<='9') c-='0';
+      else if(c<='F') c=c-'A'+10;
+      else if(c<='f') c=c-'a'+10;
+      if(c>15) {val=0;break;}
+      val<<=4;
+      val+=c;
+    }
+    switch (fldName) {
+      case 'v':
+        vendorID=(USHORT)val;
+       break;
+      case 'x':
+        deviceID=(USHORT)val;
+       break;
+      case 'w':
+        subvendorID=(USHORT)val;
+       break;
+      case 's':
+        subdeviceID=(USHORT)val;
+       break;
+    }
+  }
+#if DBG
+  uLan_DbgPrint("uLan: PCI - Ven %04X Dev %04X SubVen %04X SubDev %04X\n", 
+                 vendorID,deviceID,subvendorID,subdeviceID);
+#endif
+
+  for(device_id=ulan_pci_tbl;device_id->vendor;device_id++){
+    if((device_id->vendor!=PCI_ANY_ID)&&(device_id->vendor!=vendorID)) continue;
+    if((device_id->device!=PCI_ANY_ID)&&(device_id->device!=deviceID)) continue;
+    if((device_id->subvendor!=PCI_ANY_ID)&&(device_id->vendor!=subvendorID)) continue;
+    if((device_id->subdevice!=PCI_ANY_ID)&&(device_id->device!=subdeviceID)) continue;
+    *Ppci_device_id=device_id;
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+#else /* !FOR_WIN_WDM */
+
+BOOLEAN ScanForPCICard(IN OUT PULONG PBusNumber,
+                       IN OUT PPCI_SLOT_NUMBER PSlotNumber,
+                       IN BOOLEAN FindFirst,
+                      OUT pci_device_id_t **Ppci_device_id
+                     )
+{
+  ULONG BusNumber=*PBusNumber;
+  PCI_SLOT_NUMBER SlotNumber=*PSlotNumber;
+  UCHAR Buffer[2*sizeof(USHORT)];
+  ULONG Readed=sizeof(Buffer);
+  pci_device_id_t *device_id;
+
+  while(1){
+    if(FindFirst){
+      BusNumber=0;
+      SlotNumber.u.AsULONG=0;
+      FindFirst=0;
+    }else{
+      if(Readed>2){
+        SlotNumber.u.bits.FunctionNumber=
+            (SlotNumber.u.bits.FunctionNumber+1)&7;
+      }else{
+        SlotNumber.u.bits.FunctionNumber=0;
+      }
+      if(!SlotNumber.u.bits.FunctionNumber){
+        if(!Readed&&!SlotNumber.u.bits.DeviceNumber)
+            break;
+        SlotNumber.u.bits.DeviceNumber=
+            (SlotNumber.u.bits.DeviceNumber+1)&0x1f;
+        if(!SlotNumber.u.bits.DeviceNumber)
+            BusNumber++;
+      }
+    }
+
+    Readed=HalGetBusData(PCIConfiguration,BusNumber,SlotNumber.u.AsULONG,
+                         Buffer,sizeof(Buffer));
+    if(Readed==sizeof(Buffer)){
+      for(device_id=&ulan_pci_tbl[0];device_id->vendor;device_id++){
+        if((((PPCI_COMMON_CONFIG)Buffer)->VendorID==device_id->vendor)&&
+           (((PPCI_COMMON_CONFIG)Buffer)->DeviceID==device_id->device)){
+            *PBusNumber=BusNumber;
+            *PSlotNumber=SlotNumber;
+            if(Ppci_device_id)
+                *Ppci_device_id=device_id;
+            return TRUE;
+        }
+      }
+    }
+  }
+
+  return FALSE;
+}                    
+
+#endif /* FOR_WIN_WDM */
+
+#endif /*UL_WITH_PCI*/
+
+//-------------------------------------------------------------------
+// WDM uses different technique to query VENDOR_ID and DEVICE_ID
+// for example USB\Vid_dead&Pid_1001&REV_0001
+
+#ifdef UL_WITH_USB
+
+BOOLEAN FindUsbHWID(PWCHAR HWID,
+                   OUT usb_device_id_t **Pusb_device_id
+                  )
+{
+  PWCHAR pwcH, pwcM;
+  WCHAR  fldName;
+  USHORT vendorID=0;
+  USHORT productID=0;
+  ULONG  val, i, c;
+  static WCHAR UsbHWIDMask[]=L"USB\\Vid_vvvv&Pid_pppp";
+  usb_device_id_t *device_id;
+
+  *Pusb_device_id=NULL;
+  if(HWID==NULL) return FALSE;
+
+  pwcH=HWID;
+  pwcM=UsbHWIDMask;
+  while(*pwcH&&*pwcM) {
+    if(*pwcH==*pwcM){
+      pwcH++; pwcM++;
+      continue;
+    }
+    fldName=*pwcM;
+    if((fldName!='v')&&(fldName!='p')) break;
+    val=0;
+    for(i=4;i--;){
+      c=*(pwcH++); pwcM++;
+      if(c<='9') c-='0';
+      else if(c<='F') c=c-'A'+10;
+      else if(c<='f') c=c-'a'+10;
+      if(c>15) {val=0;break;}
+      val<<=4;
+      val+=c;
+    }
+    switch (fldName) {
+      case 'v':
+        vendorID=(USHORT)val;
+       break;
+      case 'p':
+        productID=(USHORT)val;
+       break;
+    }
+  }
+#if DBG
+  uLan_DbgPrint("uLan: USB - Ven %04X Dev %04X\n", 
+                 vendorID,productID);
+#endif
+
+  for(device_id=ulan_usb_tbl;device_id->idVendor;device_id++){
+    if((device_id->idVendor!=vendorID)) continue;
+    if((device_id->idProduct!=productID)) continue;
+    *Pusb_device_id=device_id;
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+#endif /* UL_WITH_USB */
+
+
+//-------------------------------------------------------------------
+//
+//  Initialize and free driver
+//
+/* initialize new driver from given parameters */
+
+NTSTATUS ul_drv_init_ext(ul_drv *udrv, int port,
+        int irq, int baud, long baudbase, int chip_options, int buffer_size, int my_adr)
+{
+  int ret;
+  int test_cnt;
+  unsigned long probe_irqs;
+  udrv->flag_IN_ISR=0;
+  udrv->flag_ASK_ISR=0;
+  udrv->flag_NACTIV=0;
+  udrv->flag_CHIPOK=0;
+  udrv->flag_IN_BOTTOM=0;
+  udrv->flag_ASK_BOTTOM=0;
+  udrv->flag_CHECK_FILT=0;
+  udrv->flag_KWTKILL=0;
+  if(buffer_size<0x2000) buffer_size=0x2000;
+  /* init sequencer */
+  ul_drv_new_init_state(udrv,my_adr);
+  /* init chip driver */
+  #ifdef UL_WITH_USB
+  if((chip_options&~0xff)==UL_USB_HW_PS1){
+    if((ret=ul_usb_ps1_init(udrv, port, irq, baud, baudbase, chip_options))>=0){
+      UL_PRINTF("uLan ul_drv_new : usb_ps1\n");
+    }
+  } else {
+  #else
+  {
+  #endif /* UL_WITH_USB */
+  #ifdef UL_WITH_PCI
+    if((chip_options&~0xff)==0x16954000){
+      if((ret=u950pci_init(udrv, port, irq, baud, baudbase, chip_options))>=0){
+        UL_PRINTF("uLan ul_drv_new : 16C954 at 0x%x\n",port);
+      }
+    }else
+  #endif /* UL_WITH_PCI */
+    {
+      if((ret=u510_init(udrv, port, irq, baud, baudbase, chip_options))>=0){
+        UL_PRINTF("uLan ul_drv_new : 82510 found at 0x%x\n",port);
+      }else if((ret=u450_init(udrv, port, irq, baud, baudbase, chip_options))>=0){
+        UL_PRINTF("uLan ul_drv_new : 16450 found at 0x%x\n",port);
+      };
+    }
+  }
+  if(ret>=0)
+  { /* setups buffers, ports and first part of irq
+      for sucesfully detected device */
+    if(ul_drv_new_start(udrv,buffer_size)>=0)
+      return STATUS_SUCCESS;
+  }
+  UL_PRINTF("uLan ul_drv_new : failed to init\n");
+  return STATUS_INSUFFICIENT_RESOURCES;
+};
+
+/* destroy driver */
+void ul_drv_done_ext(ul_drv *udrv)
+{
+  int old_CHIPOK;
+  if(!udrv) return;
+  old_CHIPOK=udrv->flag_CHIPOK;
+  udrv->flag_CHIPOK=0;
+  if(old_CHIPOK){
+    udrv->fnc_cctrl(udrv,UL_CC_FREEIRQ,0);
+    /* free_irq(udrv->irq,udrv)*/;
+    /* synchronize_irq(); */
+  }
+  DONE_UDRV_WDTIM(udrv);
+  /* schedule(); */
+  ul_mem_done(udrv);
+  if(old_CHIPOK) { 
+    udrv->fnc_cctrl(udrv,UL_CC_PDONE,0);
+  };
+};
+
+
+//-------------------------------------------------------------------
+//
+//  File operations
+//
+
+NTSTATUS ul_drv_open(ul_drv *udrv,ul_opdata *opdata)
+{ 
+  opdata->magic=ULOP_MAGIC;
+  opdata->message=NULL;
+  opdata->udrv=udrv;
+  /* init_waitqueue_head(&opdata->wqrec); */
+  opdata->opprew=NULL;
+  opdata->opnext=NULL;
+  opdata->recchain=NULL;
+  opdata->filtchain=NULL;
+  opdata->wait_irp=NULL;
+  { /* add us onto list of clients of udrv */
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    opptr=udrv->operators;
+    if(opptr) {opptr->opprew=opdata;opdata->opnext=opptr;};
+    UL_MB();
+    udrv->operators=opdata;
+    UL_DRV_UNLOCK;
+  };
+
+  return 0;
+}
+
+NTSTATUS ul_drv_close(ul_drv *udrv,ul_opdata *opdata)
+{
+  ul_opchain *opmember;
+  KIRQL OldIrql;
+
+  if (opdata->message) ulan_freemsg(opdata);
+
+  KeRaiseIrql(DISPATCH_LEVEL,&OldIrql);
+  {while(InterlockedExchange(&udrv->flag_IN_BOTTOM,1))/* spinlock loop*/;}
+  { 
+    /* delete us from list of clients of udrv */
+    ul_drv *udrv=opdata->udrv;
+    ul_opdata *opptr;
+    UL_DRV_LOCK_FINI
+    UL_DRV_LOCK;
+    if((opptr=opdata->opnext)) opptr->opprew=opdata->opprew;
+    if((opptr=opdata->opprew)) opptr->opnext=opdata->opnext;
+    else udrv->operators=opdata->opnext;
+    UL_DRV_UNLOCK;
+  };
+  InterlockedExchange(&udrv->flag_IN_BOTTOM,0);
+  ulan_bottom_dpc(NULL,udrv,NULL,NULL);
+  KeLowerIrql(OldIrql);
+
+  while((opmember=opdata->recchain))
+  {
+    del_from_opchain(&opdata->recchain,opmember);
+    if(opmember->message) ul_dec_ref_cnt(opmember->message);
+    FREE(opmember);
+  };
+  while((opmember=opdata->filtchain))
+  {
+    del_from_opchain(&opdata->filtchain,opmember);
+    FREE(opmember);
+  };
+  return 0;
+};
+
+
+NTSTATUS ulan_read(ul_drv *udrv,ul_opdata *opdata,
+                                  uchar *buf, ULONG count,
+                                  LARGE_INTEGER pos, PULONG pcount)
+{
+  int cn;
+  int len;
+
+  if(!opdata->message) return -ENOMSG;
+
+  if(opdata->data.pos+count>UL_BLK_HEAD(opdata->data.head_blk).len)
+    count=UL_BLK_HEAD(opdata->data.head_blk).len-opdata->data.pos;
+
+  cn=count;
+  while(cn>0)
+  {
+    if(!ul_di_adjust(&opdata->data))
+    {
+      RtlZeroMemory(buf,cn);
+      cn=0;
+      break;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    RtlCopyMemory(buf,ul_di_byte(&opdata->data),len);
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  *pcount=count-cn;
+
+  return 0;
+};
+
+
+NTSTATUS ulan_write(ul_drv *udrv,ul_opdata *opdata,
+                                  const uchar *buf, ULONG count,
+                                  LARGE_INTEGER pos, PULONG pcount)
+{
+  int cn;
+  int len;
+  ul_mem_blk *blk;
+
+  if(!opdata->message) return -ENOMSG;
+
+  cn=count;
+  while(cn>0)
+  {
+    while(!ul_di_adjust(&opdata->data))
+    {
+      if(!(blk=ul_alloc_blk(opdata->udrv))) 
+        {count-=cn;cn=0;break;};
+      RtlZeroMemory(UL_BLK_NDATA(blk),UL_BLK_SIZE);
+      opdata->data.blk->next=blk;
+    };
+    len=ul_di_atonce(&opdata->data);
+    if(len>cn) len=cn;
+    RtlCopyMemory(ul_di_byte(&opdata->data),buf,len);
+    ul_di_add(&opdata->data,len);
+    buf+=len;
+    cn-=len;
+  };
+
+  if((unsigned)opdata->data.pos>UL_BLK_HEAD(opdata->data.head_blk).len)
+   UL_BLK_HEAD(opdata->data.head_blk).len=opdata->data.pos;
+
+  *pcount=count-cn;
+
+  return 0;
+};
+
+
+//-------------------------------------------------------------------
+//
+//  deffered proccessing
+//
+
+/* notice about new message in udrv->proc_bll */
+VOID ulan_bottom_dpc(IN PKDPC Dpc,IN PVOID contex,
+                    IN PVOID arg1,IN PVOID arg2)
+{
+  ul_mem_blk *message;
+  ul_drv *udrv=(ul_drv *)contex;
+
+  if(udrv->magic!=UL_DRV_MAGIC)
+  { UL_PRINTF("ulan_bottom_dpc : BAD udrv magic !!!");
+    return;
+  }
+
+  #ifdef ENABLE_UL_IRQ_STALE_WDG
+  ul_irq_stale_wdg_cnt=0;
+  #endif /* ENABLE_UL_IRQ_STALE_WDG */
+
+  LOG_MESSAGES("ulan_bottom_dpc : announcing messages\n");
+  while(udrv->proc_bll.first||uld_test_dfl(udrv,ASK_BOTTOM))
+  { /*  more Dpc can be started simultaneously on NT SMP box */
+    if(uld_test_and_set_dfl(udrv,IN_BOTTOM))
+    { LOG_MESSAGES("ulan_bottom_dpc : else is already in");
+         return;
+    }
+    uld_clear_dfl(udrv,ASK_BOTTOM);
+    if(uld_test_dfl(udrv,CHECK_FILT)){
+      uld_clear_dfl(udrv,CHECK_FILT);
+      check_for_filtnew(udrv);
+    }
+    while((message=udrv->proc_bll.first))
+    {
+      int i;
+      ul_bll_move_mes(&udrv->opan_bll,message);
+      i=ulan_proc_arrived(udrv,message);
+      LOG_MESSAGES("ulan_bottom_dpc : message sent to %d recchains\n",i);
+    };
+    uld_atomic_clear_dfl(udrv,IN_BOTTOM);
+  }
+};
+
+PIRP xch_pending_irp(PIRP *irp_ptr, PIRP new_irp)
+{
+  PIRP old_irp;
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  old_irp=*irp_ptr;
+  *irp_ptr=new_irp;
+  UL_DRV_UNLOCK;
+  return old_irp;
+}
+
+void del_pending_irp(PIRP *irp_ptr, PIRP del_irp)
+{
+  PIRP old_irp;
+  UL_DRV_LOCK_FINI
+  UL_DRV_LOCK;
+  if(del_irp==*irp_ptr) *irp_ptr=NULL;
+  UL_DRV_UNLOCK;
+}
+
+void abort_pending_irp(PIRP *irp_ptr, NTSTATUS status)
+{
+  PIRP old_irp;
+  KIRQL OldIrql;
+  IoAcquireCancelSpinLock(&OldIrql);
+  old_irp=xch_pending_irp(irp_ptr,NULL);
+  if(old_irp!=NULL) 
+    IoSetCancelRoutine(old_irp,NULL);
+  IoReleaseCancelSpinLock(OldIrql);
+  if(old_irp!=NULL){
+    old_irp->IoStatus.Status=status;
+    IoCompleteRequest(old_irp,IO_NO_INCREMENT);
+  }
+}
+
+/*
+  PDRIVER_CANCEL IoSetCancelRoutine(Irp,CancelRoutine);
+*/
+void ulan_cancel(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+  PIO_STACK_LOCATION  irpStack;
+  ul_opdata    *opdata;
+  PIRP old_irp;
+  LOG_FILEIO("uLan: Irp Cancelled\n");
+  irpStack = IoGetCurrentIrpStackLocation (Irp);
+  opdata=irpStack->FileObject->FsContext;
+  if(!opdata||(opdata->magic!=ULOP_MAGIC))
+  { 
+    uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+  }else {
+    if(Irp==opdata->wait_irp)
+      del_pending_irp(&opdata->wait_irp,Irp);
+    IoReleaseCancelSpinLock(Irp->CancelIrql);
+  }
+  Irp->IoStatus.Information = 0;
+  Irp->IoStatus.Status=STATUS_CANCELLED;
+  IoCompleteRequest(Irp,IO_NO_INCREMENT);
+}
+
+
+//---------------------------------------------------------------------------
+//
+//
+// Routine Description:
+// 
+//     Process the IRPs sent to this device.
+// 
+// Arguments:
+// 
+//     DeviceObject - pointer to a device object
+// 
+//     Irp          - pointer to an I/O Request Packet
+// 
+// Return Value:
+// 
+// 
+NTSTATUS DispatchRoutine (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+    PIO_STACK_LOCATION  irpStack;
+    PULAN_DEVICE_EXTENSION   extension;
+    PVOID               ioBuffer;
+    ULONG               inputBufferLength;
+    ULONG               outputBufferLength;
+    ULONG               ioControlCode;
+    NTSTATUS            ntStatus=0;
+    KIRQL              OldIrql;
+
+    LARGE_INTEGER       CurrentSystemTime;
+    LARGE_INTEGER       ElapsedTime;
+    ul_opdata                  *opdata;
+       ul_msginfo msginfo;
+
+    
+    Irp->IoStatus.Status      = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+
+    //
+    // Get a pointer to the current location in the Irp. This is where
+    //     the function codes and parameters are located.
+    //
+
+    irpStack = IoGetCurrentIrpStackLocation (Irp);
+
+    //
+    // Get a pointer to the device extension
+    //
+
+    extension = DeviceObject->DeviceExtension;
+
+  #ifdef FOR_WIN_WDM
+    if(!extension||(extension->State<=STATE_ALL_BELOW_FAIL)||!extension->flag_CHIPOK){
+       uLan_DbgPrint ("uLan: DeviceObject initialization not finished\n");
+          Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+       IoCompleteRequest (Irp, IO_NO_INCREMENT);
+          return STATUS_UNSUCCESSFUL;
+                               
+       }
+  #endif /* FOR_WIN_WDM */
+
+    //
+    // Get the pointer to the input/output buffer and it's length
+    //
+
+    switch (irpStack->MajorFunction) {
+        case IRP_MJ_CREATE:
+        {    
+            LOG_FILEIO("uLan: IRP_MJ_CREATE\n");
+           if(irpStack->FileObject==NULL)
+           {   uLan_DbgPrint ("uLan: Open called without FileObject\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+           if(irpStack->FileObject->FsContext)
+           {   uLan_DbgPrint ("uLan: FsContext already used\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+            if(!(opdata=MALLOC(sizeof(ul_opdata))))
+           {   uLan_DbgPrint ("uLan: Cannot allocate op_data\n");
+               Irp->IoStatus.Status=STATUS_NO_MEMORY;
+               break;
+           }
+           irpStack->FileObject->FsContext=opdata;
+            opdata->file=irpStack->FileObject;
+           if((ntStatus=ul_drv_open(extension,opdata)))
+           {   LOG_FILEIO ("uLan: ul_drv_open failed\n");
+               Irp->IoStatus.Status=ntStatus;
+               FREE(opdata);
+               irpStack->FileObject->FsContext=NULL;
+               break;
+           }
+            break;
+        }
+
+        case IRP_MJ_CLOSE:
+        {
+           LOG_FILEIO("uLan: IRP_MJ_CLOSE\n");
+           opdata=irpStack->FileObject->FsContext;
+           if(!opdata||(opdata->magic!=ULOP_MAGIC))
+           {   uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+           abort_pending_irp(&opdata->wait_irp,STATUS_UNSUCCESSFUL);
+           if((ntStatus=ul_drv_close(extension,opdata)))
+           {   LOG_FILEIO("uLan: ul_drv_close failed\n");
+               Irp->IoStatus.Status=ntStatus;
+           }
+           irpStack->FileObject->FsContext=NULL;
+           FREE(opdata);
+            break;
+        }
+
+        case IRP_MJ_READ:
+        {
+           LOG_FILEIO("uLan: IRP_MJ_READ\n");
+           opdata=irpStack->FileObject->FsContext;
+           if(!opdata||(opdata->magic!=ULOP_MAGIC))
+           {   uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+           ntStatus=ulan_read(extension,opdata,
+                               Irp->AssociatedIrp.SystemBuffer,
+                               irpStack->Parameters.Read.Length,
+                               irpStack->Parameters.Read.ByteOffset,
+                               &Irp->IoStatus.Information);
+           if(ntStatus)
+           {   LOG_FILEIO("uLan: ul_drv_read failed\n");
+               Irp->IoStatus.Status=ntStatus;
+           }
+            break;
+        }
+
+        case IRP_MJ_WRITE:
+        {
+           LOG_FILEIO("uLan: IRP_MJ_WRITE\n");
+           opdata=irpStack->FileObject->FsContext;
+           if(!opdata||(opdata->magic!=ULOP_MAGIC))
+           {   uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+           ntStatus=ulan_write(extension,opdata,
+                               Irp->AssociatedIrp.SystemBuffer,
+                               irpStack->Parameters.Read.Length,
+                               irpStack->Parameters.Read.ByteOffset,
+                               &Irp->IoStatus.Information);
+           if(ntStatus)
+           {   LOG_FILEIO("uLan: ul_drv_write failed\n");
+               Irp->IoStatus.Status=ntStatus;
+           }
+            break;
+        }
+
+        case IRP_MJ_CLEANUP:
+        {
+           LOG_FILEIO("uLan: IRP_MJ_CLEANUP\n");
+           opdata=irpStack->FileObject->FsContext;
+           if(!opdata||(opdata->magic!=ULOP_MAGIC))
+           {   uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+           abort_pending_irp(&opdata->wait_irp,STATUS_UNSUCCESSFUL);
+            break;
+        }
+
+        case IRP_MJ_DEVICE_CONTROL:
+        {
+           LOG_FILEIO("uLan: IRP_MJ_DEVICE_CONTROL - ");
+           opdata=irpStack->FileObject->FsContext;
+           if(!opdata||(opdata->magic!=ULOP_MAGIC))
+           {   uLan_DbgPrint ("uLan: corrupted opdata !!!!\n");
+               Irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+               break;
+           }
+                           
+            ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
+           ioBuffer      = Irp->AssociatedIrp.SystemBuffer;
+           inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
+           outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
+
+    
+            switch (ioControlCode)
+            {
+               case UL_DRV_VER :
+                   LOG_FILEIO("UL_DRV_VER\n");
+                    if (outputBufferLength < sizeof(ULONG))
+                   {
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                    *(ULONG *)ioBuffer = UL_DRV_VERCODE;
+                    Irp->IoStatus.Information = sizeof(ULONG);
+                   break;
+           
+               case UL_NEWMSG :
+                   LOG_FILEIO("UL_NEWMSG\n");
+                    if (inputBufferLength < sizeof(ul_msginfo)) 
+                   {   LOG_FILEIO("uLan: newmsg shorten msginfo !!!!\n");
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                   if((ntStatus=ulan_newmsg(opdata,ioBuffer)))
+                   {   LOG_FILEIO("uLan: newmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   break;
+               case UL_TAILMSG :
+                   LOG_FILEIO("UL_TAILMSG\n");
+                    if (inputBufferLength < sizeof(ul_msginfo)) 
+                   {   LOG_FILEIO("uLan: tailmsg shorten msginfo !!!!\n");
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                   if((ntStatus=ulan_tailmsg(opdata,ioBuffer)))
+                   {   LOG_FILEIO("uLan: tailmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   break;
+               case UL_FREEMSG :
+                   LOG_FILEIO("UL_FREEMSG\n");
+                   if((ntStatus=ulan_freemsg(opdata))&~0x7fffffff)
+                   {   LOG_FILEIO("uLan: freemsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                    if (outputBufferLength >= sizeof(ULONG)) {
+                        *(ULONG *)ioBuffer = ntStatus;
+                        Irp->IoStatus.Information = sizeof(ULONG);
+                    }
+                                       break;
+               case UL_ACCEPTMSG :     
+                   LOG_FILEIO("UL_ACCEPTMSG\n");
+                    if (outputBufferLength < sizeof(ul_msginfo)) 
+                   {   LOG_FILEIO("uLan: acceptmsg shorten msginfo !!!!\n");
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                   if((ntStatus=ulan_acceptmsg(opdata,ioBuffer)))
+                   {   LOG_FILEIO("uLan: acceptmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   else Irp->IoStatus.Information = sizeof(ul_msginfo);
+                   break;
+               case UL_ACTAILMSG :     
+                   LOG_FILEIO("UL_ACTAILMSG\n");
+                    if (outputBufferLength < sizeof(ul_msginfo)) 
+                   {   LOG_FILEIO("uLan: actailmsg shorten msginfo !!!!\n");
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                   if((ntStatus=ulan_actailmsg(opdata,ioBuffer)))
+                   {   LOG_FILEIO("uLan: actailmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   else Irp->IoStatus.Information = sizeof(ul_msginfo);
+                   break;
+               case UL_ADDFILT :
+                   LOG_FILEIO("UL_ADDFILT\n");
+                    if (inputBufferLength < sizeof(ul_msginfo)) 
+                   {   LOG_FILEIO("uLan: addfilt shorten msginfo !!!!\n");
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                   if((ntStatus=ulan_addfilt(opdata,ioBuffer)))
+                   {   LOG_FILEIO("uLan: addfilt failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   break;
+               case UL_ABORTMSG :
+                   LOG_FILEIO("UL_ABORTMSG\n");
+                   if((ntStatus=ulan_abortmsg(opdata)))
+                   {   LOG_FILEIO("uLan: abortmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   break;
+               case UL_REWMSG :
+                   LOG_FILEIO("UL_REWMSG\n");
+                   if((ntStatus=ulan_rewmsg(opdata)))
+                   {   LOG_FILEIO("uLan: rewmsg failed !!!!\n");
+                       Irp->IoStatus.Status = ntStatus;
+                   }
+                   break;
+               case UL_INEPOLL :
+                   LOG_FILEIO("UL_INEPOLL\n");
+                    if (outputBufferLength < sizeof(ULONG))
+                   {
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                    *(ULONG *)ioBuffer = ulan_inepoll(opdata);
+                    Irp->IoStatus.Information = sizeof(ULONG);
+                   break;
+               case UL_WAITREC :
+                   LOG_FILEIO("UL_WAITREC\n");
+                    if(ulan_inepoll(opdata)) break;
+                   {
+                       KIRQL OldIrql;
+                       IoAcquireCancelSpinLock(&OldIrql);
+                       if (Irp->Cancel) { 
+                          Irp->IoStatus.Status = STATUS_CANCELLED; 
+                         // IRP should be completed after releasing the 
+                         // cancel spin lock.
+                         IoReleaseCancelSpinLock(OldIrql);
+                       } else {
+                         PIRP old_irp;
+                         IoMarkIrpPending (Irp);  
+                         IoSetCancelRoutine(Irp,&ulan_cancel);
+                         old_irp=xch_pending_irp(&opdata->wait_irp,Irp);
+                         if(old_irp!=NULL){
+                           IoSetCancelRoutine(old_irp,NULL);
+                         }
+                         IoReleaseCancelSpinLock(OldIrql);
+                         if(old_irp!=NULL){
+                           old_irp->IoStatus.Status=STATUS_UNSUCCESSFUL;
+                           IoCompleteRequest(old_irp,IO_NO_INCREMENT);
+                         }
+                         return STATUS_PENDING;
+                       }
+                    }
+               case UL_KLOGBLL :
+                   LOG_FILEIO("UL_KLOGBLL\n");
+                   printudrvbll(extension);
+                   #ifdef ENABLE_UL_MEM_CHECK
+                    printudrvoperators(extension);
+                   #endif /* ENABLE_UL_MEM_CHECK */
+                   break;
+               case UL_STROKE :
+                   LOG_FILEIO("UL_STROKE\n");
+                   ulan_stroke(extension, 1);
+                   break;
+               case UL_DEBFLG :
+                   LOG_FILEIO("UL_DEBFLG\n");
+                    if (inputBufferLength >= sizeof(ULONG)) 
+                   {   
+                       uld_debug_flg=*(ULONG *)ioBuffer;
+                       break;
+                   }
+                   break;
+               case UL_HWTEST :
+                   LOG_FILEIO("UL_HWTEST\n");
+                    if ((outputBufferLength < sizeof(ULONG))||
+                        (inputBufferLength < sizeof(ULONG)))
+                   {   
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                       break;
+                   }
+                    *(LONG *)ioBuffer = ulan_hwtest(opdata,*(ULONG *)ioBuffer);
+                   if(*(LONG *)ioBuffer<0)
+                       Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
+                    Irp->IoStatus.Information = sizeof(ULONG);
+                   break;
+                default:
+                {
+                    LOG_FILEIO("uLan: Unknown IRP_MJ_DEVICE_CONTROL\n");
+                    Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+                    break;
+                }
+
+            }
+    
+            break;
+        }
+        default:
+        {
+            uLan_DbgPrint ("uLan: Unhandled IRP_MJ function\n");
+            Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+            break;
+        }
+    }
+
+    //
+    // DON'T get cute and try to use the status field of
+    // the irp in the return status.  That IRP IS GONE as
+    // soon as you call IoCompleteRequest.
+    //
+
+    ntStatus = Irp->IoStatus.Status;
+
+    IoCompleteRequest (Irp, IO_NO_INCREMENT);
+
+    LOG_FILEIO("uLan: DisptachRoutine exit.\n");
+
+    //
+    // We never have pending operation so always return the status code.
+    //
+
+    return ntStatus;
+}
+
+
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdbase.h b/ulan/host/ul_drv/ul_drv/ul_wdbase.h
new file mode 100644 (file)
index 0000000..d95c1d7
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _UL_WDMBASE_H
+#define _UL_WDMBASE_H
+
+#define uLan_DbgPrint DbgPrint
+
+//
+// Defaults
+//
+
+#define DEF_PORT_ADDRESS    0x2F8
+#define DEF_PORT_RANGE      0x08
+#define DEF_IRQ_LINE        0x03
+#define DEF_BAUD_RATE       19200
+#define DEF_BUFFER_SIZE     2048
+#define DEF_MY_ADDR         2
+
+
+//-------------------------------------------------------------------
+//
+// Device extension 
+// 
+
+typedef struct ul_drv ULAN_DEVICE_EXTENSION,
+                      *PULAN_DEVICE_EXTENSION;
+
+//-------------------------------------------------------------------
+//
+// Define the driver names
+// 
+#define NT_DEVICE_NAME     L"\\Device\\ul_drv"
+#define DOS_DEVICE_NAME     L"\\DosDevices\\ul_drv"
+
+
+NTSTATUS DispatchRoutine (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+
+
+VOID ulan_bottom_dpc(IN PKDPC Dpc,IN PVOID contex,
+                    IN PVOID arg1,IN PVOID arg2);
+
+
+#endif /*_UL_WDMBASE_H*/
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdent.c b/ulan/host/ul_drv/ul_drv/ul_wdent.c
new file mode 100644 (file)
index 0000000..f8b512e
--- /dev/null
@@ -0,0 +1,271 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_wdent.c   - Windows WDM entry and unload code
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+// Unicode String Manipulation routines
+NTSTATUS
+MyAllocUnicodeString(PUNICODE_STRING UStr, PUNICODE_STRING InUStr, int Len)
+{
+  NTSTATUS Status;
+  ULONG Size;
+  if(!Len&&InUStr){
+    Len=InUStr->Length;
+  }
+  RtlInitUnicodeString(UStr, NULL);
+  if(Len){
+    Size=Len+2;
+    UStr->Buffer = ExAllocatePool(PagedPool,Size);
+       if(!UStr->Buffer) return STATUS_UNSUCCESSFUL;
+    RtlZeroMemory(UStr->Buffer,Size);
+    UStr->MaximumLength = Len;
+    if(InUStr)
+      RtlCopyUnicodeString(UStr,InUStr);
+  }
+  return STATUS_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  MyGetRegistryKeyValue
+//
+//    Reads a registry key value from an already opened registry key
+//
+//  INPUTS:
+//     Handle          - handle to the opened registry key
+//     KeyNameString   - WCHAR string to the desired key
+//  OUTPUTS:
+//     KeyNameStringLength     - length of above
+//     Data            - buffer for the data
+//     DataLength      - length of the buffer
+//
+//  RETURNS:
+//     NT Status code
+//
+//  IRQL:
+//     IRQL PASSIVE_LEVEL
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS 
+MyGetRegistryKeyValue (
+    IN HANDLE  Handle,
+    IN PWCHAR  KeyNameString,
+    IN PVOID   Data,
+    IN ULONG   DataLength
+    )
+{
+    UNICODE_STRING   keyName;
+    ULONG            length;
+    PKEY_VALUE_FULL_INFORMATION fullInfo;
+    NTSTATUS         status = STATUS_INSUFFICIENT_RESOURCES;
+
+    RtlInitUnicodeString (&keyName, KeyNameString);
+       
+    length = sizeof(KEY_VALUE_FULL_INFORMATION)+keyName.Length+4+DataLength;
+    fullInfo = ExAllocatePool(PagedPool, length); 
+
+    if (fullInfo) {
+      status = ZwQueryValueKey (Handle,&keyName,KeyValueFullInformation,
+                               fullInfo,length,&length);
+               
+      if (NT_SUCCESS(status)) {
+
+       // If there is enough room in the data buffer, copy the output
+       if (DataLength >= fullInfo->DataLength) 
+       {
+         RtlCopyMemory (Data,((PUCHAR) fullInfo) + fullInfo->DataOffset, 
+                        fullInfo->DataLength);
+       }
+      }
+      ExFreePool(fullInfo);
+    }
+
+    return status;
+}
+
+
+//
+// The following pragma allows the DriverEntry code to be discarded once
+// initialization is completed
+//
+//#pragma alloc_text(INIT,DriverEntry)
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  DriverEntry
+//
+//      This routine is called by NT when the driver is first loaded.  It is the
+//    responsibility of this routine to find it's device and create whatever
+//    device objects it needs.
+//
+//  INPUTS:
+//
+//      DriverObj - Address of the DRIVER_OBJECT created by NT for this driver.
+//
+//      RegistryPath - UNICODE_STRING which represents this drivers KEY in the
+//                   Registry.  
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      STATUS_SUCCESS. Otherwise an error indicating why the driver could not
+//                    Load.
+//
+//  IRQL:
+//
+//    This routine is called at IRQL_PASSIVE_LEVEL.
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS
+DriverEntry(PDRIVER_OBJECT DriverObj, PUNICODE_STRING RegistryPath)
+{
+    ULD_LARGE_INTEGER_0=RtlConvertLongToLargeInteger(0);
+    
+    uLan_DbgPrint("uLan v" UL_DRV_VERSION " Enter the driver!\n");
+    uLan_DbgPrint("uLan: " __DATE__ " " __TIME__ "\n");
+
+    //
+    // Establish dispatch entry points for the functions we support
+    //
+    DriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchRoutine;
+    DriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchRoutine;
+    DriverObj->MajorFunction[IRP_MJ_READ] = DispatchRoutine;
+    DriverObj->MajorFunction[IRP_MJ_WRITE] = DispatchRoutine;
+    DriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchRoutine;
+    DriverObj->MajorFunction[IRP_MJ_CLEANUP] = DispatchRoutine;
+
+    //
+    // PnP and Power entry points
+    //
+    DriverObj->MajorFunction[IRP_MJ_PNP]            =  DispatchPnp;
+#ifdef UL_WITH_WIN_PWR
+    DriverObj->MajorFunction[IRP_MJ_POWER]          =  DispatchPower;
+#endif /* UL_WITH_WIN_PWR */
+
+    //
+    // WMI entry point
+    //
+    DriverObj->MajorFunction[IRP_MJ_SYSTEM_CONTROL] =  DispatchSystemControl;
+
+    //
+    // AddDevice Function
+    //
+    DriverObj->DriverExtension->AddDevice = AddDevice;
+
+    //
+    // Unload function
+    //
+    DriverObj->DriverUnload = DriverUnload;
+
+    //
+    // Save the registry path for later use.
+    //
+    MyAllocUnicodeString(&uL_WDM_RegistryPath,RegistryPath,0);
+
+    //
+    // Initial reasonable value for driver spinlock
+    //
+    uL_SpinLock_Irql=DISPATCH_LEVEL+1;
+
+
+    uLan_DbgPrint("uLan: All initialized!\n");
+    
+    return(STATUS_SUCCESS);
+    
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  DriverUnload
+//
+//      This routine is our dynamic unload entry point.  We are called here when
+//    the OS wants to unload our driver.  It is our responsibility to release any
+//    resources we allocated.
+//
+//  INPUTS:
+//
+//      DriverObj - Address of our DRIVER_OBJECT.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      None.
+//
+//  IRQL:
+//
+//    This routine is called at IRQL_PASSIVE_LEVEL.
+//
+//  NOTES:
+//
+//    No doubt we pool leak at this entry point by not properly returning everything.
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID DriverUnload(PDRIVER_OBJECT DriverObject)
+{
+    PULAN_DEVICE_EXTENSION devExt;
+    PDEVICE_OBJECT devObj,nextDevObj;
+    IO_RESOURCE_REQUIREMENTS_LIST reqList;
+    NTSTATUS code;
+    UNICODE_STRING linkName;
+    CM_RESOURCE_LIST returnResources;
+    BOOLEAN conflictDetected;
+            
+    uLan_DbgPrint("uLan: DriverUnload\n");
+
+    //
+    // For THIS driver, there will only ever be a single device object.
+    // Because of this, we just get it from the DriverObj.  If this were
+    // a multiple device driver, we would do this in a while loop...
+    //
+    nextDevObj = DriverObject->DeviceObject;
+    while(nextDevObj){
+      devObj=nextDevObj;
+      nextDevObj=devObj->NextDevice;
+
+      // Find uLan Device Extension
+      devExt=(PULAN_DEVICE_EXTENSION)devObj->DeviceExtension;
+
+      // Set State
+      devExt->State = STATE_REMOVED;
+
+      // Return uLan system resources
+      ReturnResources(devExt);
+
+      // Destroy DeviceObject
+      RemoveDevice(devObj);
+    }
+
+    if(uL_WDM_RegistryPath.Buffer)
+         ExFreePool(uL_WDM_RegistryPath.Buffer);
+}
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdinc.h b/ulan/host/ul_drv/ul_drv/ul_wdinc.h
new file mode 100644 (file)
index 0000000..fd8bc22
--- /dev/null
@@ -0,0 +1,144 @@
+#ifndef _UL_WDINC_H
+#define _UL_WDINC_H
+
+//
+// Device State definitions
+//
+// These values are used to track the state of the device
+// with regard to PnP events.
+//
+// NOTE: The code makes assumptions about the order of these
+// states, and the fact that their values are in the high
+// word of a longword.
+//
+//
+
+//
+// We use a set of dummy states to delineate the actions we take
+// on receipt and completion of an IRP.  These also appear below.
+//
+
+//
+// In STATE_REMOVED, we immediately fail any received I/O requests
+//
+#define STATE_REMOVED           0X00000000
+
+//
+// In STATE_SURPRISE_REMOVED, we immediately fail all incoming requests
+//
+#define STATE_SURPRISE_REMOVED   0x00010000
+
+//
+// In STATE_NEVER_STARTED, we also immediately fail all incoming requests
+//
+#define STATE_NEVER_STARTED     0x00020000
+
+//
+// Dummy State -- When the state is < this value, no H/W access is
+// allowed
+//
+#define STATE_ALL_BELOW_NO_HW   0x00030000     // ******************
+
+//
+// In STATE_REMOVE_PENDING, we also immediately fail all incoming requests
+//
+#define STATE_REMOVE_PENDING    0x00100000
+
+//
+// Dummy state -- When an IRP arrives at the driver, if the current
+// device state is below this value, it is immediately failed
+//
+#define STATE_ALL_BELOW_FAIL    0x00FF0000     // ******************
+
+//
+// In STATE_STARTED, requests are processed and removed from the
+// queues normally
+//
+#define STATE_STARTED           0X01000000
+
+//
+// Dummy state -- When an IRP arrives at the driver, if the current
+// device state is above this value, it is queued, not initiated on
+// the device (even if the device is free)
+//
+#define STATE_ALL_ABOVE_QUEUE   0x0FFF0000     // ******************
+
+//
+// Dummy State -- When an IRP is COMPLETED on the device, if
+// the device state is below this value, we'll start another
+// IRP in an attempt to drain the queue of pending requests.
+//
+#define STATE_ALL_BELOW_DRAIN   STATE_ALL_ABOVE_QUEUE  // ******************
+
+//
+// In STATE_STOP_PENDING, we queue incoming requests
+//
+#define STATE_STOP_PENDING      0x10000000
+
+//
+// In STATE_STOPPED, we queue incoming requests
+//
+#define STATE_STOPPED           0x10010000
+
+
+//
+// Forward Declarations
+//
+typedef struct ul_drv *PULAN_DEVICE_EXTENSION;
+NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObj, PUNICODE_STRING RegistryPath);
+NTSTATUS DispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+VOID DriverUnload(PDRIVER_OBJECT DriverObject);
+static VOID ReturnPool(PPCI_COMMON_CONFIG  configInfo, PDEVICE_DESCRIPTION
+            deviceDescription,  PCM_RESOURCE_LIST resources);
+NTSTATUS DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS DispatchSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
+                   IN PDEVICE_OBJECT PhysicalDeviceObject);
+NTSTATUS MyAllocUnicodeString(PUNICODE_STRING UStr, PUNICODE_STRING InUStr, int Len);
+VOID ReturnResources(PULAN_DEVICE_EXTENSION devExt);
+VOID RemoveDevice(IN PDEVICE_OBJECT devObj);
+
+BOOLEAN
+SetDevicePowerState(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN DEVICE_POWER_STATE DeviceState
+    );
+NTSTATUS
+PoRequestCompletion(
+    IN PDEVICE_OBJECT       DeviceObject,
+    IN UCHAR                MinorFunction,
+    IN POWER_STATE          PowerState,
+    IN PVOID                Context,
+    IN PIO_STATUS_BLOCK     IoStatus
+    );
+NTSTATUS
+PowerIrp_Complete(
+    IN PDEVICE_OBJECT NullDeviceObject,
+    IN PIRP Irp,
+    IN PVOID Context
+    );
+NTSTATUS
+SelfSuspendOrActivate(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN BOOLEAN fSuspend
+    );
+NTSTATUS
+PoSelfRequestCompletion(
+    IN PDEVICE_OBJECT       DeviceObject,
+    IN UCHAR                MinorFunction,
+    IN POWER_STATE          PowerState,
+    IN PVOID                Context,
+    IN PIO_STATUS_BLOCK     IoStatus
+    );
+NTSTATUS
+SelfRequestPowerIrp(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN POWER_STATE PowerState
+    );
+
+//
+// Globals used by uLan WDM Driver 
+//
+UNICODE_STRING uL_WDM_RegistryPath;
+
+#endif /* _UL_WDINC_H */
\ No newline at end of file
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdm.dsp b/ulan/host/ul_drv/ul_drv/ul_wdm.dsp
new file mode 100644 (file)
index 0000000..806640f
--- /dev/null
@@ -0,0 +1,213 @@
+# Microsoft Developer Studio Project File - Name="ul_wdm" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) External Target" 0x0106\r
+\r
+CFG=ul_wdm - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_wdm.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_wdm.mak" CFG="ul_wdm - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "ul_wdm - Win32 Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE "ul_wdm - Win32 Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+\r
+!IF  "$(CFG)" == "ul_wdm - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Cmd_Line "NMAKE /f ul_wdm.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "ul_wdm.exe"\r
+# PROP BASE Bsc_Name "ul_wdm.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Cmd_Line "nmake /f "ul_wdm.mak""\r
+# PROP Rebuild_Opt "/a"\r
+# PROP Target_File "ul_wdm.sys"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF  "$(CFG)" == "ul_wdm - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "NMAKE /f ul_wdm.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "ul_wdm.exe"\r
+# PROP BASE Bsc_Name "ul_wdm.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "nmake /f "ul_wdm.mak""\r
+# PROP Rebuild_Opt "/a"\r
+# PROP Target_File "ul_wdm.sys"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "ul_wdm - Win32 Release"\r
+# Name "ul_wdm - Win32 Debug"\r
+\r
+!IF  "$(CFG)" == "ul_wdm - Win32 Release"\r
+\r
+!ELSEIF  "$(CFG)" == "ul_wdm - Win32 Debug"\r
+\r
+!ENDIF \r
+\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_base.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_c450.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_c510.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_c950pci.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_cps1.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_debug.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_devtab.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_di.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_frame.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_mem.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_tors.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_tst.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_ufsm.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdbase.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdent.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdpnp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdusb.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\serial_reg.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_82510.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drv.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_hdep.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdbase.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdinc.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdusb.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# Begin Group "Additional Files"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdm.err\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdm.lnr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_wdm.mak\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdm.lnr b/ulan/host/ul_drv/ul_drv/ul_wdm.lnr
new file mode 100644 (file)
index 0000000..6588b6f
--- /dev/null
@@ -0,0 +1,28 @@
+-MERGE:_PAGE=PAGE \r
+-MERGE:_TEXT=.text \r
+-SECTION:INIT,d \r
+-OPT:REF \r
+-INCREMENTAL:NO \r
+-FORCE:MULTIPLE \r
+-RELEASE \r
+-FULLBUILD \r
+-IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096 \r
+-NODEFAULTLIB \r
+-debug:notmapped,MINIMAL \r
+-debugtype:both \r
+-version:4.00 \r
+-osversion:4.00 \r
+-map \r
+-PDB:ul_wdm.pdb \r
+-MERGE:.rdata=.text \r
+-optidata \r
+-DRIVER:UPONLY\r
+-align:0x20 \r
+-subsystem:native,4.00 \r
+-base:0x10000 \r
+-entry:DriverEntry@8 \r
+\r
+-out:UL_WDM.SYS\r
+UL_DRV.OBJ\r
+wdm.lib \r
+usbd.lib\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdm.mak b/ulan/host/ul_drv/ul_drv/ul_wdm.mak
new file mode 100644 (file)
index 0000000..13a5767
--- /dev/null
@@ -0,0 +1,114 @@
+#----------------------------------------------------------------------------\r
+#\r
+# Device Driver MAKEFILE\r
+#\r
+# uLan Communication Driver\r
+#\r
+#\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+# Compile flags for the Window Mode Driver\r
+#\r
+\r
+# general flags,\r
+# /Zel=Use MS extension-omit default library\r
+# /Zp8=Pack 8\r
+# /Gy=Enables function-level linking\r
+# /GF=Pools strings and places them in read-only memory \r
+# /Gz=Uses the __stdcall calling convention\r
+\r
+CFLAGS1 = /c /Ze1 /Zp8 /Gy /W3 /Gy /GF /Gz /Gi- /Gm- /GX- /GR- \r
+\r
+# The following flags handle Pentium chip bugs FDiv and 0x0f\r
+\r
+CFLAGS2 = /QIfdiv- /QI0f\r
+\r
+# /Z7=Debug info flags\r
+# /Zi=PDB debugging\r
+# /QIf=Generates additional debugging information for kernal-mode device drivers\r
+CFLAGS3 = /Zi /QIf -DFOR_WIN_WDM\r
+\r
+# /Od=Turn off ALL optimizations, /Oi=Inline functions\r
+# /Oy=Omits frame pointer, /Oxs=Uses maximum optimization (/Ob1gity /Gs)\r
+\r
+CFLAGS4 = /Oy /Oxs \r
+\r
+# defines used by .H files and the like\r
+\r
+CFLAGS5 = -FIwarning.h -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1 \r
+CFLAGS6 = -DNT_UP=1 -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0400 \r
+CFLAGS7 = -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -DFPO=1 -DNDEBUG -D_DLL=1  \r
+\r
+#----------------------------------------------------------------------------\r
+#****************************************************************************\r
+\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+# Flags for the User Mode EXE\r
+#\r
+\r
+#----------------------------------------------------------------------------\r
+# COMPILE flags\r
+\r
+ccommon = -c -W3 -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo\r
+cflags = $(ccommon) -D_X86_=1\r
+cvars      = -DWIN32 $(noansi) -D_WIN32\r
+cdebug = -Z7 -Od\r
+\r
+CCFLAGS = $(cflags) $(cvars) $(cdebug)\r
+\r
+\r
+#----------------------------------------------------------------------------\r
+# LINK Flags\r
+\r
+libcmt = libcmt.lib oldnames.lib\r
+baselibs = kernel32.lib advapi32.lib\r
+libc = libc.lib oldnames.lib\r
+linklibs = $(libc) $(baselibs)\r
+\r
+linkdebug = -debug:full -debugtype:cv\r
+\r
+lflags = /NODEFAULTLIB /INCREMENTAL:NO /PDB:NONE /RELEASE /NOLOGO \r
+conlflags = $(lflags) -subsystem:console,4.0 -entry:mainCRTStartup\r
+\r
+#----------------------------------------------------------------------------\r
+#****************************************************************************\r
+\r
+\r
+#****************************************************************************\r
+#----------------------------------------------------------------------------\r
+#\r
+# The dependency list and build rules follows\r
+\r
+whole_enchilada : ul_wdm.sys\r
+\r
+ul_drv.sym : ul_drv.map\r
+        MSYM ul_drv.MAP\r
+\r
+ul_drv.map : ul_drv.sys\r
+        DBG2MAP ul_drv.sys\r
+\r
+#\r
+# In the following,\r
+# Use: ul_drv.lnr for a release link\r
+# Use: ul_drv.lnd for a debug build\r
+#\r
+ul_wdm.sys : ul_drv.obj \r
+        LINK @ul_wdm.lnr\r
+\r
+ul_drv.obj : ul_drv.c ul_wdbase.c ul_wdent.c ul_wdpnp.c ul_wdusb.c ul_wdpwr.c ul_base.c \\r
+            ul_c450.c ul_c510.c ul_c950pci.c ul_cps1.c \\r
+            ul_debug.c ul_devtab.c ul_di.c ul_frame.c ul_mem.c ul_tors.c ul_tst.c ul_ufsm.c \\r
+          ul_drv.h ul_hdep.h ul_82510.h serial_reg.h ul_wdbase.h ul_wdinc.h ul_wdusb.h\r
+        CL $(CFLAGS1) $(CFLAGS2) $(CFLAGS3) $(CFLAGS4) $(CFLAGS5) $(CFLAGS6) $(CFLAGS7) ul_drv.c\r
+\r
+q_test.obj: q_test.c\r
+        CL $(CCFLAGS) q_test.c\r
+\r
+q_test.exe: q_test.obj\r
+        LINK $(linkdebug) $(conflags) -out:q_test.exe q_test.obj $(linklibs)\r
+\r
+#****************************************************************************\r
+#****************************************************************************\r
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdpnp.c b/ulan/host/ul_drv/ul_drv/ul_wdpnp.c
new file mode 100644 (file)
index 0000000..9bde08e
--- /dev/null
@@ -0,0 +1,2429 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_wdpnp.c   - Windows WDM PnP events processing code
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+//#include <initguid.h>
+//
+//{3EF4F782-AF00-11d5-87B2-00D0595444D7}
+//DEFINE_GUID(GUID_ULAN_WDM_DRIVER1, 
+// 0x3ef4f782, 0xaf00, 0x11d5, 0x87, 0xb2, 0x0, 0xd0, 0x59, 0x54, 0x44, 0xd7);
+
+
+VOID PrintState(PULAN_DEVICE_EXTENSION devExt);
+VOID PrintCapabilityInfo(PDEVICE_CAPABILITIES Capabilities);
+VOID RequestIncrement(PULAN_DEVICE_EXTENSION devExt);
+VOID RequestDecrement(PULAN_DEVICE_EXTENSION devExt);
+VOID WaitForStop(PULAN_DEVICE_EXTENSION devExt);
+VOID WaitForRemove(PULAN_DEVICE_EXTENSION devExt);
+VOID ClearQueues(PULAN_DEVICE_EXTENSION devExt){/*stub*/};
+VOID ProcessQueuedRequests(PULAN_DEVICE_EXTENSION devExt){/*stub*/};
+NTSTATUS StartDevice (IN PULAN_DEVICE_EXTENSION devExt,IN PIO_STACK_LOCATION IrpSp);
+NTSTATUS StartUSBDevice (IN PULAN_DEVICE_EXTENSION devExt,IN PIO_STACK_LOCATION IrpSp);
+NTSTATUS CanStopDevice(PULAN_DEVICE_EXTENSION devExt, PIRP Irp);
+NTSTATUS CanRemoveDevice(PULAN_DEVICE_EXTENSION devExt, PIRP Irp);
+static NTSTATUS PnpComplete (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context);
+
+
+static PSTR pnpMinorCodes[] = 
+{
+    "IRP_MN_START_DEVICE",
+    "IRP_MN_QUERY_REMOVE_DEVICE",
+    "IRP_MN_REMOVE_DEVICE",
+    "IRP_MN_CANCEL_REMOVE_DEVICE",
+    "IRP_MN_STOP_DEVICE",
+    "IRP_MN_QUERY_STOP_DEVICE",
+    "IRP_MN_CANCEL_STOP_DEVICE",
+    "IRP_MN_QUERY_DEVICE_RELATIONS",
+    "IRP_MN_QUERY_INTERFACE",
+    "IRP_MN_QUERY_CAPABILITIES",
+    "IRP_MN_QUERY_RESOURCES",
+    "IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
+    "IRP_MN_QUERY_DEVICE_TEXT",
+    "IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
+    "***** FUNCTION 0x0e",
+    "IRP_MN_READ_CONFIG",
+    "IRP_MN_WRITE_CONFIG",
+    "IRP_MN_EJECT",
+    "IRP_MN_SET_LOCK",
+    "IRP_MN_QUERY_ID",
+    "IRP_MN_QUERY_PNP_DEVICE_STATE",
+    "IRP_MN_QUERY_BUS_INFORMATION",
+    "IRP_MN_DEVICE_USAGE_NOTIFICATION",
+    "IRP_MN_SURPRISE_REMOVAL",
+    "IRP_MN_QUERY_LEGACY_BUS_INFORMATION"
+};
+
+static PSTR SystemPowerStateString[] = {
+"PowerSystemUnspecified",
+"PowerSystemWorking",
+"PowerSystemSleeping1",
+"PowerSystemSleeping2",
+"PowerSystemSleeping3",
+"PowerSystemHibernate",
+"PowerSystemShutdown",
+"PowerSystemMaximum"
+};
+
+static PSTR DevicePowerStateString[] = {
+"PowerDeviceUnspecified",
+"PowerDeviceD0",
+"PowerDeviceD1",
+"PowerDeviceD2",
+"PowerDeviceD3",
+"PowerDeviceMaximum"
+};
+
+
+#if DBG
+VOID PrintResourceList(PCM_RESOURCE_LIST);
+VOID PrintConfig(PPCI_COMMON_CONFIG  configInfo);
+#endif
+
+int uLanInstanceCounter=0;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  AddDevice
+//
+//      We are called at this entry point by the Plug and Play Manager
+//      to add a Functional Device Object for a Physical Device Object.
+//      Note that we may NOT access the device in this routine, as the
+//      Plug and Play Manager has not yet given us any hardware resoruces.
+//      We get these hardware resources via the IRP_MJ_PNP IRP with
+//      a minor function IRP_MN_START_DEVICE.
+//
+//
+//  INPUTS:
+//
+//      DriverObj - Address of our DRIVER_OBJECT.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      None.
+//
+//  IRQL:
+//
+//    This routine is called at IRQL_PASSIVE_LEVEL.
+//
+//  NOTES:
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
+                      IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+    PULAN_DEVICE_EXTENSION devExt;
+    PDEVICE_OBJECT  functionalDeviceObject;
+    UNICODE_STRING  devName;
+    UNICODE_STRING  linkName;
+    UNICODE_STRING  tempName;
+    NTSTATUS code = STATUS_SUCCESS;
+
+    LOG_FILEIO("uLan: AddDevice: entered for instance %d\n",uLanInstanceCounter);
+
+    LOG_FILEIO("uLan: AddDevice: PDO = 0x%0x\n", PhysicalDeviceObject);
+
+    // Only up to 10 instances are handled 
+    if(uLanInstanceCounter>=10){
+      uLan_DbgPrint("uLan: Too many instances, no more added\n");
+      return(STATUS_UNSUCCESSFUL);
+    }
+
+    //
+    // Initialize the UNICODE device name.  This will be the "native NT" name
+    // for our device.
+    //
+
+    RtlInitUnicodeString(&tempName,NT_DEVICE_NAME);
+    code=MyAllocUnicodeString(&devName, &tempName, tempName.Length+4);
+    if(uLanInstanceCounter){
+      devName.Buffer[devName.Length/2]='0'+uLanInstanceCounter;
+      devName.Length+=2;
+    }
+    uLan_DbgPrint("uLan: Ready to Call IoCreateDevice for DevName=\"%ws\" Len=%d\n",
+                   devName.Buffer,devName.Length);
+
+
+    //
+    // Ask the I/O Manager to create the device object and
+    // device extension.  In PnP terms, this is the FUNCTIONAL
+    // Device Object (FDO) for the device.
+    //
+    code = IoCreateDevice(DriverObject,
+                          sizeof(ULAN_DEVICE_EXTENSION),
+                          &devName,
+                          FILE_DEVICE_UNKNOWN,
+                          0,       
+                          FALSE,
+                          &functionalDeviceObject);
+
+        
+    if(!NT_SUCCESS(code))  {
+      if(devName.Buffer) ExFreePool(devName.Buffer);;
+      uLan_DbgPrint("uLan: IoCreateDevice failed. Dev=%ws Status = 0x%0x\n",
+                   devName.Buffer,code);
+      return(STATUS_UNSUCCESSFUL);
+    }    
+
+    //
+    // Get a pointer to our device extension
+    //
+    devExt = (PULAN_DEVICE_EXTENSION)functionalDeviceObject->DeviceExtension;
+    
+    LOG_FILEIO("uLan: AddDevice: FDO = 0x%0x\n", functionalDeviceObject);
+
+    //
+    // Zero out the device extension.  While not strictly necessary
+    // (the documentation says the device extension is zeroed) it's
+    // better to be safe.
+    //
+    RtlZeroMemory(devExt, sizeof(ULAN_DEVICE_EXTENSION));
+
+    //
+    // Save the device object pointer away for future reference
+    //
+    devExt->DeviceObject = functionalDeviceObject;
+
+    //
+    // Save the address of the physical device object away for future reference
+    //
+    devExt->PhysicalDeviceObject = PhysicalDeviceObject;
+
+    //
+    //  Clear the Device Initializing bit since the Device Object was created
+    //  outside of DriverEntry.
+    //
+    functionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+    //
+    // Create a familiar name for this device, so that non-kernel mode
+    // programs can open the device.
+    //
+    // NOTE: WDM Drivers on Win98 MUST create this link in the 
+    // \DosDevices directory.  \?? will NOT work.
+    //
+
+    RtlInitUnicodeString(&tempName,DOS_DEVICE_NAME);
+    code=MyAllocUnicodeString(&linkName, &tempName, tempName.Length+4);
+    if(uLanInstanceCounter){
+      linkName.Buffer[linkName.Length/2]='0'+uLanInstanceCounter;
+      linkName.Length+=2;
+    }
+    
+
+    LOG_FILEIO("uLan: AddDevice: Dev=%ws Link=%ws\n",devName.Buffer,linkName.Buffer);
+
+    //
+    // IoCreateSymbolicLink IS a WDM function...
+    //
+    code = IoCreateSymbolicLink(&linkName, &devName);
+    
+    if (!NT_SUCCESS(code))
+    {
+
+        uLan_DbgPrint("uLan: IoCreateSymbolicLink failed.  Status = 0x%x\n", code);
+
+        code = STATUS_UNSUCCESSFUL;
+
+        //
+        // Clean up the mess
+        //
+        IoDeleteDevice(functionalDeviceObject);
+        if(linkName.Buffer) ExFreePool(linkName.Buffer);
+        if(devName.Buffer) ExFreePool(devName.Buffer);;
+
+        //
+        // Indicate load failure to the I/O manager; driver image is deleted...
+        //
+        return(code);
+    }
+
+    devExt->link_name=linkName;
+    devExt->ntdev_name=devName;
+
+    //
+    // Ask the I/O Manager to use buffered I/O
+    //
+    functionalDeviceObject->Flags |= DO_BUFFERED_IO;
+
+    //
+    // Set up the "Remove Event" and "Stop Event".
+    //
+    // Note that we can't use an official "Remove Lock" here, because
+    // the Remove Lock related calls are not in WDM.
+    //
+    KeInitializeEvent(&devExt->RemoveEvent, NotificationEvent, FALSE);
+    // KeInitializeEvent(&devExt->StopEvent, NotificationEvent, TRUE);
+
+    //
+    // Init the count of in-progress I/O requests to zero.  We use this
+    // to keep track of when we can remove the device.
+    //
+    // devExt->OutstandingIO = 0;
+
+    //
+    // Internal device state flags, used for managing PnP state of device
+    //
+    // devExt->Started = FALSE;
+    // devExt->HoldNewRequests = TRUE;
+    // devExt->Removed = FALSE;
+
+    //
+    // Set initial state
+    //
+    devExt->State = STATE_NEVER_STARTED;
+
+    // Initial uLan state
+    ul_drv_new_init_state(devExt,2);
+
+    //
+    // Attach our FDO to the underlying PDO
+    //
+    devExt->DeviceToSendIrpsTo = 
+                     IoAttachDeviceToDeviceStack(functionalDeviceObject,
+                                                 PhysicalDeviceObject);
+
+    //
+    // If that didn't work...
+    //
+    if (!devExt->DeviceToSendIrpsTo)
+    {
+
+        uLan_DbgPrint("uLan: IoAttachDeviceToDeviceStack failed to attach to Target Device");
+
+        //
+        // Clean up the mess
+        //
+        IoDeleteDevice(functionalDeviceObject);
+
+        //
+        // Indicate load failure to the I/O manager; driver image is deleted...
+        //
+        return(STATUS_UNSUCCESSFUL);
+    }
+    
+    #ifdef UL_WITH_WIN_PWR
+    // this event is triggered when self-requested power irps complete
+    KeInitializeEvent(&devExt->SelfRequestedPowerIrpEvent, NotificationEvent, FALSE);
+    #endif /* UL_WITH_WIN_PWR */
+
+    // Successfully added device, prepare number for next instance
+    uLanInstanceCounter++;
+
+    uLan_DbgPrint("uLan: AddDevice: done\n");
+
+    return code;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  DispatchPnp
+//
+//    This is the dispatch entry point for IRP_MJ_PNP requests.  The
+//    driver processes these requets, based on the current state of
+//    the device.
+//
+//
+//  INPUTS:
+//
+//      DeviceObject - Address of the Functional DEVICE_OBJECT for our device.
+//  
+//      Irp - Address of the IRP representing the IRP_MJ_PNP request.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//
+//  IRQL:
+//
+//    This routine is called at IRQL_PASSIVE_LEVEL.
+//
+//  NOTES:
+//
+//      There are several difficulties implementing Plug and Play.
+//      Perhaps the greatest difficulty is deciding precisely how you
+//      want your device to work, given the various requests the driver
+//      can receive and the states the device can be in.  In our driver,
+//      we've decided to implement the following policies:
+//
+//      1) When a removal of the device is requested, we will reject
+//         any new IRPs we receive (completing them with an error
+//         status in the dispatch routine).  We will wait until all IRPs
+//         that are already present on the device's queue are complete
+//         and then allow the remove.
+//
+//      2) When a stop of the device is requested, we'll queue any
+//         newly received IRPs, but not initiate them.  We will wait
+//         until any IRPs that are presently ACTIVE in progress on the
+//         device complete, and then allow the stop.
+//
+//      3) When a SUPRISE removal of the device is indicated, we
+//         immediately cancel any requests that are queued, reject any
+//         newly arriving requests.
+//
+//      Of course, the second complexity in implementing plug and play
+//      is getting the logic in your driver correct, so that it works
+//      as you intend. According to our experience, this is easier said
+//      than done.
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS 
+DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+    PIO_STACK_LOCATION ioStackLocation;
+    NTSTATUS code = STATUS_SUCCESS;
+    PULAN_DEVICE_EXTENSION devExt;
+    KEVENT eventWaitLowerDrivers;
+    PDEVICE_OBJECT targetDevice;
+
+    uLan_DbgPrint("uLan: DispatchPnp: called\n");
+
+    //
+    // Get a pointer to our (FUNCTIONAL) device object's device
+    // extension.
+    //
+    devExt = (PULAN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    //
+    // Up the count of in-progress requests
+    //
+    RequestIncrement(devExt);
+
+    ioStackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    KeInitializeEvent(&eventWaitLowerDrivers, NotificationEvent, FALSE);
+
+    uLan_DbgPrint("uLan: DispatchPnp: Current state: ");
+    PrintState(devExt);
+
+    uLan_DbgPrint("uLan: DispatchPnp: MINOR 0x%0X\n",ioStackLocation->MinorFunction);
+    if(ioStackLocation->MinorFunction<=IRP_MN_SURPRISE_REMOVAL+1)
+      uLan_DbgPrint("uLan: DispatchPnp: *** PNP Minor Function is %s\n", 
+                        pnpMinorCodes[ioStackLocation->MinorFunction]);
+
+
+    switch( devExt->State + ioStackLocation->MinorFunction ) {
+
+
+        //
+        // STATE:   STOPPED or NEVER_STARTED
+        // IRP_MN:  _START_DEVICE
+        //
+        // We're here if we've received an AddDevice() call, but we
+        // do not have a set of hardware resources from the PnP Manager.
+        //
+        // The PnP Manager is now giving us a set of resources, and 
+        // asking us to start the device.
+        //
+        // In this case, we pass the IRP all the way down.  When it's
+        // done (and our completion routine is called) we can then
+        // read the list of device resources pointed to in the IRP
+        // Stack Location.
+        //
+        case STATE_STOPPED + IRP_MN_START_DEVICE:
+        case STATE_NEVER_STARTED + IRP_MN_START_DEVICE:
+
+            uLan_DbgPrint("uLan: DispatchPnp: PROCESSING START_DEVICE\n");
+
+            //
+            // The BUS DRIVER handles this IRP before we do
+            //
+            IoCopyCurrentIrpStackLocationToNext(Irp);
+
+            //
+            // Call PnpComplete() when this IRP is done...
+            //
+            IoSetCompletionRoutine(Irp,
+                                  PnpComplete,
+                                  &eventWaitLowerDrivers,
+                                  TRUE,
+                                  TRUE,
+                                  TRUE);
+
+            //
+            // Send the IRP to the bus driver.  Let's see what HE
+            // thinks.
+            //
+            code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+
+            if (STATUS_PENDING == code) {
+
+                KeWaitForSingleObject(&eventWaitLowerDrivers,
+                                   Executive,
+                                   KernelMode,
+                                   FALSE,
+                                   NULL);
+
+                code = Irp->IoStatus.Status;
+            }
+
+            //
+            // Can the bus driver do the start?
+            //
+            if (NT_SUCCESS (code)) {
+
+                //
+                // Yup.  Go initialize the device.  The CmResourceLists
+                // are pointed to by the IoStackLocation.
+                //
+                        
+                //  uld_debug_flg|=4;
+                code = StartDevice(devExt, ioStackLocation);
+
+                //
+                // If the our StartDevice function succeeded, the
+                // device is now "officially" started!
+                //
+                if(NT_SUCCESS(code)) {
+
+                    devExt->State = STATE_STARTED;
+
+                }
+
+            } else {
+
+                //
+                // The bus driver has declined to start the device.
+                // Oh well...
+                //
+#if DBG
+                uLan_DbgPrint("uLan: DispatchPnp: IoCallDriver() for START fails! 0x%0x \n", code);
+#endif
+
+            }
+
+            //
+            // We must now complete the IRP, since we stopped it in the
+            // completetion routine with MORE_PROCESSING_REQUIRED.
+            //
+            Irp->IoStatus.Status = code;
+
+            Irp->IoStatus.Information = 0;
+
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            
+            break;
+
+
+
+        //
+        // STATE:   STARTED
+        // IRP_MN:  _QUERY_REMOVE
+        //
+        // We're here because we're running, and the PnP Manager wants
+        // to "nicely" remove our device.  This is the orderly way
+        // PnP Manager handles device disconnections (as opposed to
+        // doing a SURPRISE_REMOVAL).
+        //
+        // What we do here is (a) change the state of the device such
+        // that newly arriving requests will be rejected, (b) wait for
+        // all requests to complete on the device, and (c) pass the
+        // request on down.
+        //
+        case STATE_STARTED + IRP_MN_QUERY_REMOVE_DEVICE:
+
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: PROCESSING QUERY_REMOVE_DEVICE\n");
+#endif
+            //
+            // WE process this request FIRST
+            //
+            //
+            // See if we're OK with removing the device at this point.
+            // We do NOT actually RETURN the resources here... we
+            // just affirm or deny that we're OK with returning them.
+            //
+            code = CanRemoveDevice(devExt, Irp);
+            
+            //
+            // Replace status code that's in the IRP to indicate our
+            // opinion about stopping the device.  If we're
+            // OK with returning the resources, this will be
+            // STATUS_SUCCESS.
+            //
+            Irp->IoStatus.Status = code;
+
+            if(!NT_SUCCESS(code)) {
+
+                //
+                // NOPE.  Can't remove the device because, for some
+                // reason (perhaps because we can't return our
+                // resources).  Too bad. Tell the PnP Manager that
+                // stopping right now is not an option for us.
+                //
+                // NOTE: NO NEED to pass IRP down if WE can't stop
+                // it doesn't matter if the Bus Driver can.
+                //
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                        
+                
+            } else {                    
+
+#if DBG
+                uLan_DbgPrint("uLan: DispatchPnp: Waiting for pending requests to complete. (%d. remain)\n", devExt->OutstandingIO);
+#endif
+
+                //
+                // Set new state -- This state results in any new
+                // requests received at our dispatch entry points
+                // being REJECTED... any request still on the queues
+                // are allowed to complete, however.
+                //
+                devExt->State = STATE_REMOVE_PENDING;
+
+                //
+                // Decrement our reference on the device here, and then
+                // wait until there are no requests active or on the
+                // device's queues.
+                //
+                RequestDecrement(devExt);
+
+                WaitForRemove(devExt);
+                
+                //
+                // OK.  No further requests remain.  Let the bus driver
+                // know.
+
+                //
+                // DECREMENTED REQUEST COUNT above.  Return immediately
+                // below.
+                //
+#if DBG
+                uLan_DbgPrint("uLan: DispatchPnp: Leaving With state: ");
+                PrintState(devExt);
+                uLan_DbgPrint("\n");
+#endif
+                //
+                // Pass this request on down to the bus driver
+                //
+                IoSkipCurrentIrpStackLocation(Irp);
+
+                return(IoCallDriver(devExt->DeviceToSendIrpsTo, Irp));
+
+            }
+            break;
+
+        //
+        // STATE:   REMOVE_PENDING
+        // IRP_MN:  _REMOVE_DEVICE
+        //
+        // We're here because we've previously received notification
+        // of the intention to remove the device in an orderly way.
+        // We return our resources here, and then tear down our device
+        // object.  Note that there can be no requests pending at this
+        // point, because we finished them all during QUERY_REMOVE
+        // processing (before entering RemovePending state)
+        //
+        case STATE_REMOVE_PENDING + IRP_MN_REMOVE_DEVICE:
+
+            //
+            // All queued and active IRPs are complete at this point.
+            //
+
+            //
+            // Fall through...
+            //
+
+        //
+        // STATE:   SURPRISE_REMOVED
+        // IRP_MN:  _REMOVE_DEVICE
+        //
+        // We're here because we've previously received notification
+        // of a "surprise" removal.  At this point, we just tear down
+        // our device object
+        //
+        case STATE_SURPRISE_REMOVED + IRP_MN_REMOVE_DEVICE:
+
+            //
+            // Removing the device at this point is NOT optional.
+            //
+            #if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: REMOVE_DEVICE\n");
+            #endif
+
+            //
+            // Device has been removed
+            //
+            devExt->State = STATE_REMOVED;
+
+            //
+            // Return any resources we're using.
+            //
+            ReturnResources(devExt);
+
+            //
+            // Decrement our reference on the device here, and then
+            // wait until we can remove the device.  Because we would
+            // have gotten a prior warning of this removal (via an
+            // IRP_MN_SUPRISE_REMOVAL or an IRP_MN_QUERY_REMOVE) and
+            // at that time transitioned state appropriately, there
+            // should be no requests outstanding here.
+            //
+            RequestDecrement(devExt);
+        
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Waiting for pending requests to complete. %d. remain\n", devExt->OutstandingIO);
+#endif
+            WaitForRemove(devExt);
+            
+            //
+            // WE process this request first
+            //
+
+           // Remember next target of IRP
+            targetDevice = devExt->DeviceToSendIrpsTo;
+
+            //
+            // Remove and return our device object
+            //
+            RemoveDevice(devExt->DeviceObject);
+
+            //
+            // Indidcate that we've successfully processed the IRP
+            //
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+
+            //
+            // Pass this request on down to the bus driver
+            //
+            IoSkipCurrentIrpStackLocation(Irp);
+
+            code = IoCallDriver(targetDevice, Irp);
+            
+            ASSERT(code != STATUS_PENDING);
+
+            //
+            // IMPORTANT: We decremented our I/O In Progress count
+            // above... We don't want to decrement it again, so we
+            // return right here.
+            //
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Leaving with state: STATE_REMOVE\n");
+#endif
+            return(code);
+
+            break;
+
+        //
+        // STATE:   STARTED
+        // IRP_MN:  _SURPRISE_REMOVAL
+        //
+        // We're here when the device is running, and a device is
+        // forcibly removed.  PnP Manager will send us a remove device
+        // IRP when we're supposed to actually return our resources
+        // and the like.
+        //
+        // Note that this is a "best effort" activity.  It is quite
+        // possible, due to timing issues etc, that we'll crash the
+        // system because the device is gone.  While we'll TRY not
+        // to do this, it is within the rules.
+        //
+        // THIS IRP IS NOT SENT ON Win9x.
+        //
+        case STATE_STARTED + IRP_MN_SURPRISE_REMOVAL:
+
+            devExt->State = STATE_SURPRISE_REMOVED;
+
+            //
+            // We handle this request before the bus driver
+            //
+
+            //
+            // Cancel any pending requests... make sure
+            // the active requests get stopped within a second (with
+            // no hardware access, as a result of setting the state
+            // above).
+            //
+            ClearQueues(devExt);
+
+            //
+            // We're happy... sort of.  Note that it's not "legal"
+            // to fail this request.  Afterall, what woudl that MEAN?
+            //
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+
+            //
+            // Pass this request on down to the bus driver
+            //
+            IoSkipCurrentIrpStackLocation(Irp);
+
+            code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+
+            break;
+
+        //
+        // STATE:   STARTED
+        // IRP_MN:  _REMOVE_DEVICE
+        //
+        // We're here when the device is running, and a device is
+        // forcibly removed.
+        //
+        // Note that like getting a SUPRISE_REMOVAL IRP on NT trying
+        // to handle a removal directly from started state is a "best
+        // effort" type of activity.  We'll do what we can but it's
+        // possible, due to timing issues etc, that we'll crash the
+        // system because the device is gone.  While we'll TRY not
+        // to do this, it could be unavoidable.  Oh well.
+        //
+        // ON NT, we'd get an IRP_MN_SURPRISE_REMOVAL instead of this
+        // IRP in this state.  We get this only on Win9x systems.
+        //
+        case STATE_STARTED + IRP_MN_REMOVE_DEVICE:
+
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: REMOVE_DEVICE\n");
+#endif
+            devExt->State = STATE_REMOVED;
+
+            //
+            // We handle this request before the bus driver
+            // Note that this is another one of those requests we're
+            // not "allowed" to fail.
+            //
+
+            //
+            // Cancel any pending requests... make sure
+            // the active requests get stopped within a second (with
+            // no hardware access, as a result of setting the state
+            // above).
+            //
+            ClearQueues(devExt);
+
+            //
+            // Return any resources we're using.
+            //
+            ReturnResources(devExt);
+
+            //
+            // Removing the device at this point is NOT optional.
+            //
+
+            //
+            // Detach from the PDO 
+            //
+            IoDetachDevice(devExt->DeviceToSendIrpsTo);
+            targetDevice = devExt->DeviceToSendIrpsTo;
+            devExt->DeviceToSendIrpsTo = NULL;
+
+            //
+            // Decrement our reference on the device here, and then
+            // wait until we can remove the device.
+            //
+            RequestDecrement(devExt);
+        
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Waiting for pending requests to complete. %d. remain\n", devExt->OutstandingIO);
+#endif
+
+            WaitForRemove(devExt);
+            
+            //
+            // OK!  Now we can return our device object
+            //
+            RemoveDevice(devExt->DeviceObject);
+
+            //
+            // Tell the underlying driver we're cool
+            //
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+
+            //
+            // Pass this request on down to the bus driver
+            //
+            IoSkipCurrentIrpStackLocation(Irp);
+
+            code = IoCallDriver(targetDevice, Irp);
+            
+            ASSERT(code != STATUS_PENDING);
+
+            //
+            // IMPORTANT: We decremented our I/O In Progress count
+            // above... We don't want to decrement it again, so we
+            // return right here.
+            //
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Leaving with state: STATE_REMOVED\n");
+#endif
+            return(code);
+
+            break;
+
+        //
+        // STATE:   STARTED
+        // IRP_MN:  _QUERY_STOP_DEVICE
+        //
+        // We're here if we're running and the PnP Manager sends us
+        // a QUERY_STOP_DEVICE request.  He'll do this if he wants to
+        // rebalance resources, to see if we're willing to give up the
+        // hardware resources that were allocated for us when we got
+        // our IRP_MN_START_DEVICE.
+        //
+        // To proess this QUERY_STOP, we check to see if the stop is
+        // acceptable to us (in this driver it always is), and then
+        // we just transition the device to STOP_PENDING state.  In
+        // this state, new requests that arrive are queued.  When a
+        // currently in-progress request is completed, a new request
+        // is NOT started.  Thus, ON OUR DEVICE, we sort of hope that
+        // between the QUERY_STOP IRP arrive and actual STOP IRP arriving
+        // that any in-progress I/O will complete of its own accord.
+        // We like this scheme, particularly because at least on NT
+        // during startup the device seems to get lots of QUERY_STOP
+        // IRPs, that are just followed by CANCEL_STOP.  Thus, we think
+        // it would be unfortunate to do anything radical with the
+        // outstanding requests (like cancel them) when we receive a
+        // QUERY_STOP.
+        //
+        case STATE_STARTED + IRP_MN_QUERY_STOP_DEVICE:
+
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: PROCESSING QUERY_STOP_DEVICE\n");
+#endif
+            //
+            // WE process this request before the BUS DRIVER
+            //
+
+            //
+            // See if we're OK with stopping the device at this point.
+            // We do NOT actually RETURN the resources here... we
+            // just affirm or deny that we're OK with returning them.
+            //
+            code = CanStopDevice(devExt, Irp);
+            
+            //
+            // Replace status code that's in the IRP to indicate our
+            // opinion about stopping the device.  If we're
+            // OK with returning the resources, this will be
+            // STATUS_SUCCESS.
+            //
+            Irp->IoStatus.Status = code;
+
+            if(!NT_SUCCESS(code)) {
+
+                //
+                // NOPE.  Can't stop the device because, for some
+                // reason (perhaps because we can't return our
+                // resources).  Too bad. Tell the PnP Manager that
+                // stopping right now is not an option for us.
+                //
+                // NOTE: NO NEED to pass IRP down if WE can't stop
+                // it doesn't matter if the Bus Driver can.
+                //
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                        
+                
+            } else {                    
+
+                //
+                // We CAN stop our device and return the resources.
+                // Pass the IRP down to see if the bus driver is
+                // equally ammenable to the request.
+                //
+#if DBG
+                uLan_DbgPrint("uLan: DispatchPnp: Agreeing to stop device.\n");
+#endif
+
+                //
+                // Set new state. This state results in no new
+                // requests being started on the device, but incoming
+                // requests are still allowed and queued.
+                //
+                devExt->State = STATE_STOP_PENDING;
+
+                //
+                // Pass this request on down to the bus driver
+                //
+                IoSkipCurrentIrpStackLocation(Irp);
+
+                code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+
+            }
+            break;
+
+        //
+        // STATE:   STOP_PENDING
+        // IRP_MN:  _STOP_DEVICE
+        //
+        // We're in this state because we previously received a 
+        // QUERY_STOP_DEVICE, that we agreed that we could grant.
+        // Thus, we're waiting to receive a STOP_DEVICE request.
+        // To process this request, we first wait for any in-progress
+        // requests to complete (note that no NEW requests have been
+        // started since the transition to STOP_PENDING state as a
+        // result of receiving the QUERY_STOP IRP).  After all in-
+        // progress requests are complete, we return our resources
+        // and wait for further instructions from the PnP Manager (
+        // which better include a START_DEVICE someplace down the line!).
+        // 
+        // While in this state, any IRPs we receive will be queued
+        // for processing after we get the START_DEVICE.
+        //
+        case STATE_STOP_PENDING + IRP_MN_STOP_DEVICE:
+
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: PROCESSING STOP_DEVICE\n");
+#endif
+            //
+            // Assume success
+            //
+            devExt->State = STATE_STOPPED;
+        
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Waiting for in-progress requests to complete\n");
+#endif
+
+            //
+            // We process this request before passing it to the bus
+            // driver
+            //
+
+            //
+            // Wait until all active requests on the device have
+            // completed...
+            //
+            WaitForStop(devExt);
+            
+            //
+            // There are NO ACTIVE IRPs on the device at this point.
+            //
+
+            //
+            // Return any resources we're using.
+            //
+            ReturnResources(devExt);
+
+            //
+            // NOTE: We DO NOT delete our device object here.  This is
+            // one difference between a _STOP_DEVICE and _REMOVE_DEVICE.
+            //
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Passing along request\n");
+#endif
+
+            //
+            // Pass this request on down to the bus driver
+            //
+            IoSkipCurrentIrpStackLocation(Irp);
+            
+            //
+            // We're cool with the stop...
+            //
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+
+            code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+            break;        
+
+
+        //
+        // STATE:   STOP_PENDING
+        // IRP_MN:  _CANCEL_STOP_DEVICE
+        //
+        // We're here because we've already received a QUERY_STOP,
+        // that we've agreed to.  We've completed any pending I/O
+        // requests.  Now we've received a CANCEL_STOP_DEVICE
+        // IRP, that sort of says "never mind" about that stop.
+        //
+        // We restart our queues and return to Started state.
+        //
+        case STATE_STOP_PENDING + IRP_MN_CANCEL_STOP_DEVICE:
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: PROCESSING CANCEL_STOP\n");
+#endif
+
+            //
+            // fall through...
+            //
+
+        //
+        // STATE:   REMOVE_PENDING
+        // IRP_MN:  _CANCEL_REMOVE_DEVICE
+        //
+        // We're here because we've already received a QUERY_REMOVE,
+        // that we've agreed to.  We've completed any pending I/O
+        // requests.  Now we've received a CANCEL_REMOVE_DEVICE
+        // IRP, that sort of says "never mind" about that remove.
+        //
+        // We restart our queues and return to Started state.
+        //
+        case STATE_REMOVE_PENDING + IRP_MN_CANCEL_REMOVE_DEVICE:
+
+#if DBG
+            if( devExt->State == STATE_REMOVE_PENDING) {
+            
+                uLan_DbgPrint("uLan: DispatchPnp: PROCESSING CANCEL_REMOVE\n");
+       
+            }
+#endif
+
+            //
+            // The Underlying BUS DRIVER must handle these IRPs
+            // before we do...
+            //
+
+            //
+            // We need to wait for the underlying bus driver to
+            // get restarted, before we can continue processing.
+            //
+            IoCopyCurrentIrpStackLocationToNext(Irp);
+
+            IoSetCompletionRoutine(Irp,
+                                   PnpComplete,
+                                   &eventWaitLowerDrivers,
+                                   TRUE,
+                                   TRUE,
+                                   TRUE);
+
+            code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+
+            if(code == STATUS_PENDING) {
+
+                KeWaitForSingleObject(&eventWaitLowerDrivers,
+                                      Executive,
+                                      KernelMode,
+                                      FALSE,
+                                      NULL);
+            }
+
+
+            //
+            // We're now in STARTED state
+            //
+            devExt->State = STATE_STARTED;
+
+            //
+            // Go see if there's a request that we can start now
+            //
+            ProcessQueuedRequests(devExt);
+
+            code = STATUS_SUCCESS;
+
+            Irp->IoStatus.Status = code;
+
+            Irp->IoStatus.Information = 0;
+
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+            break;
+
+#ifdef UL_WITH_WIN_PWR
+        //
+        // STATE:   QUERY_CAPABILITIES
+        // IRP_MN:  IRP_MN_QUERY_CAPABILITIES
+        //
+        case STATE_STARTED + IRP_MN_QUERY_CAPABILITIES:
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: QUERY_CAPABILITIES\n");
+#endif
+            IoCopyCurrentIrpStackLocationToNext(Irp);
+
+            IoSetCompletionRoutine(Irp,
+                                   PnpComplete,
+                                   &eventWaitLowerDrivers,
+                                   TRUE,
+                                   TRUE,
+                                   TRUE);
+
+            code = IoCallDriver(devExt->DeviceToSendIrpsTo, Irp);
+
+            if(code == STATUS_PENDING) {
+
+                KeWaitForSingleObject(&eventWaitLowerDrivers,
+                                      Executive,
+                                      KernelMode,
+                                      FALSE,
+                                      NULL);
+            }
+            
+            break;
+        
+            code = STATUS_SUCCESS;
+
+            Irp->IoStatus.Status = code;
+
+            Irp->IoStatus.Information = 0;
+
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+            
+            break;
+#endif /* UL_WITH_WIN_PWR */
+
+        default:
+
+            //
+            // DEFAULT CASE
+            // Just pass the request to the lower driver
+            //
+#if DBG
+            uLan_DbgPrint("uLan: DispatchPnp: Default case: Just pass it along...\n");
+#endif
+            IoSkipCurrentIrpStackLocation (Irp);
+
+            code = IoCallDriver (devExt->DeviceToSendIrpsTo, Irp);
+
+            break;
+    }
+
+    //
+    // Adjust in-progress request count
+    //
+    RequestDecrement(devExt);
+
+#if DBG
+    uLan_DbgPrint("uLan: DispatchPnp: Leaving with new state ");
+
+    PrintState(devExt);
+
+    uLan_DbgPrint("uLan: DispatchPnp: exit (%d.).\n", devExt->OutstandingIO);
+#endif
+
+    //
+    // We always finish our work in this function
+    //
+    ASSERT(code != STATUS_PENDING);
+
+    return(code);
+}
+
+//
+// PnpComplete
+// 
+// This is the completion routine for IRP_MJ_PNP requests
+//
+NTSTATUS
+PnpComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+    PIO_STACK_LOCATION  iostack;
+    PKEVENT pEvent = (PKEVENT) Context;
+    NTSTATUS status = STATUS_SUCCESS;
+#ifdef UL_WITH_WIN_PWR
+    PULAN_DEVICE_EXTENSION devExt;
+    PDEVICE_CAPABILITIES Capabilities;
+
+    devExt = (PULAN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+#else
+    UNREFERENCED_PARAMETER (DeviceObject); 
+#endif /* UL_WITH_WIN_PWR */
+
+    iostack = IoGetCurrentIrpStackLocation (Irp);
+
+//
+// Driver Writers, please note:
+//
+//  The following code is only necessary IF (a) WE have a completion
+//  routine, AND (b) WE return STATUS_PENDING from our dispatch entry
+//  point after re-claiming the IRP.  Since neither of these things
+//  is true... this code does not belong here.
+//
+//    if (Irp->PendingReturned) {
+//
+//        IoMarkIrpPending( Irp );
+//
+//    }
+
+    switch (iostack->MajorFunction) {
+
+        case IRP_MJ_PNP:
+
+#ifdef UL_WITH_WIN_PWR
+            if (iostack->MinorFunction == IRP_MN_QUERY_CAPABILITIES) {
+
+                        Capabilities = iostack->Parameters.DeviceCapabilities.Capabilities;
+
+                        //Modify the PnP values here as necessary
+                        Capabilities->Removable = TRUE;
+                        Capabilities->SurpriseRemovalOK = FALSE;
+    
+                        //Save the device capabilities int the device extension
+                        RtlCopyMemory(&devExt->DeviceCapabilities,
+                                Capabilities,
+                                sizeof(DEVICE_CAPABILITIES));
+                        
+                        PrintCapabilityInfo(&devExt->DeviceCapabilities);
+                        
+            }
+#endif /* UL_WITH_WIN_PWR */
+
+            KeSetEvent(pEvent, 0, FALSE);
+
+            //
+            // Take the IRP back so that we can continue using it during
+            // the IRP_MN_START_DEVICE dispatch routine.
+            // NB: we will have to call IoCompleteRequest
+            //
+            return STATUS_MORE_PROCESSING_REQUIRED;
+
+            break;
+
+        case IRP_MJ_POWER:
+
+            KeSetEvent(pEvent, 1, FALSE);
+
+            //
+            // Take the IRP back so that we can continue using it during
+            // the IRP_MN_START_DEVICE dispatch routine.
+            // NB: we will have to call IoCompleteRequest
+            //
+            return STATUS_MORE_PROCESSING_REQUIRED;
+
+            break;
+
+        default:
+#if DBG
+            uLan_DbgPrint("uLan: PnpComplete: NOT MJ_PNP or MJ_POWER IRP??\n");
+#endif
+
+            break;
+    }
+
+    return status;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// StartDevice
+//
+//      This function is called from the DispatchPnp Entry Point to
+//      actually start the hardware.
+//
+//  INPUTS:
+//
+//      DevExt  - Address of our device extension.
+//      IoStackLocation -- Pointer to I/O Stack Location containing
+//                  configuration information
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS
+StartDevice(IN PULAN_DEVICE_EXTENSION DevExt,
+            IN PIO_STACK_LOCATION IoStackLocation)
+{
+    NTSTATUS code = STATUS_SUCCESS;
+    ULONG index;
+    PDEVICE_DESCRIPTION deviceDescription;
+    PCM_RESOURCE_LIST pResourceList, pResourceListTranslated;
+    PCM_PARTIAL_RESOURCE_LIST prl, prlTranslated;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR prd, prdTranslated;
+    PCM_FULL_RESOURCE_DESCRIPTOR frd, frdTranslated;
+    HANDLE regKeyHandle;
+    PWCHAR dpHWID;
+    ULONG  dpHWID_len;
+    PWCHAR pwc;
+    pci_device_id_t *pci_device_id;
+    usb_device_id_t *usb_device_id;
+    int ChipOptions=0;
+    ULONG uLanBaudrate=19200;
+    ULONG uLanBaudBase=0;
+    ULONG uLanMyAddress=2;
+
+    pResourceList = IoStackLocation->Parameters.StartDevice.AllocatedResources;
+    pResourceListTranslated = IoStackLocation->Parameters.StartDevice.AllocatedResourcesTranslated;
+
+    //
+    // Ensure the base address starts as NULL
+    //
+    ///DevExt->AmccBaseRegisterAddress = NULL;
+    DevExt->port=0;
+    DevExt->irq=0;
+
+
+    // Try to find chip category from 
+    // IoGetDeviceProperty(DeviceObject,DeviceProperty,BufferLength,PropertyBuffer,ResultLength);
+    // subfunctions DevicePropertyHardwareID and DevicePropertyLegacyBusType 
+    // uLan: HWID : PCI\VEN_1415&DEV_950A&SUBSYS_00001415&REV_00
+    // uLan: HWID : PCI\VEN_1415&DEV_950A&SUBSYS_00001415
+    // uLan: HWID : PCI\VEN_1415&DEV_950A&CC_070006
+    // uLan: HWID : PCI\VEN_1415&DEV_950A&CC_0700
+
+    dpHWID_len=0;
+    code=IoGetDeviceProperty(DevExt->PhysicalDeviceObject,
+                            DevicePropertyHardwareID,
+                            0,NULL,&dpHWID_len);
+    if(dpHWID_len){
+      dpHWID=ExAllocatePool(PagedPool,dpHWID_len);
+      if(dpHWID==NULL) return STATUS_INSUFFICIENT_RESOURCES;
+      code=IoGetDeviceProperty(DevExt->PhysicalDeviceObject,
+                              DevicePropertyHardwareID,
+                              dpHWID_len,dpHWID,&dpHWID_len);
+      if (!NT_SUCCESS(code))  {
+       #if DBG
+        uLan_DbgPrint("uLan: IoGetDeviceProperty failed with error 0x%x", code);
+       #endif
+        ExFreePool(dpHWID);
+        return(code);
+      }
+      pwc=dpHWID;
+      while(*pwc){
+       #if DBG
+        uLan_DbgPrint("uLan: HWID : %ws\n", pwc);
+       #endif
+        while(*pwc) pwc++;
+       pwc++;
+      }
+      if(FindPciHWID(dpHWID,&pci_device_id)){             
+       ChipOptions=pci_device_id->driver_data;
+        #if DBG
+          uLan_DbgPrint("uLan: ChipOptions %08X\n", ChipOptions);
+        #endif
+      }
+
+      if (FindUsbHWID(dpHWID, &usb_device_id)) {
+       ChipOptions=usb_device_id->driver_info;
+        DevExt->usb_bus=1;
+        #if DBG
+          uLan_DbgPrint("uLan: ChipOptions %08X\n", ChipOptions);
+        #endif
+
+        //create usb device
+        usb_create_dev(&((usb_device*)DevExt->dev),DevExt->DeviceToSendIrpsTo);
+        if ( !NT_SUCCESS( code)) {
+           uLan_DbgPrint("uLan: error in create device\n");
+           return code;
+        }
+
+        //set configuration
+        code = usb_set_configuration((usb_device*)DevExt->dev,1);
+        if ( !NT_SUCCESS( code)) {
+           uLan_DbgPrint("uLan: error in usb_set_configuration\n");
+           return code;
+        }  
+         
+        usb_show_device((usb_device*)DevExt->dev);
+      }
+      
+      ExFreePool(dpHWID);
+    }
+
+    //
+    // Read values from registry 
+    //
+    code = IoOpenDeviceRegistryKey(DevExt->PhysicalDeviceObject,
+                                  PLUGPLAY_REGKEY_DEVICE,
+                                  STANDARD_RIGHTS_WRITE,
+                                  &regKeyHandle);
+    if(NT_SUCCESS(code)) {
+      MyGetRegistryKeyValue (regKeyHandle,L"uLanBaudrate",
+                            &uLanBaudrate,sizeof(uLanBaudrate));
+      MyGetRegistryKeyValue (regKeyHandle,L"uLanBaudBase",
+                            &uLanBaudBase,sizeof(uLanBaudBase));
+      MyGetRegistryKeyValue (regKeyHandle,L"uLanMyAddress",
+                            &uLanMyAddress,sizeof(uLanMyAddress));
+
+      ZwClose (regKeyHandle);
+    }
+    
+    
+    if (!DevExt->usb_bus) {
+        /* not for USB device, pResourceList is NULL */
+        
+        frd = &pResourceList->List[0];
+        frdTranslated = &pResourceListTranslated->List[0];
+
+        prl = &frd->PartialResourceList;
+        prlTranslated = &frdTranslated->PartialResourceList;
+
+#if DBG
+        PrintResourceList(pResourceList);
+        PrintResourceList(pResourceListTranslated);
+#endif
+
+        //
+        // Walk through the partial resource descriptors to find the
+        // hardware resources that have been allocated to us
+        //
+        // We need one range of port addresses (0x08 bytes long) and
+        // and interrupt resource.
+        //
+        for (index = 0,
+             prd = &prl->PartialDescriptors[index],
+             prdTranslated = &prlTranslated->PartialDescriptors[index];
+             index < prl->Count && NT_SUCCESS(code);
+             index++, prd++, prdTranslated++) {
+
+            switch (prd->Type) {
+
+                case CmResourceTypePort:
+
+                    //
+                    // Newer AMCC Demo Boards have more than just one BAR
+                    // programmed in the PCI configuration ROM.  We want
+                    // the FIRST BAR, which is the base address of the
+                    // device itself.  So, we ignore any ports reported to
+                    // us after the first one.
+                    //
+                    ///if (DevExt->AmccBaseRegisterAddress) {
+               if (DevExt->port) {
+#if DBG
+                        uLan_DbgPrint("uLan: Ignoring additional port resource ...\n");
+
+                        if(prdTranslated->Type == CmResourceTypePort) {
+                            uLan_DbgPrint("uLan: (Translated port 0x%0x)\n",
+                             prdTranslated->u.Port.Start.LowPart);
+
+
+                        } else {
+                            uLan_DbgPrint("uLan: (Translated memory 0x%0x)\n",
+                             prdTranslated->u.Memory.Start);
+                        }
+
+#endif
+                        break;                    
+                    }
+
+#if DBG
+                    uLan_DbgPrint("uLan: Configuring port resource ...\n");
+#endif
+                    //
+                    // Should only get ONE port resources
+                    //
+                    ///ASSERT(DevExt->AmccBaseRegisterAddress == NULL);
+
+                    //
+                    // Our port space on this card is 0x40 bytes longs
+                    //
+                    ///ASSERT(prd->u.Memory.Length == 0x40);
+
+                    //
+                    // Do the device ports appear in port I/O space or
+                    // in memory space on this machine.
+                    //
+                    if(prdTranslated->Type == CmResourceTypePort) {
+
+                        //
+                        // The port is in port space on this machine.  Just
+                        // store away the address
+                        //
+                        ///DevExt->MappedPorts = FALSE;
+
+                        ///DevExt->AmccBaseRegisterAddress =
+                        ///    (PVOID) prdTranslated->u.Port.Start.LowPart;
+                   DevExt->port = prdTranslated->u.Port.Start.LowPart;
+
+#if DBG
+                        uLan_DbgPrint("uLan: Translated resource is a port at 0x%0x\n",
+                                    DevExt->port);
+#endif
+
+                    } else {
+
+
+                        ASSERT(prdTranslated->Type == CmResourceTypeMemory);
+
+                        //
+                        // The port is in memory space on this machine.  We
+                        // need to map some virtual addresses over the physical
+                        // address provided us, and remember to do an UNMAP
+                        // if/when we have to return the resources.
+                        //
+                        DevExt->MappedPorts = TRUE;
+
+                        ///DevExt->AmccBaseRegisterAddress =
+                        DevExt->port =
+                            (ULONG)MmMapIoSpace(prdTranslated->u.Memory.Start,
+                                          DEF_PORT_RANGE,
+                                         /*prdTranslated->u.Memory.Length,*/
+                                          MmNonCached);
+
+
+#if DBG
+                        uLan_DbgPrint("uLan: Translated resource is MEMORY at 0x%0x\n",
+                                    DevExt->port);
+#endif
+
+                    }
+
+                    break;
+
+
+                case CmResourceTypeInterrupt:
+
+#if DBG
+                    uLan_DbgPrint("uLan: Configuring Interrupt resource ...\n");
+#endif
+                    //
+                    // Be sure we get only ONE interrupt resource
+                    //
+                    ASSERT(DevExt->irq == 0);
+
+                    //
+                    // Again, assume that the translated and raw resources
+                    // are in the same order and number
+                    //
+                    ASSERT(CmResourceTypeInterrupt == prdTranslated->Type);
+
+                    ///DevExt->InterruptLevel       = (UCHAR)prdTranslated->u.Interrupt.Level;
+                    ///DevExt->InterruptVector      = prdTranslated->u.Interrupt.Vector;
+                    ///DevExt->InterruptAffinity    = prdTranslated->u.Interrupt.Affinity;
+                           DevExt->Irql = (UCHAR)prdTranslated->u.Interrupt.Level;
+                   DevExt->irq = prdTranslated->u.Interrupt.Vector;
+                   DevExt->InterruptAffinity = prdTranslated->u.Interrupt.Affinity;
+                    
+                    if (prdTranslated->Flags & CM_RESOURCE_INTERRUPT_LATCHED) {
+                    
+                        DevExt->InterruptMode = Latched;
+
+                    } else {
+                    
+                        DevExt->InterruptMode = LevelSensitive;
+                    }
+
+                    //
+                    // Because this is a PCI device, we KNOW it must be
+                    // a LevelSensitive Interrupt
+                    //
+                    ///ASSERT(DevExt->InterruptMode == LevelSensitive);
+
+#if DBG
+                    uLan_DbgPrint("uLan: Interrupt level: 0x%0x, Vector: 0x%0x, Affinity: 0x%0x\n",
+                                DevExt->Irql,
+                                DevExt->irq,
+                                DevExt->InterruptAffinity);
+#endif
+                    break;
+
+                default:
+#if DBG
+                    uLan_DbgPrint("uLan: Unhandled Resource -- CmResourceType received 0x%x\n", prd->Type);
+#endif
+                    break;
+            }
+        }
+
+        //
+        // We NEED the interrupt info AND one port
+        //
+        if(!DevExt->irq || !DevExt->port){
+          uLan_DbgPrint("uLan: Port (0x%0lX) or Irq (%d) undefined\n", 
+                   DevExt->port,DevExt->irq);
+          return STATUS_UNSUCCESSFUL;
+        }
+    }
+
+
+    //
+    // Register our DPCforISR routine.  This is the routine which will
+    // be used to complete our interrupt processing.
+    //
+    ///IoInitializeDpcRequest(DevExt->DeviceObject, DpcForIsr);
+    KeInitializeDpc(&DevExt->bottom_dpc,ulan_bottom_dpc,DevExt);
+    KeInitializeDpc(&DevExt->wd_timer_dpc,ulan_wd_dpc,DevExt);
+    KeInitializeTimer(&DevExt->wd_timer);
+
+
+    // Increase spinlock level
+    if(uL_SpinLock_Irql<DevExt->Irql)
+       uL_SpinLock_Irql=DevExt->Irql;
+    uLan_DbgPrint("uLan: spin lock irql=%d\n",uL_SpinLock_Irql);
+
+
+    if (!DevExt->usb_bus) {
+
+        //
+        // Connect to interrupt from the device.  After this call,
+        // interrupts from the device will result in calls to our uLan HandleInterrupt
+        // function.
+        //
+        code = IoConnectInterrupt(&DevExt->InterruptObject,
+                       uld_irq_handler,            // ServiceRoutine 
+                       DevExt,                     // ServiceContext
+                       NULL,                       // SpinLock
+                       DevExt->irq,                // Vector
+                       DevExt->Irql,               // Irql 
+                       DevExt->Irql,               // SynchronizeIrql
+                       DevExt->InterruptMode,      // InterruptMode
+                       TRUE,                       // ShareVector 
+                       DevExt->InterruptAffinity,  // ProcessorEnableMask 
+                       FALSE);                     // FloatingSave 
+
+
+        if (!NT_SUCCESS(code))  {
+
+    #if DBG
+            uLan_DbgPrint("uLan: IoConnectInterrupt failed with error 0x%x", code);
+    #endif
+            //
+            // We're outa here 
+            //
+            return(code);
+        }
+    }
+    
+    //
+    // Now we are ready to start uLan communication.
+    //
+    ///ResetAdapter(DevExt->DeviceObject, FALSE);
+
+    DevExt->baud_val=(int)uLanBaudrate;
+    DevExt->baud_base=(int)uLanBaudBase;
+    DevExt->my_adr=(int)uLanMyAddress;
+     #if DBG
+      uLan_DbgPrint("uLan: uLanBaudrate:%d, uLanMyAddress:%d\n",DevExt->baud_val,DevExt->my_adr);
+     #endif    
+    if(DevExt->State==STATE_NEVER_STARTED) {
+     #if DBG
+      uLan_DbgPrint("uLan: StartDevice: Calling ul_drv_init_ext\n");
+     #endif
+      code = ul_drv_init_ext(DevExt, DevExt->port, DevExt->irq,
+        (int)uLanBaudrate, uLanBaudBase, ChipOptions, 
+        /*buffer_size*/ 0x10000, (int)uLanMyAddress);
+    }else{
+     #if DBG
+      uLan_DbgPrint("uLan: StartDevice: Calling ul_drv_new_start\n");
+     #endif
+      ul_drv_new_init_state(DevExt,(int)uLanMyAddress);
+      if(ul_drv_new_start(DevExt,0x10000)<0)
+       code = STATUS_INSUFFICIENT_RESOURCES;
+      else
+       code = STATUS_SUCCESS;
+    }
+
+    if(!NT_SUCCESS(code)) {
+     #if DBG
+      uLan_DbgPrint("uLan: StartDevice: Start of hardware failed\n");
+     #endif
+      IoDisconnectInterrupt(DevExt->InterruptObject);
+      DevExt->InterruptObject = NULL;
+      ul_drv_done_ext(DevExt);
+    }
+
+    return code;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CanStopDevice
+//
+//      This routine determines if the device cab be safely stopped.  In
+//      our case we'll assume you can always stop the device.  A device
+//      might not be able to be stopped, for example, if it doesn't have
+//      a queue for incoming requests or if it was notified that it is
+//      in the paging path.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//      Irp     - Address of the input IRP.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS CanStopDevice(PULAN_DEVICE_EXTENSION devExt, PIRP Irp)
+{
+    UNREFERENCED_PARAMETER(devExt);
+    UNREFERENCED_PARAMETER(Irp);
+
+    return STATUS_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// CanRemoveDevice
+//
+//      This routine determines if the device cab be safely removed.  In our case
+//      we'll assume you can always remove the device.  A device might not be able to
+//      be removed, for example, if it has opened handles or removing the device would
+//      result in the lost of data.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//      Irp         - Address of the input IRP.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS CanRemoveDevice(PULAN_DEVICE_EXTENSION devExt, PIRP Irp)
+{
+    UNREFERENCED_PARAMETER(devExt);
+    UNREFERENCED_PARAMETER(Irp);
+
+    return STATUS_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// ReturnResources
+//
+//      This function is called to return any hardware resources which
+//      have been allocated for the device.  In our case, these are
+//      the Interrupt Object, and any ports we might have mapped through
+//      memory.  Note that we do NOT return our Device Object here.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//      Irp         - Address of the input IRP.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      VOID
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID
+ReturnResources(PULAN_DEVICE_EXTENSION devExt)
+{
+    //
+    // Stop port activity
+    //
+
+    ul_drv_done_ext(devExt);
+
+    if (devExt->usb_bus && devExt->dev) {
+         //
+         // Destroy USB device
+         //
+        usb_destroy_dev(((usb_device*)devExt->dev));
+
+         devExt->dev=NULL;
+    }
+  
+    //
+    // Disconnect from any interrupts
+    //
+    if (devExt->InterruptObject) {
+
+        //
+        // Disconnect from the interrupt
+        //
+        IoDisconnectInterrupt(devExt->InterruptObject);
+
+        devExt->InterruptObject = NULL;
+    }
+
+    KeCancelTimer(&devExt->wd_timer);
+    KeRemoveQueueDpc(&devExt->wd_timer_dpc);
+    KeRemoveQueueDpc(&devExt->bottom_dpc);
+
+    //
+    // Unmap any ports that were mapped
+    //
+    if (devExt->MappedPorts) {
+
+        MmUnmapIoSpace((PVOID)devExt->port, DEF_PORT_RANGE);
+
+        devExt->MappedPorts = FALSE;
+        devExt->port = 0;
+        
+    }
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// RemoveDevice
+//
+//      This function is called ater ReturnResources to destroy and
+//      remove uLan DeviceObject. Again resources must be already
+//      returned before this call
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      VOID
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID RemoveDevice(IN PDEVICE_OBJECT devObj)
+{
+      PULAN_DEVICE_EXTENSION devExt;
+
+      devExt=(PULAN_DEVICE_EXTENSION)devObj->DeviceExtension;
+
+      //
+      // Detach from the PDO 
+      //
+      if(devExt->DeviceToSendIrpsTo)
+        IoDetachDevice(devExt->DeviceToSendIrpsTo);
+      devExt->DeviceToSendIrpsTo = NULL;
+
+      // Delete Symbolic Link
+      if(devExt->link_name.Length&&devExt->link_name.Buffer)
+        IoDeleteSymbolicLink(&devExt->link_name);
+      if(devExt->link_name.Buffer)
+               ExFreePool(devExt->link_name.Buffer);
+      if(devExt->ntdev_name.Buffer)
+               ExFreePool(devExt->ntdev_name.Buffer);
+
+      // Destroy DeviceObject
+      IoDeleteDevice(devObj);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// RequestIncrement
+// RequestDecrement
+//
+//      These functions are used to track the number of requests that
+//      are presently queued the device indicated by the passed
+//      Device Extension.
+//
+//      This code is based heavily on the PnP Sample Driver in the
+//      \General directory of the NTDDK.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID
+RequestIncrement(PULAN_DEVICE_EXTENSION devExt)
+{
+
+    LONG result;
+    
+    result = InterlockedIncrement(&devExt->OutstandingIO);
+
+    ASSERT(result >= 0);
+    
+    //
+    // Need to clear Remove
+    //
+    if (result == 1) {
+
+        //
+        // The remove event is cleared when the first request is
+        // added to the queue.
+        //
+        KeClearEvent(&devExt->RemoveEvent);
+    }
+
+    return;
+}
+
+VOID
+RequestDecrement(PULAN_DEVICE_EXTENSION devExt)
+{
+
+    LONG result;
+    
+    result = InterlockedDecrement(&devExt->OutstandingIO);
+    
+    ASSERT(result >= 0);
+
+    if (result == 0) {
+
+        //
+        // The remove event is set when the queue is totally EMPTY.
+        //
+        KeSetEvent(&devExt->RemoveEvent, 
+                   IO_NO_INCREMENT, 
+                   FALSE);
+        
+    }
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// WaitForStop
+//
+//      Using the event set by the RequestIncrement() and 
+//      RequestDecrement() functions, this function waits until
+//      the device can be stopped.
+//
+//      On our device, STOP implies there are no active requests on
+//      the device, even though there are queued requests.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID
+WaitForStop(PULAN_DEVICE_EXTENSION devExt)
+{
+
+  #if 0 /* No need to wait for end of IO */
+
+    devExt->HoldNewRequests = TRUE;
+
+    ASSERT(devExt->State != STATE_STARTED);
+
+    KeWaitForSingleObject(&devExt->StopEvent,
+                          Executive,
+                           KernelMode,
+                           FALSE,
+                          NULL);
+
+  #endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// WaitForRemove
+//
+//      Using the event set by the RequestIncrement() and 
+//      RequestDecrement() functions, this function waits until
+//      the device can be removed.
+//
+//      On our device, REMOVE implies there are no active or queued
+//      requests on the device.
+//
+//  INPUTS:
+//
+//      devExt  - Address of our device extension.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//    STATUS_SUCCESS;
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID
+WaitForRemove(PULAN_DEVICE_EXTENSION devExt)
+{
+#if DBG
+    LARGE_INTEGER timeout;
+    NTSTATUS status;
+
+    timeout.QuadPart = -5*10*1000*1000;     // 5 seconds
+#endif
+
+    ///devExt->Removed = TRUE;
+
+    ASSERT(devExt->State < STATE_ALL_BELOW_FAIL);
+
+#if DBG
+
+wait_again:
+
+    status = KeWaitForSingleObject(&devExt->RemoveEvent,
+                           Executive,
+                           KernelMode,
+                           FALSE,
+                           &timeout);
+
+    if(status == STATUS_TIMEOUT) {
+    
+        uLan_DbgPrint("uLan: *** Still Waiting for activity to stop on device??  %d. requests reamin\n", devExt->OutstandingIO);
+        goto wait_again;
+    }    
+
+    if(status != STATUS_SUCCESS) {
+
+        uLan_DbgPrint("uLan: *** Wait not ended with success, and not with timeout?? Status = 0x%0x\n", status);
+    }
+
+#else
+
+    KeWaitForSingleObject(&devExt->RemoveEvent,
+                           Executive,
+                           KernelMode,
+                           FALSE,
+                           NULL);
+#endif
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// DispatchSystemControl
+//
+//      This dispatch entry point is used to pass any WMI IRPs that we
+//      receive on to the underlying bus driver.
+//
+//  INPUTS:
+//
+///     DriverObject - Pointer to driver object.
+//      Irp         - Address of the input IRP.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      VOID
+//
+//  IRQL:
+//
+//
+//  NOTES:
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+NTSTATUS 
+DispatchSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+
+    //
+    // Since we don't play WMI, pass this request on down to the
+    // driver below us...
+    //
+    IoSkipCurrentIrpStackLocation(Irp);
+
+    return(IoCallDriver(((PULAN_DEVICE_EXTENSION)(DeviceObject->DeviceExtension))->DeviceToSendIrpsTo, Irp));
+
+}
+
+
+
+VOID
+PrintState(PULAN_DEVICE_EXTENSION devExt)
+{
+    if(devExt->State == STATE_REMOVED) {
+        uLan_DbgPrint("uLan: STATE_REMOVED\n");
+        return;
+    }
+
+    if(devExt->State == STATE_STARTED) {
+        uLan_DbgPrint("uLan: STATE_STARTED\n");
+        return;
+    }
+
+    if(devExt->State == STATE_REMOVE_PENDING) {
+        uLan_DbgPrint("uLan: STATE_REMOVE_PENDING\n");
+        return;
+    }
+
+    if(devExt->State == STATE_SURPRISE_REMOVED) {
+        uLan_DbgPrint("uLan: STATE_SURPRISE_REMOVED\n");
+        return;
+    }
+
+
+    if(devExt->State == STATE_STOP_PENDING) {
+        uLan_DbgPrint("uLan: STATE_STOP_PENDING\n");
+        return;
+    }
+
+    if(devExt->State == STATE_STOPPED) {
+        uLan_DbgPrint("uLan: STATE_STOPPED\n");
+        return;
+    }
+
+    if(devExt->State == STATE_NEVER_STARTED) {
+        uLan_DbgPrint("uLan: STATE_NEVER_STARTED\n");
+        return;
+    }
+
+    uLan_DbgPrint("uLan: *********UNKNOWN STATE Value 0x%0x\n", devExt->State);
+}
+
+VOID
+PrintCapabilityInfo(PDEVICE_CAPABILITIES Capabilities)
+{
+    ULONG ulPowerLevel;
+    uLan_DbgPrint("********* Device Capabilities *********\n");
+
+    uLan_DbgPrint("SystemWake = %s (0x%x) \n",
+                   SystemPowerStateString[Capabilities->SystemWake],
+                   Capabilities->SystemWake);
+
+    uLan_DbgPrint("DeviceWake = %s (0x%x) \n",
+                   DevicePowerStateString[Capabilities->DeviceWake],
+                   Capabilities->DeviceWake);
+    
+    for (ulPowerLevel = PowerSystemUnspecified;
+         ulPowerLevel < PowerSystemMaximum;
+         ulPowerLevel++) {
+            uLan_DbgPrint("Dev State Map: sys st %s = dev st %s \n",
+                        SystemPowerStateString[ulPowerLevel],
+                        DevicePowerStateString[Capabilities->DeviceState[ulPowerLevel]]);
+             
+    }
+    uLan_DbgPrint("***************************************\n");
+    
+}
+
+#if DBG
+//
+// Some static string tables we use as part of debugging
+//
+static PSTR CmResourceTypeStrings[] = 
+{
+    "CmResourceTypeNull",
+    "CmResourceTypePort",
+    "CmResourceTypeInterrupt",
+    "CmResourceTypeMemory",
+    "CmResourceTypeDma",
+    "CmResourceTypeDeviceSpecific",
+    "CmResourceTypeBusNumber"
+};
+
+static PSTR CmResourceTypeStringsAt128[] =
+{
+    "CmResourceTypeConfigData",
+    "CmResourceTypeDevicePrivate",
+    "CmResourceTypePcCardConfig"
+
+};
+static PSTR CmShareDispositionStrings[] = 
+{
+    "CmResourceShareUndetermined",
+    "CmResourceShareDeviceExclusive",
+    "CmResourceShareDriverExclusive",
+    "CmResourceShareShared"
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//  PrintResourceList
+//
+//      This routine is called to print out the Resource descriptor list containing
+//    the resources allocated for our device by NT.
+//
+//  INPUTS:
+//
+//      Resources - Address of the CM_RESOURCE_LIST information for our device.
+//
+//  OUTPUTS:
+//
+//      None.
+//
+//  RETURNS:
+//
+//      None.
+//
+//  IRQL:
+//
+//    This routine is called at IRQL_PASSIVE_LEVEL.
+//
+//  NOTES:
+//
+//    We only use this for debugging purposes.
+//
+///////////////////////////////////////////////////////////////////////////////
+VOID PrintResourceList(PCM_RESOURCE_LIST Resources)
+{
+    ULONG index, index2;
+        
+    DbgPrint("%d. resource descriptor list(s) returned\n", Resources->Count);
+
+    for (index = 0; index < Resources->Count; index++)  {
+        
+        DbgPrint("\t[%d] Version 0x%x\n",
+                index, Resources->List[index].PartialResourceList.Version);
+        DbgPrint("\t[%d] Revision 0x%x\n",
+                index, Resources->List[index].PartialResourceList.Revision);
+        
+        DbgPrint("\t[%d] Partial Resource Descriptors %d.\n",
+                index, Resources->List[index].PartialResourceList.Count);
+        for (index2 = 0;
+            index2 < Resources->List[index].PartialResourceList.Count;
+            index2++)  {
+
+            PCM_PARTIAL_RESOURCE_DESCRIPTOR prd; // Too much to type!
+            
+            prd = &Resources->List[index].PartialResourceList.PartialDescriptors[index2];
+
+                DbgPrint("\t\t[%d] Type 0x%x (%s)\n",
+                        index2, prd->Type, (prd->Type < 128 ? CmResourceTypeStrings[prd->Type] : CmResourceTypeStringsAt128[prd->Type-128]));
+                DbgPrint("\t\t[%d] Share Disposition 0x%x (%s)\n",
+                        index2, prd->ShareDisposition,
+                        CmShareDispositionStrings[prd->ShareDisposition]);
+                DbgPrint("\t\t[%d] Flags 0x%x\n", index2, prd->Flags);
+                DbgPrint("\t\t[%d] Raw 0x%x %x %x\n",
+                        index2, prd->u.DeviceSpecificData.DataSize,
+                        prd->u.DeviceSpecificData.Reserved1,
+                        prd->u.DeviceSpecificData.Reserved2);
+
+                switch (prd->Type) {
+                
+                    case CmResourceTypePort:
+                        if (prd->Flags == CM_RESOURCE_PORT_MEMORY)
+                            DbgPrint("\t\t[%d] port memory starting at 0x%x length 0x%x\n", 
+                                          index2, prd->u.Port.Start.LowPart,
+                                          prd->u.Port.Length);
+                        if (prd->Flags == CM_RESOURCE_PORT_IO)
+                           DbgPrint("\t\t[%d] port i/o starting at 0x%x length 0x%x\n", 
+                                         index2, prd->u.Port.Start.LowPart,
+                                         prd->u.Port.Length);
+                        break;
+
+                    case CmResourceTypeInterrupt:
+                        if (prd->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE)
+                            DbgPrint("\t\t[%d] level interrupt at lvl 0x%x vector 0x%x affinity 0x%x\n", 
+                                         index2, prd->u.Interrupt.Level,
+                                         prd->u.Interrupt.Vector,
+                                         prd->u.Interrupt.Affinity);
+                        if (prd->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
+                            DbgPrint("\t\t[%d] latched interrupt at lvl 0x%x vector 0x%x affinity 0x%x\n", 
+                                         index2, prd->u.Interrupt.Level,
+                                         prd->u.Interrupt.Vector,
+                                         prd->u.Interrupt.Affinity);
+                        break;
+
+                    case CmResourceTypeMemory:
+                        if (prd->Flags == CM_RESOURCE_MEMORY_READ_WRITE)
+                            DbgPrint("\t\t[%d] r/w memory starting at 0x%x length 0x%x\n",
+                                     index2, prd->u.Memory.Start.LowPart,
+                                     prd->u.Memory.Length);
+                        if (prd->Flags & CM_RESOURCE_MEMORY_READ_ONLY)
+                            DbgPrint("\t\t[%d] r/o memory starting at 0x%x length 0x%x\n",
+                                     index2, prd->u.Memory.Start.LowPart,
+                                     prd->u.Memory.Length);
+                        if (prd->Flags & CM_RESOURCE_MEMORY_WRITE_ONLY)
+                            DbgPrint("\t\t[%d] w/o memory starting at 0x%x length 0x%x\n",
+                                     index2, prd->u.Memory.Start.LowPart,
+                                     prd->u.Memory.Length);
+                        break;
+
+                    case CmResourceTypeDma:
+                        DbgPrint("\t\t[%d] DMA on channel 0x%x\n",
+                            index2, prd->u.Dma.Channel);
+                        break;
+
+                    case CmResourceTypeDeviceSpecific:
+                        DbgPrint("\t\t[%d] Device specific data at 0x%x length 0x%x\n",
+                                     index2,
+                                     ((ULONG) &prd->u.DeviceSpecificData.Reserved2) + (ULONG)sizeof(ULONG),
+                                     prd->u.DeviceSpecificData.DataSize);
+                        break;
+
+                    case CmResourceTypeBusNumber:
+                        DbgPrint("\t\t[%d] Bus Number 0x%x length 0x%x, Reserved 0x%0x\n",
+                                     index2, prd->u.BusNumber.Start,
+                                      prd->u.BusNumber.Length,
+                                       prd->u.BusNumber.Reserved); 
+
+                        break;
+
+                    case CmResourceTypeDevicePrivate:
+                        DbgPrint("\t\t[%d] Device Private data 0x%0x 0x%0x 0x%0x\n",
+                                        prd->u.DevicePrivate.Data[0],
+                                        prd->u.DevicePrivate.Data[1],
+                                        prd->u.DevicePrivate.Data[2]);
+
+                        break;
+
+                    default:
+                        //
+                        // Say what?!!  Unknown resource type.  Something is pretty wierd here.
+                        //
+                        DbgPrint("Other resource type %d.\n", prd->Type);
+                        break;
+                }
+            }
+
+        }
+            DbgPrint("\t[%d] ***** End dump ******\n", index);
+}
+#endif /* DBG */
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdpwr.c b/ulan/host/ul_drv/ul_drv/ul_wdpwr.c
new file mode 100644 (file)
index 0000000..93200ba
--- /dev/null
@@ -0,0 +1,801 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_wdpwr.c   - Windows WDM PWR events processing code
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+NTSTATUS
+DispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+/*++
+
+Routine Description:
+
+    This is our FDO's dispatch table function for IRP_MJ_POWER.
+    It processes the Power IRPs sent to the PDO for this device.
+
+    For every power IRP, drivers must call PoStartNextPowerIrp and use PoCallDriver
+    to pass the IRP all the way down the driver stack to the underlying PDO.
+
+
+Arguments:
+
+    DeviceObject - pointer to our device object (FDO)
+
+    Irp          - pointer to an I/O Request Packet
+
+Return Value:
+
+    NT status code
+
+--*/
+{
+    PIO_STACK_LOCATION ioStackLocation;
+    NTSTATUS code = STATUS_SUCCESS;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+    BOOLEAN fGoingToD0 = FALSE;
+    POWER_STATE sysPowerState, desiredDevicePowerState;
+    KEVENT event;
+
+    uLan_DbgPrint("uLan: DispatchPower: called\n");
+
+    //
+    // Get a pointer to our (FUNCTIONAL) device object's device
+    // extension.
+    //
+    deviceExtension = (PULAN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    //
+    // Up the count of in-progress requests
+    //
+    RequestIncrement(deviceExtension);
+
+    ioStackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    switch (ioStackLocation->MinorFunction) {
+    case IRP_MN_WAIT_WAKE:
+        uLan_DbgPrint("uLan: DispatchPower:  Enter IRP_MN_WAIT_WAKE\n");
+                // A driver sends IRP_MN_WAIT_WAKE to indicate that the system should
+                // wait for its device to signal a wake event. The exact nature of the event
+                // is device-dependent.
+                // Drivers send this IRP for two reasons:
+                // 1) To allow a device to wake the system
+                // 2) To wake a device that has been put into a sleep state to save power
+                //    but still must be able to communicate with its driver under certain circumstances.
+                // When a wake event occurs, the driver completes the IRP and returns
+                // STATUS_SUCCESS. If the device is sleeping when the event occurs,
+                // the driver must first wake up the device before completing the IRP.
+                // In a completion routine, the driver calls PoRequestPowerIrp to send a
+                // PowerDeviceD0 request. When the device has powered up, the driver can
+                //  handle the IRP_MN_WAIT_WAKE request.
+
+        // deviceExtension->DeviceCapabilities.DeviceWake specifies the lowest device power state (least powered)
+        // from which the device can signal a wake event
+        deviceExtension->PowerDownLevel = deviceExtension->DeviceCapabilities.DeviceWake;
+
+
+        if  ( ( PowerDeviceD0 == deviceExtension->CurrentDevicePowerState )  ||
+              ( deviceExtension->DeviceCapabilities.DeviceWake > deviceExtension->CurrentDevicePowerState ) ) {
+                        //
+                        //    STATUS_INVALID_DEVICE_STATE is returned if the device in the PowerD0 state
+                        //    or a state below which it can support waking, or if the SystemWake state
+                        //    is below a state which can be supported. A pending IRP_MN_WAIT_WAKE will complete
+                        //    with this error if the device's state is changed to be incompatible with the wake
+                        //    request.
+
+            //  If a driver fails this IRP, it should complete the IRP immediately without
+            //  passing the IRP to the next-lower driver.
+            code = STATUS_INVALID_DEVICE_STATE;
+            Irp->IoStatus.Status = code;
+            IoCompleteRequest (Irp,IO_NO_INCREMENT );
+            uLan_DbgPrint("uLan: DispatchPower: ntStatus STATUS_INVALID_DEVICE_STATE\n" );
+            RequestDecrement(deviceExtension);
+            return code; 
+        }
+
+        // flag we're enabled for wakeup
+        deviceExtension->EnabledForWakeup = TRUE;
+
+        // init an event for our completion routine to signal when PDO is done with this Irp
+        KeInitializeEvent(&event, NotificationEvent, FALSE);
+
+       // If not failing outright, pass this on to our PDO for further handling
+        IoCopyCurrentIrpStackLocationToNext(Irp);
+
+        // Set a completion routine so it can signal our event when
+        //  the PDO is done with the Irp
+        IoSetCompletionRoutine(Irp,
+                               PnpComplete,
+                               &event,  // pass the event to the completion routine as the Context
+                               TRUE,    // invoke on success
+                               TRUE,    // invoke on error
+                               TRUE);   // invoke on cancellation
+
+        PoStartNextPowerIrp(Irp);
+        code = PoCallDriver(deviceExtension->DeviceToSendIrpsTo, Irp); 
+
+         // if PDO is not done yet, wait for the event to be set in our completion routine
+        if (code == STATUS_PENDING) {
+             // wait for irp to complete
+
+            NTSTATUS waitStatus = KeWaitForSingleObject(
+                &event,
+                Suspended,
+                KernelMode,
+                FALSE,
+                NULL);
+
+            uLan_DbgPrint("uLan: DispatchPower: done waiting for PDO to finish IRP_MN_WAIT_WAKE\n");
+        }
+
+        // now tell the device to actually wake up
+        SelfSuspendOrActivate( DeviceObject, FALSE );
+
+        // flag we're done with wakeup irp
+        deviceExtension->EnabledForWakeup = FALSE;
+
+        RequestDecrement(deviceExtension);
+        
+        uLan_DbgPrint("uLan: DispatchPower:  Exit IRP_MN_WAIT_WAKE\n");
+        break;
+
+    case IRP_MN_SET_POWER:
+                // The system power policy manager sends this IRP to set the system power state.
+                // A device power policy manager sends this IRP to set the device power state for a device.
+
+        uLan_DbgPrint("uLan: DispatchPower:  Enter IRP_MN_SET_POWER\n");
+
+        // Set Irp->IoStatus.Status to STATUS_SUCCESS to indicate that the device
+        // has entered the requested state. Drivers cannot fail this IRP.
+
+        switch (ioStackLocation->Parameters.Power.Type) {
+            case SystemPowerState:
+
+                // Get input system power state
+                sysPowerState.SystemState = ioStackLocation->Parameters.Power.State.SystemState;
+
+                uLan_DbgPrint("uLan: PM_Power() Set Power, type SystemPowerState = %s\n",
+                                SystemPowerStateString[sysPowerState.SystemState]);
+
+                // If system is in working state always set our device to D0
+                //  regardless of the wait state or system-to-device state power map
+                if ( sysPowerState.SystemState ==  PowerSystemWorking) {
+                    desiredDevicePowerState.DeviceState = PowerDeviceD0;
+
+                     uLan_DbgPrint("uLan: ProcessPowerIrp() PowerSystemWorking, will set D0, not use state map\n");
+
+
+                } else {
+                     // set to corresponding system state if IRP_MN_WAIT_WAKE pending
+                    if ( deviceExtension->EnabledForWakeup ) { // got a WAIT_WAKE IRP pending?
+
+                        // Find the device power state equivalent to the given system state.
+                        // We get this info from the DEVICE_CAPABILITIES struct in our device
+                        // extension (initialized in PnPAddDevice() )
+                        desiredDevicePowerState.DeviceState =
+                            deviceExtension->DeviceCapabilities.DeviceState[ sysPowerState.SystemState ];
+
+                        uLan_DbgPrint("uLan: ProcessPowerIrp() IRP_MN_WAIT_WAKE pending, will use state map\n");
+
+                    } else {
+                        // if no wait pending and the system's not in working state, just turn off
+                        desiredDevicePowerState.DeviceState = PowerDeviceD3;
+
+                        uLan_DbgPrint("uLan: ProcessPowerIrp() Not EnabledForWakeup and the system's not in working state,\n  settting PowerDeviceD3 (off )\n");
+                    }
+                }
+
+                //
+                // We've determined the desired device state; are we already in this state?
+                //
+
+                uLan_DbgPrint("ulan: ProcessPowerIrp()  Set Power, desiredDevicePowerState = %s\n",
+                    DevicePowerStateString[desiredDevicePowerState.DeviceState]);
+
+                if (desiredDevicePowerState.DeviceState !=
+                    deviceExtension->CurrentDevicePowerState) {
+
+                    //RequestIncrement(deviceExtension);
+
+                    // No, request that we be put into this state
+                                        // by requesting a new Power Irp from the Pnp manager
+                    deviceExtension->PowerIrp = Irp;
+                    code = PoRequestPowerIrp(deviceExtension->DeviceObject,
+                                             IRP_MN_SET_POWER,
+                                             desiredDevicePowerState,
+                                                                                           // completion routine will pass the Irp down to the PDO
+                                             PoRequestCompletion,
+                                             DeviceObject,
+                                             NULL);
+
+                } else {
+                    // Yes, just pass it on to PDO (Physical Device Object)
+                    IoCopyCurrentIrpStackLocationToNext(Irp);
+                    PoStartNextPowerIrp(Irp);
+                    code = PoCallDriver(deviceExtension->DeviceToSendIrpsTo, Irp); 
+
+                    RequestDecrement(deviceExtension);
+
+                    uLan_DbgPrint("uLan: DispatchPower:  Exit IRP_MN_SET_POWER\n");
+
+                }
+                break;
+
+            case DevicePowerState:
+
+                uLan_DbgPrint("uLan: PM_Power() Set Power, type DevicePowerState = %s\n",
+                                DevicePowerStateString[ioStackLocation->Parameters.Power.State.DeviceState]);
+
+                // For requests to D1, D2, or D3 ( sleep or off states ),
+                                // sets deviceExtension->CurrentDevicePowerState to DeviceState immediately.
+                                // This enables any code checking state to consider us as sleeping or off
+                                // already, as this will imminently become our state.
+
+                // For requests to DeviceState D0 ( fully on ), sets fGoingToD0 flag TRUE
+                // to flag that we must set a completion routine and update
+                                // deviceExtension->CurrentDevicePowerState there.
+                                // In the case of powering up to fully on, we really want to make sure
+                                // the process is completed before updating our CurrentDevicePowerState,
+                                // so no IO will be attempted or accepted before we're really ready.
+
+                fGoingToD0 = SetDevicePowerState(DeviceObject,
+                                                 ioStackLocation->Parameters.Power.State.DeviceState
+                                                 ); // returns TRUE for D0
+
+                IoCopyCurrentIrpStackLocationToNext(Irp);
+
+                if (fGoingToD0) {
+                    uLan_DbgPrint("uLan: DispatchPower: Set PowerIrp Completion Routine, fGoingToD0 =%d\n", fGoingToD0);
+                    IoSetCompletionRoutine(Irp,
+                           PowerIrp_Complete,
+                           // Always pass FDO to completion routine as its Context;
+                           // This is because the DriverObject passed by the system to the routine
+                           // is the Physical Device Object ( PDO ) not the Functional Device Object ( FDO )
+                           DeviceObject,
+                           TRUE,            // invoke on success
+                           TRUE,            // invoke on error
+                           TRUE);           // invoke on cancellation of the Irp
+                }
+
+                PoStartNextPowerIrp(Irp);
+                code = PoCallDriver(deviceExtension->DeviceToSendIrpsTo, Irp); 
+
+                if ( !fGoingToD0 ) // completion routine will decrement
+                    RequestDecrement(deviceExtension);
+
+                uLan_DbgPrint("uLan: DispatchPower:  Exit IRP_MN_SET_POWER\n");
+                break;
+
+            } // case irpStack->Parameters.Power.Type 
+
+       break; // IRP_MN_SET_POWER 
+
+    case IRP_MN_QUERY_POWER:
+                //
+                // A power policy manager sends this IRP to determine whether it can change
+                // the system or device power state, typically to go to sleep.
+                //
+
+        uLan_DbgPrint("uLan: DispatchPower:  IRP_MN_QUERY_POWER\n");
+
+        IoCopyCurrentIrpStackLocationToNext(Irp);
+        PoStartNextPowerIrp(Irp);
+        code = PoCallDriver(deviceExtension->DeviceToSendIrpsTo, Irp); 
+
+        RequestDecrement(deviceExtension);
+
+        break; /* IRP_MN_QUERY_POWER */
+
+    default:
+
+        uLan_DbgPrint("uLan: DispatchPower:  UNKNOWN POWER MESSAGE (%x)\n", ioStackLocation->MinorFunction);
+
+        //
+        // All unhandled power messages are passed on to the PDO
+        //
+
+        IoCopyCurrentIrpStackLocationToNext(Irp);
+        PoStartNextPowerIrp(Irp);
+        code = PoCallDriver(deviceExtension->DeviceToSendIrpsTo, Irp); 
+
+        RequestDecrement(deviceExtension);
+
+
+    } /* irpStack->MinorFunction */
+
+    uLan_DbgPrint("uLan: Exit DispatchPower:   ntStatus = 0x%x\n", code);
+    return code;
+}
+
+NTSTATUS
+PoRequestCompletion(
+    IN PDEVICE_OBJECT       DeviceObject,
+    IN UCHAR                MinorFunction,
+    IN POWER_STATE          PowerState,
+    IN PVOID                Context,
+    IN PIO_STATUS_BLOCK     IoStatus
+    )
+/*++
+
+Routine Description:
+
+        This is the completion routine set in a call to PoRequestPowerIrp()
+        that was made in ProcessPowerIrp() in response to receiving
+    an IRP_MN_SET_POWER of type 'SystemPowerState' when the device was
+        not in a compatible device power state. In this case, a pointer to
+        the IRP_MN_SET_POWER Irp is saved into the FDO device extension
+        (deviceExtension->PowerIrp), and then a call must be
+        made to PoRequestPowerIrp() to put the device into a proper power state,
+        and this routine is set as the completion routine.
+
+    We decrement our pending io count and pass the saved IRP_MN_SET_POWER Irp
+        on to the next driver
+
+Arguments:
+
+    DeviceObject - Pointer to the device object for the class device.
+        Note that we must get our own device object from the Context
+
+    Context - Driver defined context, in this case our own functional device object ( FDO )
+
+Return Value:
+
+    The function value is the final status from the operation.
+
+--*/
+{
+    PIRP irp;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+    PDEVICE_OBJECT deviceObject = Context;
+    NTSTATUS ntStatus;
+
+    deviceExtension = deviceObject->DeviceExtension;
+
+        // Get the Irp we saved for later processing in ProcessPowerIrp()
+        // when we decided to request the Power Irp that this routine
+        // is the completion routine for.
+    irp = deviceExtension->PowerIrp;
+
+        // We will return the status set by the PDO for the power request we're completing
+    ntStatus = IoStatus->Status;
+
+    uLan_DbgPrint("uLan: Enter PoRequestCompletion()\n");
+
+    // we should not be in the midst of handling a self-generated power irp
+    ASSERT( !deviceExtension->SelfPowerIrp );
+
+    // we must pass down to the next driver in the stack
+    IoCopyCurrentIrpStackLocationToNext(irp);
+
+    // Calling PoStartNextPowerIrp() indicates that the driver is finished
+    // with the previous power IRP, if any, and is ready to handle the next power IRP.
+    // It must be called for every power IRP.Although power IRPs are completed only once,
+    // typically by the lowest-level driver for a device, PoStartNextPowerIrp must be called
+    // for every stack location. Drivers must call PoStartNextPowerIrp while the current IRP
+    // stack location points to the current driver. Therefore, this routine must be called
+    // before IoCompleteRequest, IoSkipCurrentStackLocation, and PoCallDriver.
+
+    PoStartNextPowerIrp(irp);
+
+    // PoCallDriver is used to pass any power IRPs to the PDO instead of IoCallDriver.
+    // When passing a power IRP down to a lower-level driver, the caller should use
+    // IoSkipCurrentIrpStackLocation or IoCopyCurrentIrpStackLocationToNext to copy the IRP to
+    // the next stack location, then call PoCallDriver. Use IoCopyCurrentIrpStackLocationToNext
+    // if processing the IRP requires setting a completion routine, or IoSkipCurrentStackLocation
+    // if no completion routine is needed.
+
+    PoCallDriver(deviceExtension->DeviceToSendIrpsTo, irp); 
+
+    RequestDecrement(deviceExtension);
+
+    uLan_DbgPrint("uLan: PoRequestCompletion() Exit IRP_MN_SET_POWER\n");
+
+    deviceExtension->PowerIrp = NULL;
+
+    return ntStatus;
+}
+
+NTSTATUS
+PowerIrp_Complete(
+    IN PDEVICE_OBJECT NullDeviceObject,
+    IN PIRP Irp,
+    IN PVOID Context
+    )
+/*++
+
+Routine Description:
+
+    This routine is called when An IRP_MN_SET_POWER of type 'DevicePowerState'
+    has been received by ProcessPowerIrp(), and that routine has  determined
+        1) the request is for full powerup ( to PowerDeviceD0 ), and
+        2) We are not already in that state
+    A call is then made to PoRequestPowerIrp() with this routine set as the completion routine.
+
+
+Arguments:
+
+    DeviceObject - Pointer to the device object for the class device.
+
+    Irp - Irp completed.
+
+    Context - Driver defined context.
+
+Return Value:
+
+    The function value is the final status from the operation.
+
+--*/
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PDEVICE_OBJECT deviceObject;
+    PIO_STACK_LOCATION irpStack;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+
+    uLan_DbgPrint("uLan: enter PowerIrp_Complete\n");
+
+    deviceObject = (PDEVICE_OBJECT) Context;
+
+    deviceExtension = deviceObject->DeviceExtension;
+
+    //  If the lower driver returned PENDING, mark our stack location as pending also.
+    if (Irp->PendingReturned) {
+        IoMarkIrpPending(Irp);
+    }
+
+    irpStack = IoGetCurrentIrpStackLocation (Irp);
+
+    // We can assert that we're a  device powerup-to D0 request,
+    // because that was the only type of request we set a completion routine
+    // for in the first place
+    ASSERT(irpStack->MajorFunction == IRP_MJ_POWER);
+    ASSERT(irpStack->MinorFunction == IRP_MN_SET_POWER);
+    ASSERT(irpStack->Parameters.Power.Type==DevicePowerState);
+    ASSERT(irpStack->Parameters.Power.State.DeviceState==PowerDeviceD0);
+
+    // Now that we know we've let the lower drivers do what was needed to power up,
+    //  we can set our device extension flags accordingly
+    deviceExtension->CurrentDevicePowerState = PowerDeviceD0;
+
+    Irp->IoStatus.Status = ntStatus;
+
+    RequestDecrement(deviceExtension);
+
+    uLan_DbgPrint("uLan: exit PowerIrp_Complete Exit IRP_MN_SET_POWER D0 complete\n");
+    return ntStatus;
+}
+
+NTSTATUS
+SelfSuspendOrActivate(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN BOOLEAN fSuspend
+    )
+/*++
+
+Routine Description:
+
+        Called on PnPAddDevice() to power down until needed (i.e., till a pipe is actually opened).
+        Called on Create() to power up device to D0 before opening 1st pipe.
+        Called on Close() to power down device if this is the last pipe.
+
+Arguments:
+
+    DeviceObject - Pointer to the device object
+
+    fSuspend; TRUE to Suspend, FALSE to acivate.
+
+
+Return Value:
+
+    If the operation is not attemtped, SUCCESS is returned.
+    If the operation is attemtped, the value is the final status from the operation.
+
+--*/
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+
+    POWER_STATE PowerState;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+
+
+    deviceExtension = DeviceObject->DeviceExtension;
+
+    uLan_DbgPrint("uLan: Enter SelfSuspendOrActivate(),fSuspend = %d\n", fSuspend);
+
+
+        // Can't accept request if:
+    //  1) device is removed,
+    //  2) has never been started,
+    //  3) is stopped,
+    //  4) has a remove request pending,
+    //  5) has a stop device pending
+/*    if ( !BulkUsb_CanAcceptIoRequests( DeviceObject ) ) {
+        ntStatus = STATUS_DELETE_PENDING;
+
+                BULKUSB_KdPrint( DBGLVL_MEDIUM,("ABORTING BulkUsb_SelfSuspendOrActivate()\n"));
+        return ntStatus;
+    }*/
+
+
+    // don't do anything if any System-generated Device Pnp irps are pending
+    if ( NULL != deviceExtension->PowerIrp ) {
+        uLan_DbgPrint("uLan: Exit SelfSuspendOrActivate(),refusing on pending deviceExtension->PowerIrp 0x%x\n", deviceExtension->PowerIrp);
+        return ntStatus;
+    }
+
+    // don't do anything if any self-generated Device Pnp irps are pending
+    if ( deviceExtension->SelfPowerIrp ) {
+        uLan_DbgPrint("uLan: Exit SelfSuspendOrActivate(),refusing on pending deviceExtension->SelfPowerIrp\n" );
+        return ntStatus;
+    }
+
+    //  has been set to  zero, PowerDeviceD0 ( 1 ), or a bogus high value
+    if ( ( deviceExtension->PowerDownLevel == PowerDeviceD0 ) ||
+         ( deviceExtension->PowerDownLevel == PowerDeviceUnspecified)  ||
+         ( deviceExtension->PowerDownLevel >= PowerDeviceMaximum ) ) {
+        uLan_DbgPrint("uLan: Exit SelfSuspendOrActivate(), refusing on deviceExtension->PowerDownLevel == %d\n", deviceExtension->PowerDownLevel);
+        return ntStatus;
+    }
+
+    if ( fSuspend )
+        PowerState.DeviceState = deviceExtension->PowerDownLevel;
+    else
+        PowerState.DeviceState = PowerDeviceD0;  // power up all the way; we're probably just about to do some IO
+
+    ntStatus = SelfRequestPowerIrp( DeviceObject, PowerState );
+
+    uLan_DbgPrint("uLan: SelfSuspendOrActivate() status 0x%x on setting dev state %s\n", ntStatus, DevicePowerStateString[PowerState.DeviceState]);
+
+    return ntStatus;
+
+}
+
+NTSTATUS
+SelfRequestPowerIrp(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN POWER_STATE PowerState
+    )
+/*++
+
+Routine Description:
+
+    This routine is called by SelfSuspendOrActivate() to
+    actually make the system request for a powerdown/up to PowerState.
+    It first checks to see if we are already in Powerstate and immediately
+    returns  SUCCESS with no further processing if so
+
+
+Arguments:
+
+    DeviceObject - Pointer to the device object
+
+    PowerState. power state requested, e.g PowerDeviceD0.
+
+
+Return Value:
+
+    The function value is the final status from the operation.
+
+--*/
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+    PIRP pIrp = NULL;
+
+
+    deviceExtension = DeviceObject->DeviceExtension;
+
+    // This should have been reset in completion routine
+    ASSERT( !deviceExtension->SelfPowerIrp );
+
+    if (  deviceExtension->CurrentDevicePowerState ==  PowerState.DeviceState )
+        return STATUS_SUCCESS;  // nothing to do
+
+    uLan_DbgPrint("uLan: Enter SelfRequestPowerIrp() will request power irp to state %s\n",
+        DevicePowerStateString[PowerState.DeviceState]);
+
+    RequestIncrement(deviceExtension);
+
+        // flag we're handling a self-generated power irp
+    deviceExtension->SelfPowerIrp = TRUE;
+
+        // actually request the Irp
+    ntStatus = PoRequestPowerIrp(deviceExtension->DeviceObject,
+                         IRP_MN_SET_POWER,
+                         PowerState,
+                         PoSelfRequestCompletion,
+                         DeviceObject,
+                         NULL);
+
+
+    if  ( ntStatus == STATUS_PENDING ) {
+        // status pending is the return code we wanted
+
+        // We only need to wait for completion if we're powering up
+        if ( (ULONG) PowerState.DeviceState < deviceExtension->PowerDownLevel ) {
+
+            NTSTATUS waitStatus;
+
+            waitStatus = KeWaitForSingleObject(
+                           &deviceExtension->SelfRequestedPowerIrpEvent,
+                           Suspended,
+                           KernelMode,
+                           FALSE,
+                           NULL);
+
+        }
+
+        ntStatus = STATUS_SUCCESS;
+
+        deviceExtension->SelfPowerIrp = FALSE;
+
+        uLan_DbgPrint("uLan: SelfRequestPowerIrp() SUCCESS\n    IRP 0x%x to state %s\n",
+            pIrp, DevicePowerStateString[PowerState.DeviceState]);
+
+
+    }
+    else {
+        // The return status was not STATUS_PENDING; any other codes must be considered in error here;
+        //  i.e., it is not possible to get a STATUS_SUCCESS  or any other non-error return from this call;
+        uLan_DbgPrint("uLan: SelfRequestPowerIrp() to state %s FAILED, status = 0x%x\n",
+            DevicePowerStateString[ PowerState.DeviceState ],ntStatus);
+    }
+
+    return ntStatus;
+}
+
+NTSTATUS
+PoSelfRequestCompletion(
+    IN PDEVICE_OBJECT       DeviceObject,
+    IN UCHAR                MinorFunction,
+    IN POWER_STATE          PowerState,
+    IN PVOID                Context,
+    IN PIO_STATUS_BLOCK     IoStatus
+    )
+/*++
+
+Routine Description:
+
+    This routine is called when the driver completes a self-originated power IRP
+        that was generated by a call to SelfSuspendOrActivate().
+    We power down whenever the last pipe is closed and power up when the first pipe is opened.
+
+    For power-up , we set an event in our FDO extension to signal this IRP done
+    so the power request can be treated as a synchronous call.
+    We need to know the device is powered up before opening the first pipe, for example.
+    For power-down, we do not set the event, as no caller waits for powerdown complete.
+
+Arguments:
+
+    DeviceObject - Pointer to the device object for the class device. ( Physical Device Object )
+
+    Context - Driver defined context, in this case our FDO ( functional device object )
+
+Return Value:
+
+    The function value is the final status from the operation.
+
+--*/
+{
+    PDEVICE_OBJECT deviceObject = Context;
+    PULAN_DEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
+    NTSTATUS ntStatus = IoStatus->Status;
+
+
+    // we should not be in the midst of handling a system-generated power irp
+    ASSERT( NULL == deviceExtension->PowerIrp );
+
+    // We only need to set the event if we're powering up;
+    // No caller waits on power down complete
+    if ( (ULONG) PowerState.DeviceState < deviceExtension->PowerDownLevel ) {
+
+        // Trigger Self-requested power irp completed event;
+        //  The caller is waiting for completion
+        KeSetEvent(&deviceExtension->SelfRequestedPowerIrpEvent, 1, FALSE);
+    }
+
+    RequestDecrement(deviceExtension);
+
+    uLan_DbgPrint("uLan: Exit PoSelfRequestCompletion() ntStatus = 0x%x\n", ntStatus );
+
+    return ntStatus;
+}
+
+
+BOOLEAN
+SetDevicePowerState(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN DEVICE_POWER_STATE DeviceState
+    )
+/*++
+
+Routine Description:
+
+    This routine is called when An IRP_MN_SET_POWER of type 'DevicePowerState'
+    has been received by Usb_ProcessPowerIrp().
+
+
+Arguments:
+
+    DeviceObject - Pointer to the device object for the class device.
+
+    DeviceState - Device specific power state to set the device in to.
+
+
+Return Value:
+
+    For requests to DeviceState D0 ( fully on ), returns TRUE to signal caller
+    that we must set a completion routine and finish there.
+
+--*/
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PULAN_DEVICE_EXTENSION deviceExtension;
+    BOOLEAN fRes = FALSE;
+
+    deviceExtension = (PULAN_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    switch (DeviceState) {
+    case PowerDeviceD3:
+
+        //
+        // Device will be going OFF,
+                // TODO: add any needed device-dependent code to save state here.
+                //  ( We have nothing to do in this sample )
+        //
+
+        uLan_DbgPrint("uLan: SetDevicePowerState() PowerDeviceD3 (OFF)\n");
+
+        deviceExtension->CurrentDevicePowerState = DeviceState;
+        break;
+
+    case PowerDeviceD1:
+    case PowerDeviceD2:
+        //
+        // power states D1,D2 translate to USB suspend
+
+        uLan_DbgPrint("uLan: SetDevicePowerState()  %s\n",
+            DevicePowerStateString[DeviceState]);
+
+        deviceExtension->CurrentDevicePowerState = DeviceState;
+        break;
+
+    case PowerDeviceD0:
+
+
+        uLan_DbgPrint("uLan: SetDevicePowerState() PowerDeviceD0 (ON)\n");
+
+        // We'll need to finish the rest in the completion routine;
+        //   signal caller we're going to D0 and will need to set a completion routine
+        fRes = TRUE;
+
+        // Caller will pass on to PDO ( Physical Device object )
+        break;
+
+    default:
+
+        uLan_DbgPrint("uLan: Bogus DeviceState = %x\n", DeviceState);
+    }
+
+    return fRes;
+}
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdusb.c b/ulan/host/ul_drv/ul_drv/ul_wdusb.c
new file mode 100644 (file)
index 0000000..37aa091
--- /dev/null
@@ -0,0 +1,771 @@
+/*******************************************************************
+  uLan Communication - uL_DRV - multiplatform uLan driver
+
+  ul_wdusb.c   - WDM support for USB devices
+
+  (C) Copyright 1996-2004 by Pavel Pisa - project originator
+        http://cmp.felk.cvut.cz/~pisa
+  (C) Copyright 1996-2004 PiKRON Ltd.
+        http://www.pikron.com
+  (C) Copyright 2002-2004 Petr Smolik
+  
+
+  The uLan driver project can be used and distributed 
+  in compliance with any of next licenses
+   - GPL - GNU Public License
+     See file COPYING for details.
+   - LGPL - Lesser GNU Public License
+   - MPL - Mozilla Public License
+   - and other licenses added by project originator
+
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  WARNING: if you delete all lines, you are not allowed to
+  distribute code or sources in any form.
+ *******************************************************************/
+
+#ifndef __WINDOWS_USB_H 
+#include "ul_wdusb.h"
+#endif
+
+/**
+ * usb_create_dev - 
+ * @dev: pointer to the usb device
+ * @fdo: 
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_create_dev(IN usb_device **pdev,IN PDEVICE_OBJECT fdo) {
+    usb_device *dev;
+    dev=MALLOC(sizeof(usb_device));
+    if(!dev)
+         return STATUS_INSUFFICIENT_RESOURCES;
+    RtlZeroBytes(dev,sizeof(usb_device));
+    dev->fdo=fdo;
+    *pdev=dev;
+    return 0;
+}
+
+/**
+ * usb_destroy_dev - delete usb device resources
+ * @dev: pointer to the usb device
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_destroy_dev(IN usb_device *dev) {
+
+    usb_reset_configuration(dev);
+#if DBG_USB
+    uLan_DbgPrint("ulan: device unconfigured\n");
+#endif
+    /* deviceDescriptor */
+    if (dev->descriptor) {
+      FREE(dev->descriptor);
+#if DBG_USB
+      uLan_DbgPrint("ulan: deviceDescriptor freed\n");
+#endif
+    }
+    dev->descriptor=NULL;
+    
+    /* configurationDescriptor */
+    if (dev->rawdescriptors) {
+      FREE(dev->rawdescriptors);
+#if DBG_USB
+      uLan_DbgPrint("ulan: rawdescriptor freed\n");
+#endif
+    }
+    dev->rawdescriptors=NULL;
+    
+    FREE(dev);
+        
+    return 0;
+}
+
+/**
+ * ul_CallUSBD - Passes a URB to the USBD class driver
+ * @dev: pointer to the usb device
+ * @usb: pointer to an already-formatted Urb request block
+ * @timeout: not used at this moment
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS 
+_usb_submit_urb( IN usb_device *dev, IN PURB urb,IN PLARGE_INTEGER timeout,
+               IN _usb_completation_rtn rtn, IN PVOID rtn_param,OUT PIRP *pirp) {
+    NTSTATUS ntStatus, status = STATUS_SUCCESS;
+    PIRP irp;
+    KEVENT event;
+    IO_STATUS_BLOCK ioStatus;
+    PIO_STACK_LOCATION nextStack;
+    
+#if DBG_USB
+    uLan_DbgPrint("ulan: _usb_submit_urb : enter\n");
+#endif
+    if (!rtn)
+      KeInitializeEvent( &event, NotificationEvent, FALSE);
+    irp = IoBuildDeviceIoControlRequest( IOCTL_INTERNAL_USB_SUBMIT_URB, dev->fdo,
+                                         NULL, 0, NULL, 0, TRUE, (!rtn) ? &event : NULL, &ioStatus);  
+    nextStack = IoGetNextIrpStackLocation( irp);
+    nextStack->Parameters.Others.Argument1 = urb;
+    if (rtn) {
+      IoSetCompletionRoutine( irp, rtn, rtn_param, TRUE, FALSE, FALSE);
+      IoMarkIrpPending( irp);
+    }
+    ntStatus = IoCallDriver( dev->fdo, irp);
+    if (rtn) {
+#if DBG_USB
+      uLan_DbgPrint("uLan: _usb_submit_urb done (rtn) with status:0x%X\n",ntStatus);    
+#endif
+      (*pirp)=irp;
+      return ntStatus;
+    }
+#if DBG_USB
+    uLan_DbgPrint("ulan: _usb_submit_urb : return from IoCallDriver USBD %x\n", ntStatus);
+#endif
+    if (ntStatus == STATUS_PENDING) {
+        status = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL);
+    } else {
+        ioStatus.Status = ntStatus;
+    }
+    ntStatus = ioStatus.Status;
+#if DBG_USB
+    uLan_DbgPrint("ulan: _usb_submit_urb : URB status = %x status = %x irp status %x\n",
+                                      urb->UrbHeader.Status, status, ioStatus.Status);
+    uLan_DbgPrint("uLan: _usb_submit_urb done with status:0x%X\n",ntStatus);    
+#endif
+    return ntStatus;
+}
+
+/**
+ * usb_control_msg - Builds a control urb, sends it off and waits for completion
+ * @dev: pointer to the usb device
+ * @pipe: endpoint "pipe" to send the message to
+ * @request: USB message request value
+ * @requesttype: USB message request type value (only USB_TYPE_VENDOR)
+ * @value: USB message value 
+ * @index: USB message value 
+ * @data: pointer to the data to send 
+ * @size: length in bytes of the data to send 
+ * @time: time to wait for the message to complete before timing out (if 0 the wait is forever)
+ *
+ * Return Value: NTSTATUS (data len)
+ */   
+NTSTATUS
+usb_control_msg(IN usb_device *dev,IN ULONG pipe,
+    IN UCHAR request,IN USHORT requesttype, IN USHORT value, IN USHORT index,
+    IN PVOID data, IN ULONG size, IN ULONG time) 
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    LARGE_INTEGER timeout;
+    ULONG flags = 0;
+    PURB urb;
+
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_control_msg pipe=0x%X, req=0x%X, reqtype=0x%X, value=0x%X, idx=0x%X, size=%d\n", 
+                  pipe, request, requesttype, value , index, size);
+#endif    
+    if (!usb_pipecontrol(pipe)) {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    if (usb_pipein(pipe))
+        flags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;
+
+    switch (requesttype) {
+       case USB_TYPE_VENDOR:
+       case USB_TYPE_CLASS:
+           urb = MALLOC(sizeof( struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
+           if ( !urb) {
+              uLan_DbgPrint("uLan: no memory for URB!!!\n");
+              return STATUS_INSUFFICIENT_RESOURCES;
+           }
+           UsbBuildVendorRequest( urb, URB_FUNCTION_VENDOR_DEVICE, 
+                            sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
+                            flags, 0, request, value, index, data, NULL, size, NULL);
+           break;
+       case USB_TYPE_STANDARD:
+           /* to do */
+           /* urb = MALLOC(sizeof( struct _URB_CONTROL_TRANSFER)); */
+           break;
+       default:
+           break;
+    }
+    
+    timeout.QuadPart = ((LONGLONG)time)*(-10000); /* time is in [ms] */
+    ntStatus = _usb_submit_urb( dev, urb, (time) ? &timeout : NULL, NULL, NULL, NULL);
+    
+    if (NT_SUCCESS(ntStatus)) {
+        ntStatus = (LONG) urb->UrbControlVendorClassRequest.TransferBufferLength;
+    }
+    
+    FREE( urb);
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_control_msg done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;  
+}
+
+/**
+ * _usb_fill_bulk_urb  - builds a bulk urb
+ * @urb: pointer to filling urb
+ * @usb_dev: pointer to the usb device to send the message to
+ * @pipe: endpoint "pipe" to send the message to
+ * @data: pointer to the data to send
+ * @len: length in bytes of the data to send
+ *
+ * This function create bulk urb
+ *  
+ * Return Value: NTSTATUS
+ */    
+NTSTATUS
+_usb_fill_bulk_urb ( IN PURB urb, IN usb_device *dev,IN ULONG pipe,
+    IN PVOID data, IN LONG len) {
+    PUSBD_PIPE_INFORMATION pipe_info=NULL;
+    PUSBD_INTERFACE_INFORMATION interface;
+    ULONG flags = 0;
+    ULONG endpoint;
+    unsigned int j;
+
+    if ((!usb_pipebulk(pipe)) || (!urb) || (!dev)) {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* get handle of pipe */
+    endpoint=usb_pipeendpoint(pipe) | (pipe & USB_DIR_IN);
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_bulk_msg selected endpoint=0x%X\n",endpoint);
+#endif    
+    interface=dev->interfaces.Interface;
+    if ( !interface) {
+       return STATUS_INVALID_PARAMETER;
+    }
+    /* trace all pipes */
+    for (j=0; j<interface->NumberOfPipes; j++) {
+        pipe_info=&interface->Pipes[j];
+        if (pipe_info->EndpointAddress==endpoint) break;
+        pipe_info=NULL;
+    }
+    if (!pipe_info) {
+        return STATUS_INVALID_PARAMETER;
+    }    
+    /* usb_show_endpoint_information(pipe_info); */
+    
+    if (usb_pipein(pipe))
+        flags = USBD_TRANSFER_DIRECTION_IN;
+
+    UsbBuildInterruptOrBulkTransferRequest( urb, 
+                   sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), 
+                   pipe_info->PipeHandle, 
+                   data, 
+                   NULL, 
+                   len, 
+                   flags | USBD_SHORT_TRANSFER_OK,
+                   NULL );
+    
+    return STATUS_SUCCESS;
+}
+
+/**
+ * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion
+ * @usb_dev: pointer to the usb device to send the message to
+ * @pipe: endpoint "pipe" to send the message to
+ * @data: pointer to the data to send
+ * @len: length in bytes of the data to send
+ * @actual_length: pointer to a location to put the actual length transferred in bytes
+ * @timeout: time to wait for the message to complete before timing out (if 0 the wait is forever)
+ *
+ * This function sends a simple bulk message to a specified endpoint
+ * and waits for the message to complete, or timeout.
+ *  
+ * Return Value: NTSTATUS (data len)
+ */    
+NTSTATUS
+usb_bulk_msg(IN usb_device *dev,IN ULONG pipe,
+    IN PVOID data, IN LONG len, IN LONG *actual_length,IN ULONG time)
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    LARGE_INTEGER timeout;
+    PURB urb;
+
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_bulk_msg pipe=0x%X, len=0x%X\n", 
+                  pipe, len);
+#endif    
+
+    urb = MALLOC(sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+    if ( !urb) {
+       uLan_DbgPrint("uLan: no memory for URB!!!\n");
+       return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    ntStatus=_usb_fill_bulk_urb (urb,dev,pipe,data,len);
+    if ( !NT_SUCCESS( ntStatus)) {
+        uLan_DbgPrint("uLan: error in filling bulk urb\n");
+        return ntStatus;
+    }
+    
+    ntStatus = _usb_submit_urb(dev,urb,NULL,NULL,NULL,NULL);
+
+    *actual_length = (LONG) urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
+
+    FREE( urb);
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_bulk_msg done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;
+}
+
+/**
+ * _usb_get_descriptor - Retrieves a descriptor from a device's default control pipe 
+ * @dev: pointer to the usb device
+ * @desctype: (USB_DEVICE_DESCRIPTOR_TYPE,
+ *             USB_CONFIGURATION_TYPE,
+ *             USB_STRING_DESCRIPTOR_TYPE) 
+ * @descindex: the number of the descriptor 
+ * @buf: pointer ot pointer where to put the descriptor 
+ * @size: how big is buf?
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS 
+_usb_get_descriptor(IN usb_device *dev, IN UCHAR desctype,
+    IN UCHAR descindex, IN PVOID *buf, IN SHORT size) 
+{
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PURB urb;
+    ULONG true_size = 4;
+    PVOID new_ptr;
+
+#if DBG_USB
+    uLan_DbgPrint("uLan: _usb_get_descriptor (type=0x%X,idx=0x%X)\n", desctype, descindex);
+#endif    
+    if (( *buf != NULL) && (size == -1)) {
+        return STATUS_INVALID_PARAMETER;
+    }
+    urb = MALLOC(sizeof( struct _URB_CONTROL_DESCRIPTOR_REQUEST));
+    if ( !urb) {
+        uLan_DbgPrint("uLan: no memory for URB\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    if ( size != -1) {
+        true_size = (ULONG) size;
+    }
+
+   AgainSendGetDescriptor:
+    if (( size == -1) || (*buf == NULL)) {
+        new_ptr = MALLOC(true_size);
+    } else {
+        new_ptr = *buf;
+    }
+    if ( new_ptr) {
+        UsbBuildGetDescriptorRequest(urb,
+                                    (USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+                                     desctype,
+                                     descindex,
+                                     0, /* lang */
+                                     new_ptr,
+                                     NULL,
+                                     true_size,
+                                     NULL);
+        ntStatus = _usb_submit_urb(dev,urb,NULL,NULL,NULL,NULL);
+    } else {
+        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+    }
+    if (( size == -1) && NT_SUCCESS(ntStatus)) {
+        if ( desctype == USB_CONFIGURATION_DESCRIPTOR_TYPE)
+            true_size = (ULONG) *(((PUSHORT)new_ptr)+1); /* total_size */
+        else
+            true_size = (ULONG) *((PUCHAR)new_ptr);
+        size = 0;
+        FREE( new_ptr);
+        goto AgainSendGetDescriptor;
+    }
+    if ( NT_SUCCESS(ntStatus) && (*buf == NULL)) {
+        *buf = new_ptr;
+    } else if ( new_ptr) {
+        FREE( new_ptr);
+    }
+    FREE(urb);
+#if DBG_USB
+    uLan_DbgPrint("uLan: _usb_get_descriptor done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;
+}
+
+/**
+ * usb_get_device_descriptor - 
+ * @dev: pointer to the usb device
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_get_device_descriptor(IN usb_device *dev) {
+    NTSTATUS ntStatus;
+    
+    /* deviceDescriptor */
+    if (dev->descriptor)
+        FREE(dev->descriptor);
+    dev->descriptor=NULL;
+    
+    ntStatus = _usb_get_descriptor(dev,
+                           USB_DEVICE_DESCRIPTOR_TYPE,
+                           0,
+                           &dev->descriptor,
+                           sizeof(USB_DEVICE_DESCRIPTOR));
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_device_descriptor done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;
+}
+
+/**
+ * usb_get_configuration - 
+ * @dev: pointer to the usb device
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_get_configuration(IN usb_device *dev) {
+    NTSTATUS ntStatus;
+    char cfgno;
+    
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_get_configuration\n");
+#endif    
+    if ((!dev) || (!dev->descriptor))
+        return STATUS_INVALID_PARAMETER;
+    
+    if (dev->descriptor->bNumConfigurations < 1) {
+        return STATUS_INVALID_PARAMETER;
+    }   
+    
+    dev->rawdescriptors = (char **)MALLOC(sizeof(char *) *
+        dev->descriptor->bNumConfigurations);
+    if (!dev->rawdescriptors) {
+        return STATUS_INSUFFICIENT_RESOURCES;
+    } 
+
+    /* read all configurations */
+    for (cfgno = 0; cfgno < dev->descriptor->bNumConfigurations; cfgno++) {     
+        dev->rawdescriptors[cfgno]=NULL;
+        ntStatus = _usb_get_descriptor(dev,
+                              USB_CONFIGURATION_DESCRIPTOR_TYPE,
+                              cfgno,
+                              &dev->rawdescriptors[cfgno],
+                              -1);
+
+        if ( !NT_SUCCESS(ntStatus)) break; 
+    }
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_get_configuration (num. cfg.:%d)\n",
+                  dev->descriptor->bNumConfigurations);
+    uLan_DbgPrint("uLan: usb_get_configuration done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;
+}
+
+/**
+ * usb_set_configuration - 
+ * @dev: pointer to the usb device
+ * @configuration: number of configuration
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_set_configuration(IN usb_device *dev,IN int configuration) 
+{
+    PUSBD_INTERFACE_LIST_ENTRY ifc_list = NULL, ifc_tmp = NULL;
+    PUSB_INTERFACE_DESCRIPTOR ifc_desc = NULL;
+    PUSB_CONFIGURATION_DESCRIPTOR cp=NULL; 
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PURB urb = NULL;
+    int i;
+
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_set_configuration (%d)\n",configuration);
+#endif    
+
+    /* if device has no device descriptor, dump it */
+    if (!dev->descriptor) {
+      ntStatus=usb_get_device_descriptor(dev);
+      if ( !NT_SUCCESS( ntStatus)) {
+          uLan_DbgPrint("uLan: error in usb_get_device_descriptor\n");
+          return ntStatus;
+      }
+    }
+
+    /* if device has no configuration informations, dump it */
+    if (dev->rawdescriptors==NULL) {
+      ntStatus = usb_get_configuration(dev);
+      if ( !NT_SUCCESS( ntStatus)) {
+          uLan_DbgPrint("uLan: error in usb_get_configuration\n");
+          return ntStatus;
+      }
+    }
+
+    for (i=0; i<dev->descriptor->bNumConfigurations; i++) {
+      PUSB_CONFIGURATION_DESCRIPTOR c =
+               (PUSB_CONFIGURATION_DESCRIPTOR)dev->rawdescriptors[i];
+        if (c->bConfigurationValue == configuration) {
+            cp = c;
+            break;
+        }
+    }
+    if (!cp) {
+      return STATUS_INVALID_PARAMETER;
+    }
+
+    ifc_tmp = ifc_list = 
+        MALLOC(sizeof( struct _USBD_INTERFACE_LIST_ENTRY) * ( cp->bNumInterfaces+1));
+    if ( !ifc_tmp) {
+      return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    for( i = 0; i < cp->bNumInterfaces; i++) {
+        ifc_desc = USBD_ParseConfigurationDescriptorEx( cp, cp, i, -1, -1, -1, -1);
+#if DBG_USB
+        uLan_DbgPrint("uLan: next Ifc on 0x%X\n", ifc_desc);
+#endif    
+        ifc_list->InterfaceDescriptor = ifc_desc;
+        ifc_list++;
+    }
+    ifc_list->InterfaceDescriptor = NULL;
+    ifc_list = ifc_tmp;
+    /* create select configuration urb */
+    urb = USBD_CreateConfigurationRequestEx( cp, ifc_tmp);
+    if( !urb) {
+        uLan_DbgPrint("uLan: create config request\n");
+        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+    }
+    /* Send select configure urb to usb device */
+    if ( NT_SUCCESS(ntStatus)) {
+        ntStatus = _usb_submit_urb( dev, urb, NULL, NULL, NULL, NULL);
+        if( !NT_SUCCESS( ntStatus)) {
+#if DBG_USB
+            uLan_DbgPrint("uLan: send select configuration request (0x%X)\n", ntStatus);
+#endif    
+        } else {
+            dev->cfghandle = urb->UrbSelectConfiguration.ConfigurationHandle;
+            /* for selected interface make copy */
+            dev->interfaces.InterfaceDescriptor = ifc_tmp->InterfaceDescriptor;
+            dev->interfaces.Interface = MALLOC( ifc_tmp->Interface->Length);
+            if ( !dev->interfaces.Interface) {
+               uLan_DbgPrint("uLan: no memory for usb.interfaces\n", ntStatus);
+               ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+            } else {
+               RtlCopyMemory( dev->interfaces.Interface, 
+                              ifc_tmp->Interface, 
+                              ifc_tmp->Interface->Length);
+            }
+        }
+    }
+    if ( urb) 
+        ExFreePool(urb);
+    if ( ifc_list) 
+        FREE( ifc_list);
+    dev->actconfig = cp;
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_set_configuration done with status:0x%X\n",ntStatus);            
+#endif    
+    return ntStatus;
+} 
+
+/**
+ * usb_reset_configuration - 
+ * @dev: pointer to the usb device
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_reset_configuration(IN usb_device *dev) {
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    PURB urb = NULL;
+
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_reset_configuration \n");
+#endif    
+    urb = MALLOC(sizeof( struct _URB_SELECT_CONFIGURATION));
+    if ( !urb) {
+        uLan_DbgPrint("uLan: no memory for URB\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    UsbBuildSelectConfigurationRequest( urb, sizeof( struct _URB_SELECT_CONFIGURATION), NULL);
+    ntStatus = _usb_submit_urb( dev, urb, NULL, NULL, NULL, NULL);
+    if( !NT_SUCCESS( ntStatus)) {
+        uLan_DbgPrint("uLan: error select configurations request (0x%X)\n",ntStatus);
+    }
+    FREE( urb);
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_reset_configuration done with status:0x%X\n",ntStatus);    
+#endif    
+    return ntStatus;  
+}
+
+/**
+ * usb_clear_halt - 
+ * @dev: pointer to the usb device
+ * @pipe:
+ *
+ * Return Value: NTSTATUS
+ */   
+NTSTATUS
+usb_clear_halt(IN usb_device *dev,IN int pipe)
+{
+    PUSBD_PIPE_INFORMATION pipe_info=NULL;
+    PUSBD_INTERFACE_INFORMATION interface;
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    ULONG endpoint;
+    PURB urb;
+    unsigned int j;
+
+    /* get handle of pipe */
+    endpoint=usb_pipeendpoint(pipe) | (pipe & USB_DIR_IN);
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_clear_halt selected endpoint=0x%X\n",endpoint);
+#endif    
+    interface=dev->interfaces.Interface;
+    if ( !interface) {
+       return STATUS_INVALID_PARAMETER;
+    }
+    /* trace all pipes */
+    for (j=0; j<interface->NumberOfPipes; j++) {
+        pipe_info=&interface->Pipes[j];
+        if (pipe_info->EndpointAddress==endpoint) break;
+        pipe_info=NULL;
+    }
+    if (!pipe_info) {
+        return STATUS_INVALID_PARAMETER;
+    }    
+    /* usb_show_endpoint_information(pipe_info); */
+
+    urb = MALLOC( sizeof( struct _URB_PIPE_REQUEST));
+    if ( urb) {
+        urb->UrbHeader.Length = (USHORT) sizeof( struct _URB_PIPE_REQUEST);
+        urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
+        urb->UrbPipeRequest.PipeHandle = pipe_info->PipeHandle;
+        ntStatus = _usb_submit_urb( dev, urb, NULL, NULL, NULL, NULL);
+        FREE( urb);
+    } else {
+        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+    }
+#if DBG_USB
+    uLan_DbgPrint("uLan: usb_clear_halt done with status:0x%X\n",ntStatus);    
+#endif
+    return ntStatus;
+}
+
+/**
+ * usb_show_device_descriptor - dump a device descriptor
+ * deviceDescriptor@: pointer to the deviceDescriptor
+ */   
+void
+usb_show_device_descriptor(IN PUSB_DEVICE_DESCRIPTOR deviceDescriptor) 
+{
+    if ( !deviceDescriptor ) return;
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("Device Descriptor:\n");
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("bLength %d\n", deviceDescriptor->bLength);
+    uLan_DbgPrint("bDescriptorType 0x%x\n", deviceDescriptor->bDescriptorType);
+    uLan_DbgPrint("bcdUSB 0x%x\n", deviceDescriptor->bcdUSB);
+    uLan_DbgPrint("bDeviceClass 0x%x\n", deviceDescriptor->bDeviceClass);
+    uLan_DbgPrint("bDeviceSubClass 0x%x\n", deviceDescriptor->bDeviceSubClass);
+    uLan_DbgPrint("bDeviceProtocol 0x%x\n", deviceDescriptor->bDeviceProtocol);
+    uLan_DbgPrint("bMaxPacketSize0 0x%x\n", deviceDescriptor->bMaxPacketSize0);
+    uLan_DbgPrint("idVendor 0x%x\n", deviceDescriptor->idVendor);
+    uLan_DbgPrint("idProduct 0x%x\n", deviceDescriptor->idProduct);
+    uLan_DbgPrint("bcdDevice 0x%x\n", deviceDescriptor->bcdDevice);
+    uLan_DbgPrint("iManufacturer 0x%x\n", deviceDescriptor->iManufacturer);
+    uLan_DbgPrint("iProduct 0x%x\n", deviceDescriptor->iProduct);
+    uLan_DbgPrint("iSerialNumber 0x%x\n", deviceDescriptor->iSerialNumber);
+    uLan_DbgPrint("bNumConfigurations 0x%x\n", deviceDescriptor->bNumConfigurations);
+}
+
+/**
+ * usb_show_config_descriptor - dump a configuration descriptor
+ * @configurationDescriptor: pointer to the configurationDescriptor
+ */   
+void
+usb_show_config_descriptor(IN PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor) 
+{
+    if ( !configurationDescriptor ) return;
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("Configuration Descriptor:\n");
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("bLength %d\n", configurationDescriptor->bLength);
+    uLan_DbgPrint("bDescriptorType 0x%x\n", configurationDescriptor->bDescriptorType);
+    uLan_DbgPrint("wTotalLength 0x%x\n", configurationDescriptor->wTotalLength);
+    uLan_DbgPrint("bNumInterfaces 0x%x\n", configurationDescriptor->bNumInterfaces);
+    uLan_DbgPrint("bConfigurationValue 0x%x\n", configurationDescriptor->bConfigurationValue);
+    uLan_DbgPrint("iConfiguration 0x%x\n", configurationDescriptor->iConfiguration);
+    uLan_DbgPrint("bmAttributes 0x%x\n", configurationDescriptor->bmAttributes);
+    uLan_DbgPrint("MaxPower 0x%x\n", configurationDescriptor->MaxPower);
+}
+
+/**
+ * usb_show_interface_information - dump a interface information
+ * @interface: pointer to the interface
+ */   
+void 
+usb_show_interface_information(IN PUSBD_INTERFACE_INFORMATION interface) {
+    if ( !interface ) return;
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("Interface Information:\n");
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("NumberOfPipes 0x%x\n", interface->NumberOfPipes);
+    uLan_DbgPrint("Length 0x%x\n", interface->Length);
+    uLan_DbgPrint("Alt Setting 0x%x\n", interface->AlternateSetting);
+    uLan_DbgPrint("Interface Number 0x%x\n", interface->InterfaceNumber);
+    uLan_DbgPrint("Class, subclass, protocol 0x%x 0x%x 0x%x\n",
+                  interface->Class,
+                  interface->SubClass,
+                  interface->Protocol);
+}
+
+/**
+ * usb_show_endpoint_information - dump a endpoint information
+ * @pipe: pointer to the pipe
+ */   
+void 
+usb_show_endpoint_information(IN PUSBD_PIPE_INFORMATION pipe) {
+    if ( !pipe ) return;
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("Pipe Information:\n");
+    uLan_DbgPrint("-------------------------\n");
+    uLan_DbgPrint("PipeType 0x%x\n", pipe->PipeType);
+    uLan_DbgPrint("EndpointAddress 0x%x\n", pipe->EndpointAddress);
+    uLan_DbgPrint("MaxPacketSize 0x%x\n", pipe->MaximumPacketSize);
+    uLan_DbgPrint("Interval 0x%x\n", pipe->Interval);
+    uLan_DbgPrint("Handle 0x%x\n", pipe->PipeHandle);
+    uLan_DbgPrint("MaximumTransferSize 0x%x\n", pipe->MaximumTransferSize);
+}
+
+/**
+ * usb_show_device - dump a usb device informations
+ * @dev: pointer to the usb device
+ */   
+void 
+usb_show_device(usb_device *dev) {
+    PUSBD_INTERFACE_INFORMATION interface;
+    unsigned int j;
+    
+    if ( !dev ) return;
+    /* device descriptor */
+    usb_show_device_descriptor(dev->descriptor);
+    
+    /* selected configuration */
+    if ( !dev->descriptor) return;
+    usb_show_config_descriptor(dev->cfghandle);
+    
+    /* interfaces */
+    interface=dev->interfaces.Interface;
+    if ( !interface) return;
+    usb_show_interface_information(interface);
+
+    /* pipes */
+    for (j=0; j<interface->NumberOfPipes; j++) {
+        usb_show_endpoint_information(&interface->Pipes[j]);
+    }
+}
diff --git a/ulan/host/ul_drv/ul_drv/ul_wdusb.h b/ulan/host/ul_drv/ul_drv/ul_wdusb.h
new file mode 100644 (file)
index 0000000..8b640b3
--- /dev/null
@@ -0,0 +1,266 @@
+#ifndef __WINDOWS_USB_H
+#define __WINDOWS_USB_H
+
+typedef struct usb_device usb_device; /* forward declaration */
+
+/* USB constants */
+
+/*
+ * Device and/or Interface Class codes
+ */
+#define USB_CLASS_PER_INTERFACE                0       /* for DeviceClass */
+#define USB_CLASS_AUDIO                        1
+#define USB_CLASS_COMM                 2
+#define USB_CLASS_HID                  3
+#define USB_CLASS_PHYSICAL             5
+#define USB_CLASS_STILL_IMAGE          6
+#define USB_CLASS_PRINTER              7
+#define USB_CLASS_MASS_STORAGE         8
+#define USB_CLASS_HUB                  9
+#define USB_CLASS_CDC_DATA             0x0a
+#define USB_CLASS_CSCID                        0x0b    /* chip+ smart card */
+#define USB_CLASS_CONTENT_SEC          0x0d    /* content security */
+#define USB_CLASS_APP_SPEC             0xfe
+#define USB_CLASS_VENDOR_SPEC          0xff
+
+/*
+ * USB types
+ */
+#define USB_TYPE_MASK                  (0x03 << 5)
+#define USB_TYPE_STANDARD              (0x00 << 5)
+#define USB_TYPE_CLASS                 (0x01 << 5)
+#define USB_TYPE_VENDOR                        (0x02 << 5)
+#define USB_TYPE_RESERVED              (0x03 << 5)
+
+/*
+ * USB recipients
+ */
+#define USB_RECIP_MASK                 0x1f
+#define USB_RECIP_DEVICE               0x00
+#define USB_RECIP_INTERFACE            0x01
+#define USB_RECIP_ENDPOINT             0x02
+#define USB_RECIP_OTHER                        0x03
+
+/*
+ * USB directions
+ */
+#define USB_DIR_OUT                    0               /* to device */
+#define USB_DIR_IN                     0x80            /* to host */
+
+/*
+ * Descriptor types
+ */
+#define USB_DT_DEVICE                  0x01
+#define USB_DT_CONFIG                  0x02
+#define USB_DT_STRING                  0x03
+#define USB_DT_INTERFACE               0x04
+#define USB_DT_ENDPOINT                        0x05
+
+#define USB_DT_HID                     (USB_TYPE_CLASS | 0x01)
+#define USB_DT_REPORT                  (USB_TYPE_CLASS | 0x02)
+#define USB_DT_PHYSICAL                        (USB_TYPE_CLASS | 0x03)
+#define USB_DT_HUB                     (USB_TYPE_CLASS | 0x09)
+
+/*
+ * Descriptor sizes per descriptor type
+ */
+#define USB_DT_DEVICE_SIZE             18
+#define USB_DT_CONFIG_SIZE             9
+#define USB_DT_INTERFACE_SIZE          9
+#define USB_DT_ENDPOINT_SIZE           7
+#define USB_DT_ENDPOINT_AUDIO_SIZE     9       /* Audio extension */
+#define USB_DT_HUB_NONVAR_SIZE         7
+#define USB_DT_HID_SIZE                        9
+
+/*
+ * Endpoints
+ */
+#define USB_ENDPOINT_NUMBER_MASK       0x0f    /* in bEndpointAddress */
+#define USB_ENDPOINT_DIR_MASK          0x80
+
+#define USB_ENDPOINT_XFERTYPE_MASK     0x03    /* in bmAttributes */
+#define USB_ENDPOINT_XFER_CONTROL      0
+#define USB_ENDPOINT_XFER_ISOC         1
+#define USB_ENDPOINT_XFER_BULK         2
+#define USB_ENDPOINT_XFER_INT          3
+
+/*
+ * USB Packet IDs (PIDs)
+ */
+#define USB_PID_UNDEF_0                        0xf0
+#define USB_PID_OUT                    0xe1
+#define USB_PID_ACK                    0xd2
+#define USB_PID_DATA0                  0xc3
+#define USB_PID_PING                   0xb4    /* USB 2.0 */
+#define USB_PID_SOF                    0xa5
+#define USB_PID_NYET                   0x96    /* USB 2.0 */
+#define USB_PID_DATA2                  0x87    /* USB 2.0 */
+#define USB_PID_SPLIT                  0x78    /* USB 2.0 */
+#define USB_PID_IN                     0x69
+#define USB_PID_NAK                    0x5a
+#define USB_PID_DATA1                  0x4b
+#define USB_PID_PREAMBLE               0x3c    /* Token mode */
+#define USB_PID_ERR                    0x3c    /* USB 2.0: handshake mode */
+#define USB_PID_SETUP                  0x2d
+#define USB_PID_STALL                  0x1e
+#define USB_PID_MDATA                  0x0f    /* USB 2.0 */
+
+/*
+ * Standard requests
+ */
+#define USB_REQ_GET_STATUS             0x00
+#define USB_REQ_CLEAR_FEATURE          0x01
+#define USB_REQ_SET_FEATURE            0x03
+#define USB_REQ_SET_ADDRESS            0x05
+#define USB_REQ_GET_DESCRIPTOR         0x06
+#define USB_REQ_SET_DESCRIPTOR         0x07
+#define USB_REQ_GET_CONFIGURATION      0x08
+#define USB_REQ_SET_CONFIGURATION      0x09
+#define USB_REQ_GET_INTERFACE          0x0A
+#define USB_REQ_SET_INTERFACE          0x0B
+#define USB_REQ_SYNCH_FRAME            0x0C
+
+/*
+ * HID requests
+ */
+#define USB_REQ_GET_REPORT             0x01
+#define USB_REQ_GET_IDLE               0x02
+#define USB_REQ_GET_PROTOCOL           0x03
+#define USB_REQ_SET_REPORT             0x09
+#define USB_REQ_SET_IDLE               0x0A
+#define USB_REQ_SET_PROTOCOL           0x0B
+
+/*
+ * Calling this entity a "pipe" is glorifying it. A USB pipe
+ * is something embarrassingly simple: it basically consists
+ * of the following information:
+ *  - device number (7 bits)
+ *  - endpoint number (4 bits)
+ *  - current Data0/1 state (1 bit)
+ *  - direction (1 bit)
+ *  - speed (1 bit)
+ *  - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.]
+ *  - pipe type (2 bits: control, interrupt, bulk, isochronous)
+ *
+ * That's 18 bits. Really. Nothing more. And the USB people have
+ * documented these eighteen bits as some kind of glorious
+ * virtual data structure.
+ *
+ * Let's not fall in that trap. We'll just encode it as a simple
+ * unsigned int. The encoding is:
+ *
+ *  - max size:                bits 0-1        (00 = 8, 01 = 16, 10 = 32, 11 = 64) [Historical; now gone.]
+ *  - direction:       bit 7           (0 = Host-to-Device [Out], 1 = Device-to-Host [In])
+ *  - device:          bits 8-14
+ *  - endpoint:                bits 15-18
+ *  - Data0/1:         bit 19
+ *  - speed:           bit 26          (0 = Full, 1 = Low Speed)
+ *  - pipe type:       bits 30-31      (00 = isochronous, 01 = interrupt, 10 = control, 11 = bulk)
+ *
+ * Why? Because it's arbitrary, and whatever encoding we select is really
+ * up to us. This one happens to share a lot of bit positions with the UHCI
+ * specification, so that much of the uhci driver can just mask the bits
+ * appropriately.
+ *
+ * NOTE:  there's no encoding (yet?) for a "high speed" endpoint; treat them
+ * like full speed devices.
+ */
+
+#define PIPE_ISOCHRONOUS               0
+#define PIPE_INTERRUPT                 1
+#define PIPE_CONTROL                   2
+#define PIPE_BULK                      3
+
+#define usb_maxpacket(dev, pipe, out)  (out \
+                               ? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \
+                               : (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )
+#define usb_packetid(pipe)     (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT)
+
+#define usb_pipeout(pipe)      ((((pipe) >> 7) & 1) ^ 1)
+#define usb_pipein(pipe)       (((pipe) >> 7) & 1)
+#define usb_pipedevice(pipe)   (((pipe) >> 8) & 0x7f)
+#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
+#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
+#define usb_pipedata(pipe)     (((pipe) >> 19) & 1)
+#define usb_pipeslow(pipe)     (((pipe) >> 26) & 1)
+#define usb_pipetype(pipe)     (((pipe) >> 30) & 3)
+#define usb_pipeisoc(pipe)     (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
+#define usb_pipeint(pipe)      (usb_pipetype((pipe)) == PIPE_INTERRUPT)
+#define usb_pipecontrol(pipe)  (usb_pipetype((pipe)) == PIPE_CONTROL)
+#define usb_pipebulk(pipe)     (usb_pipetype((pipe)) == PIPE_BULK)
+
+#define PIPE_DEVEP_MASK                0x0007ff00
+
+/* Endpoint halt control/status */
+#define usb_endpoint_out(ep_dir)       (((ep_dir >> 7) & 1) ^ 1)
+#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
+#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
+#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
+
+static _inline ULONG __create_pipe(usb_device *dev, unsigned int endpoint)
+{
+/*     return (dev->devnum << 8) | (endpoint << 15) |
+               ((dev->speed == USB_SPEED_LOW) << 26);*/
+       return (endpoint << 15);
+}
+
+static _inline ULONG __default_pipe(usb_device *dev)
+{
+/*     return ((dev->speed == USB_SPEED_LOW) << 26);*/
+       return 0;
+}
+
+/* Create various pipes... */
+#define usb_sndctrlpipe(dev,endpoint)  ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvctrlpipe(dev,endpoint)  ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_sndisocpipe(dev,endpoint)  ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvisocpipe(dev,endpoint)  ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_sndbulkpipe(dev,endpoint)  ((PIPE_BULK << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvbulkpipe(dev,endpoint)  ((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_sndintpipe(dev,endpoint)   ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint))
+#define usb_rcvintpipe(dev,endpoint)   ((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)
+#define usb_snddefctrl(dev)            ((PIPE_CONTROL << 30) | __default_pipe(dev))
+#define usb_rcvdefctrl(dev)            ((PIPE_CONTROL << 30) | __default_pipe(dev) | USB_DIR_IN)
+
+typedef struct usb_device {
+    PDEVICE_OBJECT fdo; /* fdo */
+    PUSB_DEVICE_DESCRIPTOR     descriptor; /* Descriptor */
+    char **rawdescriptors; /* Raw descriptors for each config */
+    PUSB_CONFIGURATION_DESCRIPTOR actconfig; /* the active configuration */ 
+    USBD_CONFIGURATION_HANDLE     cfghandle;   /* controller configuration handle */
+    USBD_INTERFACE_LIST_ENTRY     interfaces;  /* list of selected interfaces */
+} usb_device;
+
+typedef NTSTATUS 
+(*_usb_completation_rtn)( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context);
+
+/*
+ * Send and receive control messages...
+ */
+NTSTATUS _usb_submit_urb( IN usb_device *dev, IN PURB urb,IN PLARGE_INTEGER timeout,
+                          IN _usb_completation_rtn rtn, IN PVOID rtn_param, OUT PIRP *pirp);
+NTSTATUS _usb_fill_bulk_urb ( IN PURB urb, IN usb_device *dev,IN ULONG pipe,
+                              IN PVOID data, IN LONG len);
+NTSTATUS usb_create_dev(IN usb_device **pdev,IN PDEVICE_OBJECT fdo);
+NTSTATUS usb_destroy_dev(IN usb_device *dev);
+NTSTATUS usb_control_msg(IN usb_device *dev,IN ULONG pipe,
+    IN UCHAR request,IN USHORT requesttype, IN USHORT value, IN USHORT index,
+    IN PVOID data, IN ULONG size, IN ULONG time);
+NTSTATUS usb_bulk_msg(IN usb_device *dev,IN ULONG pipe,
+    IN PVOID data, IN LONG len, IN LONG *actual_length,IN ULONG time);
+NTSTATUS usb_get_device_descriptor(IN usb_device *dev);
+NTSTATUS usb_get_configuration(IN usb_device *dev);
+NTSTATUS usb_set_configuration(IN usb_device *dev,IN int configuration);
+NTSTATUS usb_reset_configuration(IN usb_device *dev);
+NTSTATUS usb_clear_halt(IN usb_device *dev,IN int pipe);
+
+/*
+ * Debugging helpers...
+ */
+void usb_show_device_descriptor(IN PUSB_DEVICE_DESCRIPTOR deviceDescriptor);
+void usb_show_config_descriptor(IN PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor);
+void usb_show_interface_information(IN PUSBD_INTERFACE_INFORMATION interface);
+void usb_show_endpoint_information(IN PUSBD_PIPE_INFORMATION pipe);
+void usb_show_device(usb_device *dev);
+
+#endif
diff --git a/ulan/host/ul_drv/ul_iss/CVS/Entries b/ulan/host/ul_drv/ul_iss/CVS/Entries
new file mode 100644 (file)
index 0000000..22f875e
--- /dev/null
@@ -0,0 +1,3 @@
+/readme.txt/1.3/Sun Jan 27 22:31:33 2008//
+/ul_drvnt.iss/1.3/Sun Jan 27 22:31:33 2008//
+D
diff --git a/ulan/host/ul_drv/ul_iss/CVS/Repository b/ulan/host/ul_drv/ul_iss/CVS/Repository
new file mode 100644 (file)
index 0000000..a26ea04
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_iss
diff --git a/ulan/host/ul_drv/ul_iss/CVS/Root b/ulan/host/ul_drv/ul_iss/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_iss/readme.txt b/ulan/host/ul_drv/ul_iss/readme.txt
new file mode 100644 (file)
index 0000000..26e1cc5
--- /dev/null
@@ -0,0 +1,58 @@
+\r
+               uLan Driver for NT v. 0.7.3\r
+               (c) 1999-2008 Pavel Pisa\r
+               (c) 2002-2008 Petr Smolik\r
+\r
+The uLan provides 9-bit character message oriented communication protocol,\r
+which is transfered over RS-485 link. Physical layer consist of one\r
+twisted pair of leads and RS-485 transceivers.\r
+\r
+ul_drv is Linux and Windows device driver designed to access uLan network.\r
+Supported hardware is i82510 RS-485 card or simple active converter\r
+dongle for standard PC RS-232 ports. OX16C950 based PCI cards are\r
+supported as well.\r
+\r
+The uLan driver is developed under GNU General Public Licence.\r
+\r
+The uLan driver is used by associated project Chromulan\r
+\r
+Chromulan is a freeware data acquisition and devices\r
+control program on uLan network for Win98/NT/2000.\r
+\r
+  (C) 2000 - 2001 Jindrich Jindrich, Pavel Pisa, PiKRON Ltd.\r
+\r
+  Originators of the CHROMuLAN project:\r
+\r
+  Jindrich Jindrich - http://www.jindrich.com\r
+                      http://orgchem.natur.cuni.cz/Chromulan\r
+                      software developer, project coordinator\r
+  Pavel Pisa        - http://cmp.felk.cvut.cz/~pisa\r
+                      embeded software developer\r
+  PiKRON Ltd.       - http://www.pikron.com\r
+                      project initiator, sponsor, instrument developer\r
+\r
+  The CHROMuLAN project is distributed under the GNU General Public Licence.\r
+\r
+Windows NT version of driver is Kernel Mode Driver and its parameters\r
+are controlled by next registry keys\r
+\r
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ul_drv]\r
+  "Type"=dword:00000001\r
+  "Start"=dword:00000002\r
+  "ErrorControl"=dword:00000001\r
+  "DisplayName"="UL_DRV"\r
+  "Group"="port"\r
+  "Tag"=dword:00000001\r
+  "ImagePath"=hex(2):5c,3f,3f,5c,44,3a,...\r
+\r
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ul_drv\Parameters]\r
+  "Port Address"=dword:000003e8\r
+  "IRQ Line"=dword:00000005\r
+  "Baud Rate"=dword:00004b00\r
+  "Buffer Size"=dword:00010000\r
+  "My Addr"=dword:00000002\r
+  "Debug"=dword:00000019\r
+  "ScanForPCI"=dword:00000001\r
+\r
+More information about driver, its implementation and meaning\r
+of parameters can be found in UL_DRV.HTML file.\r
diff --git a/ulan/host/ul_drv/ul_iss/ul_drvnt.iss b/ulan/host/ul_drv/ul_iss/ul_drvnt.iss
new file mode 100644 (file)
index 0000000..009120b
--- /dev/null
@@ -0,0 +1,83 @@
+; -- ul_drvnt.iss --\r
+; Source for NT uLan driver setup\r
+\r
+[Setup]\r
+AppName=ul_drv\r
+AppVerName=uLan driver for NT v 0.7.3\r
+AppCopyright=Copyright © 1999-2008 Pavel Pisa\r
+;DefaultDirName={pf}\ul_drv\r
+;DefaultGroupName=uLan Driver\r
+MinVersion=0,3.51\r
+OnlyBelowVersion=0,5.0\r
+;UninstallDisplayIcon={app}\ul_drv.exe\r
+OutputBaseFileName=ul_drvnt-063\r
+OutputDir=.\r
+;DiskSpanning=yes\r
+AdminPrivilegesRequired=yes\r
+;AlwaysCreateUninstallIcon=yes\r
+;ChangesAssociations=yes\r
+ExtraDiskSpaceRequired=1000000\r
+;InfoBeforeFile=readme.txt\r
+InfoAfterFile=readme.txt\r
+;LicenseFile=gnu.txt\r
+AllowNoIcons=yes\r
+AlwaysRestart=yes\r
+CreateAppDir=no\r
+DirExistsWarning=no\r
+DisableDirPage=yes\r
+DisableProgramGroupPage=yes\r
+\r
+;[Dirs]\r
+;Name: "{app}\data"\r
+\r
+[Files]\r
+;-{app},{win},{sys},{src},{sd},{pf},{cf},{tmp},{fonts},{dao}\r
+; {group},{(user/common)desktop},{(u/c)desktop},{(u/c)startmenu},{(u/c)programs},{(u/c)startup}\r
+\r
+; {sendto},{(u/c)appdata},{(u/c)docs}\r
+; {\},{%NAME},{computername},{groupname},{hwnd},{srcexe}\r
+;-CopyMode: normal,onlyifdoesntexist,alwaysoverwrite,alwaysskipifsameorolder\r
+; \r
+Source: "ul_drv.sys"; DestDir: "{sys}\drivers"\r
+\r
+[Icons]\r
+;Name: "{group}\ul_drv"; Filename: "{app}\ul_drv.exe"\r
+; NOTE: Most apps do not need registry entries to be pre-created, so if\r
+; you are using this script as a template for a new install, you should\r
+; probably remove these [Registry] entries.\r
+\r
+[Registry]\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; Flags: deletekey uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: string; ValueName: "DisplayName"; ValueData: "UL_DRV"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: string; ValueName: "Group"; ValueData: "port"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: dword; ValueName: "Type"; ValueData: "1"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: dword; ValueName: "Start"; ValueData: "2"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: dword; ValueName: "ErrorControl"; ValueData: "1"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv"; ValueType: dword; ValueName: "Tag"; ValueData: "1"; Flags: uninsdeletekey\r
+\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; Flags: deletekey uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "Port Address"; ValueData: "$2e8"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "IRQ Line"; ValueData: "5"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "Baud Rate"; ValueData: "19200"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "Buffer Size"; ValueData: "$10000"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "My Addr"; ValueData: "2"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "Debug"; ValueData: "$19"; Flags: uninsdeletekey\r
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\ul_drv\Parameters"; ValueType: dword; ValueName: "ScanForPCI"; ValueData: "1"; Flags: uninsdeletekey\r
+\r
+;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ul_drv]\r
+;"Type"=dword:00000001\r
+;"Start"=dword:00000002\r
+;"ErrorControl"=dword:00000001\r
+;"DisplayName"="UL_DRV"\r
+;"Group"="port"\r
+;"Tag"=dword:00000001\r
+;"ImagePath"=hex(2):5c,3f,3f,5c,44,3a,...\r
+\r
+;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ul_drv\Parameters]\r
+;"Port Address"=dword:000003e8\r
+;"IRQ Line"=dword:00000005\r
+;"Baud Rate"=dword:00004b00\r
+;"Buffer Size"=dword:00004000\r
+;"My Addr"=dword:00000002\r
+;"Debug"=dword:00000019\r
+;"ScanForPCI"=dword:00000001\r
diff --git a/ulan/host/ul_drv/ul_lib/.cvsignore b/ulan/host/ul_drv/ul_lib/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/ul_drv/ul_lib/CVS/Entries b/ulan/host/ul_drv/ul_lib/CVS/Entries
new file mode 100644 (file)
index 0000000..0b9e4e9
--- /dev/null
@@ -0,0 +1,15 @@
+/.cvsignore/1.2/Wed Sep 22 22:13:12 2004//
+/Makefile.omk/1.12/Tue Nov 20 16:07:15 2007//
+/Makefile.std/1.3/Sun Oct 29 12:21:38 2006//
+/ul_l_drv.c/1.17/Sun Nov  4 10:14:12 2007//
+/ul_l_drv_eth.c/1.8/Tue Nov 20 16:08:57 2007//
+/ul_l_drv_eth.h/1.4/Tue Nov 20 16:08:57 2007//
+/ul_l_indir.c/1.6/Tue Jun  5 11:41:41 2007//
+/ul_l_log.c/1.3/Fri Apr  7 13:16:50 2006//
+/ul_l_msg.c/1.2/Sat Mar 26 15:12:40 2005//
+/ul_l_oi.c/1.9/Fri Sep 21 06:08:52 2007//
+/ul_l_oil.c/1.1/Fri Apr  7 08:13:43 2006//
+/ul_lib.dsp/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_msg_buf.c/1.1/Sun Nov 11 18:35:39 2007//
+/ul_msg_buf.h/1.1/Sun Nov 11 18:35:39 2007//
+D/ul_lib////
diff --git a/ulan/host/ul_drv/ul_lib/CVS/Repository b/ulan/host/ul_drv/ul_lib/CVS/Repository
new file mode 100644 (file)
index 0000000..c4c1af8
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_lib
diff --git a/ulan/host/ul_drv/ul_lib/CVS/Root b/ulan/host/ul_drv/ul_lib/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_lib/Makefile.omk b/ulan/host/ul_drv/ul_lib/Makefile.omk
new file mode 100644 (file)
index 0000000..618af2f
--- /dev/null
@@ -0,0 +1,56 @@
+default_CONFIG = CONFIG_OC_ULUT=x
+default_CONFIG += CONFIG_UL_SOLIBS=x
+default_CONFIG += CONFIG_UL_FD_INDIRECT=x
+default_CONFIG += CONFIG_UL_FD_ETH=x
+default_CONFIG += CONFIG_OC_UL_DRV_SYSLESS=x
+default_CONFIG += CONFIG_ULOI_GENOBJIDTAG=x
+
+config_include_HEADERS = ul_lib/ul_lib_config.h 
+
+include_HEADERS  = ul_l_drv_eth.h ul_msg_buf.h
+
+ul_lib_config_DEFINES = CONFIG_OC_UL_DRV_SYSLESS CONFIG_OC_ULUT CONFIG_UL_FD_INDIRECT CONFIG_UL_FD_ETH
+ul_lib_config_DEFINES += CONFIG_ULOI_GENOBJIDTAG
+
+nobase_include_HEADERS = ul_lib/ul_drvdef.h ul_lib/ulan.h ul_lib/ul_fddir.h
+ifneq ($(CONFIG_OC_ULUT),y)
+nobase_include_HEADERS += ul_lib/ul_l_log.h
+endif
+
+ifeq ($(CONFIG_UL_FD_INDIRECT),y)
+renamed_include_HEADERS = ul_lib/ul_fd4indir.h->ul_lib/ul_fd.h
+else
+renamed_include_HEADERS = ul_lib/ul_fd4dir.h->ul_lib/ul_fd.h
+endif
+
+lib_LIBRARIES = ulan
+
+ifeq ($(CONFIG_UL_SOLIBS),y)
+  shared_LIBRARIES = ulan
+endif
+
+#include_HEADERS  = 
+#include_nobase_HEADERS  = 
+
+ulan_SOURCES = ul_l_drv.c ul_l_msg.c ul_l_oi.c
+ifneq ($(CONFIG_OC_ULUT),y)
+ulan_SOURCES += ul_l_log.c 
+else
+ulan_SOURCES += ul_msg_buf.c
+ulan_SOURCES += ul_l_oil.c
+endif
+
+ifeq ($(CONFIG_UL_FD_INDIRECT),y)
+ulan_SOURCES += ul_l_indir.c
+endif
+
+ifeq ($(CONFIG_UL_FD_ETH),y)
+  ulan_SOURCES += ul_l_drv_eth.c
+  ifeq ($(CONFIG_UL_SOLIBS),y)
+    ulan_LIBS += ulut
+    ifeq ($(TARGET_OS),win32)
+      ulan_LIBS += ws2_32
+    endif
+  endif
+endif
+
diff --git a/ulan/host/ul_drv/ul_lib/Makefile.std b/ulan/host/ul_drv/ul_lib/Makefile.std
new file mode 100644 (file)
index 0000000..b76ce63
--- /dev/null
@@ -0,0 +1,96 @@
+#*******************************************************************
+# uLan Communication - Makefile for uLan library compilation
+#
+# (C) Copyright 2000 by Pavel Pisa 
+#
+# The uLan driver is distributed under the Gnu General Public Licence. 
+# See file COPYING for details.
+#
+# Author reserves right to use and publish sources for embedded 
+# applications under different conditions too.
+#*******************************************************************
+
+all : default
+
+default : library
+
+# Select compiler
+CC=gcc
+
+# Basic compilation flags
+CFLAGS += -Wall -Wstrict-prototypes 
+CFLAGS += -O2
+CFLAGS += -I. -I..
+CFLAGS += -ggdb
+
+# CFLAGS for the uLan library
+# note: some macro expansions require at least -O
+LCFLAGS=  $(CFLAGS)
+LCFLAGS+= $(CPUFLAGS)
+# uncomment the next line if you want a shared library
+# LIB_SHARED = 1
+
+LIB_OBJS = ul_l_drv.lo ul_l_msg.lo ul_l_oi.lo ul_l_log.lo
+
+# DJGPP = 1
+
+ifdef DJGPP
+
+LIB_OBJS += ul_drv.lo
+
+MORE_C_FILES += ../ul_drv/ul_drv.c
+
+ul_drv.lo: ../ul_drv/ul_drv.c
+       $(CC) -o $@ $(LCFLAGS) -D UL_WITH_PCI -I ../ul_drv -c $<
+
+endif
+
+ifndef LIB_SHARED
+
+LIBULAN = libulan.a
+
+%.lo: %.c
+       $(CC) -o $@ $(LCFLAGS) -c $<
+
+$(LIBULAN): $(LIB_OBJS)
+       ar rcs $(LIBULAN) $^
+       ranlib $(LIBULAN)
+
+else
+
+%.lo: %.c
+       $(CC) --shared -o $@ $(LCFLAGS) -c $<
+
+LIBULAN = libulan.so.0.0.4
+
+$(LIBULAN): $(LIB_OBJS)
+       ld --shared --soname=$(LIBULAN) -o $(LIBULAN) $^
+       ln -s -f $(LIBULAN) libulan.so
+
+endif
+
+ul_lib/ul_fd.h : ul_lib/ul_fd4dir.h
+       cp $< $@
+
+library : ul_lib/ul_fd.h 
+
+library: $(LIBULAN)
+
+.SUFFIXES: .i .s
+%.c : %.i
+       $(CC) -E $(CFLAGS) $< >$@
+
+%.c : %.s
+       $(CC) -S $(CFLAGS) $<
+
+dep:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M *.c $(MORE_C_FILES) | \
+       sed 's/\.o/.lo/g' > depend
+
+depend:
+       @touch depend
+
+clean :
+       rm -f depend *.o *.lo *~ *.a *.so *.so.*
+
+-include depend
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_drv.c b/ulan/host/ul_drv/ul_lib/ul_l_drv.c
new file mode 100644 (file)
index 0000000..4bf2be9
--- /dev/null
@@ -0,0 +1,610 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_drv.c   - driver interface
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <sys/types.h>
+#ifndef _MSC_VER
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#endif /*_MSC_VER*/
+#include <string.h>
+#include <stdlib.h>
+#include <ul_lib/ulan.h>
+
+#ifndef WITH_UL_FD_INDIRECT
+
+#define ul_direct_open ul_open
+#define ul_direct_close ul_close
+#define ul_direct_drv_version ul_drv_version
+#define ul_direct_read ul_read
+#define ul_direct_write ul_write
+#define ul_direct_newmsg ul_newmsg
+#define ul_direct_tailmsg ul_tailmsg
+#define ul_direct_freemsg ul_freemsg
+#define ul_direct_acceptmsg ul_acceptmsg
+#define ul_direct_actailmsg ul_actailmsg
+#define ul_direct_addfilt ul_addfilt
+#define ul_direct_abortmsg ul_abortmsg
+#define ul_direct_rewmsg ul_rewmsg
+#define ul_direct_inepoll ul_inepoll
+#define ul_direct_drv_debflg ul_drv_debflg
+#define ul_direct_fd_wait ul_fd_wait
+#define ul_direct_setmyadr ul_setmyadr
+#define ul_direct_setbaudrate ul_setbaudrate
+#define ul_direct_setidstr ul_setidstr
+
+static inline ul_fd_t ul_direct_fd2ul_fd(ul_fd_t fd)
+{
+  return fd;
+}
+
+static inline void ul_direct_fd_free(ul_fd_t ul_fd)
+{
+}
+
+#define ul_direct_overlapped_wait(x,y,z) -1 
+#define WIN32_FILE_OVERLAPPED_FINI
+
+#else /*WITH_UL_FD_INDIRECT*/
+
+typedef struct ul_fd_direct_context_t {
+  ul_fd_context_t context;
+  ul_fd_direct_t sys_fd;
+#ifdef _WIN32
+  OVERLAPPED cOverlapped;
+#endif /* WIN32 */  
+} ul_fd_direct_context_t;
+
+ul_fd_ops_t ul_fd_direct_ops;
+
+static inline ul_fd_t ul_direct_fd2ul_fd(ul_fd_direct_t fd)
+{
+  ul_fd_direct_context_t *ul_direct_ctx;
+  if (fd==UL_FD_DIRECT_INVALID)
+    return UL_FD_INVALID;
+  ul_direct_ctx=malloc(sizeof(ul_fd_direct_context_t));
+  if(!ul_direct_ctx)
+    return UL_FD_INVALID;
+  memset(ul_direct_ctx,0,sizeof(ul_fd_direct_context_t));
+  ul_direct_ctx->sys_fd=fd;
+  ul_direct_ctx->context.fd_ops=&ul_fd_direct_ops;
+#ifdef WIN32_FILE_OVERLAPPED
+  ul_direct_ctx->cOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+  ul_direct_ctx->cOverlapped.Offset = 0;
+  ul_direct_ctx->cOverlapped.OffsetHigh = 0;
+  if (!ul_direct_ctx->cOverlapped.hEvent) {
+    free(ul_direct_ctx);
+    return UL_FD_INVALID;
+  }
+#endif /* WIN32_FILE_OVERLAPPED */
+  return &ul_direct_ctx->context;
+}
+
+static inline void ul_direct_fd_free(ul_fd_t ul_fd)
+{
+  ul_fd_direct_context_t *ul_direct_ctx;
+  if(ul_fd==UL_FD_INVALID)
+    return;
+
+  ul_direct_ctx=UL_CONTAINEROF(ul_fd, ul_fd_direct_context_t, context);
+#ifdef WIN32_FILE_OVERLAPPED
+  CloseHandle(ul_direct_ctx->cOverlapped.hEvent);
+  ul_direct_ctx->cOverlapped.hEvent=NULL;
+#endif /* WIN32_FILE_OVERLAPPED */
+  free(ul_direct_ctx);
+}
+
+ul_fd_direct_t ul_direct_fd2sys_fd(ul_fd_t ul_fd)
+{
+  if(ul_fd==UL_FD_INVALID)
+    return UL_FD_DIRECT_INVALID;
+  else
+    return UL_CONTAINEROF(ul_fd, ul_fd_direct_context_t, context)->sys_fd;
+}
+
+#ifdef WIN32_FILE_OVERLAPPED
+int ul_direct_overlapped_wait(ul_fd_direct_context_t *ul_direct_ctx, DWORD *bytes_ret, int ms_timeout)
+{
+  int ret=-1;
+  if (GetLastError() != ERROR_IO_PENDING) return -1;
+  if (WaitForSingleObject(ul_direct_ctx->cOverlapped.hEvent, ms_timeout) == WAIT_OBJECT_0) {
+    ret=GetOverlappedResult(ul_direct_ctx->sys_fd,&ul_direct_ctx->cOverlapped,
+                            bytes_ret, FALSE);
+  }
+  CancelIo(ul_direct_ctx->sys_fd);
+  return ret;  
+}
+
+#define WIN32_FILE_OVERLAPPED_FINI                                     \
+ ul_fd_direct_context_t *ul_direct_ctx;                                \
+ ul_direct_ctx=UL_CONTAINEROF(ul_fd, ul_fd_direct_context_t, context); \
+ pOverlapped=&ul_direct_ctx->cOverlapped;                              
+
+#else /* WIN32_FILE_OVERLAPPED */
+
+ #define ul_direct_overlapped_wait(x,y,z) -1 
+ #define WIN32_FILE_OVERLAPPED_FINI
+
+#endif /* WIN32_FILE_OVERLAPPED */
+
+#endif /* WITH_UL_FD_INDIRECT */
+
+#if !defined(_WIN32) && !defined(UL_DRV_IN_LIB)
+
+inline ul_fd_t ul_direct_open(const char *dev_name, const char *options)
+{
+  if(dev_name==NULL) dev_name=UL_DEV_NAME;
+  else if(!strncmp(dev_name,"drv:",4)) dev_name+=4;
+  return ul_direct_fd2ul_fd(open(dev_name,O_RDWR, S_IWRITE | S_IREAD));
+}
+
+inline int ul_direct_close(ul_fd_t ul_fd)
+{
+  int res;
+  res=close(ul_fd2sys_fd(ul_fd));
+  ul_direct_fd_free(ul_fd);
+  return res;
+}
+
+inline int ul_direct_drv_version(ul_fd_t ul_fd)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_DRV_VER);
+}
+
+
+inline ssize_t ul_direct_read(ul_fd_t ul_fd, void *buffer, size_t size)
+{
+  return read(ul_fd2sys_fd(ul_fd),buffer,size);
+}
+
+inline ssize_t ul_direct_write(ul_fd_t ul_fd, const void *buffer, size_t size)
+{
+  return write(ul_fd2sys_fd(ul_fd),buffer,size);
+}
+
+inline int ul_direct_newmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_NEWMSG,msginfo);
+}
+
+inline int ul_direct_tailmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_TAILMSG,msginfo);
+}
+
+inline int ul_direct_freemsg(ul_fd_t ul_fd)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_FREEMSG);
+}
+
+inline int ul_direct_acceptmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_ACCEPTMSG,msginfo);
+}
+
+inline int ul_direct_actailmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_ACTAILMSG,msginfo);
+}
+
+inline int ul_direct_addfilt(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_ADDFILT,msginfo);
+}
+
+inline int ul_direct_abortmsg(ul_fd_t ul_fd)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_ABORTMSG);
+}
+
+inline int ul_direct_rewmsg(ul_fd_t ul_fd)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_REWMSG);
+}
+
+inline int ul_direct_inepoll(ul_fd_t ul_fd)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_INEPOLL);
+}
+
+inline int ul_direct_drv_debflg(ul_fd_t ul_fd,int debug_msk)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_DEBFLG,debug_msk);
+}
+
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  int ret;
+  struct timeval timeout;
+  fd_set set;
+
+  FD_ZERO (&set);
+  FD_SET (ul_fd2sys_fd(ul_fd), &set);
+  timeout.tv_sec = wait_sec;
+  timeout.tv_usec = 0;
+  while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+          &&errno==-EINTR);
+  return ret;
+}
+
+inline int ul_direct_setmyadr(ul_fd_t ul_fd, int newadr)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_SETMYADR,newadr);
+}
+
+inline int ul_direct_setidstr(ul_fd_t ul_fd, const char *idstr)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_SETIDSTR,idstr);
+}
+
+inline int ul_direct_setbaudrate(ul_fd_t ul_fd, int baudrate)
+{
+  return ioctl(ul_fd2sys_fd(ul_fd),UL_SETBAUDRATE,baudrate);
+}
+
+/*******************************************************************/
+#elif defined(_WIN32)
+
+ul_fd_t ul_direct_open(const char *dev_name, const char *options)
+{
+  DWORD attr=FILE_ATTRIBUTE_NORMAL;
+  if(dev_name==NULL) dev_name=UL_DEV_NAME;
+  else if(!strncmp(dev_name,"drv:",4)) dev_name+=4;
+
+#ifdef WIN32_FILE_OVERLAPPED 
+  attr=FILE_FLAG_OVERLAPPED; 
+#endif /* WIN32_FILE_OVERLAPPED */
+  
+  return ul_direct_fd2ul_fd(CreateFile(dev_name,GENERIC_READ | GENERIC_WRITE,
+                    0, 0, OPEN_EXISTING, attr, 0));
+}
+
+int ul_direct_close(ul_fd_t ul_fd)
+{
+  int res=0;
+  if(!CloseHandle(ul_fd2sys_fd(ul_fd))) res=-1;
+  ul_direct_fd_free(ul_fd);
+  return res;
+}
+
+int ul_direct_drv_version(ul_fd_t ul_fd)
+{
+  DWORD ret,bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_DRV_VER,
+                      NULL,0,&ret,sizeof(ret),
+                      &bytes_ret,pOverlapped)) 
+    ret=ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE);  
+  return ret;
+}
+
+ssize_t ul_direct_read(ul_fd_t ul_fd, void *buffer, size_t size)
+{
+  DWORD ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!ReadFile(ul_fd2sys_fd(ul_fd),buffer,size,&ret,pOverlapped)) 
+    ul_direct_overlapped_wait(ul_direct_ctx,&ret,INFINITE);  
+  return ret;
+}
+
+ssize_t ul_direct_write(ul_fd_t ul_fd, const void *buffer, size_t size)
+{
+  DWORD ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!WriteFile(ul_fd2sys_fd(ul_fd),buffer,size,&ret,pOverlapped)) 
+    ul_direct_overlapped_wait(ul_direct_ctx,&ret,INFINITE);  
+  return ret;
+}
+
+int ul_direct_newmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_NEWMSG,
+                      (void *)msginfo,sizeof(ul_msginfo),NULL,0,
+                      &bytes_ret,pOverlapped)) 
+    return(ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE));  
+  return 0;
+}
+
+int ul_direct_tailmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_TAILMSG,
+                      (void *)msginfo,sizeof(ul_msginfo),NULL,0,
+                      &bytes_ret,pOverlapped)) 
+    return(ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE));  
+  return 0;
+}
+
+int ul_direct_freemsg(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  int ret=0;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_FREEMSG,NULL,0,&ret,sizeof(ret),
+                      &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  if(bytes_ret!=sizeof(ret)) return -1;
+  return ret;
+}
+
+int ul_direct_acceptmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_ACCEPTMSG,
+                      NULL,0,msginfo,sizeof(ul_msginfo),
+                      &bytes_ret,pOverlapped))
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  if(bytes_ret!=sizeof(ul_msginfo)) return -1;
+  return 0;
+}
+
+int ul_direct_actailmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_ACTAILMSG,
+                      NULL,0,msginfo,sizeof(ul_msginfo),
+                      &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  if(bytes_ret!=sizeof(ul_msginfo)) return -1;
+  return 0;
+}
+
+int ul_direct_addfilt(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_ADDFILT,
+                      (void *)msginfo,sizeof(ul_msginfo),NULL,0,
+                      &bytes_ret,pOverlapped)) return -1;
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+int ul_direct_abortmsg(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_ABORTMSG,NULL,0,NULL,0,
+                      &bytes_ret,pOverlapped))
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+int ul_direct_rewmsg(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_REWMSG,NULL,0,NULL,0,
+                      &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+int ul_direct_inepoll(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  int ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_INEPOLL,NULL,0,&ret,sizeof(ret),
+                      &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  if(bytes_ret!=sizeof(ret)) return -1;
+  return ret;
+}
+
+int ul_direct_drv_debflg(ul_fd_t ul_fd,int debug_msk)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_DEBFLG,
+                 &debug_msk,sizeof(debug_msk),NULL,0,
+                 &bytes_ret,pOverlapped))
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+#ifndef WITHOUT_SYS_SELECT
+
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  int ret;
+  struct timeval timeout;
+  fd_set set;
+
+  FD_ZERO (&set);
+  FD_SET (ul_fd2sys_fd(ul_fd), &set);
+  timeout.tv_sec = wait_sec;
+  timeout.tv_usec = 0;
+  while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+          &&errno==-EINTR);
+  return ret;
+}
+
+#else /* WITHOUT_SYS_SELECT */
+
+#ifndef WIN32_FILE_OVERLAPPED
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  int ret;
+  long loops=0;
+  do
+  { ret=ul_inepoll(ul_fd);
+    if(ret) return ret;
+    Sleep(100);
+  }while(loops++<(wait_sec*10));
+  return 0;
+}
+#else /* WIN32_FILE_OVERLAPPED */
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_WAITREC,
+                 NULL,0,NULL,0,
+                 &bytes_ret,pOverlapped))
+    return ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,wait_sec*1000);
+  return 1;
+}
+#endif  /* WIN32_FILE_OVERLAPPED */
+
+#endif /* WITHOUT_SYS_SELECT */
+
+inline int ul_direct_setmyadr(ul_fd_t ul_fd, int newadr)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_SETMYADR,
+                 &newadr,sizeof(newadr),NULL,0,
+                 &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+inline int ul_direct_setidstr(ul_fd_t ul_fd, const char *idstr)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_DEBFLG,
+                 &idstr,strlen(idstr),NULL,0,
+                 &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+inline int ul_direct_setbaudrate(ul_fd_t ul_fd, int baudrate)
+{
+  DWORD bytes_ret;
+  LPOVERLAPPED pOverlapped=NULL;
+  WIN32_FILE_OVERLAPPED_FINI;
+  if(!DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_SETBAUDRATE,
+                 &baudrate,sizeof(baudrate),NULL,0,
+                 &bytes_ret,pOverlapped)) 
+    if (!ul_direct_overlapped_wait(ul_direct_ctx,&bytes_ret,INFINITE)) 
+      return -1;
+  return 0;
+}
+
+#elif defined(__DJGPP__)
+
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  int ret;
+  long loops=0;
+  long int starttime;
+  struct timeval actual;
+  gettimeofday(&actual,NULL);
+  starttime=actual.tv_sec+1;
+  do
+  { ret=ul_inepoll(ul_fd);
+    if(ret) return ret;
+    /* uld_djgpp_call_irq(); */
+    gettimeofday(&actual,NULL);
+    loops++;
+  }while((wait_sec+starttime-(long)actual.tv_sec)>0);
+  return 0;
+}
+
+#elif defined(UL_DRV_IN_LIB)
+
+int ul_direct_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  int ret;
+  long loops=0;
+  do
+  { ret=ul_inepoll(ul_fd);
+    if(ret) return ret;
+    #ifndef CONFIG_OC_UL_DRV_SYSLESS
+     usleep(100*1000);
+    #endif 
+    /* uld_djgpp_call_irq(); */
+  }while(loops++<(wait_sec*10));
+  return 0;
+}
+
+#else
+  #error Interface to driver not defined for target
+#endif
+
+#ifdef WITH_UL_FD_INDIRECT
+
+int ul_direct_namematch(const char *dev_name)
+{
+  int ret=0;
+  if(!dev_name) ret=1;
+  else if(!strncmp(dev_name,"drv:",4))
+    ret=100; /* 100% name match for driver */
+  else if(!strchr(dev_name,':'))
+    ret=5;   /* no transport selected, direct driver is reasonable for this name */
+  return ret;
+}
+
+ul_fd_ops_t ul_fd_direct_ops={
+  "direct",
+  ul_direct_namematch,
+  ul_direct_open,
+  ul_direct_close,
+  ul_direct_drv_version,
+  ul_direct_read,
+  ul_direct_write,
+  ul_direct_newmsg,
+  ul_direct_tailmsg,
+  ul_direct_freemsg,
+  ul_direct_acceptmsg,
+  ul_direct_actailmsg,
+  ul_direct_addfilt,
+  ul_direct_abortmsg,
+  ul_direct_rewmsg,
+  ul_direct_inepoll,
+  ul_direct_drv_debflg,
+  ul_direct_fd_wait,
+  ul_direct_fd2sys_fd,
+  ul_direct_setmyadr,
+  ul_direct_setidstr,
+  ul_direct_setbaudrate
+};
+
+#endif /*WITH_UL_FD_INDIRECT*/
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_drv_eth.c b/ulan/host/ul_drv/ul_lib/ul_l_drv_eth.c
new file mode 100644 (file)
index 0000000..ff63f87
--- /dev/null
@@ -0,0 +1,999 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_drv_eth.c     - ethernet driver interface
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <signal.h>
+#define BAD_SOCKET(s) ((s) < 0)
+#define UL_SOCKET_INVALID -1
+#define SLEEP(x) sleep(x)
+#else
+#include <winsock.h>
+#include <fcntl.h>
+#define BAD_SOCKET(s) ((s) == INVALID_SOCKET)
+#define UL_SOCKET_INVALID INVALID_SOCKET
+#define SLEEP(x) Sleep(x*1000)
+#endif
+#include <ul_gavlcust.h>
+#include <ul_msg_buf.h>
+#include <ul_l_drv_eth.h>
+#include <ul_list.h>
+
+#ifdef CONFIG_OC_ULUT
+#include <ul_log.h>
+ul_log_domain_t ulogd_drv_eth   = {0, "drv_eth"};
+#define UL_LDOMAIN (&ulogd_drv_eth)
+#else
+#include <ul_lib/ul_l_log.h>
+#define UL_LDOMAIN NULL
+#endif
+
+#ifdef _WIN32
+ typedef SOCKET ul_fd_sock_t;
+#else /*_WIN32*/
+ typedef int ul_fd_sock_t;
+ #define closesocket(s)  close(s)
+#endif /*_WIN32*/
+
+typedef struct msgbuff_inproc_item {
+  gavl_node_t node;
+  ul_msg_buf_t *msgbuff;
+  unsigned stamp;
+} msgbuff_inproc_item_t;
+
+typedef struct msgbuff_inproc_root {
+  gavl_cust_root_field_t root;
+} msgbuff_inproc_root_t; 
+
+typedef unsigned msgbuff_inproc_key_t; 
+
+GAVL_CUST_NODE_INT_DEC(msgbuff_inproc, msgbuff_inproc_root_t, msgbuff_inproc_item_t, msgbuff_inproc_key_t,
+       root, node, stamp, msgbuff_inproc_cmp_fnc) 
+
+inline int
+msgbuff_inproc_cmp_fnc(const msgbuff_inproc_key_t *a, const msgbuff_inproc_key_t *b)
+{
+  if (*a>*b) return 1;
+  if (*a<*b) return -1;
+  return 0;
+}      
+
+GAVL_CUST_NODE_INT_IMP(msgbuff_inproc, msgbuff_inproc_root_t, msgbuff_inproc_item_t, msgbuff_inproc_key_t,
+       root, node, stamp, msgbuff_inproc_cmp_fnc) 
+
+typedef struct filter_inproc_item {
+  ul_list_node_t node;
+  ul_msginfo msginfo;
+} filter_inproc_item_t;
+
+typedef struct ul_fd_eth_context_t {
+  ul_fd_context_t context;
+  ul_fd_sock_t sock_fd;
+  FILE *sock_wfile;
+  uint32_t ipaddress;
+  uint16_t port;
+  ul_dbuff_t dev_name;
+  ul_dbuff_t rcvbuff;
+  ul_msg_buf_t *msgbuff_start;
+  ul_msg_buf_t *msgbuff_proc;
+  int msgbuff_idx;
+  int msg_received_flg;
+  unsigned stamp_eth_cnt;
+  msgbuff_inproc_root_t msgbuff_inproc_root;  
+  ul_list_head_t filter_inproc_root;
+} ul_fd_eth_context_t;
+
+UL_LIST_CUST_DEC(filter_inproc,
+                 ul_fd_eth_context_t,filter_inproc_item_t,
+                 filter_inproc_root,node);
+
+/* forward declarations */
+int ul_eth_close(ul_fd_t ul_fd);
+int ul_eth_recv_responce_int(ul_fd_eth_context_t *eth_fd,const char *cmd,int sn,int *v);
+
+static inline
+ul_fd_eth_context_t *ul_fd2eth_context(ul_fd_t ul_fd)
+{
+  return UL_CONTAINEROF(ul_fd, ul_fd_eth_context_t, context);
+}
+
+static inline
+ul_fd_sock_t ulop_eth_fd2sock_fd(ul_fd_t ul_fd)
+{
+  if(ul_fd==UL_FD_INVALID)
+    return UL_FD_DIRECT_INVALID;
+  else
+    return ul_fd2eth_context(ul_fd)->sock_fd;
+}
+
+ul_fd_direct_t ulop_eth_fd2sys_fd(ul_fd_t ul_fd)
+{
+  /*
+   * This is not fully correct on Windows, there does not exist handle
+   * type usable for both files and sockets
+   */
+  return ulop_eth_fd2sock_fd(ul_fd);
+}
+
+unsigned ul_eth_gen_stamp(ul_fd_eth_context_t *eth_fd)
+{
+  eth_fd->stamp_eth_cnt++;
+  eth_fd->stamp_eth_cnt&=0x7fffffff;
+  if(!eth_fd->stamp_eth_cnt)eth_fd->stamp_eth_cnt++;
+  return eth_fd->stamp_eth_cnt; 
+};
+
+ul_fd_sock_t ul_eth_sock_init(uint32_t net_ipaddr,uint16_t net_port) 
+{
+  struct sockaddr_in name;
+  ul_fd_sock_t fd;
+  #ifdef _WIN32
+  WORD wVersionRequested;
+  WSADATA wsaData;
+  int sockopt = SO_SYNCHRONOUS_NONALERT;
+  #endif
+    
+  #ifdef _WIN32
+    wVersionRequested = MAKEWORD(2, 0);
+    WSAStartup(wVersionRequested, &wsaData);
+    setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&sockopt, sizeof(sockopt));   
+  #endif
+
+  #ifndef _WIN32
+    signal(SIGPIPE, SIG_IGN);
+  #endif
+
+  if (BAD_SOCKET(fd=socket(AF_INET, SOCK_STREAM, 0))) 
+    return UL_SOCKET_INVALID;
+
+  name.sin_family=AF_INET;
+  name.sin_addr.s_addr=net_ipaddr;
+  name.sin_port=net_port;
+  if (BAD_SOCKET(connect(fd, (struct sockaddr *) &name, sizeof(name)))) {
+    closesocket(fd);
+    return UL_SOCKET_INVALID;
+  }
+
+  return fd;
+}
+
+int
+ul_eth_sock_init_file(ul_fd_eth_context_t *eth_fd)
+{
+ int f;
+ #ifndef _WIN32
+  f=eth_fd->sock_fd;
+ #else
+  f=_open_osfhandle(eth_fd->sock_fd,0);
+  if (f<0) 
+    return -1;
+ #endif /* _WIN32 */
+  eth_fd->sock_wfile=fdopen(f,"w");
+  if (!eth_fd->sock_wfile) 
+    return -1;
+  return 0;
+}
+
+int 
+ul_eth_sock_close(ul_fd_eth_context_t *eth_fd)
+{
+  if (eth_fd->sock_wfile) 
+    fclose(eth_fd->sock_wfile);
+  eth_fd->sock_wfile=0;
+
+  if (eth_fd->sock_fd!=UL_SOCKET_INVALID)
+    closesocket(eth_fd->sock_fd);
+  eth_fd->sock_fd=UL_SOCKET_INVALID;
+  return 0;
+}
+
+int
+ul_eth_sock_reinit(ul_fd_eth_context_t *eth_fd)
+{
+  int i,v;
+  unsigned eth_stamp;
+  filter_inproc_item_t *fitem;
+
+  if (eth_fd->sock_fd!=UL_SOCKET_INVALID)
+    return 0;
+
+  eth_fd->sock_fd=ul_eth_sock_init(eth_fd->ipaddress,eth_fd->port);
+  if (eth_fd->sock_fd==UL_SOCKET_INVALID)
+    return -1;
+
+  if (ul_eth_sock_init_file(eth_fd)) 
+    return -1;
+
+  /* send command to server request */
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d open %s\n",eth_stamp,eth_fd->dev_name.data);
+  fflush(eth_fd->sock_wfile);
+  /* wait for responce */
+  i=ul_eth_recv_responce_int(eth_fd,"open",eth_stamp,&v);
+  if ((i!=1) || (v==0)) {
+    ul_eth_sock_close(eth_fd);
+    return -1;
+  }
+  /* create filters */
+  ul_list_for_each(filter_inproc,eth_fd,fitem) {
+    ul_msginfo *msginfo=&fitem->msginfo;
+    eth_stamp=ul_eth_gen_stamp(eth_fd);
+    fprintf(eth_fd->sock_wfile,"usc %d addfilt %02x%02x%02x\n",eth_stamp,msginfo->sadr,msginfo->dadr,msginfo->cmd);
+    fflush(eth_fd->sock_wfile);
+    /* wait for responce */
+    if (ul_eth_recv_responce_int(eth_fd,"addfilt",eth_stamp,&v)!=1) {
+      ul_eth_sock_close(eth_fd);
+      return -1;
+    }
+  }
+  return 0;
+}
+
+static inline int
+ul_eth_sock_check(ul_fd_eth_context_t *eth_fd)
+{
+  return ul_eth_sock_reinit(eth_fd);
+}
+
+/**
+ * ul_eth_recv_msg - 
+ * @fd: 
+ * @rcvbuff: 
+ * @timeout:
+ *
+ * Returns number of received bytes or negative error code
+ *  Error codes: -1 connection was terminated by server
+ *               -2 xxx
+ *               -3 memory allocation error
+ *               -4 timeout
+ *               -5 terminated 
+ */
+int
+ul_eth_recv_msg(int fd,ul_dbuff_t *rcvbuff,int timeout, int *terminated)
+{
+
+  ul_dbuff_set_len(rcvbuff, 0);
+
+  while ((*terminated)==0) {
+    struct timeval stimeout = {1, 0};
+    int r,nread;
+    fd_set fds;
+
+    FD_ZERO(&fds);
+    FD_SET(fd,&fds);
+    r=select(FD_SETSIZE,&fds,NULL,NULL,&stimeout);
+
+    if (timeout>0) {
+      timeout--;
+      if (!timeout)
+        return -4; 
+    }
+
+    if (r<0) {
+      return -1;
+    }
+
+    if (r==0) 
+      continue;
+
+    if(FD_ISSET(fd, &fds)) {
+
+      #ifndef _WIN32
+        ioctl(fd, FIONREAD, &nread);
+      #else
+        u_long unread;
+        ioctlsocket(fd, FIONREAD, &unread);
+        nread=unread;
+      #endif /* _WIN32 */
+
+      if(nread != 0) {
+        int n;
+        int old_len = rcvbuff->len;
+        int new_len = old_len + nread;
+        int eofmsg = 0;
+        if(ul_dbuff_set_len(rcvbuff, new_len) == new_len) {
+          nread = recv(fd, rcvbuff->data + old_len, nread,0);
+          // try to find '\10' in new data to check out the on of message
+          for(n = nread-1; n>=0; n--) { 
+            if((rcvbuff->data + old_len)[n] == 10) {
+              eofmsg = 1; 
+              break;
+            }
+          }
+        } else {
+          /* Can't allocate memory */
+          return -3;
+        }
+        if(eofmsg) {
+          // if you got the whole message append terminating 0 & process it
+          ul_dbuff_append_byte(rcvbuff, '\0');
+          ul_dbuff_trim(rcvbuff);
+          return rcvbuff->len;
+        } 
+      } else 
+        return -1;
+    } else {
+      // this should never happen if the program work well
+      // outread unexpected data from buffer
+      int fd;
+      for(fd = 0; fd < FD_SETSIZE; fd++) {
+        if(FD_ISSET(fd, &fds)) {
+          ul_dbuff_set_len(rcvbuff, 128);
+          nread = recv(fd, rcvbuff->data, rcvbuff->len-1,0);
+          rcvbuff->data[nread] = '\0';
+        }
+      }
+    }
+  }
+  return -5;
+}
+
+int
+ul_eth_send_msg(FILE *fd,ul_msg_buf_t *sndbuff)
+{
+  ul_msginfo *msginfo;
+  int i;
+
+  do{
+    msginfo=&sndbuff->msginfo;
+    fprintf(fd,"%02x%02x%02x%04x%08x%04x",
+               msginfo->sadr,msginfo->dadr,msginfo->cmd,
+                msginfo->flg,msginfo->stamp,msginfo->len);
+    ul_log(UL_LDOMAIN,UL_LOGL_DEB|UL_LOGL_CONT,"%02x%02x%02x%04x%08x%04x",
+               msginfo->sadr,msginfo->dadr,msginfo->cmd,
+                msginfo->flg,msginfo->stamp,msginfo->len);
+    i=0;
+    while(i<msginfo->len) {
+      fprintf(fd,"%02x",sndbuff->data.data[i]);
+      ul_log(UL_LDOMAIN,UL_LOGL_DEB|UL_LOGL_CONT,"%02x",sndbuff->data.data[i]);
+      i++;
+    }
+    if (!sndbuff->tail) 
+      return 0;
+    sndbuff=sndbuff->tail;
+  }while(1);
+}
+
+
+int
+ul_eth_demarshal_stream(ul_msg_buf_t *msg_buf,char *stream,int stream_len)
+{
+  ul_msg_buf_t *tail;
+  ul_msginfo *msginfo;
+  int r,i,v;
+
+  ul_msg_buf_destroy(msg_buf);
+
+  do {
+    /* header */
+    msginfo=&msg_buf->msginfo;
+    if (stream_len<22) return -1;
+    r=sscanf(stream,"%02x%02x%02x%04x%08x%04x",
+            &msginfo->sadr,&msginfo->dadr,&msginfo->cmd,
+             &msginfo->flg,&msginfo->stamp,&msginfo->len);
+    stream+=22;
+    stream_len-=22;
+
+    if ((stream_len/2)<msginfo->len) return -1;
+    if (ul_dbuff_prep(&msg_buf->data,msginfo->len)<msginfo->len)
+      return -1;
+
+    /* copy data from txt stream to ul_msg_buf */
+    i=0;
+    while (i<msginfo->len) {
+      sscanf(stream,"%02x",&v);
+      *(msg_buf->data.data+i)=v;
+      stream+=2;
+      i++;
+    }
+    stream_len-=2*i;
+    
+    /* prepare tail */
+    if (stream_len>0) {
+      if(!(tail=malloc(sizeof(ul_msg_buf_t))))
+        return -1;
+      ul_msg_buf_init(tail);
+      msg_buf->tail=tail;
+      msg_buf=tail;
+    }
+  } while(stream_len>0);
+  return 1;
+} 
+
+int
+ul_eth_recv_responce_int(ul_fd_eth_context_t *eth_fd,const char *cmd,int sn,int *v)
+{
+  char buff[64];
+  int r,t=0;
+  
+  r=ul_eth_recv_msg(eth_fd->sock_fd,&eth_fd->rcvbuff,UL_ETH_SOCK_TIMEOUT,&t);
+  if (r<0) {
+    if (r==-1)
+      ul_eth_sock_close(eth_fd);
+    return r;
+  }
+  sprintf(buff,"usr %d %s %%d",sn,cmd);
+  return sscanf((char*)eth_fd->rcvbuff.data,buff,v);
+}
+
+int
+ul_eth_recv_responce_msgbuf(ul_fd_eth_context_t *eth_fd,const char *cmd,int sn,ul_msg_buf_t *rdbuf)
+{
+  char *msg_header,*msg_sn,*msg_cmd,*msg_data;
+  int msg_data_len,i,r,t=0;
+
+  r=ul_eth_recv_msg(eth_fd->sock_fd,&eth_fd->rcvbuff,UL_ETH_SOCK_TIMEOUT,&t);
+  if (r<0) {
+    if (r==-1)
+      ul_eth_sock_close(eth_fd);
+    return r;
+  }
+  
+  msg_header = strtok ((char*)eth_fd->rcvbuff.data," ");
+  if (msg_header!=NULL) {
+    msg_sn = strtok (NULL," ");
+    if (msg_sn!=NULL) {
+      msg_cmd = strtok (NULL," ");
+      if (msg_cmd!=NULL) {
+        msg_data = strtok (NULL," ");
+        msg_data_len=0;
+        if (msg_data!=NULL) 
+          msg_data_len=eth_fd->rcvbuff.len-(msg_data-(char*)eth_fd->rcvbuff.data)-1;
+        if (strcmp(cmd,msg_cmd)!=0) 
+          return -1;
+        i=strtol(msg_sn,NULL,0);
+        if (sn!=i)
+          return -1;
+        return ul_eth_demarshal_stream(rdbuf,msg_data,msg_data_len);
+      }
+    }    
+  }
+  return -1;
+}
+
+ul_fd_ops_t ul_fd_eth_ops;
+
+static inline ul_fd_t ul_fd_direct2ul_fd(ul_fd_sock_t fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+  if (fd==UL_SOCKET_INVALID) 
+    return UL_FD_INVALID;   
+  eth_fd=malloc(sizeof(*eth_fd));
+  if(!eth_fd)
+    return UL_FD_INVALID;
+  memset(eth_fd,0,sizeof(*eth_fd));
+  eth_fd->sock_fd=fd;
+  eth_fd->context.fd_ops=&ul_fd_eth_ops;
+  ul_dbuff_init(&eth_fd->rcvbuff, 0);
+  ul_dbuff_init(&eth_fd->dev_name, 0);
+  filter_inproc_init_head(eth_fd);
+  msgbuff_inproc_init_root_field(&eth_fd->msgbuff_inproc_root);
+  return &eth_fd->context;
+}
+
+ul_fd_t ul_eth_open(const char *dev_name, const char *options)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ul_fd_t r;
+  char buff[128],*d;
+  uint32_t eth_ipaddr;
+  uint16_t eth_port;
+  int i,v,l;
+  unsigned eth_stamp;
+  ul_fd_sock_t sock_fd;
+
+  if(dev_name==NULL) dev_name=UL_DEV_NAME;
+  else if(!strncmp(dev_name,"eth:",4)) dev_name+=4;
+  d=strpbrk(dev_name,":");
+  if (!d)
+    return UL_FD_INVALID;
+  memset(buff,0,sizeof(buff));
+  strncpy(buff,dev_name,d-dev_name);
+  eth_ipaddr=inet_addr(buff);
+  dev_name=d+1;
+  d=strpbrk(dev_name,":");
+  if (!d)
+    return UL_FD_INVALID;
+
+  memset(buff,0,sizeof(buff));
+  strncpy(buff,dev_name,d-dev_name);
+  eth_port=htons(strtol(buff,NULL,0));
+  dev_name=d+1;
+
+  sock_fd=ul_eth_sock_init(eth_ipaddr,eth_port);
+  r=ul_fd_direct2ul_fd(sock_fd);
+  if (r==UL_FD_INVALID) 
+    return UL_FD_INVALID;
+
+  eth_fd=ul_fd2eth_context(r);
+  eth_fd->ipaddress=eth_ipaddr;
+  eth_fd->port=eth_port;
+  if (ul_eth_sock_init_file(eth_fd)) {
+    ul_eth_close(r);
+    return UL_FD_INVALID;
+  }
+
+  l=strlen(dev_name)+1;
+  if(ul_dbuff_set_len(&eth_fd->dev_name, l) != l) {
+    ul_eth_close(r);
+    return UL_FD_INVALID;
+  }
+  strncpy((char*)eth_fd->dev_name.data,dev_name,l);
+
+  /* send command to server request */
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d open %s\n",eth_stamp,eth_fd->dev_name.data);
+  fflush(eth_fd->sock_wfile);
+  /* wait for responce */
+  i=ul_eth_recv_responce_int(eth_fd,"open",eth_stamp,&v);
+  if ((i!=1) || (v==0)) {
+    ul_eth_close(r);
+    return UL_FD_INVALID;
+  }
+  return r;
+}
+
+int ul_eth_close(ul_fd_t ul_fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+  msgbuff_inproc_item_t *mitem;
+  filter_inproc_item_t *fitem;
+  unsigned eth_stamp;
+  int r;
+
+  if(ul_fd==UL_FD_INVALID)
+    return -1;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+
+  if (eth_fd->sock_fd!=UL_SOCKET_INVALID) {
+    eth_stamp=ul_eth_gen_stamp(eth_fd);
+    fprintf(eth_fd->sock_wfile,"usc %d close\n",eth_stamp);
+    fflush(eth_fd->sock_wfile);
+    /* wait for responce */
+    r=-1;
+    ul_eth_recv_responce_int(eth_fd,"close",eth_stamp,&r);
+  } else
+    r=0;
+
+  ul_dbuff_destroy(&eth_fd->rcvbuff);
+  ul_dbuff_destroy(&eth_fd->dev_name);
+  if (eth_fd->msgbuff_start) {
+    mitem=msgbuff_inproc_find(&eth_fd->msgbuff_inproc_root,&eth_fd->msgbuff_start->msginfo.stamp);
+    if (!mitem) {
+      ul_msg_buf_destroy(eth_fd->msgbuff_start);
+      free(eth_fd->msgbuff_start);
+    }
+  }
+  while((fitem=filter_inproc_cut_first(eth_fd))!=NULL) {
+    free(fitem);
+  }
+  while((mitem=msgbuff_inproc_cut_first(&eth_fd->msgbuff_inproc_root))!=NULL) {
+    ul_msg_buf_destroy(mitem->msgbuff);
+    free(mitem);
+  }
+  if (eth_fd->sock_wfile) {
+    fclose(eth_fd->sock_wfile);
+  }
+
+  closesocket(eth_fd->sock_fd);
+
+  free(eth_fd);
+
+  return r;
+}
+
+int ul_eth_drv_version(ul_fd_t ul_fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+  unsigned eth_stamp;
+  int v;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (ul_eth_sock_check(eth_fd)<0)
+    return -1;
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d drv_version\n",eth_stamp);
+  fflush(eth_fd->sock_wfile);
+  /* wait for responce */
+  if (ul_eth_recv_responce_int(eth_fd,"drv_version",eth_stamp,&v)!=1) 
+    return -1;
+  return v;
+}
+
+
+ssize_t ul_eth_read(ul_fd_t ul_fd, void *buffer, size_t size)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ssize_t s;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+  
+  s=size;
+  if ((eth_fd->msgbuff_idx+size)>eth_fd->msgbuff_proc->msginfo.len)
+    s=eth_fd->msgbuff_proc->msginfo.len-eth_fd->msgbuff_idx;
+  
+  memcpy(buffer,eth_fd->msgbuff_proc->data.data,s);
+  return s;
+}
+
+ssize_t ul_eth_write(ul_fd_t ul_fd, const void *buffer, size_t size)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ul_dbuff_t *msg_data;
+  int new_len;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+
+  msg_data=&eth_fd->msgbuff_proc->data;
+  new_len = msg_data->len + size;
+  if(ul_dbuff_set_len(msg_data, new_len) != new_len) 
+    return -1;
+  memcpy(msg_data->data + eth_fd->msgbuff_idx,buffer,size);
+  eth_fd->msgbuff_idx+=size;
+  eth_fd->msgbuff_proc->msginfo.len+=size;
+  return size;
+}
+
+int ul_eth_newmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ul_msg_buf_t *msgbuff;
+  int flg;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (ul_eth_sock_check(eth_fd)<0)
+    return -1;
+  if (eth_fd->msgbuff_proc) {
+    ul_msg_buf_destroy(eth_fd->msgbuff_proc);
+    free(eth_fd->msgbuff_proc);
+  }
+  msgbuff=malloc(sizeof(ul_msg_buf_t));
+  if (!msgbuff)
+    return -1;
+  ul_msg_buf_init(msgbuff);
+  eth_fd->msgbuff_start=msgbuff;
+  eth_fd->msgbuff_proc=eth_fd->msgbuff_start;
+  eth_fd->msgbuff_proc->msginfo=*msginfo;
+  flg=msginfo->flg;
+  flg &= ~(UL_BFL_LOCK | UL_BFL_FAIL | UL_BFL_TAIL | UL_BFL_REC);
+  flg |= UL_BFL_SND;
+  eth_fd->msgbuff_proc->msginfo.flg=flg;
+  eth_fd->msgbuff_proc->msginfo.len=0;
+  eth_fd->msgbuff_idx=0;
+  return 0;
+}
+
+int ul_eth_tailmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ul_msg_buf_t *tail;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+
+  if(!(tail=malloc(sizeof(ul_msg_buf_t))))
+    return -1;
+  ul_msg_buf_init(tail);
+  eth_fd->msgbuff_proc->tail=tail;
+  eth_fd->msgbuff_proc=tail;
+
+  eth_fd->msgbuff_proc->msginfo=*msginfo;
+  eth_fd->msgbuff_start->msginfo.flg &= ~(UL_BFL_LOCK | UL_BFL_FAIL | UL_BFL_REC);
+  if(!eth_fd->msgbuff_start->msginfo.flg&UL_BFL_REC) 
+    eth_fd->msgbuff_start->msginfo.flg|=UL_BFL_SND;
+  eth_fd->msgbuff_start->msginfo.flg|=UL_BFL_TAIL;
+  eth_fd->msgbuff_idx=0;
+  return 0;
+}
+
+int ul_eth_freemsg(ul_fd_t ul_fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+  int r1,r2,r=0;
+  msgbuff_inproc_item_t *item;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+
+  if (!eth_fd->msg_received_flg) {
+    unsigned eth_stamp=ul_eth_gen_stamp(eth_fd);
+    /* send */
+    fprintf(eth_fd->sock_wfile,"usc %d send ",eth_stamp);
+    r1=ul_eth_send_msg(eth_fd->sock_wfile,eth_fd->msgbuff_start);
+    fprintf(eth_fd->sock_wfile,"\n");
+    fflush(eth_fd->sock_wfile);
+    /* wait for responce */
+    r2=ul_eth_recv_responce_int(eth_fd,"send",eth_stamp,&r); 
+    if ((r1<0) || (r2!=1) || (r<0)) {
+      r=-1;
+    } else {
+      /* copy message to inproc queue in case flag UL_BFL_M2IN */
+      if (eth_fd->msgbuff_start->msginfo.flg&UL_BFL_M2IN) {
+        msgbuff_inproc_item_t *item;
+        item=malloc(sizeof(msgbuff_inproc_item_t));
+        if (item) { 
+         item->msgbuff=eth_fd->msgbuff_start;
+         item->stamp=r;
+         msgbuff_inproc_insert(&eth_fd->msgbuff_inproc_root,item);
+         eth_fd->msgbuff_start=NULL;
+         eth_fd->msgbuff_proc=NULL;
+         eth_fd->msgbuff_idx=0;
+         eth_fd->msg_received_flg=0;
+         return r;
+        }
+      }
+    }
+  } 
+
+  /* check if this message was in inproc queue */
+  if (eth_fd->msg_received_flg) {
+    item=msgbuff_inproc_find(&eth_fd->msgbuff_inproc_root,&eth_fd->msgbuff_start->msginfo.stamp);
+    if (item) {
+      msgbuff_inproc_delete(&eth_fd->msgbuff_inproc_root,item);
+      free(item);
+    }
+  }
+
+  /* destroy proc message */
+  ul_msg_buf_destroy(eth_fd->msgbuff_start);
+  free(eth_fd->msgbuff_start);
+  eth_fd->msgbuff_start=NULL;
+  eth_fd->msgbuff_proc=NULL;
+  eth_fd->msgbuff_idx=0;
+  eth_fd->msg_received_flg=0;
+  return r;
+}
+
+int ul_eth_acceptmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  ul_fd_eth_context_t *eth_fd;
+  msgbuff_inproc_item_t *item;
+  ul_msg_buf_t *msgbuff,*tail;
+  unsigned eth_stamp;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (ul_eth_sock_check(eth_fd)<0) {
+    /* check if some message is inproc queue */
+    if (!msgbuff_inproc_is_empty(&eth_fd->msgbuff_inproc_root)) {
+       item=msgbuff_inproc_first(&eth_fd->msgbuff_inproc_root);
+       eth_fd->msgbuff_start=item->msgbuff;
+       eth_fd->msgbuff_proc=eth_fd->msgbuff_start;
+       eth_fd->msgbuff_proc->msginfo.flg|=UL_BFL_FAIL;
+       eth_fd->msgbuff_proc->msginfo.len=0;
+       eth_fd->msgbuff_proc->msginfo.stamp=item->stamp;
+       ul_dbuff_destroy(&eth_fd->msgbuff_proc->data);
+       tail=eth_fd->msgbuff_start->tail;
+       while(tail) {  
+         tail->msginfo.len=0;
+         ul_dbuff_destroy(&tail->data);
+         tail=tail->tail;
+       }
+       eth_fd->msgbuff_idx=0;
+       eth_fd->msg_received_flg=1;
+       if (msginfo)
+         *msginfo=eth_fd->msgbuff_proc->msginfo;
+       return 0;
+    }
+    return -1;
+  }
+  if (eth_fd->msgbuff_proc) {
+    eth_fd->msgbuff_proc=eth_fd->msgbuff_start;
+    eth_fd->msgbuff_idx=0;
+    eth_fd->msg_received_flg=1;
+    if (msginfo)
+      *msginfo=eth_fd->msgbuff_proc->msginfo;
+    return 0;
+  }
+
+  msgbuff=malloc(sizeof(ul_msg_buf_t));
+  if (!msgbuff)
+    return -1;
+  ul_msg_buf_init(msgbuff);
+
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d recv\n",eth_stamp);
+  fflush(eth_fd->sock_wfile);
+
+  /* wait for responce */
+  if (ul_eth_recv_responce_msgbuf(eth_fd,"recv",eth_stamp,msgbuff)!=1) 
+    return -1;
+
+  /* a new messsage is ready */
+  eth_fd->msgbuff_start=msgbuff;
+  eth_fd->msgbuff_proc=eth_fd->msgbuff_start;
+  eth_fd->msgbuff_idx=0;
+  eth_fd->msg_received_flg=1;
+  if (msginfo)
+    *msginfo=eth_fd->msgbuff_proc->msginfo;
+  return 0;
+}
+
+int ul_eth_actailmsg(ul_fd_t ul_fd,ul_msginfo *msginfo)
+{
+  ul_fd_eth_context_t *eth_fd;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+  if (!eth_fd->msgbuff_proc->tail)
+    return -1;
+
+  eth_fd->msgbuff_proc=eth_fd->msgbuff_proc->tail;
+  eth_fd->msgbuff_idx=0;
+  *msginfo=eth_fd->msgbuff_proc->msginfo;
+  return 0;
+}
+
+int ul_eth_addfilt(ul_fd_t ul_fd,const ul_msginfo *msginfo)
+{
+  ul_fd_eth_context_t *eth_fd;
+  filter_inproc_item_t *fitem;
+  unsigned eth_stamp;
+  int v;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (ul_eth_sock_check(eth_fd)<0)
+    return -1;
+  fitem=malloc(sizeof(filter_inproc_item_t));
+  if (!fitem)
+    return -1;
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d addfilt %02x%02x%02x\n",eth_stamp,msginfo->sadr,msginfo->dadr,msginfo->cmd);
+  fflush(eth_fd->sock_wfile);
+  /* wait for responce */
+  if (ul_eth_recv_responce_int(eth_fd,"addfilt",eth_stamp,&v)!=1) {
+    free(fitem);
+    return -1;
+  }
+  /* insert in filter queue */
+  fitem->msginfo=*msginfo;
+  filter_inproc_insert(eth_fd,fitem);
+  return v;
+}
+
+int ul_eth_abortmsg(ul_fd_t ul_fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+
+  ul_msg_buf_destroy(eth_fd->msgbuff_start);
+  free(eth_fd->msgbuff_start);
+  eth_fd->msgbuff_start=NULL;
+  eth_fd->msgbuff_proc=NULL;
+  eth_fd->msgbuff_idx=0;
+  return 0;
+}
+
+int ul_eth_rewmsg(ul_fd_t ul_fd)
+{
+  ul_fd_eth_context_t *eth_fd;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (!eth_fd->msgbuff_proc) 
+    return -1;
+
+  eth_fd->msgbuff_idx=0;
+  return 0;
+}
+
+int ul_eth_inepoll(ul_fd_t ul_fd)
+{
+  return ul_eth_acceptmsg(ul_fd,NULL)==0?1:0;
+}
+
+int ul_eth_debflg(ul_fd_t ul_fd,int debug_msk)
+{
+  return 0;
+}
+
+int ul_eth_setmyadr(ul_fd_t ul_fd, int newadr) {
+  return 0;
+}
+
+int ul_eth_setidstr(ul_fd_t ul_fd, const char *idstr) {
+  return 0;
+}
+
+int ul_eth_setbaudrate(ul_fd_t ul_fd, int baudrate) {
+  return 0;
+}
+
+int ul_eth_fd_wait(ul_fd_t ul_fd, int wait_sec)
+{
+  ul_fd_eth_context_t *eth_fd;
+  ul_msg_buf_t *msgbuff;
+  unsigned eth_stamp;
+
+  eth_fd=ul_fd2eth_context(ul_fd);
+  if (ul_eth_sock_check(eth_fd)<0) {
+    /* check if some message is inproc queue */
+    if (!msgbuff_inproc_is_empty(&eth_fd->msgbuff_inproc_root))
+      return 1;
+    SLEEP(wait_sec);
+    return -1;
+  }
+  if (eth_fd->msg_received_flg) 
+    return 1;
+
+  msgbuff=malloc(sizeof(ul_msg_buf_t));
+  if (!msgbuff)
+    return -1;
+  ul_msg_buf_init(msgbuff);
+
+  eth_stamp=ul_eth_gen_stamp(eth_fd);
+  fprintf(eth_fd->sock_wfile,"usc %d fd_wait_recv %d\n",eth_stamp,wait_sec);
+  fflush(eth_fd->sock_wfile);
+  /* wait for responce */
+  if (ul_eth_recv_responce_msgbuf(eth_fd,"fd_wait_recv",eth_stamp,msgbuff)!=1) {
+    free(msgbuff);
+    return -1;
+  }
+  /* a new messsage is ready */
+  eth_fd->msgbuff_start=msgbuff;
+  eth_fd->msgbuff_proc=eth_fd->msgbuff_start;
+  eth_fd->msgbuff_idx=0;
+  eth_fd->msg_received_flg=1;
+  return 1;
+}
+
+int ul_eth_namematch(const char *dev_name)
+{
+  int ret=0;
+  if(!dev_name) ret=1;
+  else if(!strncmp(dev_name,"eth:",4))
+    ret=100; /* 100% name match for driver */
+  else if(!strchr(dev_name,':'))
+    ret=5;   /* no transport selected, direct driver is reasonable for this name */
+  return ret;
+}
+
+ul_fd_ops_t ul_fd_eth_ops={
+  "eth",
+  ul_eth_namematch,
+  ul_eth_open,
+  ul_eth_close,
+  ul_eth_drv_version,
+  ul_eth_read,
+  ul_eth_write,
+  ul_eth_newmsg,
+  ul_eth_tailmsg,
+  ul_eth_freemsg,
+  ul_eth_acceptmsg,
+  ul_eth_actailmsg,
+  ul_eth_addfilt,
+  ul_eth_abortmsg,
+  ul_eth_rewmsg,
+  ul_eth_inepoll,
+  ul_eth_debflg,
+  ul_eth_fd_wait,
+  ulop_eth_fd2sys_fd,
+  ul_eth_setmyadr,
+  ul_eth_setidstr,
+  ul_eth_setbaudrate
+};
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_drv_eth.h b/ulan/host/ul_drv/ul_lib/ul_l_drv_eth.h
new file mode 100644 (file)
index 0000000..f91bfde
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _UL_L_DRV_ETH_H
+#define _UL_L_DRV_ETH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ul_dbuff.h>
+#include <ul_netbase.h>
+
+#define UL_ETH_SOCK_TIMEOUT 10
+
+int ul_eth_recv_msg(int fd,ul_dbuff_t *rcvbuff,int timeout, int *terminated);
+int ul_eth_send_msg(FILE *fd,ul_msg_buf_t *sndbuff);
+int ul_eth_demarshal_stream(ul_msg_buf_t *msg_buf,char *stream,int stream_len);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_L_DRV_ETH_H*/
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_indir.c b/ulan/host/ul_drv/ul_lib/ul_l_indir.c
new file mode 100644 (file)
index 0000000..7fa1000
--- /dev/null
@@ -0,0 +1,164 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_drv.c   - driver interface
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ul_lib/ulan.h>
+
+typedef struct {
+  int count;
+  int capacity;
+  ul_fd_ops_t **fd_ops;
+} ul_fd_ops_list_t;
+
+extern ul_fd_ops_t ul_fd_direct_ops;
+#ifdef CONFIG_UL_FD_ETH
+extern ul_fd_ops_t ul_fd_eth_ops;
+#endif
+
+ul_fd_ops_t *ul_fd_ops_defaults[]={
+  &ul_fd_direct_ops,
+ #ifdef CONFIG_UL_FD_ETH
+  &ul_fd_eth_ops,
+ #endif
+};
+
+ul_fd_ops_list_t ul_fd_ops_list={
+  sizeof(ul_fd_ops_defaults)/sizeof(ul_fd_ops_defaults[0]),
+  -1,
+  ul_fd_ops_defaults
+};
+
+int ul_fd_ops_register(ul_fd_ops_t *fd_ops)
+{
+  ul_fd_ops_list_t *list=&ul_fd_ops_list;
+
+  if(list->capacity<list->count+1){
+    ul_fd_ops_t **data;
+    int capacity=list->count+10;
+    data=malloc(capacity);
+    if(!data) return -1;
+    if(list->fd_ops){
+      memcpy(data,list->fd_ops,list->count*sizeof(ul_fd_ops_t *));
+      if(list->capacity>=0)
+        free(list->fd_ops);
+    }
+    list->fd_ops=data;
+    list->capacity=capacity;
+  }
+
+  list->fd_ops[list->count]=fd_ops;
+  list->count++;
+  return 0;
+}
+
+ul_fd_t ul_open(const char *dev_name, const char *options) {
+  ul_fd_t ul_fd;
+  int idx, val, match_idx=-1, match_val=0;
+  
+  for(idx=0;idx<ul_fd_ops_list.count;idx++){
+    if(ul_fd_ops_list.fd_ops[idx]->ulop_namematch){
+      val=ul_fd_ops_list.fd_ops[idx]->ulop_namematch(dev_name);
+      if(val>match_val){
+        match_val=val;
+       match_idx=idx;
+      }
+    }
+  }
+
+  if(match_idx<0)
+    return UL_FD_INVALID;
+
+  ul_fd=ul_fd_ops_list.fd_ops[match_idx]->ulop_open(dev_name, options);
+
+  return ul_fd;
+}
+
+inline int ul_close(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_close(ul_fd);
+}
+
+inline int ul_drv_version(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_drv_version(ul_fd);
+}
+
+inline ssize_t ul_read(ul_fd_t ul_fd, void *buffer, size_t size) {
+  return ul_fd->fd_ops->ulop_read(ul_fd,buffer,size);
+}
+
+inline ssize_t ul_write(ul_fd_t ul_fd, const void *buffer, size_t size) {
+  return ul_fd->fd_ops->ulop_write(ul_fd,buffer,size);
+}
+
+inline int ul_newmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo) {
+  return ul_fd->fd_ops->ulop_newmsg(ul_fd,msginfo);
+}
+
+inline int ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo) {
+  return ul_fd->fd_ops->ulop_tailmsg(ul_fd,msginfo);
+}
+
+inline int ul_freemsg(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_freemsg(ul_fd);
+}
+
+inline int ul_acceptmsg(ul_fd_t ul_fd,ul_msginfo *msginfo) {
+  return ul_fd->fd_ops->ulop_acceptmsg(ul_fd,msginfo);
+}
+
+inline int ul_actailmsg(ul_fd_t ul_fd,ul_msginfo *msginfo) {
+  return ul_fd->fd_ops->ulop_actailmsg(ul_fd,msginfo);
+}
+
+inline int ul_addfilt(ul_fd_t ul_fd,const ul_msginfo *msginfo) {
+  return ul_fd->fd_ops->ulop_addfilt(ul_fd,msginfo);
+}
+
+inline int ul_abortmsg(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_abortmsg(ul_fd);
+}
+
+inline int ul_rewmsg(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_rewmsg(ul_fd);
+}
+
+inline int ul_inepoll(ul_fd_t ul_fd) {
+  return ul_fd->fd_ops->ulop_inepoll(ul_fd);
+}
+
+inline int ul_drv_debflg(ul_fd_t ul_fd,int debug_msk) {
+  return ul_fd->fd_ops->ulop_drv_debflg(ul_fd,debug_msk);
+}
+
+inline int ul_fd_wait(ul_fd_t ul_fd, int wait_sec) {
+  return ul_fd->fd_ops->ulop_fd_wait(ul_fd,wait_sec);
+}
+
+inline ul_fd_direct_t ul_fd2sys_fd(ul_fd_t fd)
+{
+  if(!fd->fd_ops->ulop_fd2sys_fd)
+    return UL_FD_DIRECT_INVALID;
+  else
+    return fd->fd_ops->ulop_fd2sys_fd(fd);
+}
+
+inline int ul_setmyadr(ul_fd_t ul_fd, int newadr) {
+  return ul_fd->fd_ops->ulop_setmyadr(ul_fd,newadr);
+}
+
+inline int ul_setidstr(ul_fd_t ul_fd, const char *idstr) {
+  return ul_fd->fd_ops->ulop_setidstr(ul_fd,idstr);
+}
+
+inline int ul_setbaudrate(ul_fd_t ul_fd, int baudrate) {
+  return ul_fd->fd_ops->ulop_setbaudrate(ul_fd,baudrate);
+}
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_log.c b/ulan/host/ul_drv/ul_lib/ul_l_log.c
new file mode 100644 (file)
index 0000000..52bded9
--- /dev/null
@@ -0,0 +1,70 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_log.c   - simple logging support
+
+  (C) Copyright 2002 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+//#ifndef _MSC_VER
+//#include <unistd.h>
+//#endif /*_MSC_VER*/
+#include <stdlib.h>
+//#include <fcntl.h>
+#include <stdio.h>
+#include <sys/types.h>
+//#include <sys/time.h>
+//#include <sys/stat.h>
+//#include <string.h>
+#include <stdarg.h>
+#include <ul_lib/ulan.h>
+#include <ul_lib/ul_l_log.h>
+
+void
+ul_log_fnc_default(struct ul_log_domain *domain, int level,
+       const char *format, va_list args);
+
+ul_log_fnc_t *ul_log_output;
+FILE *ul_log_default_file;
+
+void
+ul_log(struct ul_log_domain *domain, int level,
+       const char *format, ...)
+{
+  va_list ap;
+  if(ul_log_output==NULL) {
+    char *log_fname;
+    ul_log_output=ul_log_fnc_default;
+    if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
+      ul_log_default_file=fopen(log_fname,"a");
+    }
+    if(ul_log_default_file==NULL)
+      ul_log_default_file=stderr;
+  }
+  va_start(ap, format);
+  (*ul_log_output)(domain,level,format,ap);
+  va_end(ap);
+}
+
+void
+ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags)
+{
+  if(log_fnc==NULL) log_fnc=ul_log_fnc_default;
+  ul_log_output=log_fnc;
+}
+
+void
+ul_log_fnc_default(struct ul_log_domain *domain, int level,
+       const char *format, va_list ap)
+{
+  if(!(level&UL_LOGL_CONT)) {
+    level&=UL_LOGL_MASK;
+    fprintf(ul_log_default_file,"<%d>: ",level);
+  }
+  vfprintf(ul_log_default_file,format, ap);
+  fflush(ul_log_default_file);
+}
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_msg.c b/ulan/host/ul_drv/ul_lib/ul_l_msg.c
new file mode 100644 (file)
index 0000000..a19dc9d
--- /dev/null
@@ -0,0 +1,117 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_msg.c   - simple message operations
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+//#ifndef _MSC_VER
+//#include <unistd.h>
+//#endif /*_MSC_VER*/
+#include <stdlib.h>
+//#include <fcntl.h>
+//#include <stdio.h>
+#include <sys/types.h>
+//#include <sys/stat.h>
+#include <string.h>
+#include <ul_lib/ulan.h>
+
+/* simple message operations */
+
+int ul_send_command(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                    const void *buf,int len)
+{ int ret;
+  ul_msginfo msginfo;
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.dadr=dadr;
+  msginfo.cmd=cmd;
+  msginfo.flg=UL_BFL_M2IN|flg;
+  ret=ul_newmsg(ul_fd,&msginfo);
+  if(ret<0) return ret;
+  if(len)if(ul_write(ul_fd,buf,len)!=len)
+  { ul_abortmsg(ul_fd);
+    return -1;
+  };
+  return ul_freemsg(ul_fd);
+};
+
+int ul_send_command_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                         const void *buf,int len)
+{ int stamp;
+  int ret;
+  ul_msginfo msginfo;
+  stamp=ul_send_command(ul_fd,dadr,cmd,flg,buf,len);
+  if(stamp<0) return stamp;
+  while(1) 
+  { ret=ul_fd_wait(ul_fd,10);
+    if(ret<=0) return ret?ret:-1;
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) return ret;
+    ul_freemsg(ul_fd);
+    if(msginfo.stamp==stamp)
+    { if(msginfo.flg&UL_BFL_FAIL) return -2;
+      else return 1;
+    };
+  };
+};
+
+int ul_send_query(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                  const void *buf,int len)
+{ int ret;
+  ul_msginfo msginfo;
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.dadr=dadr;
+  msginfo.cmd=cmd;
+  msginfo.flg=UL_BFL_M2IN|flg;
+  ret=ul_newmsg(ul_fd,&msginfo);
+  if(ret<0) return ret;
+  if(len)if(ul_write(ul_fd,buf,len)!=len)
+  { ul_abortmsg(ul_fd);
+    return -1;
+  };
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.flg=UL_BFL_REC|UL_BFL_M2IN;
+  if(ul_tailmsg(ul_fd,&msginfo)<0)
+  { ul_abortmsg(ul_fd);
+    return -1;
+  };
+  return ul_freemsg(ul_fd);
+};
+
+int ul_send_query_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                   const void *bufin,int lenin,void **bufout,int *lenout)
+{ int stamp;
+  int ret;
+  int len;
+  ul_msginfo msginfo;
+  stamp=ul_send_query(ul_fd,dadr,cmd,flg,bufin,lenin);
+  if(stamp<0) return stamp;
+  while(1) 
+  { ret=ul_fd_wait(ul_fd,10);
+    if(ret<=0) return ret?ret:-1;
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) return ret;
+    if(msginfo.stamp==stamp)
+    { if(msginfo.flg&UL_BFL_FAIL)
+        {ul_freemsg(ul_fd); return -2;};
+      ret=ul_actailmsg(ul_fd,&msginfo);
+      if(ret<0) {ul_freemsg(ul_fd); return ret;};
+      if(bufout&&lenout)
+      { len=msginfo.len;
+        if(!*bufout) *bufout=malloc(len);
+        else if(*lenout<len) len=*lenout;
+        if(ul_read(ul_fd,*bufout,len)!=len)
+          {ul_freemsg(ul_fd); return -3;};
+        *lenout=len;
+      };
+      ul_freemsg(ul_fd);
+      return msginfo.len;
+    };
+    ul_freemsg(ul_fd);
+  };
+};
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_oi.c b/ulan/host/ul_drv/ul_lib/ul_l_oi.c
new file mode 100644 (file)
index 0000000..4cbc48e
--- /dev/null
@@ -0,0 +1,390 @@
+/*******************************************************************
+  uLan Communication - basic library
+
+  ul_l_oi.c    - definitions of basic uLan OI functions
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+//#ifndef _MSC_VER
+//#include <unistd.h>
+//#endif /*_MSC_VER*/
+#include <stdlib.h>
+//#include <fcntl.h>
+//include <stdio.h>
+#include <sys/types.h>
+//#include <sys/time.h>
+//#include <sys/stat.h>
+#include <string.h>
+#include <ul_lib/ulan.h>
+
+#ifdef CONFIG_OC_ULUT
+#include <ul_log.h>
+extern ul_log_domain_t ulogd_uloi;
+#define UL_LDOMAIN (&ulogd_uloi)
+#else
+#include <ul_lib/ul_l_log.h>
+#define UL_LDOMAIN NULL
+#endif
+
+#define ULOI_DEB_OIDDES  1
+#define ULOI_DEB_AOIDDES 2
+int uloi_debug_flg=0;
+
+
+/* definitions of basic uLan OI functions */
+
+uloi_coninfo_t* uloi_open(char *ul_dev_name,int adr,int cmd,
+                       int bcmd, int timeout)
+{ uloi_coninfo_t *coninfo;
+  ul_msginfo msginfo;
+  ul_fd_t ul_fd;
+  if(!timeout) timeout=10;
+  if(!bcmd) bcmd=0x11;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) return NULL;
+  coninfo=malloc(sizeof(uloi_coninfo_t));
+  memset(coninfo,0,sizeof(uloi_coninfo_t));
+  if(coninfo) 
+  { memset(&msginfo,0,sizeof(ul_msginfo));
+    msginfo.sadr=adr;
+    msginfo.cmd=bcmd;
+    if(ul_addfilt(ul_fd,&msginfo)>=0)
+    { coninfo->ul_fd=ul_fd;
+      coninfo->adr=adr;
+      coninfo->cmd=cmd;
+      coninfo->bcmd=bcmd;
+      coninfo->timeout=timeout;
+      return coninfo;
+    }
+    free(coninfo);
+  }
+  ul_close(ul_fd);return NULL;
+};
+
+void uloi_close(uloi_coninfo_t *coninfo)
+{ ul_close(coninfo->ul_fd);
+  free(coninfo);
+}
+
+int uloi_transfer(uloi_coninfo_t *coninfo,
+                 uchar *bufin,int lenin,uchar **bufout,int *lenout)
+{ int ret;
+  uchar *buf;
+  ul_msginfo msginfo;
+  if(bufin&&lenin)
+  { bufin[0]=coninfo->bcmd;
+    bufin[1]=((++coninfo->sn)&0x3F)+0x40;
+    bufin[2]=coninfo->bsn;
+    ret=ul_send_command_wait(coninfo->ul_fd,coninfo->adr,coninfo->cmd,
+                            coninfo->outflg&~UL_BFL_TAIL,bufin,lenin);
+    if(ret<0) return ret;
+  }
+  if(bufout) while(1) 
+  { ret=ul_fd_wait(coninfo->ul_fd,coninfo->timeout);
+    if(ret<=0) return ret?ret:-1;
+    ret=ul_acceptmsg(coninfo->ul_fd,&msginfo);
+    if(ret<0) return ret;
+    if((msginfo.cmd!=coninfo->bcmd)
+     ||(msginfo.sadr!=coninfo->adr)
+     ||(msginfo.len<3))
+    { ul_freemsg(coninfo->ul_fd);
+      continue;
+    }
+    buf=malloc(msginfo.len);
+    ret=ul_read(coninfo->ul_fd,buf,msginfo.len);
+    ul_freemsg(coninfo->ul_fd);
+    if((buf[2]&0x3F)==(coninfo->sn&0x3F))
+    { coninfo->bsn=buf[1];
+      *bufout=buf;
+      *lenout=msginfo.len;
+      return 1;
+    }
+    free(buf);
+  };
+  return 0;
+}
+
+int uloi_set_var(uloi_coninfo_t *coninfo,int oid, void *val, int size)
+{ uchar *bufout=NULL;
+  uchar *bufin;
+  int lenout, lenin, ret;
+  lenin=3+2+size+4;
+  bufin=malloc(lenin);
+  if(!bufin) return -1;
+  bufin[3]=(uchar)oid;
+  bufin[4]=(uchar)(oid>>8);
+  memcpy(bufin+5,val,size);
+  bufin[5+size+0]=ULOI_RDRQ;
+  bufin[5+size+1]=0;
+  bufin[5+size+2]=0;
+  bufin[5+size+3]=0;
+  ret=uloi_transfer(coninfo,bufin,lenin,&bufout,&lenout);
+  free(bufin);
+  if(ret<=0) return -1;
+  if(bufout) free(bufout);
+  return 0;
+}
+
+int uloi_get_var(uloi_coninfo_t *coninfo,int oid, void *val, int size)
+{ uchar *bufout=NULL;
+  uchar *bufin;
+  int lenout, lenin, ret;
+  lenin=3+2+2+2;
+  bufin=malloc(lenin);
+  if(!bufin) return -1;
+  bufin[3]=ULOI_RDRQ;
+  bufin[4]=0;
+  bufin[5]=(uchar)oid;
+  bufin[6]=(uchar)(oid>>8);
+  bufin[7]=0;
+  bufin[8]=0;
+  ret=uloi_transfer(coninfo,bufin,lenin,&bufout,&lenout);
+  free(bufin);
+  if(ret<=0) return -1;
+  ret=-1;
+  if((bufout[3]==21)&&(bufout[4]==0)
+   &&(bufout[5]==(uchar)oid)&&(bufout[6]==(uchar)(oid>>8)))
+  {
+    memcpy(val,bufout+7,size);
+    ret=0;
+  }
+  if(bufout) free(bufout);
+  return ret;
+}
+
+int uloi_set_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned val)
+{ uchar buf[2];
+  buf[0]=(uchar)val;
+  buf[1]=(uchar)(val>>8);
+  return uloi_set_var(coninfo,oid,buf,2);
+}
+
+int uloi_get_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned *val)
+{ int ret;
+  uchar buf[2];
+  ret=uloi_get_var(coninfo,oid,buf,2);
+  if(ret>=0)
+    *val=buf[0]+(buf[1]<<8);
+  return ret;
+}
+
+int uloi_send_cmd(uloi_coninfo_t *coninfo,int oid)
+{ uchar buf[2];
+  return uloi_set_var(coninfo,oid,buf,0);
+}
+
+int uloi_get_oids(uloi_coninfo_t *coninfo,int list,int **oids_list)
+{ int *oids=NULL;
+  int at_once=64;
+  uchar bufin[9]={0,0,0,list,list>>8,0,0,at_once,at_once>>8};
+  int lenin=sizeof(bufin);
+  uchar *bufout=NULL;
+  int lenout;
+  int last_oid=0;
+  int oid_cnt=0;
+  int cnt,i;
+  uchar *p;
+  int ret;
+  do
+  { bufin[5]=last_oid;bufin[6]=last_oid>>8;
+    ret=uloi_transfer(coninfo,bufin,lenin,&bufout,&lenout);
+    if(ret<0) {if(oids!=NULL) free(oids);return -1;};
+    cnt=lenout-5-2;
+    if(cnt<=0) {if(oids!=NULL) free(oids);return -1;};
+    cnt/=2;
+    if(oids==NULL) oids=malloc((cnt+1)*sizeof(int));
+    else oids=realloc(oids,(oid_cnt+cnt+1)*sizeof(int));
+    p=bufout+5;
+    i=cnt;
+    if(last_oid)
+    { if(last_oid!=p[0]+p[1]*256)
+        {free(oids);free(bufout);return -1;};
+      p+=2; i--;
+    }
+    while(i--)
+    { last_oid=*(p++);
+      last_oid+=*(p++)*0x100;
+      if(!last_oid) break;
+      oids[oid_cnt++]=last_oid;
+    }
+    oids[oid_cnt]=0;
+    free(bufout);
+  }
+  while(cnt>=at_once);
+  *oids_list=oids;
+  return oid_cnt;
+}
+
+uchar *uloi_oiddespack_getloc(uchar *despack, int strindex)
+{
+  int remcnt;
+  uchar *p=despack;
+
+  if(!p) return NULL;
+  remcnt=*(p++);
+  while(strindex--){
+    if(*p+2>remcnt)
+      return NULL;
+    remcnt-=*p+1;
+    p+=*p+1;
+  }
+  if(*p+1>remcnt)
+    return NULL;
+
+  return p;
+}
+
+char *uloi_oiddespack_strdup(uchar *despack, int strindex)
+{
+  uchar *p;
+  int len;
+  char *str;
+
+  p=uloi_oiddespack_getloc(despack, strindex);
+  if(!p)
+    return NULL;
+
+  len=*(p++);
+
+  str=malloc(len+1);
+  if(!str)
+    return NULL;
+
+  memcpy(str,(char*)p,len);
+  str[len]=0;
+  return str;
+}
+
+int uloi_get_oiddes(uloi_coninfo_t *coninfo,int list, int oid, uchar **poiddespack)
+{ 
+  uchar bufin[9]={0,0,0,list,list>>8,oid,oid>>8,0,0};
+  int lenin=sizeof(bufin);
+  uchar *bufout=NULL;
+  int lenout;
+  int ret;
+  uchar *despack;
+
+  if(poiddespack)
+    *poiddespack=NULL;
+
+  ret=uloi_transfer(coninfo,bufin,lenin,&bufout,&lenout);
+
+  if(ret<0) return -1;
+  if(lenout<3+2+2+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply %d truncated (<8 bytes)\n",oid);
+    free(bufout);return -1;
+  }
+  if(bufout[3]+bufout[4]*0x100!=list+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply %d doesnot match list\n",oid);
+    free(bufout);return -1;
+  }
+  if(bufout[5]+bufout[6]*0x100!=oid) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply %d mitchmatch with oid %d\n",
+           oid,bufout[5]+bufout[6]);
+    free(bufout);return -1;
+  }
+  if(lenout-7<bufout[7]+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply %d truncated\n",oid);
+    free(bufout);return -1;
+  }
+
+  despack=bufout+7;
+
+  if(uloi_debug_flg&ULOI_DEB_OIDDES){
+    char *desname=uloi_oiddespack_strdup(despack,0);
+    char *destype=uloi_oiddespack_strdup(despack,1);
+    ul_log(UL_LDOMAIN,UL_LOGL_DEB,"got oiddes:  oid=%d  deslen=%d name=\"%s\" type=\"%s\"\n",
+           oid,despack[0],desname?desname:"",destype?destype:"");
+    if(desname) free(desname);
+    if(destype) free(destype);
+  }
+
+  if(poiddespack){
+    *poiddespack=malloc(despack[0]+1);
+    if(*poiddespack){
+      memcpy(*poiddespack,despack,despack[0]+1);
+    }else{
+      ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides malloc failed for reply %d\n",oid);  
+    }
+  }
+
+  free(bufout);
+  return 0;
+}
+
+int uloi_get_aoiddes(uloi_coninfo_t *coninfo,int list,char *aoid, uchar **poiddespack)
+{ 
+  uchar *bufin;
+  int lenin;
+  uchar *bufout=NULL;
+  int lenout;
+  int ret;
+  int oid;
+  int aoidlen;
+  uchar *despack;
+
+  if(poiddespack)
+    *poiddespack=NULL;
+
+  aoidlen=strlen(aoid);
+  if(aoidlen>100) return -1;
+  bufin=malloc(7+1+aoidlen+2);
+  bufin[3]=list;bufin[4]=list>>8;
+  bufin[5]=ULOI_AOID;bufin[6]=ULOI_AOID>>8;
+  bufin[7]=aoidlen;
+  memcpy(bufin+8,aoid,aoidlen);
+  bufin[7+1+aoidlen]=0;bufin[7+1+aoidlen+1]=0;
+  lenin=7+1+aoidlen+2;
+  ret=uloi_transfer(coninfo,bufin,lenin,&bufout,&lenout);
+  free(bufin);
+
+  if(ret<0) return -1;
+  if(lenout<3+2+2+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply for \"%s\" truncated (<8 bytes)\n",aoid);
+    free(bufout);return -1;
+  }
+  if(bufout[3]+bufout[4]*0x100!=list+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply for \"%s\" doesnot match list\n",aoid);
+    free(bufout);return -1;
+  }
+  
+  oid=bufout[5]+bufout[6]*0x100;
+
+  if(lenout-7<bufout[7]+1) {
+    ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides reply %d truncated\n",oid);
+    free(bufout);return -1;
+  }
+
+  despack=bufout+7;
+
+  if(uloi_debug_flg&ULOI_DEB_OIDDES){
+    char *desname=uloi_oiddespack_strdup(despack,0);
+    char *destype=uloi_oiddespack_strdup(despack,1);
+    ul_log(UL_LDOMAIN,UL_LOGL_DEB,"got oiddes:  oid=%d  deslen=%d name=\"%s\" type=\"%s\"\n",
+           oid,despack[0],desname?desname:"",destype?destype:"");
+    if(desname) free(desname);
+    if(destype) free(destype);
+  }
+
+  if(poiddespack){
+    *poiddespack=malloc(despack[0]+1);
+    if(*poiddespack){
+      memcpy(*poiddespack,despack,despack[0]+1);
+    }else{
+      ul_log(UL_LDOMAIN,UL_LOGL_ERR,"oides malloc failed for reply %d\n",oid);  
+    }
+  }
+
+  free(bufout);
+  return oid;
+}
+
+void uloi_cfree(void *p)
+{
+  if (p) free(p);
+}
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_l_oil.c b/ulan/host/ul_drv/ul_lib/ul_l_oil.c
new file mode 100644 (file)
index 0000000..36bc1a9
--- /dev/null
@@ -0,0 +1,3 @@
+#include <ul_log.h>
+
+ul_log_domain_t ulogd_uloi={0,"uloi",0};
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib.dsp b/ulan/host/ul_drv/ul_lib/ul_lib.dsp
new file mode 100644 (file)
index 0000000..3102a63
--- /dev/null
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="ul_lib" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=ul_lib - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_lib.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "ul_lib.mak" CFG="ul_lib - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "ul_lib - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "ul_lib - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "ul_lib - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "ul_lib - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /Ob0 /I ".." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "ul_lib - Win32 Release"\r
+# Name "ul_lib - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_l_drv.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_l_msg.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_l_oi.c\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=.\ul_drvdef.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\ulan.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Entries b/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Entries
new file mode 100644 (file)
index 0000000..da9cb1b
--- /dev/null
@@ -0,0 +1,7 @@
+/ul_drvdef.h/1.6/Mon Sep 17 14:40:16 2007//
+/ul_fd4dir.h/1.5/Fri Jul 21 01:44:07 2006//
+/ul_fd4indir.h/1.6/Mon Sep 17 14:40:16 2007//
+/ul_fddir.h/1.2/Mon Sep 17 14:40:16 2007//
+/ul_l_log.h/1.3/Thu Jul 27 23:59:33 2006//
+/ulan.h/1.7/Tue Jun  5 11:41:41 2007//
+D
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Repository b/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Repository
new file mode 100644 (file)
index 0000000..75a4e78
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/ul_lib/ul_lib
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Root b/ulan/host/ul_drv/ul_lib/ul_lib/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ul_drvdef.h b/ulan/host/ul_drv/ul_lib/ul_lib/ul_drvdef.h
new file mode 100644 (file)
index 0000000..1b34fe7
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************
+  uLan Communication - user visible definitions
+
+  ul_drvdef.h  - driver exported definitions and types to userspace
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#ifndef _UL_DRVDEF_H
+#define _UL_DRVDEF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined OMK_FOR_TARGET || defined OMK_FOR_USER || defined OMK_FOR_KERNEL
+  #include <ul_lib/ul_lib_config.h>
+#endif
+
+#ifndef _WIN32
+ #ifndef CONFIG_OC_UL_DRV_SYSLESS
+   #include <sys/ioctl.h>
+ #endif /* CONFIG_OC_UL_DRV_SYSLESS */
+#else /* _WIN32 */
+ #include <windows.h>
+ #include <winioctl.h>
+#endif /* _WIN32 */
+
+#ifndef uchar
+ #define uchar unsigned char
+#endif
+
+/* ul_mess_head flags definition defines proccessing 
+   of message or its frames stored in bll */
+#define UL_BFL_LOCK 0x8000     /* locked message is pointed only once */
+#define UL_BFL_MSST 0x4000      /* Message must be received by some proccess */
+#define UL_BFL_M2IN 0x2000      /* After succesfull proccessing move to proc_bll */
+#define UL_BFL_LNMM 0x1000      /* Length of received frame must match expected len */
+#define UL_BFL_FAIL 0x0800      /* Message cannot be proccessed - error */
+#define UL_BFL_TAIL 0x0400      /* Multiframe message continues by next bll block */
+#define UL_BFL_SND  0x0200      /* Send this frame */
+#define UL_BFL_REC  0x0100      /* Receive answer frame into this bll block */
+#define UL_BFL_VERL 0x0040      /* Verify free space in buffer of destination station */
+#define UL_BFL_NORE 0x0020      /* Do not try to repeat if error occurs */
+#define UL_BFL_REWA 0x0010      /* If error occurs do wait with retry */
+#define UL_BFL_PRQ  0x0002      /* Request imediate proccessing of frame by receiver station */
+#define UL_BFL_ARQ  0x0001      /* Request imediate acknowledge by receiving station */
+
+#define UL_BFL_PROC 0x0000      /* Flag used by ASM code version */
+
+/*******************************************************************/
+/* ioctl definitions */
+
+#ifdef _WIN32
+
+/* 32768-65535 are reserved for use by customers.*/
+#define FILE_DEVICE_ULAN  0x0000A000
+
+/* function codes 2048-4095 are reserved for customers. */
+#define UL_IOCTL_INDEX  0xA00
+
+#define UL_IO(function) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define UL_IOR(function,size) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define UL_IOW(function,size) \
+       CTL_CODE(FILE_DEVICE_ULAN,UL_IOCTL_INDEX+function,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#else /* _WIN32 */
+
+#define        UL_IOCTL        0x75
+
+#define UL_IO(function)        _IO(UL_IOCTL,function)
+#define UL_IOR(function,size)  _IOR(UL_IOCTL,function,size)
+#define UL_IOW(function,size)  _IOW(UL_IOCTL,function,size)
+
+#endif /* _WIN32 */
+
+#define UL_DRV_VER     UL_IO(0x10)
+#define UL_NEWMSG      UL_IOW(0x11,ul_msginfo)
+#define UL_TAILMSG     UL_IOW(0x12,ul_msginfo)
+#define UL_FREEMSG     UL_IO(0x13)
+#define UL_ACCEPTMSG   UL_IOR(0x14,ul_msginfo)
+#define UL_ACTAILMSG   UL_IOR(0x15,ul_msginfo)
+#define UL_ADDFILT     UL_IOW(0x16,ul_msginfo)
+#define UL_ABORTMSG    UL_IO(0x17)
+#define UL_REWMSG      UL_IO(0x18)
+#define UL_INEPOLL     UL_IO(0x19)
+#define UL_WAITREC     UL_IO(0x1A)
+#define UL_SETMYADR    UL_IO(0x1B)  /* arg = new station address */
+#define UL_SETIDSTR    UL_IO(0x1C)  /* arg = "C" string */
+#define UL_SETBAUDRATE UL_IO(0x1D)  /* arg = new baudrate */
+#define UL_KLOGBLL     UL_IO(0x41)
+#define UL_STROKE      UL_IO(0x42)
+#define UL_DEBFLG      UL_IO(0x43)  /* arg = new debug mask */
+#define UL_HWTEST      UL_IO(0x44)  /* arg = test subcommand */
+
+typedef struct ul_msginfo {
+       int     dadr;           /* destignation address */
+       int     sadr;           /* source address */
+       int     cmd;            /* command/socket number */
+       int     flg;            /* message flags */
+       int     len;            /* length of frame */
+       unsigned stamp;         /* unigue message number */
+} ul_msginfo;
+
+/*******************************************************************/
+/* command definitions */
+
+/* standard command codes 
+   00H .. 3FH    store to buffer 
+   40H .. 7FH    store to buffer without ACK
+   80H .. 9FH    proccess at onece
+   A0H .. BFH    process with additional receive
+   C0H .. FFH    process with additional send
+*/
+
+#define UL_CMD_RES     0x80    /* Reinitialize RS485 or connected module */
+#define UL_CMD_SFT     0x81    /* Test free space in input buffer */
+#define UL_CMD_SID     0xF0    /* Send identification */
+#define UL_CMD_SFI     0xF1    /* Send amount of free space in IB */
+#define UL_CMD_TF0     0x98    /* End of stepping */
+#define UL_CMD_TF1     0x99    /* Begin of stepping */
+#define UL_CMD_STP     0x9A    /* Do step */
+#define UL_CMD_DEB     0x9B    /* Additional debug commands */
+#define UL_CMD_SPC     0xDA    /* Send state - for 8051 PCL PCH PSW ACC */
+
+#define UL_CMD_RDM     0xF8    /* Read memory   T T B B L L */
+#define UL_CMD_WRM     0xB8    /* Write mamory  T T B B L L */
+#define UL_CMD_ERM      0x88    /* Erase memory T T B B L L */
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_DRVDEF_H */
+
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4dir.h b/ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4dir.h
new file mode 100644 (file)
index 0000000..5d50e01
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef _UL_FD_H
+#define _UL_FD_H
+
+/* The applications calls directly functions based above uLan driver API */
+
+#include <ul_lib/ul_fddir.h>
+
+#undef WITH_UL_FD_INDIRECT
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef ul_fd_direct_t ul_fd_t;
+#define UL_FD_INVALID UL_FD_DIRECT_INVALID
+
+static inline ul_fd_direct_t ul_fd2sys_fd(ul_fd_t fd)
+{
+  return fd;
+}
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_FD_H*/
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4indir.h b/ulan/host/ul_drv/ul_lib/ul_lib/ul_fd4indir.h
new file mode 100644 (file)
index 0000000..2cd465e
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef _UL_FD_H
+#define _UL_FD_H
+
+#define WITH_UL_FD_INDIRECT
+
+#include <stdint.h>
+#include <ul_lib/ul_fddir.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef UL_OFFSETOF
+/* offset of structure field */
+#define UL_OFFSETOF(_type,_member) \
+                ((int)&(((_type*)0)->_member))
+#endif /*UL_OFFSET*/
+
+#ifndef UL_CONTAINEROF
+#ifdef  __GNUC__
+#define UL_CONTAINEROF(_ptr, _type, _member) ({ \
+        const typeof( ((_type *)0)->_member ) *__mptr = (_ptr); \
+        (_type *)( (char *)__mptr - UL_OFFSETOF(_type,_member) );})
+#else /*!__GNUC__*/
+#define UL_CONTAINEROF(_ptr, _type, _member) \
+        ((_type *)( (char *)_ptr - UL_OFFSETOF(_type,_member)))
+#endif /*__GNUC__*/
+#endif /*UL_CONTAINEROF*/
+
+
+typedef struct ul_fd_context_t *ul_fd_t;
+#define UL_FD_INVALID (NULL)
+
+typedef struct ul_fd_ops_t {
+  const char *ops_name;
+  int (*ulop_namematch)(const char *dev_name);
+  ul_fd_t (*ulop_open)(const char *dev_name, const char *options);
+  int (*ulop_close)(ul_fd_t ul_fd);
+  int (*ulop_drv_version)(ul_fd_t ul_fd);
+  ssize_t (*ulop_read)(ul_fd_t ul_fd, void *buffer, size_t size);
+  ssize_t (*ulop_write)(ul_fd_t ul_fd, const void *buffer, size_t size);
+  int (*ulop_newmsg)(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+  int (*ulop_tailmsg)(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+  int (*ulop_freemsg)(ul_fd_t ul_fd);
+  int (*ulop_acceptmsg)(ul_fd_t ul_fd,ul_msginfo *msginfo);
+  int (*ulop_actailmsg)(ul_fd_t ul_fd,ul_msginfo *msginfo);
+  int (*ulop_addfilt)(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+  int (*ulop_abortmsg)(ul_fd_t ul_fd);
+  int (*ulop_rewmsg)(ul_fd_t ul_fd);
+  int (*ulop_inepoll)(ul_fd_t ul_fd);
+  int (*ulop_drv_debflg)(ul_fd_t ul_fd,int debug_msk);
+  int (*ulop_fd_wait)(ul_fd_t ul_fd, int wait_sec);
+  ul_fd_direct_t (*ulop_fd2sys_fd)(ul_fd_t ul_fd);
+  int (*ulop_setmyadr)(ul_fd_t ul_fd, int newmyadr);
+  int (*ulop_setidstr)(ul_fd_t ul_fd, const char *idstr);
+  int (*ulop_setbaudrate)(ul_fd_t ul_fd, int baudrate);
+} ul_fd_ops_t;
+
+typedef struct ul_fd_context_t {
+  ul_fd_ops_t *fd_ops;
+} ul_fd_context_t;
+
+int ul_fd_ops_register(ul_fd_ops_t *fd_ops);
+inline ul_fd_direct_t ul_fd2sys_fd(ul_fd_t fd);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_FD_H*/
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ul_fddir.h b/ulan/host/ul_drv/ul_lib/ul_lib/ul_fddir.h
new file mode 100644 (file)
index 0000000..27726f2
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef _UL_FDDIR_H
+#define _UL_FDDIR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WIN32
+
+ #define UL_DEV_NAME "\\\\.\\UL_DRV"
+
+ typedef HANDLE ul_fd_direct_t;
+
+ #define UL_FD_DIRECT_INVALID INVALID_HANDLE_VALUE
+ typedef long ssize_t;
+
+ #define WITHOUT_SYS_SELECT
+ #define HAS_GETOPT_LONG
+
+ #ifdef WITH_UL_FD_INDIRECT
+ #define WIN32_FILE_OVERLAPPED
+ #endif /* WITH_UL_FD_INDIRECT */
+ #if defined(WIN32_FILE_OVERLAPPED)&&!defined(WITH_UL_FD_INDIRECT)
+   #error to enable WIN32_FILE_OVERLAPPED operation is neccessary compile sources with flag WITH_UL_FD_INDIRECT
+ #endif
+
+#elif defined(__DJGPP__)
+
+ #define UL_DEV_NAME "1"
+
+ struct ul_opdata;
+ typedef struct ul_opdata *ul_fd_direct_t;
+ #define UL_FD_DIRECT_INVALID (NULL)
+
+ #define WITHOUT_SYS_SELECT
+ #define UL_DRV_IN_LIB
+
+#else /* !_WIN32 && !__DJGPP__ */
+
+ #define UL_DEV_NAME "/dev/ulan"
+
+ typedef int ul_fd_direct_t;
+
+ #define UL_FD_DIRECT_INVALID (-1)
+
+ #ifndef CONFIG_OC_UL_DRV_SYSLESS
+   #define HAS_GETDELIM
+   #define HAS_GETOPT_LONG
+ #else
+   #define UL_DRV_IN_LIB
+ #endif /* CONFIG_OC_UL_DRV_SYSLESS */
+
+#endif /* _WIN32 */
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /*_UL_FDDIR_H*/
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ul_l_log.h b/ulan/host/ul_drv/ul_lib/ul_lib/ul_l_log.h
new file mode 100644 (file)
index 0000000..e2305a7
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef _UL_L_LOG_H
+#define _UL_L_LOG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* debugging support routines */
+int uloi_debug_flg;
+
+#ifndef UL_LOGL_FATAL
+
+#define UL_LOGL_MASK (0xff)
+#define UL_LOGL_CONT (0x1000)
+
+#define UL_LOGL_FATAL   1
+#define UL_LOGL_ERR     2
+#define UL_LOGL_MSG     3
+#define UL_LOGL_INF     4
+#define UL_LOGL_DEB     5
+#define UL_LOGL_TRASH   6
+
+#endif /*UL_LOGL_FATAL*/
+
+struct ul_log_domain;
+
+typedef void (ul_log_fnc_t)(struct ul_log_domain *domain, int level,
+       const char *format, va_list ap);
+
+void ul_log(struct ul_log_domain *domain, int level,
+       const char *format, ...) UL_ATTR_PRINTF (3, 4);
+
+void ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_L_LOG_H */
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_lib/ulan.h b/ulan/host/ul_drv/ul_lib/ul_lib/ulan.h
new file mode 100644 (file)
index 0000000..60bc8f6
--- /dev/null
@@ -0,0 +1,156 @@
+#ifndef _ULAN_H
+#define _ULAN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdarg.h>
+#include <sys/types.h>
+#include <ul_lib/ul_drvdef.h>
+#include <ul_lib/ul_fd.h>
+
+/* GNUC neat features */
+
+#ifdef __GNUC__
+#ifndef UL_ATTR_UNUSED
+#define UL_ATTR_PRINTF( format_idx, arg_idx )  \
+  __attribute__((format (printf, format_idx, arg_idx)))
+#define UL_ATTR_SCANF( format_idx, arg_idx )   \
+  __attribute__((format (scanf, format_idx, arg_idx)))
+#define UL_ATTR_FORMAT( arg_idx )              \
+  __attribute__((format_arg (arg_idx)))
+#define UL_ATTR_NORETURN                       \
+  __attribute__((noreturn))
+#define UL_ATTR_CONST                          \
+  __attribute__((const))
+#define        UL_ATTR_UNUSED                          \
+  __attribute__((unused))
+#endif  /*UL_ATTR_UNUSED*/
+#else  /* !__GNUC__ */
+#ifndef UL_ATTR_UNUSED
+#define UL_ATTR_PRINTF( format_idx, arg_idx )
+#define UL_ATTR_SCANF( format_idx, arg_idx )
+#define UL_ATTR_FORMAT( arg_idx )
+#define UL_ATTR_NORETURN
+#define UL_ATTR_CONST
+#define        UL_ATTR_UNUSED
+#endif  /*UL_ATTR_UNUSED*/
+#endif /* !__GNUC__ */
+
+/* driver interface */
+
+ul_fd_t        ul_open(const char *dev_name, const char *options);
+int    ul_close(ul_fd_t ul_fd);
+int    ul_drv_version(ul_fd_t ul_fd);
+ssize_t        ul_read(ul_fd_t ul_fd, void *buffer, size_t size);
+ssize_t        ul_write(ul_fd_t ul_fd, const void *buffer, size_t size);
+int    ul_newmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+int    ul_tailmsg(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+int    ul_freemsg(ul_fd_t ul_fd);
+int    ul_acceptmsg(ul_fd_t ul_fd,ul_msginfo *msginfo);
+int    ul_actailmsg(ul_fd_t ul_fd,ul_msginfo *msginfo);
+int    ul_addfilt(ul_fd_t ul_fd,const ul_msginfo *msginfo);
+int    ul_abortmsg(ul_fd_t ul_fd);
+int    ul_rewmsg(ul_fd_t ul_fd);
+int    ul_inepoll(ul_fd_t ul_fd);
+int    ul_drv_debflg(ul_fd_t ul_fd,int debug_msk);
+int    ul_fd_wait(ul_fd_t ul_fd, int wait_sec);
+int    ul_setmyadr(ul_fd_t ul_fd, int newadr);
+int    ul_setidstr(ul_fd_t ul_fd, const char *idstr);
+int    ul_setbaudrate(ul_fd_t ul_fd, int baudrate);
+int    ul_stroke(ul_fd_t ul_fd);
+
+/* simple message operations */
+
+int ul_send_command(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                    const void *buf,int len);
+int ul_send_command_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                         const void *buf,int len);
+int ul_send_query(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                  const void *buf,int len);
+int ul_send_query_wait(ul_fd_t ul_fd,int dadr,int cmd,int flg,
+                      const void *bufin,int lenin,void **bufout,int *lenout);
+
+/* basic uLan commands/services */
+
+#define UL_CMD_OISV    0x10    /* Object Interface Service */
+#define UL_CMD_LCDABS  0x4f    /* Absorbance data block */
+#define UL_CMD_LCDMRK  0x4e    /* Mark */
+#define UL_CMD_NCS     0x7f    /* Network Control Service */
+#define UL_CMD_GST     0xc1    /* Fast module get status */
+
+/* definitions of basic uLan OI commands */
+
+#define ULOI_AOID   10 /* name is defined in ASCII for DOIx */
+#define ULOI_DOII   12 /* description of input objects */
+#define ULOI_DOIO   14 /* description of output objects */
+#define ULOI_QOII   16 /* ID numbers of recognized input objects */
+#define ULOI_QOIO   18 /* ID numbers of recognized output objects */
+#define ULOI_RDRQ   20 /* object values read request */
+#define ULOI_STATUS 30 /* read instrument status */
+#define ULOI_ERRCLR 31 /* clear error status */
+
+typedef struct uloi_coninfo_t {
+  int adr;     /* address of target module */
+  int cmd;     /* service/cmd number for uLOI on target */
+  int bcmd;    /* service/cmd number for returned messages */
+  int sn;      /* sequence counter */
+  int bsn;     /* sequence counter of target module */
+  int outflg;  /* flags used for outgoing messages */
+  ul_fd_t ul_fd;/* handle for ul_drv */
+  ul_fd_t ul_fd1;/* the auxiliary handle for ULOI direct reply */
+  int timeout; /* timeout */
+  int error;   /* error condition occurred */
+  int state;   /* internal state */
+} uloi_coninfo_t;
+
+/* definitions of basic uLan OI functions */
+
+uloi_coninfo_t* uloi_open(char *ul_dev_name,int adr,int cmd,
+                       int bcmd, int timeout);
+void uloi_close(uloi_coninfo_t *coninfo);
+int uloi_transfer(uloi_coninfo_t *coninfo,
+                 uchar *bufin,int lenin,uchar **bufout,int *lenout);
+int uloi_set_var(uloi_coninfo_t *coninfo,int oid, void *val, int size);
+int uloi_get_var(uloi_coninfo_t *coninfo,int oid, void *val, int size);
+int uloi_set_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned val);
+int uloi_get_var_u2(uloi_coninfo_t *coninfo,int oid,unsigned *val);
+int uloi_send_cmd(uloi_coninfo_t *coninfo,int oid);
+int uloi_get_oids(uloi_coninfo_t *coninfo,int list,int **oids_list);
+int uloi_get_oiddes(uloi_coninfo_t *coninfo,int list, int oid, uchar **poiddespack);
+int uloi_get_aoiddes(uloi_coninfo_t *coninfo,int list,char *aoid, uchar **poiddespack);
+uchar *uloi_oiddespack_getloc(uchar *despack, int strindex);
+char *uloi_oiddespack_strdup(uchar *despack, int strindex);
+
+/* UL_CMD_NCS  Network Control Service */
+
+#define ULNCS_ADR_RQ   0xC0    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_SET_ADDR 0xC1    /* SN0 SN1 SN2 SN3 NEW_ADR */
+#define ULNCS_SID_RQ   0xC2    /* send serial num and ID string request */
+#define ULNCS_SID_RPLY 0xC3    /* SN0 SN1 SN2 SN3 ID ... */
+#define ULNCS_ADDR_NVSV        0xC4    /* SN0 SN1 SN2 SN3 - save addres to EEPROM */
+#define ULNCS_BOOT_ACT  0xC5    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_BOOT_ACK  0xC6    /* SN0 SN1 SN2 SN3 */
+#define ULNCS_SET_SN    0xE0    /* SN0 SN1 SN2 SN3 */
+
+/* UL_CMD_RES  Reinitialize RS485 or connected module */
+
+#define ULRES_LINK      0x10
+#define ULRES_BAUD      0x12
+#define ULRES_CPU       0x21    /* password - default 0x55 0xAA */
+
+#if 0
+  #define  read                error_to_use_read
+  #define  write       error_to_use_write
+  #define  open                error_to_use_open
+  #define  close       error_to_use_close
+  #define  ioctl       error_to_use_ioctl
+#endif
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _ULAN_H */
+
diff --git a/ulan/host/ul_drv/ul_lib/ul_msg_buf.c b/ulan/host/ul_drv/ul_lib/ul_msg_buf.c
new file mode 100644 (file)
index 0000000..2993044
--- /dev/null
@@ -0,0 +1,95 @@
+#include <stdlib.h>
+#include <string.h>
+#include <ul_msg_buf.h>
+
+int
+ul_msg_buf_init(ul_msg_buf_t *buf)
+{
+  memset(buf,0,sizeof(ul_msg_buf_t));
+  ul_dbuff_init(&buf->data, 0);
+  return 0;
+}
+
+void
+ul_msg_buf_destroy(ul_msg_buf_t *buf)
+{
+  ul_msg_buf_t *tail;
+  buf->msginfo.len=0;
+  buf->msginfo.flg=0;
+  ul_dbuff_destroy(&buf->data);
+  tail=buf->tail;
+  buf->tail=0;
+  while(tail){
+    buf=tail;
+    tail=buf->tail;
+    ul_dbuff_destroy(&buf->data);
+    free(buf);
+  }
+}
+
+int
+ul_msg_buf_rd_data(ul_msg_buf_t *buf, ul_fd_t ul_fd)
+{
+  ssize_t len, rd_len;
+  len=buf->msginfo.len;
+  if (ul_dbuff_prep(&buf->data,len)<len)
+    return -1;
+  if(!len) return 0;
+  rd_len=ul_read(ul_fd,buf->data.data, len);
+  if(rd_len!=len) return -1;
+  return rd_len;
+}
+
+int
+ul_msg_buf_rd_rest(ul_msg_buf_t *buf, ul_fd_t ul_fd)
+{
+  int frames=0;
+  ul_msg_buf_t *tail;
+  do{
+    if(buf->msginfo.len)
+      if(ul_msg_buf_rd_data(buf,ul_fd)<0)
+        break;
+    frames++;
+    if(!(buf->msginfo.flg&UL_BFL_TAIL)){
+      ul_freemsg(ul_fd);
+      return frames;
+    }
+    if(!(tail=malloc(sizeof(ul_msg_buf_t))))
+      break;
+    ul_msg_buf_init(tail);
+    if(ul_actailmsg(ul_fd,&tail->msginfo)<0)
+    {
+      ul_msg_buf_destroy(tail);
+      free(tail);
+      break;
+    }
+    buf->tail=tail;
+    buf=tail;
+  }while(1);
+  ul_freemsg(ul_fd);
+  return -1;
+}
+
+int
+ul_msg_buf_wr(ul_msg_buf_t *buf, ul_fd_t ul_fd)
+{
+  int l;
+  if (!buf) return -1;
+  l=buf->msginfo.len;
+  buf->msginfo.len=0;
+  if (ul_newmsg(ul_fd,&buf->msginfo)<0) return -1;
+  do{
+    if (ul_write(ul_fd,buf->data.data,l)!=l) 
+      break;
+    if(!(buf->msginfo.flg&UL_BFL_TAIL)){
+      return ul_freemsg(ul_fd);
+    }
+    buf=buf->tail;
+    l=buf->msginfo.len;
+    buf->msginfo.len=0;
+    if(ul_tailmsg(ul_fd,&buf->msginfo)<0)
+      break;
+  }while(1);
+  ul_abortmsg(ul_fd);
+  return -1;
+}
diff --git a/ulan/host/ul_drv/ul_lib/ul_msg_buf.h b/ulan/host/ul_drv/ul_lib/ul_msg_buf.h
new file mode 100644 (file)
index 0000000..9d73b0e
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************
+  uLan Communication - C interface library
+
+  ul_netbase.c - basic network and module constructions
+
+  (C) Copyright 2001 by Pavel Pisa - Originator
+
+  (C) Copyright 2002-2004 by Pavel Pisa - Originator
+
+  The uLan C interface library can be used, copied and modified
+  under next licenses
+    - GPL - GNU General Public License
+    - LGPL - GNU Lesser General Public License
+    - MPL - Mozilla Public License
+    - and other licenses added by project originators
+  Code can be modified and re-distributed under any combination
+  of the above listed licenses. If contributor does not agree with
+  some of the licenses, he/she can delete appropriate line.
+  Warning, if you delete all lines, you are not allowed to
+  distribute source code and/or binaries utilizing code.
+  
+  See files COPYING and README for details.
+
+ *******************************************************************/
+
+#ifndef _UL_MSG_BUF_H
+#define _UL_MSG_BUF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ul_lib/ulan.h>
+#include <ul_dbuff.h>
+
+
+typedef struct ul_msg_buf{     /* buffer to hold full message taken from driver */
+  ul_msginfo msginfo;          /* dadr, sadr, cmd, flg, len, stamp */
+  ul_dbuff_t  data;            /* message data */
+  struct ul_msg_buf *tail;     /* optional tail message */
+} ul_msg_buf_t;
+
+
+int ul_msg_buf_init(ul_msg_buf_t *buf);
+void ul_msg_buf_destroy(ul_msg_buf_t *buf);
+int ul_msg_buf_rd_data(ul_msg_buf_t *buf, ul_fd_t ul_fd);
+int ul_msg_buf_rd_rest(ul_msg_buf_t *buf, ul_fd_t ul_fd);
+int ul_msg_buf_wr(ul_msg_buf_t *buf, ul_fd_t ul_fd);
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+
+#endif /* _UL_MSG_BUF_H */
diff --git a/ulan/host/ul_drv/utils/.cvsignore b/ulan/host/ul_drv/utils/.cvsignore
new file mode 100644 (file)
index 0000000..282522d
--- /dev/null
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/ulan/host/ul_drv/utils/CVS/Entries b/ulan/host/ul_drv/utils/CVS/Entries
new file mode 100644 (file)
index 0000000..b68f3a4
--- /dev/null
@@ -0,0 +1,14 @@
+/.cvsignore/1.2/Wed Sep 22 22:13:12 2004//
+/Makefile.omk/1.5/Sun Nov 11 18:35:39 2007//
+/Makefile.std/1.2/Sun Oct 29 12:21:41 2006//
+/README/1.1.1.1/Fri Sep 10 17:46:40 2004//
+/ul_buftst.c/1.3/Tue Sep 18 10:41:59 2007//
+/ul_dynewsn.c/1.1/Thu Oct 20 12:50:37 2005//
+/ul_dysn.c/1.4/Tue Sep 18 10:41:59 2007//
+/ul_lcabsp.c/1.6/Tue Sep 18 10:41:59 2007//
+/ul_lcscan.c/1.9/Tue Sep 18 10:41:59 2007//
+/ul_sendhex.c/1.12/Wed Jan 17 23:38:06 2007//
+/ul_sendmsg.c/1.3/Sat Oct 29 22:40:15 2005//
+/ul_spy.c/1.7/Sun Nov 11 18:35:39 2007//
+/ulc_tst.c/1.1.1.1/Fri Sep 10 17:46:40 2004//
+D
diff --git a/ulan/host/ul_drv/utils/CVS/Repository b/ulan/host/ul_drv/utils/CVS/Repository
new file mode 100644 (file)
index 0000000..61fcc9c
--- /dev/null
@@ -0,0 +1 @@
+ulan/host/ul_drv/utils
diff --git a/ulan/host/ul_drv/utils/CVS/Root b/ulan/host/ul_drv/utils/CVS/Root
new file mode 100644 (file)
index 0000000..bfb4bda
--- /dev/null
@@ -0,0 +1 @@
+:pserver:anonymous@ulan.cvs.sourceforge.net:/cvsroot/ulan
diff --git a/ulan/host/ul_drv/utils/Makefile.omk b/ulan/host/ul_drv/utils/Makefile.omk
new file mode 100644 (file)
index 0000000..52c804b
--- /dev/null
@@ -0,0 +1,31 @@
+lib_LOADLIBES += ulan
+ifeq ($(CONFIG_OC_ULUT),y)
+lib_LOADLIBES += ulut
+endif
+ifeq ($(CONFIG_UL_FD_ETH),y)
+  ifeq ($(TARGET_OS),win32)
+    lib_LOADLIBES += ws2_32
+  endif
+endif
+
+bin_PROGRAMS = ul_sendhex ul_lcscan ul_spy ul_lcabsp ul_sendmsg ul_dysn
+
+ul_sendhex_SOURCES = ul_sendhex.c
+ul_lcscan_SOURCES = ul_lcscan.c
+ul_spy_SOURCES = ul_spy.c
+ul_lcabsp_SOURCES = ul_lcabsp.c
+ul_sendmsg_SOURCES = ul_sendmsg.c
+ul_dysn_SOURCES = ul_dysn.c ul_dynewsn.c
+
+ul_buftst_SOURCES = ul_buftst.c
+
+ifneq ($(CONFIG_UL_FD_INDIRECT),y)
+bin_PROGRAMS += ul_buftst
+endif
+
+#lib_LIBRARIES =
+#shared_LIBRARIES =
+#include_HEADERS  = 
+#include_nobase_HEADERS  = 
+#utils_PROGRAMS =
+
diff --git a/ulan/host/ul_drv/utils/Makefile.std b/ulan/host/ul_drv/utils/Makefile.std
new file mode 100644 (file)
index 0000000..44a0c73
--- /dev/null
@@ -0,0 +1,64 @@
+CC=gcc
+
+# enable next for WinNT target
+# OS=Windows_NT
+
+# enable next for DJGPP target
+# DJGPP = 1
+
+ifdef DJGPP
+CFLAGS += -I../config/djgpp
+#  LOADLIBES += -liberty
+#
+else
+ifeq ($(OS),Windows_NT)
+#enable next for WinNT target
+CFLAGS += -I../config/winnt
+LOADLIBES += -liberty 
+endif
+endif
+
+CFLAGS += -Wall -Wstrict-prototypes 
+CFLAGS += -O2
+CFLAGS += -I. -I.. -I../ul_lib
+CFLAGS += -ggdb
+
+LDFLAGS += -L../ul_lib
+LOADLIBES += -lulan
+LIBDEPS += ../ul_lib/libulan.a
+
+TARGETS=ul_sendhex ul_lcscan ul_spy ul_lcabsp ul_buftst ul_sendmsg
+
+all :  default
+
+default : $(TARGETS)
+
+ul_buftst : ul_buftst.o $(LIBDEPS)
+
+ul_sendhex : ul_sendhex.o $(LIBDEPS)
+
+ul_spy : ul_spy.o $(LIBDEPS)
+
+ul_lcabsp : ul_lcabsp.o $(LIBDEPS)
+
+ul_lcscan : ul_lcscan.o $(LIBDEPS)
+
+.SUFFIXES: .i .s
+%.c : %.i
+       $(CC) -E $(CFLAGS) $< >$@
+
+%.c : %.s
+       $(CC) -S $(CFLAGS) $<
+
+dep:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M *.c $(MORE_C_FILES) > depend
+
+depend:
+       @touch depend
+
+clean :
+       rm -f *.o *~ ulc_tst ul_sendhex ul_spy ul_lcabsp ul_lcscan ul_buftst \
+           ul_sendmsg *.exe depend
+
+-include depend
+
diff --git a/ulan/host/ul_drv/utils/README b/ulan/host/ul_drv/utils/README
new file mode 100644 (file)
index 0000000..d097267
--- /dev/null
@@ -0,0 +1,57 @@
+There are located simple applications, which can be used
+as start for larger projects.
+
+  ul_spy       - uLan message monitor
+  ul_sendhex   - intelhex downloader and uploader
+  ul_lcabsp    - pasive receive and show absorbancy 
+                 send by LCD5000
+
+Basic parameters are common to all these programs 
+
+  -d, --uldev  <name>      name of uLan device [/dev/ulan]
+  -m, --module <num>       messages from/to module
+  -p, --print  <max>       print modules to max address
+      --debug-kernel <m>   flags to debug kernel
+  -V, --version            show version
+  -h, --help               this usage screen
+
+Other parameters are program specific.
+
+    ul_spy
+    ======
+
+Additional parameters of ul_spy enable to select filter
+for specific messages. If module is specified, only messages
+send to/from this module are printed. Next options can be used
+to more restrict printed messages.
+
+  -s, --source <num>       source of messages
+  -t, --target <num>       destination of messages
+  -c, --command <num>      commands of printed messages
+
+Data of message body are not normaly printed.
+
+  -a, --all-data           show all messages data
+
+ul_spy prints messages frames in next format optionally followed
+by frame body data. Pritnt of following frames of multi-frame 
+messages start with state written in lower case characters.
+
+  <state> (s:<saddr>,d:<daddr>,c:<cmd>,f:<flg>,l:<len>)
+
+The state can be REC, PROC or FAIL.
+
+    ul_sendhex
+    ==========
+
+This program enables to download Intel HEX files into
+target module.
+
+usage: ul_sendhex <parameters> <hex_file>
+
+  -t, --type   <num>       target module memory space
+  -s, --start  <addr>      start address of transfer
+  -l, --length <num>       length of upload block
+  -g, --go     <addr>      start program from address
+  -r, --reset              reset before download
+  -u, --upload             upload memory block [download]
diff --git a/ulan/host/ul_drv/utils/ul_buftst.c b/ulan/host/ul_drv/utils/ul_buftst.c
new file mode 100644 (file)
index 0000000..236dbfe
--- /dev/null
@@ -0,0 +1,256 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_buftst.c  - check of driver interface
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <ul_lib/ulan.h>
+
+#ifdef _WIN32
+#define sleep Sleep
+#endif
+
+#if !defined(_WIN32)
+
+int ul_bt_klogbll(ul_fd_t ul_fd)
+{
+  return  ioctl(ul_fd,UL_KLOGBLL);
+}
+
+int ul_bt_stroke(ul_fd_t ul_fd)
+{
+  return  ioctl(ul_fd,UL_STROKE);
+}
+
+int ul_bt_hwtest(ul_fd_t ul_fd, long arg)
+{
+  return  ioctl(ul_fd,UL_HWTEST,arg);
+}
+
+#else /* _WIN32 */
+
+int ul_bt_klogbll(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  if(!DeviceIoControl(ul_fd,UL_KLOGBLL,
+                 NULL,0,NULL,0,
+                 &bytes_ret,NULL)) return -1;
+  return 0;
+}
+
+int ul_bt_stroke(ul_fd_t ul_fd)
+{
+  DWORD bytes_ret;
+  if(!DeviceIoControl(ul_fd,UL_STROKE,
+                 NULL,0,NULL,0,
+                 &bytes_ret,NULL)) return -1;
+  return 0;
+}
+
+ul_bt_hwtest(ul_fd_t ul_fd, long arg)
+{
+  DWORD bytes_ret;
+  DWORD ret;
+  if(!DeviceIoControl(ul_fd,UL_HWTEST,
+                 &arg,sizeof(arg),
+                 &ret,sizeof(ret),
+                 &bytes_ret,NULL)) return -1;
+  if(!bytes_ret) ret=0;
+  return ret;
+}
+
+#endif /* _WIN32 */
+
+
+char *ul_dev_name = UL_DEV_NAME;
+
+int test1(void)
+{
+  uchar ch;
+  ul_fd_t ul_fd;
+  int i;
+  ul_msginfo msginfo;
+  uchar buf1[40]={1,2,3,4,5,6,7,8,9,10};
+  uchar buf2[40]={11,12,13,14,15,16,17,18,19,20};
+
+  printf("\n\n*** Simple message send test with read, write and lseek ***\n");
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID){ 
+    perror("test1 : uLan open failed");return -1;
+  };
+
+  ul_write(ul_fd,buf2,4);
+  perror("test1 : ul_write ");
+
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.dadr=3; msginfo.cmd=10;
+  ul_newmsg(ul_fd,&msginfo);
+
+  ul_write(ul_fd,buf1,10);
+  lseek(ul_fd,100,SEEK_SET);
+  ul_write(ul_fd,buf2,10);
+  memset(buf1,0,sizeof(buf1));
+  memset(buf2,0,sizeof(buf1));
+  lseek(ul_fd,4,SEEK_SET);
+  printf("data from pos 4\n");
+  for(i=0;i<20;i++) {ul_read(ul_fd,&ch,1); printf(" %d",ch);}
+  printf("\n");
+
+  lseek(ul_fd,100,SEEK_SET);
+  printf("data from pos 100\n");
+  for(i=0;i<20;i++) {if(ul_read(ul_fd,&ch,1)<=0) break; printf(" %d",ch);}
+  printf("\n");
+
+  ul_freemsg(ul_fd);
+
+  ul_bt_stroke(ul_fd);
+
+  sleep(5);
+
+  ul_bt_klogbll(ul_fd);
+
+  ul_close(ul_fd);
+  return 0;
+}
+
+int test2(void)
+{
+  ul_fd_t ul_fd;
+  int ret;
+  ul_msginfo msginfo;
+  uchar buf[0x40];
+  printf("\n\n*** Tailed processed mesage test ***\n");
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID){ 
+    perror("test2 : uLan open failed");return -1;
+  };
+
+  printf("preparing first part\n");
+  msginfo.dadr=3;
+  msginfo.cmd=UL_CMD_RDM;
+  msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN;
+  ul_newmsg(ul_fd,&msginfo);
+  buf[0]=(uchar)2;     buf[1]=2>>8;
+  buf[2]=(uchar)0x8800;        buf[3]=0x8800>>8;
+  buf[4]=(uchar)0x40;  buf[5]=0x40>>8;
+  if(ul_write(ul_fd,buf,6)!=6)
+    perror("test2 : ul_write ");
+
+  if(0)
+  {
+    int i;
+    uchar ch;
+    lseek(ul_fd,0,SEEK_SET);
+    printf("data from pos 0\n");
+    for(i=0;i<20;i++) {if(ul_read(ul_fd,&ch,1)<=0) break; printf(" %d",ch);}
+    printf("\n");
+  };
+
+  printf("preparing second part\n");
+  msginfo.dadr=3;
+  msginfo.cmd=UL_CMD_RDM&0x7F;
+  msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN;
+  msginfo.len=0x40;
+  ul_tailmsg(ul_fd,&msginfo);
+
+  ul_freemsg(ul_fd);
+
+  ul_bt_klogbll(ul_fd);
+
+  ul_bt_stroke(ul_fd);
+
+
+  printf("Sending tailed message an waiting for input\n");
+
+  ret=ul_fd_wait(ul_fd, 10);
+
+  printf("ul_fd_wait returned %d\n",ret);
+
+  memset(&msginfo,0,sizeof(msginfo));
+  ret=ul_acceptmsg(ul_fd,&msginfo);
+
+  printf("accept message returned %d\n",ret);
+  printf("  flg=0x%X, dadr=%d, sadr=%d, cmd=%d, len=%d, stamp=%d\n",
+           msginfo.flg,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+           msginfo.len,msginfo.stamp);
+  memset(&msginfo,0,sizeof(msginfo));
+  ret=ul_actailmsg(ul_fd,&msginfo);
+  printf("accept tail returned %d\n",ret);
+  printf("  flg=0x%X, dadr=%d, sadr=%d, cmd=%d, len=%d, stamp=%d\n",
+           msginfo.flg,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+           msginfo.len,msginfo.stamp);
+
+  ul_close(ul_fd);
+
+  return 0;
+}
+
+int test3(void)
+{
+  ul_fd_t ul_fd;
+  int ret;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID){ 
+    perror("test3 : uLan open failed");return -1;
+  };
+
+  ret=ul_bt_hwtest(ul_fd, 0x12);
+  printf("get msr/lsr %06X\n",ret);
+  ret=ul_bt_hwtest(ul_fd, 0x10);
+  printf("set break   %06X\n",ret);
+  sleep(2);
+  ret=ul_bt_hwtest(ul_fd, 0x12);
+  printf("get msr/lsr %06X\n",ret);
+  ret=ul_bt_hwtest(ul_fd, 0x13);
+  printf("set tx off  %06X\n",ret);
+  sleep(2);
+  ret=ul_bt_hwtest(ul_fd, 0x12);
+  printf("get msr/lsr %06X\n",ret);
+  ret=ul_bt_hwtest(ul_fd, 0x11);
+  printf("set one     %06X\n",ret);
+  sleep(2);
+  ret=ul_bt_hwtest(ul_fd, 0x12);
+  printf("get msr/lsr %06X\n",ret);
+  sleep(2);
+  ret=ul_bt_hwtest(ul_fd, 0x13);
+  printf("set tx off  %06X\n",ret);
+  sleep(2);
+  ret=ul_bt_hwtest(ul_fd, 0x12);
+  printf("get msr/lsr %06X\n",ret);
+
+  ul_close(ul_fd);
+  return 0;
+}
+
+
+int main(int argc,char *argv[])
+{
+
+  if(argc>=2)
+    ul_dev_name=argv[1];
+  /* test1(); */
+  /* test2(); */
+  test3();
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_dynewsn.c b/ulan/host/ul_drv/utils/ul_dynewsn.c
new file mode 100644 (file)
index 0000000..3b8e970
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_lcscan.c  - procceed wavelength scanning with LCD5000
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <ul_lib/ulan.h>
+
+extern char *ul_dev_name;
+
+int set_new_sn(int module,unsigned long new_sn)
+{ 
+  int ret;
+  ul_fd_t ul_fd;
+  uchar buf_out[10];
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("set_new_sn : uLan open failed");return -1;};
+  buf_out[0]=ULNCS_SET_SN;     /* SN0 SN1 SN2 SN3 */
+  buf_out[1]=new_sn>>0;
+  buf_out[2]=new_sn>>8;
+  buf_out[3]=new_sn>>16;
+  buf_out[4]=new_sn>>24;
+  ret=ul_send_command(ul_fd,module,UL_CMD_NCS,
+                     module?UL_BFL_ARQ:0,buf_out,5);
+  ul_close(ul_fd);
+  return ret;
+}
+
diff --git a/ulan/host/ul_drv/utils/ul_dysn.c b/ulan/host/ul_drv/utils/ul_dysn.c
new file mode 100644 (file)
index 0000000..4d2eaec
--- /dev/null
@@ -0,0 +1,762 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_lcscan.c  - procceed wavelength scanning with LCD5000
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#define _GNU_SOURCE
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <ul_lib/ulan.h>
+
+#if !defined( __GNUC__)||defined(DJGPP)||defined(NO_GET_DELIM)||defined (__MINGW32__)
+int getdelim(char **line,size_t *linelen,char delim,FILE *F)
+{
+ char c;
+ int  l=0;
+ do{
+  if(l+2>=*linelen)
+  {
+   *linelen=l+20;
+   if(!*line) *line=(char *)malloc(*linelen);
+    else *line=(char *)realloc(*line,*linelen);
+  }
+  c=fgetc(F);
+  if(feof(F)) {if(l) break; else return -1;}
+  if(c!='\r') (*line)[l++]=c;
+ } while(c!=delim);
+ (*line)[l]=0;
+ return l;
+};
+#endif
+
+/*******************************************************************/
+
+int ul_new_memrq_head(ul_fd_t ul_fd, int dadr, int cmd, 
+                      int mtype, int start, int len)
+{
+  int ret;
+  int i;
+  ul_msginfo msginfo;
+  uchar buf[8];
+  msginfo.dadr=dadr;
+  msginfo.cmd=cmd;
+  msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN;
+  ret=ul_newmsg(ul_fd,&msginfo);
+  if(ret<0) return ret;
+  i=0;
+  buf[i++]=(uchar)mtype; buf[i++]=mtype>>8;
+  buf[i++]=(uchar)start; buf[i++]=start>>8;
+  if(mtype&0x100)
+    {buf[i++]=start>>16; buf[i++]=start>>24;};
+  buf[i++]=(uchar)len;   buf[i++]=len>>8;
+  if(ul_write(ul_fd,buf,i)!=i)
+  { ul_abortmsg(ul_fd);
+    ret=-1;
+  };
+  return ret;
+};
+
+int ul_new_memrq_read(ul_fd_t ul_fd, int dadr,
+                      int mtype, int start, int len)
+{
+  int ret;
+  ul_msginfo msginfo;
+  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_RDM,mtype,start,len);
+  if (ret<0) return ret;
+  msginfo.dadr=dadr;
+  msginfo.cmd=UL_CMD_RDM&0x7F;
+  msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN;
+  msginfo.len=len;
+  ret=ul_tailmsg(ul_fd,&msginfo);
+  if (ret<0) {ul_abortmsg(ul_fd);return ret;};
+  ret=ul_freemsg(ul_fd);
+  return ret;
+};
+
+int ul_new_memrq_write(ul_fd_t ul_fd, int dadr,
+                       int mtype, int start, int len, void *buf)
+{
+  int ret;
+  ul_msginfo msginfo;
+  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_WRM,mtype,start,len);
+  if(ret<0) return ret;
+  msginfo.dadr=dadr;
+  msginfo.cmd=UL_CMD_WRM&0x7F;
+  msginfo.flg=UL_BFL_SND|UL_BFL_LNMM|UL_BFL_ARQ|UL_BFL_M2IN;
+  msginfo.len=len;
+  ret=ul_tailmsg(ul_fd,&msginfo);
+  if(ret<0) {ul_abortmsg(ul_fd);return ret;};
+  if(buf)
+  { ret=ul_write(ul_fd,buf,len);
+    if(ret<0) {ul_abortmsg(ul_fd);return ret;};
+    ret=ul_freemsg(ul_fd);
+  };
+  return ret;
+};
+
+int ul_mem_read_wait(ul_fd_t ul_fd, int dadr,
+                     int mtype, int start, int len, void *ptr)
+{
+  int ret, stamp;
+  ul_msginfo msginfo;
+  stamp=ret=ul_new_memrq_read(ul_fd,dadr,mtype,start,len);
+  if(ret<0) return ret;
+
+  /* ioctl(ul_fd,UL_KLOGBLL); */
+
+  /* ioctl(ul_fd,UL_STROKE); */
+
+  do {
+    ul_freemsg(ul_fd);
+    ret=ul_fd_wait(ul_fd,20);
+    if(ret<0) {printf("Select returned %d\n",ret);return ret;};
+    if(!ret) {printf("Select - timeout\n");return -1;};
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0)
+    { printf("Accept msg returned %d\n",ret);
+      return ret;
+    };
+  } while(msginfo.stamp!=stamp);
+  if(msginfo.flg&UL_BFL_FAIL) 
+  { printf("Failed msg flg=0x%X\n",msginfo.flg);
+    ul_freemsg(ul_fd);return -1;
+  };
+  ret=ul_actailmsg(ul_fd,&msginfo);
+  if(ret<0) 
+  { printf("Accept tail returned %d\n",ret);
+    ul_freemsg(ul_fd);
+    return ret;
+  };
+  if((ret=ul_read(ul_fd,ptr,len))!=len)
+  { printf("Bad read len %d, rq %d, msg %d\n",ret,len,msginfo.len);
+    ul_freemsg(ul_fd);return -1;
+  };
+  
+  ul_freemsg(ul_fd);
+  return len;
+};
+
+/*******************************************************************/
+
+char *ul_dev_name = UL_DEV_NAME;
+int module= 0;
+int prt_modules= 0;
+int prt_modules_dyn= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+int oi_var_fl  = 0;
+int oi_var_rd  = 0;
+char *oi_var_aoid=NULL;
+char *oi_var_val=NULL;
+int new_sn_flg = 0;
+unsigned long new_sn;
+int no_permanent_flg=0;
+int new_adr_flg = 0;
+int new_adr = 0;
+int new_adrnvsv_flg = 0;
+int interactive_flg = 0;
+
+
+#define SCAN_BLK_LEN 1024
+
+int set_new_sn(int module,unsigned long new_sn);
+
+/*******************************************************************/
+
+int oi_var_oiddes_print(int oid, uchar *despack)
+{
+  char *desname=uloi_oiddespack_strdup(despack,0);
+  char *destype=uloi_oiddespack_strdup(despack,1);
+
+  if(desname){
+    printf(" %5d deslen=%d name=\"%s\" type=\"%s\"\n",
+           oid,despack[0],desname?desname:"",destype?destype:"");
+  }else{
+    printf(" %5d\n",oid);
+  }
+
+  if(desname) free(desname);
+  if(destype) free(destype);
+  return 0;
+}
+
+int oi_var_test(char *aoid, char *valin, char **valout, char *type)
+{
+  int ret;
+  int oid;
+  int val;
+  int vallen=2;
+  int i;
+  uloi_coninfo_t *coninfo;
+
+  coninfo=uloi_open(ul_dev_name,module,0x10,0,10);
+  if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};
+
+  if((aoid!=NULL)&&(*aoid))
+  {
+    if(isdigit(*aoid))
+    { oid=strtol(aoid,NULL,0);
+    }
+    else
+    { ret=uloi_get_aoiddes(coninfo,oi_var_rd?ULOI_DOIO:ULOI_DOII,aoid,NULL);
+      if(ret<0) 
+      { fprintf(stderr,"oi_var_test : uloi_get_aoiddes returned %d\n",ret);
+        return -1;
+      };
+      oid=ret;
+    }
+
+    if(valout==NULL&&!oi_var_rd)
+    { if(valin&&*valin)
+      { val=strtol(valin,NULL,0);
+      }
+      else vallen=0;
+      ret=uloi_set_var(coninfo,oid,&val,vallen);
+      if(ret<0) { fprintf(stderr,"oi_var_test : uloi_set_var failed\n");return -1;};
+    }
+    else
+    { ret=uloi_get_var(coninfo,oid,&val,vallen);
+      if(ret<0) {fprintf(stderr,"oi_var_test : uloi_get_var failed\n");return -1;};
+      if(val&0x8000) val|=~0xffff; else val&=0xffff;
+      printf("%s=%d\n",aoid,val);
+    }
+  }
+  else
+  { int *oids;
+    ret=uloi_get_oids(coninfo,ULOI_QOII,&oids);
+    if(ret<0) 
+    { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
+      return -1;
+    };
+    printf("module recognized commands and set vars:\n");
+    for(i=0;i<ret;i++)
+    { uchar *despack=NULL;
+      if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],&despack)>=0){
+        oi_var_oiddes_print(oids[i],despack);
+        if(despack)
+         free(despack);
+      }else{
+        printf(" %5d no reply\n",oids[i]);
+      }
+    }
+    free(oids);
+    ret=uloi_get_oids(coninfo,ULOI_QOIO,&oids);
+    if(ret<0) 
+    { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
+      return -1;
+    };
+    printf("module recognized get vars:\n");
+    for(i=0;i<ret;i++)
+    { uchar *despack=NULL;
+      if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],&despack)>=0){
+        oi_var_oiddes_print(oids[i],despack);
+        if(despack)
+         free(despack);
+      }else{
+        printf(" %5d no reply\n",oids[i]);
+      }
+    }
+    free(oids);
+  }
+
+  uloi_close(coninfo);
+
+  return 0;
+}
+
+int print_modules(int max_addr)
+{ int ret;
+  int adr;
+  ul_fd_t ul_fd;
+  uchar *buf=NULL;
+  int buf_len;
+  int count=0; 
+  uchar buf_out[10];
+  ul_msginfo msginfo;
+  int ul_ncs_filter_on=0;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("print_modules : uLan open failed");return -1;};
+  for(adr=1;adr<=max_addr;adr++)
+  {
+    ret=ul_send_query_wait(ul_fd,adr,UL_CMD_SID,
+                          UL_BFL_NORE|UL_BFL_PRQ,NULL,0,(void**)&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      for(ret=0;(ret<buf_len)&&buf[ret];ret++);
+      printf("%2d:  ",adr);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+      free(buf);
+      buf=NULL;
+      
+      /* NCS information request */
+      if(!ul_ncs_filter_on){
+        memset(&msginfo,0,sizeof(ul_msginfo));
+        msginfo.cmd=UL_CMD_NCS;
+        ul_addfilt(ul_fd,&msginfo);
+        ul_ncs_filter_on=1;
+      }
+      buf_out[0]=ULNCS_SID_RQ;
+      ret=ul_send_command(ul_fd,adr,UL_CMD_NCS,
+                         UL_BFL_NORE|UL_BFL_PRQ,buf_out,1);
+      while(1)
+      { ret=ul_fd_wait(ul_fd,10);
+        if(ret<0) return -1;
+        if(ret==0)
+        { printf("cannot retrieve SN info for %d\n",adr);
+          break;
+        }
+        ret=ul_acceptmsg(ul_fd,&msginfo);
+        if(ret<0) return ret;
+        if((msginfo.cmd!=UL_CMD_NCS)
+          ||(msginfo.sadr!=adr)
+          ||(msginfo.len<3))
+        { ul_freemsg(ul_fd);
+          continue;
+        }
+        buf=malloc(msginfo.len);
+        ret=ul_read(ul_fd,buf,msginfo.len);
+        ul_freemsg(ul_fd);
+        if(buf[0]==ULNCS_SID_RPLY)
+        { if(msginfo.len>=5)
+          { 
+           printf("%2d %8lX:  ",msginfo.sadr,(buf[1])+((long)buf[2]<<8)+
+                                ((long)buf[3]<<16)+((long)buf[4]<<24));
+           fwrite(buf+5,msginfo.len-5,1,stdout);
+           printf("\n");
+            free(buf);
+            buf=NULL;
+            break;
+          }
+        }
+        free(buf);
+        buf=NULL;
+      }
+
+      /*  */
+
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int print_modules_dyn(void)
+{ int ret;
+  ul_fd_t ul_fd;
+  uchar *buf=NULL;
+  int count=0; 
+  uchar buf_out[10];
+  ul_msginfo msginfo;
+  int ul_ncs_filter_on=0;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("print_modules_dyn : uLan open failed");return -1;};
+
+  if(!ul_ncs_filter_on){
+    memset(&msginfo,0,sizeof(ul_msginfo));
+    msginfo.cmd=UL_CMD_NCS;
+    ul_addfilt(ul_fd,&msginfo);
+    ul_ncs_filter_on=1;
+  }
+  buf_out[0]=ULNCS_SID_RQ;
+  ret=ul_send_command(ul_fd,0,UL_CMD_NCS,
+                     UL_BFL_NORE*0,buf_out,1);
+  while(1)
+  { ret=ul_fd_wait(ul_fd,3);
+    if(ret<0) return -1;
+    if(ret==0)
+    { printf("no more SN info\n");
+      break;
+    }
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) return ret;
+    if((msginfo.cmd!=UL_CMD_NCS)
+       ||(msginfo.len<3))
+    { ul_freemsg(ul_fd);
+      continue;
+    }
+    buf=malloc(msginfo.len);
+    ret=ul_read(ul_fd,buf,msginfo.len);
+    ul_freemsg(ul_fd);
+    if(buf[0]==ULNCS_SID_RPLY)
+    { if(msginfo.len>=5)
+      { 
+       printf("%2d %08lX:  ",msginfo.sadr,(buf[1])+((long)buf[2]<<8)+
+                           ((long)buf[3]<<16)+((long)buf[4]<<24));
+       fwrite(buf+5,msginfo.len-5,1,stdout);
+       printf("\n");
+        free(buf);
+        buf=NULL;
+      }
+    }
+    free(buf);
+    buf=NULL;
+  }
+  if(buf) free(buf);
+  buf=NULL;
+  ul_close(ul_fd);
+  return count;
+};
+
+int set_new_adr(int module,unsigned long module_sn,int new_adr)
+{ int ret;
+  ul_fd_t ul_fd;
+  uchar buf_out[10];
+  if(module_sn!=0) module=0;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("set_new_adr : uLan open failed");return -1;};
+  buf_out[0]=ULNCS_SET_ADDR;   /* SN0 SN1 SN2 SN3 NEW_ADR */
+  buf_out[1]=module_sn>>0;
+  buf_out[2]=module_sn>>8;
+  buf_out[3]=module_sn>>16;
+  buf_out[4]=module_sn>>24;
+  buf_out[5]=new_adr;
+  ret=ul_send_command(ul_fd,module,UL_CMD_NCS,
+                     module?UL_BFL_ARQ:0,buf_out,6);
+  ul_close(ul_fd);
+  return 1;
+}
+
+int adr_nv_save(int module,unsigned long module_sn)
+{ int ret;
+  ul_fd_t ul_fd;
+  uchar buf_out[10];
+  ul_fd=ul_open(ul_dev_name, NULL);  
+  if(ul_fd==UL_FD_INVALID) { perror("adr_nv_save : uLan open failed");return -1;};
+  buf_out[0]=ULNCS_ADDR_NVSV;
+  buf_out[1]=module_sn>>0;
+  buf_out[2]=module_sn>>8;
+  buf_out[3]=module_sn>>16;
+  buf_out[4]=module_sn>>24;
+  ret=ul_send_command(ul_fd,module,UL_CMD_NCS,
+                     module?UL_BFL_ARQ:0,buf_out,5);
+  ul_close(ul_fd);
+  return 1;
+}
+
+int read_module_sn(int module,unsigned long *read_sn, char **read_info)
+{ int ret=1;
+  ul_fd_t ul_fd;
+  ul_msginfo msginfo;
+  uchar buf_out[10];
+  uchar buf_in[10];
+  int i;
+  if(read_info) *read_info=NULL;
+  /* Open device */
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("read_module_sn : uLan open failed");return -1;};
+  /* Set filter */
+  memset(&msginfo,0,sizeof(ul_msginfo));
+  msginfo.cmd=UL_CMD_NCS;
+  msginfo.sadr=module;
+  msginfo.flg=UL_BFL_NORE;
+  ul_addfilt(ul_fd,&msginfo);
+  /* Send identification request */
+  buf_out[0]=ULNCS_SID_RQ; /* SN0 SN1 SN2 SN3 */
+  ret=ul_send_command(ul_fd,module,UL_CMD_NCS,
+                     module?UL_BFL_ARQ:0,buf_out,1);
+  /* wait for request */
+  while(1)
+  { ret=ul_fd_wait(ul_fd,10);
+    if(ret<0) break;
+    if(ret==0) { ret=-1; break;}
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) break;
+    if((msginfo.cmd!=UL_CMD_NCS)
+       ||(msginfo.len<5))
+    { ul_freemsg(ul_fd);
+      continue;
+    }
+    ret=ul_read(ul_fd,buf_in,5);
+    if(ret!=5) break;
+    if(read_info) {
+      if((i=msginfo.len-5)&&(*read_info=malloc(i+1))){
+        ret=ul_read(ul_fd,*read_info,i);
+        if(ret>=0) (*read_info)[ret]=0;
+       else {
+         free(*read_info);
+         *read_info=NULL;
+       }
+      }
+    }
+    ul_freemsg(ul_fd);
+    if(buf_in[0]!=ULNCS_SID_RPLY) continue;
+    *read_sn=(buf_in[1])+((long)buf_in[2]<<8)+
+            ((long)buf_in[3]<<16)+((long)buf_in[4]<<24);
+    break;
+  }
+  ul_close(ul_fd);
+  return ret;
+}
+
+char *sn_hist_fname="ulan_sn.his";
+
+int check_sn_in_sn_hist(unsigned long new_sn, unsigned long *pmax_sn)
+{ 
+  int    ret=1;
+  char   *line=NULL;
+  size_t linelen=0;
+  unsigned long old_sn, max_sn=0;
+  FILE   *F;
+
+  if((F=fopen(sn_hist_fname,"r"))==NULL){
+    return errno==ENOENT?0:-3;
+  }
+  while(getdelim(&line,&linelen,'\n',F)>=0){
+    if(sscanf(line,"%lX",&old_sn)>0) {
+      if(old_sn>max_sn) max_sn=old_sn;
+      if(new_sn&&(old_sn==new_sn)) ret=-1;
+    }
+  }
+  if(line) free(line);
+  if(pmax_sn) *pmax_sn=max_sn;
+  return ret;
+}
+
+int interactive_sn_set(void)
+{
+  unsigned long old_sn, new_sn, max_sn=0;
+  char   *info;
+  int    ret;
+  time_t sn_time;
+  struct tm *sn_tm;
+  char   *p,*line=NULL;
+  size_t linelen=0;
+  FILE   *F;
+  
+  while(1){
+    printf("\nListing conected modules\n");
+    print_modules_dyn();
+    printf("select module address: ");
+    if(getdelim(&line,&linelen,'\n',stdin)<0) break; 
+    if(sscanf(line,"%d",&module)<1) break;
+    printf("\n");
+    if(read_module_sn(module,&old_sn,&info)<0){
+      printf("Cannot connect module\n");
+      continue;
+    }
+    printf("Module %d with old SN %08lX info : %s\n",
+            module,old_sn,info);
+    ret=check_sn_in_sn_hist(0,&max_sn);
+    while(1){
+      new_sn=max_sn+1;
+      printf("New SN [%08lX]: ",new_sn);
+      if(getdelim(&line,&linelen,'\n',stdin)<0) break;
+      for(p=line;*p&&(*p<=' ');p++);
+      if(*p){
+       if(sscanf(line,"%lX",&new_sn)<0){
+          printf("Bad SN format - press a key\n");
+         continue;
+       }
+      }
+      ret=check_sn_in_sn_hist(new_sn,&max_sn);
+      if(ret==-1){
+          printf("SN already taken\n");
+         continue;
+      }
+      if(ret<0){
+          printf("Problem with SN history file\n");
+         continue;
+      }
+      break;
+    }
+    printf("\n");
+    if(set_new_sn(module,new_sn)<0) {
+      printf("Cannot write SN - press a key\n");
+      if(getdelim(&line,&linelen,'\n',stdin)<0) break;
+      continue;
+    }
+    if((F=fopen(sn_hist_fname,"a"))==NULL)
+    {
+      printf("Cannot open uLan SN history file\n");
+      if(getdelim(&line,&linelen,'\n',stdin)<0) break;
+      continue;
+    }
+    time(&sn_time);
+    sn_tm=localtime(&sn_time);
+    fprintf(F,"%08lX\t%04d-%02d-%02d\t%s\n",new_sn,
+            (int)sn_tm->tm_year+1900,(int)sn_tm->tm_mon+1,
+           (int)sn_tm->tm_mday,info);
+    fclose(F);
+    printf("SN changed\n");
+    printf("Reset device and press a key\n");
+    if(getdelim(&line,&linelen,'\n',stdin)<0) break;
+  }
+  if(line) free(line);
+  return 0;
+}
+
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("send_cmd_go : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+static void
+usage(void)
+{
+  printf("usage: ul_lcabsp <parameters> <hex_file>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       messages from/to module\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("  -P, --print-dyn          print dynamic address capable modules\n");
+  printf("  -D  --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -o, --oi-var <oid>=<v>   uLan OI variable set\n");
+  printf("  -o, --oi-var <oid>?      uLan OI variable read\n");
+  printf("  -S, --set-sn <ser-num>   set serial number\n");
+  printf("  -n, --no-permanent      no permanent SN change\n");
+  printf("  -a, --set-adr <adr>      set new module address\n");
+  printf("  -A, --set-adrnvsv <adr>  set and store address to EEPROM\n");
+  printf("  -i, --interactive        interactive SN setup\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "print", 1, 0, 'p' },
+    { "print-dyn", 0, 0, 'P' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { "oi-var",1, 0, 'o' },
+    { "set-sn",1, 0, 'S' },
+    { "no-permanent",1, 0, 'n' },
+    { "set-adr",1, 0, 'a' },
+    { "set-adrnvsv",1, 0, 'A' },
+    { "interactive",0, 0, 'i' },
+    { 0, 0, 0, 0}
+  };
+  int  opt;
+  char c;
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:m:p:PVhS:na:A:iD:o:")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:m:p:PVhS:na:A:iD:o:",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      module = strtol(optarg,NULL,0);
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'P':
+      prt_modules_dyn = 1;
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan Dynamic and Serial Number Management pre alpha\n", stdout);
+      exit(0);
+    case 'o':
+      oi_var_fl=1;
+      oi_var_rd=0;
+      oi_var_aoid=optarg;
+      oi_var_val=strpbrk(optarg,":=?");
+      if(oi_var_val)
+      { c=*oi_var_val;
+        *(oi_var_val++)=0;
+        switch(c)
+        { case '?':
+           oi_var_val=NULL;
+           oi_var_rd=1;
+            break;
+        }
+      }
+      break;
+    case 'S':
+      new_sn_flg=1;
+      new_sn=strtol(optarg,NULL,16);
+      break;
+    case 'n':
+      no_permanent_flg=1;
+      break;
+    case 'a':
+      new_adr_flg=1;
+      new_adr=strtol(optarg,NULL,0);
+      break;
+    case 'A':
+      new_adr_flg=1;
+      new_adr=strtol(optarg,NULL,0);
+      new_adrnvsv_flg=1;
+      break;
+    case 'i':
+      interactive_flg=1;
+      break;
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if(new_adr_flg||new_adrnvsv_flg) {
+    if(!module&&!new_sn_flg) {
+      printf("Cannot set address when old address and SN undefined\n");
+      return 1;
+    }
+    if(!new_sn&&!new_sn_flg) {
+      if(read_module_sn(module,&new_sn,NULL)<0){
+        printf("Cannot read module %d serial number\n",module);
+        return 1;
+      }
+      printf("Module %d, SN %8lX will be readdressed to %d\n",
+             module,new_sn,new_adr);
+    }
+    set_new_adr(module,new_sn,new_adr);
+    if(new_adrnvsv_flg) {
+      adr_nv_save(new_adr,new_sn);
+    }
+    new_sn_flg=0;
+  }
+
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(new_sn_flg) set_new_sn(module,new_sn);
+
+  if(prt_modules) print_modules(prt_modules);
+  
+  if(prt_modules_dyn) print_modules_dyn();
+  
+  if(interactive_flg) interactive_sn_set();
+  
+  if(oi_var_fl) oi_var_test(oi_var_aoid,oi_var_val,NULL,NULL);
+  
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_lcabsp.c b/ulan/host/ul_drv/utils/ul_lcabsp.c
new file mode 100644 (file)
index 0000000..2546aa3
--- /dev/null
@@ -0,0 +1,214 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_lcabsp.c  - pasive receive and show absorbancy 
+                 send by LCD5000
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <math.h>
+#include <ul_lib/ulan.h>
+
+#define UL_CMD_LCDABS  0x4f    /* Absorbance data block */
+#define UL_CMD_LCDMRK  0x4e    /* Mark */
+
+/*******************************************************************/
+
+char *ul_dev_name = UL_DEV_NAME;
+int module= 0;
+int prt_modules= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+
+int print_modules(int max_addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar *p;
+  void *buf=NULL;
+  int buf_len;
+  int count=0; 
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("print_modules : uLan open failed");return -1;};
+  for(i=1;i<=max_addr;i++)
+  {
+    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
+                       UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      p=(uchar*)buf;
+      for(ret=0;(ret<buf_len)&&*p;ret++,p++);
+      printf("%2d:  ",i);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("send_cmd_go : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+float IEEE4tofloat(void *p)
+{
+ uchar *up=p;
+ long mantisa;
+ int exponent;
+ mantisa=up[0]|((unsigned)up[1]<<8)|
+         ((unsigned long)up[2]<<16)|0x800000;
+ if(up[3]&0x80) mantisa=-mantisa;
+ exponent=(up[2]>>7)|(((int)up[3]&0x7f)<<1);
+ return ldexp((float)mantisa,exponent-0x7f-23);
+};
+
+int receive_abs(void)
+{
+  int ret;
+  ul_fd_t ul_fd;
+  ul_msginfo msginfo;
+  uchar  buf[10];
+  struct timeval timeout;
+  fd_set set;
+  float  abs;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("receive_abs : uLan open failed");return -1;};
+//  ioctl(ul_fd2sys_fd(ul_fd),UL_STROKE);  /* !!! will be removed */
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.sadr=module;
+  msginfo.cmd=UL_CMD_LCDABS;
+  ret=ul_addfilt(ul_fd,&msginfo);
+  if(ret<0) { printf("receive_abs : add filter failed\n");return ret;};
+  msginfo.cmd=UL_CMD_LCDMRK;
+  ret=ul_addfilt(ul_fd,&msginfo);
+  if(ret<0) { printf("receive_abs : add filter failed\n");return ret;};
+
+  for(;;)
+  { 
+  #ifndef WITHOUT_SYS_SELECT
+    FD_ZERO (&set);
+    FD_SET (ul_fd2sys_fd(ul_fd), &set);
+    FD_SET (0, &set);
+    timeout.tv_sec = 10;
+    timeout.tv_usec = 0;
+    while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+            &&errno==-EINTR);
+    if(FD_ISSET(0,&set))
+      {printf("\nreceive_abs : break by user\n");break;};
+    if(ret<0) return ret;
+    if(!ret) continue;
+  #else /* WITHOUT_SYS_SELECT */
+    while(1) {
+      if(ul_inepoll(ul_fd)) break;
+      Sleep(100);
+    };
+  #endif /* WITHOUT_SYS_SELECT */
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) 
+    { printf("receive_abs : problem to accept message\n");
+      return ret;
+    };
+    if(msginfo.flg&UL_BFL_FAIL) 
+      {ul_freemsg(ul_fd);continue;};
+    if(msginfo.cmd==UL_CMD_LCDABS)
+    { while((ret=ul_read(ul_fd,buf,4))==4)
+      {
+        abs=IEEE4tofloat(buf);
+        printf("%9.6f\n",abs);
+      };
+    }else 
+    if(msginfo.cmd==UL_CMD_LCDMRK)
+    {       
+      memset(buf,0,sizeof(buf));
+      ul_read(ul_fd,buf,4);
+      printf("MARK %d %d\n",buf[0],buf[1]);
+    };
+    ul_freemsg(ul_fd);
+  };
+  ul_close(ul_fd);
+  return 0;
+};
+
+static void
+usage(void)
+{
+  printf("usage: ul_lcabsp <parameters> <hex_file>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       messages from/to module\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("      --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "print", 1, 0, 'p' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { 0, 0, 0, 0}
+  };
+  int opt;
+
+  while ((opt = getopt_long(argc, argv, "d:m:p:Vh",
+                           &long_opts[0], NULL)) != EOF)
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      module = strtol(optarg,NULL,0);
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan spy v0.7\n", stdout);
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(prt_modules) print_modules(prt_modules);
+
+  receive_abs();
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_lcscan.c b/ulan/host/ul_drv/utils/ul_lcscan.c
new file mode 100644 (file)
index 0000000..0e04ca5
--- /dev/null
@@ -0,0 +1,457 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_lcscan.c  - procceed wavelength scanning with LCD5000
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include <ul_lib/ulan.h>
+
+#ifdef _WIN32
+#define sleep Sleep
+#endif
+
+/*******************************************************************/
+
+char *ul_dev_name = UL_DEV_NAME;
+int module= 3;
+int prt_modules= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+int wl_begin   = 200;
+int wl_end     = 300;
+int wl_step    = 1;
+int wl_pause   = 1000;
+int zero_fl    = 0;
+int time_co_fl = 0;
+int time_co    = 0;
+int adc_chan_fl= 0;
+int adc_chan   = 0;
+int lampctrl_fl= 0;
+int lampctrl   = 0;
+int oi_var_fl  = 0;
+int oi_var_rd  = 0;
+char *oi_var_aoid=NULL;
+char *oi_var_val=NULL;
+
+int oi_var_oiddes_print(int oid, uchar *despack)
+{
+  char *desname=uloi_oiddespack_strdup(despack,0);
+  char *destype=uloi_oiddespack_strdup(despack,1);
+
+  if(desname){
+    printf(" %5d deslen=%d name=\"%s\" type=\"%s\"\n",
+           oid,despack[0],desname?desname:"",destype?destype:"");
+  }else{
+    printf(" %5d\n",oid);
+  }
+
+  if(desname) free(desname);
+  if(destype) free(destype);
+  return 0;
+}
+
+int oi_var_test(char *aoid, char *valin, char **valout, char *type)
+{
+  int ret;
+  int oid;
+  int val;
+  int vallen=2;
+  int i;
+  uloi_coninfo_t *coninfo;
+
+  coninfo=uloi_open(ul_dev_name,module,0x10,0,10);
+  if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};
+
+  if((aoid!=NULL)&&(*aoid))
+  {
+    if(isdigit(*aoid))
+    { oid=strtol(aoid,NULL,0);
+    }
+    else
+    { ret=uloi_get_aoiddes(coninfo,oi_var_rd?ULOI_DOIO:ULOI_DOII,aoid,NULL);
+      if(ret<0) 
+      { fprintf(stderr,"oi_var_test : uloi_get_aoiddes returned %d\n",ret);
+        return -1;
+      };
+      oid=ret;
+    }
+
+    if(valout==NULL&&!oi_var_rd)
+    { if(valin&&*valin)
+      { val=strtol(valin,NULL,0);
+      }
+      else vallen=0;
+      ret=uloi_set_var(coninfo,oid,&val,vallen);
+      if(ret<0) { fprintf(stderr,"oi_var_test : uloi_set_var failed\n");return -1;};
+    }
+    else
+    { ret=uloi_get_var(coninfo,oid,&val,vallen);
+      if(ret<0) {fprintf(stderr,"oi_var_test : uloi_get_var failed\n");return -1;};
+      if(val&0x8000) val|=~0xffff; else val&=0xffff;
+      printf("%s=%d\n",aoid,val);
+    }
+  }
+  else
+  { int *oids;
+    ret=uloi_get_oids(coninfo,ULOI_QOII,&oids);
+    if(ret<0) 
+    { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
+      return -1;
+    };
+    printf("module recognized commands and set vars:\n");
+    for(i=0;i<ret;i++)
+    { uchar *despack=NULL;
+      if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],&despack)>=0){
+        oi_var_oiddes_print(oids[i],despack);
+        if(despack)
+         free(despack);
+      }else{
+        printf(" %5d no reply\n",oids[i]);
+      }
+    }
+    free(oids);
+    ret=uloi_get_oids(coninfo,ULOI_QOIO,&oids);
+    if(ret<0) 
+    { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
+      return -1;
+    };
+    printf("module recognized get vars:\n");
+    for(i=0;i<ret;i++)
+    { uchar *despack=NULL;
+      if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],&despack)>=0){
+        oi_var_oiddes_print(oids[i],despack);
+        if(despack)
+         free(despack);
+      }else{
+        printf(" %5d no reply\n",oids[i]);
+      }
+    }
+    free(oids);
+  }
+
+  uloi_close(coninfo);
+
+  return 0;
+}
+
+int print_modules(int max_addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar *p;
+  void *buf=NULL;
+  int buf_len;
+  int count=0; 
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("print_modules : uLan open failed");return -1;};
+  for(i=1;i<=max_addr;i++)
+  {
+    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
+                       UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      p=(uchar*)buf;
+      for(ret=0;(ret<buf_len)&&*p;ret++,p++);
+      printf("%2d:  ",i);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("send_cmd_go : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+float IEEE4tofloat(void *p)
+{
+ uchar *up=p;
+ long mantisa;
+ int exponent;
+ mantisa=up[0]|((unsigned)up[1]<<8)|
+         ((unsigned long)up[2]<<16)|0x800000;
+ if(up[3]&0x80) mantisa=-mantisa;
+ exponent=(up[2]>>7)|(((int)up[3]&0x7f)<<1);
+ return ldexp((float)mantisa,exponent-0x7f-23);
+};
+
+uchar test_cmd[]={0,0,0,204,0,234,0,20,0,204,0,0,0};
+
+int wl_set_wlen(uloi_coninfo_t *coninfo,unsigned wlen)
+{ unsigned u;
+  int ret;
+  ret=uloi_set_var_u2(coninfo,204,wlen);
+  if(ret<0) return ret;
+  while(1)
+  { sleep(1);
+    ret=uloi_get_var_u2(coninfo,204,&u);
+    if(ret<0) return ret;
+    if(u==0x8000) continue;
+    if(u&0x8000) return -1;
+    if(u!=wlen) return -1;
+    return wlen;
+  }
+}
+
+int wl_scan(void)
+{
+  int ret;
+  ul_fd_t ul_fd;
+  ul_msginfo msginfo;
+  uloi_coninfo_t *coninfo;
+  uchar  buf[10];
+  struct timeval timeout;
+  unsigned wlen;
+  fd_set set;
+  float  abs;
+
+  coninfo=uloi_open(ul_dev_name,module,0x10,0,10);
+  if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};
+  
+  if(time_co_fl)
+  { uloi_set_var_u2(coninfo,208,time_co);
+  }
+
+  if(adc_chan_fl)
+  { uloi_set_var_u2(coninfo,209,adc_chan);
+  }
+
+  if(lampctrl_fl)
+  { uloi_set_var_u2(coninfo,207,lampctrl);
+  }
+
+  wlen=wl_begin;
+  if(!wl_step) wl_end=wlen;
+  if(((wl_begin<=wl_end)&&(wl_step>=0))
+   ||((wl_begin>=wl_end)&&(wl_step<0))) while(1)
+  { ret=wl_set_wlen(coninfo,wlen);
+    fprintf(stderr,"ul_set_wlen returned %d\n",ret);
+    sleep(wl_pause/1000);
+    if(zero_fl)
+    { ret=uloi_send_cmd(coninfo,255);
+      fprintf(stderr,"uloi_send_cmd returned %d\n",ret);
+    
+    }
+    ret=uloi_get_var(coninfo,220,buf,4);
+    fprintf(stderr,"uloi_get_var returned %d\n",ret);
+    printf("%d %f\n",wlen,IEEE4tofloat(buf));
+    
+    if((wlen==wl_end)||!wl_step) break;
+    wlen+=wl_step;
+    if(((wl_step>0)&&(wlen>wl_end))
+     ||((wl_step<0)&&(wlen<wl_end))) wlen=wl_end;
+  }
+
+  uloi_close(coninfo);
+  return 0;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID) { perror("wl_scan : uLan open failed");return -1;};
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.sadr=module;
+  msginfo.cmd=UL_CMD_LCDABS;
+  ret=ul_addfilt(ul_fd,&msginfo);
+  if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};
+  msginfo.cmd=UL_CMD_LCDMRK;
+  ret=ul_addfilt(ul_fd,&msginfo);
+  if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};
+
+  for(;;)
+  {
+  #ifndef WITHOUT_SYS_SELECT
+    FD_ZERO (&set);
+    FD_SET (ul_fd2sys_fd(ul_fd), &set);
+    FD_SET (0, &set);
+    timeout.tv_sec = 10;
+    timeout.tv_usec = 0;
+    while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+            &&errno==-EINTR);
+    if(FD_ISSET(0,&set))
+      {printf("\nwl_scan : break by user\n");break;};
+    if(ret<0) return ret;
+    if(!ret) continue;
+  #else /* WITHOUT_SYS_SELECT */
+    while (ul_fd_wait(ul_fd,1)<=0);
+  #endif /* WITHOUT_SYS_SELECT */
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) 
+    { printf("wl_scan : problem to accept message\n");
+      return ret;
+    };
+    if(msginfo.flg&UL_BFL_FAIL) 
+      {ul_freemsg(ul_fd);continue;};
+    if(msginfo.cmd==UL_CMD_LCDABS)
+    { while((ret=ul_read(ul_fd,buf,4))==4)
+      {
+        abs=IEEE4tofloat(buf);
+        printf("%9.6f\n",abs);
+      };
+    }else 
+    if(msginfo.cmd==UL_CMD_LCDMRK)
+    {       
+      memset(buf,0,sizeof(buf));
+      ul_read(ul_fd,buf,4);
+      printf("MARK %d %d\n",buf[0],buf[1]);
+    };
+    ul_freemsg(ul_fd);
+  };
+  ul_close(ul_fd);
+  uloi_close(coninfo);
+  return 0;
+};
+
+static void
+usage(void)
+{
+  printf("usage: ul_lcabsp <parameters> <hex_file>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       messages from/to module\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("      --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -b, --begin  <wlen>      initial wavelength\n");
+  printf("  -e, --end    <wlen>      final wavelength\n");
+  printf("  -s, --step   <wlen>      wavelength step\n");
+  printf("  -z, --zero               zero absorbance\n");
+  printf("  -t, --time-const <s>     ADC filter time constant\n");
+  printf("  -c, --adc-chan <c>       imput chanel of ADC\n");
+  printf("  -l, --lamp  <l>          lamp control\n");
+  printf("  -o, --oi-var <oid>=<v>   uLan OI variable set\n");
+  printf("  -o, --oi-var <oid>?      uLan OI variable read\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "print", 1, 0, 'p' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { "begin", 1, 0, 'b' },
+    { "end",   1, 0, 'e' },
+    { "step",  1, 0, 's' },
+    { "pause", 1, 0, 'P' },
+    { "zero",  0, 0, 'z' },
+    { "time-const", 1, 0, 't' },
+    { "adc-chan", 1, 0, 'c' },
+    { "lanmp", 1, 0, 'l' },
+    { "oi-var",1, 0, 'o' },
+    { 0, 0, 0, 0}
+  };
+  int  opt;
+  char c;
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      module = strtol(optarg,NULL,0);
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan lcscan v0.7\n", stdout);
+      exit(0);
+    case 'b':
+      wl_begin = strtol(optarg,NULL,0);
+      break;
+    case 'e':
+      wl_end = strtol(optarg,NULL,0);
+      break;
+    case 's':
+      wl_step = strtol(optarg,NULL,0);
+      break;
+    case 'P':
+      wl_pause = strtol(optarg,NULL,0);
+      break;
+    case 'z':
+      zero_fl=1;
+      break;
+    case 't':
+      time_co_fl=1;
+      time_co=strtod(optarg,NULL)*100;
+      break;
+    case 'c':
+      adc_chan_fl=1;
+      adc_chan=strtol(optarg,NULL,0);
+      break;
+    case 'l':
+      lampctrl_fl=1;
+      lampctrl=strtol(optarg,NULL,0);
+      break;
+    case 'o':
+      oi_var_fl=1;
+      oi_var_rd=0;
+      oi_var_aoid=optarg;
+      oi_var_val=strpbrk(optarg,":=?");
+      if(oi_var_val)
+      { c=*oi_var_val;
+        *(oi_var_val++)=0;
+        switch(c)
+        { case '?':
+           oi_var_val=NULL;
+           oi_var_rd=1;
+            break;
+        }
+      }
+      break;
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(prt_modules) print_modules(prt_modules);
+  
+  if(oi_var_fl) oi_var_test(oi_var_aoid,oi_var_val,NULL,NULL);
+  
+  if(!debugk_flg&&!prt_modules&&!oi_var_fl)
+    wl_scan();
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_sendhex.c b/ulan/host/ul_drv/utils/ul_sendhex.c
new file mode 100644 (file)
index 0000000..6d47c14
--- /dev/null
@@ -0,0 +1,974 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_sendhex.c - intelhex downloader
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#ifndef _MSC_VER
+#include <sys/time.h>
+#include <unistd.h>
+#endif /*_MSC_VER*/
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ul_lib/ulan.h>
+
+int ul_new_memrq_head(ul_fd_t ul_fd, int dadr, int cmd, 
+                      int mtype, int start, int len)
+{
+  int ret;
+  int i;
+  ul_msginfo msginfo;
+  uchar buf[8];
+  msginfo.dadr=dadr;
+  msginfo.cmd=cmd;
+  msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN;
+  ret=ul_newmsg(ul_fd,&msginfo);
+  if(ret<0) return ret;
+  i=0;
+  buf[i++]=(uchar)mtype; buf[i++]=mtype>>8;
+  buf[i++]=(uchar)start; buf[i++]=start>>8;
+  if(mtype&0x100)
+    {buf[i++]=start>>16; buf[i++]=start>>24;};
+  buf[i++]=(uchar)len;   buf[i++]=len>>8;
+  if(ul_write(ul_fd,buf,i)!=i)
+  { ul_abortmsg(ul_fd);
+    ret=-1;
+  };
+  return ret;
+};
+
+int ul_new_memrq_read(ul_fd_t ul_fd, int dadr,
+                      int mtype, int start, int len)
+{
+  int ret;
+  ul_msginfo msginfo;
+  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_RDM,mtype,start,len);
+  if (ret<0) return ret;
+  msginfo.dadr=dadr;
+  msginfo.cmd=UL_CMD_RDM&0x7F;
+  msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN;
+  msginfo.len=len;
+  ret=ul_tailmsg(ul_fd,&msginfo);
+  if (ret<0) {ul_abortmsg(ul_fd);return ret;};
+  ret=ul_freemsg(ul_fd);
+  return ret;
+};
+
+int ul_new_memrq_write(ul_fd_t ul_fd, int dadr,
+                       int mtype, int start, int len, void *buf)
+{
+  int ret;
+  ul_msginfo msginfo;
+  ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_WRM,mtype,start,len);
+  if(ret<0) return ret;
+  msginfo.dadr=dadr;
+  msginfo.cmd=UL_CMD_WRM&0x7F;
+  msginfo.flg=UL_BFL_SND|UL_BFL_LNMM|UL_BFL_ARQ|UL_BFL_M2IN;
+  msginfo.len=len;
+  ret=ul_tailmsg(ul_fd,&msginfo);
+  if(ret<0) {ul_abortmsg(ul_fd);return ret;};
+  if(buf)
+  { ret=ul_write(ul_fd,buf,len);
+    if(ret<0) {ul_abortmsg(ul_fd);return ret;};
+    ret=ul_freemsg(ul_fd);
+  };
+  return ret;
+};
+
+int ul_mem_read_wait(ul_fd_t ul_fd, int dadr,
+                     int mtype, int start, int len, void *ptr)
+{
+  int ret, stamp;
+  ul_msginfo msginfo;
+  stamp=ret=ul_new_memrq_read(ul_fd,dadr,mtype,start,len);
+  if(ret<0) return ret;
+
+  /* ioctl(ul_fd,UL_KLOGBLL); */
+
+  /* ioctl(ul_fd,UL_STROKE); */
+
+  do {
+    ul_freemsg(ul_fd);
+    ret=ul_fd_wait(ul_fd,10);
+    if(ret<0) {printf("Select returned %d\n",ret);return ret;};
+    if(!ret) {printf("Select - timeout\n");return -1;};
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0)
+    { printf("Accept msg returned %d\n",ret);
+      return ret;
+    };
+  } while(msginfo.stamp!=stamp);
+  if(msginfo.flg&UL_BFL_FAIL) 
+  { printf("Failed msg flg=0x%X\n",msginfo.flg);
+    ul_freemsg(ul_fd);return -1;
+  };
+  ret=ul_actailmsg(ul_fd,&msginfo);
+  if(ret<0) 
+  { printf("Accept tail returned %d\n",ret);
+    ul_freemsg(ul_fd);
+    return ret;
+  };
+  if((ret=ul_read(ul_fd,ptr,len))!=len)
+  { printf("Bad read len %d, rq %d, msg %d\n",ret,len,msginfo.len);
+    ul_freemsg(ul_fd);return -1;
+  };
+  
+  ul_freemsg(ul_fd);
+  return len;
+};
+
+/*******************************************************************/
+
+typedef struct tform_file {
+       uchar *buf;
+       int   buf_len;
+       int   buf_addr;
+       int   buf_bytes;
+       int   buf_rem_bytes;
+       FILE *file;
+       uchar *line_buf;
+       int  line_addr;
+       int  line_bytes;
+       int  line_offs;
+       int  start_addr;
+       int (*read)(struct tform_file *tform);
+       int (*done)(struct tform_file *tform);
+  } tform_file;
+
+#ifndef HAS_GETDELIM
+int getdelim(char **line,unsigned *linelen,char delim,FILE *F)
+{
+ char c;
+ int  l=0;
+ do{
+  if(l+1>=*linelen)
+  {
+   *linelen=l+20;
+   if(!*line) *line=(char *)malloc(*linelen);
+    else *line=(char *)realloc(*line,*linelen);
+  }
+  c=fgetc(F);
+  if(feof(F)) {if(l) break; else return -1;}
+  if(c!='\r') (*line)[l++]=c;
+ } while(c!=delim);
+ (*line)[l]=0;
+ return l;
+};
+#endif
+
+int get_hex(uchar **p, unsigned *v, int chars)
+{
+  unsigned u=0;
+  uchar c;
+  *v=0;
+  while(**p==' ') (*p)++;
+  while(chars--)
+  { u<<=4;
+    c=**p;
+    if((c>='0')&&(c<='9')) u+=c-'0';
+    else if((c>='A')&&(c<='F')) u+=c-'A'+10;
+    else return -1;
+    (*p)++;
+  };
+  *v=u;
+  return 0;
+};
+
+int tform_init(tform_file *tform, int buf_len)
+{
+  if(!buf_len) buf_len=1024;
+  tform->file=NULL;
+  tform->buf_len=buf_len;
+  tform->buf=malloc(tform->buf_len);
+  tform->buf_addr=0;
+  tform->line_buf=NULL;
+  tform->line_offs=0;
+  tform->line_bytes=0;
+  tform->start_addr=-1;
+  tform->buf_bytes=0;
+  tform->buf_rem_bytes=0;
+  tform->read=NULL;
+  tform->done=NULL;
+  return 0;
+};
+
+int tform_done(tform_file *tform)
+{
+  if(tform->done)
+    return tform->done(tform);
+  fclose(tform->file);
+  if(tform->buf)free(tform->buf);
+  if(tform->line_buf)free(tform->line_buf);
+  return 0;
+};
+
+int tform_read(tform_file *tform)
+{
+  return tform->read(tform);
+}
+
+int tform_read_ihex(tform_file *tform)
+{ int cn,len=0;
+  int addr=0;
+  unsigned u,v;
+  uchar *p,*r;
+  char *line=NULL;
+  int  line_len=0;
+
+  if(tform->buf_rem_bytes){
+    int aoffs=tform->line_bytes-tform->buf_rem_bytes;
+    memmove(tform->buf,tform->buf+aoffs,tform->buf_rem_bytes);
+    addr=tform->buf_addr+=aoffs;
+    len=tform->buf_rem_bytes;
+  }
+
+  while(len<tform->buf_len)
+  {
+    if(!tform->line_bytes)
+    { int checksum=0;
+      int ihex_type=0;
+
+      tform->line_offs=0;
+      if(getdelim(&line,&line_len,'\n',tform->file)==-1) break;
+      p=line;
+      if(*p++!=':') printf("tform_read : strange line %s\n",line);
+      else {
+       if(get_hex(&p,&u,2)<0) {printf("tform_read_ihex : bad ihex cnt\n");return -1;};
+       checksum+=cn=tform->line_bytes=u;
+       if(!tform->line_buf) tform->line_buf=malloc(cn);
+       else tform->line_buf=realloc(tform->line_buf,cn);
+       if(get_hex(&p,&u,2)<0) {printf("tform_read_ihex : bad ihex addr\n");return -1;};
+       if(get_hex(&p,&v,2)<0) {printf("tform_read_ihex : bad ihex addr\n");return -1;};
+       checksum+=u+v; tform->line_addr=(u<<8)+v;
+       if(get_hex(&p,&u,2)<0) {printf("tform_read_ihex : bad ihex type\n");return -1;};
+       checksum+=ihex_type=u;       
+       if(ihex_type==0||ihex_type==1)
+       {
+         r=tform->line_buf;
+         while(cn--)
+         { if(get_hex(&p,&u,2)<0) {printf("tform_read_ihex : bad ihex data\n");return -1;};
+           checksum+=*r++=u;
+         
+         };
+         if(get_hex(&p,&u,2)<0) {printf("tform_read_ihex : bad ihex csum\n");return -1;};
+         checksum+=u;
+         if(checksum&0xff) 
+         { printf("tform_read_ihex : error ihex csum %d\n",
+                   checksum);return -1;
+         };
+         while((u=*p++)) if(u!=' '&&u!='\n'&&u!='\r')
+           {printf("tform_read_ihex : residual chars on line\n");return -1;};
+       };
+       if(ihex_type==1)
+       { tform->line_bytes=0;
+        tform->start_addr=tform->line_addr;
+       };
+      };
+    };
+    if(tform->line_bytes)
+    { if(!len) addr=tform->buf_addr=tform->line_addr+tform->line_offs;
+      else if(addr!=tform->line_addr+tform->line_offs) break;
+      cn=tform->line_bytes-tform->line_offs;
+      if(cn+len>tform->buf_len) cn=tform->buf_len-len;
+      memcpy(tform->buf+len,tform->line_buf+tform->line_offs,cn);
+      len+=cn;
+      addr+=cn;
+      tform->line_offs+=cn;
+      if(tform->line_bytes==tform->line_offs) tform->line_bytes=0;
+    };
+  };
+  tform->buf_bytes=len;
+  tform->buf_rem_bytes=0;
+  return len;
+};
+
+int tform_read_binary(tform_file *tform)
+{
+  int len=0;
+
+  tform->buf_addr+=tform->buf_bytes;
+  len=fread(tform->buf,1,tform->buf_len,tform->file);
+  if(len<0) {
+    perror("tform_read_binary : read error");
+    return -1;
+  }
+
+  tform->buf_bytes=len;
+  return len;
+}
+
+int tform_open(tform_file *tform,char *file_name,
+               char *format, int buf_len, int wr_fl)
+{
+  FILE *file;
+
+  if(!format || !strcmp("ihex",format))
+  {
+    if((file=fopen(file_name,"r"))==NULL)
+    {perror("download_file : hex file open");
+      return -1;
+    };
+    tform_init(tform,buf_len);
+    tform->file=file;
+    tform->read=tform_read_ihex;
+  } 
+  else if(!strcmp("binary",format))
+  {
+    if((file=fopen(file_name,"rb"))==NULL)
+    {perror("download_file : binary file open");
+      return -1;
+    };
+    tform_init(tform,buf_len);
+    tform->file=file;
+    tform->read=tform_read_binary;
+  } else {
+    fprintf(stderr, "requested unknown format %s\n", format);
+    return -1;
+  }
+  return 1;
+}
+
+/*******************************************************************/
+
+int si_long(char **ps,long *val,int base)
+{
+  char *p;
+  *val=strtol(*ps,&p,base);
+  if(*ps==p) return -1;
+  *ps=p;
+  return 1;
+}
+
+int add_to_arr(void **pdata,int *plen,int base,char *str)
+{
+  char *s=str;
+  long val;
+  void *p;
+
+  do{
+    while(*s && strchr(", \t:;",*s)) s++;
+    if(!*s) break;
+    if(si_long(&s,&val,base)<0){
+      return -1;
+    }
+    if(*pdata==NULL){
+      *plen=0;
+      *pdata=p=malloc(1);
+    }else{
+      p=realloc(*pdata,*plen+1);
+      if(p==NULL) return -1;
+      *pdata=p;
+    }
+    ((unsigned char*)p)[*plen]=val;
+    (*plen)++;
+  } while(1);
+  return 1;
+}
+
+/*******************************************************************/
+
+char *ul_dev_name = UL_DEV_NAME;
+int module     = 3;
+int upload_flg = 0;
+int mem_type   = 2;
+int mem_start  = 0;
+int mem_length = 0xff00;
+int max_block  = 1024;
+int align_order= 0;
+int go_addr    = 3;
+int go_flg     = 0;
+int reset_flg  = 0;
+int prt_modules= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+int fill_flg   = 0;
+int erase_flg  = 0;
+int boot_flg   = 0;
+void *fill_pat_val;
+int fill_pat_len;
+char *file_format=NULL;
+unsigned int sn=0;
+
+int download_file(char *file_name, char *format)
+{
+  ul_fd_t ul_fd;
+  tform_file tform;
+  int len;  
+  int ret=0;
+  int stamp;
+  ul_msginfo msginfo;
+  int in_proc_msg=0;
+  int shift_addr=0;
+  int addr;
+  unsigned align_size=(1<<align_order);
+
+  shift_addr=mem_start;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("download_file : uLan open failed");return -1;};
+  /* ul_drv_debflg(ul_fd,0x11); */ /* 0x9 0x11 */ 
+
+  if (tform_open(&tform, file_name, format, max_block, 0)<0)
+  {
+    ul_close(ul_fd);
+    return -1;
+  }
+
+  do
+  { 
+    while(in_proc_msg<3)
+    { len=tform_read(&tform);
+      if(!len) break;
+      if(len<0) 
+      { perror("download_file : ihex");
+        ret=-1;
+        break;
+      };
+
+      printf("addr %4X len %4X\n",tform.buf_addr+shift_addr,len);
+
+      addr=tform.buf_addr+shift_addr;
+
+      if(align_order){
+        int rem=len+((align_size-1)&addr);
+        if(rem>align_size){
+         rem-=align_size;
+         len-=rem;
+         tform.buf_rem_bytes=rem;
+       }
+      }
+
+      if((stamp=ul_new_memrq_write(ul_fd,module,mem_type,addr,len,tform.buf))<0)
+      { printf("download_file : send message error\n");
+        ret=-1; break;
+      };
+      in_proc_msg++;
+    };
+    if(ret<0) break;
+    if(in_proc_msg)
+    { if(ul_fd_wait(ul_fd,10)<=0) 
+      { printf("download_file : select error\n");
+        ret=-1; break;
+      };
+      if(ul_acceptmsg(ul_fd,&msginfo)<0)
+      { printf("download_file : accept msg error\n");
+        ret=-1; break;
+      };
+      if(msginfo.flg&UL_BFL_FAIL)
+      { printf("download_file : target system error\n");
+        ret=-1; break;
+      };
+      ul_freemsg(ul_fd);
+      in_proc_msg--;
+      /* printf(">>> "); */
+    };
+  } while(in_proc_msg);
+  
+  if(tform.start_addr!=-1) 
+    printf("Found start address %4X\n",tform.start_addr);
+  tform_done(&tform);
+
+  ul_close(ul_fd);
+
+  return ret;
+};
+
+int send_cmd_go(int addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar buf[8];
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("send_cmd_go : uLan open failed");return -1;};
+  i=0;
+  buf[i++]=0x10;
+  buf[i++]=(uchar)mem_type; buf[i++]=mem_type>>8;
+  buf[i++]=(uchar)go_addr;  buf[i++]=go_addr>>8;
+  if(mem_type&0x100)
+    {buf[i++]=go_addr>>16;  buf[i++]=go_addr>>24;};
+  ret=ul_send_command_wait(ul_fd,module,UL_CMD_DEB,
+                       UL_BFL_ARQ|UL_BFL_PRQ,buf,i);
+  if(ret<0) printf("Goto to %4X ERROR\n",addr);
+  else printf("Goto to %4X OK\n",addr);
+  ul_close(ul_fd);
+  return ret;
+};
+
+int send_cmd_res(void)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar buf[8];
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("send_cmd_res : uLan open failed");return -1;};
+  i=0;
+  buf[i++]=ULRES_CPU;
+  buf[i++]=0x55;
+  buf[i++]=0xaa;
+  ret=ul_send_command_wait(ul_fd,module,UL_CMD_RES,
+                       UL_BFL_ARQ|UL_BFL_PRQ,buf,i);
+  if(ret<0) printf("Module %d reset ERROR\n", module);
+  else printf("Module %d reset OK\n", module);
+  ul_close(ul_fd);
+  return ret;
+};
+
+#define MEM_FILL_ATONCE 1024
+
+int mem_fill(int mem_type, unsigned long start, unsigned long len,
+               unsigned char *pat_val, int pat_len)
+{
+  ul_fd_t ul_fd;
+  int in_proc_msg=0;
+  ul_msginfo msginfo;
+  int ret, stamp;
+  unsigned long addr=start;
+  unsigned char buff[MEM_FILL_ATONCE];
+  int blen=MEM_FILL_ATONCE;
+  unsigned char *p;
+  int cnt;
+  int i;
+
+  if(pat_len<=0) return -1;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("mem_fill : uLan open failed");return -1;};
+
+  if(blen>max_block) blen=max_block;
+
+  if((pat_len<=blen/2)&&(len>pat_len)){
+    i=blen<len+pat_len?blen:len+pat_len-1;
+    if((pat_len==1)){
+      blen=i;
+      memset(buff,*pat_val,blen);
+    }else{
+      i=i/pat_len;
+      blen=i*pat_len;
+      for(p=buff;i;i--,p+=pat_len){
+        memcpy(p,pat_val,pat_len);
+      }
+    }
+    pat_val=buff;
+  } else {
+    blen=pat_len;
+  }
+  
+  while(len || in_proc_msg){
+    while(in_proc_msg<3){
+      cnt=(len>blen)?blen:len;
+      stamp=ret=ul_new_memrq_write(ul_fd, module, mem_type, addr, cnt, pat_val);
+      if(ret<0){
+       fprintf(stderr,"mem_fill: uniload_mem_write returned %d\n", ret);
+       ul_close(ul_fd);
+       return -1;
+      }
+      len-=cnt;
+      addr+=cnt;
+      in_proc_msg++;
+    }
+    if(in_proc_msg){
+      if(ul_fd_wait(ul_fd,10)<=0) 
+      { printf("mem_fill : select error\n");
+        ret=-1; break;
+      };
+      if(ul_acceptmsg(ul_fd,&msginfo)<0)
+      { printf("mem_fill : accept msg error\n");
+        ret=-1; break;
+      };
+      if(msginfo.flg&UL_BFL_FAIL)
+      { printf("mem_fill : target system error\n");
+        ret=-1; break;
+      };
+      ul_freemsg(ul_fd);
+      in_proc_msg--;
+    }
+  }
+  ul_close(ul_fd);
+  return 0;  
+}
+
+int print_modules(int max_addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar *p;
+  void *buf=NULL;
+  int buf_len;
+  int count=0; 
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("print_modules : uLan open failed");return -1;};
+  for(i=1;i<=max_addr;i++)
+  {
+    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
+                       UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      p=(uchar*)buf;
+      for(ret=0;(ret<buf_len)&&*p;ret++,p++);
+      printf("%2d:  ",i);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("debug_kernel : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+int upload_file(char *file_name, char *format)
+{
+  ul_fd_t ul_fd;
+  FILE *file;
+  int ret;
+  uchar buf[0x400];
+  uchar *p;
+  char *mode="w";
+  enum {fmt_ihex, fmt_binary, fmt_dump} fmt;
+  int i,l,csum; 
+  int mem_adr=mem_start;
+  int mem_len=mem_length;
+  int len;
+
+  if(max_block>0x400) max_block=0x400;
+
+  if(!format || !strcmp("ihex",format)){
+    fmt=fmt_ihex;
+  } else if(!strcmp("binary",format)){
+    mode="wb";
+    fmt=fmt_binary;
+  } else if(!strcmp("dump",format)){
+    fmt=fmt_dump;
+  } else {
+    fprintf(stderr, "requested unknown format %s\n", format);
+    return -1;
+  }
+  
+  if(!strcmp(file_name,"-")) file_name=NULL;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("upload_file : open failed");return -1;};
+  /* ul_drv_debflg(ul_fd,0x11); */ /* 0x9 0x11 */
+
+  if(file_name){
+    if((file=fopen(file_name,mode))==NULL)
+    {perror("upload_file : file open");
+     ul_close(ul_fd);
+     return -1;
+    }
+  } else file=stdout;
+
+  while(mem_len)
+  { len=mem_len<max_block?mem_len:max_block;
+    ret=ul_mem_read_wait(ul_fd,module,mem_type,mem_adr,len,buf);
+    if(ret<0) 
+    { printf("Mem read returns %d\n",ret);
+      break;
+    }
+    if(file_name) printf("%04X\n",mem_adr);
+    switch(fmt){
+      case fmt_ihex:
+       p=buf; i=0;
+       while(i<len)
+       {
+        l=len-i;
+        if(l>16) l=16;
+        csum=l+(mem_adr+i)+((mem_adr+i)>>8);
+        fprintf(file,":%02X%04X00",l,mem_adr+i);
+        while(l--) {fprintf(file,"%02X",buf[i]);csum+=buf[i++];};
+        fprintf(file,"%02X\n",(-csum)&0xFF);
+       }
+       break;
+      case fmt_binary:
+       if(fwrite(buf,len,1,file)!=1){
+         perror("upload_file : file write");
+         return -1;
+       }
+       break;
+      case fmt_dump:
+        i=0; p=buf;
+       while(i<len){
+         if(i&0xf) printf(" %02X",*(p++));
+         else printf(i?"\n%04X:%02X":"%04X:%02X",mem_adr+i,*(p++));
+         i++;
+       }
+       printf("\n");
+       break;
+    }
+    mem_adr+=len;
+    mem_len-=len;
+  }
+
+  if(file_name) fclose(file); 
+  ul_close(ul_fd);
+  return 0;
+};
+
+int mem_erase(int mem_type, int start, int len)
+{
+  int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar buf[8];
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("mem_erase : uLan open failed");return -1;};
+  i=0;
+  buf[i++]=(uchar)mem_type; buf[i++]=mem_type>>8;
+  buf[i++]=(uchar)start;  buf[i++]=start>>8;
+  if(mem_type&0x100)
+    {buf[i++]=start>>16;  buf[i++]=start>>24;};
+  buf[i++]=(uchar)len;   buf[i++]=len>>8;
+  if(mem_type&0x100)
+    {buf[i++]=len>>16;  buf[i++]=len>>24;};
+  ret=ul_send_command_wait(ul_fd,module,UL_CMD_ERM,
+                       UL_BFL_ARQ|UL_BFL_PRQ,buf,i);
+  if(ret<0) printf("erase from:0x%4X to:0x%4X ERROR\n",start,start+len);
+  else printf("erase from:0x%4X to:0x%4X OK\n",start,start+len);
+  ul_close(ul_fd);
+  return ret;
+}
+
+int activate_boot(void)
+{
+  ul_fd_t ul_fd;
+  int ret,in_boot=0;
+  ul_msginfo msginfo;
+  unsigned int rsn;
+  uchar buf[5];
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("stay_in_boot : uLan open failed");return -1;};
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.cmd=UL_CMD_NCS;   
+  ret=ul_addfilt(ul_fd,&msginfo);
+  if(ret<0) { printf("stay_in_boot : add filter failed\n");return ret;};   
+  while(!in_boot) {
+    if(ul_acceptmsg(ul_fd,&msginfo)<0) {
+      buf[0]=(uchar)ULNCS_BOOT_ACT;
+      buf[1]=(uchar)sn;  buf[2]=sn>>8;
+      buf[3]=sn>>16;  buf[4]=sn>>24;
+      ul_send_command(ul_fd,module,UL_CMD_NCS,0,buf,5);
+      #ifdef _WIN32
+        Sleep(1000);
+      #else
+        sleep(1);
+      #endif 
+    } else {
+      if ((msginfo.cmd==UL_CMD_NCS) && (msginfo.len==5)) {
+        if((ret=ul_read(ul_fd,&buf,5))!=msginfo.len) { 
+          printf("Bad read len %d, rq %d, msg %d\n",ret,5,msginfo.len);
+          ul_freemsg(ul_fd);return -1;
+        };
+        rsn=(unsigned long)buf[1];
+        rsn+=(unsigned long)buf[2]<<8;
+        rsn+=(unsigned long)buf[3]<<16;
+        rsn+=(unsigned long)buf[4]<<24;
+        if ((buf[0]==ULNCS_BOOT_ACK) && (rsn==sn))
+          in_boot=1;
+      }  
+      ul_freemsg(ul_fd);
+    }
+  }
+  ul_close(ul_fd);
+  return 0;
+}
+
+static void
+usage(void)
+{
+  printf("usage: ul_sendhex <parameters> <hex_file>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       download/upload target uLan module\n");
+  printf("  -t, --type   <num>       target module memory space\n");
+  printf("  -s, --start  <addr>      start address of transfer\n");
+  printf("  -l, --length <num>       length of upload block\n");
+  printf("  -b, --block  <num>       maximal block length\n");
+  printf("  -A, --align-order <num>  force block alignment\n");
+  printf("  -g, --go     <addr>      start program from address\n");
+  printf("  -r, --reset              reset before download\n");
+  printf("  -u, --upload             upload memory block [download]\n");
+  printf("  -F, --fill <num>         fill region defined by -s -l by value\n");
+  printf("  -e, --erase              erase memory defined by -s -l -t\n");
+  printf("  -o, --bootloader <sn>    activate bootloader\n");
+  printf("  -f, --format <format>    format of data file [ihex]\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("      --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "type",  1, 0, 't' },
+    { "start", 1, 0, 's' },
+    { "length",1, 0, 'l' },
+    { "block", 1, 0, 'b' },
+    { "align-order", 1, 0, 'A' },
+    { "go",    1, 0, 'g' },
+    { "reset", 0, 0, 'r' },
+    { "upload",0, 0, 'u' },
+    { "fill",  1, 0, 'F' },
+    { "erase", 0, 0, 'e' },
+    { "bootloader", 1, 0, 'o' },
+    { "format",1, 0, 'f' },
+    { "print", 1, 0, 'p' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { 0, 0, 0, 0}
+  };
+  int opt;
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:m:t:s:l:b:g:ruF:ef:o:p:VhD:")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:m:t:s:l:b:g:ruF:ef:o:p:Vh",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      module = strtol(optarg,NULL,0);
+      break;
+    case 't':
+      mem_type = strtol(optarg,NULL,0);
+      break;
+    case 's':
+      mem_start = strtol(optarg,NULL,0);
+      break;
+    case 'l':
+      mem_length = strtol(optarg,NULL,0);
+      break;
+    case 'b':
+      max_block = strtol(optarg,NULL,0);
+      break;
+    case 'A':
+      align_order = strtol(optarg,NULL,0);
+      break;
+    case 'g':
+      go_addr = strtol(optarg,NULL,0);
+      go_flg = 1;
+      break;
+    case 'r':
+      reset_flg = 1;
+      break;
+    case 'u':
+      upload_flg = 1;
+      break;
+    case 'F':
+      fill_flg=1;
+      if(add_to_arr((void**)&fill_pat_val,&fill_pat_len,0,optarg)<0){
+       fprintf(stderr,"%s: incorrect patern data \"%s\"\n",argv[0],optarg);
+       exit(2);
+      }
+      if(!fill_pat_len){
+       fprintf(stderr,"%s: incorrect patern data - empty value\n",argv[0]);
+       exit(2);
+      }
+      break;
+    case 'e':
+      erase_flg = 1;
+      break;
+    case 'o':
+      boot_flg = 1;
+      sn = strtol(optarg,NULL,0);
+      break;
+    case 'f':
+      file_format=optarg;
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan sendhex v0.7\n", stdout);
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if ((optind >= argc)&&!go_flg&&!reset_flg&&!prt_modules&&
+      !debugk_flg&&!erase_flg&&!boot_flg) 
+  { usage();
+    exit(1);
+  }
+  
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(prt_modules) print_modules(prt_modules);
+
+  if(reset_flg) {
+    if(send_cmd_res()<0) exit(2);
+  }
+
+  if(boot_flg) {
+    if(activate_boot()<0) exit(2);
+  }
+
+  if(fill_flg) {
+    mem_fill(mem_type, mem_start, mem_length?mem_length:fill_pat_len, fill_pat_val, fill_pat_len);
+  }
+
+  if(erase_flg) {
+    mem_erase(mem_type, mem_start, mem_length);
+  }
+
+  if(!upload_flg)
+  { while (optind < argc)
+      if(download_file(argv[optind++], file_format)<0) exit(2);
+  }else{
+    if(optind+1!=argc) 
+    { printf("upload_file : needs exactly one filename\n");
+      exit(1);
+    };
+    if(upload_file(argv[optind], file_format)<0) exit(2);
+  };
+  
+  if(go_flg)
+  { if(send_cmd_go(go_addr)<0) exit(2);;
+  };
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_sendmsg.c b/ulan/host/ul_drv/utils/ul_sendmsg.c
new file mode 100644 (file)
index 0000000..a9a93ba
--- /dev/null
@@ -0,0 +1,252 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_spy.c     - message monitor
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <ul_lib/ulan.h>
+
+int si_long(char **ps,long *val,int base)
+{
+  char *p;
+  *val=strtol(*ps,&p,base);
+  if(*ps==p) return -1;
+  *ps=p;
+  return 1;
+}
+
+int add_to_arr(void **pdata,int *plen,int base,char *str)
+{
+  char *s=str;
+  long val;
+  void *p;
+  
+  do{
+    while(*s && strchr(", \t:;",*s)) s++;
+    if(!*s) break;
+    if(si_long(&s,&val,base)<0){
+      return -1;
+    }
+    if(*pdata==NULL){
+      *plen=0;
+      *pdata=p=malloc(1);
+    }else{
+      p=realloc(*pdata,*plen+1);
+      if(p==NULL) return -1;
+      *pdata=p;
+    }
+    ((uchar*)p)[*plen]=val;
+    (*plen)++;
+  } while(1);
+  return 1;
+}
+
+/*******************************************************************/
+
+char *ul_dev_name = UL_DEV_NAME;
+int msg_module = 0;
+int msg_cmd    = 0;
+uchar *msg_data= NULL;
+int msg_len  = 0;
+uchar msg_flg  = 0;
+int prt_modules= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+int query_flg = 0;
+int logk_flg = 0;
+
+int print_modules(int max_addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar *p;
+  void *buf=NULL;
+  int buf_len;
+  int count=0; 
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("print_modules : uLan open failed");return -1;};
+  for(i=1;i<=max_addr;i++)
+  {
+    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
+                       UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      p=(uchar*)buf;
+      for(ret=0;(ret<buf_len)&&*p;ret++,p++);
+      printf("%2d:  ",i);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("debug_kernel : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+int log_kernel(void)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("log_kernel : uLan open failed");return -1;};
+ #if defined(_WIN32) 
+  { DWORD bytes_ret;
+    ret=DeviceIoControl(ul_fd,UL_KLOGBLL,
+                 NULL,0,NULL,0,
+                 &bytes_ret,NULL)?0:-1;
+  }
+ #elif !defined(UL_DRV_IN_LIB)
+  ret=ioctl(ul_fd,UL_KLOGBLL,0);
+ #endif
+  ul_close(ul_fd);
+  return ret;
+};
+
+int send_message(void)
+{
+  int ret;
+  ul_fd_t ul_fd;
+  int i;
+  uchar *bufout=NULL;
+  int lenout=0;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("send_message : uLan open failed");return -1;};
+
+  if(!query_flg){
+    ret=ul_send_command_wait(ul_fd,msg_module,msg_cmd,msg_flg,
+                         msg_data,msg_len);
+    fprintf(stderr,"ul_send_command_wait ret %d\n",ret);
+  }else{
+    ret=ul_send_query_wait(ul_fd,msg_module,msg_cmd,msg_flg,
+                    msg_data,msg_len,(void**)&bufout,&lenout);
+    fprintf(stderr,"ul_send_query_wait ret %d\n",ret);
+    for(i=0;i<lenout;i++) printf("0x%02x ",bufout[i]);
+    printf("\n");
+  }
+               
+  if(bufout!=NULL) free(bufout);
+                    
+  ul_close(ul_fd);
+  return 0;
+};
+
+static void
+usage(void)
+{
+  printf("usage: ul_sendmsg <parameters> <hex_bytes>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       destination module address\n");
+  printf("  -c, --command <num>      command\n");
+  printf("  -f, --flags <num>        flags\n");
+  printf("  -q, --query              send query type message\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("      --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "command",1,0, 'c' },
+    { "flags", 1, 0, 'f' },
+    { "query", 0, 0, 'q' },
+    { "print", 1, 0, 'p' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { "log-kernel", 0, 0, 'L' },
+    { 0, 0, 0, 0}
+  };
+  int opt;
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:m:c:f:qp:VhD:L")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:m:c:f:qp:VhD:L",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      msg_module = strtol(optarg,NULL,0);
+      break;
+    case 'c':
+      msg_cmd = strtol(optarg,NULL,0);
+      break;
+    case 'f':
+      msg_flg = strtol(optarg,NULL,0);
+      break;
+    case 'q':
+      query_flg=1;
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'L':
+      logk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan send message v0.7\n", stdout);
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(logk_flg) log_kernel();
+
+  if(prt_modules) print_modules(prt_modules);
+
+  for(;optind<argc;optind++){
+    if(add_to_arr((void**)&msg_data,&msg_len,0,argv[optind])<0){
+      fprintf(stderr,"%s: incorrect message data \"%s\"\n",argv[0],argv[optind]);
+      exit(2);
+    }
+  }
+
+  send_message();
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ul_spy.c b/ulan/host/ul_drv/utils/ul_spy.c
new file mode 100644 (file)
index 0000000..02a87b6
--- /dev/null
@@ -0,0 +1,267 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ul_spy.c     - message monitor
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <ul_lib/ulan.h>
+
+/*******************************************************************/
+
+#define WITHOUT_SYS_SELECT
+
+char *ul_dev_name = UL_DEV_NAME;
+int filt_module= 0;
+int filt_sadr  = 0;
+int filt_dadr  = 0;
+int filt_cmd   = 0;
+int prt_modules= 0;
+int debugk     = 0;
+int debugk_flg = 0;
+int logk_flg = 0;
+int all_data   = 0;
+
+int print_modules(int max_addr)
+{ int ret;
+  int i;
+  ul_fd_t ul_fd;
+  uchar *p;
+  void *buf=NULL;
+  int buf_len;
+  int count=0; 
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("print_modules : uLan open failed");return -1;};
+  for(i=1;i<=max_addr;i++)
+  {
+    ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
+                       UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
+    if(ret>=0)
+    { count++;
+      p=(uchar*)buf;
+      for(ret=0;(ret<buf_len)&&*p;ret++,p++);
+      printf("%2d:  ",i);
+      fwrite(buf,ret,1,stdout);
+      printf("\n");
+    };
+    if(buf) free(buf);
+    buf=NULL;
+  };
+  ul_close(ul_fd);
+  return count;
+};
+
+int debug_kernel(int debug_msk)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("debug_kernel : uLan open failed");return -1;};
+  ret=ul_drv_debflg(ul_fd,debug_msk);
+  ul_close(ul_fd);
+  return ret;
+};
+
+int log_kernel(void)
+{ int ret;
+  ul_fd_t ul_fd;
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("log_kernel : uLan open failed");return -1;};
+ #if defined(_WIN32) 
+  { DWORD bytes_ret;
+    ret=DeviceIoControl(ul_fd2sys_fd(ul_fd),UL_KLOGBLL,
+                 NULL,0,NULL,0,
+                 &bytes_ret,NULL)?0:-1;
+  }
+ #elif !defined(UL_DRV_IN_LIB)
+  ret=ioctl(ul_fd2sys_fd(ul_fd),UL_KLOGBLL,0);
+ #endif
+  ul_close(ul_fd);
+  return ret;
+};
+
+int spy_messages(void)
+{
+  int ret;
+  ul_fd_t ul_fd;
+  ul_msginfo msginfo;
+  char *state;
+  struct timeval timeout;
+  fd_set set;
+  int i;
+  uchar uc;
+
+  ul_fd=ul_open(ul_dev_name, NULL);
+  if(ul_fd==UL_FD_INVALID)
+    { perror("spy_messages : uLan open failed");return -1;};
+  memset(&msginfo,0,sizeof(msginfo));
+  msginfo.dadr=filt_dadr;
+  msginfo.sadr=filt_sadr;
+  msginfo.cmd=filt_cmd;
+  if(filt_module)
+  { msginfo.dadr=filt_module;
+    ret=ul_addfilt(ul_fd,&msginfo);
+    if(ret<0) { printf("spy_messages : add filter failed\n");return ret;};
+    msginfo.dadr=filt_dadr;
+    msginfo.sadr=filt_module;
+    ret=ul_addfilt(ul_fd,&msginfo);
+    if(ret<0) { printf("spy_messages : add filter failed\n");return ret;};
+  } else {
+    ret=ul_addfilt(ul_fd,&msginfo);
+    if(ret<0) { printf("spy_messages : add filter failed\n");return ret;};
+  };
+
+  for(;;)
+  { 
+  #ifndef WITHOUT_SYS_SELECT
+    FD_ZERO (&set);
+    FD_SET (ul_fd2sys_fd(ul_fd), &set);
+    FD_SET (0, &set);
+    timeout.tv_sec = 10;
+    timeout.tv_usec = 0;
+    while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+            &&errno==-EINTR);
+    if(FD_ISSET(0,&set))
+      {printf("\nspy_messages : break by user\n");break;};
+    if(ret<0) return ret;
+    if(!ret) continue;
+  #else /* WITHOUT_SYS_SELECT */
+    while (ul_fd_wait(ul_fd,1)<=0);
+  #endif /* WITHOUT_SYS_SELECT */
+    ret=ul_acceptmsg(ul_fd,&msginfo);
+    if(ret<0) 
+    { printf("spy_messages : problem to accept message\n");
+      return ret;
+    };
+    do
+    { if(msginfo.flg&UL_BFL_FAIL) state="FAIL";
+      else if(msginfo.flg&UL_BFL_M2IN) state="PROC";
+      else state="REC ";
+      printf("%s:(d:%d,s:%d,c:0x%X,f:0x%X,l:%d)",
+             state,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+             msginfo.flg,msginfo.len);
+      if(all_data) for(i=0;i<msginfo.len;i++)
+        { ul_read(ul_fd,&uc,1); printf(" 0x%X",uc); };
+      while((msginfo.flg&UL_BFL_TAIL)&&(ret>=0))
+      { ret=ul_actailmsg(ul_fd,&msginfo);
+        if(msginfo.flg&UL_BFL_FAIL) state="fail";
+        else if(msginfo.flg&UL_BFL_M2IN) state="proc";
+        else state="rec ";
+        printf(" %s:(d:%d,s:%d,c:0x%X,f:0x%X,l:%d)",
+               state,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+               msginfo.flg,msginfo.len);
+        if(all_data) for(i=0;i<msginfo.len;i++)
+          { ul_read(ul_fd,&uc,1); printf(" 0x%X",uc); };
+      };
+      printf("\n");
+    }while(0);
+   ul_freemsg(ul_fd);
+  };
+  ul_close(ul_fd);
+  return 0;
+};
+
+static void
+usage(void)
+{
+  printf("usage: ul_spy <parameters> <hex_file>\n");
+  printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
+  printf("  -m, --module <num>       messages from/to module\n");
+  printf("  -s, --source <num>       source of messages\n");
+  printf("  -t, --target <num>       destination of messages\n");
+  printf("  -c, --command <num>      commands of printed messages\n");
+  printf("  -a, --all-data           show all messages data\n");
+  printf("  -p, --print  <max>       print modules to max address\n");
+  printf("      --debug-kernel <m>   flags to debug kernel\n");
+  printf("  -V, --version            show version\n");
+  printf("  -h, --help               this usage screen\n");
+}
+
+int main(int argc,char *argv[])
+{
+  static struct option long_opts[] = {
+    { "uldev", 1, 0, 'd' },
+    { "module",1, 0, 'm' },
+    { "source",1, 0, 's' },
+    { "target",1, 0, 't' },
+    { "command",1,0, 'c' },
+    { "all-data",0,0,'a' },
+    { "print", 1, 0, 'p' },
+    { "version",0,0, 'V' },
+    { "help",  0, 0, 'h' },
+    { "debug-kernel", 1, 0, 'D' },
+    { "log-kernel", 0, 0, 'L' },
+    { 0, 0, 0, 0}
+  };
+  int opt;
+
+ #ifndef HAS_GETOPT_LONG
+  while ((opt = getopt(argc, argv, "d:m:s:t:c:ap:VhD:L")) != EOF)
+ #else
+  while ((opt = getopt_long(argc, argv, "d:m:s:t:c:ap:VhD:L",
+                           &long_opts[0], NULL)) != EOF)
+ #endif
+    switch (opt) {
+    case 'd':
+      ul_dev_name=optarg;
+      break;
+    case 'm':
+      filt_module = strtol(optarg,NULL,0);
+      break;
+    case 's':
+      filt_sadr = strtol(optarg,NULL,0);
+      break;
+    case 't':
+      filt_dadr = strtol(optarg,NULL,0);
+      break;
+    case 'c':
+      filt_cmd = strtol(optarg,NULL,0);
+      break;
+    case 'a':
+      all_data=1;
+      break;
+    case 'p':
+      prt_modules = strtol(optarg,NULL,0);
+      break;
+    case 'D':
+      debugk = strtol(optarg,NULL,0);
+      debugk_flg=1;
+      break;
+    case 'L':
+      logk_flg=1;
+      break;
+    case 'V':
+      fputs("uLan spy v0.7\n", stdout);
+      exit(0);
+    case 'h':
+    default:
+      usage();
+      exit(opt == 'h' ? 0 : 1);
+    }
+
+  if(debugk_flg) debug_kernel(debugk);
+
+  if(logk_flg) log_kernel();
+
+  if(prt_modules) print_modules(prt_modules);
+
+  spy_messages();
+
+  return 0;
+}
diff --git a/ulan/host/ul_drv/utils/ulc_tst.c b/ulan/host/ul_drv/utils/ulc_tst.c
new file mode 100644 (file)
index 0000000..c43572e
--- /dev/null
@@ -0,0 +1,200 @@
+/*******************************************************************
+  uLan Communication - simple test client
+
+  ulc_tst.c    - check of driver interface
+
+  (C) Copyright 1996,1999 by Pavel Pisa 
+
+  The uLan driver is distributed under the Gnu General Public Licence. 
+  See file COPYING for details.
+ *******************************************************************/
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <ul_lib/ulan.h>
+
+char *ul_dev_name = UL_DEV_NAME;
+
+int test1(void)
+{
+ uchar ch;
+ int ul_fd;
+ int i;
+ ul_msginfo msginfo;
+ uchar buf1[40]={1,2,3,4,5,6,7,8,9,10};
+ uchar buf2[40]={11,12,13,14,15,16,17,18,19,20};
+
+ printf("\n\n*** Simple message send test with read, write and lseek ***\n");
+
+ ul_fd=open(ul_dev_name, O_RDWR, S_IWRITE | S_IREAD);
+ if(ul_fd<0) { perror("test1 : open failed");return -1;};
+ write(ul_fd,buf2,4);
+ perror("test1 : write ");
+
+ memset(&msginfo,0,sizeof(msginfo));
+ msginfo.dadr=3; msginfo.cmd=10;
+ ioctl(ul_fd,UL_NEWMSG,&msginfo);
+
+ write(ul_fd,buf1,10);
+ lseek(ul_fd,100,SEEK_SET);
+ write(ul_fd,buf2,10);
+ memset(buf1,0,sizeof(buf1));
+ memset(buf2,0,sizeof(buf1));
+ lseek(ul_fd,4,SEEK_SET);
+ printf("data from pos 4\n");
+ for(i=0;i<20;i++) {read(ul_fd,&ch,1); printf(" %d",ch);}
+ printf("\n");
+
+ lseek(ul_fd,100,SEEK_SET);
+ printf("data from pos 100\n");
+ for(i=0;i<20;i++) {if(read(ul_fd,&ch,1)<=0) break; printf(" %d",ch);}
+ printf("\n");
+
+ ioctl(ul_fd,UL_FREEMSG);
+
+ ioctl(ul_fd,UL_STROKE);
+
+ sleep(5);
+
+ ioctl(ul_fd,UL_KLOGBLL);
+
+ close(ul_fd);
+ return 0;
+}
+
+int test2(void)
+{
+ int ul_fd;
+ int num_act;
+ int ret;
+ ul_msginfo msginfo;
+ fd_set set;
+ uchar buf[0x40];
+ struct timeval timeout;
+
+ printf("\n\n*** Tailed processed mesage test ***\n");
+
+ ul_fd=open(ul_dev_name, O_RDWR, S_IWRITE | S_IREAD);
+ if(ul_fd<0) { perror("test1 : open failed");return -1;};
+
+ printf("preparing first part\n");
+ msginfo.dadr=3;
+ msginfo.cmd=UL_CMD_RDM;
+ msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN;
+ ioctl(ul_fd,UL_NEWMSG,&msginfo);
+ buf[0]=(uchar)2;      buf[1]=2>>8;
+ buf[2]=(uchar)0x8800; buf[3]=0x8800>>8;
+ buf[4]=(uchar)0x40;   buf[5]=0x40>>8;
+ if(write(ul_fd,buf,6)!=6)
+   perror("test2 : write ");
+
+ if(0)
+ {
+  int i;
+  uchar ch;
+  lseek(ul_fd,0,SEEK_SET);
+  printf("data from pos 0\n");
+  for(i=0;i<20;i++) {if(read(ul_fd,&ch,1)<=0) break; printf(" %d",ch);}
+  printf("\n");
+ };
+
+ printf("preparing second part\n");
+ msginfo.dadr=3;
+ msginfo.cmd=UL_CMD_RDM&0x7F;
+ msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN;
+ msginfo.len=0x40;
+ ioctl(ul_fd,UL_TAILMSG,&msginfo);
+
+ ioctl(ul_fd,UL_FREEMSG);
+
+ ioctl(ul_fd,UL_KLOGBLL);
+
+ ioctl(ul_fd,UL_STROKE);
+
+ FD_ZERO (&set);
+ FD_SET (ul_fd, &set);
+ timeout.tv_sec = 10;
+ timeout.tv_usec = 0;
+
+ printf("Sending tailed message an waiting for input\n");
+
+ while ((num_act=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
+         &&errno==-EINTR);
+
+ printf("select returned %d\n",num_act);
+
+ memset(&msginfo,0,sizeof(msginfo));
+ ret=ioctl(ul_fd,UL_ACCEPTMSG,&msginfo);
+ printf("accept message returned %d\n",ret);
+ printf("  flg=0x%X, dadr=%d, sadr=%d, cmd=%d, len=%d, stamp=%d\n",
+           msginfo.flg,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+           msginfo.len,msginfo.stamp);
+ memset(&msginfo,0,sizeof(msginfo));
+ ret=ioctl(ul_fd,UL_ACTAILMSG,&msginfo);
+ printf("accept tail returned %d\n",ret);
+ printf("  flg=0x%X, dadr=%d, sadr=%d, cmd=%d, len=%d, stamp=%d\n",
+           msginfo.flg,msginfo.dadr,msginfo.sadr,msginfo.cmd,
+           msginfo.len,msginfo.stamp);
+
+ close(ul_fd);
+
+ return 0;
+}
+
+int test3(void)
+{
+ int ul_fd;
+ int ret;
+ ul_fd=open(ul_dev_name, O_RDWR, S_IWRITE | S_IREAD);
+ if(ul_fd<0) { perror("test1 : open failed");return -1;};
+
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x12);
+ printf("get msr/lsr %06X\n",ret);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x10);
+ printf("set break   %06X\n",ret);
+ sleep(2);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x12);
+ printf("get msr/lsr %06X\n",ret);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x13);
+ printf("set tx off  %06X\n",ret);
+ sleep(2);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x12);
+ printf("get msr/lsr %06X\n",ret);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x11);
+ printf("set one     %06X\n",ret);
+ sleep(2);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x12);
+ printf("get msr/lsr %06X\n",ret);
+ sleep(2);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x13);
+ printf("set tx off  %06X\n",ret);
+ sleep(2);
+ ret=ioctl(ul_fd,UL_HWTEST,(unsigned long)0x12);
+ printf("get msr/lsr %06X\n",ret);
+
+ close(ul_fd);
+ return 0;
+}
+
+
+int main(int argc,char *argv[])
+{
+
+ if(argc>=2)
+  ul_dev_name=argv[1];
+ /* test1(); */
+ /* test2(); */
+ test3();
+
+ return 0;
+}
diff --git a/verinfo.txt b/verinfo.txt
new file mode 100644 (file)
index 0000000..eb38cbe
--- /dev/null
@@ -0,0 +1,2 @@
+ULAN checkout on 5.7.2008 (rev 1.5)
+LINCAN (rev 0.3.3)